VOS_UINT32 TAF_MmiEncodeOperationTypeString( VOS_UINT32 ulEventType, VOS_CHAR *pcOutMmiStr, VOS_UINT32 *pulLength ) { VOS_UINT32 ulRet; VOS_UINT32 ulLoop; VOS_UINT32 ulTableSize; MN_MMI_OPERATION_TYPE_ENUM_U8 enSsOpType; MN_MMI_SS_OP_Tbl_STRU *pstOperationType = VOS_NULL_PTR; /* 获取事件对应的操作类型 */ ulRet = TAF_MmiGetOperationType(ulEventType, &enSsOpType); /* 获取业务操作类型失败,返回编码失败 */ if (VOS_FALSE == ulRet) { return VOS_FALSE; } /* 获取补充业务操作类型字符串 */ ulTableSize = MMI_GetOporationTypeTblSize(); pstOperationType = MMI_GetOporationTypeTblAddr(); for (ulLoop = 0; ulLoop < ulTableSize; ulLoop++) { if (enSsOpType == pstOperationType->enSsOpType) { *pulLength = VOS_StrLen((VOS_CHAR *)pstOperationType->pcSsOpStr); (VOS_VOID)VOS_StrNCpy((VOS_CHAR *)pcOutMmiStr, (VOS_CHAR *)pstOperationType->pcSsOpStr, *pulLength); return VOS_TRUE; } pstOperationType++; } return VOS_FALSE; }
VOS_UINT32 TAF_MmiEncodeActiveMmiString( VOS_UINT32 ulEventType, VOS_VOID *pMsg, VOS_CHAR *pcOutMmiStr ) { VOS_UINT32 ulRet; VOS_UINT32 ulPos; VOS_UINT32 ulStrLength; MN_MMI_OPERATION_TYPE_ENUM_U8 enSsOpType; TAF_SS_ACTIVATESS_REQ_STRU *pstActiveInfo = VOS_NULL_PTR; /* 涉及命令^CMMI,+CCFC,+CCWA, +CLIR,+CLIP,+COLP 1)呼叫转移激活,去激活和查询和删除操作操作不需要DN和T参数 如果存在BS参数,需要为DN参数保留*,否则,不填写* 2)话机闭锁业务激活和去激活格式如下,查询操作不需要密码 22.088 Supplementary Service Service Code SIA SIB SIC BAOC 33 PW BS - BAOIC 331 PW BS - BAOIC exc home 332 PW BS - BAIC 35 PW BS - BAIC roaming 351 PW BS - all Barring Serv. 330 PW BS - Outg. Barr. Serv. 333 PW BS Inc. Barr. Serv. 353 PW BS 3)CCBS查询操作不需要n参数 22.093 CCBS 37 n See Section 4.5.5 where n=1-5 4)呼叫等待的激活,去激活和查询 22.083 WAIT 43 BS - - */ /* 输出通用激活(*),去激活(#),查询操作前缀(*#),删除操作前缀(##): */ ulPos = 0; ulRet = TAF_MmiEncodeOperationTypeString(ulEventType, pcOutMmiStr, &ulPos); if (VOS_TRUE != ulRet) { MN_WARN_LOG("TAF_MmiEncodeActiveMmiString: invalid usMsgType."); return ulRet; } pstActiveInfo = (TAF_SS_ACTIVATESS_REQ_STRU *)pMsg; /* 追加SC字符串: SC */ ulRet = TAF_MmiEncodeSC(pstActiveInfo->SsCode, (pcOutMmiStr + ulPos), &ulStrLength); if (VOS_TRUE != ulRet) { MN_WARN_LOG("TAF_MmiEncodeActiveMmiString: invalid SC parameter."); return ulRet; } ulPos += ulStrLength; if ((VOS_FALSE == pstActiveInfo->OP_Password) && (VOS_FALSE == pstActiveInfo->OP_BsService)) { /* 追加# */ *(pcOutMmiStr + ulPos) = '#'; ulPos += sizeof('#'); return ulRet; } ulRet = TAF_MmiGetOperationType(ulEventType, &enSsOpType); if (VOS_TRUE != ulRet) { MN_WARN_LOG("TAF_MmiEncodeActiveMmiString: operation type."); return ulRet; } /* 追加PW字符串: *PW */ if ((TAF_ALL_BARRING_SS_CODE == (TAF_SS_CODE_MASK & (pstActiveInfo->SsCode))) && ((TAF_MMI_ACTIVATE_SS == enSsOpType) || (TAF_MMI_DEACTIVATE_SS == enSsOpType))) { TAF_MMI_INSERT_SEPERATION_CHAR(pcOutMmiStr, ulPos); if (VOS_TRUE == pstActiveInfo->OP_Password) { TAF_MmiEncodePW(pstActiveInfo->aucPassword, TAF_SS_MAX_PASSWORD_LEN, (pcOutMmiStr + ulPos), &ulStrLength); ulPos += ulStrLength; } } /* 呼叫转移存在BS参数时,需要为DN参数保留* */ if (TAF_ALL_FORWARDING_SS_CODE == (TAF_SS_CODE_MASK & (pstActiveInfo->SsCode))) { TAF_MMI_INSERT_SEPERATION_CHAR(pcOutMmiStr, ulPos); } /* 追加BS字符串: *BS */ /* 3GPP 22030 6.5.2 Structure of the MMI: Where SI is not applicable according to the definition of the supplementary service, then *SI is omitted. Where its use is optional, but not selected for a particular call set-up, it may be omitted or entered as an extra * if this is necessary to avoid ambiguity of interpretation. */ if (VOS_TRUE == pstActiveInfo->OP_BsService) { TAF_MMI_INSERT_SEPERATION_CHAR(pcOutMmiStr, ulPos); ulRet = TAF_MmiEncodeBS(&(pstActiveInfo->BsService), (pcOutMmiStr + ulPos), &ulStrLength); if (VOS_TRUE != ulRet) { MN_WARN_LOG("TAF_MmiEncodeActiveMmiString: invalid BS parameter!"); return ulRet; } ulPos += ulStrLength; } /* 追加# */ *(pcOutMmiStr + ulPos) = '#'; return ulRet; }
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; }