FreeCalypso > hg > fc-magnetite
view src/aci2/mfw/mfw_sat.c @ 381:c6823ed06f9c
doc/Compiling: update for C11x and for the speed-up trick
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 13 Jan 2018 21:10:08 +0000 |
parents | 93999a60b835 |
children |
line wrap: on
line source
/* +--------------------------------------------------------------------+ | PROJECT: MMI-Framework (8417) $Workfile:: mfw_sat.c $| | $Author:: Xsp $ CONDAT GmbH $Revision:: 12 $| | CREATED: 07.05.99 $Modtime:: 23/02/00 20:23 $| | STATE : code | +--------------------------------------------------------------------+ MODULE : MFW_SAT PURPOSE : SIM Application Toolkit Handling EXPORT : TO DO : $History:: mfw_sat.c Shashi Shekar B.S., a0876501, 16 Mar, 2006, OMAPS00061462 Icon support for SetupMenu & Select item. Mar 11, 2006 REF:DR:OMAPS00061467 x0035544 Description: 27.22.4.13.3 SET UP CALL (display of icons) fails. Solution: SAT icon is supported for the SAT CALL SETUP. Jan 16, 2006 DR: OMAPS00061460 - Shashi Shekar B.S. Description: SAT Icon support Solution : SAT icon support added. Aug 31, 2005 REF: CRR 33619 x0021334 Description: RE: Notification of SATK File Change Solution: Added the stub function 'rAT_PercentSIMEF()'. July 26, 2005 REF: SPR 29520 x0018858 Issue: 27.22.4.5 Proactive SIM Command: PLAY TONE fails Solution: The window which used to come up "Please wait" was not getting destroyed. Care has been taken to check this. Jun 16, 2005 REF: CRR 31543 x0021334 Issue: SATK: cannot get TR for send ussd command Solution: When the user presses "Hang up" key when the SAT USSD session is in progress, a call is made to function 'sAT_end_ussd()' to end the USSD session. 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 $ * * ***************** Version 12 ***************** * User: Xsp Date: 24/02/00 Time: 5:42 * Updated in $/GSM/Condat/MS/SRC/MFW * Debugged MmiSimToolkit... * * ***************** Version 11 ***************** * User: Fk Date: 23.02.00 Time: 18:33 * Updated in $/GSM/Condat/MS/SRC/MFW * Comprehension flags provided for default Terminal Response * * ***************** Version 10 ***************** * User: Xsp Date: 16/02/00 Time: 19:22 * Updated in $/GSM/Condat/MS/SRC/MFW * Fixed double allocation in satCreate()... * * ***************** Version 9 ***************** * User: Xsp Date: 14/02/00 Time: 18:11 * Updated in $/GSM/Condat/MS/SRC/MFW * Solved compiler errors... * * ***************** Version 8 ***************** * User: Xsp Date: 14/02/00 Time: 14:43 * Updated in $/GSM/Condat/MS/SRC/MFW * Added window pointers to sat structure... * * ***************** Version 7 ***************** * User: Fk Date: 11.02.00 Time: 15:40 * Updated in $/GSM/Condat/MS/SRC/MFW * New event 'SAT Session End' derived from empty command * * ***************** Version 6 ***************** * User: Fk Date: 10.02.00 Time: 16:43 * Updated in $/GSM/Condat/MS/SRC/MFW * Filter for Terminal Profile * * ***************** Version 5 ***************** * User: Vo Date: 17.11.99 Time: 10:47 * Updated in $/GSM/Condat/MS/SRC/MFW | | ***************** Version 4 ***************** | User: Le Date: 1.10.99 Time: 15:28 | Updated in $/GSM/Condat/MS/SRC/MFW * * ***************** Version 3 ***************** * User: Es Date: 9.07.99 Time: 14:32 * Updated in $/GSM/DEV/MS/SRC/MFW * * ***************** Version 2 ***************** * User: Es Date: 8.07.99 Time: 12:04 * Updated in $/GSM/DEV/MS/SRC/MFW * * ***************** Version 1 ***************** * User: Es Date: 6.07.99 Time: 12:42 * Created in $/GSM/DEV/MS/SRC/MFW * SIM application toolkit handler * Initial */ #define ENTITY_MFW #include <stdio.h> #include <string.h> #if defined (NEW_FRAME) #include "typedefs.h" #include "vsi.h" #include "custom.h" #include "gsm.h" #include "tok.h" #else #include "STDDEFS.H" #include "custom.h" #include "gsm.h" #include "vsi.h" #include "tok.h" #endif #include "message.h" #include "prim.h" #include "aci_cmh.h" #include "ati_cmd.h" //#include "aci_cmd.h" #include "aci.h" #include "prim.h" #include "psa.h" #include "psa_sim.h" #include "psa_cc.h" #include "psa_sat.h" #include "mfw_mfw.h" #include "mfw_sys.h" #include "aci_cmh.h" #include "mfw_win.h" #include "mfw_sat.h" #include "mfw_phb.h" #include "mfw_nm.h" #include "mfw_sima.h" #include "mfw_nmi.h" #include "mfw_sim.h" #include "mfw_simi.h" #include "mfw_cphs.h" #include "mfw_cphsi.h" #include "mfw_sms.h" #include "mfw_smsi.h" #include "cus_aci.h" #ifndef PCM_2_FFS #include "pcm.h" #endif extern char mfwSATLPRefresh; #define TRM_RSP_LEN (256) /*SPR#2121 - DS - Length of Terminal Response buffer */ #define CMD_DETAILS_LEN (5) /*SPR#2121 - DS - Length of default command details buffer */ char mfwSatMoAccepted = 0; static U8 lenResponse; /* len of terminal response */ const static U8 defResponse [] = /* default response values */ { 0x81, 0x03, 0x00, 0x00, 0x00, /* command details */ 0x82, 0x02, 0x82, 0x81, /* device identities */ 0x83, 0x01, 0x32 /* result */ }; static U8 defCmdDetails [CMD_DETAILS_LEN]; /*SPR#2121 - DS - Default SAT command details */ static U8 satNoResponse = 0; /* flag: no resp. from MFW */ static U8 curCR; /* current TLV CR flag */ static U8 curTag; /* current TLV tag */ static U8 curLen; /* current TLV length */ static U8 *curVal; /* current TLV value */ SHORT curSatCallId; static U8 *curCmd; /* current command pointer */ static S16 curCmdLen; /* len of current command */ static U8 *curData; /* data storage /end buffer */ static SatCmd cmd; /* temp storage for command */ SatCmd* sat_cmd_saved; /* SPR#2321 - DS - Copy of SAT cmd details */ static U8 partialCompr; /* partial comprehension */ static U16 eventList; // Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460 #ifdef FF_MMI_SAT_ICON static U32 curSATCmd = MfwSatCmdNone; // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462 // Modified the below defn to accomodate changes for SetupMenu / Select Item. static U8 isAlphaIdIconPresent = FALSE; static U8 isItemIconPresent = FALSE; static T_EF_IMG icon_image; U8 read_image_instance_file = FALSE; //x0035544 Mar 11, 2006. DR:OMAPS00061467 static U8 setupCall_Executed = FALSE; #define BW_ICON 0x11 #define COLOR_ICON 0x21 #define MAX_SIM_EF_SIZE 0xFF /* Assuming 8-bpp, RGB 332 format for destination */ #define RGB_TO_PIXEL(R, G, B, value) \ do \ { \ value = ((R) & 0xe0) | (((G) & 0xe0) >> 3) | (((B) & 0xc0) >> 6); \ } while(0) #endif typedef struct { U8 count; USHORT fields[MFW_MAX_NT_SIZE]; } T_MFW_UPDATE_FIELDS; static T_MFW_UPDATE_FIELDS udNotify; /* update fields */ static int fuRef; static BOOL fu_aborted; static int satCommand (U32 cmd, void *h); static void satResponse (U8 res); const static satMfWSuppTPrf[] = { /* Profile supported by MFW */ #ifdef SAT_TP1_PRF_DNL SAT_TP1_PRF_DNL | SAT_TP1_MENU_SEL, SAT_TP2_CMD_RES | SAT_TP2_CC | SAT_TP2_MOSMC | SAT_TP2_ALPHA_ID | SAT_TP2_UCS2_ENTRY | SAT_TP2_UCS2_DSPL | SAT_TP2_DSPL_EXT, SAT_TP3_DSPL_TXT | SAT_TP3_GET_INKEY | SAT_TP3_GET_INPUT | SAT_TP3_PLAY_TONE | SAT_TP3_REFRESH, SAT_TP4_SEL_ITEM | SAT_TP4_SETUP_MENU | SAT_TP4_SEND_SMS | SAT_TP4_SEND_SS | SAT_TP4_SEND_USSD | SAT_TP4_SETUP_CALL, SAT_TP5_EVENT_LIST | SAT_TP5_USER_ACT | SAT_TP5_SCR_AVAIL, 0x0, 0x0, SAT_TP8_BIN_GET_INKEY | SAT_TP8_IDLE_TXT | SAT_TP8_AI2_SETUP_CALL, #if defined(FF_WAP) SAT_TP9_SUST_DSPL_TXT|SAT_TP9_LAUNCH_BROWSER, #else SAT_TP9_SUST_DSPL_TXT, #endif /*FF_WAP*/ 0x0, 0x0, SAT_TP12_OPEN_CHANNEL | SAT_TP12_CLOSE_CHANNEL | SAT_TP12_RECEIVE_DATA | SAT_TP12_SEND_DATA, SAT_TP13_CSD_SUPP_BY_ME | SAT_TP13_GPRS_SUPP_BY_ME #else #ifdef FF_2TO1_PS 0x09, 0x73, 0x17, 0x37 /* c032 rsa */ #else /*0x09, 0x73, 0x17, 0x37 */ /* c032 rsa */ #endif #endif }; extern MfwHdr *current_mfw_elem; //x0035544 added fixes done for CQ33597 by x0021334 on 21-11-2005 // x0021334 : To test SAT session end - CQ33597 /* Handler for cancel event sent by the MMI sim toolkit */ void Mfw_SAT_DTMF_EndSession(void) { sAT_PercentSATT( CMD_SRC_LCL, SATT_CS_EndSession); return; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satInit | +--------------------------------------------------------------------+ PURPOSE : initialize SAT handler */ MfwRes satInit (U8 *profile, U8 plen) { int i; #ifdef FF_2TO1_PS U8 combProfile [SIM_MAX_STK_PRF]; #else U8 combProfile [MAX_STK_PRF]; #endif TRACE_FUNCTION("satInit()"); mfwCommand[MfwTypSat] = (MfwCb) satCommand; satNoResponse = 0; mfwSatMoAccepted = 0; mfwSATLPRefresh = 0; eventList= 0; fu_aborted = FALSE; #ifdef FF_2TO1_PS plen = MINIMUM(plen, SIM_MAX_STK_PRF); #else plen = MINIMUM(plen, MAX_STK_PRF); #endif sat_cmd_saved = NULL; /* SPR#2321 - DS - Initialise ptr to saved cmd */ for (i = 0; i < (int)plen; i++) // check profile against { // MFW capability if (i < sizeof(satMfWSuppTPrf)) combProfile[i] = profile[i] & satMfWSuppTPrf[i]; else combProfile[i] = 0; } sAT_PercentSATC(CMD_SRC_LCL,plen,combProfile); /* install the call back for file change notification */ fuRef = -1; psaSAT_FUNotifyRegister(satRefreshNotification); psaSAT_FURegister (satChangeNotify); return MfwResOk; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satExit | +--------------------------------------------------------------------+ PURPOSE : finalize SAT handler */ MfwRes satExit (void) { mfwCommand[MfwTypSat] = 0; return MfwResOk; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satCreate | +--------------------------------------------------------------------+ PURPOSE : create SAT control */ MfwHnd satCreate (MfwHnd w, MfwEvt e, MfwCb f, SatCmd *c) { MfwSat *sat = (MfwSat*) mfwAlloc(sizeof(MfwSat)); MfwHdr *hdr = (MfwHdr *)mfwAlloc(sizeof(MfwHdr)); MfwHdr *insert_status =0; if (!hdr || !sat) { TRACE_ERROR("ERROR: satCreate() Mem Alloc Failed."); if(hdr) mfwFree((U8*)hdr,sizeof(MfwHdr)); if(sat) mfwFree((U8*)sat,sizeof(MfwSat)); return 0; } sat->map = e; sat->evt = 0; sat->handler = f; sat->cmd = c; sat->parentWindow = w; sat->currentWindow = NULL; hdr->data = sat; hdr->type = MfwTypSat; insert_status = mfwInsert(NULL,hdr); if(!insert_status) { TRACE_ERROR("ERROR: satCreate() Failed to Install Handler. "); mfwFree((U8*)hdr,sizeof(MfwHdr)); mfwFree((U8*)sat ,sizeof(MfwSat)); return 0; } return insert_status; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satDelete | +--------------------------------------------------------------------+ PURPOSE : delete SAT control */ MfwRes satDelete (MfwHnd h) { MfwRes res; if (!h) return MfwResIllHnd; res = (mfwRemove(h)) ? MfwResOk : MfwResIllHnd; mfwFree(((MfwHdr *) h)->data,sizeof(MfwSat)); mfwFree(h,sizeof(MfwHdr)); return res; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satString | +--------------------------------------------------------------------+ PURPOSE : user string to SIM SPR#2121 - DS - Dynamically allocate memory for Terminal Response. */ MfwRes satString (SatCmd *cmd, SatTxt *txt, U8 *res, int rlen) { S16 ti; U8* trmResponse = NULL; TRACE_FUNCTION("satString()"); /* Allocate memory for Terminal Response buffer */ trmResponse = (U8*)mfwAlloc(TRM_RSP_LEN); if (trmResponse == NULL) { /* Memory allocation failed */ TRACE_ERROR("ERROR: Failed to allocate memory for TR buffer"); return MfwResNoMem; } /*SPR#2121 - DS - Set up terminal response with default values */ lenResponse = sizeof(defResponse); /* prep. terminal response */ memcpy(trmResponse,defResponse,lenResponse); trmResponse[2] = cmd->number; /* command number */ trmResponse[3] = cmd->type; /* command type */ trmResponse[4] = cmd->qual; /* command qualifier */ ti = sizeof(defResponse) - 2; /* result length */ if(res[1] != SatResAiNoCause) /* only attach additional information if existent*/ { trmResponse[ti++] = rlen; /* dito */ while (rlen--) trmResponse[ti++] = *res++; /* result data */ } else /* result ok no additional resultcode attached*/ { trmResponse[ti++] = 0x01; trmResponse[ti++] = *res; } trmResponse[ti++] = 0x8D; /* text string tag + CR */ if (txt->len + 1 > 161) /* incl. coding scheme byte */ { TRACE_ERROR("Text too long!!!"); return MfwResErr; } if (txt->len + 1 > 127) trmResponse[ti++] = 0x81; trmResponse[ti++] = txt->len + 1; trmResponse[ti++] = txt->code; /* data coding scheme */ memcpy(trmResponse+ti,(U8*)txt+txt->text,txt->len); sAT_PercentSATR(CMD_SRC_LCL,(S16)(ti+txt->len),trmResponse); /* Deallocate memory used for Terminal Response buffer */ if (trmResponse != NULL) { mfwFree(trmResponse, TRM_RSP_LEN); trmResponse = NULL; } return MfwResOk; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satItem | +--------------------------------------------------------------------+ PURPOSE : user selected popup item to SIM SPR#2121 - DS - Dynamically allocate memory for Terminal Response. */ MfwRes satItem (SatCmd *cmd, U8 itemId, U8 *res, int rlen) { S16 ti; U8* trmResponse; TRACE_FUNCTION("satItem()"); /* Allocate memory for Terminal Response buffer */ trmResponse = (U8*)mfwAlloc(TRM_RSP_LEN); if (trmResponse == NULL) { /* Memory allocation failed */ TRACE_ERROR("ERROR: Failed to allocate memory for TR buffer"); return MfwResNoMem; } /*SPR#2121 - DS - Set up terminal response with default values */ lenResponse = sizeof(defResponse); /* prep. terminal response */ memcpy(trmResponse,defResponse,lenResponse); trmResponse[2] = cmd->number; /* command number */ trmResponse[3] = cmd->type; /* command type */ trmResponse[4] = cmd->qual; /* command qualifier */ ti = sizeof(defResponse) - 2; /* result length */ if(res[1] != SatResAiNoCause) /* only attach additional information if existent*/ { trmResponse[ti++] = rlen; /* dito */ while (rlen--) trmResponse[ti++] = *res++; /* result data */ } else /* result ok no additional resultcode attached*/ { trmResponse[ti++] = 0x01; trmResponse[ti++] = *res; } trmResponse[ti++] = 0x90; /* item identifier tag + CR */ trmResponse[ti++] = 1; /* length */ trmResponse[ti++] = itemId; /* selected item id */ TRACE_EVENT("SATR:satItem"); sAT_PercentSATR(CMD_SRC_LCL,ti,trmResponse); /* Deallocate memory used for Terminal Response buffer */ if (trmResponse != NULL) { mfwFree(trmResponse, TRM_RSP_LEN); trmResponse = NULL; } return MfwResOk; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satMenuItem | +--------------------------------------------------------------------+ PURPOSE : user selected menu item to SIM SPR#2121 - DS - Dynamically allocate memory for Terminal Response. */ MfwRes satMenuItem (U8 itemId, U8 help) { S16 ti = 0; U8* trmResponse = NULL; TRACE_FUNCTION("satMenuItem()"); /* Allocate memory for Terminal Response buffer */ trmResponse = (U8*)mfwAlloc(TRM_RSP_LEN); if (trmResponse == NULL) { /* Memory allocation failed */ TRACE_ERROR("ERROR: Failed to allocate memory for TR buffer"); return MfwResNoMem; } trmResponse[ti++] = 0xD3; /* menu selection tag */ trmResponse[ti++] = 0; /* length (filled later) */ trmResponse[ti++] = 0x82; /* --device identities-- */ trmResponse[ti++] = 0x02; /* length */ trmResponse[ti++] = 0x01; /* source: Keypad */ trmResponse[ti++] = 0x81; /* destination: SIM */ trmResponse[ti++] = 0x90; /* --item identifier-- */ trmResponse[ti++] = 0x01; /* length */ trmResponse[ti++] = itemId; /* item id */ if (help) { trmResponse[ti++] = 0x95; /* --help request-- */ trmResponse[ti++] = 0x00; /* length */ } trmResponse[1] = ti - 2; /* length of menu selection */ sAT_PercentSATE(CMD_SRC_LCL,ti,trmResponse); /* Deallocate memory used for Terminal Response buffer */ if (trmResponse != NULL) { mfwFree(trmResponse, TRM_RSP_LEN); trmResponse = NULL; } return MfwResOk; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satEvtDownload | +--------------------------------------------------------------------+ PURPOSE : download actual event to SAT (User activity and Idle Screen available) SPR#2121 - DS - Dynamically allocate memory for Terminal Response. */ MfwRes satEvtDownload (U8 evt) { S16 ti = 0; U8 src; U8 evtFlags=0; U8* trmResponse = NULL; TRACE_FUNCTION("satEvtDownload()"); /* Allocate memory for Terminal Response buffer */ trmResponse = (U8*)mfwAlloc(TRM_RSP_LEN); if (trmResponse == NULL) { /* Memory allocation failed */ TRACE_ERROR("ERROR: Failed to allocate memory for TR buffer"); return MfwResNoMem; } switch (evt) { case SatEvtUserAction: /* user activity */ evtFlags = SatEvtUserActionActivated; /* source of event */ break; case SatEvtIdleScreen: /* idle screen available */ evtFlags = SatEvtIdleScreenActivated; /* source of event */ break; default: TRACE_ERROR("ERROR: Unrecognised evt"); /* Deallocate memory used for Terminal Response buffer */ if (trmResponse != NULL) { mfwFree(trmResponse, TRM_RSP_LEN); trmResponse = NULL; } return MfwResErr; /* illegal event */ } if (!(eventList&evtFlags)) /*Only send registered events */ { TRACE_ERROR("ERROR: evtFlags not registered in eventList"); /* Deallocate memory used for Terminal Response buffer */ if (trmResponse != NULL) { mfwFree(trmResponse, TRM_RSP_LEN); trmResponse = NULL; } return MfwResErr; } switch (evt) { case SatEvtUserAction: /* user activity */ src = SatDevME; /* source of event */ break; case SatEvtIdleScreen: /* idle screen available */ src = SatDevDisplay; /* source of event */ break; default: TRACE_ERROR("ERROR: Unrecognised evt"); /* Deallocate memory used for Terminal Response buffer */ if (trmResponse != NULL) { mfwFree(trmResponse, TRM_RSP_LEN); trmResponse = NULL; } return MfwResErr; /* illegal event */ } eventList&=(~evtFlags); /* Deregister event */ trmResponse[ti++] = 0xD6; /* event download tag */ trmResponse[ti++] = 0; /* length (filled later) */ trmResponse[ti++] = 0x99; /* --event list-- */ trmResponse[ti++] = 0x01; /* length */ trmResponse[ti++] = evt; /* actual event */ trmResponse[ti++] = 0x82; /* --device identities-- */ trmResponse[ti++] = 0x02; /* length */ trmResponse[ti++] = src; /* source */ trmResponse[ti++] = 0x81; /* destination: SIM */ trmResponse[1] = ti - 2; /* length of event download */ sAT_PercentSATE(CMD_SRC_LCL,ti,trmResponse); /* Deallocate memory used for Terminal Response buffer */ if (trmResponse != NULL) { mfwFree(trmResponse, TRM_RSP_LEN); trmResponse = NULL; } return MfwResOk; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satEvtRegistered | +--------------------------------------------------------------------+ PURPOSE : Check if evt (User activity and Idle Screen available) has been registered by previous SAT Setup Event List command. SPR#2121 - DS - Created function. */ int satEvtRegistered (int evt) { TRACE_FUNCTION("satEvtRegistered()"); if (eventList & evt) { return TRUE; } else { return FALSE; } } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satDone | +--------------------------------------------------------------------+ PURPOSE : SIM toolkit command confirmation SPR#2121 - DS - Dynamically allocate memory for Terminal Response. */ MfwRes satDone (SatCmd *cmd, U8 *res, int rlen) { S16 ti; U8 response = *res; U8* trmResponse = NULL; if (satNoResponse) /* no response, if ... */ { TRACE_EVENT("satDone: no response. Handled by ACI"); return MfwResOk; /* ... notified by ACI */ } /* Allocate memory for Terminal Response buffer */ trmResponse = (U8*)mfwAlloc(TRM_RSP_LEN); if (trmResponse == NULL) { /* Memory allocation failed */ TRACE_ERROR("ERROR: Failed to allocate memory for TR buffer"); return MfwResNoMem; } /*SPR#2121 - DS - Set up terminal response with default values */ lenResponse = sizeof(defResponse); /* prep. terminal response */ memcpy(trmResponse,defResponse,lenResponse); trmResponse[2] = cmd->number; /* command number */ trmResponse[3] = cmd->type; /* command type */ trmResponse[4] = cmd->qual; /* command qualifier */ ti = sizeof(defResponse) - 2; /* result length */ if(res[1] != SatResAiNoCause) /* only attach additional information if existent*/ { trmResponse[ti++] = rlen; /* dito */ while (rlen--) trmResponse[ti++] = *res++; /* result data */ } else /* result ok no additional resultcode attached*/ { trmResponse[ti++] = 0x01; trmResponse[ti++] = *res; } switch (response) { case SatResSuccess: /* performed successsfully */ case SatResPartial: /* ok,partial comprehension */ case SatResMissing: /* ok,missing information */ case SatResAdditional: /* ok,additional EFs read */ case SatResNoIcon: /* ok,no icon displayed */ case SatResModified: /* ok,modified by SIM */ case SatResUserAbort: /* terminated by user */ case SatResUserBack: /* backward move by user */ case SatResUserNoResp: /* no response from user */ case SatResUserHelp: /* help request from user */ case SatResUserAbortUSSD: /* USSD terminated by user */ case SatResBusyME: /* ME temporary failure */ case SatResBusyNet: /* Net temporary failure */ case SatResReject: /* user reject call setup */ case SatResCleared: /* call cleared (user/net) */ case SatResTimerConflict: /* conflict on timer state */ case SatResCCTemp: /* CC by SIM: temp failure */ case SatResImpossible: /* ME cannot do it */ case SatResUnknownType: /* type not understood */ case SatResUnknownData: /* data not understood */ case SatResUnknownNumber: /* number not understood */ case SatResSSerror: /* SS return error */ case SatResSMSerror: /* SMS-RP error */ case SatResNoValues: /* missing required values */ case SatResUSSDerror: /* USSD return error */ case SatResMultiCard: /* Multiple card error */ case SatResCCPermanent: /* CC by SIM: perm. failure */ break; default: TRACE_ERROR("ill response code"); break; } TRACE_EVENT_P1("SATR:satdone. Response: %x", response); sAT_PercentSATR(CMD_SRC_LCL,ti,trmResponse); /* Deallocate memory used for Terminal Response buffer */ if (trmResponse != NULL) { mfwFree(trmResponse, TRM_RSP_LEN); trmResponse = NULL; } return MfwResOk; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : sigExec | +--------------------------------------------------------------------+ PURPOSE : execute SAT signal */ static int sigExec (MfwHdr *curElem, U32 evt, void *data) { MfwSat *sc; while (curElem) { if (curElem->type == MfwTypSat) { sc = curElem->data; if (sc->map & evt) { /* events match */ if (sc->handler) /* handler valid */ { current_mfw_elem = curElem; /* LE 06.06.00 */ sc->evt = evt; if (sc->cmd) memcpy(sc->cmd,(U8 *)data,sizeof(SatCmd)); if ((*(sc->handler))(evt,sc)) return 1; /* event consumed */ } } } curElem = curElem->next; } return 0; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satSignal | +--------------------------------------------------------------------+ PURPOSE : SAT event */ void satSignal (U32 evt, void *data) { UBYTE temp = dspl_Enable(0); TRACE_FUNCTION("satSignal event"); TRACE_EVENT_P1("satSignal event %d",evt); if (mfwSignallingMethod EQ 0) { if (mfwFocus) if (sigExec(mfwFocus,evt,data)) { dspl_Enable(temp); return; } if (mfwRoot) sigExec(mfwRoot,evt,data); } else { MfwHdr* h = 0; if (mfwFocus) h = mfwFocus; if (!h) h = mfwRoot; while (h) { if (sigExec(h,evt,data)) { dspl_Enable(temp); return; } if (h == mfwRoot) { dspl_Enable(temp); return; } h = mfwParent(mfwParent(h)); if (h) h = ((MfwWin *)(h->data))->elems; } sigExec (mfwRoot,evt,data); } dspl_Enable(temp); return; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satCommand | +--------------------------------------------------------------------+ PURPOSE : handle mfw windows command */ static int satCommand (U32 cmd, void *h) { switch (cmd) { case MfwCmdDelete: /* delete me */ if (!h) return 0; satDelete(h); return 1; default: break; } return 0; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satResponse | +--------------------------------------------------------------------+ PURPOSE : setup Terminal Response for SIM SPR#2121 - DS - Dynamically allocate memory for Terminal Response. */ static void satResponse (U8 res) { U8* trmResponse = NULL; TRACE_FUNCTION("satResponse()"); if (satNoResponse) /* no response, if ... */ return; /* ... notified by ACI */ /* Allocate memory for Terminal Response buffer */ trmResponse = (U8*)mfwAlloc(TRM_RSP_LEN); if (trmResponse == NULL) { /* Memory allocation failed */ TRACE_ERROR("ERROR: Failed to allocate memory for TR buffer"); return; } /*SPR#2121 - DS - Set up terminal response with default values */ lenResponse = sizeof(defResponse); /* prep. terminal response */ memcpy(trmResponse,defResponse,lenResponse); /*SPR#2121 - DS - Set up command specific details. defCmdDetails set up in rAT_PercentSATI */ memcpy(trmResponse, defCmdDetails, CMD_DETAILS_LEN); trmResponse[10] = 1; trmResponse[11] = res; sAT_PercentSATR(CMD_SRC_LCL,sizeof(defResponse),trmResponse); /* Deallocate memory used for Terminal Response buffer */ if (trmResponse != NULL) { mfwFree(trmResponse, TRM_RSP_LEN); trmResponse = NULL; } return; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : getTLValue | +--------------------------------------------------------------------+ PURPOSE : check TLV: setup curCR, curTag, curLen return size of TL part */ static U8 getTLValue (U8 *sc) { TRACE_FUNCTION("getTLValue()"); curCR = *(sc+0) & 0x80; /* comprehension required ? */ curTag = *(sc+0) & 0x7f; /* TLV id */ curLen = *(sc+1); /* length of TLV value part */ if (curLen < 0x80) return 2; if (curLen == 0x81) { curLen = *(sc+2); /* long length */ return 3; } TRACE_ERROR("invalid length coding"); satResponse(SatResUnknownData); return 0; /* invalid TLV object */ } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decTLV | +--------------------------------------------------------------------+ PURPOSE : decode TLV */ static U8 decTLV (U8 tagWanted, U8 mandatory, char *id) { U8 *sc = curCmd; S16 len = curCmdLen; U8 tl, partial = 0; TRACE_EVENT_P3("decTLV(%02x,%d,%s)",tagWanted,mandatory,id); while (len > 0) { tl = getTLValue(sc); if (!tl) return 0; if (curTag == tagWanted) { sc += tl; curVal = sc; curCmd = sc + curLen; curCmdLen = len - (tl + curLen); partialCompr += partial; return 2; } TRACE_EVENT_P1("no %s TLV",id); if (curCR) { if (mandatory) satResponse(SatResUnknownData); return !mandatory; } sc += tl + curLen; len -= tl + curLen; partial = 1; } if(!strcmp(id,"Tone")) { /* * according to GSM 11.14 if no tone is included play general beep */ //July 26, 2005 REF: SPR 29520 x0018858 //Value modified from integer to hex. *curVal = 0x10; return 2; } if(!strcmp(id,"Duration")) { /* * according to GSM 11.14 if no duration is included set to a default value */ *(curVal) = 1; /* Units = sec */ *(curVal+1) = 5; /* play 5 seconds ??*/ return 2; } TRACE_EVENT_P1("not found: %s TLV",id); if (mandatory) satResponse(SatResNoValues); return !mandatory; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decByte | +--------------------------------------------------------------------+ PURPOSE : decode TLV: miscelleaneous TLVs (single byte value) */ static U8 decByte (U8 *t, U8 tagWanted, U8 mandatory) { U8 res; TRACE_FUNCTION("decByte()"); res = decTLV(tagWanted,mandatory,"byte"); if (res > 1) { *t = *curVal; return 1; } return res; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decData | +--------------------------------------------------------------------+ PURPOSE : decode TLV: miscelleaneous TLVs (length, data) */ static U8 decData (SatData *t, U8 tagWanted, U8 mandatory) { U8 res; TRACE_FUNCTION("decData()"); res = decTLV(tagWanted,mandatory,"data"); if (res > 1) { t->len = curLen; /* data len */ curData -= curLen; memcpy(curData,curVal,curLen); /* data itself */ t->data = (U16) (curData - (U8*) t); /* save the offset */ return 1; } return res; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decText | +--------------------------------------------------------------------+ PURPOSE : decode TLV: text string */ static U8 decText (SatTxt *t, U8 tagWanted, U8 mandatory) { U8 res; TRACE_FUNCTION("decText()"); res = decTLV(tagWanted,mandatory,"text"); TRACE_EVENT_P1("res %d", res); if (res > 1) { if (curLen == 0x00) /* SPR#2340 - DS - Text len zero */ t->len = 0; else t->len = curLen - 1; /* text len (not dcs) */ if (t->len) t->code = *curVal; /* data coding scheme */ else t->code = 0; curData -= t->len; memcpy(curData,curVal+1,t->len); /* text itself */ t->text = (U16) (curData - (U8*) t); /* save the offset */ TRACE_EVENT_P2("len %d, code(dcs) %d", t->len, t->code); return 1; } return res; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decAddrSS | +--------------------------------------------------------------------+ PURPOSE : decode TLV: address or SS string */ static U8 decAddrSS (SatAddress *t, U8 tagWanted, U8 mandatory) { U8 res; TRACE_FUNCTION("decAddr-SS()"); res = decTLV(tagWanted,mandatory,"Addr-SS"); if (res > 1) /* address or ss string */ { t->len = curLen - 1; /* number len wo ton/npi */ curData -= t->len; t->ton = *curVal; /* type of number, npi */ memcpy(curData,curVal+1,t->len); /* number itself */ t->number = (U16) (curData - (U8*) t); /* offset */ return 1; } return res; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decAlpha | +--------------------------------------------------------------------+ PURPOSE : decode TLV: alpha identifier */ static U8 decAlpha (SatTxt *t, U8 mandatory) { U8 res; TRACE_FUNCTION("decAlpha()"); res = decTLV(0x05,mandatory,"Alpha"); /* SPR#2340 - DS - Added check of val returned from decTLV */ if (res > 1) { t->len = curLen; /* text len */ if (t->len) t->code = 0x04; /* data coding scheme */ else t->code = 0; curData -= t->len; memcpy(curData,curVal,t->len); /* text itself */ t->text = (U16) (curData - (U8*) t); /* save the offset */ return 1; } else { /* Alpha tag not present */ t->len = 0x00; t->code = 0x00; t->text = 0x00; } return res; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decSMS | +--------------------------------------------------------------------+ PURPOSE : decode TLV: SMS TPDU */ static U8 decSMS (SatSmsPdu *t, U8 mandatory) { U8 res; TRACE_FUNCTION("decSMS()"); res = decTLV(0x0B,mandatory,"SMS TPDU"); if (res > 1) { t->len = curLen; /* SMS len */ curData -= t->len; memcpy(curData,curVal,t->len); /* SMS itself */ t->data = (U16) (curData - (U8*) t); /* save the offset */ return 1; } return res; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decItem | +--------------------------------------------------------------------+ PURPOSE : decode TLV: item */ static U8 decItem (SatItem *t, U8 mandatory) { U8 res; TRACE_FUNCTION("decItem()"); res = decTLV(0x0F,mandatory,"Item"); if (res > 1) { if (!curLen) /* no item: remove menu */ { t->id = 0; /* no id */ t->len = 0; /* no length */ } else { t->id = *curVal; t->len = curLen - 1; /* without item id */ } t->action = 0; /* filled in later */ t->icon = 0; /* filled in later */ curData -= t->len; memcpy(curData,curVal+1,t->len); /* item data */ t->text = (U16) (curData - (U8*) t); /* save the offset */ return 1; } return res; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decNextAction | +--------------------------------------------------------------------+ PURPOSE : decode TLV: next action */ static U8 decNextAction (SatItem *t, U8 nItems, U8 mandatory) { U8 res; TRACE_FUNCTION("decNextAction()"); res = decTLV(0x18,mandatory,"Next Action"); if (res > 1) { if (nItems > curLen) nItems = curLen; while (nItems--) { t->action = *curVal++; /* next action identifier */ t++; } return 1; } return res; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decItemIcons | +--------------------------------------------------------------------+ PURPOSE : decode TLV: icon identifier list */ static U8 decItemIcons (SatMenu *m, SatItem *t, U8 nItems, U8 mandatory) { U8 res; TRACE_FUNCTION("decItemIcons()"); res = decTLV(0x1F,mandatory,"Item Icon List"); m->itemIconQual = 0xFF; /* default: not present */ if (res > 1) { m->itemIconQual = *curVal++; curLen--; if (nItems > curLen) nItems = curLen; while (nItems--) { t->icon = *curVal++; /* next action identifier */ t++; } return 1; } return res; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decDefItem | +--------------------------------------------------------------------+ PURPOSE : decode TLV: default item */ static U8 decDefItem (SatItem *t, U8 nItems, U8 mandatory) { U8 res; TRACE_FUNCTION("decDefItem()"); res = decTLV(0x10,mandatory,"Default Item"); if (res > 1) { if (curLen != 1) return res; /* ES!! error */ while (nItems--) { if (t->id == *curVal) t->action |= 0x40; /* flag as default */ t++; } return 1; } return res; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decTone | +--------------------------------------------------------------------+ PURPOSE : decode TLV: tone */ static U8 decTone (U8 mandatory) { U8 res; TRACE_FUNCTION("decTone()"); res = decTLV(0x0E,mandatory,"Tone"); if (res > 1) { switch (*curVal) { case 0x01: /* Dial Tone */ case 0x02: /* Called Subscriber Busy */ case 0x03: /* Congestion */ case 0x04: /* Radio Path Ack */ case 0x05: /* Radio Path Not Avail */ case 0x06: /* Error / Special Info */ case 0x07: /* Call Waiting */ case 0x08: /* Ringing */ case 0x10: /* General Beep */ case 0x11: /* Positive Ack */ case 0x12: /* Negative Ack or Error */ cmd.c.tone.tone = *curVal; /* tone type */ return 1; default : satResponse(SatResUnknownData); return 0; } } return res; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decDuration | +--------------------------------------------------------------------+ PURPOSE : decode TLV: duration */ //Sandip CQ-16299 //Reason : This function does not take care of reserved Time Interval 0x00 #if 0 static U8 decDuration (U8 *dur, U8 mandatory) { U8 res; TRACE_FUNCTION("decDuration()"); res = decTLV(0x04,mandatory,"Duration"); if (res > 1) { *dur++ = *curVal++; /* duration unit */ *dur++ = *curVal; /* duration value */ return 1; } return res; } #endif static U8 decDuration (U8 *dur, U8 mandatory) { U8 res; TRACE_FUNCTION("decDuration()"); res = decTLV(0x04,mandatory,"Duration"); if (res > 1) { *dur++ = *curVal++; /* duration unit */ *dur++ = *curVal; /* duration value */ if(*curVal ==0x00) { TRACE_EVENT_P1("Duration value is %d",*curVal); satResponse(SatResUnknownData); return 0; } return 1; } return res; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decDevId | +--------------------------------------------------------------------+ PURPOSE : decode TLV: device identities */ static U8 decDevId (U8 mandatory) { U8 res; TRACE_FUNCTION("decDevId()"); res = decTLV(0x02,mandatory,"Devices"); if (res > 1) { cmd.source = *curVal++; /* source identifier */ cmd.dest = *curVal; /* destination identifier */ return 1; } return res; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decRespLen | +--------------------------------------------------------------------+ PURPOSE : decode TLV: response length */ static U8 decRespLen (U8 mandatory) { U8 res; TRACE_FUNCTION("decRespLen()"); res = decTLV(0x11,mandatory,"Response Length"); if (res > 1) { cmd.c.inp.rspMin = *curVal++; /* minimal length */ cmd.c.inp.rspMax = *curVal; /* maximal length */ /* MMI-SPR-16296: [mdf] verify the parameters as expected by GSM 11.14 */ TRACE_EVENT_P2("decRespLen: Min=%d Max=%d",cmd.c.inp.rspMin,cmd.c.inp.rspMax); if ( cmd.c.inp.rspMin > cmd.c.inp.rspMax ) { satResponse(SatResUnknownData); /* send TR(32), prms not understood */ return 0; } /* end of MMI-SPR-16296: [mdf] verify the parameters as expected by GSM 11.14 */ return 1; } return res; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decIconId | +--------------------------------------------------------------------+ PURPOSE : decode TLV: icon identifier */ static U8 decIconId (SatIconId *id, U8 mandatory) { U8 res; TRACE_FUNCTION("decIconId()"); res = decTLV(0x1E,mandatory,"IconID"); if (res > 1) { id->qual = *curVal++; /* icon qualifier */ id->id = *curVal; /* icon identifier */ // Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460 #ifdef FF_MMI_SAT_ICON isAlphaIdIconPresent = TRUE; #endif return 1; } else { id->qual = 0xFF; /* not present */ id->id = 0xFF; // Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460 #ifdef FF_MMI_SAT_ICON isAlphaIdIconPresent = FALSE; #endif } return res; } // Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460 #ifdef FF_MMI_SAT_ICON /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : simReadIconData | +--------------------------------------------------------------------+ PURPOSE : Read SIM EF(IMG). */ void simReadIconData (U8 record_number) { T_SIM_ACCESS_PARAM sim_read_param; TRACE_FUNCTION("simReadIconData()"); /* Check if the SIM card supports EF(IMG) & read the contents. Ideally we should be using SRV_RFU3 which corresponds to number 39 but, the calls from MMI are using the number directly */ if (sim_serv_table_check(39) == ALLOCATED_AND_ACTIVATED) { sim_read_param.data_id = SIM_IMG; sim_read_param.offset = 0; sim_read_param.record_number = record_number; sim_read_param.len = MAX_SIM_EF_SIZE; sim_read_param.max_length = MAX_SIM_EF_SIZE; sim_read_sim_icon(&sim_read_param); } } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : sim_img_cnf | +--------------------------------------------------------------------+ PURPOSE : SIM EF(IMG) read confirm. */ void sim_img_cnf (USHORT error, UBYTE record_number, UBYTE *efimg) { USHORT simErr, count; T_SIM_ACCESS_PARAM sim_read_param; TRACE_FUNCTION("sim_img_cnf()"); #ifdef FF_2TO1_PS simErr = CAUSE_SIM_NO_ERROR; #else simErr = SIM_NO_ERROR; #endif if (error == simErr) { if (*efimg >= 1) { /* Read the contents of the image file. */ icon_image.number_of_image_instance = *efimg; efimg++; icon_image.image_instance.image_width = *efimg; efimg++; icon_image.image_instance.image_height = *efimg; efimg++; icon_image.image_instance.image_coding = *efimg; efimg++; /* Image instance file identifier*/ icon_image.image_instance.image_instance_file_id = *efimg << 8; efimg++; icon_image.image_instance.image_instance_file_id |= *efimg; efimg++; /* Offset to Image instance file identifier*/ icon_image.image_instance.image_offset = *efimg << 8; efimg++; icon_image.image_instance.image_offset |= *efimg; efimg++; /* Lenght of the Image instance file identifier. Do not completely depend on this length as this doesn't include the Palette length, so Color image decoding goes wrong!!!*/ icon_image.image_instance.image_instance_length = *efimg << 8; efimg++; icon_image.image_instance.image_instance_length |= *efimg; efimg++; read_image_instance_file = TRUE; sim_read_sim(icon_image.image_instance.image_instance_file_id, MAX_SIM_EF_SIZE, MAX_SIM_EF_SIZE); } } } /* +-----------------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : sim_img_instance_data_cnf | +-----------------------------------------------------------------------------+ PURPOSE : SIM EF(ImageInst) read confirm & image converter. */ void sim_img_instance_data_cnf (USHORT error, UBYTE *data_instance) { USHORT simErr, CLUT_offset; char *dst = NULL; char *palette; UBYTE n_CLUT_entries, depth, width, height; UBYTE *data = (UBYTE *)data_instance; TRACE_FUNCTION("sim_img_instance_data_cnf()"); #ifdef FF_2TO1_PS simErr = CAUSE_SIM_NO_ERROR; #else simErr = SIM_NO_ERROR; #endif if (error == simErr) { /* Decode the Black & white image*/ if(icon_image.image_instance.image_coding == BW_ICON) { width = *data; data++; height = *data; data++; dst = (char*)mfwAlloc(width * height); if (dst == NULL) { /* Memory allocation failed, clean up & return */ TRACE_ERROR("ERROR: Failed to allocate memory for sim_img_instance_data_cnf"); satResponse(SatResImpossible); read_image_instance_file = FALSE; isAlphaIdIconPresent = FALSE; return; } /* B&W Converter function*/ convert_11_image(width, height, (char *)data, dst); } /* Decode the Color image*/ else if(icon_image.image_instance.image_coding == COLOR_ICON) { width = *data; data++; height = *data; data++; depth = *data; data++; n_CLUT_entries = *data; /* number of entries in CLUT */ data++; CLUT_offset = (*data) << 8; /* HIGH: offset of CLUT */ data++; CLUT_offset |= (*data); /* LOW: offset of CLUT */ data++; dst = (char*)mfwAlloc(width * height); if (dst == NULL) { /* Memory allocation failed, clean up & return */ TRACE_ERROR("ERROR: Failed to allocate memory for sim_img_instance_data_cnf"); satResponse(SatResImpossible); read_image_instance_file = FALSE; isAlphaIdIconPresent = FALSE; return; } palette = (char *)(data + CLUT_offset - 6); /* Color Converter function*/ convert_21_image(width, height, depth, data, (UBYTE *)palette, (UBYTE *)dst); } switch (cmd.type) { case SatCmdDispText: iconDataUpdate(&cmd.c.text, width, height, dst); break; case SatCmdGetKey: iconDataUpdate(&cmd.c.text, width, height, dst); break; case SatCmdGetString: iconDataUpdate(&cmd.c.inp.prompt, width, height, dst); break; case SatCmdSetMenu: case SatCmdSelItem: { if(isAlphaIdIconPresent) { /* copy the header icon data & set the isAlphaIdIconPresent flag FALSE temporarily*/ iconDataUpdate(&cmd.c.menu.header, width, height, dst); isAlphaIdIconPresent = FALSE; } /* We have to read the icons present for each menu item now. We safely assume that the icons for each menu item is the same. Since the SAT Icon display is only for demo, we are not checking if separate icons has to be read for each item. */ if(isItemIconPresent) { /* Copy the data into the cmd structure to be passed to BMI. */ cmd.c.menu.items[1].iconInfo.dst = (char *) dst; cmd.c.menu.items[1].iconInfo.height = height; cmd.c.menu.items[1].iconInfo.width = width; isAlphaIdIconPresent = TRUE; isItemIconPresent = FALSE; } if (!isAlphaIdIconPresent) { /* If the icon is present for menu items also, go ahead & read it. */ if(cmd.c.menu.itemIconQual != 0xFF) { isItemIconPresent = TRUE; /* Set the Image instance flag to FALSE, so that we read the icons for the menu items. */ read_image_instance_file = FALSE; /* Read the icon data present for Item menu list*/ simReadIconData(cmd.c.menu.items[1].icon); } else isAlphaIdIconPresent = TRUE; } } break; case SatCmdSndSMS: iconDataUpdate(&cmd.c.sms.info, width, height, dst); break; case SatCmdSndSS: iconDataUpdate(&cmd.c.ss.info, width, height, dst); break; case SatCmdSndUSSD: iconDataUpdate(&cmd.c.ss.info, width, height, dst); break; case SatCmdCall: //x0035544 Feb 06, 2006 DR:OMAPS00061467 //check if icon data is present for the first alpha identifier then update it. also check if icon data is present for alpha id2 if(cmd.c.call.info.icon.qual != 0xFF) { iconDataUpdate(&cmd.c.call.info, width, height, dst); } if(cmd.c.call.info2.icon.qual != 0xFF) { // check if icon id for both the alpha identifiers is same or not. if so then get the same icon data. if(cmd.c.call.info2.icon.id == cmd.c.call.info.icon.id) iconDataUpdate(&cmd.c.call.info2, width, height, dst); //else part is not implemented as it is just for demonstration } break; case SatCmdIdleText: iconDataUpdate(&cmd.c.text, width, height, dst); break; case SatCmdExecAT: break; case SatCmdSndDTMF: iconDataUpdate(&cmd.c.cmd.info, width, height, dst); break; default: TRACE_ERROR("unknown command"); satResponse(SatResUnknownType); return; } } if (curSATCmd && isAlphaIdIconPresent) { satSignal(curSATCmd,&cmd); read_image_instance_file = FALSE; isAlphaIdIconPresent = FALSE; } //x0035544 Mar 11, 2006 DR:OMAPS00061467 //Aafter SAT_SETUP_CALL event is executed then only send MfwSatCcAlert event if(setupCall_Executed == TRUE) { satSignal(MfwSatCcAlert,&cmd); setupCall_Executed = FALSE; } } /* +-----------------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : iconDataUpdate | +-----------------------------------------------------------------------------+ PURPOSE : To copy the image data details to be passed to BMI. */ void iconDataUpdate(SatTxt *t, UBYTE width, UBYTE height, char *dst) { TRACE_FUNCTION("iconDataUpdate()"); /* Copy the data into the cmd structure to be passed to BMI. */ t->iconInfo.dst = (char *) dst; t->iconInfo.height = height; t->iconInfo.width = width; } /* +-----------------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : convert_21_image | +-----------------------------------------------------------------------------+ PURPOSE : Image converter for Color icon. */ /* src = image data */ /* dst = converted image data */ void convert_21_image( UBYTE width, UBYTE height, UBYTE depth, UBYTE *src, UBYTE *palette, UBYTE *dst) { UBYTE i, j, k; USHORT src_offset, dst_offset; USHORT color_index; UBYTE src_mask = 0x80; UBYTE dst_mask; UBYTE value; USHORT R, G, B; TRACE_FUNCTION("convert_21_image()"); src_offset = 0; dst_offset = 0; for(j=0; j<height; j++) { for(i=0; i<width; i++) { color_index = 0; dst_mask = 1 << depth; for(k=0; k<depth; k++) { dst_mask = dst_mask >> 1; if(src[src_offset] & src_mask) color_index |= dst_mask; if(src_mask == 0x01) { src_mask = 0x80; src_offset ++; } else src_mask = src_mask >> 1; } color_index *= 3; R = palette[color_index + 0]; G = palette[color_index + 1]; B = palette[color_index + 2]; RGB_TO_PIXEL(R, G, B, value); dst[dst_offset] = value; dst_offset++; } } } /* +-----------------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : convert_11_image | +-----------------------------------------------------------------------------+ PURPOSE : Image converter for B/W icon. */ /* src = image data */ /* dst = converted image data */ void convert_11_image(UBYTE width, UBYTE height, char *src, char *dst) { UBYTE i, j; USHORT src_offset, dst_offset; USHORT mask = 0x80; UBYTE value; TRACE_FUNCTION("convert_11_image()"); src_offset = 0; dst_offset = 0; for(j=0; j<height; j++) { for(i=0; i<width; i++) { if(src[src_offset] & mask) value = 0x00; else value = 0xFF; dst[dst_offset] = value; dst_offset++; if(mask == 0x01) { mask = 0x80; src_offset ++; } else mask = mask >> 1; } } } #endif /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decRespFlag | +--------------------------------------------------------------------+ PURPOSE : decode TLV: immediate response */ static U8 decRespFlag (U8 *flag, U8 mandatory) { U8 res; TRACE_FUNCTION("decRespFlag()"); res = decTLV(0x2B,mandatory,"ResponseFlag"); if (res > 1) { *flag = 1; /* immediate response */ return 1; } else { *flag = 0; /* no immediate response */ } return res; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decDispText | +--------------------------------------------------------------------+ PURPOSE : decode command: display text */ static U32 decDispText (void) { TRACE_FUNCTION("decDispText()"); while (curCmdLen > 0) { if (!decDevId(1)) return 0; if (cmd.source == SatDevSIM && cmd.dest == SatDevDisplay) break; /* success */ TRACE_ERROR("illegal device combination"); if (curCR) { satResponse(SatResUnknownData); return 0; } partialCompr = 1; } if (!decText(&cmd.c.text,0x0D,1)) return 0; if (!decIconId(&cmd.c.text.icon,0)) return 0; /* fatal error */ if (!decRespFlag(&cmd.c.text.responseFlag,0)) return 0; /* fatal error */ /* SPR#2340 - DS - If len is zero, string is empty */ if (cmd.c.text.len == 0x00) { /* If no text string is supplied send result "Command data not understood by ME" */ satResponse(SatResUnknownData); } // Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460 #ifdef FF_MMI_SAT_ICON /* Check if the icon data is present & needs to be read*/ if (cmd.c.text.icon.qual != 0xFF) { /* Initialise the icon data members*/ cmd.c.text.iconInfo.width = 0; cmd.c.text.iconInfo.height = 0; cmd.c.text.iconInfo.dst = NULL; simReadIconData(cmd.c.text.icon.id); } #endif return MfwSatTextOut; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decGetKey | +--------------------------------------------------------------------+ PURPOSE : decode command: get inkey */ static U32 decGetKey (void) { TRACE_FUNCTION("decGetKey()"); while (curCmdLen > 0) { if (!decDevId(1)) return 0; if (cmd.source == SatDevSIM && cmd.dest == SatDevME) break; /* success */ TRACE_ERROR("illegal device combination"); if (curCR) { satResponse(SatResUnknownData); return 0; } partialCompr = 1; } if (!decText(&cmd.c.text,0x0D,1)) return 0; if (!decIconId(&cmd.c.text.icon,0)) return 0; /* fatal error */ // Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460 #ifdef FF_MMI_SAT_ICON /* Check if the icon data is present & needs to be read*/ if (cmd.c.text.icon.qual != 0xFF) { /* Initialise the icon data members*/ cmd.c.text.iconInfo.width = 0; cmd.c.text.iconInfo.height = 0; cmd.c.text.iconInfo.dst = NULL; simReadIconData(cmd.c.text.icon.id); } #endif return MfwSatGetKey; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decGetString | +--------------------------------------------------------------------+ PURPOSE : decode command: get input */ static U32 decGetString (void) { TRACE_FUNCTION("decGetString()"); while (curCmdLen > 0) { if (!decDevId(1)) return 0; if (cmd.source == SatDevSIM && cmd.dest == SatDevME) break; /* success */ TRACE_ERROR("illegal device combination"); if (curCR) { satResponse(SatResUnknownData); return 0; } partialCompr = 1; } if (!decText(&cmd.c.inp.prompt,0x0D,1)) return 0; if (!decRespLen(1)) return 0; cmd.c.inp.defRsp.len = 0; /* default settings */ cmd.c.inp.defRsp.code = 0; cmd.c.inp.defRsp.text = 0; if (!decText(&cmd.c.inp.defRsp,0x17,0)) return 0; /* fatal error */ if (!decIconId(&cmd.c.inp.prompt.icon,0)) return 0; /* fatal error */ // Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460 #ifdef FF_MMI_SAT_ICON /* Check if the icon data is present & needs to be read*/ if (cmd.c.inp.prompt.icon.qual != 0xFF) { /* Initialise the icon data members*/ cmd.c.inp.prompt.iconInfo.width = 0; cmd.c.inp.prompt.iconInfo.height = 0; cmd.c.inp.prompt.iconInfo.dst = NULL; simReadIconData(cmd.c.inp.prompt.icon.id); } #endif return MfwSatGetString; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decPlayTone | +--------------------------------------------------------------------+ PURPOSE : decode command: play tone */ static U32 decPlayTone (void) { TRACE_FUNCTION("decPlayTone()"); while (curCmdLen > 0) { if (!decDevId(1)) return 0; if (cmd.source == SatDevSIM && cmd.dest == SatDevSpeaker) break; /* success */ TRACE_ERROR("illegal device combination"); if (curCR) { satResponse(SatResUnknownData); return 0; } partialCompr = 1; } cmd.c.tone.alpha.len = 0; /* default settings */ cmd.c.tone.alpha.code = 0; cmd.c.tone.alpha.text = 0; cmd.c.tone.tone = 0; cmd.c.tone.durUnit = 0; cmd.c.tone.durValue = 0; if (!decAlpha(&cmd.c.tone.alpha,0)) return 0; if (!decTone(0)) return 0; if (!decDuration(&cmd.c.tone.durUnit,0)) return 0; return MfwSatPlayTone; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decSetMenu | +--------------------------------------------------------------------+ PURPOSE : decode command: setup menu */ static U32 decSetMenu (void) { SatItem *ip; S16 oldLen; U8 nItems; TRACE_FUNCTION("decSetMenu()"); while (curCmdLen > 0) { if (!decDevId(1)) return 0; if (cmd.source == SatDevSIM && cmd.dest == SatDevME) break; /* success */ TRACE_ERROR("illegal device combination"); if (curCR) { satResponse(SatResUnknownData); return 0; } partialCompr = 1; } cmd.c.menu.nItems = 0; if (!decAlpha(&cmd.c.menu.header,1)) return 0; oldLen = curCmdLen; ip = cmd.c.menu.items; if (!decItem(ip,1)) return 0; nItems = 0; /* number of menu items */ while (oldLen != curCmdLen) /* really decoded something */ { nItems++; oldLen = curCmdLen; ip++; if (!decItem(ip,0)) return 0; } if (!decNextAction(cmd.c.menu.items,nItems,0)) return 0; if (!decIconId(&cmd.c.menu.header.icon,0)) return 0; if (!decItemIcons(&cmd.c.menu,cmd.c.menu.items,nItems,0)) return 0; cmd.c.menu.nItems = nItems; // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462 #ifdef FF_MMI_SAT_ICON /* Check if the icon data is present in the Alpha id & needs to be read*/ if (cmd.c.menu.header.icon.qual != 0xFF) { /* Initialise the icon data members*/ cmd.c.menu.header.iconInfo.width = 0; cmd.c.menu.header.iconInfo.height = 0; cmd.c.menu.header.iconInfo.dst = NULL; simReadIconData(cmd.c.menu.header.icon.id); } /* We have to read theicons present for each menu item now. We safely assume that the icons for each menu item is the same. Since the SAT Icon display is only for demo, we are not checking if separate icons has to be read for each item. */ if (cmd.c.menu.itemIconQual != 0xFF) { /* Initialise the icon data members*/ cmd.c.menu.items[1].iconInfo.width = 0; cmd.c.menu.items[1].iconInfo.height = 0; cmd.c.menu.items[1].iconInfo.dst = NULL; } #endif return MfwSatSetupMenu; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decSelItem | +--------------------------------------------------------------------+ PURPOSE : decode command: select item */ static U32 decSelItem (void) { SatItem *ip; S16 oldLen; U8 nItems; TRACE_FUNCTION("decSelItem()"); while (curCmdLen > 0) { if (!decDevId(1)) return 0; if (cmd.source == SatDevSIM && cmd.dest == SatDevME) break; /* success */ TRACE_ERROR("illegal device combination"); if (curCR) { satResponse(SatResUnknownData); return 0; } partialCompr = 1; } cmd.c.menu.nItems = 0; cmd.c.menu.header.code = 0; /* set default values */ cmd.c.menu.header.len = 0; cmd.c.menu.header.text = 0; if (!decAlpha(&cmd.c.menu.header,0)) return 0; oldLen = curCmdLen; ip = cmd.c.menu.items; if (!decItem(ip,1)) return 0; nItems = 0; /* number of menu items */ while (oldLen != curCmdLen) /* really decoded something */ { nItems++; oldLen = curCmdLen; ip++; if (!decItem(ip,0)) return 0; } if (!decNextAction(cmd.c.menu.items,nItems,0)) return 0; if (!decDefItem(cmd.c.menu.items,nItems,0)) return 0; if (!decIconId(&cmd.c.menu.header.icon,0)) return 0; if (!decItemIcons(&cmd.c.menu,cmd.c.menu.items,nItems,0)) return 0; cmd.c.menu.nItems = nItems; // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462 #ifdef FF_MMI_SAT_ICON /* Check if the icon data is present in the Alpha id & needs to be read*/ if (cmd.c.menu.header.icon.qual != 0xFF) { /* Initialise the icon data members*/ cmd.c.menu.header.iconInfo.width = 0; cmd.c.menu.header.iconInfo.height = 0; cmd.c.menu.header.iconInfo.dst = NULL; simReadIconData(cmd.c.menu.header.icon.id); } /* We have to read theicons present for each menu item now. We safely assume that the icons for each menu item is the same. Since the SAT Icon display is only for demo, we are not checking if separate icons has to be read for each item. */ if (cmd.c.menu.itemIconQual != 0xFF) { /* Initialise the icon data members*/ cmd.c.menu.items[1].iconInfo.width = 0; cmd.c.menu.items[1].iconInfo.height = 0; cmd.c.menu.items[1].iconInfo.dst = NULL; } #endif return MfwSatSelectItem; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decSndSMS | +--------------------------------------------------------------------+ PURPOSE : decode command: send SMS */ static U32 decSndSMS (void) { TRACE_FUNCTION("decSndSMS()"); while (curCmdLen > 0) { if (!decDevId(1)) return 0; if (cmd.source == SatDevSIM && cmd.dest == SatDevNet) break; /* success */ TRACE_ERROR("illegal device combination"); if (curCR) { satResponse(SatResUnknownData); return 0; } partialCompr = 1; } cmd.c.sms.info.code = 0; /* set default values */ cmd.c.sms.info.len = -1; /* optional info if absent */ cmd.c.sms.info.text = 0; if (!decAlpha(&cmd.c.sms.info,0)) return 0; cmd.c.sms.addr.ton = 0; /* set default values */ cmd.c.sms.addr.len = 0; cmd.c.sms.addr.number = 0; if (!decAddrSS(&cmd.c.sms.addr,0x06,0)) /* address (SS string) */ return 0; if (!decSMS(&cmd.c.sms.sms,1)) return 0; if (!decIconId(&cmd.c.sms.info.icon,0)) return 0; // Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460 #ifdef FF_MMI_SAT_ICON /* Check if the icon data is present & needs to be read*/ if (cmd.c.sms.info.icon.qual != 0xFF) { /* Initialise the icon data members*/ cmd.c.sms.info.iconInfo.width = 0; cmd.c.sms.info.iconInfo.height = 0; cmd.c.sms.info.iconInfo.dst = NULL; simReadIconData(cmd.c.sms.info.icon.id); } #endif return MfwSatSendSMS; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decSndSS | +--------------------------------------------------------------------+ PURPOSE : decode command: send SS */ static U32 decSndSS (void) { TRACE_FUNCTION("decSndSS()"); while (curCmdLen > 0) { if (!decDevId(1)) return 0; if (cmd.source == SatDevSIM && cmd.dest == SatDevNet) break; /* success */ TRACE_ERROR("illegal device combination"); if (curCR) { satResponse(SatResUnknownData); return 0; } partialCompr = 1; } cmd.c.ss.info.code = 0; /* set default values */ cmd.c.ss.info.len = -1; /* optional info if absent */ cmd.c.ss.info.text = 0; if (!decAlpha(&cmd.c.ss.info,0)) return 0; if (!decAddrSS(&cmd.c.ss.ss,0x09,1)) /* SS string (== address) */ return 0; if (!decIconId(&cmd.c.ss.info.icon,0)) return 0; // Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460 #ifdef FF_MMI_SAT_ICON /* Check if the icon data is present & needs to be read*/ if (cmd.c.ss.info.icon.qual != 0xFF) { /* Initialise the icon data members*/ cmd.c.ss.info.iconInfo.width = 0; cmd.c.ss.info.iconInfo.height = 0; cmd.c.ss.info.iconInfo.dst = NULL; simReadIconData(cmd.c.ss.info.icon.id); } #endif return MfwSatSendSS; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decSndUSSD | +--------------------------------------------------------------------+ PURPOSE : decode command: send USSD */ static U32 decSndUSSD (void) { TRACE_FUNCTION("decSndUSSD()"); while (curCmdLen > 0) { if (!decDevId(1)) return 0; if (cmd.source == SatDevSIM && cmd.dest == SatDevNet) break; /* success */ TRACE_ERROR("illegal device combination"); if (curCR) { satResponse(SatResUnknownData); return 0; } partialCompr = 1; } cmd.c.ss.info.code = 0; /* set default values */ cmd.c.ss.info.len = -1; /* optional info if absent */ cmd.c.ss.info.text = 0; if (!decAlpha(&cmd.c.ss.info,0)) return 0; if (!decAddrSS(&cmd.c.ss.ss,0x0A,1)) /* USSD string */ return 0; if (!decIconId(&cmd.c.ss.info.icon,0)) return 0; // Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460 #ifdef FF_MMI_SAT_ICON /* Check if the icon data is present & needs to be read*/ if (cmd.c.ss.info.icon.qual != 0xFF) { /* Initialise the icon data members*/ cmd.c.ss.info.iconInfo.width = 0; cmd.c.ss.info.iconInfo.height = 0; cmd.c.ss.info.iconInfo.dst = NULL; simReadIconData(cmd.c.ss.info.icon.id); } #endif return MfwSatSendUSSD; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decCall | +--------------------------------------------------------------------+ PURPOSE : decode command: setup call */ static U32 decCall (void) { TRACE_FUNCTION("decCall()"); while (curCmdLen > 0) { if (!decDevId(1)) return 0; if (cmd.source == SatDevSIM && cmd.dest == SatDevNet) break; /* success */ TRACE_ERROR("illegal device combination"); if (curCR) { satResponse(SatResUnknownData); return 0; } partialCompr = 1; } cmd.c.call.info.code = 0; /* set default values */ cmd.c.call.info.len = -1; /* optional info if absent */ cmd.c.call.info.text = 0; cmd.c.call.info2.code = 0; /* set default values */ cmd.c.call.info2.len = -1; /* optional info if absent */ cmd.c.call.info2.text = 0; if (!decAlpha(&cmd.c.call.info,0)) return 0; if (!decAddrSS(&cmd.c.call.addr,0x06,1)) /* address (SS string) */ return 0; cmd.c.call.bc.len = 0; /* set default values */ cmd.c.call.bc.data = 0; if (!decData(&cmd.c.call.bc,0x07,0)) /* bearer capabilities */ return 0; cmd.c.call.sa.len = 0; /* set default values */ cmd.c.call.sa.data = 0; if (!decData(&cmd.c.call.sa,0x08,0)) /* subaddress */ return 0; cmd.c.call.durUnit = 0; /* set default values */ cmd.c.call.durValue = 0; if (!decDuration(&cmd.c.call.durUnit,0)) /* redial timing */ return 0; if (!decIconId(&cmd.c.call.info.icon,0)) /* icon for info 1 */ return 0; if (!decAlpha(&cmd.c.call.info2,0)) /* call setup info (2) */ return 0; if (!decIconId(&cmd.c.call.info2.icon,0)) /* icon for info 2 */ return 0; //Sudha.V x0035544, feb 06, 2006 DR:OMAPS00061467 #ifdef FF_MMI_SAT_ICON /* Check if the icon data is present for alpha identifier 1 & needs to be read*/ if (cmd.c.call.info.icon.qual != 0xFF) { /* Since we have two icons present, if second Alpha id is present, set the isAlphaIdIconPresent to TRUE explicitly since the second Alpha icon will reset this flag if not present & we wont enter the icon decoder*/ isAlphaIdIconPresent = TRUE; /* Initialise the icon data members*/ cmd.c.call.info.iconInfo.width = 0; cmd.c.call.info.iconInfo.height = 0; cmd.c.call.info.iconInfo.dst = NULL; simReadIconData(cmd.c.call.info.icon.id); } /* Check if the icon data is present for alpha identifier 2 & needs to be read*/ //No need to read icon data for alpha id2 from sim again as it is same as that of alpha id1 if (cmd.c.call.info2.icon.qual != 0xFF) { // Initialise the icon data members cmd.c.call.info2.iconInfo.width = 0; cmd.c.call.info2.iconInfo.height = 0; cmd.c.call.info2.iconInfo.dst = NULL; } #endif return MfwSatCall; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decExecAT | +--------------------------------------------------------------------+ PURPOSE : decode command: run AT command */ static U32 decExecAT (void) { TRACE_FUNCTION("decExecAT()"); while (curCmdLen > 0) { if (!decDevId(1)) return 0; if (cmd.source == SatDevSIM && cmd.dest == SatDevME) break; /* success */ TRACE_ERROR("illegal device combination"); if (curCR) { satResponse(SatResUnknownData); return 0; } partialCompr = 1; } cmd.c.cmd.info.code = 0; /* set default values */ cmd.c.cmd.info.len = -1; /* optional info if absent */ cmd.c.cmd.info.text = 0; if (!decAlpha(&cmd.c.cmd.info,0)) return 0; cmd.c.cmd.cmd.len = 0; /* set default values */ cmd.c.cmd.cmd.data = 0; if (!decData(&cmd.c.cmd.cmd,0x28,1)) /* AT command string */ return 0; if (!decIconId(&cmd.c.cmd.info.icon,0)) /* icon for info */ return 0; return MfwSatExecAT; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decSndDTMF | +--------------------------------------------------------------------+ PURPOSE : decode command: send DTMF */ static U32 decSndDTMF (void) { TRACE_FUNCTION("decSndDTMF()"); while (curCmdLen > 0) { if (!decDevId(1)) return 0; if (cmd.source == SatDevSIM && cmd.dest == SatDevNet) break; /* success */ TRACE_ERROR("illegal device combination"); if (curCR) { satResponse(SatResUnknownData); return 0; } partialCompr = 1; } cmd.c.cmd.info.code = 0; /* set default values */ cmd.c.cmd.info.len = -1; /* optional info if absent */ cmd.c.cmd.info.text = 0; if (!decAlpha(&cmd.c.cmd.info,0)) return 0; cmd.c.cmd.cmd.len = 0; /* set default values */ cmd.c.cmd.cmd.data = 0; if (!decData(&cmd.c.cmd.cmd,0x2C,1)) /* DTMF string */ return 0; if (!decIconId(&cmd.c.cmd.info.icon,0)) /* icon for info */ return 0; // Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460 #ifdef FF_MMI_SAT_ICON /* Check if the icon data is present & needs to be read*/ if (cmd.c.cmd.info.icon.qual != 0xFF) { /* Initialise the icon data members*/ cmd.c.cmd.info.iconInfo.width = 0; cmd.c.cmd.info.iconInfo.height = 0; cmd.c.cmd.info.iconInfo.dst = NULL; simReadIconData(cmd.c.cmd.info.icon.id); } #endif return MfwSatSendDTMF; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decCcRes | +--------------------------------------------------------------------+ PURPOSE : decode Call Control result */ static U32 decCcRes (void) { TRACE_FUNCTION("decCcRes()"); cmd.c.ccres.addr.ton = -1; /* set default values */ cmd.c.ccres.addr.len = -1; cmd.c.ccres.addr.number = -1; cmd.c.ccres.addr2.ton = -1; /* set on SMS result */ cmd.c.ccres.addr2.len = -1; cmd.c.ccres.addr2.number = -1; if (!decAddrSS(&cmd.c.ccres.addr,0x06,0)) /* address */ return 0; if (curTag == 0x06) /* was an address */ { if (!decAddrSS(&cmd.c.ccres.addr2,0x06,0)) /* try another */ return 0; if (curTag == 0x06) /* hit: have SMS result */ { cmd.c.ccres.info.code = -1; /* get alpha id */ cmd.c.ccres.info.len = -1; cmd.c.ccres.info.text = -1; if (!decAlpha(&cmd.c.ccres.info,0)) return 0; return MfwSatCcRes; } } else { if (curTag == 0x09) /* not an address */ if (!decAddrSS(&cmd.c.ccres.addr,0x09,0)) /* try SS */ return 0; if (curTag == 0x0a) /* not an SS string */ if (!decAddrSS(&cmd.c.ccres.addr,0x0a,0)) /* try USSD */ return 0; } cmd.c.ccres.bc.len = -1; /* set default values */ cmd.c.ccres.bc.data = -1; if (!decData(&cmd.c.ccres.bc,0x07,0)) /* bearer capabilities */ return 0; cmd.c.ccres.sa.len = -1; /* set default values */ cmd.c.ccres.sa.data = -1; if (!decData(&cmd.c.ccres.sa,0x08,0)) /* subaddress */ return 0; cmd.c.ccres.info.code = -1; /* set default values */ cmd.c.ccres.info.len = -1; cmd.c.ccres.info.text = -1; if (!decAlpha(&cmd.c.ccres.info,0)) /* alpha information */ return 0; cmd.c.ccres.bcRepInd = 0; /* set default values */ if (decByte(&cmd.c.ccres.bcRepInd,0x2a,0)<2) /* BC repeat ind. */ return MfwSatCcRes; cmd.c.ccres.bc2.len = -1; /* set default values */ cmd.c.ccres.bc2.data = -1; if (!decData(&cmd.c.ccres.bc2,0x07,0)) /* bearer 2 capabilities */ return 0; return MfwSatCcRes; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decRefresh | +--------------------------------------------------------------------+ PURPOSE : decode command: refresh */ static U32 decRefresh (void) { TRACE_FUNCTION("decRefresh()"); while (curCmdLen > 0) { if (!decDevId(1)) return 0; if (cmd.source == SatDevSIM && cmd.dest == SatDevME) break; /* success */ TRACE_ERROR("illegal device combination"); if (curCR) { satResponse(SatResUnknownData); return 0; } partialCompr = 1; } cmd.c.files.len = 0; /* set default values */ cmd.c.files.data = 0; if (!decData(&cmd.c.files,0x12,0)) /* refresh file list */ return 0; //ES!! do real refresh here... return MfwSatRefresh; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decSetEvents | +--------------------------------------------------------------------+ PURPOSE : decode command: setup event list */ static U32 decSetEvents (void) { U8 *ep; U8 res; U8 sat_res[2]; TRACE_FUNCTION("decSetEvents()"); while (curCmdLen > 0) { if (!decDevId(1)) return 0; if (cmd.source == SatDevSIM && cmd.dest == SatDevME) break; /* success */ TRACE_ERROR("illegal device combination"); if (curCR) { satResponse(SatResUnknownData); return 0; } partialCompr = 1; } cmd.c.events.len = 0; /* default: remove list */ cmd.c.events.elem[0] = 0; eventList =0; res = decTLV(0x19,1,"Event List"); if (res > 1) { ep = &cmd.c.events.elem[0]; while (curLen--) { switch (*curVal) { case SatEvtUserAction: if (eventList & SatEvtUserActionActivated) { /* ** CQ 16435 : This can only have happend if this event is listed more than one ** which is invalid and causes a reject! */ eventList = 0; satResponse(SatResImpossible); return 0; } else { eventList|= SatEvtUserActionActivated; *ep |= *curVal; /* event list element */ cmd.c.events.len++; /* number of events */ } break; case SatEvtIdleScreen: if (eventList & SatEvtIdleScreenActivated) { /* ** CQ 16435 : This can only have happend if this event is listed more than one ** which is invalid and causes a reject! */ eventList = 0; satResponse(SatResImpossible); return 0; } else { eventList|= SatEvtIdleScreenActivated; *ep |= *curVal; /* event list element */ cmd.c.events.len++; /* number of events */ } break; /* ACI-SPR-18200: - this event is not completely implemented "Not supported" stated in TERMINAL PROFILE */ #if 0 case SatEvtBrowserTermination: if (eventList & SatEvtBrowserTerminateActivated) { /* ** CQ 16435 : This can only have happend if this event is listed more than one ** which is invalid and causes a reject! */ eventList = 0; satResponse(SatResImpossible); return 0; } else { eventList|= SatEvtBrowserTerminateActivated; *ep |= *curVal; /* event list element */ cmd.c.events.len++; /* number of events */ } break; #endif default: /* CQ16435 : If there is an unsupported event, then the entire list fails, ** reset the eventList to zero and return the response "Beyond ME Capabilities" */ eventList = 0; satResponse(SatResImpossible); return 0; } curVal++; } sat_res[0] = SatResSuccess; /*Terminal response always sent if there are elements */ sat_res[1] = SatResAiNoCause; /* even if they are not MMI */ TRACE_EVENT_P1("MFW event list %x",eventList); satDone(&cmd, (U8*)&sat_res, sizeof(sat_res)); } else { satResponse(SatResUnknownData); return 0; /* no event list found */ } return MfwSatSetEvents; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decIdleText | +--------------------------------------------------------------------+ PURPOSE : decode command: setup idle mode text */ static U32 decIdleText (void) { TRACE_FUNCTION("decIdleText()"); while (curCmdLen > 0) { if (!decDevId(1)) return 0; if (cmd.source == SatDevSIM && cmd.dest == SatDevME) break; /* success */ TRACE_ERROR("illegal device combination"); if (curCR) { satResponse(SatResUnknownData); return 0; } partialCompr = 1; } if (!decText(&cmd.c.text,0x0D,1)) return 0; if (!decIconId(&cmd.c.text.icon,0)) return 0; // Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460 #ifdef FF_MMI_SAT_ICON /* Check if the icon data is present & needs to be read*/ if (cmd.c.text.icon.qual != 0xFF) { /* Initialise the icon data members*/ cmd.c.text.iconInfo.width = 0; cmd.c.text.iconInfo.height = 0; cmd.c.text.iconInfo.dst = NULL; simReadIconData(cmd.c.text.icon.id); } #endif return MfwSatIdleText; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decOpenChannel | +--------------------------------------------------------------------+ PURPOSE : decode command: open channel */ static U32 decOpenChannel (void) { SatAddress addr; SatData subaddr; TRACE_FUNCTION("decOpenChannel()"); while (curCmdLen > 0) { if (!decDevId(1)) return 0; if (cmd.source == SatDevSIM && cmd.dest == SatDevME) break; /* success */ TRACE_ERROR("illegal device combination"); if (curCR) { satResponse(SatResUnknownData); return 0; } partialCompr = 1; } /* Decode alpha idenitifier if present */ cmd.c.open.alpha_id.code = 0; /* set default values */ cmd.c.open.alpha_id.len = -1; /* optional info if absent */ cmd.c.open.alpha_id.text = 0; if (!decAlpha(&cmd.c.open.alpha_id,0)) return 0; /* Decode icon identifier if present */ if (!decIconId(&cmd.c.open.alpha_id.icon,0)) return 0; /* Decode address if present */ /* If address is present then channel type is CSD */ addr.ton = 0; /* set default values */ addr.len = 0; addr.number = 0; if (!decAddrSS(&addr,0x06,0)) return 0; /* Decode subaddress if present */ subaddr.len = 0; subaddr.data = 0; if (!decData(&subaddr,0x08,0)) return 0; /* Decode duration 1 if present */ cmd.c.open.dur1Unit = 0; /* set default values */ cmd.c.open.dur1Value = 0; if (!decDuration(&cmd.c.open.dur1Unit,0)) /* redial timing */ return 0; /* Decode duration 2 if present */ cmd.c.open.dur2Unit = 0; /* set default values */ cmd.c.open.dur2Value = 0; if (!decDuration(&cmd.c.open.dur2Unit,0)) /* redial timing */ return 0; return MfwSatOpenChannel; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decCloseChannel | +--------------------------------------------------------------------+ PURPOSE : decode command: close channel */ static U32 decCloseChannel (void) { U8 alpha_res; TRACE_FUNCTION("decCloseChannel()"); while (curCmdLen > 0) { if (!decDevId(1)) return 0; /* SPR#2321 - DS - Compare with correct SAT Class E device identities */ if ( (cmd.source == SatDevSIM && cmd.dest == SatDevCh1) || (cmd.source == SatDevSIM && cmd.dest == SatDevCh2) || (cmd.source == SatDevSIM && cmd.dest == SatDevCh3) || (cmd.source == SatDevSIM && cmd.dest == SatDevCh4) || (cmd.source == SatDevSIM && cmd.dest == SatDevCh5) || (cmd.source == SatDevSIM && cmd.dest == SatDevCh6) || (cmd.source == SatDevSIM && cmd.dest == SatDevCh7) ) break; /* success */ TRACE_ERROR("illegal device combination"); if (curCR) { satResponse(SatResUnknownData); return 0; } partialCompr = 1; } /* Decode alpha identifier if present */ cmd.c.close.alpha_id.code = 0; /* set default values */ cmd.c.close.alpha_id.len = -1; /* optional info if absent */ cmd.c.close.alpha_id.text = 0; if (!decAlpha(&cmd.c.close.alpha_id,0)) return 0; /* Decode icon identifier if present */ if (!decIconId(&cmd.c.close.alpha_id.icon,0)) return 0; return MfwSatCloseChannel; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decSendData | +--------------------------------------------------------------------+ PURPOSE : decode command: send data */ static U32 decSendData (void) { TRACE_FUNCTION("decSendData()"); while (curCmdLen > 0) { if (!decDevId(1)) return 0; /* SPR#2321 - DS - Compare with correct SAT Class E device identities */ if ( (cmd.source == SatDevSIM && cmd.dest == SatDevCh1) || (cmd.source == SatDevSIM && cmd.dest == SatDevCh2) || (cmd.source == SatDevSIM && cmd.dest == SatDevCh3) || (cmd.source == SatDevSIM && cmd.dest == SatDevCh4) || (cmd.source == SatDevSIM && cmd.dest == SatDevCh5) || (cmd.source == SatDevSIM && cmd.dest == SatDevCh6) || (cmd.source == SatDevSIM && cmd.dest == SatDevCh7) ) break; /* success */ TRACE_ERROR("illegal device combination"); if (curCR) { satResponse(SatResUnknownData); return 0; } partialCompr = 1; } /* Decode alpha identifier if present */ cmd.c.send.alpha_id.code = 0; /* set default values */ cmd.c.send.alpha_id.len = -1; /* optional info if absent */ cmd.c.send.alpha_id.text = 0; if (!decAlpha(&cmd.c.send.alpha_id,0)) return 0; /* Decode icon identifier if present */ if (!decIconId(&cmd.c.send.alpha_id.icon,0)) return 0; return MfwSatSendData; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : decRecvData | +--------------------------------------------------------------------+ PURPOSE : decode command: receive data */ static U32 decRecvData (void) { TRACE_FUNCTION("decRecvData()"); while (curCmdLen > 0) { if (!decDevId(1)) return 0; /* SPR#2321 - DS - Compare with correct SAT Class E device identities */ if ( (cmd.source == SatDevSIM && cmd.dest == SatDevCh1) || (cmd.source == SatDevSIM && cmd.dest == SatDevCh2) || (cmd.source == SatDevSIM && cmd.dest == SatDevCh3) || (cmd.source == SatDevSIM && cmd.dest == SatDevCh4) || (cmd.source == SatDevSIM && cmd.dest == SatDevCh5) || (cmd.source == SatDevSIM && cmd.dest == SatDevCh6) || (cmd.source == SatDevSIM && cmd.dest == SatDevCh7) ) break; /* success */ TRACE_ERROR("illegal device combination"); if (curCR) { satResponse(SatResUnknownData); return 0; } partialCompr = 1; } /* Decode alpha identifier if present */ cmd.c.receive.alpha_id.code = 0; /* set default values */ cmd.c.receive.alpha_id.len = -1; /* optional info if absent */ cmd.c.receive.alpha_id.text = 0; if (!decAlpha(&cmd.c.send.alpha_id,0)) return 0; /* Decode icon identifier if present */ if (!decIconId(&cmd.c.receive.alpha_id.icon,0)) return 0; return MfwSatReceiveData; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : cmdDecode | +--------------------------------------------------------------------+ PURPOSE : command specific decoding */ static void cmdDecode (void) { U32 evt = 0; // T_SIM_ACCESS_PARAM sim_read_param; TRACE_FUNCTION("cmdDecode()"); switch (cmd.type) { case SatCmdDispText: evt = decDispText(); break; case SatCmdGetKey: evt = decGetKey(); break; case SatCmdGetString: evt = decGetString(); break; case SatCmdPlayTone: evt = decPlayTone(); break; case SatCmdSetMenu: evt = decSetMenu(); break; case SatCmdSelItem: evt = decSelItem(); break; case SatCmdSndSMS: evt = decSndSMS(); break; case SatCmdSndSS: evt = decSndSS(); break; case SatCmdSndUSSD: evt = decSndUSSD(); break; case SatCmdCall: evt = decCall(); break; case SatCmdRefresh: evt = decRefresh(); break; case SatCmdEvtList: evt = decSetEvents(); break; case SatCmdIdleText: evt = decIdleText(); break; case SatCmdExecAT: evt = decExecAT(); break; case SatCmdSndDTMF: evt = decSndDTMF(); break; #if defined(FF_WAP) case SatCmdLaunchBrowser: break; #endif /* SPR#1786 - DS - SAT Class E */ case SatCmdOpenChannel: evt = decOpenChannel(); break; case SatCmdCloseChannel: evt = decCloseChannel(); break; case SatCmdSendData: evt = decSendData(); break; case SatCmdReceiveData: evt = decRecvData(); break; case SatCmdEOS: evt = MfwSatSessionEnd; break; default: TRACE_ERROR("unknown command"); satResponse(SatResUnknownType); return; } if (evt == MfwSatOpenChannel) { /* SPR#2321 - DS - Store command details so rAT_PercentSATA * can send the correct command details for Open Channel. */ sat_cmd_saved = (SatCmd*)mfwAlloc(sizeof(SatCmd)); if (sat_cmd_saved != NULL) { TRACE_EVENT("Save Open Channel command details"); memcpy(sat_cmd_saved, &cmd, sizeof(cmd)); } /* Event is sent from rAT_PercentSATA */ return; } // Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460 #ifdef FF_MMI_SAT_ICON curSATCmd = evt; /* Keep a current copy of the command */ if (evt && !isAlphaIdIconPresent) satSignal(evt,&cmd); #else if (evt) satSignal(evt,&cmd); #endif return; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : rAT_PercentSATI | +--------------------------------------------------------------------+ PURPOSE : called by ACI for SIM Toolkit command */ void rAT_PercentSATI (S16 len, U8 *sc) { U8 tl; TRACE_FUNCTION("rAT_PercentSATI()"); if (len <= 0) /* empty command? */ { cmd.number = 0; /* virtual command */ cmd.type = SatCmdEOS; /* terminate session */ cmd.qual = 0; cmd.source = SatDevSIM; cmd.dest = SatDevME; cmdDecode(); return; } if (!sc || *sc != 0xD0) { /* no proactive SIM command */ TRACE_ERROR("no SAT command"); /* ignore message */ return; } curCmd = sc; curCmdLen = len; curData = (U8 *) &cmd + sizeof(SatCmd);/* end of command buffer */ *(curData - 1) = 0x07; tl = getTLValue(sc); if (!tl) /* length error */ return; /* ignore message */ curCmd += tl; curCmdLen -= tl; if (curCmdLen < curLen) /* not enough data */ { TRACE_ERROR("not enough data"); satResponse(SatResUnknownData); /* not understood by ME */ return; } if (curCmdLen > curLen) /* more data than needed: */ curCmdLen = curLen; /* ignore the rest */ partialCompr = 0; /* partial comprehen. flag */ while (curCmdLen > 0) { tl = getTLValue(curCmd); if (!tl) return; curCmd += tl; curCmdLen -= tl; if (curTag == 0x01) /* command details */ { cmd.number = *(curCmd+0); /* transaction number */ cmd.type = *(curCmd+1); /* command ID */ cmd.qual = *(curCmd+2); /* command qualifier */ if (cmd.number == 0x00 || cmd.number == 0xFF) { TRACE_ERROR("invalid command number"); satResponse(SatResUnknownData); } /*SPR#2121 - DS - Copy command specific details into global buffer defCmdDetails */ memcpy(defCmdDetails, curCmd-2, 5); curCmd += curLen; curCmdLen -= curLen; /* length of value bytes */ cmdDecode(); /* do specific decoding */ return; } TRACE_ERROR("no command details"); if (curCR) { satResponse(SatResUnknownData); return; } curCmd += curLen; curCmdLen -= curLen; partialCompr = 1; } satResponse(SatResNoValues); } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : rAT_PercentSATN | +--------------------------------------------------------------------+ PURPOSE : Notification by ACI on notifications for SAT commands */ /* BEGIN ADD: Sumit : Req ID: : 31-Mar-2005*/ #ifndef NEPTUNE_BOARD /* END ADD: Sumit : Req ID: : 31-Mar-2005*/ void rAT_PercentSATN (S16 len, U8 *sc, T_ACI_SATN_CNTRL_TYPE cntrl_type) /* BEGIN ADD: Sumit : Req ID: : 31-Mar-2005*/ #else void rAT_PercentSATN ( SHORT len,UBYTE *sc) #endif /* END ADD: Sumit : Req ID: : 31-Mar-2005*/ { U8 tl; U32 evt = 0; TRACE_FUNCTION("rAT_PercentSATN()"); if (len <= 0 || !sc) /* empty command? */ { TRACE_ERROR("empty SATN!"); #if 0 // ES!! simulate CC result: not modified ?? sc = (U8*) &evt; /* temporary misuse... */ len = 2; #else // ES!! or ignore it ?? return; #endif } if (*sc == 0xD0) { satNoResponse = 1; rAT_PercentSATI(len,sc); /* normal processing */ satNoResponse = 0; return; } curCmd = sc; curCmdLen = len; curData = (U8 *) &cmd + sizeof(SatCmd);/* end of command buffer */ switch (*sc) { case 0x00: /* CC: allowed, not mod. */ case 0x01: /* CC: not allowed */ case 0x02: /* CC: allowed, modified */ partialCompr = 0; /* partial comprehen. flag */ cmd.c.ccres.result = *sc; tl = getTLValue(sc); if (!tl) /* length error */ return; /* ignore message */ curCmd += tl; curCmdLen -= tl; if (curCmdLen < curLen) /* not enough data */ { TRACE_ERROR("SATN: not enough data (ignored)."); return; } if (curCmdLen > curLen) /* more data than needed: */ curCmdLen = curLen; /* ignore the rest */ evt = decCcRes(); if (evt) satSignal(evt,&cmd); break; case 0x81: TRACE_EVENT("SATN: ACI terminal response (ignored)."); break; default: TRACE_EVENT("SATN: unknown header (ignored)."); break; } } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : rAT_PercentSATA | +--------------------------------------------------------------------+ PURPOSE : Alert indication by ACI for SAT commands */ #ifdef FF_SAT_E void rAT_PercentSATA (S16 cId, S32 rdlTimeout_ms,T_ACI_SATA_ADD *addParm) #else void rAT_PercentSATA (S16 cId, S32 rdlTimeout_ms) #endif /* FF_SAT_E */ { TRACE_FUNCTION("rAT_PercentSATA()"); TRACE_EVENT_P1("Redial Time %d",rdlTimeout_ms); /* Store call details */ cmd.c.ccres.redialTime = rdlTimeout_ms; cmd.c.ccres.callId = cId; if (rdlTimeout_ms > 0) /* Check timeout value is valid */ { cm_set_redial(CM_REDIAL_AUTO); } #ifdef FF_SAT_E /* No Channel information available, therefore treat as normal Voice call */ if (addParm == NULL) { #endif /* FF_SAT_E */ //x0035544 Mar 11, 2006. DR:OMAPS00061467 //unless SAT_SETUP_CALL event is executed, dont send MfwSatCcAlert event to BMI #ifdef FF_MMI_SAT_ICON if(isAlphaIdIconPresent ) { setupCall_Executed = TRUE; } else satSignal(MfwSatCcAlert,&cmd); #else satSignal(MfwSatCcAlert,&cmd); #endif return; #ifdef FF_SAT_E } else /* Store channel information in command structure */ { cmd.c.open.channel_type = (T_MFW_SAT_CHN)addParm->chnType; cmd.c.open.establishment_type = (T_MFW_SAT_EST)addParm->chnEst; } /* Determine Channel type and send approriate event to BMI */ switch (addParm->chnType) { case MFW_SAT_CHN_NONE: case MFW_SAT_CHN_VOICE: satSignal(MfwSatCcAlert,&cmd); break; case MFW_SAT_CHN_CSD: case MFW_SAT_CHN_GPRS: /* SPR#2321 - DS - Copy the saved Open Channel details to cmd in case a Call * Control result command was received (therefore overwriting the Open Channel * data) between the original MfwSatOpenChannel command and this alert indication */ if (sat_cmd_saved != NULL) { TRACE_EVENT("Copy the saved Open Channel details to the cmd structure"); memcpy(&cmd, sat_cmd_saved, sizeof(SatCmd)); /* SPR#2340 - DS - Copy full structure */ /* Deallocate saved Open Channel command details */ if (sat_cmd_saved) { TRACE_EVENT("Deallocate sat_cmd_saved"); mfwFree((U8*)sat_cmd_saved, sizeof(SatCmd)); sat_cmd_saved = NULL; } } TRACE_EVENT("satSignal(MfwSatOpenChannel, &cmd)"); satSignal(MfwSatOpenChannel, &cmd); break; default: TRACE_ERROR("Error with SATA channle type!"); break; } #endif /* FF_SAT_E */ } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : rAT_PercentSATE | +--------------------------------------------------------------------+ PURPOSE : called by ACI on response for Envelope commands */ void rAT_PercentSATE (S16 len, U8 *res) { TRACE_FUNCTION("rAT_PercentSATE()"); //ES!! FOR WHAT ?? } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : rAT_PercentSATBROW | +--------------------------------------------------------------------+ PURPOSE : called by ACI when the SAT Browser command arrives. */ #if defined(FF_WAP) void rAT_PercentSATBROW (T_LAUNCH_BROWSER *browser_command) //To be change to T_LAUNCH_BROWSER { int i; T_prov_file_ref* current_prov_file; TRACE_FUNCTION("rAT_PercentSATBROW()"); cmd.c.browser.identity = browser_command->browser_id.browser; cmd.c.browser.url = (U8*) browser_command->url.url_value; cmd.c.browser.n_bearer = browser_command->c_bearer; cmd.c.browser.bearer = (U8*)browser_command->bearer; cmd.c.browser.n_prov_file_ref = browser_command->c_prov_file_ref; for (i=0;(i<browser_command->c_prov_file_ref) && (i<MFW_MAX_PFP_ELEM);i++) { current_prov_file = browser_command->prov_file_ref; cmd.c.browser.prov_file_ref[i].prov_file_id_len = current_prov_file->c_prov_file_id; cmd.c.browser.prov_file_ref[i].prov_file_id = (U8*)current_prov_file->prov_file_id; current_prov_file++; } cmd.c.browser.text_string.icon.qual = browser_command->icon.icon_qu; cmd.c.browser.text_string.icon.id = browser_command->icon.icon_id; /* Copy the text string into the cmd buffer */ { U8 *provPointer; provPointer = (U8 *) &cmd + sizeof(SatCmd);/* end of command buffer */ provPointer -= browser_command->text.c_text_str; /*Substract length of the text */ memcpy(provPointer,browser_command->text.text_str,browser_command->text.c_text_str);/*Copies text*/ cmd.c.browser.text_string.text = (U16) (provPointer - (U8*)&cmd.c.browser.text_string);/*Stores the offset */ cmd.c.browser.text_string.len = browser_command->text.c_text_str; cmd.c.browser.text_string.code = browser_command->text.dcs; } /* Copy the alpha id */ cmd.c.browser.alpha_len = browser_command->c_alpha_id; cmd.c.browser.alpha_id = (U8*)browser_command->alpha_id; satSignal(MfwSatLaunchBrowser, &cmd); /*Send the event to MMI */ } #endif // Aug 31, 2005 REF: CRR 33619 x0021334 // Description: RE: Notification of SATK File Change // Solution: Added stub function 'rAT_PercentSIMEF()' /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework MODULE : MFW_SAT | | STATE : code ROUTINE : rAT_PercentSIMEF | +--------------------------------------------------------------------+ PURPOSE : handles rAT_PercentSIMEF call back */ void rAT_PercentSIMEF (SHORT *ef, UBYTE count) { TRACE_FUNCTION ("rAT_PercentSIMEF()"); } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satAccept | +--------------------------------------------------------------------+ PURPOSE : accept SIM initiated connection */ void satAccept (void) { T_ACI_RETURN res; TRACE_FUNCTION("satAccept()"); mfwSatMoAccepted = 1; res = sAT_A(CMD_SRC_LCL); if (res != AT_EXCT && res != AT_CMPL) { TRACE_ERROR("satAccept() error"); mfwSatMoAccepted = 0; } return; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satReject | +--------------------------------------------------------------------+ PURPOSE : reject SIM initiated connection */ void satReject (void) { T_ACI_RETURN res; TRACE_FUNCTION("satReject()"); res = sAT_H(CMD_SRC_LCL); if (res != AT_EXCT && res != AT_CMPL) TRACE_ERROR("satReject() error"); return; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satDisc | +--------------------------------------------------------------------+ PURPOSE : disconnect SIM initiated connection */ void satDisc (void) { T_ACI_RETURN res; TRACE_FUNCTION("satDisc()"); res = sAT_Abort(CMD_SRC_LCL,AT_CMD_A); if (res != AT_EXCT && res != AT_CMPL) TRACE_ERROR("satDisc() error"); return; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satChangeNotify | +--------------------------------------------------------------------+ PURPOSE : File change notification */ #ifdef FF_2TO1_PS BOOL satChangeNotify ( int ref, T_SIM_FILE_UPDATE_IND *updateInd) { int i; int cnt; UBYTE f = 0; U32 evt = 0; TRACE_FUNCTION ("satChangeNotify ()"); //send a notification to the MMI as well #ifdef OLD_MFW_SAT_REFRESH evt = decRefresh(); /* JVJ. This is not sending the proper information!!!!*/ satSignal(evt, &cmd); #endif memset ( &udNotify, 0, sizeof(udNotify)); /***************************Go-lite Optimization changes Start***********************/ //Aug 16, 2004 REF: CRR 24323 Deepa M.D TRACE_EVENT_P5("file_num: %d, files: %x %x %x %x", updateInd->val_nr, updateInd->file_info[0].datafield, updateInd->file_info[1].datafield, updateInd->file_info[2].datafield, updateInd->file_info[3].datafield); /***************************Go-lite Optimization changes END***********************/ fuRef = ref; cnt = 0; for (i = 0; i < (int)updateInd->val_nr; i++) { if (updateInd->file_info[i].datafield EQ SIM_GID1 OR updateInd->file_info[i].datafield EQ SIM_GID2 OR updateInd->file_info[i].datafield EQ SIM_CPHS_CINF OR updateInd->file_info[i].datafield EQ SIM_SST OR updateInd->file_info[i].datafield EQ SIM_SMS OR updateInd->file_info[i].datafield EQ SIM_SPN OR updateInd->file_info[i].datafield EQ SIM_LP ) { if (cnt < MFW_MAX_NT_SIZE) { udNotify.fields[cnt] = updateInd->file_info[i].datafield; cnt++; if (updateInd->file_info[i].datafield EQ SIM_SMS) // bugfix for SIM refresh sms_busy_ind(); /* When SMS fields will be updated, MFW sends SMS BUSY event to MMI */ } } } udNotify.count = cnt; if (!cnt) { if (fuRef >= 0) fuRef = -1; return TRUE; } for ( i=0; i < (int)udNotify.count; i++) { if ( udNotify.fields[i] EQ SIM_SST ) f = 1; } if (udNotify.count) { if (f) { f = 0; sim_sat_file_update(SIM_SST); } else satUpdateFiles(FALSE, 0); } return FALSE; } #else BOOL satChangeNotify ( int ref, T_SIM_FILE_UPDATE_IND *updateInd) { int i; int cnt; UBYTE f = 0; #if(BOARD != 61) U32 evt = 0; #endif TRACE_FUNCTION ("satChangeNotify ()"); //send a notification to the MMI as well #ifdef OLD_MFW_SAT_REFRESH evt = decRefresh(); /* JVJ. This is not sending the proper information!!!!*/ satSignal(evt, &cmd); #endif memset ( &udNotify, 0, sizeof(udNotify)); /***************************Go-lite Optimization changes Start***********************/ //Aug 16, 2004 REF: CRR 24323 Deepa M.D TRACE_EVENT_P5("file_num: %d, files: %x %x %x %x", updateInd->val_nr, updateInd->file_id[0], updateInd->file_id[1], updateInd->file_id[2], updateInd->file_id[3]); /***************************Go-lite Optimization changes END***********************/ fuRef = ref; cnt = 0; for (i = 0; i < (int)updateInd->val_nr; i++) { if (updateInd->file_id[i] EQ SIM_GID1 OR updateInd->file_id[i] EQ SIM_GID2 OR updateInd->file_id[i] EQ SIM_CPHS_CINF OR updateInd->file_id[i] EQ SIM_SST OR updateInd->file_id[i] EQ SIM_SMS OR updateInd->file_id[i] EQ SIM_SPN OR updateInd->file_id[i] EQ SIM_LP ) { if (cnt < MFW_MAX_NT_SIZE) { udNotify.fields[cnt] = updateInd->file_id[i]; cnt++; if (updateInd->file_id[i] EQ SIM_SMS) // bugfix for SIM refresh sms_busy_ind(); /* When SMS fields will be updated, MFW sends SMS BUSY event to MMI */ } } } udNotify.count = cnt; if (!cnt) { if (fuRef >= 0) fuRef = -1; return TRUE; } for ( i=0; i < (int)udNotify.count; i++) { if ( udNotify.fields[i] EQ SIM_SST ) f = 1; } if (udNotify.count) { if (f) { f = 0; sim_sat_file_update(SIM_SST); } else satUpdateFiles(FALSE, 0); } return FALSE; } #endif /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satUpdateFiles | +--------------------------------------------------------------------+ PURPOSE : Update changed files updated = TRUE, dataId field is updated updated = FALSE, no field is updated */ void satUpdateFiles ( U8 updated, USHORT dataId ) { int i; TRACE_FUNCTION("satUpdateFiles()"); /* remove the updated file from list */ if (updated) { for (i=0; i < MFW_MAX_NT_SIZE; i++) { if (udNotify.fields[i] EQ dataId) { udNotify.count--; udNotify.fields[i] = 0; } } } if (!udNotify.count) { if (fuRef >= 0) { psaSAT_FUConfirm (fuRef, SIM_FU_SUCCESS); fuRef = -1; } return; } /* update the next file */ for ( i=0; i < MFW_MAX_NT_SIZE; i++) { if ( udNotify.fields[i] ) { switch ( udNotify.fields[i] ) { case SIM_GID1: sim_sat_file_update( SIM_GID1 ); return; case SIM_GID2: sim_sat_file_update( SIM_GID2 ); return; case SIM_CPHS_CINF: cphs_sat_file_update( SIM_CPHS_CINF ); return; case SIM_SMS: sms_sat_file_update( SIM_SMS ); return; case SIM_SPN: nm_sat_file_update( SIM_SPN ); return; case SIM_LP: mfwSATLPRefresh = TRUE; sim_sat_file_update( SIM_LP ); return; default: break; } } } } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satRefreshNotification | +--------------------------------------------------------------------+ PURPOSE : File change notification start and refresh confirmatio */ BOOL satRefreshNotification ( int ref, T_SIM_FILE_UPDATE_IND *updateInd) { U32 evt=0; TRACE_FUNCTION("satRefreshNotification"); if (ref<0) /*File update indication arrives from ACI */ { /* MMI has to be notified once */ #ifdef FF_2TO1_PS cmd.c.refFiles.files = (U16*)updateInd->file_info[0].datafield; #else cmd.c.refFiles.files = (U16*)updateInd->file_id; #endif cmd.c.refFiles.files_nr = updateInd->val_nr; cmd.c.refFiles.status = ref; if (updateInd->val_nr) evt = MfwSatRefresh; if (evt) satSignal(evt, &cmd); if (fu_aborted) { fu_aborted = FALSE; return FALSE; } } else { #ifdef FF_2TO1_PS cmd.c.refFiles.files = (U16*)updateInd->file_info[0].datafield; #else cmd.c.refFiles.files = (U16*)updateInd->file_id; #endif cmd.c.refFiles.files_nr = updateInd->val_nr; cmd.c.refFiles.status = ref; if (updateInd->val_nr) evt = MfwSatDataRefreshed; if (evt) satSignal(evt, &cmd); } return TRUE; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satRefreshAbort | +--------------------------------------------------------------------+ PURPOSE : MMI aborts the file update notification. It should answer the event MfwSatRefresh */ void satRefreshAbort() { fu_aborted = TRUE; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : satBrowserTerminated | +--------------------------------------------------------------------+ PURPOSE : downloads the Browser termination event to the SAT. Cause can be, SatBrowserTerminCauseUser 0x00 SatBrowserTerminCauseError 0x01 SPR#2121 - DS - Dynamically allocate memory for Terminal Response. */ #if defined(FF_WAP) MfwRes satBrowserTerminated(U8 cause) { S16 ti = 0; U8* trmResponse = NULL; TRACE_FUNCTION("satBrowserTerminated"); /* Allocate memory for Terminal Response buffer */ trmResponse = (U8*)mfwAlloc(TRM_RSP_LEN); if (trmResponse == NULL) { /* Memory allocation failed */ TRACE_ERROR("ERROR: Failed to allocate memory for TR buffer"); return MfwResNoMem; } trmResponse[ti++] = 0xD6; /* event download tag */ trmResponse[ti++] = 0; /* length (filled later) */ trmResponse[ti++] = 0x99; /* --event list-- */ trmResponse[ti++] = 0x01; /* length */ trmResponse[ti++] = SatEvtBrowserTermination; /* actual event */ trmResponse[ti++] = 0x82; /* --device identities-- */ trmResponse[ti++] = 0x02; /* length */ trmResponse[ti++] = SatDevME; /* source */ trmResponse[ti++] = 0x81; /* destination: SIM */ trmResponse[ti++] = 0x34; /* Browser Termination Cause tag */ trmResponse[ti++] = 0x01; /* Browser Termination length*/ trmResponse[ti++] = cause; /* termination cause */ trmResponse[1] = ti - 2; /* length of event download */ sAT_PercentSATE(CMD_SRC_LCL,ti,trmResponse); /* Deallocate memory used for Terminal Response buffer */ if (trmResponse != NULL) { mfwFree(trmResponse, TRM_RSP_LEN); trmResponse = NULL; } return MfwResOk; } #endif /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_SAT | | STATE : code ROUTINE : sate_error | +--------------------------------------------------------------------+ PURPOSE : Handles errors returned from SAT. SPR#2321 - DS - Function created. */ void sate_error(T_ACI_CME_ERR error) { TRACE_FUNCTION("sate_error()"); TRACE_EVENT_P1("SATE Error: %d", error); if (error == CME_ERR_SimSatBusy) { /* Close any open connections */ satDisc(); /* Send "temporary failure" terminal response so SIM can restart the busy SAT Application */ satResponse(SatResBusyME); /* Send event to BMI so user can be informed of error */ satSignal(MfwSatErrBusy, (void*)error); } } // Jun 16, 2005 REF: CRR 31543 x0021334 /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework MODULE : MFW_SAT | | STATE : code ROUTINE : satHangup | +--------------------------------------------------------------------+ PURPOSE : Handles Hang up key event during USSD session. */ T_MFW_SS_RETURN satHangup (T_ACI_CMD_SRC sId) { T_ACI_RETURN result; TRACE_FUNCTION("satHangup()"); result = sAT_end_ussd(sId); // end the USSD session return ((result EQ AT_CMPL) ? MFW_SS_OK : MFW_SS_FAIL); }