FreeCalypso > hg > leo2moko-debug
diff g23m/condat/ms/src/mfw/mfw_nm.c @ 0:509db1a7b7b8
initial import: leo2moko-r1
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 01 Jun 2015 03:24:05 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/g23m/condat/ms/src/mfw/mfw_nm.c Mon Jun 01 03:24:05 2015 +0000 @@ -0,0 +1,2660 @@ +/* ++--------------------------------------------------------------------+ +| 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 + + 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. + + + * + * ***************** 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" + +#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 +extern const T_OPER_NTRY_FIXED operListFixed[]; /* Side access into cus_aci.h */ +#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; + +//x0pleela 08 Feb, 2006 ER: OMAPS00065203 +GLOBAL UBYTE gEons_alloc_active; /* EONS allocation and activation */ +static UBYTE opn_sel_done; /* flag to inform priority is done*/ + +/*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; + TRACE_FUNCTION("nm_signal()"); + + temp = dspl_Enable(0); + if (mfwSignallingMethod EQ 0) + { + if (mfwFocus) + if (nm_sign_exec(mfwFocus,event,para)) + { + dspl_Enable(temp); + 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)) + { + dspl_Enable(temp); + return; + } + + /* + * All windows tried inclusive root + */ + if (h == mfwRoot) + { + dspl_Enable(temp); + return; + } + + /* + * get parent window + */ + h = mfwParent(mfwParent(h)); + if(h) + h = ((MfwWin * )(h->data))->elems; + } + nm_sign_exec (mfwRoot, event, para); + } + dspl_Enable(temp); +} + + + +/* ++--------------------------------------------------------------------+ +| 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, T_pref_plmn *plmn) +{ + 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) + { + plmn->network_long.len = MINIMUM(LONG_NAME-1, strlen((char *)operLst->longOper)); + 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) + { + plmn->network_short.len = MINIMUM(SHORT_NAME-1, strlen((char *)operLst->shortOper)); + 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 +*/ + nm_avail_plmn_list(); + } + 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 +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; +} +#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 +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; +} +#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 + +*/ + +void nm_spn_cnf (SHORT error, T_EF_SPN *efspn) +{ + U8 i; + + SHORT 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) +{ + UBYTE serv_stat; + + TRACE_FUNCTION("nm_sat_file_update()"); + + switch (dataId) + { + case SIM_SPN: + if ((serv_stat = 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 + +*/ + +void nm_error_cops (void) +{ + TRACE_FUNCTION("nm_error_cops()"); + + 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; + 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]); + } + /***************************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; + 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_Denied: + 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; + 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 */ + /* 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); + + 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()"); + + 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); + + 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; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_NM | +| STATE : code ROUTINE : nm_restrict_bands | ++--------------------------------------------------------------------+ + + PURPOSE : restrict the band usage + 0: default + 1: only GSM 900 + 2: only DCS 1800 + +*/ + +T_MFW nm_restrict_bands (U8 mode) +{ + EXTERN void pl_pei_config (char *, char *); + + char dummy [40]; + + switch (mode) + { + case 0: + pl_pei_config ( "CONFIG SET_BAND=0", dummy ); + break; + case 1: + pl_pei_config ( "CONFIG SET_BAND=1", dummy ); + break; + case 2: + pl_pei_config ( "CONFIG SET_BAND=2", dummy ); + 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: return NM_NITZ; + default: 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 = nm_decodeSourceId(oper_ntry.source); +#endif + + TRACE_EVENT_P1("plmn_ident->opn_read_from:%d",plmn_ident->opn_read_from); + TRACE_EVENT_P1("gEons_alloc_active:%d",gEons_alloc_active); + + if( plmn_ident->opn_read_from EQ NM_EONS ) + { + TRACE_EVENT("EONS TRUE"); + //update plmn_ident with EONS +#ifdef NO_ASCIIZ + memset(plmn_ident->network_long.data, 0, LONG_NAME); + memset(plmn_ident->network_long.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)); + +#else + memset(plmn_ident->network_long, 0, LONG_NAME); + memset(plmn_ident->network_long, 0, SHORT_NAME); + strcpy( plmn_ident->network_long, + oper_ntry.longName); + strcpy( plmn_ident->network_short, + oper_ntry.shrtName); +#endif + { + char oper_mcc_mnc[NUMERIC_LENGTH]; + memset( oper_mcc_mnc, 0, NUMERIC_LENGTH); + sprintf(oper_mcc_mnc, "%d%d", oper_ntry.mcc, oper_ntry.mnc); + memcpy( plmn_ident->network_numeric, + (char*)oper_mcc_mnc, + strlen(oper_mcc_mnc) ); + } + set_opn_sel_done(TRUE); + } +} + +/* ++--------------------------------------------------------------------+ +| 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()"); + + if( ( ( plmn_ident->opn_read_from EQ NM_CPHS ) AND ( plmn_ident->roaming_indicator) ) + OR (plmn_ident->opn_read_from EQ NM_ROM) ) //x0pleela 15 Feb, 2006 ER:OMAPS00065203 + //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 + { + sAT_PercentCNIV(CMD_SRC_LCL, CNIV_MODE_ON); + } + else + { + set_opn_sel_done(TRUE); + //send E_NM_OPN event + nm_signal(E_NM_OPN, plmn_ident); + } + return; +} + +/* ++--------------------------------------------------------------------+ +| 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); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_NM | +| STATE : code ROUTINE : set_opn_sel_done | ++--------------------------------------------------------------------+ + + PURPOSE : This function sets opn_sel_done flag to TRUE or FALSE. +*/ +//x0pleela 15 Feb, 2006 ER: OMAPS00065203 +void set_opn_sel_done( UBYTE opn_selected ) +{ + TRACE_FUNCTION(" set_opn_sel_done()"); + opn_sel_done = opn_selected; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_NM | +| STATE : code ROUTINE : set_opn_sel_done | ++--------------------------------------------------------------------+ + + PURPOSE : This function returns the current value of flag opn_sel_done. +*/ +//x0pleela 15 Feb, 2006 ER: OMAPS00065203 +UBYTE get_opn_sel_done( void ) +{ + TRACE_FUNCTION("get_opn_sel_done()"); + return opn_sel_done; + +}