Example #1
0
VOS_UINT32 TAF_SPM_MsgProc(
    struct MsgCB                       *pstSrcMsg,
    struct MsgCB                      **ppstDestMsg
)
{
    VOS_UINT32                          ulEventType;
    VOS_UINT32                          ulRet;
    TAF_SPM_ENTRY_MSG_STRU             *pstEntryMsg     = VOS_NULL_PTR;

    REL_TIMER_MSG                      *pstRcvTimerMsg  = VOS_NULL_PTR;
    MSG_HEADER_STRU                    *pstMsgHeader    = VOS_NULL_PTR;

    pstMsgHeader = (MSG_HEADER_STRU *)pstSrcMsg;

    /* 动作表里的时间消息不能靠消息头名称进行区分,依靠其结构体的ulName域进行区分
        所以此处进行分别处理 */
    if (VOS_PID_TIMER == pstMsgHeader->ulSenderPid)
    {
        pstRcvTimerMsg = (REL_TIMER_MSG *)pstSrcMsg;

        /* 只停止SPM自己的定时器,其它模块定时器在其内部自己停止 */
        if (MN_TIMER_CLASS_SPM == (pstRcvTimerMsg->ulName & MN_TIMER_CLASS_MASK))
        {
            TAF_SPM_StopTimer(pstRcvTimerMsg->ulName,(VOS_UINT16)pstRcvTimerMsg->ulPara);
        }
    }

    ulEventType = TAF_SPM_BuildEventType(pstSrcMsg);

    /* 如果已经预处理完成则直接返回 */
    if (VOS_TRUE == TAF_SPM_PreProcessMsg(ulEventType, pstSrcMsg))
    {
        return VOS_TRUE;
    }

    /* 如果已经处理完成则直接返回 */
    ulRet = TAF_SPM_ProcessMsgInFsm(ulEventType, pstSrcMsg);

    /* 判断是否需要替换入口消息 */
    if (VOS_TRUE == TAF_SPM_GetUpdateEntryMsgFlg())
    {
        pstEntryMsg = TAF_SPM_GetServiceCtrlEntryMsgAddr();
       *ppstDestMsg = (struct MsgCB *)pstEntryMsg->aucEntryMsgBuffer;

        /* 消息已经使用,回复设置标记位,但不能清除消息。  */
        TAF_SPM_SetUpdateEntryMsgFlg(VOS_FALSE);
    }
    else
    {
       *ppstDestMsg = pstSrcMsg;
    }

    /* 继续处理处理 */
    return ulRet;
}
VOS_UINT32 TAF_SPM_RcvSpmServiceCtrlResultInd_Main(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    TAF_SPM_SERVICE_CTRL_RSLT_STRU                         *pstServiceCtrlRslt = VOS_NULL_PTR;
    VOS_UINT8                                               ucOpId;
    VOS_UINT32                                              ulRet;
    VOS_UINT32                                              ulAppEventType;
    struct MsgCB                                           *pstAppMsg          = VOS_NULL_PTR;
#if (FEATURE_IMS == FEATURE_ON)
    TAF_SPM_DOMAIN_SEL_RESULT_ENUM_UINT8                    enDomainSelRslt;
#endif

    ulRet   = VOS_TRUE;

    pstServiceCtrlRslt = (TAF_SPM_SERVICE_CTRL_RSLT_STRU*)pstMsg;

    TAF_SPM_GetOpIdWithAppMsg((struct MsgCB*)pstServiceCtrlRslt->stEntryMsg.aucEntryMsgBuffer, &ucOpId);

    pstAppMsg      = (struct MsgCB*)&(pstServiceCtrlRslt->stEntryMsg.aucEntryMsgBuffer[0]);
    ulAppEventType = pstServiceCtrlRslt->stEntryMsg.ulEventType;

    /* 检查结果为失败 */
    if (TAF_SPM_SERVICE_CTRL_FAIL == pstServiceCtrlRslt->enResult)
    {
        /* 向AT或STK发送失败结果,携带cause,临时响应修改为正式响应 */
        TAF_SPM_SendServiceRequetFail_Main(ulAppEventType, pstAppMsg, pstServiceCtrlRslt->ulCause);

        return VOS_TRUE;
    }

#if (FEATURE_IMS == FEATURE_ON)
    enDomainSelRslt = TAF_SPM_ProcServiceRequestDomainSelection(ulAppEventType, pstAppMsg);

    ulRet           = TAF_SPM_ProcInitialDomainSelectionResult(ulAppEventType, pstAppMsg, enDomainSelRslt);
#else
    ulRet           = TAF_SPM_ProcReqMsgBasedOnNasSignalling(ulAppEventType, pstAppMsg);
#endif

    if (VOS_TRUE == ulRet)
    {
        return VOS_TRUE;
    }

    /* 检查结果为成功设置更新入口消息标记并保存修改后的入口消息到全局变量中 */
    TAF_SPM_UpdateServiceCtrlEntryMsg(ulAppEventType, pstAppMsg);

    TAF_SPM_SetUpdateEntryMsgFlg(VOS_TRUE);

    return VOS_FALSE;
}