FreeCalypso > hg > fc-magnetite
view src/aci2/bmi/mmiSmsRead.c @ 225:b16d79c550a2
aci2: AT@SC bogon fully expunged
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 24 Oct 2016 05:50:25 +0000 |
parents | 93999a60b835 |
children |
line wrap: on
line source
/******************************************************************************* CONDAT (UK) ******************************************************************************** This software product is the property of Condat (UK) Ltd and may not be disclosed to any third party without the express permission of the owner. ******************************************************************************** $Project name: Basic MMI $Project code: BMI $Module: SMS $File: MmiSmsRead.c $Revision: 1.0 $Author: Condat(UK) $Date: 25/10/00 ******************************************************************************** Description: Shared definitions of data elements are made in here and accessed via the primitive operations supplied ******************************************************************************** $History: MmiSmsRead.c Feb 07, 2006 DR: OMAPS00059261 x0pleela Description: SMS is not forwarding STATUS reports that are read from SIM storage to ACI Solution: smsread_r_exec_cb(): avoiding display of sender's address in header for status reports during listing smsread_getstatustext():renamed txtreport to txtreport Replaced MT_STATUS_RPT with MFW_SMS_STATRPT as MT_STATUS_RPT is removed Feb 01, 2006 DR: OMAPS00059261 x0pleela Description: SMS is not forwarding STATUS reports that are read from SIM storage to ACI Solution: Added a check for Status report to display a text "Report:Pending" during listing of this message Made changes as per review comments Jan 30, 2006 DR: OMAPS00059261 x0pleela Description: SMS is not forwarding STATUS reports that are read from SIM storage to ACI Solution: Added code to read and display MT Status report Mar 28, 2006 MMI-FIX-47813 x0035544 Description: Not Available transient screen is displayed when Extract number option is selected in messages option screen. Solution: The necessary functionality is provided to extract the numbers in a message and display them appropriately. May 27, 2005 MMI-FIX-29869 x0018858 Description: There is a limitation on the number of messages that can be downloaded from server even though there is space on the sim. Solution: The limitation has been removed and the number of messages that can be dowloaded has been modified to the masimum number that can be stored. March 2, 2005 REF: CRR 11536 x0018858 Description: Reply path not supported while sending a reply. Solution: Added menu option for the reply path. Feb 16, 2005 REF: CRR MMI-SPR-27900 xnkulkar Issue description: BMI: using the tool nowSMS the voicemail indication via sms does not work Solution: Instead of identifying voice using addr[0] and pid, we use dcs. Also, messages belonging to group "1100" are deleted when voicemail icon is displayed. Feb 16, 2005 REF: CRR 28966 x0012851 Description: Editing or forwarding of large MT messages (>160 characters) shouldn't be allowed when Concatenation is set to 'OFF' Solution: If the 'ConcatenateStatus' flag is FALSE, the 'if' check condition which allows the message to be edited or forwarded has been modified for the same. Dec 15,2004 REF: CRR 24396 xkundadu Description: Phone crashes when a message is received while the 'List Empty' dialog is displayed. Solution: NULL check is added for the list_win handle before calling listsDestroy() when an MT sms is receieved. Dec 01, 2004 REF: CRR 24225 xnkulkar Description: Reset when forwarding SMS Solution: The message content is sent excluding the date/time info from the original message, which was causing the reset as the max limit (161) was crossed. Sep 08, 2004 REF: CRR 24393 Deepa M. D Bug:Phone crashes when user tries to reply to a saved message in the Inbox Fix:The reply and Callnumber Option has been removed for the saved message. 25/10/00 Original Condat(UK) BMI version. 14/10/00 SPR 1257 - merged in issue 888 from b-sample line (extract number from SMS improvements) and made changes to accommodate Unicode SMSs containing numbers. May 03, 2004 REF: CRR 13845 Deepa M The Forward menuitem added. $End *******************************************************************************/ #define MMI_SMSREAD_C #define ENTITY_MFW /* includes */ #include <string.h> #include <stdio.h> #include <stdlib.h> #if defined (NEW_FRAME) #include "typedefs.h" #include "vsi.h" #include "pei.h" #include "custom.h" #include "gsm.h" #else #include "STDDEFS.H" #include "custom.h" #include "gsm.h" #include "vsi.h" #endif #include "prim.h" #include "mfw_mfw.h" #include "mfw_win.h" #include "mfw_kbd.h" /* SPR#1428 - SH - New Editor changes */ #ifndef NEW_EDITOR #include "mfw_edt.h" #endif #include "mfw_tim.h" #include "mfw_phb.h" #include "ksd.h" #include "psa.h" #include "mfw_sms.h" #include "mfw_smsi.h" #include "mfw_icn.h" #include "mfw_mnu.h" #include "mfw_lng.h" #include "mfw_sat.h" #include "mfw_kbd.h" #include "mfw_nm.h" #include "mfw_mme.h" #include "psa_util.h" #include "dspl.h" #include "MmiMain.h" #include "MmiDummy.h" #include "MmiMmi.h" #include "mmiCall.h"//GW 29/11/01 for 'callNumber' #include "MmiDialogs.h" #include "MmiLists.h" #include "MmiMenu.h" #include "MmiSoftKeys.h" /* SPR#1428 - SH - New Editor changes */ #ifdef NEW_EDITOR #include "ATBCommon.h" #include "ATBDisplay.h" #include "ATBEditor.h" #include "AUIEditor.h" #else #include "MmiEditor.h" #endif #include "MmiBookShared.h" // MZ #include "mmiSmsMenu.h" #include "mmismssend.h" #include "mmiSmsRead.h" #include "mmiSmsIdle.h" #include "MmiResources.h"/*MC*/ #include "mfw_ffs.h" #include "cus_aci.h" #include "prim.h" #ifndef PCM_2_FFS #include "pcm.h" #endif #include "message.h" #include "prim.h" #include "aci_cmh.h" //GW 29/11/01 added for types in aci_fd.h #include "aci_fd.h" //GW 29/11/01 added for types in 'cmh.h' #include "cmh.h" //GW 29/11/01 added for types in 'cmh_phb.h' #include "cmh_phb.h" //GW 29/11/01 added for cmhPHB_getAdrStr #include "mmiColours.h" #include "audio.h" //GW 29/11/01 - added header file - removed extern void callNumber(UBYTE* number); MfwWin* getWinData( MfwHnd win); /*SPR 1453*/ #ifdef LSCREEN #define UCS2_MENU_TEXT_LEN ((MFW_TAG_LEN +10)*2 +4)/*SPR 2686 only need name+status text*/ #else #define UCS2_MENU_TEXT_LEN 36 /*mc SPR 1242, no of bytes in latin unicode string which fills one whole line*/ #endif #define MAX_EDITOR_HEADER_LENGTH 25 // Dec 01, 2004 REF: CRR 24225 xnkulkar // Description: Reset when forwarding SMS // Added to exclude the original date/time info from forwarded message #define ORIGINAL_DATE_TIME_INFO 17 //Mar 28, 2006 DR:OMAPS00047813 x0035544 #define MAX_NUMBER_SIZE 10 //Max Size of the number array to hold the extracted numbers #define MIN_NUM_LENGTH 3 //minimum length of the number to be extracted. // Feb 16, 2005 REF: CRR MMI-SPR-27900 xnkulkar extern BOOL invalidVm; extern UBYTE reply_path_bit; /********************************************************************* DYNAMIC MENU WINDOW. DECLARATION **********************************************************************/ typedef enum { E_DELETE, E_REPLY, E_CALL_SENDER, E_SAVE_NUMBER, E_DATE_TIME, E_FORWARD }; // Those information are passed to the sms editor typedef struct { SHORT sms_index; T_MMI_SMS_STAT sms_type; T_MFW_SMS_PARA *sms_info; char *assoc_name; }T_SMS_EDITOR_DATA; /* This variable is used to know in which state we are when MFW callback function is called */ typedef struct { SHORT nb_sms_stored; /*SPR 2530, need more info than just indexes*/ // May 27, 2005 MMI-FIX-29869 x0018858 // Description: There is a limitation on the number of messages that can be downloaded from // server even though there is space on the sim. // Solution: The limitation has been removed and the number of messages that can be dowloaded // has been modified to the maximum number that can be stored. #ifdef FF_MMI_SMS_DYNAMIC T_MFW_SMS_MSG* sms_messages; /* store info about the SMS: index... */ // May 27, 2005 MMI-FIX-29869 x0018858 // Changed from static to dynamic wstring_t** sms_header; /* header displayed in the dynamic menu */ #else T_MFW_SMS_MSG sms_messages[MAX_MESSAGES]; /* store info about the SMS: index... */ wstring_t* sms_header[MAX_MESSAGES]; /* header displayed in the dynamic menu */ #endif }T_SMS_LIST_DATA; typedef struct { /* administrative data */ T_MMI_CONTROL mmi_control; T_MFW_HND win; SHORT id; T_MFW_HND parent; /* associated handlers */ T_MFW_HND sms_handle; /* MFW sms handler */ /* internal data */ T_SMS_LIST_DATA sms_list_data; T_SMS_EDITOR_DATA sms_editor_data; ListMenuData *menu_list_data; /*SPR 2686, removed unused data field*/ } T_SMSREAD_R; T_SMSREAD_R* getUserData_T_SMSREAD_R( T_MFW_WIN *win) { if (win == NULL) return (NULL); return((T_SMSREAD_R *)win->user); } typedef struct { /* administrative data */ T_MMI_CONTROL mmi_control; T_MFW_HND win; SHORT id; T_MFW_HND parent; T_MFW_HND editor_win; /* associated handlers */ /* internal data */ T_SMS_EDITOR_DATA *sms_editor_data; /*SPR 2686, removed unused data field*/ } T_SMSREAD_R_TEXTEDT2; T_SMSREAD_R_TEXTEDT2* getUserData_T_SMSREAD_R_TEXTEDT2( T_MFW_WIN *win) { if (win == NULL) return (NULL); return((T_SMSREAD_R_TEXTEDT2 *)win->user); } typedef struct { /* administrative data */ T_MMI_CONTROL mmi_control; T_MFW_HND win; SHORT id; T_MFW_HND parent; /* associated handlers */ /* !!! **************************************** modify here **************************************** !!!*/ T_MFW_HND kbd; T_MFW_HND kbd_long; T_MFW_HND menu; /* !!! **************************************** end modify here **************************************** !!! */ /* internal data */ /* !!! **************************************** modify here **************************************** !!!*/ /*SPR 2686, removed unused data field*/ T_MFW_HND sms; T_MFW_HND dialog_win; /* !!! **************************************** end modify here **************************************** !!! */ T_SMS_EDITOR_DATA *sms_editor_data; //NM 25.8 } T_SMSREAD_R_OPT; T_SMSREAD_R_OPT* getUserData_T_SMSREAD_R_OPT( T_MFW_WIN *win) { if (win == NULL) return (NULL); return((T_SMSREAD_R_OPT *)win->user); } static enum { READ_SMS_LIST, READ_SELECTED_SMS } g_sms_state; //MZ 7/02/01 tmp enums. static enum { MFW_MB_LINE1, MFW_MB_DATA }mfw_mailBox_type; /*MC SPR2175, removed alphabet conversion tables which are now in ATBCommon.c*/ static const MfwMnuAttr readSMS_menuAttrib = { &readSMS_menuArea, MNU_LEFT | MNU_LIST | MNU_CUR_LINE, /* centered page menu */ -1, /* use default font */ NULL, /* with these items */ 0, /* number of items */ COLOUR_LIST_SMS, TxtMessages, NULL, MNUATTRSPARE }; //Mar 28, 2006 DR:OMAPS00047813 x0035544 /*default static menu*/ static const MfwMnuAttr menuSearchNumListAttr = { &menuArea, MNU_LEFT | MNU_LIST | MNU_CUR_LINE, /* centered page menu */ -1, /* use default font */ NULL, /* with these items (filled in later) */ 0, /* number of items (filled in leter) */ COLOUR_LIST_XX, /* Colour */ TxtExtractNumber, /* Hdr Id */ NULL, /* Background */ MNUATTRSPARE /* unused */ }; static SHORT g_sms_list_counter; static SHORT g_nb_line_sms; static int search_index; /* SPR888 - SH - keeps track of position within SMS for extract number */ static T_MFW_HND info_win=0; static T_MFW_HND deleting_win = 0; static T_MFW_HND list_win=0; static T_MFW_HND sms_read_win = 0;/*MC 1991 main SMS read window*/ static T_MFW_HND message_win = 0; /*MC 2132, individual message display win*/ static T_MFW_HND option_mnu_win = 0;/*MC 2132, options menu window*/ static char sms_text_ascii[MAX_EDITOR_LEN]; /* we need this variable "read_status" to know which sms message we are going to edit (user pressed in the sms menu-> EDIT) because SMS_MT & SMS_MO have different size of character (current length saved in "current_sms_len") !! SMS_MT includes additional TIME, DATE and NUMBER and we dont want to show it when we are editing. */ static UBYTE read_status; static USHORT current_sms_len= 0; // Dec 15,2004 REF: CRR 24396 xkundadu // Description: Phone crashes when a message is received while the // 'List Empty' dialog is displayed. // Solution: NULL check is added for the list_win handle before calling // listsDestroy() function when an MT sms is receieved. // This checks whether the 'List Empty' dialog is present or not. static BOOL SmsListEmptyDlgPresent = 0; static T_SmsUserData SmsData; int SmsRead_GetStatusText( char* op_text_str, int status); // RAVI static T_MFW_HND smsRead_NumberName_info_screen(T_MFW_HND parent_window, T_SmsUserData *UserData,char* name); UBYTE check_assoc_name(char *name, T_MFW_SMS_ADDR sms_addr); static T_MFW_HND SmsRead_R_OPT_create (T_MFW_HND parent); static void SmsRead_R_OPT_destroy (T_MFW_HND window); static void SmsRead_R_OPT_StandardDialog(T_MFW_HND win, char *text, ULONG duration); static void SmsRead_R_OPT_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter); static int SmsRead_R_OPT_win_cb (MfwEvt e, MfwWin *w); static int SmsRead_R_OPT_mfw_cb (MfwEvt event, void *parameter); static int SmsRead_R_OPT_dialog_cb(T_MFW_HND win, USHORT Identifier, USHORT Reason); static int SmsRead_R_OPT_kbd_cb (MfwEvt e, MfwKbd *k); static int SmsRead_R_OPT_mnu_cb (MfwEvt e, MfwMnu *m); static int SmsRead_R_OPTExeDelete(MfwMnu* m, MfwMnuItem* i); static int SmsRead_R_OPTExeReply(MfwMnu* m, MfwMnuItem* i); static int SmsRead_R_OPTExeStoreNumber(MfwMnu* m, MfwMnuItem* i); void SmsRead_StoreNumber(void); static int SmsRead_R_OPTExeEdit(MfwMnu* m, MfwMnuItem* i); /*SPR 2530,, old code which displays the contents of the SMS messages in the SMS list has been compiled out using the macro ORIGINAL_SMS_LIST. If ORGINAL_SMS_LIST is defined, then the old list is shown, otherwise the new kind of SMS list is shown*/ /*SPR 2530,compiled out unused global vars*/ #ifdef ORIGINAL_SMS_LIST static SHORT g_sms_list_counter; static SHORT g_nb_line_sms; #endif T_MFW_HND retry_handle;/*handle for the timer to retry reading an SMS. */ int retry_index=0;/*index of message we're trying to read again.*/ void retry_sms_read(int index); int retry_sms_read_tim_cb(MfwEvt event, MfwTim *timer_info); /* R is the identifier used for the function of the Read menu window */ static T_MFW_HND SmsRead_R_create (T_MFW_HND parent); static void SmsRead_R_destroy (T_MFW_HND window); static void SmsRead_R_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter); static int SmsRead_R_win_cb (MfwEvt e, MfwWin *w); static int SmsRead_R_mfw_cb(MfwEvt event, void *parameter); static int SmsRead_R_dialog_cb(T_MFW_HND win, USHORT Identifier, USHORT Reason); static void SmsRead_R_smslist_cb(T_MFW_HND * Parent, ListMenuData * ListData); static void SmsRead_R_BuildList(T_MFW_HND win,int inUnicode); // Fill an unicode structure for display void string_CopyW2W(wstring_t *strDestination, charw_t *strSource, USHORT count ); static T_MFW_HND SmsRead_R_TEXTEDT2_create (T_MFW_HND parent); static void SmsRead_R_TEXTEDT2_destroy (T_MFW_HND window); static void SmsRead_R_TEXTEDT2_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter); static int SmsRead_R_TEXTEDT2_win_cb (MfwEvt e, MfwWin *w); static void SmsRead_R_TEXTEDT2_editor_cb(T_MFW_HND win, USHORT Identifier, USHORT Reason); static void SmsRead_R_TEXTEDT2_smslist_cb(T_MFW_HND * Parent, ListMenuData * ListData); static BOOL Search_forNextNumber(T_SmsUserData *UserData); //Mar 27, 2006 DR:OMAPS00047813 x0035544 static void SmsRead_numlist_destroy(MfwHnd own_window); static void SmsRead_numlist_cb(T_MFW_HND Parent, ListMenuData * ListData); void smsread_numlist_exec_cb (T_MFW_HND win, USHORT event); static T_MFW_HND SmsRead_BuildNumList_Menu(T_MFW_HND win); static int smsread_numlist_win_cb (MfwEvt e, MfwWin *w); void Search_forNumberInSMS(T_SmsUserData *UserData); //Mar 24, 2006 REF: SPR 47813 x0035544 static int smsread_num_ctr; static char **num_buffer=NULL; static const MfwMnuItem SmsRead_R_OPTItems [] = { {0,0,0,(char *)TxtDelete,0,(MenuFunc)SmsRead_R_OPTExeDelete,item_flag_none}, {0,0,0,(char *)TxtReply,0,(MenuFunc)SmsRead_R_OPTExeReply,item_flag_none}, {0,0,0,(char *)TxtEdit,0,(MenuFunc)SmsRead_R_OPTExeEdit,item_flag_none}, {0,0,0,(char *)TxtForward,0,(MenuFunc)SmsRead_R_OPTExeEdit,item_flag_none},//May 03, 2004 REF: CRR 13845 Deepa M -Menu item to forward SMS {0,0,0,(char *)TxtExtractNumber,0,(MenuFunc)SmsRead_R_OPTExeStoreNumber,item_flag_none}, {0,0,0,(char *)TxtCallNumber,0,(MenuFunc)SmsRead_StoreNumber,item_flag_none} }; static const MfwMnuAttr SmsRead_R_OPTAttrib = { &SmsRead_R_OPTArea, MNU_LEFT | MNU_LIST | MNU_CUR_LINE, /* centered page menu */ -1, /* use default font */ (MfwMnuItem*) SmsRead_R_OPTItems, /* with these items */ sizeof(SmsRead_R_OPTItems)/sizeof(MfwMnuItem) /* number of items */ }; //Sep 08, 2004 REF: CRR 24393 Deepa M. D //New menu item for the saved/unsent messages. static const MfwMnuItem SmsRead_R_Unsent_OPTItems [] = { {0,0,0,(char *)TxtDelete,0,(MenuFunc)SmsRead_R_OPTExeDelete,item_flag_none}, {0,0,0,(char *)TxtEdit,0,(MenuFunc)SmsRead_R_OPTExeEdit,item_flag_none}, {0,0,0,(char *)TxtForward,0,(MenuFunc)SmsRead_R_OPTExeEdit,item_flag_none}, {0,0,0,(char *)TxtExtractNumber,0,(MenuFunc)SmsRead_R_OPTExeStoreNumber,item_flag_none}, }; //Sep 08, 2004 REF: CRR 24393 Deepa M. D //Menu attributes for the saved/unsent messages. static const MfwMnuAttr SmsRead_R_Unsent_OPTAttrib = { &SmsRead_R_OPTArea, MNU_LEFT | MNU_LIST | MNU_CUR_LINE, /* centered page menu */ -1, /* use default font */ (MfwMnuItem*) SmsRead_R_Unsent_OPTItems, /* with these items */ sizeof(SmsRead_R_Unsent_OPTItems)/sizeof(MfwMnuItem) /* number of items */ }; /******************************************************************************* $Function: charPtrToUBYTEPtr $Description: Converts a char ptr to a UBYTE ptr. The procedures can be replaced by macro once all conversions are confirmed as valid. $Returns: data set to new type $Arguments: data -data item of input type. *******************************************************************************/ #ifndef MMI_USE_MACROS UBYTE charToUBYTE ( char chr ) { return((UBYTE)chr); } UBYTE* charPtrToUBYTEPtr ( char *ptr ) { return((UBYTE*)ptr); } UBYTE SHORTToUBYTE ( SHORT data ) { return((UBYTE)data); } char UBYTEToChar ( UBYTE data) { return((char)data); } char* UBYTEPtrToCharPtr ( UBYTE* data) { return((char*)data); } char* USHORTPtrToCharPtr ( USHORT* data) { return((char*)data); } USHORT charToUSHORT ( char chr ) { return((USHORT)chr); } USHORT UBYTEToUSHORT ( UBYTE data) { return((USHORT)data); } USHORT* charPtrToUSHORTPtr (char* data) { return((USHORT*)data); } #else #define charToUBYTE (UBYTE) #define charPtrToUBYTEPtr (UBYTE*) #define SHORTToUBYTE (UBYTE) #define UBYTEPtrToCharPtr (char*) #define UBYTEToChar (char) #define USHORTPtrToCharPtr (char*) #define charToUSHORT (USHORT) #define UBYTEToUSHORT (USHORT) #define charPtrToUSHORTPtr (USHORT*) #endif /*MC SPR2175, removed GSM<->ASCII<->UCS2 conversion functions, moved to ATBCommon*/ /**/ /******************************************************************************* $Function: SmsRead_R_start $Description: Start the creation of the main window for SMS reading $Returns: mfw window handler $Arguments: parent_window - Parent window handler menuAttr - Menu attributes. *******************************************************************************/ T_MFW_HND SmsRead_R_start(T_MFW_HND parent_window, MfwMnuAttr *menuAttr) { TRACE_EVENT_P1("sms_read_win:%d", sms_read_win); /*SPR2132, if the list window already exists, destroy it before creating a new one*/ if (sms_read_win != NULL) SmsRead_R_destroy(sms_read_win); TRACE_FUNCTION ("SmsRead_R_start()"); /*SPR 1991 use ssms_read_win rather than a local var*/ sms_read_win = SmsRead_R_create (parent_window); if (sms_read_win NEQ NULL) { /* We transmit to the SMS editor the address of the data buffer */ SEND_EVENT (sms_read_win, E_INIT, SmsRead_R_ID, (void *)menuAttr); } return sms_read_win; } /******************************************************************************* $Function: SmsRead_R_create $Description: create the SMS read window (dynamic list of all the SMS) $Returns: mfw window handler $Arguments: parent_window - Parent window handler *******************************************************************************/ static T_MFW_HND SmsRead_R_create(MfwHnd parent_window) { T_SMSREAD_R * data = (T_SMSREAD_R *)ALLOC_MEMORY (sizeof (T_SMSREAD_R)); T_MFW_WIN * win; TRACE_FUNCTION ("SmsRead_R_create()"); /* * Create window handler */ data->win = win_create (parent_window, 0, E_WIN_VISIBLE, (T_MFW_CB)SmsRead_R_win_cb); if (data->win EQ NULL) { return NULL; } /* * connect the dialog data to the MFW-window */ data->mmi_control.dialog = (T_DIALOG_FUNC)SmsRead_R_exec_cb; data->mmi_control.data = data; win = getWinData(data->win); win->user = (void *)data; data->parent = parent_window; winShow(data->win); /* * return window handle */ return data->win; } /******************************************************************************* $Function: SmsRead_R_destroy $Description: Destroy the SMS read window (dynamic list of all the SMS) $Returns: none $Arguments: own_window - window handler *******************************************************************************/ static void SmsRead_R_destroy(MfwHnd own_window) { T_MFW_WIN * win_data; T_SMSREAD_R * data; USHORT i; TRACE_FUNCTION ("SmsRead_R_destroy()"); if (own_window) { win_data = getWinData(own_window); //((T_MFW_HDR *))->data; data = getUserData_T_SMSREAD_R(win_data); if (data) { /* * Delete WIN handler */ sms_delete(data->sms_handle); /*SPR 2132, if the message options menu or the messaeg display screen exist, destroy them */ if (option_mnu_win) { SmsRead_R_OPT_destroy(option_mnu_win); } if (message_win) { SmsRead_R_TEXTEDT2_destroy(message_win); message_win = 0; } /*SPR 2132 end*/ if (info_win) { SEND_EVENT(info_win,DIALOG_DESTROY,0,0 ); info_win = 0; } if (list_win){ SEND_EVENT(list_win/*SPR1991*/,E_LIST_DESTROY/*SPR 2132*/,0,0 ); list_win = 0; } win_delete (data->win); { } /* * Free Memory */ /* Free the data allocated for the name associated to the phone number */ if (data->sms_editor_data.assoc_name != NULL) FREE_MEMORY( (void *)data->sms_editor_data.assoc_name, strlen(data->sms_editor_data.assoc_name) + 1); /* Free the data allocated for the dynamic list */ if (data->menu_list_data != NULL) { for (i = 0; i < ((data->sms_list_data).nb_sms_stored); i++) { FREE_MEMORY( (void *)data->sms_list_data.sms_header[i], UCS2_MENU_TEXT_LEN+ 1/*SPR1242*/); } /*SPR 2686, only de-allocate memory for the number of messages displayed*/ FREE_MEMORY ((void *)data->menu_list_data->List,((data->sms_list_data).nb_sms_stored) * sizeof(T_MFW_MNU_ITEM)); FREE_MEMORY ((UBYTE *)data->menu_list_data, sizeof(ListMenuData)); } #ifdef FF_MMI_SMS_DYNAMIC FREE_MEMORY((void*)data->sms_list_data.sms_messages,g_max_messages * sizeof(T_MFW_SMS_MSG) ); FREE_MEMORY((void*)data->sms_list_data.sms_header, g_max_messages * sizeof(wstring_t)); #endif FREE_MEMORY ((void *)data, sizeof (T_SMSREAD_R)); sms_read_win = 0; } else { TRACE_EVENT ("SmsRead_R_destroy() called twice"); } } } /******************************************************************************* $Function: SmsRead_R_exec_cb $Description: Exec callback function of the SMS read window (dynamic list of all the SMS) $Returns: none $Arguments: win - window handler event - mfw event parameter - optional data. *******************************************************************************/ void SmsRead_R_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter) /* callback handler for events sent to to trigger execution */ { T_MFW_WIN * win_data; T_SMSREAD_R * data; T_SMS_LIST_DATA * list_data; T_MFW_EVENT MfwEvents; T_MFW_SMS_STAT sms_list_type = *(T_MFW_SMS_STAT *)parameter; T_MFW_HND l_parent; T_DISPLAY_DATA DisplayInfo; // Status of SMS reading T_MFW status; int i; win_data = getWinData(win); //((T_MFW_HDR *))->data; data = getUserData_T_SMSREAD_R(win_data); list_data = &data->sms_list_data; TRACE_FUNCTION ("SmsRead_R_exec_cb()"); switch (event) { case E_INIT: // May 27, 2005 MMI-FIX-29869 x0018858 #ifdef FF_MMI_SMS_DYNAMIC // Memory allocation done here if(list_data->sms_messages == NULL) list_data->sms_messages = (T_MFW_SMS_MSG*)ALLOC_MEMORY (g_max_messages * sizeof(T_MFW_SMS_MSG) ); #endif /* initialization of administrative data */ info_win=0; data->id = value; data->menu_list_data = NULL; //NM 24.8 /* Verify that SMS handling has been correctly initialised */ if (!smsidle_get_ready_state()) { SmsMenu_loadDialogDefault(&DisplayInfo); DisplayInfo.TextId = TxtPleaseWait; //DisplayInfo.TextId2 = TxtReady; // Generic function for info messages DisplayInfo.Callback = (T_VOID_FUNC)SmsRead_R_dialog_cb; info_dialog(win, &DisplayInfo); break; } /* We have to handle E_SMS_MO and E_SMS_MT MFW events, in order to retrieve the SMS */ MfwEvents = E_SMS_MT | E_SMS_MO | E_SMS_MT_RECEIVED | E_SMS_MO_AVAIL| E_SMS_ERR | E_SMS_OK | E_SMS_MEM_FREE | E_SMS_MEM_FULL; data->sms_handle = sms_create(win,MfwEvents,(MfwCb)SmsRead_R_mfw_cb); /* Get info on the stored messages According to sms_list_type filter some specific type (new, read...) */ /*MC SPR 2530, change sms_index_list to sms_message_list, we need additional info*/ #ifdef FF_MMI_SMS_DYNAMIC list_data->nb_sms_stored = sms_message_list(sms_list_type, list_data->sms_messages, g_max_messages); #else list_data->nb_sms_stored = sms_message_list(sms_list_type, list_data->sms_messages, MAX_MESSAGES); #endif /* we want to get the whole SMS list */ if (list_data->nb_sms_stored > 0) { #ifdef ORIGINAL_SMS_LIST if (!info_win) info_win = mmi_dialog_information_screen_forever(win,TxtPleaseWait, NULL, COLOUR_STATUS_WAIT); // We want to read all the SMS g_sms_state = READ_SMS_LIST; /* global counter to decrement each time a message is read */ g_sms_list_counter = list_data->nb_sms_stored - 1; /* Initialise counter for number of entries in sms list. used to call the correct no of FreeAllocs MZ 8/03/01 */ g_nb_line_sms =0; status = sms_read(MFW_SMS_MESSAGE, (unsigned char)(list_data->sms_messages[g_sms_list_counter]).index); #else /*SPR 2530, instead of starting to raed the SMS list in a chain , just copy SMS status info and sender names to list*/ int i, txt_len; /*we're assuming the default language is a latin one*/ T_MFW_PHB_ENTRY phonebook_entry; BOOL unicode_flag= FALSE; UBYTE output_alphabet= MFW_ASCII; char* name_pointer = NULL; // May 27, 2005 MMI-FIX-29869 x0018858 #ifdef FF_MMI_SMS_DYNAMIC // Memory allocation done here list_data->sms_header = (wstring_t **) ALLOC_MEMORY (g_max_messages * sizeof(wstring_t) ); #endif /*for each entry in the message list*/ for (i=0;i<list_data->nb_sms_stored; i++) { /*allocate memory in the list*/ if(list_data->sms_header[i] == NULL) list_data->sms_header[i] = (wstring_t *) ALLOC_MEMORY (UCS2_MENU_TEXT_LEN + 1); /*SPR2530 clear buffer*/ memset(sms_text_ascii, 0, MAX_EDITOR_LEN); memset(list_data->sms_header[i], 0, UCS2_MENU_TEXT_LEN + 1); //Use common procedure to display status info.] //x0pleela 07 Feb, 2006 DR: OMAPS00059261 //check for Status report type and send MFW_SMS_STATRPT as status if( list_data->sms_messages[i].msg_type EQ MFW_SMS_STATRPT) { strcpy(sms_text_ascii, MmiRsrcGetText(TxtReport)); txt_len = strlen( sms_text_ascii); } else txt_len = SmsRead_GetStatusText( sms_text_ascii, list_data->sms_messages[i].stat); /*if we're in chinese, then all string handling is in Unicode*/ if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE) { unicode_flag = TRUE; output_alphabet= MFW_DCS_UCS2; } /*if incoming SMS, copy name or number to list*/ if (list_data->sms_messages[i].stat == MFW_SMS_UNREAD || list_data->sms_messages[i].stat == MFW_SMS_READ) { /*if phonebook entry found*/ if (bookFindNameInPhonebook( list_data->sms_messages[i].addr.number, &phonebook_entry )) { /*if name isn't blank*/ if (phonebook_entry.name.len >0) { /*if unicode tag we have to make some adjustments*/ if (phonebook_entry.name.data[0] == 0x80) { name_pointer = (char*)&phonebook_entry.name.data[2]; phonebook_entry.name.dcs = MFW_DCS_UCS2; phonebook_entry.name.len-=2; /*SPR2530 moved conversion here*/ //x0pleela 07 Feb, 2006 DR: OMAPS00059261 //Donot display sender's address for status report if( list_data->sms_messages[i].msg_type NEQ MFW_SMS_STATRPT) ATB_convert_String(name_pointer, phonebook_entry.name.dcs&0x0c, phonebook_entry.name.len, &sms_text_ascii[txt_len],output_alphabet , UCS2_MENU_TEXT_LEN-txt_len, TRUE); } else { name_pointer = (char*)phonebook_entry.name.data; /*copy (and convert) name to buffer*/ /*SPR2530 explicitly convert from ASCII to current alphabet*/ //x0pleela 07 Feb, 2006 DR: OMAPS00059261 //Donot display sender's address for status report if( list_data->sms_messages[i].msg_type NEQ MFW_SMS_STATRPT) ATB_convert_String(name_pointer, MFW_ASCII, phonebook_entry.name.len, &sms_text_ascii[txt_len],output_alphabet , UCS2_MENU_TEXT_LEN-txt_len, TRUE); } } } else { //x0pleela 07 Feb, 2006 DR: OMAPS00059261 //Donot display sender's address for status report if( list_data->sms_messages[i].msg_type NEQ MFW_SMS_STATRPT) /*copy (and convert) number to buffer*/ ATB_convert_String(list_data->sms_messages[i].addr.number, MFW_ASCII, MFW_NUM_LEN, &sms_text_ascii[txt_len],output_alphabet ,UCS2_MENU_TEXT_LEN-txt_len, TRUE); } } /* use truncation function to copy message header to list*/ resources_truncate_to_screen_width((char*)sms_text_ascii,0,(char*) list_data->sms_header[i], UCS2_MENU_TEXT_LEN, SCREEN_SIZE_X, unicode_flag); } //*All the messages have been retrieved --> display the list of SMS*/ if (Mmi_getCurrentLanguage() != CHINESE_LANGUAGE) SmsRead_R_BuildList(win,0); else SmsRead_R_BuildList(win,1); #endif } else SmsRead_DisplayStandardDialog(win, TxtNoMessages, THREE_SECS); break; case E_RETURN: /* Call the recreate function that will create and display a dynamic list from the list of SMS */ listDisplayListMenu(win, data->menu_list_data, (ListCbFunc_t)SmsRead_R_smslist_cb,0); break; case E_BACK: /* Received an E_BACK event from the dynamic list --> suicide and E_RETURN to parent */ l_parent = data->parent; SmsRead_R_destroy(win); SEND_EVENT(l_parent, E_RETURN, data->id, NULL); case E_EXIT: // Terminate exit from sms send... // May 27, 2005 MMI-FIX-29869 x0018858 #ifdef FF_MMI_SMS_DYNAMIC for (i=0;i<list_data->nb_sms_stored; i++) { FREE_MEMORY((U8*)list_data->sms_header[i], UCS2_MENU_TEXT_LEN + 1 ); } FREE_MEMORY((U8*)list_data->sms_header, g_max_messages * sizeof(wstring_t) ); FREE_MEMORY((U8*)list_data->sms_messages, g_max_messages * sizeof(T_MFW_SMS_MSG)); #endif listDisplayListMenu(win, data->menu_list_data, (ListCbFunc_t)SmsRead_R_smslist_cb,0); // FREE_MEMORY((U8*)list_data->sms_messages, g_max_messages * sizeof(T_MFW_SMS_MSG)); break; default: break; } } /******************************************************************************* $Function: SmsRead_R_win_cb $Description: Window callback function of the SMS read window (dynamic list of all the SMS) $Returns: none $Arguments: w - mfw window handler e - mfw event *******************************************************************************/ static int SmsRead_R_win_cb (MfwEvt e, MfwWin *w) /* yyy window event handler */ { TRACE_FUNCTION ("SmsRead_R_win_cb()"); switch (e) { case MfwWinVisible: /* window is visible */ break; case MfwWinFocussed: /* input focus / selected */ case MfwWinDelete: /* window will be deleted */ default: return MFW_EVENT_REJECTED; } return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: SmsRead_GetStatusText $Description: Function to copy status string into array provided. $Returns: number of characters used in the output array. $Arguments: op_text_str - pointer to array to store the string status - read status of text message. $History SPR#780-GW-Created to allow consistent display of status in text message list *******************************************************************************/ int SmsRead_GetStatusText( char* op_text_str, int status) { int txt_len, txtId; TRACE_FUNCTION("SmsRead_GetStatusText()"); if (status == MFW_SMS_READ) txtId = TxtOld; else if(status == MFW_SMS_UNREAD) txtId = TxtNew; else if(status == MFW_SMS_STOR_UNSENT) txtId = TxtSaved; else if(status == MFW_SMS_STOR_SENT) txtId = TxtSend; else if(status == MFW_SMS_INVALID)/*SPR 2530*/ txtId = TxtInvalidMessage; else //assume if it is not marked as new/old/sent/unsent txtId = TxtNull; // Check for the READ/UNREAD status of the MT message. if (Mmi_getCurrentLanguage() != CHINESE_LANGUAGE) { strcpy(op_text_str,MmiRsrcGetText(txtId)); /* Only add colon if a non-empty string and valid message*/ /*SPR2530 only out in a colon if the message is MT*/ if (txtId == TxtOld || txtId == TxtNew) strcat(op_text_str,":"); txt_len = strlen(op_text_str); } else //language = Chinese, copy unicode string { USHORT* unicodeStr; USHORT* txtStr; int uIndex; unicodeStr = charPtrToUSHORTPtr(op_text_str); txtStr = charPtrToUSHORTPtr(MmiRsrcGetText(txtId)); uIndex = 0; txt_len = 0; while ((*txtStr!= 0) && (uIndex*2 <MENU_TEXT_LENGTH)) { unicodeStr[uIndex] = *txtStr; txtStr++; uIndex++; txt_len = txt_len+2; // 2bytes per chinese char } /*SPR2530 only out in a colon if the message is MT*/ if ((uIndex*2 <MENU_TEXT_LENGTH) &&(txtId == TxtOld || txtId == TxtNew)) { unicodeStr[uIndex] = ((charToUSHORT)(':'))<<8; uIndex++; txt_len = txt_len+2; // 2bytes per chinese char } } /* Return number of characters copied into the array */ return (txt_len); } /******************************************************************************* $Function: SmsRead_R_mfw_cb $Description: MFW callback function of the SMS read window (dynamic list of all the SMS). Only interesting events for reading are handled here $Returns: event status $Arguments: parameter - optional data event - mfw event *******************************************************************************/ int SmsRead_R_mfw_cb(MfwEvt event, void *parameter) { T_MFW_HND win = mfwParent((MfwHdr *)mfw_header()); T_MFW_WIN * win_data; T_SMSREAD_R * data; T_SMS_LIST_DATA * list_data; T_MFW_SMS_MO * MoMessage; T_MFW_SMS_MT * MtMessage; T_MFW_SMS_IDX msg_info; UBYTE input_type;/*SPR1242, UCS2 or GSM string*/ T_DISPLAY_DATA DisplayInfo; int input_length = 0; /*MC, SPR 1453*/ BOOL unicode = FALSE;/*MC, SPR 1442*/ USHORT sms_len; char *sms_text; // int i; // RAVI int txt_len; win_data = getWinData(win); data = getUserData_T_SMSREAD_R(win_data); list_data = &(data->sms_list_data); TRACE_FUNCTION("SmsRead_R_mfw_cb"); switch(event) { case E_SMS_OK: TRACE_EVENT("SmsRead_R_mfw_cb case:E_SMS_OK "); if(deleting_win) { T_MFW_SMS_STAT sms_list_type = MFW_SMS_ALL; listsDestroy(list_win); list_win=0; SmsRead_R_destroy(data->win); SmsRead_R_start(NULL, (MfwMnuAttr*)&sms_list_type); SEND_EVENT(deleting_win,DIALOG_DESTROY,0,0 ); //API - Added line to show if the message was deleted! dlg_initDisplayData_TextId( &DisplayInfo, TxtNull, TxtNull, TxtDeleted, TxtNull, COLOUR_STATUS_WAIT); dlg_initDisplayData_events( &DisplayInfo, NULL, TWO_SECS, KEY_HUP ); info_dialog (0, &DisplayInfo); deleting_win = 0; } break; case E_SMS_MO: TRACE_EVENT("SmsRead_R_mfw_cb case:E_SMS_MO "); MoMessage = (T_MFW_SMS_MO *)parameter; /*SPR 2530, don't need to craete SMS list here anymore*/ #ifdef ORIGINAL_SMS_LIST // We are reading all the SMS on the SIM if (g_sms_state EQ READ_SMS_LIST) { // If no message text, display the address: TBD international format and phonebook if (MoMessage->msg_len == 0) { // If there is an associated name, it is displayed (but not stored here, we will have to retrieve it again if detailed view) sms_text = (MoMessage->dest_addr).number; sms_len = strlen(sms_text); } else { sms_text = MoMessage->sms_msg; sms_len = MoMessage->msg_len; } memset((char*)sms_text_ascii,'\0',UCS2_MENU_TEXT_LEN + 1); TRACE_EVENT_P1("MO Message Status = %d", msg_info.stat); sms_copy_idx(MoMessage->msg_ref, &msg_info); //GW-SPR#780-Use common procedure to display status info. txt_len = SmsRead_GetStatusText( sms_text_ascii, msg_info.stat); /*MC, SPR1242 don't trust the DCS, check for Unicode tag*/ if (MoMessage->sms_msg[0] == 0x80 ||MoMessage->dcs == MFW_DCS_UCS2 ) { input_type = MFW_DCS_UCS2; input_length = MoMessage->msg_len-1;/*MC,SPR 1453, prevent @ symbol on end of string*/ } else { input_type = MFW_DCS_8bits; input_length = MoMessage->msg_len;/*MC, SPR 1453*/ } /*mc end*/ if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE) { unicode = TRUE;/*MC, SPR 1442, we'll be displaying messages as unicode*/ /*SPR2175, use new function for conversion*/ ATB_convert_String( MoMessage->sms_msg, input_type /*MC SPR1242*/, MoMessage->msg_len, &sms_text_ascii[txt_len], MFW_DCS_UCS2, UCS2_MENU_TEXT_LEN-(txt_len+1), TRUE); } else { unicode = FALSE;/*MC, SPR 1442, we'll be displaying messages as ASCII*/ /*SPR2175, use new function for conversion*/ ATB_convert_String( MoMessage->sms_msg, input_type /*MC SPR1242*/, input_length/*SPR 1453*/, &sms_text_ascii[txt_len] , MFW_ASCII, MENU_TEXT_LENGTH-(txt_len+1), TRUE); } /* just in case */ if (g_sms_list_counter >= 0) { list_data->sms_header[g_sms_list_counter] = (wstring_t *) ALLOC_MEMORY (UCS2_MENU_TEXT_LEN + 1/*MC SPR1242*/); /*MC, SPR 1442, use truncation function to copy message header to list*/ resources_truncate_to_screen_width(sms_text_ascii,0,(char*) list_data->sms_header[g_sms_list_counter], UCS2_MENU_TEXT_LEN, SCREEN_SIZE_X, unicode); } TRACE_EVENT_P1("g_sms_list_counter = %d", g_sms_list_counter); g_sms_list_counter--; if (g_sms_list_counter >= 0) { // There are still messages to read. /*SPR2260, if reading SMS fails, retry*/ if (sms_read(MFW_SMS_MESSAGE, SHORTToUBYTE(list_data->sms_messages[g_sms_list_counter].index))== MFW_SMS_FAIL) { retry_sms_read(SHORTToUBYTE(list_data->sms_messages[g_sms_list_counter].index)); } else g_nb_line_sms++; } else { // All the messages have been retrieved --> display the list of SMS if (Mmi_getCurrentLanguage() != CHINESE_LANGUAGE) SmsRead_R_BuildList(win,0); else SmsRead_R_BuildList(win,1); } } // A particular SMS has been selected. We need to get all the info: full text, time stamp... else #endif if (g_sms_state EQ READ_SELECTED_SMS) { data->sms_editor_data.sms_info = (T_MFW_SMS_PARA *)ALLOC_MEMORY (sizeof (T_MFW_SMS_PARA)); data->sms_editor_data.sms_type = MMI_SMS_MO; memcpy(data->sms_editor_data.sms_info, (T_MFW_SMS_PARA *)MoMessage, sizeof(T_MFW_SMS_PARA)); SmsRead_R_TEXTEDT2_start(win, (MfwMnuAttr *)&(data->sms_editor_data)); } break; case E_SMS_MT: MtMessage = (T_MFW_SMS_MT *)parameter; /*SPR 2530, don't need to craete SMS list here anymore*/ #ifdef ORIGINAL_SMS_LIST if (g_sms_state EQ READ_SMS_LIST) { /*SPR 2176, if message is the last one requested from MFW*/ if (list_data->sms_messages[g_sms_list_counter].index == MtMessage->index) { // If no message text, display the address: TBD international format and phonebook if (MtMessage->msg_len == 0) { // If there is an associated name, it is displayed (but not stored here, we will have to retrieve it again if detailed view) // MZ check for assoc_name !!! 14/2/01 sms_text = (MtMessage->orig_addr).number; sms_len = strlen(sms_text); } else { sms_text = MtMessage->sms_msg; sms_len = MtMessage->msg_len; } //MZ 24/05/01 clear the temp sms text buffer. memset((char*)sms_text_ascii,'\0',UCS2_MENU_TEXT_LEN + 1); sms_copy_idx(MtMessage->index, &msg_info); //x0pleela 07 Feb, 2006 DR: OMAPS00059261 //Display "Report" for status report //GW-SPR#780-Use common procedure to display status info. TRACE_EVENT_P1("Status of message = %d", msg_info.stat); if( list_data->sms_messages[i].msg_type EQ MFW_SMS_STATRPT) { strcpy(sms_text_ascii, MmiRsrcGetText(TxtReport)); txt_len = strlen( sms_text_ascii); } else txt_len = SmsRead_GetStatusText( sms_text_ascii, msg_info.stat); /*MCSPR1242 don't trust the DCS, check for Unicode tag*/ if (MtMessage->sms_msg[0] == 0x80||MtMessage->dcs == MFW_DCS_UCS2 ) { input_type = MFW_DCS_UCS2;/*MC*/ input_length = MtMessage->msg_len-1;/*1498, use MT length*/ } else { input_type = MFW_DCS_8bits;/*MC*/ input_length = MtMessage->msg_len;/*1498, use MT length*/ } /*mc end*/ if (Mmi_getCurrentLanguage() != CHINESE_LANGUAGE) { unicode = FALSE; /*MC, SPR 1442, we'll be displaying messages as ASCII*/ /*SPR2175, use new function for conversion*/ //x0pleela 07 Feb, 2006 DR: OMAPS00059261 //Donot display sender's address for status report if( list_data->sms_messages[i].msg_type NEQ MFW_SMS_STATRPT) ATB_convert_String( MtMessage->sms_msg, input_type/*MC SPR1242*/, input_length/*SPR 1453*/, &sms_text_ascii[txt_len], MFW_ASCII /*MC SPR1242*/, MENU_TEXT_LENGTH-(txt_len+1)/*MC SPR1242*/, TRUE); } else //language = Chinese { unicode = TRUE;/*MC, SPR 1442, we'll be displaying messages as unicode*/ /*SPR2175, use new function for conversion*/ //x0pleela 07 Feb, 2006 DR: OMAPS00059261 //Donot display sender's address for status report if( list_data->sms_messages[i].msg_type NEQ MFW_SMS_STATRPT) ATB_convert_String( MtMessage->sms_msg, input_type /*SH*/, MtMessage->msg_len, &sms_text_ascii[txt_len], MFW_DCS_UCS2, UCS2_MENU_TEXT_LEN-txt_len/*MC SPR1242*/, TRUE); } list_data->sms_header[g_sms_list_counter] = (wstring_t *) ALLOC_MEMORY (UCS2_MENU_TEXT_LEN + 1/*MC SPR1242*/); //Check for allocation fail before using memory if(list_data->sms_header[g_sms_list_counter] != NULL) { /*MC, SPR 1442, use truncation function to copy message header to list*/ resources_truncate_to_screen_width(sms_text_ascii,0,(char*) list_data->sms_header[g_sms_list_counter], UCS2_MENU_TEXT_LEN, SCREEN_SIZE_X, unicode); } else TRACE_EVENT(" Memory allocation failed "); g_sms_list_counter--; if (g_sms_list_counter >= 0) { // There are still messages to read. /*SPR2260, if reading SMS fails, retry*/ if (sms_read(MFW_SMS_MESSAGE, (UBYTE)list_data->sms_messages[g_sms_list_counter].index) == MFW_SMS_FAIL) { retry_sms_read(SHORTToUBYTE(list_data->sms_messages[g_sms_list_counter].index)); } g_nb_line_sms++; } else { // All the messages have been retrieved --> display the list of SMS if (Mmi_getCurrentLanguage() != CHINESE_LANGUAGE) SmsRead_R_BuildList(win,0); else SmsRead_R_BuildList(win,1); } } else { /*if index is not the one expected, pass event on to SmsIdle module*/ return MFW_EVENT_PASSED; } } else #endif if (g_sms_state EQ READ_SELECTED_SMS) { TRACE_EVENT_P1("MtMessage len: %d", MtMessage->msg_len); /*SPR 2176, if this was the message we requested*/ if (MtMessage->index == data->sms_editor_data.sms_index) { data->sms_editor_data.sms_info = (T_MFW_SMS_PARA *)ALLOC_MEMORY (sizeof (T_MFW_SMS_PARA)); data->sms_editor_data.sms_type = MMI_SMS_MT; memcpy(data->sms_editor_data.sms_info, (T_MFW_SMS_PARA *)MtMessage, sizeof(T_MFW_SMS_PARA)); sms_copy_idx(MtMessage->index, &msg_info); SmsRead_R_TEXTEDT2_start(win, (MfwMnuAttr *)&(data->sms_editor_data)); } else { /*if index is not the one expected, pass event on to SmsIdle module*/ return MFW_EVENT_PASSED; } } break; case E_SMS_ERR: TRACE_EVENT("SMS Error"); if (info_win){ SEND_EVENT(info_win,DIALOG_DESTROY,0,0 ); info_win = 0; } #ifndef ORIGINAL_SMS_LIST /*SPR 2530 Delete and recreate SMS list window to show updates*/ { T_MFW_SMS_STAT sms_list_type = MFW_SMS_ALL; listsDestroy(list_win); list_win=0; SmsRead_R_destroy(sms_read_win); SmsRead_R_start(NULL, (MfwMnuAttr*)&sms_list_type); } #endif break; /*SPR 2530 handle new message event*/ case E_SMS_MT_RECEIVED: /*if we are not currently displaying a message*/ // Feb 16, 2005 REF: CRR MMI-SPR-27900 xnkulkar // Added condition ' invalidVm == FALSE' before updating sms list // to ensure that no blank voice mail sms entry is shown. if (message_win == NULL && invalidVm == FALSE) /*SPR 2530 Delete and recreate SMS list window to show updates*/ { T_MFW_SMS_STAT sms_list_type = MFW_SMS_ALL; // Dec 15,2004 REF: CRR 24396 xkundadu // Description: Phone crashes when a message is received while the // 'List Empty' dialog is displayed. // Solution: NULL check is added for the list_win handle before calling // listsDestroy() function when an MT sms is receieved. // Check whether the sms list window is already destroyed or not. TRACE_EVENT(" MT SMS RECEIVED "); if(list_win != NULL) { listsDestroy(list_win); list_win=0; } // If the 'List empty' dialog is being displayed, // wait for 3 seconds and continue. if(SmsListEmptyDlgPresent) { vsi_t_sleep (VSI_CALLER 3000); } SmsRead_R_destroy(sms_read_win); SmsRead_R_start(NULL, (MfwMnuAttr*)&sms_list_type); } /*pass event to next handler*/ return MFW_EVENT_REJECTED; // break; // RAVI /*SPR 2530 end*/ default: TRACE_EVENT(" SmsRead_R_mfw_cb case: Default"); return MFW_EVENT_REJECTED; } return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: retry_sms_read. Added for SPR2260 $Description: set up a timer to re-read sms at passed index in 100ms $Returns: none $Arguments: index of sms to be re-read *******************************************************************************/ void retry_sms_read(int index) { TRACE_EVENT("retry_sms_read()"); retry_handle = tim_create(NULL, 1000, (MfwCb)retry_sms_read_tim_cb); tim_start(retry_handle); retry_index = index; } /******************************************************************************* $Function: retry_sms_read_tim_cb. Added for SPR2260 $Description: Callback function for retry SMS read timer $Returns: status int $Arguments: event, timer data structure *******************************************************************************/ int retry_sms_read_tim_cb(MfwEvt event, MfwTim *timer_info) { TRACE_EVENT("retry_sms_read_tim_cb()"); if (sms_read(MFW_SMS_MESSAGE, retry_index) == MFW_SMS_FAIL) { tim_start(retry_handle);} else { tim_delete(retry_handle); retry_handle = NULL; } return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: SmsRead_R_smslist_cb $Description: Callback function for the dynamic list of the SMS read window. $Returns: none $Arguments: Parent - window handler ListData - Menu list data. *******************************************************************************/ void SmsRead_R_smslist_cb(T_MFW_HND * Parent, ListMenuData * ListData) { T_MFW_WIN * win_data; T_SMSREAD_R * data; // T_MFW_HND * l_parent; // RAVI // SHORT l_id; // RAVI TRACE_FUNCTION("SmsRead_R_smslist_cb "); win_data = getWinData(Parent); data = getUserData_T_SMSREAD_R(win_data); // In all the case, we need the index of the selected message data->sms_editor_data.sms_index = data->sms_list_data.sms_messages[ListData->ListPosition].index; if (ListData->Reason EQ LISTS_REASON_SELECT/* && ListData->KeyReason EQ KCD_LEFT*/) { TRACE_EVENT(">>> Reason:LISTS_REASON_SELECT "); // We want only to retrieve the selected SMS g_sms_state = READ_SELECTED_SMS; if (!info_win) info_win = mmi_dialog_information_screen_forever(Parent,TxtPleaseWait, NULL, COLOUR_STATUS_WAIT); /*NM p030 just in case not to using the '0' index for reading */ if (data->sms_editor_data.sms_index NEQ 0) { /*SPR 2530, if read fails, retry later*/ if (sms_read(MFW_SMS_MESSAGE, SHORTToUBYTE(data->sms_editor_data.sms_index ))== MFW_SMS_FAIL) { retry_sms_read(SHORTToUBYTE(data->sms_editor_data.sms_index )); } } } /*NM p032 check if the TEST SIM is inserted. During testing FTA 34.2.3 we would like to delete the sms from the list without changing the sms-status from unread to read */ if (test_sim EQ TRUE) { if (ListData->Reason EQ LISTS_REASON_HANGUP) { TRACE_EVENT(">>> Reason: LISTS_REASON_HANGUP "); listsDestroy(ListData->win); list_win=0; SmsRead_R_destroy(data->win); } /* the right-soft-key deletes the selected sms in the list-menu without changing the read-status of the sms. go-back key is now on the "Hang_up" */ if ((ListData->Reason EQ LISTS_REASON_BACK ) || (ListData->Reason EQ LISTS_REASON_CLEAR )) { T_DISPLAY_DATA DisplayInfo; TRACE_EVENT(">>> Reason: LISTS_REASON_BACK/CLEAR "); /* show for a short period "Message deleted" and go back to the previous menu-screen */ if((sms_msg_delete((UBYTE)data->sms_editor_data.sms_index) EQ MFW_SMS_OK) && (data->sms_editor_data.sms_index NEQ 0)) { DisplayInfo.TextString = '\0'; DisplayInfo.TextString2 = '\0'; DisplayInfo.LeftSoftKey = 0; DisplayInfo.RightSoftKey = 0; DisplayInfo.Time = THREE_SECS; DisplayInfo.KeyEvents = KEY_CLEAR|KEY_LEFT|KEY_RIGHT;; DisplayInfo.TextId = TxtMessage; DisplayInfo.TextId2 = TxtDeleted; DisplayInfo.Identifier = NULL; DisplayInfo.Callback = NULL; info_dialog(data->win, &DisplayInfo); } /* destroy the read-sms-menu and go back to the previous screen */ listsDestroy(ListData->win); list_win=0; SmsRead_R_destroy(data->win); } } else { if ((ListData->Reason EQ LISTS_REASON_BACK /*&& ListData->KeyReason EQ KCD_RIGHT*/) || (ListData->Reason EQ LISTS_REASON_CLEAR /*&& ListData->KeyReason EQ KCD_HUP */) || (ListData->Reason EQ LISTS_REASON_HANGUP)) // sbh - added hangup key { TRACE_EVENT(">>> Reason: LISTS_REASON_BACK/CLEAR "); listsDestroy(ListData->win); list_win=0; SmsRead_R_destroy(data->win); } } /*NM p032 end*/ } /******************************************************************************* $Function: SmsRead_R_dialog_cb $Description: Dialog callback function of the SMS read window (dynamic list of all the SMS) Case where SMS has not been initialized yet $Returns: status $Arguments: win - current window handler Identifier - window id Reason - Event cause. *******************************************************************************/ int SmsRead_R_dialog_cb(T_MFW_HND win, USHORT Identifier, USHORT Reason) { T_MFW_WIN * win_data; T_SMSREAD_R * data; T_MFW_HND *lparent; win_data = getWinData(win); data = getUserData_T_SMSREAD_R(win_data); lparent = data->parent; TRACE_FUNCTION ("SmsRead_dialog_cb()"); switch (Reason) { case INFO_TIMEOUT: case INFO_KCD_HUP: // Commit suicide SmsRead_R_destroy(win); // Send E_RETURN event to parent window SEND_EVENT(lparent, E_RETURN, data->id, NULL); // Dec 15,2004 REF: CRR 24396 xkundadu // Description: Phone crashes when a message is received while the // 'List Empty' dialog is displayed. // set the variable to FALSE, since 'List empty' dialog has been destroyed . SmsListEmptyDlgPresent = FALSE; return MFW_EVENT_CONSUMED; default: return MFW_EVENT_REJECTED; } } /******************************************************************************* $Function: SmsRead_R_BuildList $Description: Build the list of SMS for the dynamic list. $Returns: status $Arguments: win - current window handler *******************************************************************************/ void SmsRead_R_BuildList(T_MFW_HND win, int inUnicode) { T_MFW_WIN * win_data; T_SMSREAD_R * data; /* List is complete so present menu. */ USHORT i; TRACE_FUNCTION("SmsRead_R_BuildList"); win_data = getWinData(win); data = getUserData_T_SMSREAD_R(win_data); data->menu_list_data = (ListMenuData *)ALLOC_MEMORY(sizeof(ListMenuData)); if(data->menu_list_data == 0) { TRACE_EVENT("Failed memory alloc 1 "); return; } /*SPR 2686, only allocate memory for the number of messages displayed*/ data->menu_list_data->List = (T_MFW_MNU_ITEM *)ALLOC_MEMORY( ((data->sms_list_data).nb_sms_stored) * sizeof(T_MFW_MNU_ITEM) );//JVJE if(data->menu_list_data->List == 0) { TRACE_EVENT("Failed memory alloc 2"); return; } for (i = 0; i < ((data->sms_list_data).nb_sms_stored); i++) { mnuInitDataItem(&data->menu_list_data->List[i]); data->menu_list_data->List[i].str = (char *)(data->sms_list_data).sms_header[i]; data->menu_list_data->List[i].flagFunc = item_flag_none; } data->menu_list_data->ListLength =(data->sms_list_data).nb_sms_stored; data->menu_list_data->ListPosition = 1; data->menu_list_data->CursorPosition = 1; data->menu_list_data->SnapshotSize =(data->sms_list_data).nb_sms_stored; data->menu_list_data->Font = 0; data->menu_list_data->LeftSoftKey = TxtSoftSelect; /*NM p032*/ if(test_sim EQ TRUE) data->menu_list_data->RightSoftKey = TxtDelete; else data->menu_list_data->RightSoftKey = TxtSoftBack; data->menu_list_data->KeyEvents = KEY_ALL; data->menu_list_data->Reason = 0; data->menu_list_data->Strings = TRUE; data->menu_list_data->Attr = (MfwMnuAttr*)&readSMS_menuAttrib; data->menu_list_data->autoDestroy = FALSE; /* Create the dynamic menu window */ listDisplayListMenu(win, data->menu_list_data, (ListCbFunc_t)SmsRead_R_smslist_cb,inUnicode); list_win = data->menu_list_data->win; if (info_win){ SEND_EVENT(info_win,DIALOG_DESTROY,0,0 ); info_win = 0; } } /******************************************************************************* $Function: SmsRead_R_OPTExeDelete $Description: Called when the user press Delete in the Option menu $Returns: event status. $Arguments: m - pointer to menu. i - index if selected menu item. *******************************************************************************/ static int SmsRead_R_OPTExeDelete(MfwMnu* m, MfwMnuItem* item) { T_MFW_HND win = mfwParent(mfw_header()); T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data; T_SMSREAD_R_OPT * data = (T_SMSREAD_R_OPT *)win_data->user; /* access to data from parent */ T_MFW_HDR * parent = data->parent; T_MFW_WIN * win_data2 = ((T_MFW_HDR *)parent)->data; T_SMSREAD_R_TEXTEDT2 * parent_data = (T_SMSREAD_R_TEXTEDT2 *)win_data2->user; // May 27, 2005 MMI-FIX-29869 x0018858 #ifdef FF_MMI_SMS_DYNAMIC // Changed from static to dynamic T_MFW_SMS_IDX* temp_message_list;/*SPR2530*/ #else T_MFW_SMS_IDX temp_message_list[MAX_MESSAGES];/*SPR2530*/ #endif int no_of_messages, i;/*SPR2530*/ BOOL message_currently_in_list = FALSE;/*SPR2530*/ UBYTE deleting_index = parent_data->sms_editor_data->sms_index;/*SPR2686*/ #ifdef FF_MMI_SMS_DYNAMIC temp_message_list = (T_MFW_SMS_IDX*)ALLOC_MEMORY(g_max_messages*sizeof(T_MFW_SMS_IDX)); #endif TRACE_FUNCTION("SmsRead_R_OPTExeDelete"); #ifdef MMI_LITE /*SPR 2686 destroy option window to reduce memory usage*/ if (mfwCheckMemoryLeft() < 400) SmsRead_R_OPT_destroy(option_mnu_win); #endif /*SPR2530, check if message index in current list of messages*/ #ifdef FF_MMI_SMS_DYNAMIC no_of_messages = sms_index_list(MFW_SMS_ALL, temp_message_list, g_max_messages); #else no_of_messages = sms_index_list(MFW_SMS_ALL, temp_message_list, MAX_MESSAGES); #endif for (i= 0; i< no_of_messages;i++) { if (temp_message_list[i].index == deleting_index) message_currently_in_list = TRUE; } if (message_currently_in_list == TRUE) { if(sms_msg_delete((UBYTE)deleting_index/*SPR 2686*/)== MFW_SMS_OK) { /* set the status that the user selected the delete item */ if(deleting_win == 0) deleting_win= mmi_dialog_information_screen_forever(0,TxtPleaseWait, NULL, COLOUR_STATUS_WAIT); { // Destroy the text editor and free memory. SmsRead_R_TEXTEDT2_destroy(parent_data->win); /*SPR 2686, only destroy option menu window if it hasn't already been destroyed*/ if (option_mnu_win) SmsRead_R_OPT_destroy(option_mnu_win); } } else { /*SPR2530, don't delete option and display windows, just show failure*/ mmi_dialog_information_screen(0,TxtFailed, NULL, NULL, COLOUR_STATUS_WAIT); } } else { /*SPR2530, don't delete option and display windows, just show failure*/ mmi_dialog_information_screen(0,TxtFailed, NULL, NULL, COLOUR_STATUS_WAIT); } // May 27, 2005 MMI-FIX-29869 x0018858 #ifdef FF_MMI_SMS_DYNAMIC // Free the allocated memory FREE_MEMORY((U8*)temp_message_list, g_max_messages*sizeof(T_MFW_SMS_IDX)); #endif return 1; // ADDED BY RAVI - 28-11-2005 } /******************************************************************************* $Function: SmsRead_R_OPTExeReply $Description: Called when the user press Reply in the Option menu $Returns: event status. $Arguments: m - pointer to menu. i - index if selected menu item. *******************************************************************************/ static int SmsRead_R_OPTExeReply(MfwMnu* m, MfwMnuItem* i) { T_MFW_HND win = mfwParent(mfw_header()); T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data; T_SMSREAD_R_OPT * data = (T_SMSREAD_R_OPT *)win_data->user; T_MFW_HDR * parent = data->parent; T_MFW_WIN * win_data2 = ((T_MFW_HDR *)parent)->data; T_SMSREAD_R_TEXTEDT2 * parent_data = (T_SMSREAD_R_TEXTEDT2 *)win_data2->user; // March 2, 2005 REF: CRR 11536 x0018858 // T_MFW_SMS_INFO sms_parameter;//Added for retreiving the Reply path. // RAVI TRACE_FUNCTION("SmsRead_R_OPTExeReply"); /* Copy the number and name information to the SMS buffer */ /*MC SPR 1257, clear whole buffer in case of Unicode entry*/ memset(SmsData.TextBuffer, '\0', MAX_MSG_LEN_ARRAY); //Copy the calling number for pasting into the number buffer; /* Marcus: Issue 1804: 12/03/2003: Start */ if(parent_data->sms_editor_data->sms_info->sms_mt.orig_addr.ton == MFW_TON_INTERNATIONAL) { if(parent_data->sms_editor_data->sms_info->sms_mt.orig_addr.number[0] == '+') { strcpy((char *)SmsData.NumberBuffer,(char *)parent_data->sms_editor_data->sms_info->sms_mt.orig_addr.number); } else { strcpy((char *)SmsData.NumberBuffer,"+"); strncat((char *)SmsData.NumberBuffer,(char *)parent_data->sms_editor_data->sms_info->sms_mt.orig_addr.number,sizeof(SmsData.NumberBuffer)-2); } } else strcpy((char *)SmsData.NumberBuffer,(char *)parent_data->sms_editor_data->sms_info->sms_mt.orig_addr.number); /* Marcus: Issue 1804: 12/03/2003: End */ // March 2, 2005 REF: CRR 11536 x0018858 // Retreive and check the reply bit from the structure. // see if we should use our own service centre number if ( reply_path_bit && parent_data->sms_editor_data->sms_info->sms_mt.rp && strlen(parent_data->sms_editor_data->sms_info->sms_mt.sc_addr) != 0 ) { TRACE_EVENT_P1("The receivers SCA is %s",parent_data->sms_editor_data->sms_info->sms_mt.sc_addr); SmsData.called_from_reply_item = TRUE; /* copy the service center number as well */ strcpy((char *)SmsData.CentreBuffer, (char *)parent_data->sms_editor_data->sms_info->sms_mt.sc_addr); } else { TRACE_EVENT_P1("The senders SCA is %s",SmsData.NumberBuffer); /* use the own Service Center Number if the caller doesnt send one*/ SmsData.called_from_reply_item = FALSE; } /* p304 SH save window pointer */ win = parent_data->win; // Destroy the text editor, free memory SmsRead_R_TEXTEDT2_destroy(parent_data->win); /* Destroy the Options Menu and text editor.before starting the Send Editor.*/ SmsRead_R_OPT_destroy(data->win); /*SPR 2686 destroy the SMS read window to free memory*/ /*destroy the built list window*/ listsDestroy(list_win); list_win=0; /*destroy the main control window*/ if (sms_read_win)/*SPR 2132, check window exists before destroying it*/ { SmsRead_R_destroy(sms_read_win); sms_read_win = NULL; } /* NM, FTA 34.2.8 */ /* p304 SH - call this after destroying editor & windows. parent_data is lost, so use pointer saved from above */ SmsSend_SEND_start(win, (void *) &SmsData); return 1; } /******************************************************************************* $Function: SmsRead_R_OPTExeStoreNumber $Description: Called when the user press Store Number in the Option menu $Returns: event status. $Arguments: m - pointer to menu. i - index if selected menu item. *******************************************************************************/ static int SmsRead_R_OPTExeStoreNumber(MfwMnu* m, MfwMnuItem* i) { T_MFW_HND win = mfwParent(mfw_header()); T_MFW_HND win2; //Mar 27, 2006 DR:OMAPS00047813 x0035544 T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data; T_SMSREAD_R_OPT * data = (T_SMSREAD_R_OPT *)win_data->user; T_MFW_HDR * parent = data->parent; T_MFW_WIN * win_data2 = ((T_MFW_HDR *)parent)->data; T_SMSREAD_R_TEXTEDT2 * parent_data = (T_SMSREAD_R_TEXTEDT2 *)win_data2->user; T_MFW_PHB_ENTRY pb_data; // UBYTE found_name; /*SPR888 -SH*/ // RAVI //Mar 27, 2006 DR:OMAPS00047813 x0035544 CHAR number[MFW_NUM_LEN]; T_MFW_PHB_TON ton; TRACE_FUNCTION("SmsRead_R_OPTExeStoreNumber"); /* Copy the number and name information to the SMS buffer */ //Mar 27, 2006 DR:OMAPS00047813 x0035544 ton = parent_data->sms_editor_data->sms_info->sms_mt.orig_addr.ton; strcpy(number, parent_data->sms_editor_data->sms_info->sms_mt.orig_addr.number); /*SPR 2686 destroy windows before attempting to extract numbers.*/ // Destroy the text editor, rel memory. SmsRead_R_TEXTEDT2_destroy(parent_data->win); /* Destroy the Options Menu and text editor. */ SmsRead_R_OPT_destroy(data->win); //Mar 27, 2006 DR:OMAPS00047813 x0035544 if(ton == MFW_TON_INTERNATIONAL && number[0]!='+' && strlen((char *)number)>0 ) /* SPR888 - SH - do not add + if already there */ { strcpy((char *)SmsData.NumberBuffer,"+"); strcat((char *)SmsData.NumberBuffer,(char *)number); } else { strcpy((char *)SmsData.NumberBuffer,(char *)number); } if (read_status EQ MMI_SMS_MT) { /* MT -SMS has the additional information (Date, Time & Number) we dont want to show these when we are editing */ memcpy(SmsData.TextBuffer,&sms_text_ascii[current_sms_len],MAX_MSG_LEN_ARRAY); } else { //when we were reading the saved-SMS with the length of MAX_MSG_LEN memcpy(SmsData.TextBuffer,sms_text_ascii,MAX_MSG_LEN_ARRAY);/* assumption: sms_text_ascii is still filled from reading the SMS*/ } /* SPR888 - SH - Start looking for numbers from beginning of SMS text */ #if 0 //Mar 24, 2006 DR:OMAPS00047813 x0035544 search_index = 0; if (strlen((char *)SmsData.NumberBuffer)==0) { Search_forNextNumber(&SmsData); } if (strlen((char *)SmsData.NumberBuffer)==0) { mmi_dialog_information_screen(0, TxtNotAvailable, NULL, NULL, NULL); } else { //Search the phonebook for the sender number entry and display the tag and number. if (bookFindNameInPhonebook((const char*)&SmsData.NumberBuffer[0], &pb_data) !=0) { #ifdef NO_ASCIIZ //Display the tag and number dialog. /* SPR888 - SH - parent_data->parent changed to parent_data->win */ smsRead_NumberName_info_screen(0,(void *)&SmsData, (char*)pb_data.name.data); #else //Display the tag and number dialog. /* SPR888 - SH - parent_data->parent changed to parent_data->win */ smsRead_NumberName_info_screen(0,(void *)&SmsData, (char*)pb_data.name); #endif } else { /* SPR888 - SH - parent_data->parent changed to parent_data->win */ smsRead_NumberName_info_screen(0,(void *)&SmsData,NULL); } } #endif //Mar 24, 2006 DR:OMAPS00047813 x0035544 //Mar 24, 2006 DR:OMAPS00047813 x0035544 Search_forNumberInSMS(&SmsData); win2 = SmsRead_BuildNumList_Menu( win); if (win2 NEQ NULL) { SEND_EVENT (win2, E_INIT, 0, 0); } return 1; } /******************************************************************************* $Function: SmsRead_R_OPTExeEdit $Description: Called when the user press Forward in the Option menu $Returns: event status. $Arguments: m - pointer to menu. i - index if selected menu item. *******************************************************************************/ static int SmsRead_R_OPTExeEdit(MfwMnu* m, MfwMnuItem* i) { T_MFW_HND win = mfwParent(mfw_header()); T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data; T_SMSREAD_R_OPT * data = (T_SMSREAD_R_OPT *)win_data->user; T_MFW_HDR * parent = data->parent; T_MFW_WIN * win_data2 = ((T_MFW_HDR *)parent)->data; T_SMSREAD_R_TEXTEDT2 * parent_data = (T_SMSREAD_R_TEXTEDT2 *)win_data2->user; T_DISPLAY_DATA Dialog; TRACE_FUNCTION("SmsRead_R_OPTExeEdit"); if (FFS_flashData.ConcatenateStatus == TRUE ) { /* Copy the number and name information to the SMS buffer */ SmsData.NumberBuffer[0] = '\0'; if (read_status EQ MMI_SMS_MT) { /* MT -SMS has the additional information (Date, Time & Number) we dont want to show these when we are editing */ // Dec 01, 2004 REF: CRR 24225 xnkulkar // Description: Reset when forwarding SMS // Solution: The message content is sent excluding the date/time info from the // original message, which was causing the reset as the max limit was crossed. memcpy(SmsData.TextBuffer,&sms_text_ascii[current_sms_len + ORIGINAL_DATE_TIME_INFO],MAX_MSG_LEN_ARRAY); } else { //when we were reading the saved-SMS with the length of MAX_MSG_LEN memcpy(SmsData.TextBuffer,sms_text_ascii,MAX_MSG_LEN_ARRAY);/* assumption: sms_text_ascii is still filled from reading the SMS*/ } SmsData.called_from_reply_item = FALSE; /* p304 SH save window pointer */ win = parent_data->win; // Destroy the text editor, free memory SmsRead_R_TEXTEDT2_destroy(parent_data->win); /* Destroy the Options Menu and text editor.before starting the Send Editor.*/ SmsRead_R_OPT_destroy(data->win); /*SPR 1991 destroy the SMS read window to free memory*/ /*destroy the built list window*/ listsDestroy(list_win); list_win=0; /*destroy the main control window*/ if (sms_read_win)/*SPR 2132, check window exists before destroying it*/ { SmsRead_R_destroy(sms_read_win); sms_read_win = NULL; } /*SPR 1991 end*/ /* NM, FTA 34.2.8 */ /* p304 SH - call this after destroying editor & windows. parent_data is lost, so use pointer saved from above */ SmsSend_SEND_start(win, (void *) &SmsData); } /* API - 28-01-03 - 1628 - Allow the editing of a single SMS if ConcatenateStatus is FALSE */ /* API - 19-03-03 - 1825 - Allow the editing of a single saved SMS if ConcatenateStatus is FLASE*/ // Feb 16, 2005 REF: CRR 28966 x0012851 // Description: Editing or forwarding of large MT messages (>160 characters) // shouldn't be allowed when Concatenation is set to 'OFF' // Solution: If the 'ConcatenateStatus' flag is FALSE, the 'if' check condition // which allows the message to be edited or forwarded has been // modified for the same. else if (FALSE==FFS_flashData.ConcatenateStatus) { if (((read_status EQ MMI_SMS_MT) && (parent_data->sms_editor_data->sms_info->sms_mt.msg_len <= BASIC_MAX_MSG_LEN)) ||((read_status EQ MMI_SMS_MO) && (parent_data->sms_editor_data->sms_info->sms_mo.msg_len <= BASIC_MAX_MSG_LEN))) { TRACE_EVENT_P1("msg_len in edit is = %d", parent_data->sms_editor_data->sms_info->sms_mt.msg_len); /* Copy the number and name information to the SMS buffer */ SmsData.NumberBuffer[0] = '\0'; if (read_status EQ MMI_SMS_MT) { /* MT -SMS has the additional information (Date, Time & Number) we dont want to show these when we are editing */ // Dec 01, 2004 REF: CRR 24225 xnkulkar // Description: Reset when forwarding SMS // Solution: The message content is sent excluding the date/time info from the // original message, which was causing the reset as the max limit was crossed. memcpy(SmsData.TextBuffer,&sms_text_ascii[current_sms_len + ORIGINAL_DATE_TIME_INFO],MAX_MSG_LEN_SGL); } else { //when we were reading the saved-SMS with the length of MAX_MSG_LEN memcpy(SmsData.TextBuffer,sms_text_ascii,MAX_MSG_LEN_SGL);/* assumption: sms_text_ascii is still filled from reading the SMS*/ } SmsData.called_from_reply_item = FALSE; win = parent_data->win; // Destroy the text editor, free memory SmsRead_R_TEXTEDT2_destroy(parent_data->win); /* Destroy the Options Menu and text editor.before starting the Send Editor.*/ SmsRead_R_OPT_destroy(data->win); /*SPR 1991 destroy the SMS read window to free memory*/ /*destroy the built list window*/ listsDestroy(list_win); list_win=0; /*destroy the main control window*/ if (sms_read_win)/*SPR 2132, check window exists before destroying it*/ { SmsRead_R_destroy(sms_read_win); sms_read_win = NULL; } /*SPR 1991 end*/ SmsSend_SEND_start(win, (void *) &SmsData); } /* API - 28-01-03 - 1628 - END */ else { /* Initialise the dialog control block with default information */ dlg_initDisplayData_TextId( &Dialog, TxtNull, TxtNull, TxtNotAllowed, TxtNull , COLOUR_STATUS_WAIT); dlg_initDisplayData_events( &Dialog, (T_VOID_FUNC)NULL, 3000, KEY_CLEAR ); /* Show the dialog */ info_dialog( win, &Dialog ); } } return 1; } /******************************************************************************* $Function: SmsRead_R_READSMS_OPT_start $Description: Start the creation of the Option Window from the Read SMS Text window. $Returns: mfw window handler $Arguments: parent_window- pointer to menu. menuAttr - menu attributes. *******************************************************************************/ T_MFW_HND SmsRead_R_READSMS_OPT_start(T_MFW_HND parent_window, MfwMnuAttr *menuAttr) { /*SPR 2132, setting global var to keep track of options window*/ TRACE_FUNCTION ("SmsRead_R_OPT_start()"); option_mnu_win = SmsRead_R_OPT_create (parent_window); if (option_mnu_win NEQ NULL) { SEND_EVENT (option_mnu_win , E_INIT, SmsRead_R_READSMS_OPT_ID, (void *)menuAttr); } return option_mnu_win; } /*SPR 2132, removed obsolete function*/ /******************************************************************************* $Function: SmsRead_R_OPT_create $Description: Create the Options window $Returns: window handler $Arguments: parent_window- pointer to parent window *******************************************************************************/ static T_MFW_HND SmsRead_R_OPT_create(MfwHnd parent_window) { T_SMSREAD_R_OPT * data = (T_SMSREAD_R_OPT *)ALLOC_MEMORY (sizeof (T_SMSREAD_R_OPT)); T_MFW_WIN * win; TRACE_FUNCTION ("SmsRead_R_OPT_create()"); /* * Create window handler */ data->win = win_create (parent_window, 0, E_WIN_VISIBLE, (T_MFW_CB)SmsRead_R_OPT_win_cb); if (data->win EQ NULL) { return NULL; } /* * connect the dialog data to the MFW-window */ data->mmi_control.dialog = (T_DIALOG_FUNC)SmsRead_R_OPT_exec_cb; data->mmi_control.data = data; win = ((T_MFW_HDR *)data->win)->data; win->user = (void *)data; data->parent = parent_window; /* * return window handle */ return data->win; } /******************************************************************************* $Function: SmsRead_R_OPT_destroy $Description: Destroy the Option window $Returns: none $Arguments: own_window- current window *******************************************************************************/ static void SmsRead_R_OPT_destroy(MfwHnd own_window) { T_MFW_WIN * win_data; T_SMSREAD_R_OPT * data; TRACE_FUNCTION ("SmsRead_R_OPT_destroy()"); if (own_window) { win_data = ((T_MFW_HDR *)own_window)->data; data = (T_SMSREAD_R_OPT *)win_data->user; if (data) { /* * Delete WIN handler */ win_delete (data->win); /* * Free Memory */ FREE_MEMORY ((void *)data, sizeof (T_SMSREAD_R_OPT)); option_mnu_win =0;/*SPR2132, make sure window pointer is reset*/ } else { TRACE_EVENT ("SmsRead_R_OPT_destroy() called twice"); } } } /******************************************************************************* $Function: SmsRead_R_OPT_exec_cb $Description: Exec callback function for the Option window $Returns: none $Arguments: win- current window event - window event Id value - unique Id parameter- optional data. *******************************************************************************/ void SmsRead_R_OPT_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter) /* callback handler for events sent to to trigger execution */ { T_MFW_WIN * win_data = ((T_MFW_HDR *) win)->data; T_SMSREAD_R_OPT * data = (T_SMSREAD_R_OPT *)win_data->user; T_MFW_HND * l_parent = NULL; // RAVI SHORT l_id = 0; // RAVI T_MFW_EVENT MfwEvents; TRACE_FUNCTION ("SmsRead_R_OPT_exec_cb()"); switch (event) { case E_INIT: TRACE_EVENT(">> SmsRead_R_OPT_exec_cb(), E_INIT "); /* initialization of administrative data */ data->id = value; if(value == SmsRead_R_READSMS_OPT_ID) { data->kbd = kbdCreate(data->win,KEY_ALL, (MfwCb)SmsRead_R_OPT_kbd_cb); data->kbd_long = kbdCreate(data->win,KEY_ALL|KEY_LONG,(MfwCb)SmsRead_R_OPT_kbd_cb); //Sep 08, 2004 REF: CRR 24393 Deepa M. D //If the message is a saved/unsent message, then provide a different menu with the Reply option removed. if(read_status EQ MMI_SMS_MO) { data->menu = mnuCreate(data->win,(MfwMnuAttr *)&SmsRead_R_Unsent_OPTAttrib, E_MNU_ESCAPE, (MfwCb)SmsRead_R_OPT_mnu_cb); } else { data->menu = mnuCreate(data->win,(MfwMnuAttr *)&SmsRead_R_OPTAttrib, E_MNU_ESCAPE, (MfwCb)SmsRead_R_OPT_mnu_cb); } mnuLang(data->menu,mainMmiLng); /* put the (new) dialog window on top of the window stack */ mnuUnhide(data->menu); winShow(win); break; } else { // Catch the events concerning delete MfwEvents = E_SMS_ERR | E_SMS_OK; data->sms = sms_create(data->win,MfwEvents,(MfwCb)SmsRead_R_OPT_mfw_cb); data->sms_editor_data = (T_SMS_EDITOR_DATA *)parameter; } case E_RETURN: /* create the dialog handler */ data->kbd = kbdCreate(data->win,KEY_ALL, (MfwCb)SmsRead_R_OPT_kbd_cb); data->kbd_long = kbdCreate(data->win,KEY_ALL|KEY_LONG,(MfwCb)SmsRead_R_OPT_kbd_cb); //Sep 08, 2004 REF: CRR 24393 Deepa M. D //If the message is a saved/unsent message, then provide a different menu with the Reply option removed. if(read_status EQ MMI_SMS_MO) { data->menu = mnuCreate(data->win,(MfwMnuAttr *)&SmsRead_R_Unsent_OPTAttrib, E_MNU_ESCAPE, (MfwCb)SmsRead_R_OPT_mnu_cb); } else { data->menu = mnuCreate(data->win,(MfwMnuAttr *)&SmsRead_R_OPTAttrib, E_MNU_ESCAPE, (MfwCb)SmsRead_R_OPT_mnu_cb); } mnuLang(data->menu,mainMmiLng); /* put the (new) dialog window on top of the window stack */ mnuUnhide(data->menu); winShow(win); break; case E_BACK: l_parent = data->parent; l_id = data->id; SmsRead_R_OPT_destroy(data->win); SEND_EVENT (l_parent, E_RETURN, l_id, NULL); /* forward event to parent */ case E_ABORT: case E_EXIT: SmsRead_R_OPT_destroy(data->win); SEND_EVENT (l_parent, event, l_id, NULL); /* forward event to parent */ break; default: return; } } /******************************************************************************* $Function: SmsRead_R_OPT_mfw_cb $Description: Exec callback function for the DEL_ALL_ACK window $Returns: status $Arguments: event - window event Id parameter- optional data. *******************************************************************************/ int SmsRead_R_OPT_mfw_cb (MfwEvt event, void *parameter) { T_MFW_HND win = mfwParent((MfwHdr *)mfw_header()); T_MFW_WIN * win_data = (T_MFW_WIN *)((T_MFW_HDR *)win)->data; T_SMSREAD_R_OPT * data = (T_SMSREAD_R_OPT *)win_data->user; // T_MFW_EVENT MfwEvents; // RAVI TRACE_FUNCTION ("SmsRead_R_OPT_mfw_cb()"); switch (event) { case E_SMS_ERR: winDelete(data->dialog_win); /* Display "All SMS deleted" and after timeout go back to parent */ SmsRead_R_OPT_StandardDialog(win, "SMS not deleted", THREE_SECS); // TBD remplacer par ID break; case E_SMS_OK: /* go now back to the parent */ /* destroy the dialog at first */ winDelete(data->dialog_win); /* Display "All SMS deleted" and after timeout go back to parent */ SmsRead_R_OPT_StandardDialog(win, "SMS deleted", THREE_SECS); // TBD remplacer par ID break; } return 1; // ADDED BY RAVI - 28-11-2005 } /******************************************************************************* $Function: SmsRead_R_OPT_mnu_cb $Description: Menu callback function for the Option window $Returns: status $Arguments: e - mfw event Id m - menu handle *******************************************************************************/ static int SmsRead_R_OPT_mnu_cb (MfwEvt e, MfwMnu *m) /* SmsRead_R_OPT menu event handler */ { T_MFW_HND win = mfwParent(mfw_header()); T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data; T_SMSREAD_R_OPT * data = (T_SMSREAD_R_OPT *)win_data->user; T_MFW_HND * l_parent; SHORT l_id; TRACE_FUNCTION ("SmsRead_R_OPT_mnu_cb()"); switch (e) { case E_MNU_ESCAPE: /* back to previous menu */ l_parent = data->parent; l_id = data->id; SmsRead_R_OPT_destroy(data->win); SEND_EVENT (l_parent, E_RETURN, data->id, NULL); break; default: /* in mnuCreate() only E_MNU_ESCAPE has been enabled! */ return MFW_EVENT_REJECTED; } return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: SmsRead_R_OPT_win_cb $Description: Window callback function for the Option window $Returns: status $Arguments: e - mfw event Id w - window handler *******************************************************************************/ static int SmsRead_R_OPT_win_cb (MfwEvt e, MfwWin *w) /* SmsRead_R_OPT window event handler */ { TRACE_FUNCTION ("SmsRead_R_OPT_win_cb()"); switch (e) { case MfwWinVisible: /* window is visible */ displaySoftKeys(TxtSoftSelect,TxtSoftBack); break; case MfwWinFocussed: /* input focus / selected */ case MfwWinDelete: /* window will be deleted */ default: return MFW_EVENT_REJECTED; } return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: SmsRead_R_OPT_kbd_cb $Description: Exec callback function for the Option window $Returns: status $Arguments: e - keyboard event Id k - keyboard data *******************************************************************************/ static int SmsRead_R_OPT_kbd_cb (MfwEvt e, MfwKbd *k) /* SmsRead_R_OPT keyboard event handler */ { T_MFW_HND win = mfwParent(mfw_header()); T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data; T_SMSREAD_R_OPT * data = (T_SMSREAD_R_OPT *)win_data->user; TRACE_FUNCTION ("SmsRead_R_OPT_kbd_cb()"); if (e & KEY_LONG) { switch (k->code) { case KCD_HUP: /* back to previous menu */ mnuEscape(data->menu); break; case KCD_RIGHT: /* Power Down */ return MFW_EVENT_REJECTED; /* handled by idle */ default: /* no response to all other keys */ return MFW_EVENT_CONSUMED; } } else { switch (k->code) { case KCD_MNUUP: /* highlight previous entry */ mnuUp(data->menu); break; case KCD_MNUDOWN: /* highlight next entry */ mnuDown(data->menu); break; case KCD_MNUSELECT: case KCD_LEFT: /* activate this entry */ mnuSelect(data->menu); break; case KCD_HUP: /* back to previous menu */ case KCD_RIGHT: /* back to previous menu */ mnuEscape(data->menu); break; default: /* no response to all other keys */ return MFW_EVENT_CONSUMED; } } return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: SmsRead_R_OPT_dialog_cb $Description: Dialog callback function of the SMS read window (dynamic list of all the SMS). Case where SMS has not been initialized yet. $Returns: status $Arguments: win - window handler. Identifier - unique identifier. Reason - cause of event. *******************************************************************************/ int SmsRead_R_OPT_dialog_cb(T_MFW_HND win, USHORT Identifier, USHORT Reason) { T_MFW_WIN *win_data = ((T_MFW_HDR *)win)->data; T_SMSREAD_R_OPT *data = (T_SMSREAD_R_OPT *)win_data->user; T_MFW_HND *lparent = data->parent; TRACE_FUNCTION ("SmsRead_dialog_cb()"); switch (Reason) { case INFO_TIMEOUT: case INFO_KCD_HUP: // Commit suicide SmsRead_R_OPT_destroy(win); // Send E_RETURN event to parent window SEND_EVENT(lparent, E_RETURN, data->id, NULL); return MFW_EVENT_CONSUMED; default: return MFW_EVENT_REJECTED; } } /******************************************************************************* $Function: SmsRead_DisplayStandardDialog $Description: Display a standard dialog with no soft key and 3 seconds of display $Returns: none $Arguments: win - window handler. text - text string. duration - seconds *******************************************************************************/ void SmsRead_DisplayStandardDialog(T_MFW_HND win, int TextId, ULONG duration) { T_DISPLAY_DATA DisplayInfo; SmsMenu_loadDialogDefault(&DisplayInfo); DisplayInfo.TextId = TextId; DisplayInfo.Time = duration; DisplayInfo.Callback = (T_VOID_FUNC)SmsRead_R_dialog_cb; // Dec 15,2004 REF: CRR 24396 xkundadu // Description: Phone crashes when a message is received while the // 'List Empty' dialog is displayed. // set the variable to TRUE since 'List empty' dialog is going to display. SmsListEmptyDlgPresent = TRUE; info_dialog(win, &DisplayInfo); } /******************************************************************************* $Function: SmsRead_R_OPT_StandardDialog $Description: Display a standard dialog with no soft key and 3 seconds of display $Returns: none $Arguments: win - window handler. text - text string. duration - seconds *******************************************************************************/ void SmsRead_R_OPT_StandardDialog(T_MFW_HND win, char *text, ULONG duration) { T_MFW_WIN *win_data = ((T_MFW_HDR *)win)->data; T_SMSREAD_R_OPT *data = (T_SMSREAD_R_OPT *)win_data->user; T_DISPLAY_DATA DisplayInfo; SmsMenu_loadDialogDefault(&DisplayInfo); DisplayInfo.TextId = 0; DisplayInfo.Time = duration; DisplayInfo.TextString = text; DisplayInfo.Callback = (T_VOID_FUNC)SmsRead_R_OPT_dialog_cb; //TBD data->dialog_win = info_dialog(win, &DisplayInfo); } /*SPR2175, removed unused function*/ /******************************************************************************* $Function: string_CopyW2W $Description: $Returns: none $Arguments: strDestination - destination string strSource - source string count -number of character. *******************************************************************************/ void string_CopyW2W(wstring_t *strDestination, charw_t *strSource, USHORT count ) // Copy characters of an ascii string to a wide counted string { charw_t *pout = strDestination; while(count!=0) { *pout++ = *strSource++; count--; } } /******************************************************************************* $Function: SmsRead_R_TEXTEDT2_start $Description: Start the creation of the SMS editor window (display of the text of one SMS) $Returns: win - window handler. $Arguments: parent_window - current window handler data - Menu attributes. *******************************************************************************/ T_MFW_HND SmsRead_R_TEXTEDT2_start(T_MFW_HND parent_window, MfwMnuAttr *data) { /*SPR 2132, use global var*/ TRACE_FUNCTION ("SmsRead_R_TEXTEDT2_start()"); message_win = SmsRead_R_TEXTEDT2_create (parent_window); if (message_win NEQ NULL) { SEND_EVENT (message_win, E_INIT, SmsRead_R_TEXTEDT2_ID, (void *)data); } return message_win; } /******************************************************************************* $Function: SmsRead_R_TEXTEDT2_create $Description: Create the SMS editor window (display of the text of one SMS) $Returns: window handler. $Arguments: parent_window - current window handler *******************************************************************************/ static T_MFW_HND SmsRead_R_TEXTEDT2_create(MfwHnd parent_window) { T_SMSREAD_R_TEXTEDT2 * data = (T_SMSREAD_R_TEXTEDT2 *)ALLOC_MEMORY (sizeof (T_SMSREAD_R_TEXTEDT2)); T_MFW_WIN * win; TRACE_FUNCTION ("SmsRead_R_TEXTEDT2_create()"); /* * Create window handler */ data->win = win_create (parent_window, 0, E_WIN_VISIBLE, (T_MFW_CB)SmsRead_R_TEXTEDT2_win_cb); if (data->win EQ NULL) { return NULL; } /* * connect the dialog data to the MFW-window */ data->mmi_control.dialog = (T_DIALOG_FUNC)SmsRead_R_TEXTEDT2_exec_cb; data->mmi_control.data = data; win = ((T_MFW_HDR *)data->win)->data; win->user = (void *)data; data->parent = parent_window; /* * return window handle */ winShow(data->win); return data->win; } /******************************************************************************* $Function: SmsRead_R_TEXTEDT2_destroy $Description: Destroy the SMS editor window (display of the text of one SMS) $Returns: none $Arguments: own_window - current window handler *******************************************************************************/ static void SmsRead_R_TEXTEDT2_destroy(MfwHnd own_window) { T_MFW_WIN * win_data; T_SMSREAD_R_TEXTEDT2 * data; // USHORT i; // RAVI TRACE_FUNCTION ("SmsRead_R_TEXTEDT2_destroy()"); if (own_window) { win_data = ((T_MFW_HDR *)own_window)->data; data = (T_SMSREAD_R_TEXTEDT2 *)win_data->user; if (data) { /* * Delete WIN handler */ /* SPR#1428 - SH - New Editor changes */ #ifdef NEW_EDITOR AUI_edit_Destroy(data->editor_win); #else /* NEW_EDITOR */ editor_destroy(data->editor_win); #endif /* NEW_EDITOR */ win_delete (data->win); FREE_MEMORY ((void *)data->sms_editor_data->sms_info, sizeof (T_MFW_SMS_PARA)); FREE_MEMORY ((void *)data, sizeof (T_SMSREAD_R_TEXTEDT2)); message_win = 0; /*SPR2132, make sure window pointer is reset*/ } else { TRACE_EVENT ("SmsRead_R_TEXTEDT2_destroy() called twice"); } } } /******************************************************************************* $Function: SmsRead_R_TEXT_editor_cb $Description: Callback function for the text editor $Returns: none $Arguments: win - current window handler Identifier -Unique identifier. reason - event *******************************************************************************/ static void SmsRead_R_TEXT_editor_cb (T_MFW_HND win, USHORT Identifier, SHORT reason) { T_MFW_PHB_ENTRY pb_data; T_MFW_WIN * win_data = ((T_MFW_HDR *) win)->data; T_SMSREAD_R_TEXTEDT2 * data = (T_SMSREAD_R_TEXTEDT2 *)win_data->user; T_MFW_HDR * parent = data->parent; T_MFW_WIN * win_data2 = ((T_MFW_HDR *)parent)->data; // T_SMSREAD_R_TEXTEDT2 * parent_data = (T_SMSREAD_R_TEXTEDT2 *)win_data2->user; // RAVI // T_MFW_SMS_STAT sms_list_type = MFW_SMS_ALL; // RAVI TRACE_FUNCTION ("SmsRead_R_TEXT_editor_cb()"); switch (reason) { case INFO_KCD_LEFT: //x0pleela 08 Feb, 2006 DR: OMAPS00059261 //Replacing MT_STATUS_RPT with MFW_SMS_STATRPT as MT_STATUS_RPT is removed //x0pleela 30 Jan, 2006 DR: OMAPS00059261 //Displaying different options screen for normal MT text message. //whereas, for staus report message, the message is deleted, since the option is "Delete" in LSK if( data->sms_editor_data->sms_info->sms_mt.sms_msg_type EQ MFW_SMS_STATRPT) { if(sms_msg_delete((UBYTE)data->sms_editor_data->sms_info->sms_mt.index/*SPR 2686*/)== MFW_SMS_OK) { /* set the status that the user selected the delete item */ if(deleting_win == 0) deleting_win= mmi_dialog_information_screen_forever(0,TxtPleaseWait, NULL, COLOUR_STATUS_WAIT); SmsRead_R_TEXTEDT2_destroy(data->win); /*SPR 2530, Delete and recreate SMS list window to show updates*/ { T_MFW_SMS_STAT sms_list_type = MFW_SMS_ALL; listsDestroy(list_win); list_win=0; SmsRead_R_destroy(sms_read_win); SmsRead_R_start(NULL, (MfwMnuAttr*)&sms_list_type); } } else { /*SPR2530, don't delete option and display windows, just show failure*/ mmi_dialog_information_screen(0,TxtFailed, NULL, NULL, COLOUR_STATUS_WAIT); } } //x0pleela 01 Feb, 2006 DR: OMAPS00059261 //Made changes as per review comments else //MT_TEXT { // Present the user with an Options menu from the Read SMS text screen.:16/2/01 SmsRead_R_READSMS_OPT_start(win, (MfwMnuAttr*)&data->sms_editor_data); } break; case INFO_KCD_RIGHT: case INFO_KCD_HUP: SmsRead_R_TEXTEDT2_destroy(data->win); /*SPR 2530, Delete and recreate SMS list window to show updates*/ { T_MFW_SMS_STAT sms_list_type = MFW_SMS_ALL; listsDestroy(list_win); list_win=0; SmsRead_R_destroy(sms_read_win); SmsRead_R_start(NULL, (MfwMnuAttr*)&sms_list_type); } break; case INFO_KCD_DOWN: break; case INFO_KCD_CALL: /* Marcus: Issue 1041: 05/09/2002: Start */ strcpy((char *)pb_data.number, (char *)SmsData.NumberBuffer); /* Marcus: Issue 1041: 05/09/2002: End */ TRACE_EVENT_P1("Number is = %d",(int)pb_data.number); callNumber(pb_data.number); break; default: TRACE_EVENT("Err: Default No match found"); break; } } /******************************************************************************* $Function: SmsRead_R_TEXTEDT2_exec_cb $Description: Exec callback function of the SMS editor window (display of the text of one SMS) $Returns: none $Arguments: win - current window handler event - event id value - unique id parameter - optional data. *******************************************************************************/ void SmsRead_R_TEXTEDT2_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter) /* callback handler for events sent to to trigger execution */ { T_MFW_WIN * win_data = ((T_MFW_HDR *) win)->data; T_SMSREAD_R_TEXTEDT2 * data = (T_SMSREAD_R_TEXTEDT2 *)win_data->user; T_MFW_HND * l_parent; SHORT l_id; T_MFW_SMS_MO *SmsMo; T_MFW_SMS_MT *SmsMt; T_MFW_SMS_CB *SmsCb; /* SPR#1428 - SH - New Editor changes */ #ifdef NEW_EDITOR T_AUI_EDITOR_DATA sms_editor_info; USHORT size; /*SPR 2530*/ T_ATB_TEXT main_text; T_ATB_TEXT temp_text; // T_ATB_DCS atb_dcs; // RAVI #else /* NEW_EDITOR */ T_EDITOR_DATA sms_editor_info; #endif /* NEW_EDITOR */ // USHORT i, line_ret, line_nb; // RAVI USHORT msg_len; // div_t result; // RAVI /* JVJ SPR 1298 - Memory optimization. Converted to dynamic and size decreased*/ char* sms_text_buffer = (char*)ALLOC_MEMORY(MAX_EDITOR_HEADER_LENGTH); T_MFW_PHB_ENTRY pb_entry; USHORT index=0; T_MFW_SMS_IDX msg_info;/*SPR 2530*/ TRACE_FUNCTION ("SmsRead_R_TEXTEDT2_exec_cb()"); switch (event) { case E_INIT: { UBYTE input_type;/*MC SPR1242*/ /* initialization of administrative data */ data->id = value; data->sms_editor_data = (T_SMS_EDITOR_DATA *)parameter; switch (data->sms_editor_data->sms_type) { case MMI_SMS_MO: /* where does we need that: For editor when the user wants to editing the sms-message */ read_status = MMI_SMS_MO; SmsMo = (T_MFW_SMS_MO *)data->sms_editor_data->sms_info; sms_copy_idx(SmsMo->msg_ref, &msg_info);/*SPR 1830*/ // API Clear the buffers before showing the MO message. memset (sms_text_ascii, '\0', MAX_EDITOR_LEN); memset (sms_text_buffer, '\0', MAX_EDITOR_HEADER_LENGTH); /*SPR 2530, if new ediotr use nice string-handling functions*/ #ifdef NEW_EDITOR main_text.data = (UBYTE*)sms_text_ascii; /*if we are in chinese, then we need to display in Unicode, otherwise ASCII*/ if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE) main_text.dcs = ATB_DCS_UNICODE; else main_text.dcs = ATB_DCS_ASCII; ATB_string_Length(&main_text); /*if this isn't an invalid message*/ if (msg_info.stat != MFW_SMS_INVALID) { /*set text string dcs, according to alphabet used for message*/ if ( (SmsMo->dcs & 0x0c) == MFW_DCS_UCS2 || SmsMo->sms_msg[0] == 0x80) { temp_text.dcs = ATB_DCS_UNICODE; /* CQ 16780 15-01-04 MZ */ /*copy message text to string*/ temp_text.data = (UBYTE*)SmsMo->sms_msg; } else { temp_text.dcs = ATB_DCS_ASCII; /* CQ: 16780 Convert to Ascii format 15-01-04 MZ */ ATB_convert_String( SmsMo->sms_msg, MFW_DCS_8bits , SmsMo->msg_len, sms_text_ascii, MFW_ASCII, MAX_MSG_LEN, TRUE); /*copy message text to string*/ temp_text.data = (UBYTE*)sms_text_ascii; } ATB_string_Length(&temp_text); /*concat message text into display string*/ ATB_string_Concat(&main_text, &temp_text); /*if this is an incomplete concat message, add "Incomplete Message" to end of display text*/ if (msg_info.concat_status == MFW_SMS_CONC_PART) { ATB_string_SetChar(&main_text, ATB_string_Length(&main_text),(USHORT)":"); if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE) temp_text.dcs = ATB_DCS_UNICODE; else temp_text.dcs = ATB_DCS_ASCII; temp_text.data = (UBYTE*)MmiRsrcGetText(TxtIncompleteMessage); ATB_string_Length(&temp_text); ATB_string_Concat(&main_text, &temp_text); } } else {/*set display text to "Invalid Message"*/ if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE) temp_text.dcs = ATB_DCS_UNICODE; else temp_text.dcs = ATB_DCS_ASCII; temp_text.data = (UBYTE*)MmiRsrcGetText(TxtInvalidMessage); ATB_string_Length(&temp_text); ATB_string_Concat(&main_text, &temp_text); } #else /* SH - convert from original dcs once more */ /*MC,SPR1242 don't trust the DCS, check for Unicode tag*/ if (SmsMo->sms_msg[0] == 0x80||SmsMo->dcs == MFW_DCS_UCS2) { input_type = MFW_DCS_UCS2;} else { input_type = MFW_DCS_8bits;} /*mc end*/ if (input_type == MFW_DCS_UCS2/*MC SPR1242*/) {/*SPR2175, use new function for conversion*/ ATB_convert_String( SmsMo->sms_msg, /*SmsMo->dcs*/input_type/*MC SPR1242*/, SmsMo->msg_len, &sms_text_ascii[2], MFW_DCS_UCS2, MAX_MSG_LEN-2, TRUE); sms_text_ascii[0] = 0x80; sms_text_ascii[1] = 0x7F; } else {/*SPR2175, use new function for conversion*/ ATB_convert_String( SmsMo->sms_msg, /*SmsMo->dcs*/input_type/*MC SPR1242*/ , SmsMo->msg_len, sms_text_ascii, MFW_ASCII, MAX_MSG_LEN, TRUE); } #endif break; case MMI_SMS_MT: /* where does we need that: For editor when the user wants to editing the sms-message */ read_status = MMI_SMS_MT; SmsMt = (T_MFW_SMS_MT *)data->sms_editor_data->sms_info; sms_copy_idx(SmsMt->index, &msg_info);/*SPR 2530*/ memset (sms_text_ascii, '\0', MAX_EDITOR_LEN); memset (sms_text_buffer, '\0',MAX_EDITOR_HEADER_LENGTH); /*SPR 2530, if new editor use nice string-handling functions*/ #ifdef NEW_EDITOR main_text.data = (UBYTE*)sms_text_ascii; /*set up text data stucture for main display string*/ if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE) main_text.dcs = ATB_DCS_UNICODE; else main_text.dcs = ATB_DCS_ASCII; ATB_string_Length(&main_text); #endif if (msg_info.stat != MFW_SMS_INVALID)/*SPR 1830*/ { /* Marcus: Issue 1041: 05/09/2002: Start */ // API - Copy number into buffer so when Call key is pressed in editor call is generated strcpy((char *)SmsData.NumberBuffer,(char *)SmsMt->orig_addr.number); /* Marcus: Issue 1041: 05/09/2002: End */ /* Marcus: Issue 1489: 13/12/2002: Start */ /*API - 1053 - 09-09-02 Copy the number into this buffer so that when a call is generated from the editor it is connected. */ if(SmsMt->orig_addr.ton == MFW_TON_INTERNATIONAL) { if(SmsMt->orig_addr.number[0] == '+') { strcpy((char *)SmsData.NumberBuffer,(char *)SmsMt->orig_addr.number); } else { strcpy((char *)SmsData.NumberBuffer, "+"); strncat((char *)SmsData.NumberBuffer,(char *)SmsMt->orig_addr.number,sizeof(SmsData.NumberBuffer)-2); } } #ifndef NEW_EDITOR /* add the number or the name if he can find it in the phonebook*/ if (bookFindNameInPhonebook((const char*)SmsMt->orig_addr.number, &pb_entry) !=0) { #ifdef NO_ASCIIZ /*mc SPR 1257, unicode support*/ memcpy(sms_text_ascii, (char*)pb_entry.name.data,pb_entry.name.len ); #else strcpy(sms_text_ascii, (char*)pb_entry.name); #endif } else { strcpy(sms_text_ascii, (char *)SmsData.NumberBuffer); /* Marcus: Issue 1489: 13/12/2002: End */ } #else /*SPR 2530, if new editor use nice string-handling functions*/ /*see if the sender is in the phonebook*/ if (bookFindNameInPhonebook((const char*)SmsMt->orig_addr.number, &pb_entry) !=0) { char temp_string[PHB_MAX_LEN]; memset(temp_string, '\0', PHB_MAX_LEN); /*copy name into a text data structure*/ /* CQ: 16780 Check the phonebook string format by testing the dcs. NOT the dcs values are Enum types and not the true dcs values of the ADN store. 15-01-04 MZ */ if (pb_entry.name.dcs == MFW_DCS_UCS2 ||pb_entry.name.data[0] == 0x80 ) temp_text.dcs = ATB_DCS_UNICODE; else temp_text.dcs = ATB_DCS_ASCII; if (temp_text.dcs != ATB_DCS_UNICODE) { temp_text.data = (UBYTE*)pb_entry.name.data; } else { /* CQ:16780 Check for unicode string type 15-01-04 MZ*/ if(pb_entry.name.data[0] == 0x80) { pb_entry.name.len-=2; memcpy(temp_string, &pb_entry.name.data[2], pb_entry.name.len); } else { memcpy(temp_string, &pb_entry.name.data[0], pb_entry.name.len); } temp_text.data = (UBYTE*)temp_string; } ATB_string_Length(&temp_text); /*add name text into main display string*/ ATB_string_Concat(&main_text, &temp_text); } ATB_string_Length(&main_text); #endif #ifndef NEW_EDITOR /* SH - convert from original dcs once more */ /*MC,SPR1242 don't trust the DCS, check for Unicode tag*/ if (SmsMt->sms_msg[0] == 0x80||SmsMt->dcs == MFW_DCS_UCS2) { input_type = MFW_DCS_UCS2;} else { input_type = MFW_DCS_8bits;} /*mc end*/ if (/*SmsMt->dcs*/input_type == MFW_DCS_UCS2) { /*SPR2175, use new function for conversion*/ ATB_convert_String( SmsMt->sms_msg, input_type /*MC SPR1242*/, SmsMt->msg_len, &sms_text_ascii[2], MFW_DCS_UCS2, MAX_MSG_LEN-2, TRUE); sms_text_ascii[0] = 0x80; sms_text_ascii[1] = 0x7F; } else { #endif if(strlen(sms_text_ascii) != 14 ) // number of character that can be displayed on one line. sms_text_buffer[index++]='\n'; sms_text_buffer[index++]='0'+SmsMt->sctp.day[0]; sms_text_buffer[index++]='0'+SmsMt->sctp.day[1]; sms_text_buffer[index++]='/'; sms_text_buffer[index++]='0'+SmsMt->sctp.month[0]; sms_text_buffer[index++]='0'+SmsMt->sctp.month[1]; sms_text_buffer[index++]='/'; sms_text_buffer[index++]='0'+SmsMt->sctp.year[0]; sms_text_buffer[index++]='0'+SmsMt->sctp.year[1]; sms_text_buffer[index++]=','; sms_text_buffer[index++]='\n'; sms_text_buffer[index++] ='0'+SmsMt->sctp.hour[0]; sms_text_buffer[index++]='0'+SmsMt->sctp.hour[1]; sms_text_buffer[index++]=':'; sms_text_buffer[index++]='0'+SmsMt->sctp.minute[0]; sms_text_buffer[index++]='0'+SmsMt->sctp.minute[1]; sms_text_buffer[index++]='\n'; #ifndef NEW_EDITOR strcat(sms_text_ascii, sms_text_buffer); msg_len = strlen(sms_text_ascii); /* keep the length of the additional information (Date,Time & Number); need it later for editing the sms messages (user pressed-> EDIT) */ current_sms_len = msg_len; /* SH - convert from original dcs once more */ /*SPR2175, use new function for conversion*/ ATB_convert_String( SmsMt->sms_msg, /*SmsMt->dcs*/input_type /*MC SPR1242*/, SmsMt->msg_len, &sms_text_ascii[msg_len], MFW_ASCII /*SH*/, MAX_EDITOR_LEN-(msg_len+1), TRUE); } #else /*SPR 2530, if new editor use nice string-handling functions*/ /*Add date and time to main display string*/ temp_text.dcs = ATB_DCS_ASCII; temp_text.data = (UBYTE*)sms_text_buffer; ATB_string_Length(&temp_text); ATB_string_Concat(&main_text, &temp_text); if ((SmsMt->dcs&0x0c) == MFW_DCS_UCS2) { temp_text.dcs = ATB_DCS_UNICODE; temp_text.data = (UBYTE*)SmsMt->sms_msg; } else { temp_text.dcs = ATB_DCS_ASCII; /* CQ 16780 Convert incoming SMS text to ASCIII 15-01-04 MZ */ ATB_convert_String( SmsMt->sms_msg, MFW_DCS_8bits , SmsMt->msg_len, (char*)temp_text.data, MFW_ASCII, MAX_MSG_LEN, TRUE); } ATB_string_Length(&temp_text); ATB_string_Concat(&main_text, &temp_text); /*if the message is a fragment of a concat message*/ if (msg_info.concat_status == MFW_SMS_CONC_PART) { ATB_string_SetChar(&main_text, ATB_string_Length(&main_text),(USHORT)":"); if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE) temp_text.dcs = ATB_DCS_UNICODE; else temp_text.dcs = ATB_DCS_ASCII; /*append "Incomplete Message" onto display string*/ temp_text.data = (UBYTE*)MmiRsrcGetText(TxtIncompleteMessage); ATB_string_Length(&temp_text); ATB_string_Concat(&main_text, &temp_text); } #endif } else #ifdef NEW_EDITOR /*SPR 2530, if new editor use nice string-handling functions*/ { /*if invalid message just copy "Invalid message" into main display string*/ if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE) temp_text.dcs = ATB_DCS_UNICODE; else temp_text.dcs = ATB_DCS_ASCII; temp_text.data = (UBYTE*)MmiRsrcGetText(TxtInvalidMessage); ATB_string_Length(&temp_text); ATB_string_Concat(&main_text, &temp_text); } #endif sms_change_read_status(SmsMt->index); break; case MMI_SMS_CB: SmsCb = (T_MFW_SMS_CB *)data->sms_editor_data->sms_info; break; } /* Actually we have 2 different size of messages: 1) SMS_MT with MAX_EDITOR_LEN because of the DATE,TIME,NUMBER 2) SMS_MO with MAX_MSG_LEN, just the message itself */ /* SPR#1428 - SH - New Editor changes */ #ifdef NEW_EDITOR AUI_edit_SetDefault(&sms_editor_info); /* Include title for colour display */ #ifdef COLOURDISPLAY AUI_edit_SetDisplay(&sms_editor_info, ZONE_FULL_SK_TITLE_SCROLL, COLOUR_EDITOR, EDITOR_FONT); #else /* COLOURDISPLAY */ AUI_edit_SetDisplay(&sms_editor_info, ZONE_FULL_SK_SCROLL, COLOUR_EDITOR, EDITOR_FONT); #endif /* COLOURDISPLAY */ AUI_edit_SetMode(&sms_editor_info, ED_MODE_ALPHA | ED_MODE_READONLY, ED_CURSOR_NONE); AUI_edit_SetEvents(&sms_editor_info, 0, FALSE, FOREVER, (T_AUI_EDIT_CB)SmsRead_R_TEXT_editor_cb); //x0pleela 08 Feb, 2006 DR: OMAPS00059261 //Replacing MT_STATUS_RPT with MFW_SMS_STATRPT as MT_STATUS_RPT is removed //x0pleela 01 Feb, 2006 DR: OMAPS00059261 //Made changes as per review comments //x0pleela 30 Jan, 2006 DR: OMAPS00059261 //Displaying the LSK as "Delete" for MT Staus report and "Options" for normal MT Text message if (SmsMt->sms_msg_type EQ MFW_SMS_STATRPT) AUI_edit_SetTextStr(&sms_editor_info, TxtDelete, TxtSoftBack, TxtMessage, NULL); else AUI_edit_SetTextStr(&sms_editor_info, TxtSoftOptions, TxtSoftBack, TxtMessage, NULL); /* Check if concatenated sms is activated */ if (read_status EQ MMI_SMS_MO) size = MAX_MSG_LEN; else size = MAX_EDITOR_LEN; /*SPR 2530, copy display screen to editor, alphabet depends on current lanaguage*/ if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE) { /* Unicode SMS message */ AUI_edit_SetBuffer(&sms_editor_info, ATB_DCS_UNICODE, (UBYTE *)&sms_text_ascii[0],size/2); } else { /* ASCII SMS message */ AUI_edit_SetBuffer(&sms_editor_info, ATB_DCS_ASCII, (UBYTE *)&sms_text_ascii[0],size); } data->editor_win = AUI_edit_Start(win,&sms_editor_info); /* start the editor */ #else /* NEW_EDITOR */ SmsSend_loadEditDefault(&sms_editor_info); sms_editor_info.editor_attr.text = (char *)sms_text_ascii; if (read_status EQ MMI_SMS_MO) sms_editor_info.editor_attr.size = MAX_MSG_LEN; else sms_editor_info.editor_attr.size = MAX_EDITOR_LEN; sms_editor_info.min_enter = 0; //x0pleela 08 Feb, 2006 DR: OMAPS00059261 //Replacing MT_STATUS_RPT with MFW_SMS_STATRPT as MT_STATUS_RPT is removed //x0pleela 30 Jan, 2006 DR: OMAPS00059261 //Displaying the LSK as "Delete" for MT Staus report and "Options" for normal MT Text message if (SmsMt->sms_msg_type EQ MFW_SMS_STATRPT ) { sms_editor_info.LeftSoftKey = TxtDelete; sms_editor_info.AlternateLeftSoftKey = TxtDelete; } //x0pleela 01 Feb, 2006 DR: OMAPS00059261 //Made changes as per review comments else //if( SmsMt->sms_msg_type EQ MT_TEXT ) { sms_editor_info.LeftSoftKey = TxtSoftOptions; sms_editor_info.AlternateLeftSoftKey = TxtSoftOptions; } sms_editor_info.RightSoftKey = TxtSoftBack; sms_editor_info.Identifier = 0 ; sms_editor_info.destroyEditor = FALSE ; sms_editor_info.Callback = (T_EDIT_CB)SmsRead_R_TEXT_editor_cb; sms_editor_info.mode = READ_ONLY_MODE; data->editor_win = editor_start(win,&sms_editor_info); /* start the editor */ #endif /* NEW_EDITOR */ if (info_win){ SEND_EVENT(info_win,DIALOG_DESTROY,0,0 ); info_win = 0; } break; } case E_BACK: l_parent = data->parent; l_id = data->id; /* The editor has sent an E_BACK event, we return to the previous window (E_RETURN) */ SEND_EVENT (l_parent, E_RETURN, l_id, NULL); SmsRead_R_TEXTEDT2_destroy(data->win); break; case E_ABORT: case E_EXIT: l_parent = data->parent; l_id = data->id; SEND_EVENT (l_parent, event, l_id, NULL); /* forward event to parent */ SmsRead_R_TEXTEDT2_destroy(data->win); break; default: break; } FREE_MEMORY((void*)sms_text_buffer,MAX_EDITOR_HEADER_LENGTH); return; } /******************************************************************************* $Function: SmsRead_R_TEXTEDT2_win_cb $Description: Window callback function of the SMS editor window (display of the text of one SMS). $Returns: execution status $Arguments: w - mfw window handle e - event id value - unique id parameter - optional data. *******************************************************************************/ static int SmsRead_R_TEXTEDT2_win_cb (MfwEvt e, MfwWin *w) /* window event handler */ { TRACE_FUNCTION ("SmsRead_R_TEXTEDT2_win_cb()"); switch (e) { case MfwWinVisible: /* window is visible */ //JVJE displaySoftKeys(TxtSoftSelect,TxtSoftBack); break; case MfwWinFocussed: /* input focus / selected */ case MfwWinDelete: /* window will be deleted */ default: return MFW_EVENT_REJECTED; } return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: SmsRead_R_TEXTEDT2_smslist_cb $Description: Callback function of the SMS editor window (editor itself). $Returns: none $Arguments: Parent - parent window. ListData - Menu item list *******************************************************************************/ void SmsRead_R_TEXTEDT2_smslist_cb(T_MFW_HND * Parent, ListMenuData * ListData) { T_MFW_WIN * win_data = ((T_MFW_HDR *)Parent)->data; T_SMSREAD_R * data = (T_SMSREAD_R *)win_data->user; T_MFW_HND * l_parent; SHORT l_id; if ((ListData->Reason EQ LISTS_REASON_BACK) || (ListData->Reason EQ LISTS_REASON_CLEAR) || (ListData->Reason EQ LISTS_REASON_HANGUP)) { l_parent = data->parent; l_id = data->id; SmsRead_R_destroy(data->win); //The editor has sent an back event, we return to the previous window (E_RETURN) SEND_EVENT (l_parent, E_RETURN, l_id, NULL); } } /******************************************************************************* $Function: check_assoc_name $Description: This function search if a phone number corresponds to any name in phonebook or to the voice mailbox or to the SMS center BE CAREFUL it allocates memory for the name, that has to be freed by the caller It returns the length of the associated name if found, else length is 0 and name is NULL $Returns: string length $Arguments: name - string sms_addr - phonenumber string. *******************************************************************************/ UBYTE check_assoc_name(char *name, T_MFW_SMS_ADDR sms_addr) { // MZ T_MFW_SMS_STAT pb_entry; T_MFW_SMS_ADDR pb_entry; USHORT i; // TBD: add international numbers management // Voice, fax... mailboxes data // USHORT max_rcd; // RAVI char mail_number[PHB_MAX_LEN + 1]; char mail_alpha[10]; // size hard coded in pcm.h UBYTE nlen; name = NULL; // First: look in phonebook if (bookFindNameInPhonebook((const char*)&sms_addr.number[0], (T_MFW_PHB_ENTRY*)&pb_entry)) { // A name has been found if ((name = (char*)ALLOC_MEMORY(strlen(pb_entry.tag) + 1)) != NULL) { /*Mc , unicode support*/ #ifdef NO_ASCIIZ memcpy(name, pb_entry.tag, pb_entry.len); return pb_entry.len; #else strcpy(name, pb_entry.tag); return strlen(name); #endif } } // Then the different mailboxes (voice, fax, data...) for (i = MFW_MB_LINE1; i <= MFW_MB_DATA; i++) { { cmhPHB_getAdrStr(mail_number, PHB_MAX_LEN - 1, FFS_flashData.mbn_Num, FFS_flashData.mbn_len); if (strcmp(sms_addr.number, mail_number) EQ 0) { // If the same number then we get the alpha identifier cmhPHB_getMfwTagNt ( FFS_flashData.mbn_AlphId, 10, (UBYTE*)mail_alpha, &nlen ); mail_alpha[nlen] = '\0'; if ((name = (char*)ALLOC_MEMORY(strlen(mail_alpha) + 1)) != NULL) { /*MC, yet more unicode support*/ #ifdef NO_ASCIIZ memcpy(name, mail_alpha, nlen); return nlen; #else strcpy(name, mail_alpha); return strlen(name); #endif } } } } return 1; // RAVI } /******************************************************************************* $Function: SmsRead_R_TEXTEDT2_editor_cb $Description: Callback function for the text editor. $Returns: void $Arguments: win - current window. Identifier - unique id Reason - event id *******************************************************************************/ void SmsRead_R_TEXTEDT2_editor_cb(T_MFW_HND win, USHORT Identifier, USHORT Reason) { T_MFW_WIN * win_data = ((T_MFW_HDR *) win)->data; T_SMSREAD_R_TEXTEDT2 * data = (T_SMSREAD_R_TEXTEDT2 *)win_data->user; TRACE_FUNCTION("SmsRead_R_TEXTEDT2_editor_cb"); switch (Reason) { case INFO_KCD_LEFT: case INFO_KCD_RIGHT: case INFO_KCD_HUP: SEND_EVENT (data->parent, E_RETURN, Identifier, NULL); /* forward event to parent */ break; default: break; } } /******************************************************************************* $Function: SmsRead_FindNextNumber_cb $Description: Exec callback function for searching the SMS text message. $Returns: none $Arguments: win - window handler event - mfw event value -optional id parameter - optional data. *******************************************************************************/ void SmsRead_FindNextNumber_cb(T_MFW_HND win, USHORT Identifier, USHORT Reason) { T_MFW_PHB_ENTRY pb_data; switch (Reason) { case INFO_KCD_RIGHT: case INFO_KCD_CLEAR: break; case INFO_KCD_LEFT: // Check for numbers in SMS text, check for '+' . if(Search_forNextNumber(&SmsData)) { if (bookFindNameInPhonebook((const char*)&SmsData.NumberBuffer[0], &pb_data) ) { //Display the tag and number dialog. #ifdef NO_ASCIIZ /* SPR888 - SH - parent_data->parent changed to win */ smsRead_NumberName_info_screen(win,(void *)&SmsData, (char*)pb_data.name.data); #else /* SPR888 - SH - parent_data->parent changed to win */ smsRead_NumberName_info_screen(win,(void *)&SmsData, (char*)pb_data.name); #endif } else { /* SPR888 - SH - parent_data->parent changed to win */ smsRead_NumberName_info_screen(win,(void *)&SmsData,NULL); } } break; case INFO_KCD_OFFHOOK: callNumber(SmsData.NumberBuffer); break; default: TRACE_EVENT(" >>> INFO Default "); //return MFW_EVENT_REJECTED; break; } } /******************************************************************************* $Function: smsRead_NumberName_info_screen $Description: Display the number and name of numbers found in the received SMS text. $Returns: window handle $Arguments: win - current window. UserData - Sms data info *******************************************************************************/ static MfwHnd smsRead_NumberName_info_screen(MfwHnd win,T_SmsUserData *UserData, char* nameTag) { T_DISPLAY_DATA DisplayInfo; TRACE_FUNCTION("smsRead_NumberName_info_screen() "); dlg_initDisplayData_TextStr( &DisplayInfo, TxtSoftNext, TxtSoftBack, nameTag, (char*)UserData->NumberBuffer, COLOUR_STATUS); dlg_initDisplayData_events( &DisplayInfo, (T_VOID_FUNC)SmsRead_FindNextNumber_cb, FOREVER, KEY_ALL ); TRACE_EVENT(">>>>> Display Information Screen "); return info_dialog(win, &DisplayInfo); } /******************************************************************************* $Function: Search_forNextNumber $Description: Search through the SMS text and find a telephone number, the number may start with the '+' prefix. $Returns: Boolean $Arguments: UserData - SMS data info *******************************************************************************/ static BOOL Search_forNextNumber(T_SmsUserData *UserData) { /* SPR888 - SH - Rewritten, old function below */ /* Use search_index so we can start looking where we left off last time. Set to 0 in SMSRead_R_OPTExeStoreNumber */ int sms_length; int number_index; char number_buffer[NUMBER_LENGTH*2+4]; char *sms_buffer; char character; UBYTE found_status; TRACE_FUNCTION("Search_forNextNumber()"); sms_buffer = (char*)UserData->TextBuffer; #ifdef NO_ASCIIZ if (sms_buffer[0] == 0x80) { #ifdef NEW_EDITOR /* SPR#1428 - SH - New Editor changes - new function to calculate length of unicode string */ sms_length = ATB_string_UCLength((U16*)sms_buffer)*sizeof(USHORT); #else /* NEW_EDITOR */ sms_length = strlenUnicode((U16*)sms_buffer); #endif /* NEW_EDITOR */ } else { sms_length = strlen(sms_buffer); } #else /* NO_ASCIIZ */ sms_length = strlen(sms_buffer); #endif /* NO_ASCIIZ */ number_index = 0; found_status = 0; memset (number_buffer, '\0', NUMBER_LENGTH*2+4); while (search_index<sms_length && found_status<2 && number_index<NUMBER_LENGTH*2+4) { character = sms_buffer[search_index]; search_index++; #ifdef NO_ASCIIZ if (character=='+' || ( character>='0' && character<='9' ) || (character==0)) #else if (character=='+' || ( character>='0' && character<='9' ) ) #endif { if (character != 0) /*MC, only copy non-Null chars*/ number_buffer[number_index++] = character; if (found_status==0) { found_status = 1; /* Found start of number */ } } else { if (found_status==1) found_status = 2; /* Have reached end of number */ } TRACE_EVENT_P1("Extract number string:%s", number_buffer); } if(strlen(number_buffer) > 10) { memcpy((char*)UserData->NumberBuffer, number_buffer, sizeof(UserData->NumberBuffer)); return TRUE; } return FALSE; } /* api Store number for calling when reading SMS - 04/03/2002 */ /******************************************************************************* $Function: Search_forNextNumber $Description: Search through the SMS text and find a telephone number, the number may start with the '+' prefix. $Returns: Boolean $Arguments: UserData - SMS data info *******************************************************************************/ void SmsRead_StoreNumber(void) { T_MFW_HND win = mfwParent(mfw_header()); T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data; T_SMSREAD_R_OPT * data = (T_SMSREAD_R_OPT *)win_data->user; T_MFW_HDR * parent = data->parent; T_MFW_WIN * win_data2 = ((T_MFW_HDR *)parent)->data; T_SMSREAD_R_TEXTEDT2 * parent_data = (T_SMSREAD_R_TEXTEDT2 *)win_data2->user; T_MFW_PHB_ENTRY pb_data; TRACE_FUNCTION("SmsRead_StoreNumber"); TRACE_EVENT_P1("TON = %d",parent_data->sms_editor_data->sms_info->sms_mt.orig_addr.ton); /* Marcus: Issue 1489: 13/12/2002: Start */ if(parent_data->sms_editor_data->sms_info->sms_mt.orig_addr.ton == MFW_TON_INTERNATIONAL) { if(parent_data->sms_editor_data->sms_info->sms_mt.orig_addr.number[0] == '+') { strcpy((char *)SmsData.NumberBuffer,(char *)parent_data->sms_editor_data->sms_info->sms_mt.orig_addr.number); } else { strcpy((char *)SmsData.NumberBuffer,"+"); strncat((char *)SmsData.NumberBuffer,(char *)parent_data->sms_editor_data->sms_info->sms_mt.orig_addr.number,sizeof(SmsData.NumberBuffer)-2); } } else { TRACE_EVENT_P1("Number = %s",parent_data->sms_editor_data->sms_info->sms_mt.orig_addr.number); strcpy((char *)SmsData.NumberBuffer,(char *)parent_data->sms_editor_data->sms_info->sms_mt.orig_addr.number); } /* Marcus: Issue 1489: 13/12/2002: End */ /*MC, unicode support*/ memcpy((char*)pb_data.number, (char*)SmsData.NumberBuffer, sizeof(pb_data.number)); SmsRead_R_TEXTEDT2_destroy(message_win); /* Destroy the Options Menu and text editor.before starting the Send Editor.*/ SmsRead_R_OPT_destroy(option_mnu_win); /*SPR 2686 destroy the SMS read window to free memory*/ /*destroy the built list window*/ listsDestroy(list_win); list_win=0; /*destroy the main control window*/ if (sms_read_win)/*check window exists before destroying it*/ { SmsRead_R_destroy(sms_read_win); sms_read_win = NULL; } callNumber(pb_data.number); } //x0035544 Mar 23, 2006 DR:OMAPS00047813 /******************************************************************************* $Function: Search_forNumberInSMS $Description: Search through the SMS text and find the numbers $Returns: void $Arguments: UserData - SMS data info *******************************************************************************/ void Search_forNumberInSMS(T_SmsUserData *UserData) { int num_row, num_col, i; int len, sms_length = 0; char character; char *sms_buffer, *sender_num; BOOL mesg_end=FALSE; TRACE_FUNCTION("Search_forNumberInSMS()"); sms_buffer = (char*)UserData->TextBuffer; sender_num = (char*)UserData->NumberBuffer; #ifdef NO_ASCIIZ if (sms_buffer[0] == 0x80) { #ifdef NEW_EDITOR /* SPR#1428 - SH - New Editor changes - new function to calculate length of unicode string */ sms_length = ATB_string_UCLength((U16*)sms_buffer)*sizeof(USHORT); #else /* NEW_EDITOR */ sms_length = strlenUnicode((U16*)sms_buffer); #endif /* NEW_EDITOR */ } else { sms_length = strlen(sms_buffer); } #else /* NO_ASCIIZ */ sms_length = strlen(sms_buffer); #endif /* NO_ASCIIZ */ sms_length--; len= num_row=num_col=0; smsread_num_ctr =0; num_buffer = (char**)ALLOC_MEMORY(sizeof(char*)*MAX_NUMBER_SIZE); if (num_buffer == NULL) { TRACE_EVENT("sms number list alloc failed"); return; } for(i=0; i<MAX_NUMBER_SIZE; i++) num_buffer[i] = (char*)ALLOC_MEMORY(sizeof(char)*NUMBER_LENGTH); if (num_buffer[i] == NULL) { TRACE_EVENT(" sms number string alloc failed"); return; } while (len <= sms_length) { character = sms_buffer[len]; if(len == sms_length) { mesg_end = TRUE; } #ifdef NO_ASCIIZ if (character=='+' || ( character>='0' && character<='9' ) || (character==0)) #else if (character=='+' || ( character>='0' && character<='9' ) ) #endif { if (character != 0) /*MC, only copy non-Null chars*/ { if(num_col <= NUMBER_LENGTH) { num_buffer[num_row][num_col] = character; num_col++; } if(mesg_end && (strlen(num_buffer[num_row]) >= MIN_NUM_LENGTH))//copy if number is at end of the message { smsread_num_ctr++; num_row++; } } } else { if(num_col != 0 ) { num_buffer[num_row][num_col] = '\0'; if(strlen(num_buffer[num_row]) < MIN_NUM_LENGTH ) { num_col=0; } else { smsread_num_ctr++; num_row++; if( num_row >= MAX_NUMBER_SIZE) break; num_col = 0; } } } len++; } if( num_row < 10 )//copy the sender number { memcpy((char*)num_buffer[num_row], (char*)sender_num, NUMBER_LENGTH); smsread_num_ctr++; } return ; } //Mar 23, 2006 DR:OMAPS00047813 x0035544 /******************************************************************************* $Function: smsread_numlist_win_cb $Description: Window event handler $Returns: MFW_EVENT_REJECTED: MFW_EVENT_CONSUMED: $Arguments: *******************************************************************************/ static int smsread_numlist_win_cb (MfwEvt e, MfwWin *w) { TRACE_FUNCTION ("smsread_numlist_win_cb()"); switch (e) { case MfwWinVisible: /* window is visible */ break; case MfwWinFocussed: /* input focus / selected */ case MfwWinDelete: /* window will be deleted */ default: return MFW_EVENT_REJECTED; } return MFW_EVENT_CONSUMED; } //Mar 23, 2006 DR:OMAPS00047813 x0035544 /******************************************************************************* $Function: SmsRead_BuildNumList_Menu $Description: creates dynamic menu $Returns: $Arguments: *******************************************************************************/ static T_MFW_HND SmsRead_BuildNumList_Menu(T_MFW_HND parent_window) { T_SMSREAD_R * data = (T_SMSREAD_R *)mfwAlloc(sizeof (T_SMSREAD_R)); T_MFW_WIN * win; TRACE_FUNCTION ("SmsRead_BuildNumList_Menu"); /* * Create window handler */ data->win = win_create (parent_window, 0, E_WIN_VISIBLE, (T_MFW_CB)smsread_numlist_win_cb); if (data->win EQ NULL) { FREE_MEMORY( (void *)data, sizeof( T_SMSREAD_R ) ); return NULL; } TRACE_EVENT("list holder window created: " ); /* * connect the dialog data to the MFW-window */ data->mmi_control.dialog = (T_DIALOG_FUNC)smsread_numlist_exec_cb; data->mmi_control.data = data; win = ((T_MFW_HDR *)data->win)->data; win->user = (void *)data; data->parent = parent_window; winShow(data->win); /* * return window handle */ return data->win; } //Mar 23, 2006 DR:OMAPS00047813 x0035544 /******************************************************************************* $Function: smsread_numlist_exec_cb $Description: callback function $Returns: $Arguments: *******************************************************************************/ void smsread_numlist_exec_cb (T_MFW_HND win, USHORT event) { T_MFW_WIN * win_data; T_SMSREAD_R * data; /* List is complete so present menu. */ USHORT i; TRACE_FUNCTION("smsread_numlist_exec_cb"); win_data = ((T_MFW_HDR *) win)->data; data = (T_SMSREAD_R *)win_data->user; switch (event) { case E_INIT: data->menu_list_data = (ListMenuData *)ALLOC_MEMORY(sizeof(ListMenuData)); if(data->menu_list_data == 0) { TRACE_EVENT("Failed memory alloc 1 "); return; } /*SPR 2686, only allocate memory for the number of messages displayed*/ data->menu_list_data->List = (T_MFW_MNU_ITEM *)ALLOC_MEMORY( smsread_num_ctr * sizeof(T_MFW_MNU_ITEM) );//JVJE if(data->menu_list_data->List == 0) { TRACE_EVENT("Failed memory alloc 2"); return; } for (i = 0; i < smsread_num_ctr; i++) { mnuInitDataItem(&data->menu_list_data->List[i]); data->menu_list_data->List[i].str = (char *)num_buffer[i]; TRACE_EVENT_P1("Menu Tags:%s", data->menu_list_data->List[i].str); data->menu_list_data->List[i].flagFunc = item_flag_none; } data->menu_list_data->ListLength =smsread_num_ctr; data->menu_list_data->ListPosition = 1; data->menu_list_data->CursorPosition = 1; data->menu_list_data->SnapshotSize =smsread_num_ctr; data->menu_list_data->Font = 0; data->menu_list_data->LeftSoftKey = TxtSoftSelect; /*NM p032*/ if(test_sim EQ TRUE) data->menu_list_data->RightSoftKey = TxtNull; else data->menu_list_data->RightSoftKey = TxtSoftBack; data->menu_list_data->KeyEvents = KEY_ALL; data->menu_list_data->Reason = 0; data->menu_list_data->Strings = TRUE; data->menu_list_data->Attr = (MfwMnuAttr*)&menuSearchNumListAttr; data->menu_list_data->autoDestroy = FALSE; /* Create the dynamic menu window */ listDisplayListMenu(win, data->menu_list_data, (ListCbFunc_t)SmsRead_numlist_cb ,0); break; default: break; } } //Mar 23, 2006 DR:OMAPS00047813 x0035544 /******************************************************************************* $Function: SmsRead_numlist_cb $Description: destroy lists and menu in case of back softkey or menu exit $Returns: $Arguments: *******************************************************************************/ static void SmsRead_numlist_cb(T_MFW_HND Parent, ListMenuData * ListData) { T_MFW_WIN *win_data = ((T_MFW_HDR *)Parent)->data; T_SMSREAD_R *data = (T_SMSREAD_R *)win_data->user; char *pb_number; int i; TRACE_FUNCTION ("SmsRead_numlist_cb()"); if ((ListData->Reason EQ LISTS_REASON_BACK) || (ListData->Reason EQ LISTS_REASON_CLEAR) || (ListData->Reason EQ LISTS_REASON_HANGUP)) { /* ** Destroy the window --- Not sure if this is required! ... leave it out for now */ listsDestroy(ListData->win); /* ** Free the memory set aside for ALL the devices to be listed. */ for(i=0; i<MAX_NUMBER_SIZE;i++) { FREE_MEMORY((U8*)num_buffer[i], sizeof(char)*NUMBER_LENGTH); num_buffer[i] = NULL; } /*deallocate memory for the array of pointer to numbers*/ FREE_MEMORY((U8*)num_buffer, sizeof(char*)*MAX_NUMBER_SIZE); if (data->menu_list_data->List != NULL) { FREE_MEMORY ((void *)data->menu_list_data->List, (U16)((data->menu_list_data->ListLength) * sizeof(T_MFW_MNU_ITEM))); } if (data->menu_list_data != NULL) { FREE_MEMORY ((void *)data->menu_list_data, sizeof (ListMenuData)); } SmsRead_numlist_destroy(data->win); } else if(ListData->Reason EQ LISTS_REASON_SELECT) { pb_number = ListData->List[ListData->ListPosition].str; callNumber((UBYTE*)pb_number); } return; } //Mar 23, 2006 DR:OMAPS00047813 x0035544 /******************************************************************************* $Function: SmsRead_numlist_destroy $Description: Destroy the Extr Number window. $Returns: none $Arguments: own_window - window handler *******************************************************************************/ static void SmsRead_numlist_destroy(MfwHnd own_window) { T_MFW_WIN * win_data = ((T_MFW_HDR *)own_window)->data; T_SMSREAD_R * data = (T_SMSREAD_R *)win_data->user; TRACE_FUNCTION ("SmsRead_numlist_destroy"); if (own_window == NULL) { return; } if (data) { win_delete(data->win); /* ** Free Memory */ mfwFree((void *)data, sizeof (T_SMSREAD_R)); } } #undef MMI_SMSREAD_C