FreeCalypso > hg > fc-tourmaline
view src/ui/bmi/mmiBookSDNWindow.c @ 49:4e178a0e90f6
LICENSE added
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 18 Oct 2020 03:39:10 +0000 |
parents | 67bfe9f274f6 |
children | c0052fe355d3 |
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 (6349) $Module: PhoneBook $File: MmiBookSDNWindow.c $Revision: 1.0 $Author: Condat(UK) $Date: 25/10/00 ******************************************************************************** Description: This module provides the service numbers window for the phone book ******************************************************************************** $History: MmiBookSDNWindow.c CRR: 25302 - xpradipg 10 Nov 2004 Description: Should be able to select the number fro the phonebook while sending MMS/EMS. Solution: The new feature to select the number from phonebook while sending MMS/EMS is added 25/10/00 Original Condat(UK) BMI version. $End *******************************************************************************/ /******************************************************************************* Include Files *******************************************************************************/ #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 "mfw_sys.h" #include "mfw_mfw.h" #include "mfw_win.h" #include "mfw_kbd.h" #include "mfw_lng.h" /* SPR#1428 - SH - New Editor changes */ #ifndef NEW_EDITOR #include "mfw_edt.h" #endif #include "mfw_icn.h" #include "mfw_mnu.h" #include "mfw_tim.h" #include "mfw_sim.h" #include "mfw_cm.h" #include "mfw_nm.h" #include "mfw_phb.h" #include "mfw_mme.h" #include "mfw_sat.h" #include "mfw_sms.h" #include "mfw_cnvt.h" //GW Added for 'mfw_SIM2GsmStr' #include "dspl.h" #include "ksd.h" #include "psa.h" #include "MmiMain.h" #include "MmiBookController.h" #include "MmiDummy.h" #include "MmiDialogs.h" #include "MmiLists.h" #include "MmiMenu.h" #include "mmiCall.h" #include "Mmiicons.h" #include "MmiIdle.h" #include "MmiSoftKeys.h" #include "MmiSounds.h" #include "MmiIdle.h" #include "MmiNetwork.h" #include "mmiSat_i.h" #include "MmiAoc.h" #include "gdi.h" #include "audio.h" #include "cus_aci.h" #include "mfw_ffs.h" #include "MmiTimers.h" #include "MmiBookShared.h" #include "mmiColours.h" /******************************************************************************* Private methods *******************************************************************************/ /******************************************************************************* $Function: bookSDN $Description: window dialog function $Returns: none. $Arguments: win, window handle event, event to be handled value, not used parameter, not used *******************************************************************************/ static void bookSDN( T_MFW_HND win, USHORT event, SHORT value, void * parameter ) { T_MFW_WIN *win_data = ((T_MFW_HDR *) win)->data; tBookStandard *data = (tBookStandard *)win_data->user; MfwMnu *mnu; tMmiPhbData *my; TRACE_FUNCTION ("bookSDN()"); /* Guard against bad incoming data */ if ( ! data ) return; /* Grab the current phonebook data element, we use this a lot */ my = &data->phbk->current; /* simple event handler, dealing with the messages we know about */ switch (event) { case SEARCH_INIT: { /* Search initialise, no action required */ } break; case SEARCH_SCROLL_UP: { /* Scroll up event we need to deal with correctly */ if ( ( my->index==1 ) && ( my->selectedName == 0 ) ) { /* select the correct boundary for the list */ my->selectedName = my->status.used_entries; if ( my->selectedName > MAX_SEARCH_NAME ) my->selectedName = MAX_SEARCH_NAME; /* and subtract one cos we are dealing with an array starting at zero */ my->selectedName--; /* and calculate the correct index value */ my->index = my->status.used_entries - my->selectedName; } else { if ( my->selectedName == 0 ) my->index--; else my->selectedName--; } /* update menu structures */ mnu = (MfwMnu *)mfwControl( data->menu ); mnu->lCursor[ mnu->level ] = my->selectedName; /* and go find the name */ bookFindName( MAX_SEARCH_NAME, &data->phbk->current ); } break; case SEARCH_SCROLL_DOWN: { /* scroll down event is a bit easier than the scroll up */ if ( (my->index + my->selectedName) == my->status.used_entries ) { my->index = 1; my->selectedName = 0; } else { if ( my->selectedName == (MAX_SEARCH_NAME - 1) ) my->index++; else my->selectedName++; } /* update menu structures */ mnu = (MfwMnu *)mfwControl( data->menu ); mnu->lCursor[ mnu->level ] = my->selectedName; /* and go find the name */ bookFindName( MAX_SEARCH_NAME, &data->phbk->current ); } break; case SEARCH_STRING: { /* search for the current element selected in our buffer */ my->index = my->index + my->selectedName; if ( bookSearchName( data->edtBuf, MAX_SEARCH_NAME, &data->phbk->current ) == MFW_PHB_OK ) { if ( my->index > (my->status.used_entries - MAX_SEARCH_NAME + 1) ) { /* need to reorganise a bit here */ if ( my->status.used_entries > MAX_SEARCH_NAME ) { my->selectedName = my->index - my->status.used_entries; my->selectedName += MAX_SEARCH_NAME - 1; my->index -= my->selectedName; } else { my->selectedName = my->index - 1; my->index = 1; } /* find the appropriate name */ bookFindName( MAX_SEARCH_NAME, &data->phbk->current ); } else data->phbk->current.selectedName = 0; /* update menu structures */ mnu = (MfwMnu *)mfwControl(data->menu); mnu->lCursor[mnu->level] = data->phbk->current.selectedName; } } break; case SEARCH_UPDATE: { /* Update search message */ my->index = 1; my->selectedName = 0; memset( data->edtBuf, '\0', sizeof( data->edtBuf ) ); /* SPR#1428 - SH - New Editor changes */ #ifdef NEW_EDITOR ATB_edit_Reset( data->editor ); #else /* NEW_EDITOR */ edtReset( data->edt ); #endif /* NEW_EDITOR */ /* deal with the new search using the method above */ SEND_EVENT( win, SEARCH_STRING, 0, 0 ); } break; /* SPR#1428 - SH - New Editor: added event so we can * prompt a redraw when required. */ #ifdef NEW_EDITOR case SEARCH_REDRAW: win_show(data->win); break; #endif default: { /* no default handler, just ignore any other messages */ } break; } } /******************************************************************************* $Function: bookSDNWinCB $Description: Window call back function $Returns: status indicating if event handled or not $Arguments: e, event, w, window handle *******************************************************************************/ static int bookSDNWinCB( MfwEvt e, MfwWin *w ) { tBookStandard *data = (tBookStandard *)w->user; char *ElemPtr, *NumPtr; /* x0045876, 14-Aug-2006 (WR - "Position" was set but never used) */ /* int leftKey, rightKey, ElemSize, i, Position; */ int leftKey, rightKey, ElemSize, i; TRACE_FUNCTION ("phbk_sdn_win_cb()"); switch (e) { case MfwWinVisible: { /* Paint function, clear the screen and paint in each of our controls */ dspl_ClearAll(); /* SPR#1428 - SH - New Editor changes */ #ifdef NEW_EDITOR ATB_edit_Show(data->editor); #else /* NEW_EDITOR */ edtShow(data->edt); #endif /* NEW_EDITOR */ /* Populate the names screen buffer */ for (i=0;i<MAX_SEARCH_NAME;i++) { /* Grab info for this element */ ElemPtr = MmiBookCallList(i); ElemSize = MmiBookCallListSize(i); /* Decide on whether to use number or name */ #ifdef NO_ASCIIZ NumPtr = (char*)data->phbk->current.entry[i].name.data; #else NumPtr = (char*)data->phbk->current.entry[i].name; #endif if ( *NumPtr == '\0' ) { NumPtr = (char*)data->phbk->current.entry[i].number; /* x0045876, 14-Aug-2006 (WR - "Position" was set but never used) */ /* Position = POS_END; */ } /* BEGIN: x0045876, 14-Aug-2006 (WR - "Position" was set but never used) */ /* else Position = POS_BEGIN; */ /* END: x0045876, 14-Aug-2006 (WR - "Position" was set but never used) */ /* Clear the buffer, then fill it with the required value */ memset( ElemPtr, '\0', ElemSize ); /*mc, SPR 1442, replaced old truncation function with new one*/ resources_truncate_to_screen_width(NumPtr, 0, ElemPtr, ElemSize,SCREEN_SIZE_X, FALSE); } /* Show the menu and stick up the find prompt */ mnuUnhide(data->menu); PROMPT( MmiBookMenuArea().px, Mmi_layout_line(SECOND_LAST_LINE_TOP), 0, TxtFind ); /* The softkeys are dependant on how we got here */ //CRR: 25302 - xpradipg 10 Nov 2004 //check also if phonebook is invoked by MMS/EMS if ( ( data->phbk->fromSMS ) || ( data->phbk->fromSMSSC )|| (data->phbk->fromMmsEms) ||( data->phbk->current.status.book == PHB_SDN ) ) { leftKey = TxtSoftSelect; rightKey = TxtSoftBack; } else { leftKey = TxtSoftCall; rightKey = TxtSoftOptions; } displaySoftKeys( leftKey, rightKey ); } break; default: { /* Default handler, just return zero and let the next handler in the chain deal with the event if required */ return 0; } } /* return non-zero status indicating we have dealt with the event */ return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: bookSDNKbdCB $Description: Keyboard handler $Returns: stats indicating if event handled or not (Always MFW_EVENT_CONSUMED) $Arguments: e, event, k, keyboard handle *******************************************************************************/ static int bookSDNKbdCB( MfwEvt e, MfwKbd *k ) { T_MFW_HND win = mfwParent(mfw_header()); T_MFW_WIN *win_data = ((T_MFW_HDR *)win)->data; tBookStandard *data = (tBookStandard *)win_data->user; tBookMessageEvents MyEvent = SEARCH_STRING; char *Number; // int i = 0; // RAVI TRACE_FUNCTION ("bookSDNKbdCB()"); /* SPR#1428 - SH - New Editor changes */ #ifdef NEW_EDITOR AUI_entry_EventKey(data->entry_data, e, k); #else /* NEW_EDITOR */ /* Make sure we have the correct editor enabled * (unnecessary for NEW_EDITOR) */ if ( activeEditor() != data->edt ) editActivate( data->edt, TRUE ); editEventKey( e, k ); #endif /* NEW_EDITOR */ /* Handle the events we need to deal with here */ switch (k->code) { case KCD_MNUUP: { /* Scroll up event, just mark our event as such and it'll be dealt with in due course */ MyEvent = SEARCH_SCROLL_UP; } break; case KCD_MNUDOWN: { /* Scroll down event, just mark our event as such and it'll be dealt with in due course */ MyEvent = SEARCH_SCROLL_DOWN; } break; case KCD_CALL: case KCD_LEFT: { /* left key is a select, we either need to send the number back to the parent window, or call it */ Number = (char *) data->phbk->current.entry[ data->phbk->current.selectedName ].number; if ( data->phbk->fromSMS ) SEND_EVENT( data->phbk->parent_win, SMS_PHBK_NUMBER, 0, (UBYTE *) Number ); if ( data->phbk->fromSMSSC ) SEND_EVENT( data->phbk->parent_win, SMSSC_PHBK_NUMBER, 0, (UBYTE *) Number ); else if(data->phbk->fromDivert ) SEND_EVENT( data->phbk->parent_win, DIVERT_PHBK_NUMBER, 0, (UBYTE *) Number ); else if(data->phbk->fromDeflect )/*SPR 1392, send event to call dialogue*/ SEND_EVENT( data->phbk->parent_win, DEFLECT_PHBK_NUMBER, 0, (UBYTE *) Number ); //CRR: 25302 - xpradipg 10 Nov 2004 //send even if invoked by MMS/EMS else if(data->phbk->fromMmsEms) SEND_EVENT( data->phbk->parent_win, MMS_EMS_PHBK_NUMBER, 0, (UBYTE *) Number ); else callNumber( (UBYTE *) Number ); /* Having dealt with the number, we destroy our phone book context and exit the handler early */ bookPhonebookDestroy( data->phbk->win ); return MFW_EVENT_CONSUMED; } //break; // RAVI case KCD_RIGHT: { /* Right key is a cancel */ bookSDNDestroy( data->win ); data->phbk->search_win = 0; return MFW_EVENT_CONSUMED; } // break; // RAVI case KCD_HUP: { /* Clear key deletes the last character, or if none left will take us out of here */ if ( data->edtBuf[0] == '\0' ) { bookSDNDestroy( data->win ); data->phbk->search_win = 0; return MFW_EVENT_CONSUMED; } else { /* Delete last character entered */ /* SPR#1428 - SH - New Editor changes */ #ifdef NEW_EDITOR ATB_edit_DeleteLeft(data->editor, TRUE); /* SPR#2342 */ #else /* NEW_EDITOR */ edtChar( data->edt, ecBack ); #endif /* NEW_EDITOR */ } } break; default: { /* No default processing required */ } break; } /* Initiate a new search based on the current settings, MyEvent will have been set accordingly */ SEND_EVENT( data->win, MyEvent, 0, 0 ); winShow( data->win ); /* And make sure no calling routines try to do anything with the event we have just dealt with */ return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: bookSDNKeyLongCB $Description: long keyboard event handler $Returns: MFW_EVENT_CONSUMED always $Arguments: e, event to handle, k, keyboard handle *******************************************************************************/ static int bookSDNKeyLongCB( MfwEvt e, MfwKbd *k ) { T_MFW_HND win = mfwParent(mfw_header()); T_MFW_WIN *win_data = ((T_MFW_HDR *)win)->data; tBookStandard *data = (tBookStandard *)win_data->user; /* Just checks for clear and long being set, if so it will destroy the window */ if ( (e & KEY_CLEAR) && (e & KEY_LONG) ) { bookSDNDestroy( win ); data->phbk->search_win = 0; } /* Force event consumed always, prevents default behaviour kicking in */ return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: bookSDNCreate $Description: Creates the Service numbers widow $Returns: Window Handle, or NULL if unsuccessfull $Arguments: Parent, handle of the parent window *******************************************************************************/ static T_MFW_HND bookSDNCreate( MfwHnd parent ) { T_MFW_WIN *win_data; tBookStandard *data = (tBookStandard *) ALLOC_MEMORY( sizeof( tBookStandard ) ); T_MFW_WIN *parent_win_data = ((T_MFW_HDR *)parent)->data; T_phbk* phbk = (T_phbk *)parent_win_data->user; TRACE_FUNCTION( "bookSDNCreate()" ); /* Create the window */ if ( ( data->win = win_create (parent, 0, E_WIN_VISIBLE, (T_MFW_CB) bookSDNWinCB ) ) == NULL ) return NULL; /*SPR 2123, MC allocate memory for phonebook list*/ if (create_mmi_phonebook_names_list() == NULL) return NULL; /* set up the basic window elements, dialog and user data pointers */ data->mmi_control.dialog = (T_DIALOG_FUNC)bookSDN; data->mmi_control.data = data; win_data = ((T_MFW_HDR *)data->win)->data; win_data->user = (void *)data; data->parent_win = parent; /* Create keyboard and menu handlers to be associated with this window */ data->kbd = kbdCreate( data->win, KEY_ALL, (MfwCb) bookSDNKbdCB ); data->kbd_long = kbdCreate( data->win, KEY_ALL | KEY_LONG, (MfwCb) bookSDNKeyLongCB ); data->menu = mnuCreate( data->win, MmiBookMenuDetailsList(), 0, 0 ); /* Set basic edit attributes structure and create an editor associated with these attributes */ /* SPR#1428 - SH - New Editor changes */ #ifdef NEW_EDITOR AUI_edit_SetAttr( &data->editor_attr, BOOKSDN_EDITOR, COLOUR_EDITOR_XX, EDITOR_FONT, ED_MODE_ALPHA, ED_CURSOR_BAR, ATB_DCS_ASCII, (UBYTE*) data->edtBuf, MAX_SEARCH_CHAR); data->editor = ATB_edit_Create(&data->editor_attr,0); data->entry_data = AUI_entry_Create(data->win, data->editor, SEARCH_REDRAW); ATB_edit_Init(data->editor); #else /* NEW_EDITOR */ bookSetEditAttributes( BOOKSDN_EDITOR, COLOUR_EDITOR_XX , 0, edtCurBar1, 0, (char*) data->edtBuf, MAX_SEARCH_CHAR, &data->attr ); data->edt = edtCreate( data->win, &data->attr, 0, 0 ); #endif /* NEW_EDITOR */ /* Show the menu */ mnuUnhide(data->menu); /* associate the phonebook handler */ data->phbk = phbk; /* and return the newly created window handle */ return data->win; } /******************************************************************************* Public methods *******************************************************************************/ /******************************************************************************* $Function: bookSDNStart $Description: This is the entry point for the service numbers window handler $Returns: handle of window we are creating $Arguments: Parent, handle of the parent window *******************************************************************************/ T_MFW_HND bookSDNStart( MfwHnd parent ) { T_MFW_HND win; T_MFW_WIN *win_data; tBookStandard *data; MfwMnu *mnu; TRACE_FUNCTION( "bookSDNCreate()" ); /* We can't actually create the window if the phone book is still loading, so we will deal with this up front */ if ( phb_get_mode() == PHB_LOADING ) { bookShowInformation( idle_get_window(), TxtPleaseWait ,NULL, NULL ); return NULL; } /* Create the basic window, dealing with errors here and just terminating if we can't create the window correctly. */ if ( ( win = bookSDNCreate( parent ) ) == NULL ) return NULL; /* Okay, we have created the window, so set up our internal working pointers and check if the current phone book has some entries in it */ win_data = ((T_MFW_HDR *) win)->data; data = (tBookStandard *)win_data->user; data->phbk->current.status.book = PHB_SDN; /* we need to determine if there are any entries in the phone book before we allow the service number windows to be displayed, we do this by searching for an empty name */ bookGetCurrentStatus( &data->phbk->current.status ); memset( data->edtBuf, '\0' , sizeof( data->edtBuf ) ); data->phbk->current.index = 1; data->phbk->current.selectedName = 0; bookFindName( MAX_SEARCH_NAME, &data->phbk->current ); /* If the current index is still zero then we have been unable to find an entry, in this case we need to shutdown the service numbers window, since we can't do anything with it. */ if ( data->phbk->current.index == 0 ) { bookSDNDestroy( win ); data->phbk->search_win = 0; bookShowInformation( idle_get_window(), TxtEmptyList ,NULL, NULL ); return 0; } /* We are still running, so set up the menu and edit structures accordingly, and display the window */ mnu = (MfwMnu *) mfwControl( data->menu ); mnu->lCursor[ mnu->level ] = data->phbk->current.selectedName; /* SPR#1428 - SH - New Editor: editActivate no longer needed */ #ifndef NEW_EDITOR editActivate( data->edt, 1 ); #endif winShow( data->win ); /* return the pointer to the window */ return win; } /******************************************************************************* $Function: bookFindNameInSDNPhonebook $Description: This routine performs the FindNameInPhoneBook functionality, tuned to the particular requirements of the service numbers phonebook. $Returns: handle of window we are creating $Arguments: Parent, handle of the parent window *******************************************************************************/ int bookFindNameInSDNPhonebook( const char* p_pszNumber, T_MFW_PHB_ENTRY* p_pEntry ) { T_MFW_PHB_LIST phb_list; #ifdef NO_ASCIIZ T_MFW_PHB_TEXT p_pszNumberText; #endif SHORT phb_index=0; /*MC SPR 1257, replacing PHB_MAX_LEN with MAX_ALPHA_LEN for name strings*/ UBYTE l_name[MAX_ALPHA_LEN]; int status; char bfr[80]; TRACE_FUNCTION("bookFindNameInSDNPhonebook()"); /* guard against dodgy input data */ if( ( p_pszNumber == NULL ) || ( p_pEntry == NULL ) ) return 0; if ( strlen(p_pszNumber) < 1) return (0); /* initialise the search structures */ memset(p_pEntry, 0, sizeof(T_MFW_PHB_ENTRY)); memset(&phb_list, 0, sizeof(phb_list)); phb_list.entry = p_pEntry; phb_list.num_entries = 1; phb_list.book = PHB_SDN; //GW Set up data structure for NO_ASCIIZ #ifdef NO_ASCIIZ p_pszNumberText.dcs = MFW_DCS_8bits; p_pszNumberText.len = strlen(p_pszNumber); strcpy((char*)p_pszNumberText.data, p_pszNumber); #endif /* see what we can find using the standard search routine for any phone book, giving the service numbers book as a parameter */ #ifdef NO_ASCIIZ status = phb_find_entries( (UBYTE)PHB_SDN, &phb_index, (UBYTE)MFW_PHB_NUMBER, 1, &p_pszNumberText, &phb_list ); #else status = phb_find_entries( PHB_SDN, &phb_index, MFW_PHB_NUMBER, 1, (char *) p_pszNumber, &phb_list ); #endif sprintf(bfr,"len:%2d , name: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",p_pEntry->name.len); memcpy(&bfr[16], p_pEntry->name.data, PHB_MAX_LEN); TRACE_FUNCTION(bfr); sprintf(bfr,"number:'%s'",p_pEntry->number); TRACE_FUNCTION(bfr); if (status != MFW_PHB_OK) { phb_list.result = MFW_NO_ENTRY; TRACE_FUNCTION("bookFindNameInSDNPhonebook()- status error"); } /* convert the returned data to manageable information */ #ifdef NO_ASCIIZ //GW Check that conversion returned a valid string //GW Testing for 0 is stupid but since the macros PASSED and FAILED that are used by the procedure are not in the header (duh!) we can't use them. /*MC SPR 1257, replacing PHB_MAX_LEN with MAX_ALPHA_LEN for name strings*/ if (mfw_SIM2GsmStr( p_pEntry->name.len, p_pEntry->name.data, MAX_ALPHA_LEN, l_name ) == 0) memcpy(p_pEntry->name.data, l_name, MAX_ALPHA_LEN); p_pEntry->name.data[0] = 0x00; #else bookGsm2Alpha( p_pEntry->name ); #endif /* if we couldn't find any information, null out the return structure, this will stop people who don't check the return status from getting sensible information */ if( phb_list.result != MFW_ENTRY_EXIST ) memset(p_pEntry, 0, sizeof(T_MFW_PHB_ENTRY)); /* return status depends on result of search */ return ( phb_list.result == MFW_ENTRY_EXIST ); } /******************************************************************************* $Function: bookSDNDestroy $Description: destroys the Service Numbers window $Returns: none. $Arguments: window, handle of the window to be destroyed *******************************************************************************/ void bookSDNDestroy( MfwHnd window ) { T_MFW_WIN *win = ((T_MFW_HDR *)window)->data; tBookStandard *data = (tBookStandard *)win->user; TRACE_FUNCTION( "bookSDNDestroy" ); /* Guard against bad incoming data */ if ( ! data ) return; /* SPR#1428 - SH - New Editor changes */ #ifdef NEW_EDITOR /* Editor is no longer destroyed with winDelete, * so destroy it here. */ if (data->editor) { ATB_edit_Destroy(data->editor); data->editor = 0; } if (data->entry_data) { AUI_entry_Destroy(data->entry_data); data->entry_data = 0; } #endif /* NEW_EDITOR */ /* Destroy the window using the appropriate method */ if ( data->phbk->root_win == window ) bookPhonebookDestroy( data->phbk->win ); else { /* deleting the window, so make sure we free the memory */ data->phbk->search_win = 0; winDelete( data->win ); FREE_MEMORY( (void *)data, sizeof( tBookStandard ) ); } /*SPR2123, MC deallocate memory for phonebook list*/ destroy_mmi_phonebook_names_list(MmiBookMenuDetailsList()); } /******************************************************************************* End of File *******************************************************************************/