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;
}