VOS_UINT32 TAF_SPM_BuildEventType( struct MsgCB *pstMsg ) { VOS_UINT32 ulEventType; MSG_HEADER_STRU *pstMsgHeader = VOS_NULL_PTR; REL_TIMER_MSG *pstRcvTimerMsg = VOS_NULL_PTR; pstMsgHeader = (MSG_HEADER_STRU *)pstMsg; /* 动作表里的时间消息不能靠消息头名称进行区分,依靠其结构体的ulName域进行区分 所以此处进行分别处理 */ if (VOS_PID_TIMER == pstMsgHeader->ulSenderPid) { pstRcvTimerMsg = (REL_TIMER_MSG *)pstMsg; ulEventType = TAF_BuildEventType(pstMsgHeader->ulSenderPid, (VOS_UINT16)pstRcvTimerMsg->ulName); } else { /*lint -e701*/ ulEventType = TAF_BuildEventType((VOS_UINT16)pstMsgHeader->ulSenderPid, (VOS_UINT16)pstMsgHeader->ulMsgName); /*lint +e701*/ } return ulEventType; }
VOS_UINT32 TAF_MMA_BuildEventType( struct MsgCB *pstMsg ) { VOS_UINT32 ulEventType; MSG_HEADER_STRU *pstMsgHeader = VOS_NULL_PTR; REL_TIMER_MSG *pstRcvTimerMsg = VOS_NULL_PTR; pstMsgHeader = (MSG_HEADER_STRU *)pstMsg; /* 动作表里的时间消息不能靠消息头名称进行区分,依靠其结构体的ulName域进行区分 所以此处进行分别处理 */ if (VOS_PID_TIMER == pstMsgHeader->ulSenderPid) { pstRcvTimerMsg = (REL_TIMER_MSG *)pstMsg; ulEventType = TAF_BuildEventType(pstMsgHeader->ulSenderPid, (VOS_UINT16)pstRcvTimerMsg->ulName); /* 停开关机相关定时器,原来的定时器在后续优化后停止 */ if (MN_TIMER_CLASS_MMA == (pstRcvTimerMsg->ulName & MN_TIMER_CLASS_MASK)) { TAF_MMA_StopTimer((VOS_UINT16)pstRcvTimerMsg->ulName); } } else { /*lint -e701*/ ulEventType = TAF_BuildEventType((VOS_UINT16)pstMsgHeader->ulSenderPid, (VOS_UINT16)pstMsgHeader->ulMsgName); /*lint +e701*/ } return ulEventType; }
VOS_UINT32 TAF_MMA_IsNeedCacheMsg( VOS_UINT32 ulEventType, VOS_VOID *pstMsg ) { VOS_UINT32 ulIndex; switch (ulEventType) { /* 当前卡状态指示消息的缓存只需要缓存一条 */ case TAF_BuildEventType(WUEPS_PID_MMA, MMA_MMA_INTER_USIM_STATUS_CHANGE_IND): if (VOS_TRUE == TAF_MMA_IsExistCacheMsg(TAF_BuildEventType(WUEPS_PID_MMA, MMA_MMA_INTER_USIM_STATUS_CHANGE_IND), &ulIndex)) { return VOS_FALSE; } break; default: break; } /* 默认返回保存该消息 */ return VOS_TRUE; }
VOS_UINT32 TAF_APS_BuildEventType( struct MsgCB *pstMsg ) { MSG_HEADER_STRU *pstMsgHeader; REL_TIMER_MSG *pstRcvTimerMsg; VOS_UINT32 ulEventType = 0; APS_SNDCP_COMMON_MSG *pstSnCommonMsg; /* 动作表里的时间消息不能靠消息头名称进行区分,依靠其结构体的ulName域进行区分 所以此处进行分别处理 */ pstMsgHeader = (MSG_HEADER_STRU*)pstMsg; if ( VOS_PID_TIMER == pstMsgHeader->ulSenderPid ) { pstRcvTimerMsg = (REL_TIMER_MSG *)pstMsg; ulEventType = TAF_BuildEventType(pstMsgHeader->ulSenderPid, pstRcvTimerMsg->ulName); } else if (WUEPS_PID_SM == pstMsgHeader->ulSenderPid) { ulEventType = TAF_BuildEventType((VOS_UINT16)pstMsgHeader->ulSenderPid, (VOS_UINT16)pstMsgHeader->ulMsgName); } else if (UEPS_PID_SN == pstMsgHeader->ulSenderPid) { /* SNDCP的格式,也需要特殊处理一下,msgname的长度不同 */ pstSnCommonMsg = (APS_SNDCP_COMMON_MSG*)pstMsg; ulEventType = TAF_BuildEventType((VOS_UINT16)pstMsgHeader->ulSenderPid, (VOS_UINT16)pstSnCommonMsg->usMsgType); } else { ulEventType = TAF_BuildEventType((VOS_UINT16)pstMsgHeader->ulSenderPid, (VOS_UINT16)pstMsgHeader->ulMsgName); } return ulEventType; }
VOS_UINT32 TAF_SPM_IsUssdServiceType( VOS_UINT32 ulEventType ) { VOS_UINT32 ulResult; ulResult = VOS_FALSE; switch (ulEventType) { case TAF_BuildEventType(WUEPS_PID_AT, TAF_MSG_PROCESS_USS_MSG): case TAF_BuildEventType(MAPS_STK_PID, STK_SS_USSD_REQ): ulResult = VOS_TRUE; break; default: break; } return ulResult; }
VOS_UINT32 TAF_SPM_SendPbCallFdnCheckReq( VOS_UINT16 usClientId, struct MsgCB *pstMsg ) { #if (FEATURE_ON == FEATURE_IMS) VOS_UINT32 ulEventType; #endif PS_PB_FDN_NUM_STRU stFdnInfo; MN_CALL_CALLED_NUM_STRU stDialNumber; MN_CALL_TYPE_ENUM_U8 enCallType; MN_CALL_MODE_ENUM_U8 enCallMode; MN_CALL_CS_DATA_CFG_STRU stDataCfg; VOS_UINT32 ulRet; PS_MEM_SET(&stFdnInfo, 0x00, sizeof(stFdnInfo)); PS_MEM_SET(&stDataCfg, 0x00, sizeof(stDataCfg)); PS_MEM_SET(&stDialNumber, 0x00, sizeof(stDialNumber)); #if (FEATURE_ON == FEATURE_IMS) ulEventType = TAF_SPM_GetEventTypeFromCurrEntityFsmEntryMsg(); #endif /* 由于增强型多方通话已经解析过了,这里不再需要解析 */ #if (FEATURE_ON == FEATURE_IMS) if (ulEventType == TAF_BuildEventType(WUEPS_PID_AT, TAF_CALL_APP_ECONF_DIAL_REQ)) { return TAF_SPM_SendUsimEconfFdnReq(usClientId, pstMsg); } #endif /* 获取呼叫发起请求主动的stDialNumber */ TAF_SPM_GetCallInfoFromFsmEntryMsg(&stDialNumber, &enCallType, &enCallMode, &stDataCfg); stFdnInfo.ulNum1Len = stDialNumber.ucNumLen <= MN_CALL_MAX_BCD_NUM_LEN ? stDialNumber.ucNumLen : MN_CALL_MAX_BCD_NUM_LEN; PS_MEM_CPY(stFdnInfo.aucNum1, stDialNumber.aucBcdNum, MN_CALL_MAX_BCD_NUM_LEN); ulRet = NAS_PBAPI_FdnNumCheck(WUEPS_PID_TAF, 0, usClientId, &stFdnInfo); if (VOS_OK != ulRet) { return VOS_FALSE; } return VOS_TRUE; }
TAF_MMA_MSG_CACHE_PRIO_ENUM_UINT8 TAF_MMA_GetCachedMsgPrio( TAF_MMA_ENTRY_MSG_STRU *pstEntryMsg ) { TAF_MMA_MSG_CACHE_PRIO_ENUM_UINT8 enPrio; switch (pstEntryMsg->ulEventType) { case TAF_BuildEventType(WUEPS_PID_OM, OAM_MMA_PHONE_MODE_SET_REQ): case TAF_BuildEventType(WUEPS_PID_TAF, ID_TAF_MMA_PHONE_MODE_SET_REQ): enPrio = TAF_MMA_MSG_CACHE_PRIO_HIGH; break; case TAF_BuildEventType(WUEPS_PID_MMA, MMA_MMA_INTER_USIM_STATUS_CHANGE_IND): enPrio = TAF_MMA_MSG_CACHE_PRIO_MIDDLE; break; /* 查询预处理先返回了 */ case TAF_BuildEventType(WUEPS_PID_TAF, ID_TAF_MMA_SYS_CFG_SET_REQ): case TAF_BuildEventType(WUEPS_PID_AT, TAF_MSG_MMA_PLMN_USER_SEL): case TAF_BuildEventType(WUEPS_PID_AT, TAF_MSG_MMA_PLMN_LIST): case TAF_BuildEventType(WUEPS_PID_AT, TAF_MSG_MMA_ATTACH): case TAF_BuildEventType(WUEPS_PID_TAF, ID_TAF_MMA_DETACH_REQ): case TAF_BuildEventType(WUEPS_PID_AT, TAF_MSG_MMA_PLMN_RESEL): default: enPrio = TAF_MMA_MSG_CACHE_PRIO_LOW; break; } return enPrio; }
VOS_VOID TAF_XPDS_ProcessIntMsg(VOS_VOID) { MSG_HEADER_STRU *pstIntMsg = VOS_NULL_PTR; VOS_UINT32 ulEventType; pstIntMsg = (MSG_HEADER_STRU *)TAF_XPDS_GetNextIntMsg(); while (VOS_NULL_PTR != pstIntMsg) { /* 消息勾包 */ TAF_XPDS_MNTN_TraceIntMsg(pstIntMsg->ulSenderPid, pstIntMsg->ulLength + VOS_MSG_HEAD_LENGTH, (VOS_VOID *)pstIntMsg); ulEventType = TAF_BuildEventType(pstIntMsg->ulSenderPid, (VOS_UINT16)pstIntMsg->ulMsgName); /* 如果已经处理完成则取下条消息继续处理 */ if (VOS_TRUE == TAF_XPDS_PreProcessMsg(ulEventType, (struct MsgCB*)pstIntMsg)) { /* 释放内部消息 */ PS_MEM_FREE(pstIntMsg->ulSenderPid, pstIntMsg); /* 继续下一条消息处理 */ pstIntMsg = (MSG_HEADER_STRU *)TAF_XPDS_GetNextIntMsg(); continue; } /* 消息进状态机处理 */ TAF_XPDS_ProcessMsgInFsm(ulEventType, (struct MsgCB *)pstIntMsg); /* 释放内部消息 */ PS_MEM_FREE(pstIntMsg->ulSenderPid, pstIntMsg); /* 继续下一条消息处理 */ pstIntMsg = (MSG_HEADER_STRU *)TAF_XPDS_GetNextIntMsg(); } return; }
VOS_UINT32 TAF_SPM_SendUsimCallEnvelopeReq_Call( VOS_UINT16 usClientId, struct MsgCB *pstMsg ) { MN_CALL_CS_DATA_CFG_INFO_STRU stDataCfgInfo; MN_CALL_CALLED_NUM_STRU stCalledNumber; #if (FEATURE_ON == FEATURE_IMS) VOS_UINT32 ulEventType; #endif MN_CALL_TYPE_ENUM_U8 enCallType; MN_CALL_MODE_ENUM_U8 enCallMode; PS_MEM_SET(&stCalledNumber, 0x0, sizeof(stCalledNumber)); PS_MEM_SET(&stDataCfgInfo, 0x0, sizeof(MN_CALL_CS_DATA_CFG_INFO_STRU)); #if (FEATURE_ON == FEATURE_IMS) ulEventType = TAF_SPM_GetEventTypeFromCurrEntityFsmEntryMsg(); #endif /* 由于增强型多方通话已经解析过了,这里不再需要解析 */ #if (FEATURE_ON == FEATURE_IMS) if (ulEventType == TAF_BuildEventType(WUEPS_PID_AT, TAF_CALL_APP_ECONF_DIAL_REQ)) { return TAF_SPM_SendUsimEconfEnvelopeReq(usClientId, pstMsg); } else #endif { /* 从消息中获取电话号码相关信息 */ TAF_SPM_GetCallInfoFromFsmEntryMsg(&stCalledNumber, &enCallType, &enCallMode, (MN_CALL_CS_DATA_CFG_STRU *)&stDataCfgInfo); /* 发起检查 */ return TAF_SPM_SendUsimCallEnvelopeReq(&stCalledNumber, &stDataCfgInfo, usClientId, enCallType, enCallMode); } }
#ifdef __cplusplus #if __cplusplus extern "C" { #endif #endif #define THIS_FILE_ID PS_FILE_ID_TAF_APS_GET_PDPID_LIST_C /***************************************************************************** 2 全局变量定义 *****************************************************************************/ TAF_APS_GET_FSM_PDPID_LIST_STRU gastApsGetPdpIdList[] = { {TAF_BuildEventType(WUEPS_PID_TAF, ID_MSG_TAF_PS_SET_PDP_CONTEXT_STATE_REQ), TAF_APS_GetPdpIdListWithAtSetPdpContextStateReq}, {TAF_BuildEventType(WUEPS_PID_TAF, ID_MSG_TAF_PS_CALL_MODIFY_REQ), TAF_APS_GetPdpIdListWithAtCallModifyReq}, {TAF_BuildEventType(WUEPS_PID_TAF, ID_MSG_TAF_PS_CALL_ORIG_REQ), TAF_APS_GetPdpIdListWithAtCallOrigReq}, {TAF_BuildEventType(WUEPS_PID_TAF, ID_MSG_TAF_PS_PPP_DIAL_ORIG_REQ), TAF_APS_GetPdpIdListWithAtPppDialOrigReq}, {TAF_BuildEventType(WUEPS_PID_TAF, ID_MSG_TAF_PS_CALL_END_REQ), TAF_APS_GetPdpIdListWithAtCallEndReq}, {TAF_BuildEventType(WUEPS_PID_TAF, ID_MSG_TAF_PS_CALL_ANSWER_REQ), TAF_APS_GetPdpIdListWithAtCallAnswerReq}, {TAF_BuildEventType(WUEPS_PID_TAF, ID_MSG_TAF_PS_CALL_HANGUP_REQ), TAF_APS_GetPdpIdListWithAtCallHangupReq}, {TAF_BuildEventType(WUEPS_PID_SM, ID_SMREG_PDP_ACTIVATE_CNF), TAF_APS_GetPdpIdListWithSmPdpActCnf}, {TAF_BuildEventType(WUEPS_PID_SM, ID_SMREG_PDP_ACTIVATE_REJ), TAF_APS_GetPdpIdListWithSmPdpActRej}, {TAF_BuildEventType(WUEPS_PID_SM, ID_SMREG_PDP_ACTIVATE_IND), TAF_APS_GetPdpIdListWithSmPdpActInd}, {TAF_BuildEventType(WUEPS_PID_SM, ID_SMREG_PDP_MODIFY_CNF), TAF_APS_GetPdpIdListWithSmPdpModifyCnf}, {TAF_BuildEventType(WUEPS_PID_SM, ID_SMREG_PDP_MODIFY_IND), TAF_APS_GetPdpIdListWithSmPdpModifyInd}, {TAF_BuildEventType(WUEPS_PID_SM, ID_SMREG_PDP_MODIFY_REJ), TAF_APS_GetPdpIdListWithSmPdpModifyRej}, {TAF_BuildEventType(WUEPS_PID_SM, ID_SMREG_PDP_DEACTIVATE_IND), TAF_APS_GetPdpIdListWithSmPdpDeactivInd}, {TAF_BuildEventType(WUEPS_PID_SM, ID_SMREG_PDP_DEACTIVATE_CNF), TAF_APS_GetPdpIdListWithSmPdpDeactivCnf}, {TAF_BuildEventType(WUEPS_PID_SM, ID_SMREG_PDP_ACTIVATE_SEC_CNF), TAF_APS_GetPdpIdListWithSmPdpActSecCnf},
#endif #endif /***************************************************************************** 协议栈打印打点方式下的.C文件宏定义 *****************************************************************************/ #define THIS_FILE_ID PS_FILE_ID_TAF_MMA_MSG_PRIO_COMPARE_C /***************************************************************************** 2 全局变量定义 *****************************************************************************/ TAF_MMA_MSG_COMPARE_STRU g_astMmaMsgPrioCompareWithPhoneModeTbl[] = { /* phone mode过程中收到OM的模式设置请求的消息优先级比较 */ TAF_MMA_COMPARE_TBL_ITEM(TAF_BuildEventType(WUEPS_PID_OM, OAM_MMA_PHONE_MODE_SET_REQ), TAF_MMA_ComparePhoneModeSetReqPrioWithPhoneMode), /* 模式查询不需要比较 */ /* phone mode过程中收到模式设置请求的消息优先级比较 */ TAF_MMA_COMPARE_TBL_ITEM(TAF_BuildEventType(WUEPS_PID_TAF, ID_TAF_MMA_PHONE_MODE_SET_REQ), TAF_MMA_ComparePhoneModeSetReqPrioWithPhoneMode), /* phone mode过程中收到MMA的内部卡状态指示的消息优先级比较 */ TAF_MMA_COMPARE_TBL_ITEM(TAF_BuildEventType(WUEPS_PID_MMA, MMA_MMA_INTER_USIM_STATUS_CHANGE_IND), TAF_MMA_CompareMmaInterUsimStatusChangeIndPrioWithPhoneMode),
VOS_VOID TAF_XPDS_MsgProc (struct MsgCB* pstMsg) { MSG_HEADER_STRU *pstMsgHeader = VOS_NULL_PTR; REL_TIMER_MSG *pRcvTimerMsg = VOS_NULL_PTR; VOS_UINT32 ulEventType; VOS_UINT32 usOldStackDepth; VOS_UINT32 usNewStackDepth; /* 空指针检查 */ if (VOS_NULL_PTR == pstMsg) { /* 打印错误信息 */ return; } pstMsgHeader = (MSG_HEADER_STRU *)pstMsg; /* 生成事件类型 */ if (VOS_PID_TIMER == pstMsgHeader->ulSenderPid) { pRcvTimerMsg = (REL_TIMER_MSG *)pstMsg; ulEventType = TAF_BuildEventType(pstMsgHeader->ulSenderPid, pRcvTimerMsg->ulName); /* 停止对应的定时器 */ TAF_XPDS_StopTimer(pRcvTimerMsg->ulName); } else { ulEventType = TAF_BuildEventType(pstMsgHeader->ulSenderPid, (VOS_UINT16)pstMsgHeader->ulMsgName); } /* 如果已经处理完成则直接返回 */ if (VOS_TRUE == TAF_XPDS_PreProcessMsg(ulEventType, pstMsg)) { /* 处理内部消息队列 */ TAF_XPDS_ProcessIntMsg(); return; } /* 获取当前XREG的栈深度 */ usOldStackDepth = TAF_XPDS_GetFsmStackDepth(); /* 进入状态机处理 */ TAF_XPDS_ProcessMsgInFsm(ulEventType, pstMsg); /* 在状态机退出后,获取新的栈深度 */ usNewStackDepth = TAF_XPDS_GetFsmStackDepth(); /* 处理内部消息队列 */ TAF_XPDS_ProcessIntMsg(); /* 如果栈的深度减少,说明肯定进行了退栈操作,需要优先处理该状态机的结果消息,直接返回 */ if (usNewStackDepth < usOldStackDepth) { /* To do: 记录退栈操作,只要发生了退栈后续就可以处理缓存 */ return; } return; }
VOS_UINT32 TAF_SPM_SendUsimSsEnvelopeReq( VOS_UINT16 usClientId, struct MsgCB *pstMsg ) { VOS_UINT8 aucLI[MN_MO_CTRL_LAI_LEN]; VOS_UINT8 aucSsString[TAF_SPM_CALL_CTRL_SS_STRING_LEN]; VOS_UINT8 ucSscStringBcdLen; SI_STK_ENVELOPE_STRU stEnvelopeMsg; VOS_UINT32 ulRet; VOS_CHAR *pcSscString = VOS_NULL_PTR; MN_APP_REQ_MSG_STRU *pstAppReq = VOS_NULL_PTR; MN_APP_SS_REGISTER_REQ_STRU *pstRegister = VOS_NULL_PTR; VOS_UINT32 ulEventType; MN_MMI_OPERATION_TYPE_ENUM_U8 enSsOpType; pcSscString = (VOS_CHAR *)PS_MEM_ALLOC(WUEPS_PID_TAF, TAF_SPM_SSC_MAX_LEN); if (VOS_NULL_PTR == pcSscString) { TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_SendUsimSsEnvelopeReq: Fail to alloc memory for SS info."); return VOS_FALSE; } PS_MEM_SET(pcSscString, 0, TAF_SPM_SSC_MAX_LEN); /* 根据消息转换出SSC STRING */ ulRet = TAF_MmiEncodeMmiString(pstMsg, pcSscString); if (VOS_TRUE != ulRet) { TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_SendUsimSsEnvelopeReq: Fail to Encode SSC string."); PS_MEM_FREE(WUEPS_PID_TAF, pcSscString); return VOS_FALSE; } /* SS STRING的第一个字节是TON and NPI,从第二字节开始为SSC 的BCD编码 参考协议 11.11: 10.5.1 EFADN (Abbreviated dialling numbers) TON and NPI Contents: Type of number (TON) and numbering plan identification (NPI). Coding: according to TS 04.08 [15]. If the Dialling Number/SSC String does not contain a dialling number, e.g. a control string deactivating a service, the TON/NPI byte shall be set to 'FF' by the ME (see note 2). NOTE 2: If a dialling number is absent, no TON/NPI byte is transmitted over the radio interface (see TS 04.08 [15]). Accordingly, the ME should not interpret the value 'FF' and not send it over the radio interface. */ PS_MEM_SET(aucSsString, 0, TAF_SPM_CALL_CTRL_SS_STRING_LEN); aucSsString[0] = TAF_SPM_NUM_TYPE_INVALID; pstAppReq = (MN_APP_REQ_MSG_STRU *)pstMsg; ulEventType = TAF_BuildEventType(pstAppReq->ulSenderPid, pstAppReq->usMsgName); ulRet = TAF_MmiGetOperationType(ulEventType, &enSsOpType); if ((VOS_TRUE == ulRet) && (TAF_MMI_REGISTER_SS == enSsOpType)) { pstRegister = (MN_APP_SS_REGISTER_REQ_STRU *)pstMsg; /* 仅呼叫转移有注册操作,呼叫转移注册操作必须有号码类型 */ aucSsString[0] = pstRegister->stTafSsRegisterSsReq.NumType; } ulRet = TAF_STD_ConvertAsciiNumberToBcd(pcSscString, &aucSsString[TAF_SPM_SSC_OFFSET], &ucSscStringBcdLen); PS_MEM_FREE(WUEPS_PID_TAF, pcSscString); if (MN_ERR_NO_ERROR != ulRet) { return VOS_FALSE; } PS_MEM_SET(&stEnvelopeMsg, 0, sizeof(SI_STK_ENVELOPE_STRU)); PS_MEM_SET(aucLI, 0, MN_MO_CTRL_LAI_LEN); /* 3GPP 1114: 9.1.6 Structure of ENVELOPE (CALL CONTROL) Description Section M/O Min Length Call control tag 13.1 M Y 1 Length (A+B+C+D+E+F) - M Y 1 or 2 Device identities 12.7 M Y A Address or SS string or USSD string 12.1, M Y B 12.14 or 12.17 Location information 12.19 M N E 其中, Location information 通过TAF_SDC_GetCurrentLai获取 Call control tag对应stEnvelopeMsg.EnvelopeType Device identities对应stEnvelopeMsg.DeviceId Address or SS string or USSD string这里是SS string,参考协议1114 12.14 */ stEnvelopeMsg.EnvelopeType = SI_STK_ENVELOPE_CALLCRTL; stEnvelopeMsg.DeviceId.ucSDId = SI_STK_DEV_TERMINAL; stEnvelopeMsg.DeviceId.ucDDId = SI_STK_DEV_UICC; /* 12.14 SS string SS or USSD string: for SS: Byte(s) Description Length 1 SS string tag 1 2 to (Y 1)+2 Length (X) Y (Y 1)+3 TON and NPI 1 (Y 1)+4 to (Y 1)+X+2 SS or USSD string X - 1 其中, SS string tag对应stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.ucTag Length对应stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.ucLen TON and NPI和SS string对应stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.pValue */ stEnvelopeMsg.uEnvelope.CallCtrl.OP_SepcialData = VOS_TRUE; stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.ucTag = SI_CC_SS_TAG; stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.ucLen = (VOS_UINT8)(ucSscStringBcdLen + TAF_SPM_SSC_OFFSET); stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.pValue = aucSsString; /* 获取ENVELOPE消息参数: 服务小区信息 */ stEnvelopeMsg.uEnvelope.CallCtrl.OP_LocInfo = VOS_TRUE; stEnvelopeMsg.uEnvelope.CallCtrl.LocInfo.pucATSLI = aucLI; TAF_SDC_GetCurrentLai(aucLI, &stEnvelopeMsg.uEnvelope.CallCtrl.LocInfo.ulLen); ulRet = NAS_STKAPI_EnvelopeDownload(WUEPS_PID_TAF, usClientId, &stEnvelopeMsg); if (VOS_OK != ulRet) { TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_SendUsimSsEnvelopeReq: Usim Returns Error."); return VOS_FALSE; } return VOS_TRUE; }