⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mfw_sat.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
    {
      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;
}


/*
+--------------------------------------------------------------------+

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -