FreeCalypso > hg > fc-magnetite
view src/ui3/mfw/mfw_nm.c @ 516:1ed9de6c90bd
src/g23m-gsm/sms/sms_for.c: bogus malloc removed
The new error handling code that was not present in TCS211 blob version
contains a malloc call that is bogus for 3 reasons:
1) The memory allocation in question is not needed in the first place;
2) libc malloc is used instead of one of the firmware's proper ways;
3) The memory allocation is made inside a function and then never freed,
i.e., a memory leak.
This bug was caught in gcc-built FreeCalypso fw projects (Citrine
and Selenite) because our gcc environment does not allow any use of
libc malloc (any reference to malloc produces a link failure),
but this code from TCS3.2 is wrong even for Magnetite: if this code
path is executed repeatedly over a long time, the many small allocations
made by this malloc call without a subsequent free will eventually
exhaust the malloc heap provided by the TMS470 environment, malloc will
start returning NULL, and the bogus code will treat it as an error.
Because the memory allocation in question is not needed at all,
the fix entails simply removing it.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 22 Jul 2018 06:04:49 +0000 |
parents | e8ddbb0837ed |
children |
line wrap: on
line source
/* +--------------------------------------------------------------------+ | PROJECT: MMI-Framework (8417) $Workfile:: mfw_nm.c $| | $Author:: Es $Revision:: 1 $| | CREATED: 07.10.98 $Modtime:: 2.03.00 16:28 $| | STATE : code | +--------------------------------------------------------------------+ MODULE : MFW_NM PURPOSE : This modul contains the functions for network management. $History:: mfw_nm.c Aug 07, 2007 DR:OMAPS00137726 x0066814(Geetha) Description:HPLMN Manual Selection at power on - unable to perform manual selection at power ON Solution: Added a new function nm_get_plmn_list_during_bootup() to get the PLMN list during boot up. Apr 13, 2007 DRT:OMAPS00122739 x0066814(Geetha) Description: With Orange SIM card, once attached (at+cgatt=1), "5201" is displayed instead of "Orange" Solution: In nm_nitz_info_ind(), commented the code to copy mnc, mcc, long name and short anme to net_ind from mmr_info_ind. May 31, 2007 DR: OMAPS00133201 x0pleela Description: MS keeps searching networks and doesn't list available PLMNs after performing manual selection Solution : Modified the function nm_error_cops() to check for CME_ERR_AbortedByNetwork error and send event E_NM_ABORT_NETWORK to BMI to destroy the n/w searching dialog Mar 12 2007 ,x0061088 (Prachi) Removed function nm_restrict_bands()as function pl_pei_config() is no more avalilable in g23m. Oct 30 2006, OMAPS00098881 x0039928(sumanth) Removal of power variant Sep 18,2006 DRT: OMAPS0090268 x0061088(Prachi) Description : To check for Forbidden network (for denied services),it takes long time. Solution : Function rAT_PercentCREG() has now be implemented to handle CREG_STAT_Denied, which sends nm_signal(NETWORK_FORBIDDEN_NETWORK) to Bmi . June 02, 2006 DR: OMAPS00078005 x0021334 Descripton: Test for NITZ (Network Identity and Timezone) support - No New time was displayed Solution: New Time/Date received from network is sent to MFW by lower layer by invoking 'rAT_PercentCTZV' function. This function has now been implemented to pass on the received values to MMI for user confirmation and RTC updation. Jun 23, 2006 DR: OMAPS00082374 x0pleela Description: EONS Failures - unexpected output from the MMI: 2 carriers; on the top always T-Mobile Solution: a) Removed the usage of globals gEons_alloc_active and opn_sel_done b) Removed the check if( plmn_ident->opn_read_from EQ NM_EONS ) in function nm_update_plmn_data c) Updating the long name and short name lengths in function nm_update_plmn_data d) Removed the code where plmn_ident was updated with new MNC and MCC after qat_%COPN in function nm_update_plmn_data e) Updated function nm_get_opername() by calling only sat_%CNIV() f) Removed the function definitions of set_opn_sel_done and get_opn_sel_done May 15, 2006 OMAPS00075777 a0393213 (R.Prabakar) Description : It is supposed that the sample register itself automatically (in Manual Mode) to the last manual selected HPLMN cell before the power cycle, and this does not happen; instead this, the sample shows up the available networks list Fix : call to nm_avail_plmn_list() is changed to call to sAT_PercentNRG() Feb 15, 2006 ER: OMAPS00065203 x0pleela Description: Cingular Operator Name Prioritization implementation required Solution: Incorporated review comments - Changed from NEQ NM_CPHS to EQ NM_ROM as we know %CNIV will be called only if source id is ROM or CPHS and not roaming in nm_get_opername() - set_opn_sel_done(): sets opn_sel_done flag to TRUE or FALSE. - get_opn_sel_done(): returns the current value of flag opn_sel_done. Feb 09, 2006 ER: OMAPS00065203 x0pleela Description: Cingular Operator Name Prioritization implementation required Solution: Handling E_NM_OPN for operator name display Query for COPN in rAT_PlusCREG and update plmn data Defined following new functions: nm_decodeSourceId:to convert the source id used by ACI to the source id used by MFW nm_update_plmn_data: update plmn data after querying COPN nm_get_COPN: query COPN nm_get_opername: updates operator name based on cingular's prioritization requirement. Priority would be in order ONS->NITZ->ROM nm_get_network_data: gets operator name from network Nov 24, 2005 DR: OMAPS00045909 - Shashi Shekar B.S. Description: Improve IMEI control mechanism Solution : When MMI calls sAT_PLUSCFUN, if an IMEI invalid error is returned, we will block on that screen & will not allow the user to browse menus further, since the PS will not be booted at all!!! July 14, 2005 REF: CRR 31916 x0021334 Description: rCI_PercentCOPS() and rAT_PercentCOPS() is not implemented Solution: rAT_PercentCOPS() is implemented. Mar 01, 2005 REF: ENH 29327 xdeepadh Bug:Locosto MMI Optimization Fix:The changes done for the Golite optimization have been utilised for color build. This is done by removing the functions under #ifndef MMI_LITE. The static vaiable T_MFW_PLMN_LIST plmn_list has been made local variable. It has been dynamically allocated and deallocated. Aug 16, 2004 REF: CRR 24293 Deepa M.D Bug:Go-lite optimisation dynamic allocation of variable 'plmn_list' Fix:The static vaiable T_MFW_PLMN_LIST plmn_list has been made local variable. It has been dynamically allocated and deallocated. Aug 16, 2004 REF: CRR 24323 Deepa M.D Bug:Clenup of sprintf used for tracing Fix:Replace the char buf[]; sprintf (buf, "...", ...); TRACE_EVENT (buf); statements by TRACE_EVENT_PX $ Sep 23, 2004 REF: CRR 24562 xvilliva Bug: Enable/disable the manual network selection option depending on ENS. Fix: If the manual network selection is disabled we check if an error is returned and set the global g_ensErr. May 22, 2006 X0047685 Removed pref_plmn for if not defined FF_2TO1_PS * * ***************** Version 39 ***************** * User: Es Date: 2.03.00 Time: 16:31 * Updated in $/GSM/Condat/MS/SRC/MFW * use 'aci_delete()' to clear the primitive routing for mfw_nm. * * ***************** Version 38 ***************** * User: Vo Date: 16.02.00 Time: 14:22 * Updated in $/GSM/Condat/MS/SRC/MFW * * ***************** Version 37 ***************** * User: Vo Date: 11.02.00 Time: 12:57 * Updated in $/GSM/Condat/MS/SRC/MFW * Bug fix: limited service * * ***************** Version 36 ***************** * User: Vo Date: 11.02.00 Time: 11:01 * Updated in $/GSM/Condat/MS/SRC/MFW * add limited service indication * * ***************** Version 35 ***************** * User: Vo Date: 28.01.00 Time: 12:48 * Updated in $/GSM/Condat/MS/SRC/MFW * Limited service * * ***************** Version 34 ***************** * User: Vo Date: 20.01.00 Time: 13:17 * Updated in $/GSM/Condat/MS/SRC/MFW * Add new methodes to save preferred PLMN entry (change interface * function nm_change_pref_plmn()) * * ***************** Version 33 ***************** * User: Vo Date: 22.12.99 Time: 15:59 * Updated in $/GSM/Condat/MS/SRC/MFW * New: Request of preferred PLMN memory of SIM card * * ***************** Version 32 ***************** * User: Vo Date: 3.12.99 Time: 12:16 * Updated in $/GSM/Condat/MS/SRC/MFW * remove the request of maximum/used preferred PLMN list * * ***************** Version 31 ***************** * User: Vo Date: 2.12.99 Time: 13:28 * Updated in $/GSM/Condat/MS/SRC/MFW * * ***************** Version 30 ***************** * User: Vo Date: 2.12.99 Time: 13:25 * Updated in $/GSM/Condat/MS/SRC/MFW * New: request of max/used perferred PLMN list * * ***************** Version 29 ***************** * User: Vo Date: 21.10.99 Time: 13:24 * Updated in $/GSM/Condat/MS/SRC/MFW * changed of read/change perferred PLMN list * add event for successful de-registration | | ***************** Version 28 ***************** | User: Le Date: 8.10.99 Time: 13:38 | Updated in $/GSM/Condat/MS/SRC/MFW * * ***************** Version 27 ***************** * User: Es Date: 16.09.99 Time: 16:56 * Updated in $/GSM/DEV/MS/SRC/MFW * reordered include statements due to addons in mfw_phb.h * * ***************** Version 26 ***************** * User: Vo Date: 13.09.99 Time: 11:39 * Updated in $/GSM/DEV/MS/SRC/MFW * Bug fix: registration with numeric network format * * ***************** Version 25 ***************** * User: Vo Date: 30.08.99 Time: 14:03 * Updated in $/GSM/DEV/MS/SRC/MFW * bug fix * new function * * ***************** Version 24 ***************** * User: Vo Date: 2.07.99 Time: 18:16 * Updated in $/GSM/DEV/MS/SRC/MFW * * ***************** Version 23 ***************** * User: Vo Date: 20.05.99 Time: 17:39 * Updated in $/GSM/DEV/MS/SRC/MFW * * ***************** Version 22 ***************** * User: Vo Date: 28.04.99 Time: 16:11 * Updated in $/GSM/DEV/MS/SRC/MFW * * ***************** Version 21 ***************** * User: Vo Date: 31.03.99 Time: 14:09 * Updated in $/GSM/DEV/MS/SRC/MFW * * ***************** Version 20 ***************** * User: Es Date: 15.03.99 Time: 18:21 * Updated in $/GSM/DEV/MS/SRC/MFW * recode * * ***************** Version 19 ***************** * User: Vo Date: 17.02.99 Time: 19:03 * Updated in $/GSM/DEV/MS/SRC/MFW * * ***************** Version 18 ***************** * User: Vo Date: 12.02.99 Time: 18:59 * Updated in $/GSM/DEV/MS/SRC/MFW * * ***************** Version 17 ***************** * User: Vo Date: 9.02.99 Time: 14:54 * Updated in $/GSM/DEV/MS/SRC/MFW * * ***************** Version 16 ***************** * User: Vo Date: 12.01.99 Time: 14:55 * Updated in $/GSM/DEV/MS/SRC/MFW * * ***************** Version 15 ***************** * User: Es Date: 23.12.98 Time: 15:47 * Updated in $/GSM/DEV/MS/SRC/MFW * * ***************** Version 14 ***************** * User: Es Date: 18.12.98 Time: 13:04 * Updated in $/GSM/DEV/MS/SRC/MFW * * ***************** Version 13 ***************** * User: Es Date: 8.12.98 Time: 16:53 * Updated in $/GSM/DEV/MS/SRC/MFW * * ***************** Version 11 ***************** * User: Vo Date: 1.12.98 Time: 15:43 * Updated in $/GSM/DEV/MS/SRC/MFW * * ***************** Version 10 ***************** * User: Vo Date: 30.11.98 Time: 17:49 * Updated in $/GSM/DEV/MS/SRC/MFW * * ***************** Version 9 ***************** * User: Vo Date: 24.11.98 Time: 21:40 * Updated in $/GSM/DEV/MS/SRC/MFW * first successful compilation of MFW * * ***************** Version 8 ***************** * User: Vo Date: 13.11.98 Time: 16:21 * Updated in $/GSM/DEV/MS/SRC/MFW * * ***************** Version 7 ***************** * User: Es Date: 12.11.98 Time: 13:50 * Updated in $/GSM/DEV/MS/SRC/MFW | | ***************** Version 6 ***************** | User: Le Date: 11.11.98 Time: 13:35 | Updated in $/GSM/DEV/MS/SRC/MFW | | ***************** Version 5 ***************** | User: Le Date: 10.11.98 Time: 16:07 | Updated in $/GSM/DEV/MS/SRC/MFW | | ***************** Version 4 ***************** | User: Le Date: 10.11.98 Time: 11:08 | Updated in $/GSM/DEV/MS/SRC/MFW | | ***************** Version 3 ***************** | User: Le Date: 27.10.98 Time: 15:59 | Updated in $/GSM/DEV/MS/SRC/MFW | | ***************** Version 2 ***************** | User: Le Date: 21.10.98 Time: 16:20 | Updated in $/GSM/DEV/MS/SRC/MFW | | ***************** Version 1 ***************** | User: Le Date: 21.10.98 Time: 10:33 | Created in $/GSM/DEV/MS/SRC/MFW */ #define ENTITY_MFW #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_nm.h" #include "mfw_sim.h" #include "mfw_sima.h" #include "mfw_nmi.h" #include "mfw_simi.h" #include "mfw_nma.h" #include "mfw_acie.h" #include "mfw_phb.h" #include "mfw_cm.h" #include "mfw_sms.h" #include "mfw_win.h" // June 02, 2006 DR: OMAPS00078005 x0021334 #ifdef FF_TIMEZONE #include "mfw_td.h" #endif #include "ksd.h" #include "psa.h" #include "mfw_ss.h" #include "mfw_ssi.h" #if defined (FAX_AND_DATA) #include "aci_fd.h" #endif #include "mfw_ffs.h" #include "message.h" #include "prim.h" #include "aci_cmh.h" //GW 22-11-01 - Added #ifdef SIM_TOOLKIT #include "mfw_sat.h" #endif #ifndef NEPTUNE_BOARD #ifdef TI_PS_OP_OPN_TAB_ROMBASED /* Changes for ROM data */ /* Operator List size in ROM. Should go to where the decompression algo is present*/ #define PLMN_OPER_LST_SIZE_ROM 628 /* Changes for ROM data extern const T_OPER_NTRY_FIXED operListFixed[]; Side access into cus_aci.h Above decl no more required */ EXTERN const UBYTE *ptr_plmn_compressed; EXTERN SHORT cmhMM_decodePlmn (T_OPER_ENTRY *oper, const UBYTE *plmn_comp_entry); EXTERN USHORT cmhMM_PlmnEntryLength (const UBYTE *plmn_comp_entry); #else extern const T_OPER_NTRY_FIXED operListFixed[]; /* Side access into cus_aci.h */ #endif #else extern const T_OPER_NTRY operList[]; #endif EXTERN MfwHdr * current_mfw_elem; U8 mfw_IMSI [LONG_NAME]; /* expanded IMSI (ASCIIZ) */ static U8 last_selected_mode = NOT_PRESENT_8BIT; static U8 reg_stat; static U8 reg_flag; #ifdef NO_ASCIIZ static T_MFW_SP_NAME service_provider_name; #else static U8 service_provider_name [LONG_NAME]; #endif static U8 display_condition; static T_MFW_PREF_PLMN_LIST pplmn_list; static T_MFW_NET_IND net_ind; static T_MFW_TIME_IND tim_ind; static UBYTE mfwPplmnReq; static BOOL sat_update = FALSE; // Sep 23, 2004 REF: CRR 24562 xvilliva int g_ensErr = 0; /*SPR#2122 - DS - Commented out. Now operator list is dynamically allocated in nm_avail_plmn_list() *static T_ACI_COPS_OPDESC oper_list [MAX_OPER]; */ static int nmCommand (U32 cmd, void *h); /* handle window commands */ static void nm_search_reg_status(void); U8 pplmnCnt; U8 pplmnCmd; static int pSlot; /* primitive handler slot */ /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_init | +--------------------------------------------------------------------+ PURPOSE : Initialize network manager */ int nm_init (void) { TRACE_FUNCTION("nm_init()"); if (last_selected_mode == NOT_PRESENT_8BIT) { last_selected_mode = FFS_flashData.PLMN_selection_mode; } /* install prim handler */ pSlot = aci_create(nma_response_cb,NULL); reg_flag = 0; mfwPplmnReq = 0; reg_stat = NOT_PRESENT_8BIT; sat_update = FALSE; mfwCommand[MfwTypNm] = (MfwCb) nmCommand; return last_selected_mode; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_exit | +--------------------------------------------------------------------+ PURPOSE : Finalize network manager */ void nm_exit (void) { /* remove prim handler */ aci_delete(pSlot); last_selected_mode = NOT_PRESENT_8BIT; reg_stat = NOT_PRESENT_8BIT; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_create | +--------------------------------------------------------------------+ PURPOSE : Create network manager */ MfwHnd nm_create (MfwHnd hWin, MfwEvt event, MfwCb cbfunc) { MfwHdr *hdr; T_MFW_NM *nm_para; MfwHdr *insert_status =0; TRACE_FUNCTION("nm_create()"); hdr = (MfwHdr *) mfwAlloc(sizeof(MfwHdr)); nm_para = (T_MFW_NM *) mfwAlloc(sizeof(T_MFW_NM)); if (!hdr || !nm_para) { TRACE_ERROR("ERROR: nm_create() Mem Alloc Failed."); if(hdr) mfwFree((U8*)hdr,sizeof(MfwHdr)); if(nm_para) mfwFree((U8*)nm_para,sizeof(T_MFW_NM)); return FALSE; } nm_para->emask = event; nm_para->handler = cbfunc; hdr->data = nm_para; /* store parameter in node */ hdr->type = MfwTypNm; /* type of event handler */ insert_status = mfwInsert((MfwHdr *) hWin,hdr); if(!insert_status) { TRACE_ERROR("ERROR: nm_create() Failed to Install Handler. "); mfwFree((U8*)hdr,sizeof(MfwHdr)); mfwFree((U8*)nm_para ,sizeof(T_MFW_NM)); return 0; } return insert_status; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_delete | +--------------------------------------------------------------------+ PURPOSE : delete network manager */ MfwRes nm_delete (MfwHnd h) { TRACE_FUNCTION("nm_delete()"); if (!h || !((MfwHdr *) h)->data) return MfwResIllHnd; if (!mfwRemove((MfwHdr *) h)) return MfwResIllHnd; mfwFree(((MfwHdr *) h)->data,sizeof(T_MFW_NM)); mfwFree(h,sizeof(MfwHdr)); return MfwResOk; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_sign_exec | +--------------------------------------------------------------------+ PURPOSE : dispatch network management signal */ static int nm_sign_exec (MfwHdr *cur_elem, MfwEvt event, T_MFW_NM_PARA * para) { TRACE_FUNCTION("nm_sign_exec()"); while (cur_elem) { if (cur_elem->type == MfwTypNm) { T_MFW_NM *nm_data; nm_data = (T_MFW_NM *) cur_elem->data; if (nm_data->emask & event) { nm_data->event = event; switch (event) { case E_NM_FULL_SERVICE: //x0pleela 9 Feb, 2006 ER:OMAPS00065203 //Handling E_NM_OPN for operator name display case E_NM_OPN: memcpy(&nm_data->para.ident,para, sizeof(T_MFW_NETWORK_STRUCT)); break; case E_NM_PLMN_LIST: memcpy(&nm_data->para.plmns,para, sizeof(T_MFW_PLMN_LIST)); break; case E_NM_PREF_PLMN_LIST: memcpy(&nm_data->para.pplmns,para, sizeof(T_MFW_PREF_PLMN_LIST)); break; case E_NM_PPLMN_MEM: memcpy(&nm_data->para.pplmn_mem,para, sizeof(T_MFW_PPLMN_MEM)); break; case E_NM_CELL_SELECT: memcpy(&nm_data->para.cell_info,para, sizeof(T_MFW_CELL_STRUCT)); break; case E_MFW_NET_IND: memcpy(&nm_data->para.net_info,para, sizeof(T_MFW_NET_IND)); break; case E_MFW_TIME_IND: memcpy(&nm_data->para.tim_info,para, sizeof(T_MFW_TIME_IND)); break; } if (nm_data->handler) { // PATCH LE 06.06.00 // store current mfw elem current_mfw_elem = cur_elem; // END PATCH LE 06.06.00 if ((*(nm_data->handler)) (nm_data->event, (void *) &nm_data->para)) return TRUE; } } } cur_elem = cur_elem->next; } return FALSE; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_signal | +--------------------------------------------------------------------+ PURPOSE : Send a signal */ static void nm_signal (MfwEvt event, void *para) { UBYTE temp=0; TRACE_FUNCTION("nm_signal()"); #ifndef FF_POWER_MANAGEMENT temp = dspl_Enable(0); #else /*OMAPS00098881 (removing power variant) a0393213(Prabakar) display is enabled only when lcd refresh is needed*/ if(FFS_flashData.refresh == 1) temp = dspl_Enable(0); #endif if (mfwSignallingMethod EQ 0) { if (mfwFocus) if (nm_sign_exec(mfwFocus,event,para)) { #ifndef FF_POWER_MANAGEMENT dspl_Enable(temp); #else /*OMAPS00098881 (removing power variant) a0393213(Prabakar) display is enabled only when lcd refresh is needed*/ if(FFS_flashData.refresh == 1) dspl_Enable(temp); #endif return; } if (mfwRoot) nm_sign_exec(mfwRoot,event,para); } else { MfwHdr * h = 0; /* * Focus set, then start here */ if (mfwFocus) h = mfwFocus; /* * Focus not set, then start root */ if (!h) h = mfwRoot; /* * No elements available, return */ while (h) { /* * Signal consumed, then return */ if (nm_sign_exec (h, event, para)) { #ifndef FF_POWER_MANAGEMENT dspl_Enable(temp); #else /*OMAPS00098881 (removing power variant) a0393213(Prabakar) display is enabled only when lcd refresh is needed*/ if(FFS_flashData.refresh == 1) dspl_Enable(temp); #endif return; } /* * All windows tried inclusive root */ if (h == mfwRoot) { #ifndef FF_POWER_MANAGEMENT dspl_Enable(temp); #else /*OMAPS00098881 (removing power variant) a0393213(Prabakar) display is enabled only when lcd refresh is needed*/ if(FFS_flashData.refresh == 1) dspl_Enable(temp); #endif return; } /* * get parent window */ h = mfwParent(mfwParent(h)); if(h) h = ((MfwWin * )(h->data))->elems; } nm_sign_exec (mfwRoot, event, para); } #ifndef FF_POWER_MANAGEMENT dspl_Enable(temp); #else /*OMAPS00098881 (removing power variant) a0393213(Prabakar) display is enabled only when lcd refresh is needed*/ if(FFS_flashData.refresh == 1) dspl_Enable(temp); #endif } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_set_mode | +--------------------------------------------------------------------+ PURPOSE : Change registration mode */ void nm_set_mode (U8 mode) { TRACE_FUNCTION("nm_set_mode()"); if (mode != NM_AUTOMATIC && mode != NM_MANUAL) return; if (mode != last_selected_mode) { last_selected_mode = mode; { FFS_flashData.PLMN_selection_mode = mode; flash_write(); } } } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_get_mode | +--------------------------------------------------------------------+ PURPOSE : Get registration mode */ T_MFW nm_get_mode () { return last_selected_mode; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_activate | +--------------------------------------------------------------------+ PURPOSE : Notify about SIM card activation */ void nm_activate (U8 result) { //TRACE_FUNCTION("nm_activate()"); } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_reg_flag_req | +--------------------------------------------------------------------+ PURPOSE : Notify about SIM card activation */ T_MFW nm_reg_flag_req() { return reg_flag; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_mmi_parameters | +--------------------------------------------------------------------+ PURPOSE : Notify about relevant parameters */ #ifdef FF_2TO1_PS void nm_mmi_parameters (T_SIM_imsi_field *imsi, T_SIM_pref_plmn *plmn) { void simDecodeIMSI (U8 *ci, U8 li, U8 *di); TRACE_FUNCTION("nm_mmi_parameters()"); simDecodeIMSI(imsi->field,imsi->c_field,mfw_IMSI); } #else void nm_mmi_parameters (T_imsi_field *imsi) { void simDecodeIMSI (U8 *ci, U8 li, U8 *di); TRACE_FUNCTION("nm_mmi_parameters()"); simDecodeIMSI(imsi->field,imsi->c_field,mfw_IMSI); } #endif /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_pref_plmn_list | +--------------------------------------------------------------------+ PURPOSE : Request preferred PLMN list */ void nm_pref_plmn_list(T_MFW_NETWORK_STRUCT *pplmn, UBYTE count, SHORT start) { SHORT lastIdx; T_ACI_CPOL_OPDESC operLst[MAX_OPER]; T_ACI_RETURN res; UBYTE i, j; TRACE_FUNCTION("nm_pref_plmn_list()"); pplmn_list.count = 0; pplmn_list.plmn = pplmn; pplmnCnt = count; j = 0; while (1) { res = qAT_PlusCPOL(CMD_SRC_LCL, start, &lastIdx, operLst, CPOL_MOD_CompactList); if (res == AT_EXCT) return; if (res == AT_CMPL) { for (i=0; i<MAX_OPER; i++) { if (operLst[i].index == -1 OR pplmn_list.count >= pplmnCnt) break; pplmn_list.plmn[j].index = operLst[i].index; #ifdef NO_ASCIIZ sAT_PlusCOPSE((UBYTE *)operLst[i].oper, (UBYTE)operLst[i].format, &pplmn_list.plmn[j].network_long, &pplmn_list.plmn[j].network_short, pplmn_list.plmn[j].network_numeric); #else sAT_PlusCOPSE((UBYTE *)operLst[i].oper, (UBYTE)operLst[i].format, pplmn_list.plmn[j].network_long, pplmn_list.plmn[j].network_short, pplmn_list.plmn[j].network_numeric); #endif pplmn_list.count++; j++; } if (i < MAX_OPER OR (j EQ pplmnCnt)) { nm_signal(E_NM_PREF_PLMN_LIST, &pplmn_list); return; } start = lastIdx + 1; } else { nm_signal(E_NM_PREF_PLMN_LIST, &pplmn_list); return; } } } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : rAT_PlusCPOL | +--------------------------------------------------------------------+ PURPOSE : callback of preferred PLMN list */ void rAT_PlusCPOL(SHORT startIdx, SHORT lastIdx, T_ACI_CPOL_OPDESC *operLst, SHORT usdNtry) { UBYTE i, j; SHORT endIdx; T_MFW_PPLMN_MEM pplmn_mem; TRACE_FUNCTION("nm_pref_plmn_list()"); if (mfwPplmnReq) { mfwPplmnReq = 0; pplmn_mem.maxRcd = (UBYTE)lastIdx; pplmn_mem.usedRcd = (UBYTE)usdNtry; nm_signal(E_NM_PPLMN_MEM, &pplmn_mem); return; } endIdx = lastIdx; j = 0; while (1) { for (i=0; i<MAX_OPER; i++) { if (operLst[i].index == -1 OR pplmn_list.count >= pplmnCnt) break; pplmn_list.plmn[j].index = operLst[i].index; #ifdef NO_ASCIIZ sAT_PlusCOPSE((UBYTE *)operLst[i].oper, (UBYTE)operLst[i].format, &pplmn_list.plmn[j].network_long, &pplmn_list.plmn[j].network_short, pplmn_list.plmn[j].network_numeric); #else sAT_PlusCOPSE((UBYTE *)operLst[i].oper, (UBYTE)operLst[i].format, pplmn_list.plmn[j].network_long, pplmn_list.plmn[j].network_short, pplmn_list.plmn[j].network_numeric); #endif pplmn_list.count++; j++; } if ((i<MAX_OPER) OR (j EQ pplmnCnt)) { nm_signal(E_NM_PREF_PLMN_LIST, &pplmn_list); return; } startIdx = endIdx + 1; if (qAT_PlusCPOL(CMD_SRC_LCL, startIdx, &endIdx, operLst, CPOL_MOD_CompactList) != AT_CMPL) { nm_signal(E_NM_PREF_PLMN_LIST, &pplmn_list); return; } } } /* +----------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_change_pref_plmn | +----------------------------------------------------------------------+ PURPOSE : Save/Change/Delete a preferred PLMN */ T_MFW_NM_RETURN nm_change_pref_plmn(T_MFW_PPLMN_MODE mode, SHORT index, SHORT index2, UBYTE *network_numeric) { SHORT idx; T_ACI_CPOL_FRMT format; CHAR * oper; SHORT idx2; T_ACI_CPOL_MOD md; TRACE_FUNCTION("nm_change_pref_plmn()"); switch (mode) { case NEW_PREF_PLMN: idx = -1; idx2 = -1; format = CPOL_FRMT_Numeric; oper = (CHAR *)network_numeric; md = CPOL_MOD_CompactList; break; case REPLACE_PREF_PLMN: idx = index; idx2 = -1; format = CPOL_FRMT_Numeric; oper = (CHAR *)network_numeric; md = CPOL_MOD_CompactList; break; case DELETE_PREF_PLMN: idx = index; idx2 = -1; format = CPOL_FRMT_NotPresent; oper = NULL; md = CPOL_MOD_CompactList; break; case INSERT_PREF_PLMN: idx = index; idx2 = -1; format = CPOL_FRMT_Numeric; oper = (CHAR *)network_numeric; md = CPOL_MOD_Insert; break; case CHANGE_PREF_PLMN: idx = index; idx2 = index2; format = CPOL_FRMT_Numeric; oper = (CHAR *)network_numeric; md = CPOL_MOD_CompactList; break; default: return NM_ERR; } if (sAT_PlusCPOL(CMD_SRC_LCL, idx, format, oper, idx2, md) != AT_EXCT) return NM_ERR; pplmnCmd = CHANGE_PREF_PLMN; return NM_OK; } /* +----------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_change_pref_plmn_longname | +----------------------------------------------------------------------+ PURPOSE : Change a preferred PLMN using longname. added for SPR 2635. */ T_MFW_NM_RETURN nm_change_pref_plmn_longname(T_MFW_PPLMN_MODE mode, SHORT index, SHORT index2, char *network_long) { SHORT idx; T_ACI_CPOL_FRMT format; CHAR * oper; SHORT idx2; T_ACI_CPOL_MOD md; TRACE_FUNCTION("nm_change_pref_plmn()"); switch (mode) { case REPLACE_PREF_PLMN: idx = index; idx2 = -1; format = CPOL_FRMT_Long; oper = (CHAR *)network_long; md = CPOL_MOD_CompactList; break; default: return NM_ERR; } if (sAT_PlusCPOL(CMD_SRC_LCL, idx, format, oper, idx2, md) != AT_EXCT) return NM_ERR; pplmnCmd = CHANGE_PREF_PLMN; return NM_OK; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_ok_pref_plmn | +--------------------------------------------------------------------+ PURPOSE : The change of preferred PLMN is successful. */ void nm_ok_pref_plmn(void) { TRACE_FUNCTION("nm_ok_pref_plmn()"); if (pplmnCmd == CHANGE_PREF_PLMN) { pplmnCmd = CMD_NOT_PRESENT; nm_signal(E_NM_CHANGE_PPLMN_OK, 0); } } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_error_pref_plmn | +--------------------------------------------------------------------+ PURPOSE : The change of preferred PLMN is failed. */ void nm_error_pref_plmn(void) { TRACE_FUNCTION("nm_error_pref_plmn()"); if (pplmnCmd == CHANGE_PREF_PLMN) { pplmnCmd = CMD_NOT_PRESENT; nm_signal(E_NM_CHANGE_PPLMN_ERR, 0); return; } if (mfwPplmnReq) mfwPplmnReq = 0; pplmn_list.count = 0; nm_signal(E_NM_PREF_PLMN_LIST, &pplmn_list); } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_copy_plmn_list | +--------------------------------------------------------------------+ PURPOSE : Write the PLMN information in PLMN list */ void nm_copy_plmn_list (T_MFW_NETWORK_STRUCT *plmn, T_ACI_COPS_OPDESC *operLst) { U8 *forbidden_id; U8 *fieldstrength; TRACE_FUNCTION("nm_copy_plmn_list()"); #ifdef NO_ASCIIZ plmn->network_long.len = 0; plmn->network_short.len = 0; memset(plmn->network_numeric, 0, NUMERIC_LENGTH); if (operLst->longOper) { USHORT length=strlen((const char *)operLst->longOper); plmn->network_long.len = MINIMUM(LONG_NAME-1, length); memcpy (plmn->network_long.data, operLst->longOper, plmn->network_long.len); plmn->network_long.data[plmn->network_long.len] = '\0'; plmn->network_long.dcs = MFW_ASCII; } if (operLst->shortOper) { USHORT length=strlen((const char *)operLst->shortOper); plmn->network_short.len = MINIMUM(SHORT_NAME-1, length); memcpy (plmn->network_short.data, operLst->shortOper, plmn->network_short.len); plmn->network_short.data[plmn->network_short.len] = '\0'; plmn->network_short.dcs = MFW_ASCII; } #else memset(plmn->network_long, 0, LONG_NAME); memset(plmn->network_short, 0, SHORT_NAME); memset(plmn->network_numeric, 0, NUMERIC_LENGTH); if (operLst->longOper) strncpy((char *)plmn->network_long, (char *)operLst->longOper, LONG_NAME-1); if (operLst->shortOper) strncpy((char *)plmn->network_short, (char *)operLst->shortOper, SHORT_NAME-1); #endif if (operLst->numOper) strncpy((char *)plmn->network_numeric, (char *)operLst->numOper, NUMERIC_LENGTH-1); if (operLst->status == COPS_STAT_Available || operLst->status == COPS_STAT_Current) plmn->forbidden_indicator = MFW_PLMN_AVAILABLE; else plmn->forbidden_indicator = MFW_PLMN_FORBIDDEN; if (!strncmp((char *) mfw_IMSI,(char *) plmn->network_numeric,5)) plmn->roaming_indicator = 0; else plmn->roaming_indicator = 1; sAT_PlusCOPSF(&forbidden_id,&fieldstrength); plmn->fieldstrength = fieldstrength; } /* +---------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_pplmn_mem_req | +---------------------------------------------------------------------+ PURPOSE : Request the maximum number of preferred PLMN records in SIM card */ T_MFW_NM_RETURN nm_pplmn_mem_req(void) { T_ACI_RETURN res; SHORT maxRcd, usedRcd; T_MFW_PPLMN_MEM pplmn_mem; TRACE_FUNCTION("nm_pplmn_mem_req()"); res = tAT_PlusCPOL(CMD_SRC_LCL, &maxRcd, &usedRcd); if (res == AT_EXCT) { mfwPplmnReq = 1; return NM_OK; } if (res == AT_CMPL) { pplmn_mem.maxRcd = (UBYTE)maxRcd; pplmn_mem.usedRcd = (UBYTE)usedRcd; nm_signal(E_NM_PPLMN_MEM, &pplmn_mem); return NM_OK; } return NM_ERR; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_registration | +--------------------------------------------------------------------+ PURPOSE : Start registration */ T_MFW nm_registration (U8 mode, U8 freq_bands, U8 limited) { U8 sim_stat; TRACE_FUNCTION("nm_registration()"); sAT_Abort(CMD_SRC_LCL, AT_CMD_NRG); sim_stat = sim_status_check(); reg_flag = 1; if (limited) { if (sAT_PercentNRG(CMD_SRC_LCL, NRG_RGMD_Auto, NRG_SVMD_Limited, NRG_FRMT_Numeric, NULL) != AT_EXCT) TRACE_EVENT("Limited Service error: SAT_PercentNRG"); return sim_stat; } // Nov 24, 2005, a0876501, DR: OMAPS00045909 if (!limited && sim_stat == IMEI_NOT_VALID) return IMEI_NOT_VALID; if (!limited && sim_stat != SIM_ACTIVE) return SIM_NOT_ACTIVE; if (mode == NM_MANUAL) { /* Apr 13, 2004 REF: CRR 16303 JuanVi Jativa-Villoldo sim_spn_req(); Moved to the function rAT_PlusCFUNP */ /* May 15, 2006, a0393213 (R.Prabakar), OMAPS00075777 Description : It is supposed that the sample register itself automatically (in Manual Mode) to the last manual selected HPLMN cell before the power cycle, and this does not happen; instead this, the sample shows up the available networks list Fix : call to nm_avail_plmn_list() is changed to call to sAT_PercentNRG() */ if (sAT_PercentNRG(CMD_SRC_LCL, NRG_RGMD_Manual, NRG_SVMD_Full, NRG_FRMT_Numeric, NULL) != AT_EXCT) { TRACE_ERROR("sAT_PercentNRG error"); } } else { if (sAT_PercentNRG(CMD_SRC_LCL, NRG_RGMD_Auto, NRG_SVMD_Full, NRG_FRMT_Numeric, NULL) != AT_EXCT) { TRACE_ERROR("sAT_PercentNRG error"); } /* Apr 13, 2004 REF: CRR 16303 JuanVi Jativa-Villoldo sim_spn_req(); Moved to the function rAT_PlusCFUNP */ } return SIM_ACTIVE; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_avail_plmn_list | +--------------------------------------------------------------------+ PURPOSE : Request the available PLMN list SPR#2122 - DS - Restructured to make oper_list dynamically allocated */ void nm_avail_plmn_list () { T_ACI_RETURN result; int i; SHORT last_ind = 0; T_ACI_COPS_OPDESC* oper_list = NULL; //Mar 01, 2005 REF: ENH 29327 xdeepadh //Dynamically allocate the plmn_list. T_MFW_PLMN_LIST* plmn_list; plmn_list = (T_MFW_PLMN_LIST*)mfwAlloc(sizeof(T_MFW_PLMN_LIST)); if(plmn_list == NULL) { TRACE_EVENT("plmn_list malloc failed"); return ; } TRACE_FUNCTION("nm_avail_plmn_list()"); /* Dynamically allocate operator list buffer */ oper_list = (T_ACI_COPS_OPDESC*)mfwAlloc(sizeof(T_ACI_COPS_OPDESC)*MAX_OPER); if (oper_list == NULL) { TRACE_ERROR("ERROR: Failed to allocate oper list buffer"); //Mar 01, 2005 REF: ENH 29327 xdeepadh //Deallocate the plmn_list if(plmn_list !=NULL) { mfwFree((U8*)plmn_list,sizeof(T_MFW_PLMN_LIST)); plmn_list=NULL; } return; } // PATCH JVU - PLMN selection during registration sAT_Abort(CMD_SRC_LCL, AT_CMD_NRG); // END PATCH JVU - PLMN selection during registration plmn_list->count = 0; result = tAT_PlusCOPS(CMD_SRC_LCL,0,&last_ind,oper_list); if (result == AT_FAIL || result == AT_BUSY) { TRACE_ERROR("ERROR: tAT_PlusCOPS error"); //Sep 23, 2004 REF: CRR 24562 xvilliva //If AT_FAIL is returned, we query for the exact error //and set a variable accordingly. if(result == AT_FAIL) { ULONG err; err = qAT_ErrDesc(); switch (ACI_ERR_DESC_CLASS( err )) { case ACI_ERR_CLASS_Cme: if (ACI_ERR_DESC_NR( err ) == CME_ERR_OpNotAllow) { g_ensErr = 1; } break; } } /* Deallocate operator list buffer */ if (oper_list != NULL) { mfwFree((U8*)oper_list, sizeof(T_ACI_COPS_OPDESC)*MAX_OPER); oper_list = NULL; } nm_signal(E_NM_PLMN_LIST,plmn_list); //Mar 01, 2005 REF: ENH 29327 xdeepadh //Deallocate the plmn_list if(plmn_list !=NULL) { mfwFree((U8*)plmn_list,sizeof(T_MFW_PLMN_LIST)); plmn_list=NULL; } return; } if (result == AT_EXCT) { /* Deallocate operator list buffer */ if (oper_list != NULL) { mfwFree((U8*)oper_list, sizeof(T_ACI_COPS_OPDESC)*MAX_OPER); oper_list = NULL; } //Mar 01, 2005 REF: ENH 29327 xdeepadh //Deallocate the plmn_list if(plmn_list !=NULL) { mfwFree((U8*)plmn_list,sizeof(T_MFW_PLMN_LIST)); plmn_list=NULL; } return; /* wait for rAT_PlusCOPS() */ } if (last_ind > MAX_OPER) last_ind = MAX_OPER; for (i = 0; i <= last_ind; i++) nm_copy_plmn_list(&plmn_list->plmn[i], &oper_list[i]); /* Deallocate operator list buffer */ if (oper_list != NULL) { mfwFree((U8*)oper_list, sizeof(T_ACI_COPS_OPDESC)*MAX_OPER); oper_list = NULL; } plmn_list->count = i; nm_signal(E_NM_PLMN_LIST,plmn_list); //Mar 01, 2005 REF: ENH 29327 xdeepadh //Deallocate the plmn_list if(plmn_list !=NULL) { mfwFree((U8*)plmn_list,sizeof(T_MFW_PLMN_LIST)); plmn_list=NULL; } } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_home_plmn | +--------------------------------------------------------------------+ PURPOSE : Get the home PLMN name */ void nm_home_plmn (T_MFW_NETWORK_STRUCT *hplmn) { U8 oper[6]; /* get network operator */ strncpy((char *)oper, (char *)mfw_IMSI, 5); oper[5] = 0; #ifdef NO_ASCIIZ sAT_PlusCOPSE(oper, COPS_FRMT_Numeric, &hplmn->network_long, &hplmn->network_short, hplmn->network_numeric); #else sAT_PlusCOPSE(oper, COPS_FRMT_Numeric, hplmn->network_long, hplmn->network_short, hplmn->network_numeric); #endif } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_plmn_list | +--------------------------------------------------------------------+ PURPOSE : Request existing network list */ #ifndef NEPTUNE_BOARD #ifdef TI_PS_OP_OPN_TAB_ROMBASED int nm_plnm_list(T_MFW_NETWORK_STRUCT *plmn_list, int start, int count) { int i; /* Changes for ROM data */ const UBYTE *plmn_comp_entry; /* get a local pointer holder */ T_OPER_ENTRY oper; TRACE_FUNCTION("nm_plnm_list()"); /* PLMN_OPER_LST_SIZE_ROM is size of the PLMN operlist */ if (start >= PLMN_OPER_LST_SIZE_ROM) return 0; /* Changes for ROM data */ plmn_comp_entry = ptr_plmn_compressed; /* skip the first (start-1) number of plmn entries. */ i=0; while (i < start) { plmn_comp_entry += cmhMM_PlmnEntryLength (plmn_comp_entry); i+=1; } /* for each pointer in the list plmn_list */ i=0; do { /* Get first compressed PLMN entry */ cmhMM_decodePlmn (&oper, plmn_comp_entry); if (oper.longName NEQ NULL) { plmn_list[i].index = start+1; #ifdef NO_ASCIIZ sAT_PlusCOPSE((UBYTE *)oper.longName, COPS_FRMT_Long, &plmn_list[i].network_long, &plmn_list[i].network_short, plmn_list[i].network_numeric); #else sAT_PlusCOPSE((UBYTE *)oper.longName, COPS_FRMT_Long, plmn_list[i].network_long, plmn_list[i].network_short, plmn_list[i].network_numeric); #endif start++; } else { #ifdef NO_ASCIIZ plmn_list[i].network_long.len = 0; plmn_list[i].network_short.len = 0; plmn_list[i].network_numeric[0] = 0; #else plmn_list[i].network_long[0] = 0; plmn_list[i].network_short[0] = 0; plmn_list[i].network_numeric[0] = 0; #endif break; } /* Next compressed PLMN entry */ plmn_comp_entry += cmhMM_PlmnEntryLength (plmn_comp_entry); i+=1; } while (i < count); return PLMN_OPER_LST_SIZE_ROM; } #else int nm_plnm_list(T_MFW_NETWORK_STRUCT *plmn_list, int start, int count) { int i; int sum; TRACE_FUNCTION("nm_plnm_list()"); sum = 0; while (operListFixed[sum].longName != NULL) sum++; if (start >= sum) return 0; for (i=0; i<count; i++) { if (operListFixed[start].longName != NULL) { plmn_list[i].index = start+1; #ifdef NO_ASCIIZ sAT_PlusCOPSE((UBYTE *)operListFixed[start].longName, COPS_FRMT_Long, &plmn_list[i].network_long, &plmn_list[i].network_short, plmn_list[i].network_numeric); #else sAT_PlusCOPSE((UBYTE *)operListFixed[start].longName, COPS_FRMT_Long, plmn_list[i].network_long, plmn_list[i].network_short, plmn_list[i].network_numeric); #endif start++; } else { #ifdef NO_ASCIIZ plmn_list[i].network_long.len = 0; plmn_list[i].network_short.len = 0; plmn_list[i].network_numeric[0] = 0; #else plmn_list[i].network_long[0] = 0; plmn_list[i].network_short[0] = 0; plmn_list[i].network_numeric[0] = 0; #endif break; } } return sum; } #endif #else int nm_plnm_list(T_MFW_NETWORK_STRUCT *plmn_list, int start, int count) { int i; int sum; TRACE_FUNCTION("nm_plnm_list()"); sum = 0; while (operList[sum].longName != NULL) sum++; if (start >= sum) return 0; for (i=0; i<count; i++) { if (operList[start].longName != NULL) { plmn_list[i].index = start+1; #ifdef NO_ASCIIZ sAT_PlusCOPSE((UBYTE *)operList[start].longName, COPS_FRMT_Long, &plmn_list[i].network_long, &plmn_list[i].network_short, plmn_list[i].network_numeric); #else sAT_PlusCOPSE((UBYTE *)operList[start].longName, COPS_FRMT_Long, plmn_list[i].network_long, plmn_list[i].network_short, plmn_list[i].network_numeric); #endif start++; } else { #ifdef NO_ASCIIZ plmn_list[i].network_long.len = 0; plmn_list[i].network_short.len = 0; plmn_list[i].network_numeric[0] = 0; #else plmn_list[i].network_long[0] = 0; plmn_list[i].network_short[0] = 0; plmn_list[i].network_numeric[0] = 0; #endif break; } } return sum; } #endif /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_plmn_list_longnames | +--------------------------------------------------------------------+ PURPOSE : Request existing network list longnames. added for SPR 2635. */ #ifndef NEPTUNE_BOARD #ifdef TI_PS_OP_OPN_TAB_ROMBASED int nm_plnm_list_longnames(char**plmn_ln_list, int start, int count) { int i; /* Changes for ROM data */ const UBYTE *plmn_comp_entry; /* get a local pointer holder */ T_OPER_ENTRY oper; TRACE_FUNCTION("nm_plnm_list_longnames()"); /* PLMN_OPER_LST_SIZE_ROM is size of the PLMN operlist */ if (start >= PLMN_OPER_LST_SIZE_ROM) return 0; /* skip the first (start-1) number of plmn entries. */ i=0; while (i < start) { plmn_comp_entry += cmhMM_PlmnEntryLength (plmn_comp_entry); i+=1; } /* for each pointer in the list plmn_list */ i=0; do { /* Get first compressed PLMN entry */ cmhMM_decodePlmn (&oper, plmn_comp_entry); if (oper.longName NEQ NULL) { /*just set pointer to point at longname in ROM in ACI*/ plmn_ln_list[i] = (char*)oper.longName; start++; } else { plmn_ln_list[i] = NULL; break; } /* Next compressed PLMN entry */ plmn_comp_entry += cmhMM_PlmnEntryLength (plmn_comp_entry); i+=1; } while (i < count); return PLMN_OPER_LST_SIZE_ROM; } #else int nm_plnm_list_longnames(char**plmn_ln_list, int start, int count) { int i; int sum; TRACE_FUNCTION("nm_plnm_list_longnames()"); sum = 0; /*count the number of longnames*/ while (operListFixed[sum].longName != NULL) sum++; /*if we attempt read past the end of the list*/ if (start >= sum) return 0; /*for each pointer in the list*/ for (i=0; i<count; i++) { if (operListFixed[start].longName != NULL) { /*just set pointer to point at longname in ROM in ACI*/ plmn_ln_list[i] = (char*)operListFixed[start].longName; start++; } else { plmn_ln_list[i] = NULL; break; } } return sum; } #endif #else int nm_plnm_list_longnames(char**plmn_ln_list, int start, int count) { int i; int sum; TRACE_FUNCTION("nm_plnm_list_longnames()"); sum = 0; /*count the number of longnames*/ while (operList[sum].longName != NULL) sum++; /*if we attempt read past the end of the list*/ if (start >= sum) return 0; /*for each pointer in the list*/ for (i=0; i<count; i++) { if (operList[start].longName != NULL) { /*just set pointer to point at longname in ROM in ACI*/ plmn_ln_list[i] = (char*)operList[start].longName; start++; } else { plmn_ln_list[i] = NULL; break; } } return sum; } #endif /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_select_plmn | +--------------------------------------------------------------------+ PURPOSE : Select PLMN for registration */ void nm_select_plmn (U8 *network) { T_ACI_RETURN result; TRACE_FUNCTION("nm_select_plmn()"); result = sAT_PercentNRG(CMD_SRC_LCL, NRG_RGMD_Manual, NRG_SVMD_Full, NRG_FRMT_Numeric, (char *) network); result = AT_FAIL; if (result != AT_EXCT) { TRACE_ERROR("sAT_PercentNRG error"); //Sep 23, 2004 REF: CRR 24562 xvilliva //If AT_FAIL is returned, we query for the exact error //and set a variable accordingly. if(result == AT_FAIL) { ULONG err; err = qAT_ErrDesc(); switch (ACI_ERR_DESC_CLASS( err )) { case ACI_ERR_CLASS_Cme: if (ACI_ERR_DESC_NR( err ) == CME_ERR_OpNotAllow) { g_ensErr = 1; } break; } } } } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_spn_cnf | +--------------------------------------------------------------------+ PURPOSE : Notify about service provider name */ /*a0393213 lint warnings removal - type of error changed from SHORT to USHORT*/ void nm_spn_cnf (USHORT error, T_EF_SPN *efspn) { U8 i; USHORT simErr; TRACE_FUNCTION("nm_spn_cnf()"); #ifdef FF_2TO1_PS simErr = CAUSE_SIM_NO_ERROR; #else simErr = SIM_NO_ERROR; #endif #ifdef NO_ASCIIZ memset (service_provider_name.data, 0, sizeof(service_provider_name.data)); service_provider_name.len = 0; if (error EQ simErr) { for (i=0; (efspn->service_provider[i] != 0xFF) && (i < SP_NAME); i++) service_provider_name.data[i] = efspn->service_provider[i]; service_provider_name.len = i; } #else memset (service_provider_name, 0, sizeof(service_provider_name)); if (error EQ simErr) { for (i=0; (efspn->service_provider[i] != 0xFF) && (i < SP_NAME-1); i++) service_provider_name[i] = efspn->service_provider[i]; } #endif display_condition = efspn->display_condition & 0x01; #ifdef SIM_TOOLKIT if (sat_update) { sat_update = FALSE; satUpdateFiles ( TRUE, SIM_SPN ); } #endif } #ifdef SIM_TOOLKIT /* +---------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | | STATE : code ROUTINE : nm_sat_file_update | +---------------------------------------------------------------------+ PURPOSE : SIM file change indication */ void nm_sat_file_update(USHORT dataId) { /*a0393213 compiler warnings removal - removed serv_stat*/ TRACE_FUNCTION("nm_sat_file_update()"); switch (dataId) { case SIM_SPN: if (sim_serv_table_check(17) NEQ NO_ALLOCATED) { sat_update = TRUE; sim_read_sim(SIM_SPN, NOT_PRESENT_8BIT, 17); } else satUpdateFiles ( TRUE, SIM_SPN ); break; default: break; } } #endif /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_deregistration | +--------------------------------------------------------------------+ PURPOSE : Delete registration */ void nm_deregistration (void) { TRACE_FUNCTION ("nm_deregistration()"); if (sAT_PlusCFUN(CMD_SRC_LCL,CFUN_FUN_Minimum,CFUN_RST_NotPresent) != AT_EXCT) { TRACE_ERROR("sAT_PlusCFUN error"); } } /* +-----------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_ok_deregistration | +-----------------------------------------------------------------------+ PURPOSE : de-registration successful */ void nm_ok_deregistration (void) { TRACE_FUNCTION ("nm_ok_deregistration()"); nm_signal(E_NM_DEREGISTRATION, 0); } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_ok_cops | +--------------------------------------------------------------------+ PURPOSE : Successful end of operator selection */ void nm_ok_cops (void) { TRACE_FUNCTION("nm_ok_cops()"); nm_search_reg_status(); reg_flag = 0; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_ok_cops | +--------------------------------------------------------------------+ PURPOSE : Successful selection of band SPR919 - SH - added this function. */ void nm_ok_band (void) { TRACE_FUNCTION("nm_ok_band()"); nm_signal(E_NM_BAND, 0); } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_error_cops | +--------------------------------------------------------------------+ PURPOSE : error end of operator selection */ //x0pleela 30 May, 2007 DR: OMAPS00133201 //Passing T_ACI_CME_ERR as parameter void nm_error_cops ( T_ACI_CME_ERR err) { TRACE_FUNCTION("nm_error_cops()"); //x0pleela 30 May, 2007 DR: OMAPS00133201 if( err == CME_ERR_AbortedByNetwork ) nm_signal(E_NM_ABORT_NETWORK, 0); else nm_search_reg_status(); reg_flag = 0; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_reg_status | +--------------------------------------------------------------------+ PURPOSE : Check the registration status */ T_MFW nm_reg_status (void) { TRACE_FUNCTION("nm_reg_status()"); return reg_stat; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : rAT_PlusCOPS | +--------------------------------------------------------------------+ PURPOSE : Notify about available PLMN list NOTE : oper_list defines as char * Every operator (PLMN) uses 3 bytes // July 14, 2005 REF: CRR 31916 x0021334 // The functionality in rAT_PlusCOPS has been moved to new function 'nm_Plus_Percent_COPS()' which is common for rAT_PercentCOPS as well. //SPR#0777 - DS - Added check to make sure last_ind is valid. If invalid set to 0. // - Changed check to make last_ind equal to MAX_OPER-1 if last_ind is greater than MAX_OPER. // - Changed <= to < in nm_copy_plmn_list for loop. */ void rAT_PlusCOPS (S16 last_ind, T_ACI_COPS_OPDESC *operLst) { TRACE_FUNCTION ("rAT_PlusCOPS()"); nm_Plus_Percent_COPS(last_ind, operLst); } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : rAT_PercentCOPS | +--------------------------------------------------------------------+ PURPOSE : Notify about available PLMN list. Call is made to nm_Plus_Percent_COPS(). // July 14, 2005 REF: CRR 31916 x0021334 // New function 'rAT_PercentCOPS()' implemented. */ void rAT_PercentCOPS (S16 last_ind, T_ACI_COPS_OPDESC *operLst) { TRACE_FUNCTION ("rAT_PercentCOPS()"); nm_Plus_Percent_COPS(last_ind, operLst); } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_Plus_Percent_COPS | +--------------------------------------------------------------------+ PURPOSE : Notify about available PLMN list. Common function called from rAT_PlusCOPS and rAT_PercentCOPS // July 14, 2005 REF: CRR 31916 x0021334 // New function 'nm_Plus_Percent_COPS()' implemented. */ void nm_Plus_Percent_COPS (S16 last_ind, T_ACI_COPS_OPDESC *operLst) { int i; //Mar 01, 2005 REF: ENH 29327 xdeepadh //Dynamically allocate the plmn_list T_MFW_PLMN_LIST *plmn_list; /* Aug 09, 2007 REF: OMAPS00140507 x0045876 Added patch given by Dong Feng */ char longName[MAX_ALPHA_OPER_LEN] = { '\0' }; char shrtName[MAX_ALPHA_OPER_LEN] = { '\0' }; plmn_list=(T_MFW_PLMN_LIST*)mfwAlloc(sizeof(T_MFW_PLMN_LIST)); if(plmn_list==NULL) { TRACE_EVENT("plmn_list malloc failed"); return; } TRACE_FUNCTION ("nm_Plus_Percent_COPS()"); memset(plmn_list, 0, sizeof(T_MFW_PLMN_LIST)); if (operLst[0].status == COPS_STAT_Unknown) { nm_signal(E_NM_PLMN_LIST,plmn_list); //Mar 01, 2005 REF: ENH 29327 xdeepadh //Deallocate the plmn_list if(plmn_list !=NULL) { mfwFree((U8*)plmn_list,sizeof(T_MFW_PLMN_LIST)); plmn_list = NULL; } return; } /***************************Go-lite Optimization changes Start***********************/ // Aug 16, 2004 REF: CRR 24323 Deepa M.D TRACE_EVENT_P1("rAT_PlusCOPS: last_ind: %d",last_ind); /***************************Go-lite Optimization changes END***********************/ if (last_ind > 128) //Invalid index passed in. { last_ind = -1; } else { if (last_ind >= MAX_OPER) //Index is larger than max number of operators. { last_ind = MAX_OPER-1; } } //DS 27/5/2002 - changed <= to < for (i = 0; i <= last_ind; i++) /* operLst == oper_list !! */ { nm_copy_plmn_list(&plmn_list->plmn[i], &operLst[i]); } /* BEGIN: Aug 09, 2007 REF: OMAPS00140507 x0045876 Added patch given by Dong Feng */ for(i=0; i < MAX_OPER; i++) { if (operLst[i].status < 0) { break; } if (operLst[i].pnn) { if (operLst[i].long_len) { switch (operLst[i].long_ext_dcs>>4 & 0x07) { case 0x00: /* GSM default alphabet */ utl_cvtPnn7To8((UBYTE *)operLst[i].longOper, operLst[i].long_len, operLst[i].long_ext_dcs, (UBYTE *)longName); #ifdef NO_ASCIIZ plmn_list->plmn[i].network_long.len = 0; plmn_list->plmn[i].network_short.len = 0; if (operLst->longOper) { plmn_list->plmn[i].network_long.len = MINIMUM(LONG_NAME-1, strlen((char *)longName)); memcpy (plmn_list->plmn[i].network_long.data, longName, plmn_list->plmn[i].network_long.len); plmn_list->plmn[i].network_long.data[plmn_list->plmn[i].network_long.len] = '\0'; plmn_list->plmn[i].network_long.dcs = MFW_ASCII; } #else memset(plmn_list->plmn[i].network_long, 0, LONG_NAME); if (operLst->longOper) strncpy((char *)plmn_list->plmn[i].network_long, (char *)longName, LONG_NAME-1); #endif break; case 0x01: /* UCS2 */ TRACE_ERROR ("Unhandled UCS2 in PNN entry"); break; default: TRACE_ERROR ("Unknown DCS in PNN entry"); break; } } if (operLst[i].shrt_len) { switch (operLst[i].shrt_ext_dcs>>4 & 0x07) { case 0x00: /* GSM default alphabet */ utl_cvtPnn7To8((UBYTE *)operLst[i].shortOper, operLst[i].shrt_len, operLst[i].shrt_ext_dcs, (UBYTE *)shrtName); #ifdef NO_ASCIIZ plmn_list->plmn[i].network_short.len = 0; if (operLst->shortOper) { plmn_list->plmn[i].network_short.len = MINIMUM(SHORT_NAME-1, strlen((char *)shrtName)); memcpy (plmn_list->plmn[i].network_short.data, shrtName, plmn_list->plmn[i].network_short.len); plmn_list->plmn[i].network_short.data[plmn_list->plmn[i].network_short.len] = '\0'; plmn_list->plmn[i].network_short.dcs = MFW_ASCII; } #else memset(plmn_list->plmn[i].network_short, 0, SHORT_NAME); if (operLst->shortOper) strncpy((char *)plmn_list->plmn[i].network_short, (char *)shrtName, SHORT_NAME-1); #endif break; case 0x01: /* UCS2 */ TRACE_ERROR ("ERROR: Unhandled UCS2"); break; default: TRACE_ERROR ("ERROR: Unknown DCS"); break; } } } } /* END: Aug 09, 2007 REF: OMAPS00140507 x0045876 Added patch given by Dong Feng */ /***************************Go-lite Optimization changes Start***********************/ // Aug 16, 2004 REF: CRR 24323 Deepa M.D TRACE_EVENT_P1("rAT_PlusCOPS: Loop i val is %d",i); /***************************Go-lite Optimization changes END***********************/ plmn_list->count = i; nm_signal(E_NM_PLMN_LIST,plmn_list); //Mar 01, 2005 REF: ENH 29327 xdeepadh //Deallocate the plmn_list if(plmn_list !=NULL) { mfwFree((U8*)plmn_list,sizeof(T_MFW_PLMN_LIST)); plmn_list =NULL; } } /* +----------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_search_reg_status | +----------------------------------------------------------------------+ PURPOSE : Change registration status */ void nm_search_reg_status(void) { T_ACI_NRG_RGMD regMode; T_ACI_NRG_SVMD srvMode; T_ACI_NRG_FRMT oprFrmt; T_ACI_NRG_SVMD srvStat; U8 oper[LONG_NAME]; qAT_PercentNRG(CMD_SRC_LCL, ®Mode, &srvMode, &oprFrmt, &srvStat, (char *)oper); if (srvStat == NRG_SVMD_Limited) { reg_stat = MFW_LIMITED_SERVICE; nm_signal(E_NM_LIMITED_SERVICE,NULL); } if (srvStat == NRG_SVMD_NoSrv) { reg_stat = MFW_NO_SERVICE; nm_signal(E_NM_NO_SERVICE,NULL); } } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : rAT_PlusCREG | +--------------------------------------------------------------------+ PURPOSE : Change registration status */ void rAT_PlusCREG (T_ACI_CREG_STAT stat, USHORT lac, USHORT cid) { T_MFW_NETWORK_STRUCT plmn_ident; T_MFW_CELL_STRUCT cell; T_ACI_NRG_RGMD regMode; T_ACI_NRG_SVMD srvMode; T_ACI_NRG_FRMT oprFrmt; T_ACI_NRG_SVMD srvStat; USHORT cause; //Added for OMAPS00134509/ASTec32515 U8 oper[LONG_NAME]; TRACE_FUNCTION("rAT_PlusCREG()"); switch (stat) { case CREG_STAT_Reg: case CREG_STAT_Roam: reg_stat = MFW_FULL_SERVICE; qAT_PercentNRG(CMD_SRC_LCL, ®Mode, &srvMode, &oprFrmt, &srvStat, (char *)oper); #ifdef NO_ASCIIZ sAT_PlusCOPSE(oper,(U8) oprFrmt,&plmn_ident.network_long, &plmn_ident.network_short, plmn_ident.network_numeric); memcpy(plmn_ident.service_provider.data, service_provider_name.data, service_provider_name.len); plmn_ident.service_provider.len = service_provider_name.len; #else sAT_PlusCOPSE(oper,(U8) oprFrmt,plmn_ident.network_long, plmn_ident.network_short, plmn_ident.network_numeric); strcpy((char *) plmn_ident.service_provider, (char *) service_provider_name); #endif plmn_ident.display_condition = display_condition & 0x01; if (stat == CREG_STAT_Reg) plmn_ident.roaming_indicator = 0; if (stat == CREG_STAT_Roam) plmn_ident.roaming_indicator = 1; //x0pleela 08 Feb, 2006 ER: OMAPS00065203 nm_get_COPN( &plmn_ident ); nm_signal(E_NM_FULL_SERVICE,&plmn_ident); /* Cell ReSelection Code */ cell.ci = cid; cell.lid = lac; nm_signal(E_NM_CELL_SELECT,&cell); break; case CREG_STAT_NoSearch: case CREG_STAT_NotPresent: if (!reg_flag) nm_search_reg_status(); break; case CREG_STAT_Search: if (reg_flag) { reg_stat = MFW_SEARCH_NETWORK; nm_signal(E_NM_SEARCH_NETWORK,NULL); } else nm_search_reg_status(); break; //Sep 18,2006 DRT: OMAPS0090268 x0061088(Prachi) //Description : added case for Denied services,which send nm_signal. case CREG_STAT_Denied: //TISH, patch for ASTec32515/OMAPS00134509 //start qAT_PlusCEER( CMD_SRC_LCL, &cause); if (cause EQ 0x8488) // If SIM is rejected in authentification sim_invalid_ind(); else //end nm_signal(E_NM_FORBIDDEN_NETWORK, NULL); break; default: nm_search_reg_status(); break; } } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_abort_avail_plmn| +--------------------------------------------------------------------+ PURPOSE : Change registration status */ void nm_abort_avail_plmn(void) { sAT_Abort(CMD_SRC_LCL, AT_CMD_COPS); } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_nitz_info_ind | +--------------------------------------------------------------------+ PURPOSE : NITZ information indication */ #ifdef FF_2TO1_PS void nm_nitz_info_ind(T_MMREG_INFO_IND * mmr_info_ind) { UBYTE flag; TRACE_FUNCTION("nm_nitz_info_ind() "); flag = 0; /* BEGIN ADD: SUMIT: REQ : aligning to 5.x SAP definitions */ #ifdef NEPTUNE_BOARD /* copy country code and network code */ memset (net_ind.mcc, 0, PS_SIZE_MCC); memset (net_ind.mnc, 0, PS_SIZE_MNC_MAX); if (mmr_info_ind->v_plmn_id EQ TRUE) { flag = 1; memcpy (net_ind.mcc, mmr_info_ind->plmn_id.mcc, PS_SIZE_MCC); memcpy (net_ind.mnc, mmr_info_ind->plmn_id.mnc, PS_SIZE_MNC_MAX); } /* copy long name */ memset(&net_ind.long_name, 0, sizeof(T_MFW_NET_NAME)); if (mmr_info_ind->v_full_net_name EQ TRUE) { flag = 1; net_ind.long_name.dcs = mmr_info_ind->full_net_name.cs; net_ind.long_name.add_ci = mmr_info_ind->full_net_name.add_ci; net_ind.long_name.num_spare = mmr_info_ind->full_net_name.num_spare; net_ind.long_name.len = MINIMUM (MMREG_MAX_TEXT_LEN, mmr_info_ind->full_net_name.c_text); memcpy (net_ind.long_name.data, mmr_info_ind->full_net_name.text, net_ind.long_name.len); } /* copy short name */ memset(&net_ind.short_name, 0, sizeof(T_MFW_NET_NAME)); if (mmr_info_ind->v_short_net_name EQ TRUE) { flag = 1; net_ind.short_name.dcs = mmr_info_ind->short_net_name.cs; net_ind.short_name.add_ci = mmr_info_ind->short_net_name.add_ci; net_ind.short_name.num_spare = mmr_info_ind->short_net_name.num_spare; net_ind.short_name.len = MINIMUM (MMREG_MAX_TEXT_LEN, mmr_info_ind->short_net_name.c_text); memcpy (net_ind.short_name.data, mmr_info_ind->short_net_name.text, net_ind.short_name.len); } if (flag) nm_signal(E_MFW_NET_IND, &net_ind); flag = 0; memset(&tim_ind, 0, sizeof(T_MFW_TIME_IND)); /* copy time */ if (mmr_info_ind->v_universal_time EQ TRUE AND mmr_info_ind->v_local_time_zone EQ TRUE ) { flag = 1; tim_ind.timezone = mmr_info_ind->local_time_zone.time_zone; tim_ind.year = (mmr_info_ind->universal_time.year); tim_ind.month = (mmr_info_ind->universal_time.month); tim_ind.day = (mmr_info_ind->universal_time.day); tim_ind.hour = (mmr_info_ind->universal_time.hour); tim_ind.minute =(mmr_info_ind->universal_time.minute); tim_ind.second = (mmr_info_ind->universal_time.second ); } else if (mmr_info_ind->v_local_time_zone EQ TRUE AND mmr_info_ind->v_universal_time NEQ TRUE ) { flag = 1; tim_ind.timezone = mmr_info_ind->local_time_zone.time_zone; } #else /* END ADD: Sumit */ //Apr 13, 2007 DRT:OMAPS00122739 x0066814(Geetha) #if(0) /* copy country code and network code */ memset (net_ind.mcc, 0, PS_SIZE_MCC); memset (net_ind.mnc, 0, PS_SIZE_MNC_MAX); if (mmr_info_ind->plmn.plmn_presence EQ TRUE) { flag = 1; memcpy (net_ind.mcc, mmr_info_ind->plmn.plmn_id.mcc, PS_SIZE_MCC); memcpy (net_ind.mnc, mmr_info_ind->plmn.plmn_id.mnc, PS_SIZE_MNC_MAX); } /* copy long name */ memset(&net_ind.long_name, 0, sizeof(T_MFW_NET_NAME)); if (mmr_info_ind->full_net_name.v_name EQ TRUE) { flag = 1; net_ind.long_name.dcs = mmr_info_ind->full_net_name.cs; net_ind.long_name.add_ci = mmr_info_ind->full_net_name.add_ci; net_ind.long_name.num_spare = mmr_info_ind->full_net_name.num_spare; net_ind.long_name.len = MINIMUM (MMREG_MAX_TEXT_LEN, mmr_info_ind->full_net_name.c_text); memcpy (net_ind.long_name.data, mmr_info_ind->full_net_name.text, net_ind.long_name.len); } /* copy short name */ memset(&net_ind.short_name, 0, sizeof(T_MFW_NET_NAME)); if (mmr_info_ind->short_net_name.v_name EQ TRUE) { flag = 1; net_ind.short_name.dcs = mmr_info_ind->short_net_name.cs; net_ind.short_name.add_ci = mmr_info_ind->short_net_name.add_ci; net_ind.short_name.num_spare = mmr_info_ind->short_net_name.num_spare; net_ind.short_name.len = MINIMUM (MMREG_MAX_TEXT_LEN, mmr_info_ind->short_net_name.c_text); memcpy (net_ind.short_name.data, mmr_info_ind->short_net_name.text, net_ind.short_name.len); } if (flag) nm_signal(E_MFW_NET_IND, &net_ind); #endif flag = 0; memset(&tim_ind, 0, sizeof(T_MFW_TIME_IND)); /* copy time */ if (mmr_info_ind->net_time_zone.v_time_zone EQ TRUE AND mmr_info_ind->net_time.v_time EQ TRUE ) { flag = 1; tim_ind.timezone = mmr_info_ind->net_time_zone.time_zone; tim_ind.year = ((mmr_info_ind->net_time.year[0]-'0') * 10 + (mmr_info_ind->net_time.year[1]-'0') ); tim_ind.month = ((mmr_info_ind->net_time.month[0]-'0') * 10 + (mmr_info_ind->net_time.month[1]-'0') ); tim_ind.day = ((mmr_info_ind->net_time.day[0]-'0') * 10 + (mmr_info_ind->net_time.day[1]-'0') ); tim_ind.hour = ((mmr_info_ind->net_time.hour[0]-'0') * 10 + (mmr_info_ind->net_time.hour[1]-'0') ); tim_ind.minute = ((mmr_info_ind->net_time.minute[0]-'0') * 10 + (mmr_info_ind->net_time.minute[1]-'0') ); tim_ind.second = ((mmr_info_ind->net_time.second[0]-'0') * 10 + (mmr_info_ind->net_time.second[1]-'0') ); } else if (mmr_info_ind->net_time_zone.v_time_zone EQ TRUE AND mmr_info_ind->net_time.v_time NEQ TRUE ) { flag = 1; tim_ind.timezone = mmr_info_ind->net_time_zone.time_zone; } /*BEGIN ADD: Neptune */ #endif /*END ADD: Neptune */ if (flag) nm_signal(E_MFW_TIME_IND, &tim_ind); } #else void nm_nitz_info_ind(T_MMR_INFO_IND * mmr_info_ind) { UBYTE flag; TRACE_FUNCTION("nm_nitz_info_ind() "); //Apr 13, 2007 DRT:OMAPS00122739 x0066814(Geetha) #if(0) flag = 0; /* copy country code and network code */ memset (net_ind.mcc, 0, SIZE_MCC); memset (net_ind.mnc, 0, SIZE_MNC); if (mmr_info_ind->plmn.v_plmn EQ TRUE) { flag = 1; memcpy (net_ind.mcc, mmr_info_ind->plmn.mcc, SIZE_MCC); memcpy (net_ind.mnc, mmr_info_ind->plmn.mnc, SIZE_MNC); } /* copy long name */ memset(&net_ind.long_name, 0, sizeof(T_MFW_NET_NAME)); if (mmr_info_ind->full_name.v_name EQ TRUE) { flag = 1; net_ind.long_name.dcs = mmr_info_ind->full_name.dcs; net_ind.long_name.add_ci = mmr_info_ind->full_name.add_ci; net_ind.long_name.num_spare = mmr_info_ind->full_name.num_spare; net_ind.long_name.len = MINIMUM (MMR_MAX_TEXT_LEN, mmr_info_ind->full_name.c_text); memcpy (net_ind.long_name.data, mmr_info_ind->full_name.text, net_ind.long_name.len); } /* copy short name */ memset(&net_ind.short_name, 0, sizeof(T_MFW_NET_NAME)); if (mmr_info_ind->short_name.v_name EQ TRUE) { flag = 1; net_ind.short_name.dcs = mmr_info_ind->short_name.dcs; net_ind.short_name.add_ci = mmr_info_ind->short_name.add_ci; net_ind.short_name.num_spare = mmr_info_ind->short_name.num_spare; net_ind.short_name.len = MINIMUM (MMR_MAX_TEXT_LEN, mmr_info_ind->short_name.c_text); memcpy (net_ind.short_name.data, mmr_info_ind->short_name.text, net_ind.short_name.len); } if (flag) nm_signal(E_MFW_NET_IND, &net_ind); #endif flag = 0; memset(&tim_ind, 0, sizeof(T_MFW_TIME_IND)); /* copy time */ if (mmr_info_ind->ntz.v_tz EQ TRUE AND mmr_info_ind->time.v_time EQ TRUE ) { flag = 1; tim_ind.timezone = mmr_info_ind->ntz.tz; tim_ind.year = mmr_info_ind->time.year; tim_ind.month = mmr_info_ind->time.month; tim_ind.day = mmr_info_ind->time.day; tim_ind.hour = mmr_info_ind->time.hour; tim_ind.minute = mmr_info_ind->time.minute; tim_ind.second = mmr_info_ind->time.second; } else if (mmr_info_ind->ntz.v_tz EQ TRUE AND mmr_info_ind->time.v_time NEQ TRUE ) { flag = 1; tim_ind.timezone = mmr_info_ind->ntz.tz; } if (flag) nm_signal(E_MFW_TIME_IND, &tim_ind); } #endif /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nmCommand | +--------------------------------------------------------------------+ PURPOSE : handle mfw windows command */ static int nmCommand (U32 cmd, void *h) { switch (cmd) { case MfwCmdDelete: /* delete me */ if (!h) return 0; nm_delete(h); return 1; default: break; } return 0; } #ifdef NO_ASCIIZ /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_get_spn | +--------------------------------------------------------------------+ PURPOSE : Function to give access to the service provider string Parameters : None Return: Service provider string */ void nm_get_spn (T_MFW_SP_NAME *name) { if (name NEQ NULL) memcpy(name, &service_provider_name, sizeof(T_MFW_SP_NAME)); } #else /* PATCH PMC 000804 */ /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_get_spn | +--------------------------------------------------------------------+ PURPOSE : Function to give access to the service provider string Parameters : None Return: Service provider string */ void nm_get_spn (char *name) { if (name NEQ NULL) strncpy (name, service_provider_name, LONG_NAME); } /* END PATCH PMC */ #endif /* +---------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_abort_registraion| +---------------------------------------------------------------------+ PURPOSE : abort current registration Parameters : None */ void nm_abort_registraion(void) { sAT_Abort(CMD_SRC_LCL, AT_CMD_NRG); } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_decodeSourceId | +--------------------------------------------------------------------+ PURPOSE : This function is used to convert the source id used by ACI to the source id used by MFW. */ //x0pleela 09 Feb, 2006 ER: OMAPS00065203 int nm_decodeSourceId( UBYTE sourceId) { TRACE_FUNCTION("nm_decodeSourceId()"); #ifndef NEPTUNE_BOARD switch (sourceId) { case Read_ROM_TABLE: return NM_ROM; case Read_EONS: return NM_EONS; case Read_CPHS: return NM_CPHS; case Read_INVALID: default: return NM_NONE; } #endif /* to remove warning Aug -11 */ #ifdef NEPTUNE_BOARD return NM_NONE; #endif } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_update_plmn_data | +--------------------------------------------------------------------+ PURPOSE : This function is used to update plmn data after querying COPN */ //x0pleela 09 Feb, 2006 ER: OMAPS00065203 void nm_update_plmn_data( T_MFW_NETWORK_STRUCT *plmn_ident, T_ACI_OPER_NTRY oper_ntry) { TRACE_FUNCTION("nm_update_plmn_data()"); #ifndef NEPTUNE_BOARD plmn_ident->opn_read_from = (T_MFW_NM_OPN)nm_decodeSourceId(oper_ntry.source); /*a0393213 compiler warnings removal - explicit typecast done*/ #endif //update plmn_ident with EONS #ifdef NO_ASCIIZ memset(plmn_ident->network_long.data, 0, LONG_NAME); memset(plmn_ident->network_short.data, 0, SHORT_NAME); memcpy( plmn_ident->network_long.data, oper_ntry.longName, strlen(oper_ntry.longName) ); memcpy( plmn_ident->network_short.data, oper_ntry.shrtName, strlen(oper_ntry.shrtName)); plmn_ident->network_long.len = strlen((const char*)(plmn_ident->network_long.data)); /*a0393213 warnings removal - explicit typecasting done*/ plmn_ident->network_short.len = strlen((const char*)(plmn_ident->network_short.data)); #else memset(plmn_ident->network_long, 0, LONG_NAME); memset(plmn_ident->network_short, 0, SHORT_NAME); strcpy( plmn_ident->network_long, oper_ntry.longName); strcpy( plmn_ident->network_short, oper_ntry.shrtName); #endif } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_get_COPN | +--------------------------------------------------------------------+ PURPOSE : This function is used to query for COPS and COPN which will indicate from where the operator name was read */ //x0pleela 09 Feb, 2006 ER: OMAPS00065203 void nm_get_COPN( T_MFW_NETWORK_STRUCT *plmn_ident ) { T_ACI_COPS_MOD mode; T_ACI_COPS_FRMT format; T_ACI_OPER_NTRY oper_ntry; char opername[LONG_NAME]; TRACE_FUNCTION("nm_get_COPN()"); memset (&oper_ntry, 0, sizeof( T_ACI_OPER_NTRY )); //Check where MS is registered if( qAT_PlusCOPS ( CMD_SRC_LCL, &mode, &format, (char *)opername ) EQ AT_CMPL ) { //Request info about operator name if(qAT_PercentCOPN(CMD_SRC_LCL, format, (char *)opername, &oper_ntry) EQ AT_CMPL ) { nm_update_plmn_data(plmn_ident, oper_ntry); } } } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_get_opername | +--------------------------------------------------------------------+ PURPOSE : This function updates operator name based on cingular's prioritization requirement. Priority would be in order ONS->NITZ->ROM */ //x0pleela 09 Feb, 2006 ER: OMAPS00065203 void nm_get_opername(T_MFW_NETWORK_STRUCT * plmn_ident) { TRACE_FUNCTION("nm_get_opername()"); sAT_PercentCNIV(CMD_SRC_LCL, CNIV_MODE_ON); return; } // June 02, 2006 DR: OMAPS00078005 x0021334 /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_get_network_time | +--------------------------------------------------------------------+ PURPOSE : This function sets the PCTZV mode on. */ #ifdef FF_TIMEZONE void nm_get_network_time(void) { TRACE_FUNCTION("nm_get_network_time()"); // Put PCTZV mode on to get time and date updates //x0066814(Geetha), OMAPS00098351, Timezone information is update through nm_nitz_info_ind() function //sAT_PercentCTZV(CMD_SRC_LCL, PCTZV_MODE_ON); } #endif /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_get_opername | +--------------------------------------------------------------------+ PURPOSE : This function gets operator name from network. */ //x0pleela 09 Feb, 2006 ER: OMAPS00065203 void nm_get_network_data(T_MFW_NETWORK_STRUCT *plmn_netw_data) { TRACE_FUNCTION("nm_get_network_data()"); //send E_NM_OPN event nm_signal(E_NM_OPN, plmn_netw_data); } // June 02, 2006 DR: OMAPS00078005 x0021334 /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_set_network_time | +--------------------------------------------------------------------+ PURPOSE : This function sets time and date info received from network. */ #ifdef FF_TIMEZONE void nm_set_network_time(T_MFW_TIME_IND *currclock) { TRACE_FUNCTION("nm_set_network_time()"); //send E_MFW_TIME_IND event nm_signal(E_MFW_TIME_IND, currclock); } #endif /* Aug 07, 2007 DR:OMAPS00137726 x0066814(Geetha)*/ /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_NM | | STATE : code ROUTINE : nm_get_plmn_list_during_bootup | +--------------------------------------------------------------------+ PURPOSE : This function gets the plmn list during bootup */ void nm_get_plmn_list_during_bootup(void) { TRACE_FUNCTION ("nm_get_plmn_list_during_bootup()"); nm_signal(E_NM_PLMN_LIST_BOOTUP,0); }