VOS_UINT32 USIMM_VsimHUKDecode(VOS_UINT8       *pucSrc,
                                            VOS_UINT32      ulSrcLen,
                                            VOS_UINT8       *pucDst,
                                            VOS_UINT32      *pulDstLen)
{
#if (FEATURE_ON == FEATURE_SECURITY_PHONE)
    VOS_UINT8           auckey[USIMM_HUK_LEN];
    VOS_INT32           lDstLen;

    if (BSP_OK != efuseReadHUK((BSP_U32 *)auckey, (sizeof(auckey)/sizeof(BSP_U32))))
    {
        USIMM_ERROR_LOG("USIMM_VsimHUKDecode: efuseReadHUK Failed");

        return VOS_ERR;
    }

    lDstLen = AESDecryptS(pucSrc, (VOS_INT)ulSrcLen, auckey, USIMM_HUK_BITS, pucDst, VSIM_DH_AGREE_KEY);

    if (VOS_NULL == lDstLen)
    {
        USIMM_ERROR_LOG("USIMM_VsimHUKDecode: AESEncrypt Fail");

        return VOS_ERR;
    }

    *pulDstLen = (VOS_UINT32)lDstLen;
#else
    VOS_MemCpy(pucDst, pucSrc, ulSrcLen);

    *pulDstLen = ulSrcLen;
#endif  /*(FEATURE_ON == FEATURE_SECURITY_PHONE)*/

    return VOS_OK;
}
VOS_VOID USIMM_VsimDecodeCardType(VOS_CHAR                  *pucStr,
                                            VOS_UINT32                  ulStrLen,
                                            USIMM_CARD_TYPE_ENUM_UINT32 *pulCardType)
{
    VOS_CHAR                    *pcTemp;
    VOS_UINT32                  ulDataLen;

    *pulCardType = USIMM_CARD_NOCARD;   /*默认返回无卡*/

    if(VOS_NULL == ulStrLen)
    {
        USIMM_ERROR_LOG("USIMM_VSIMDecodeCardType: Card Type is NULL!");

        return;
    }

    /*申请用于存放卡类型的内存*/
    pcTemp = (VOS_CHAR*)VOS_MemAlloc(WUEPS_PID_USIM, DYNAMIC_MEM_PT, ulStrLen);

    if(VOS_NULL_PTR == pcTemp)
    {
        USIMM_ERROR_LOG("USIMM_VSIMDecodeCardType: VOS_MemAlloc is NULL!");

        return;
    }

    /*过滤特殊字符*/
    OAM_XML_GetStrContent(pucStr, ulStrLen, pcTemp, &ulDataLen);

    if(VOS_NULL == ulDataLen)
    {
        USIMM_ERROR_LOG("USIMM_VSIMDecodeCardType: Card Type Content is NULL!");

        VOS_MemFree(WUEPS_PID_USIM, pcTemp);

        return;
    }

/*lint -e418*/
    if(VOS_OK == VOS_MemCmp(USIMM_VSIM_USIM_STR, pcTemp, ulDataLen))
    {
        *pulCardType = USIMM_CARD_USIM;
    }
    else if(VOS_OK == VOS_MemCmp(USIMM_VSIM_SIM_STR, pcTemp, ulDataLen))
/*lint +e418*/
    {
        *pulCardType = USIMM_CARD_SIM;
    }
    else
    {
        USIMM_ERROR_LOG("USIMM_VSIMDecodeCardType: Card Type is not support!");
    }

    VOS_MemFree(WUEPS_PID_USIM, pcTemp);    /*释放用于存放卡类型的内存*/

    return;
}
VOS_UINT32 USIMM_DecodeVsimRoot(OAM_XML_NODE_STRU             *pstXmlNode,
                                        USIMM_CARD_TYPE_ENUM_UINT32     *pulCardType,
                                        USIMM_VSIM_AUTH_ENUM_UINT8      *pucAuthType)
{
    OAM_XML_NODE_ATTRIBUTE_STRU *pstAttr;
    USIMM_CARD_TYPE_ENUM_UINT32 ulCardType = USIMM_CARD_NOCARD;
    USIMM_VSIM_AUTH_ENUM_UINT32 ulAuthType = USIMM_VSIM_AUTH_NULL;

    if(VOS_NULL_PTR == pstXmlNode->pstFirstAttrib)  /*必须依赖属性节点解析卡类型等内容*/
    {
        USIMM_ERROR_LOG("USIMM_DecodeVsimRoot: Xml Root FirstAttrib is NULL!");

        return VOS_ERR;
    }

    pstAttr = OAM_XML_SearchAttNodeByName(pstXmlNode->pstFirstAttrib, USIMM_VSIM_TYPE_STR);

    if(VOS_NULL_PTR == pstAttr)
    {
        USIMM_ERROR_LOG("USIMM_DecodeVsimRoot: Search TYPE is NULL!");

        return VOS_ERR;
    }

    USIMM_VsimDecodeCardType(pstAttr->pcAttribValue, pstAttr->ulValueLength, &ulCardType);

    pstAttr = OAM_XML_SearchAttNodeByName(pstXmlNode->pstFirstAttrib, USIMM_VSIM_AUTH_STR);

    if(VOS_NULL_PTR == pstAttr)
    {
        USIMM_ERROR_LOG("USIMM_DecodeVsimRoot: Search ALGORITHM is NULL!");

        return VOS_ERR;
    }

    USIMM_VsimDecodeAuthType(pstAttr->pcAttribValue, pstAttr->ulValueLength, &ulAuthType);

    /*节点信息不具备或者错误*/
    if((USIMM_CARD_NOCARD == ulCardType)||(USIMM_VSIM_AUTH_NULL == ulAuthType))
    {
        USIMM_ERROR_LOG("USIMM_DecodeVsimRoot: Card Type or Auth Type is NULL!");

        return VOS_ERR;
    }

    if(VOS_NULL_PTR != pulCardType)
    {
        *pulCardType = ulCardType;
    }

    if(VOS_NULL_PTR != pucAuthType)
    {
        *pucAuthType = (VOS_UINT8)ulAuthType;
    }

    return VOS_OK;
}
VOS_UINT32 USIMM_DecodeVsimFile(VOS_UINT8 *pucData)
{
    OAM_XML_CTX_STRU                    stXmlCtx;
    OAM_XML_NODE_STRU                   *pstXmlNode;

    /*解析xml文件*/
    VOS_MemSet(&stXmlCtx, 0x00, sizeof(stXmlCtx));

    /* 调用XML码流解析函数,构造XML结构树 */
    if (OAM_XML_RESULT_SUCCEED != OAM_XML_InitXMLCtx(&stXmlCtx))
    {
        USIMM_ERROR_LOG("USIMM_DecodeVSIMFile: Xml initialization failed!");

        return VOS_ERR;
    }

    pstXmlNode = OAM_XML_BuildXMLTree( (VOS_CHAR*)pucData, &stXmlCtx);

    if (VOS_NULL_PTR == pstXmlNode)
    {
        USIMM_ERROR_LOG("USIMM_DecodeVSIMFile: Build xml tree failed!");

        OAM_XML_ClearXMLCtx(&stXmlCtx);

        return VOS_ERR;
    }

    /*解析文件根节点*/
    if(VOS_OK != USIMM_DecodeVsimRoot(pstXmlNode, &gastUSIMMCardAppInfo[USIMM_UICC_USIM].enCardType, &g_stUSIMMVSimAuthInfo.enAuthType))
    {
        USIMM_ERROR_LOG("USIMM_DecodeVSIMFile: USIMM_DecodeVsimRoot failed!");

        OAM_XML_ClearXMLCtx(&stXmlCtx);

        return VOS_ERR;
    }

    /*内容插入POOL*/
    if(VOS_OK != USIMM_DecodeVsimEf(pstXmlNode))
    {
        USIMM_ERROR_LOG("USIMM_DecodeVSIMFile: USIMM_AddVSIMFileToPoll failed!");

        OAM_XML_ClearXMLCtx(&stXmlCtx);

        return VOS_ERR;
    }

    OAM_XML_ClearXMLCtx(&stXmlCtx);

    return VOS_OK;
}
VOS_VOID USIMM_PinHandleCnf(VOS_UINT32                      ulReceiverPid,
                                    USIMM_PIN_CMD_TYPE_ENUM_UINT32  enCmdType,
                                    USIMM_PIN_TYPE_ENUM_UINT32      enPINType,
                                    VOS_UINT32                      ulResult,
                                    USIMM_PIN_INFO_STRU             *pstPINinfo)
{
    PS_USIM_PIN_CNF_STRU  *pUsimMsg;

    pUsimMsg = (PS_USIM_PIN_CNF_STRU*)VOS_AllocMsg(WUEPS_PID_USIM, sizeof(PS_USIM_PIN_CNF_STRU)-VOS_MSG_HEAD_LENGTH);

    if (VOS_NULL_PTR == pUsimMsg)
    {
        USIMM_ERROR_LOG("USIMM_PinHandleCnf: VOS_AllocMsg is Failed");

        return;
    }

    pUsimMsg->ulReceiverPid = ulReceiverPid;
    pUsimMsg->ulMsgName     = PS_USIM_PIN_OPERATE_RSP;
    pUsimMsg->ulResult      = ulResult;
    pUsimMsg->enCmdType     = enCmdType;
    pUsimMsg->enPinType     = enPINType;

    VOS_MemCpy(&pUsimMsg->stPinInfo, pstPINinfo, sizeof(USIMM_PIN_INFO_STRU));

    (VOS_VOID)VOS_SendMsg(pUsimMsg->ulSenderPid, pUsimMsg);

    return;
}
VOS_VOID USIMM_ResetCnf(VOS_UINT32                            ulReceiverPid,
                                USIMM_REFRESH_TYPE_ENUM_UINT32      enRefreshType,
                                VOS_UINT32                          ulResult,
                                VOS_UINT16                          usSATLen)
{
    PS_USIM_REFRESH_CNF_STRU  *pUsimMsg;

    pUsimMsg = (PS_USIM_REFRESH_CNF_STRU*)VOS_AllocMsg(WUEPS_PID_USIM, sizeof(PS_USIM_REFRESH_CNF_STRU)-VOS_MSG_HEAD_LENGTH);

    if (VOS_NULL_PTR == pUsimMsg)
    {
        USIMM_ERROR_LOG("USIMM_ResetCnf: VOS_AllocMsg is Failed");

        return;
    }

    pUsimMsg->ulReceiverPid = ulReceiverPid;
    pUsimMsg->ulMsgName     = PS_USIM_REFRESH_CNF;
    pUsimMsg->enRefreshType = enRefreshType;
    pUsimMsg->ulResult      = ulResult;
    pUsimMsg->ulSatLen      = usSATLen;

    (VOS_VOID)VOS_SendMsg(pUsimMsg->ulSenderPid, pUsimMsg);

    return;
}
VOS_VOID USIMM_SearchHandleCnf(VOS_UINT32                   ulReceiverPid,
                                        VOS_UINT32                   ulErrorCode,
                                         USIMM_SEARCHCNF_INFO_STRU  *pstCnfInfo)
{
    PS_USIM_SEARCH_CNF_STRU     *pUsimMsg;

    pUsimMsg = (PS_USIM_SEARCH_CNF_STRU *)VOS_AllocMsg(WUEPS_PID_USIM,
                            (sizeof(PS_USIM_SEARCH_CNF_STRU) - VOS_MSG_HEAD_LENGTH) + pstCnfInfo->ulLen);

    if (VOS_NULL_PTR == pUsimMsg)
    {
        USIMM_ERROR_LOG("USIMM_SearchHandleCnf: VOS_AllocMsg is Failed");

        return;
    }

    pUsimMsg->ulReceiverPid = ulReceiverPid;
    pUsimMsg->ulMsgName     = PS_USIM_SEARCH_CNF;
    pUsimMsg->ulErrorCode   = ulErrorCode;
    pUsimMsg->usTotalRecNum = pstCnfInfo->usTotalRecNum;
    pUsimMsg->usEfId        = pstCnfInfo->usEfid;
    pUsimMsg->ulResult      = ulErrorCode;
    pUsimMsg->ucLen         = 0;

    if ((VOS_NULL_PTR != pstCnfInfo->pucData) && (pstCnfInfo->ulLen <= 255))
    {
        VOS_MemCpy(pUsimMsg->aucContent, pstCnfInfo->pucData, pstCnfInfo->ulLen);

        pUsimMsg->ucLen = (VOS_UINT8)pstCnfInfo->ulLen;
    }

    (VOS_VOID)VOS_SendMsg(pUsimMsg->ulSenderPid, pUsimMsg);

    return;
}
/*****************************************************************************
函 数 名  : SI_STK_SMSCtrlResultInd_Instance
功能描述  : 将MO SMS CONTROL的结果广播上报给AT
输入参数  : enModemID --Modem ID
            pstRspData--指向SMS CONTROL的解码后码流
输出参数  : 无
返 回 值  : 执行结果
History     :
1.日    期  : 2013年06月14日
  作    者  : zhuli
  修改内容  : Create
*****************************************************************************/
VOS_VOID SI_STK_SMSCtrlResultInd_Instance(
    MODEM_ID_ENUM_UINT16                                    enModemID,
    SI_STK_ENVELOPE_RSP_STRU                                *pstRspData)
{
    if (MODEM_ID_0 == enModemID)
    {
        USIMM_NORMAL_LOG("SI_STK_SMSCtrlResultInd_Instance: call SI_STK_SMSCtrlResultInd");

        SI_STK_SMSCtrlResultInd(pstRspData);

        return;
    }
#if (FEATURE_MULTI_MODEM == FEATURE_ON)
    if (MODEM_ID_1 == enModemID)
    {
        USIMM_NORMAL_LOG("SI_STK_SMSCtrlResultInd_Instance: call I1_SI_STK_SMSCtrlResultInd");

        I1_SI_STK_SMSCtrlResultInd(pstRspData);

        return;
    }
#endif

    USIMM_ERROR_LOG("SI_STK_SMSCtrlResultInd_Instance: Para Is Error");

    return;
}
VOS_VOID USIMM_AccessChannelCnf(VOS_UINT32                 ulReceiverPid,
                                            VOS_UINT32                  ulResult,
                                            VOS_UINT32                  ulErrCode,
                                            USIMM_ACCESS_CHANNEL_CNF_STRU *pstDataCnf)
{
    PS_USIM_ACCESS_CHANNEL_CNF_STRU    *pstUsimMsg = VOS_NULL_PTR;

    pstUsimMsg = (PS_USIM_ACCESS_CHANNEL_CNF_STRU *)VOS_AllocMsg(WUEPS_PID_USIM,
                                                              sizeof(PS_USIM_ACCESS_CHANNEL_CNF_STRU) - VOS_MSG_HEAD_LENGTH);

    if (VOS_NULL_PTR == pstUsimMsg)
    {
        USIMM_ERROR_LOG("USIMM_AccessChannelCnf: VOS_AllocMsg is Failed");

        return;
    }

    pstUsimMsg->ulReceiverPid           =   ulReceiverPid;
    pstUsimMsg->ulMsgName               =   PS_USIMM_ACCESSCHANNEL_CNF;
    pstUsimMsg->ulResult                =   ulResult;
    pstUsimMsg->ulErrCode               =   ulErrCode;
    pstUsimMsg->ucSw1                   =   pstDataCnf->ucSw1;
    pstUsimMsg->ucSw2                   =   pstDataCnf->ucSw2;
    pstUsimMsg->usLen                   =   pstDataCnf->usDataLen;

    if (VOS_NULL != pstDataCnf->usDataLen)
    {
        VOS_MemCpy(pstUsimMsg->aucContent, pstDataCnf->pucData, pstDataCnf->usDataLen);
    }

    (VOS_VOID)VOS_SendMsg(pstUsimMsg->ulSenderPid, pstUsimMsg);

    return;
}
VOS_UINT32 SI_PB_FdnNumCheck_Instance(
    MODEM_ID_ENUM_UINT16                enModemID,
    VOS_UINT32                          ulPid,
    VOS_UINT32                          ulContextIndex,
    VOS_UINT32                          ulSendPara,
    PS_PB_FDN_NUM_STRU                 *pstFdnInfo)
{
    if (MODEM_ID_0 == enModemID)
    {
        USIMM_NORMAL_LOG("SI_PB_FdnNumCheck_Instance: call SI_PB_FdnNumCheck");

        return SI_PB_FdnNumCheck(ulPid, ulContextIndex, ulSendPara, pstFdnInfo);
    }
#if (FEATURE_MULTI_MODEM == FEATURE_ON)
    if (MODEM_ID_1 == enModemID)
    {
        USIMM_NORMAL_LOG("SI_PB_FdnNumCheck_Instance: call I1_SI_PB_FdnNumCheck");

        return I1_SI_PB_FdnNumCheck(ulPid, ulContextIndex, ulSendPara, pstFdnInfo);
    }
#endif

    USIMM_ERROR_LOG("SI_PB_FdnNumCheck_Instance: Para Is Error");

    return VOS_ERR;
}
VOS_UINT32 USIMM_MaxEFRecordNumReq_Instance(
    MODEM_ID_ENUM_UINT16                enModemID,
    VOS_UINT32                          ulSenderPid,
    USIMM_APP_TYPE_ENUM_UINT32          enAppType,
    VOS_UINT16                          usEFid)
{
    if (MODEM_ID_0 == enModemID)
    {
        USIMM_NORMAL_LOG("USIMM_MaxEFRecordNumReq_Instance: call USIMM_MaxEFRecordNumReq");

        return USIMM_MaxEFRecordNumReq(ulSenderPid, enAppType, usEFid);
    }

#if (FEATURE_MULTI_MODEM == FEATURE_ON)
    if (MODEM_ID_1 == enModemID)
    {
        USIMM_NORMAL_LOG("USIMM_MaxEFRecordNumReq_Instance: call USIMM_MaxEFRecordNumReq");

        return I1_USIMM_MaxEFRecordNumReq(ulSenderPid, enAppType, usEFid);
    }
#endif

    USIMM_ERROR_LOG("USIMM_PinReq_Instance: Para Is Error");

    return USIMM_API_WRONG_PARA;
}
VOS_UINT32 USIMM_GetCachedFile_Instance(
    MODEM_ID_ENUM_UINT16                enModemID,
    VOS_UINT16                          usFileID,
    VOS_UINT32                         *pulDataLen,
    VOS_UINT8                         **ppucData,
    USIMM_APP_TYPE_ENUM_UINT32          enAppType)
{
    if (MODEM_ID_0 == enModemID)
    {
        USIMM_NORMAL_LOG("USIMM_GetCachedFile_Instance: call USIMM_GetCachedFile");

        return USIMM_GetCachedFile(usFileID, pulDataLen, ppucData, enAppType);
    }
#if (FEATURE_MULTI_MODEM == FEATURE_ON)
    if (MODEM_ID_1 == enModemID)
    {
        USIMM_NORMAL_LOG("USIMM_GetCachedFile_Instance: call I1_USIMM_GetCachedFile");

        return I1_USIMM_GetCachedFile(usFileID, pulDataLen, ppucData, enAppType);
    }
#endif

    USIMM_ERROR_LOG("USIMM_GetCachedFile_Instance: Para Is Error");

    return USIMM_API_WRONG_PARA;
}
VOS_VOID USIMM_FdnQuery_Instance(
    MODEM_ID_ENUM_UINT16                enModemID,
    VOS_UINT32                         *pulState)
{
    if (MODEM_ID_0 == enModemID)
    {
        USIMM_NORMAL_LOG("USIMM_FdnQuery_Instance: call USIMM_FdnQuery");

        USIMM_FdnQuery(pulState);

        return;
    }
#if (FEATURE_MULTI_MODEM == FEATURE_ON)
    if (MODEM_ID_1 == enModemID)
    {
        USIMM_NORMAL_LOG("USIMM_FdnQuery_Instance: call I1_USIMM_FdnQuery");

        I1_USIMM_FdnQuery(pulState);

        return;
    }
#endif

    USIMM_ERROR_LOG("USIMM_FdnQuery_Instance: Para Is Error");

    *pulState = USIMM_FDNSTATUS_BUTT;

    return;
}
VOS_UINT32 USIMM_GetPinStatus_Instance(
    MODEM_ID_ENUM_UINT16                enModemID,
    VOS_UINT8                          *pucType,
    VOS_UINT8                          *pucBeEnable,
    VOS_UINT8                          *pucBeNeed,
    VOS_UINT8                          *pucNum)
{
    if (MODEM_ID_0 == enModemID)
    {
        USIMM_NORMAL_LOG("USIMM_GetPinStatus_Instance: call USIMM_GetPinStatus");

        return USIMM_GetPinStatus(pucType, pucBeEnable, pucBeNeed, pucNum);
    }

#if (FEATURE_MULTI_MODEM == FEATURE_ON)
    if (MODEM_ID_1 == enModemID)
    {
        USIMM_NORMAL_LOG("USIMM_GetPinStatus_Instance: call I1_USIMM_GetPinStatus");

        return I1_USIMM_GetPinStatus(pucType, pucBeEnable, pucBeNeed, pucNum);
    }
#endif

    USIMM_ERROR_LOG("USIMM_GetPinStatus_Instance: Para Is Error");

    return USIMM_API_WRONG_PARA;
}
VOS_UINT32 USIMM_GetCardType_Instance(
    MODEM_ID_ENUM_UINT16                enModemID,
    VOS_UINT8                          *pucCardStatus,
    VOS_UINT8                          *pucCardType)
{
    if (MODEM_ID_0 == enModemID)
    {
        USIMM_NORMAL_LOG("USIMM_GetCardType_Instance: call USIMM_GetCardType");

        return USIMM_GetCardType(pucCardStatus, pucCardType);
    }

#if (FEATURE_MULTI_MODEM == FEATURE_ON)
    if (MODEM_ID_1 == enModemID)
    {
        USIMM_NORMAL_LOG("USIMM_GetCardType_Instance: call I1_USIMM_GetCardType");

        return I1_USIMM_GetCardType(pucCardStatus, pucCardType);
    }
#endif

    USIMM_ERROR_LOG("USIMM_GetCardType_Instance: Para Is Error");

    return USIMM_API_WRONG_PARA;
}
VOS_UINT32 USIMM_PinReq_Instance(
    MODEM_ID_ENUM_UINT16                enModemID,
    VOS_UINT32                          ulSenderPid,
    VOS_UINT8                           ucCmdType,
    VOS_UINT8                           ucPINType,
    VOS_UINT8                          *pucOldPIN,
    VOS_UINT8                          *pucNewPIN)
{
    if (MODEM_ID_0 == enModemID)
    {
        USIMM_NORMAL_LOG("USIMM_PinReq_Instance: call USIMM_PinReq");

        return USIMM_PinReq(ulSenderPid, ucCmdType, ucPINType, pucOldPIN, pucNewPIN);
    }

#if (FEATURE_MULTI_MODEM == FEATURE_ON)
    if (MODEM_ID_1 == enModemID)
    {
        USIMM_NORMAL_LOG("USIMM_PinReq_Instance: call I1_USIMM_PinReq");

        return I1_USIMM_PinReq(ulSenderPid, ucCmdType, ucPINType, pucOldPIN, pucNewPIN);
    }
#endif

    USIMM_ERROR_LOG("USIMM_PinReq_Instance: Para Is Error");

    return USIMM_API_WRONG_PARA;
}
VOS_VOID USIMM_CloseChannelCnf(VOS_UINT32                 ulReceiverPid,
                                        VOS_UINT32                ulResult,
                                        VOS_UINT32                ulErrCode)
{
    PS_USIM_CLOSE_CHANNEL_CNF_STRU     *pstUsimMsg = VOS_NULL_PTR;

    pstUsimMsg = (PS_USIM_CLOSE_CHANNEL_CNF_STRU *)VOS_AllocMsg(WUEPS_PID_USIM,
                                                              sizeof(PS_USIM_CLOSE_CHANNEL_CNF_STRU) - VOS_MSG_HEAD_LENGTH);

    if (VOS_NULL_PTR == pstUsimMsg)
    {
        USIMM_ERROR_LOG("USIMM_CloseChannelCnf: VOS_AllocMsg is Failed");

        return;
    }

    pstUsimMsg->ulReceiverPid           =   ulReceiverPid;
    pstUsimMsg->ulMsgName               =   PS_USIMM_CLOSECHANNEL_CNF;
    pstUsimMsg->ulResult                =   ulResult;
    pstUsimMsg->ulErrCode               =   ulErrCode;

    (VOS_VOID)VOS_SendMsg(pstUsimMsg->ulSenderPid, pstUsimMsg);

    return;
}
VOS_UINT32 SI_STK_EnvelopeRsp_Decode_Instance(
    MODEM_ID_ENUM_UINT16                enModemID,
    SI_STK_ENVELOPE_TYPE                enDataType,
    VOS_UINT32                          ulDataLen,
    VOS_UINT8                          *pucCmdData,
    SI_STK_ENVELOPE_RSP_STRU           *pstRspData)
{
    if (MODEM_ID_0 == enModemID)
    {
        USIMM_NORMAL_LOG("SI_STK_EnvelopeRsp_Decode_Instance: call SI_STK_EnvelopeRsp_Decode");

        return SI_STK_EnvelopeRsp_Decode(enDataType, ulDataLen, pucCmdData, pstRspData);
    }
#if (FEATURE_MULTI_MODEM == FEATURE_ON)
    if (MODEM_ID_1 == enModemID)
    {
        USIMM_NORMAL_LOG("SI_STK_EnvelopeRsp_Decode_Instance: call I1_SI_STK_EnvelopeRsp_Decode");

        return I1_SI_STK_EnvelopeRsp_Decode(enDataType, ulDataLen, pucCmdData, pstRspData);
    }
#endif

    USIMM_ERROR_LOG("SI_STK_EnvelopeRsp_Decode_Instance: Para Is Error");

    return VOS_ERR;
}
VOS_UINT32 USIMM_GetFileReq_Instance(
    MODEM_ID_ENUM_UINT16                enModemID,
    VOS_UINT32                          ulSenderPid,
    VOS_UINT32                          ulSendPara,
    USIMM_GET_FILE_INFO_STRU           *pstGetFileInfo)
{
    if (MODEM_ID_0 == enModemID)
    {
        USIMM_NORMAL_LOG("USIMM_GetFileReq_Instance: call USIMM_GetFileReq");

        return USIMM_GetFileReq(ulSenderPid, ulSendPara, pstGetFileInfo);
    }
#if (FEATURE_MULTI_MODEM == FEATURE_ON)
    if (MODEM_ID_1 == enModemID)
    {
        USIMM_NORMAL_LOG("USIMM_GetFileReq_Instance: call I1_USIMM_GetFileReq");

        return I1_USIMM_GetFileReq(ulSenderPid, ulSendPara, pstGetFileInfo);
    }
#endif

    USIMM_ERROR_LOG("USIMM_GetFileReq_Instance: Para is Error");

    return USIMM_API_WRONG_PARA;
}
VOS_VOID USIMM_GetFileCnf(VOS_UINT32              ulReceiverPid,
                                VOS_UINT32              ulSendPara,
                                VOS_UINT32              ulErrorCode,
                                USIMM_GETCNF_INFO_STRU  *pstCnfInfo)
{
    PS_USIM_GET_FILE_CNF_STRU  *pUsimMsg;
    VOS_UINT32                 ulResult;

    if(ulErrorCode != USIMM_SW_OK)
    {
        ulResult = VOS_ERR;
    }
    else
    {
        ulResult = VOS_OK;
    }

    if( WUEPS_PID_OM == ulReceiverPid )
    {
        USIMM_OmFileCnf(ulResult,pstCnfInfo->usEfLen,pstCnfInfo->pucEf,USIMM_OM_GET_CNF);

        return;
    }

    pUsimMsg = (PS_USIM_GET_FILE_CNF_STRU*)VOS_AllocMsg(WUEPS_PID_USIM, (sizeof(PS_USIM_GET_FILE_CNF_STRU)-VOS_MSG_HEAD_LENGTH)+pstCnfInfo->usDataLen);

    if(VOS_NULL_PTR == pUsimMsg)
    {
        USIMM_ERROR_LOG("USIMM_GetFileCnf: VOS_AllocMsg is Failed");

        return;
    }

    pUsimMsg->ulMsgName     = PS_USIM_GET_FILE_RSP;
    pUsimMsg->ulReceiverPid = ulReceiverPid;
    pUsimMsg->ulErrorCode   = ulErrorCode;
    pUsimMsg->ulSendPara    = ulSendPara;
    pUsimMsg->usEfId        = pstCnfInfo->usEfId;

    if(USIMM_SW_OK == ulErrorCode)
    {
        pUsimMsg->ucRecordNum = pstCnfInfo->ucRecordNum;
        pUsimMsg->usEfLen     = pstCnfInfo->usEfLen;
        pUsimMsg->ucTotalNum  = pstCnfInfo->ucTotalNum;
        pUsimMsg->ulResult    = VOS_OK;

        VOS_MemCpy(pUsimMsg->aucEf, pstCnfInfo->pucEf, pstCnfInfo->usDataLen);
    }
    else
    {
        pUsimMsg->ucRecordNum = 0;
        pUsimMsg->usEfLen     = 0;
        pUsimMsg->ucTotalNum  = 0;
        pUsimMsg->ulResult    = VOS_ERR;
    }

    (VOS_VOID)VOS_SendMsg(pUsimMsg->ulSenderPid, pUsimMsg);

    return;
}
VOS_VOID SI_STK_EnvelopeRspDataFree_Instance(
    MODEM_ID_ENUM_UINT16                enModemID,
    SI_STK_ENVELOPE_RSP_STRU           *pstData)
{
    if (MODEM_ID_0 == enModemID)
    {
        USIMM_NORMAL_LOG("SI_STK_EnvelopeRspDataFree_Instance: call SI_STK_EnvelopeRspDataFree");

        SI_STK_EnvelopeRspDataFree(pstData);

        return;
    }
#if (FEATURE_MULTI_MODEM == FEATURE_ON)
    if (MODEM_ID_1 == enModemID)
    {
        USIMM_NORMAL_LOG("SI_STK_EnvelopeRspDataFree_Instance: call I1_SI_STK_EnvelopeRspDataFree");

        I1_SI_STK_EnvelopeRspDataFree(pstData);

        return;
    }
#endif

    USIMM_ERROR_LOG("SI_STK_EnvelopeRsp_Decode_Instance: Para Is Error");

    return;
}
VOS_UINT32 SI_STK_EnvelopeDownload_Instance(
    MODEM_ID_ENUM_UINT16                enModemID,
    VOS_UINT32                          ulSenderPid,
    VOS_UINT32                          ulSendPara,
    SI_STK_ENVELOPE_STRU               *pstENStru)
{
    if (MODEM_ID_0 == enModemID)
    {
        USIMM_NORMAL_LOG("SI_STK_EnvelopeDownload_Instance: call SI_STK_EnvelopeDownload");

        return SI_STK_EnvelopeDownload(ulSenderPid, ulSendPara, pstENStru);
    }
#if (FEATURE_MULTI_MODEM == FEATURE_ON)
    if (MODEM_ID_1 == enModemID)
    {
        USIMM_NORMAL_LOG("SI_STK_EnvelopeDownload_Instance: call I1_SI_STK_EnvelopeDownload");

        return I1_SI_STK_EnvelopeDownload(ulSenderPid, ulSendPara, pstENStru);
    }
#endif

    USIMM_ERROR_LOG("SI_STK_EnvelopeDownload_Instance: Para Is Error");

    return VOS_ERR;
}
VOS_UINT32 USIMM_AddVsimVerifyHashPara(VOS_CHAR *pucFileStr, VOS_UINT32 ulFileLen, VOS_CHAR *pcValue, VOS_UINT32 ulValueLen)
{
    VOS_UINT32      ulContentLen;
    VOS_CHAR        *pcContent;

    if((VOS_NULL_PTR == pcValue)||(VOS_NULL == ulValueLen))
    {
        USIMM_ERROR_LOG("USIMM_AddVsimVerifyHashPara: Para is NULL!");
        return VOS_ERR;
    }

    pcContent = (VOS_CHAR*)VOS_MemAlloc(WUEPS_PID_USIM, DYNAMIC_MEM_PT, ulValueLen);

    if(VOS_NULL_PTR == pcContent)
    {
        USIMM_ERROR_LOG("USIMM_AddVsimVerifyHashPara: VOS_MemAlloc is NULL!");
        return VOS_ERR;
    }

    /*过滤特殊字符*/
    OAM_XML_FilterStrInvalidChar(pcValue, ulValueLen, pcContent, &ulContentLen);

    if(VOS_NULL == ulContentLen)
    {
        USIMM_ERROR_LOG("USIMM_AddVsimVerifyHashPara: OAM_XML_GetStrContent return 0!");

        VOS_MemFree(WUEPS_PID_USIM, pcContent);

        return VOS_ERR;
    }

    if(USIMM_VSIM_SIM_KEY_HASH_LEN < ulContentLen) /*检查Base16编码长度,不能超过当前全局变量的最大值*/
    {
        USIMM_ERROR_LOG("USIMM_AddVsimVerifyHashPara: Base16Decode Result is too long!");

        VOS_MemFree(WUEPS_PID_USIM, pcContent);

        return VOS_ERR;
    }

    VOS_MemCpy(g_stUSIMMVSimAuthInfo.aucSimKeyHash, pcContent, ulContentLen);

    VOS_MemFree(WUEPS_PID_USIM, pcContent);

    return VOS_OK;
}
VOS_VOID USIMM_TelecomAuthCnf(USIMM_AUTH_REQ_STRU *pstMsg, USIMM_TELECOM_AUTH_INFO_STRU *pstCnfInfo)
{
    USIMM_AUTH_CNF_STRU                *pstCnfMsg;

    /* 分配消息内存  */
    pstCnfMsg = (USIMM_AUTH_CNF_STRU*)VOS_AllocMsg(WUEPS_PID_USIM, sizeof(USIMM_AUTH_CNF_STRU)-VOS_MSG_HEAD_LENGTH);

    if (VOS_NULL_PTR == pstCnfMsg)
    {
        USIMM_ERROR_LOG("USIMM_TelecomAuthCnf: VOS_AllocMsg is Failed");

        return;
    }

    VOS_MemSet((VOS_UINT8*)pstCnfMsg + VOS_MSG_HEAD_LENGTH, 0, pstCnfMsg->ulLength);

    pstCnfMsg->ulReceiverPid    = pstMsg->ulSenderPid;
    pstCnfMsg->ulMsgName        = PS_USIM_AUTHENTICATION_CNF;
    pstCnfMsg->enAppType        = pstMsg->enAppType;
    pstCnfMsg->enAuthType       = pstMsg->enAuthType;
    pstCnfMsg->ucOpId           = pstMsg->ucOpId;
    pstCnfMsg->enResult         = pstCnfInfo->enResult;

    if ((VOS_NULL_PTR != pstCnfInfo->pucIK)
        && (sizeof(pstCnfMsg->cnfdata.stTELECnf.aucIK) > pstCnfInfo->pucIK[0]))
    {
        VOS_MemCpy(pstCnfMsg->cnfdata.stTELECnf.aucIK, pstCnfInfo->pucIK, pstCnfInfo->pucIK[0] + 1);
    }

    if ((VOS_NULL_PTR != pstCnfInfo->pucCK)
        && (sizeof(pstCnfMsg->cnfdata.stTELECnf.aucCK) > pstCnfInfo->pucCK[0]))
    {
        VOS_MemCpy(pstCnfMsg->cnfdata.stTELECnf.aucCK, pstCnfInfo->pucCK, pstCnfInfo->pucCK[0] + 1);
    }

    if ((VOS_NULL_PTR != pstCnfInfo->pucGsmKC)
        && (sizeof(pstCnfMsg->cnfdata.stTELECnf.aucGsmKc) > pstCnfInfo->pucGsmKC[0]))
    {
        VOS_MemCpy(pstCnfMsg->cnfdata.stTELECnf.aucGsmKc, pstCnfInfo->pucGsmKC, pstCnfInfo->pucGsmKC[0] + 1);
    }

    if ((VOS_NULL_PTR != pstCnfInfo->pucAuts)
        && (sizeof(pstCnfMsg->cnfdata.stTELECnf.aucAuts) > pstCnfInfo->pucAuts[0]))
    {
        VOS_MemCpy(pstCnfMsg->cnfdata.stTELECnf.aucAuts, pstCnfInfo->pucAuts, pstCnfInfo->pucAuts[0] + 1);
    }

    if ((VOS_NULL_PTR != pstCnfInfo->pucAuthRes)
        && (sizeof(pstCnfMsg->cnfdata.stTELECnf.aucAuthRes) > pstCnfInfo->pucAuthRes[0]))
    {
        VOS_MemCpy(pstCnfMsg->cnfdata.stTELECnf.aucAuthRes, pstCnfInfo->pucAuthRes, pstCnfInfo->pucAuthRes[0] + 1);
    }

    /* 回复消息 */
    (VOS_VOID)VOS_SendMsg(pstCnfMsg->ulSenderPid, pstCnfMsg);

    return;
}
VOS_UINT32 USIMM_CheckVsimFileInPool(VOS_VOID)
{
    VOS_UINT32      i;
    VOS_UINT32      ulIndex;
    VOS_UINT32      ulResult;

    ulResult = VOS_OK;

    for(i=0; i<ARRAYSIZE(g_astUSIMMVSimFileInfo); i++)
    {
        if (USIMM_VSIM_IS_FILE_ATTR_VALID(i))
        {
            ulResult = USIMM_VsimPoolSearchFile(g_astUSIMMVSimFileInfo[i].usFileID, &ulIndex);
        }

        if(VOS_OK != ulResult)
        {
            USIMM_ERROR_LOG("USIMM_CheckVSIMFileInPoll: the File is not in POOL!");

            return ulResult;
        }
    }

    if((USIMM_CARD_USIM == gastUSIMMCardAppInfo[USIMM_UICC_USIM].enCardType) /*USIM卡必须具备KI,OPC, 鉴权类型目前仅支持标准方式*/
        &&((VOS_NULL == g_stUSIMMVSimAuthInfo.ucKILen)||(VOS_NULL == g_stUSIMMVSimAuthInfo.ucOpcLen))
        &&(USIMM_VSIM_MILENAGE != g_stUSIMMVSimAuthInfo.enAuthType))
    {
        USIMM_ERROR_LOG("USIMM_CheckVSIMFileInPoll: USIM Auth Para is Error!");

        return VOS_ERR;
    }

    if((USIMM_CARD_SIM == gastUSIMMCardAppInfo[USIMM_UICC_USIM].enCardType)/*SIM卡必须具备KI,鉴权类型为标准*/
        &&(VOS_NULL == g_stUSIMMVSimAuthInfo.ucKILen)
        &&((USIMM_VSIM_AUTH_NULL == g_stUSIMMVSimAuthInfo.enAuthType)||(USIMM_VSIM_MILENAGE == g_stUSIMMVSimAuthInfo.enAuthType)))
    {
        USIMM_ERROR_LOG("USIMM_CheckVSIMFileInPoll: SIM Auth Para is Error!");

        return VOS_ERR;
    }

    return VOS_OK;
}
VOS_VOID USIMM_CardStatusInd(VOS_UINT32                     ulReceiverPid,
                                    USIMM_CARD_TYPE_ENUM_UINT32     enCardType,
                                    USIMM_CARD_SERVIC_ENUM_UINT32   enCardStatus)
{
    PS_USIM_STATUS_IND_STRU            *pUsimMsg = VOS_NULL_PTR;
    VOS_UINT32                          ulResult;
    VOS_UINT32                          ulFileNum;
    VOS_UINT8                          *pucIMSI = VOS_NULL_PTR;

    if(USIMM_CARD_SERVIC_AVAILABLE == enCardStatus)
    {
        ulResult = USIMM_PoolFindFile(EFIMSI, &ulFileNum, USIMM_UNLIMIT_APP);

        if(VOS_OK == ulResult)
        {
            pucIMSI = gstUSIMMPOOL.astpoolRecord[ulFileNum].pucContent;
        }
    }

    pUsimMsg = (PS_USIM_STATUS_IND_STRU *)VOS_AllocMsg(WUEPS_PID_USIM, sizeof(PS_USIM_STATUS_IND_STRU)-VOS_MSG_HEAD_LENGTH);

    if( VOS_NULL_PTR == pUsimMsg )
    {
        USIMM_ERROR_LOG("USIMM_CardStatusInd: VOS_AllocMsg is Failed");

        return;
    }

    pUsimMsg->ulReceiverPid = ulReceiverPid;
    pUsimMsg->ulMsgName     = PS_USIM_GET_STATUS_IND;    /* 设置消息名称 */
    pUsimMsg->enCardType    = enCardType;
    pUsimMsg->enCardStatus  = enCardStatus;

    if(VOS_NULL_PTR != pucIMSI)
    {
        VOS_MemCpy(pUsimMsg->aucIMSI, pucIMSI, sizeof(pUsimMsg->aucIMSI));

        pUsimMsg->ucIMSILen = sizeof(pUsimMsg->aucIMSI);
    }
    else
    {
        pUsimMsg->ucIMSILen = VOS_NULL;
    }

    (VOS_VOID)VOS_SendMsg(pUsimMsg->ulSenderPid, pUsimMsg);

    if(USIMM_CARD_SERVIC_AVAILABLE != enCardStatus) /*卡状态不是有卡,保存数据*/
    {
        USIMM_SaveLogFile();
    }

    g_stUSIMMLogData.enLogState = USIMM_NO_NEED_LOG;/*上报卡状态就不需要记录log*/

    return;
}
VOS_VOID USIMM_EnvelopeCnf(VOS_UINT32                    ulReceiverPid,
                                    VOS_UINT32                  ulSendPara,
                                    VOS_UINT32                  ulErrorCode,
                                    USIMM_ENVELOPECNF_INFO_STRU *pstCnfInfo)
{
    PS_USIM_ENVELOPE_CNF_STRU  *pUsimMsg;

    pUsimMsg = (PS_USIM_ENVELOPE_CNF_STRU*)VOS_AllocMsg(WUEPS_PID_USIM, sizeof(PS_USIM_ENVELOPE_CNF_STRU)-VOS_MSG_HEAD_LENGTH);

    if (VOS_NULL_PTR == pUsimMsg)
    {
        USIMM_ERROR_LOG("USIMM_EnvelopeCnf: VOS_AllocMsg is Failed");

        return;
    }

    pUsimMsg->ulReceiverPid = ulReceiverPid;
    pUsimMsg->ulMsgName     = PS_USIM_ENVELOPE_CNF;
    pUsimMsg->ulErrorCode   = ulErrorCode;
    pUsimMsg->ulSendPara    = ulSendPara;
    pUsimMsg->ucDataType    = pstCnfInfo->ucDataType;
    pUsimMsg->ucSW1         = pstCnfInfo->ucSW1;
    pUsimMsg->ucSW2         = pstCnfInfo->ucSW2;

    if(ulErrorCode != USIMM_SW_OK)
    {
        pUsimMsg->ulResult      = VOS_ERR;
    }
    else
    {
        pUsimMsg->ulResult      = VOS_OK;
    }

    /* 对于SMS PP DOWNLOAD,可能有数据要回复到网侧,需要上报给TAF */
    if (pstCnfInfo->ulDataLen > VOS_NULL)
    {
        VOS_MemCpy(pUsimMsg->aucData, pstCnfInfo->pucData, pstCnfInfo->ulDataLen);

        pUsimMsg->ucDataLen = (VOS_UINT8)pstCnfInfo->ulDataLen;
    }
    else
    {
        pUsimMsg->ucDataLen = 0;
    }

    (VOS_VOID)VOS_SendMsg(pUsimMsg->ulSenderPid, pUsimMsg);

    return;
}
VOS_VOID USIMM_SetFileCnf(VOS_UINT32               ulReceiverPid,
                                VOS_UINT32              ulSendPara,
                                VOS_UINT32              ulErrorCode,
                                USIMM_SETCNF_INFO_STRU  *pstCnfInfo)
{
    PS_USIM_SET_FILE_CNF_STRU  *pUsimMsg;
    VOS_UINT32                 ulResult;

    if(ulErrorCode != USIMM_SW_OK)
    {
        ulResult = VOS_ERR;
    }
    else
    {
        ulResult = VOS_OK;
    }

    if( WUEPS_PID_OM == ulReceiverPid )
    {
        USIMM_OmFileCnf(ulResult,0,0,USIMM_OM_SET_CNF);/*最后一个参数1表示更新文件*/

        return;
    }

    pUsimMsg = (PS_USIM_SET_FILE_CNF_STRU*)VOS_AllocMsg(WUEPS_PID_USIM, sizeof(PS_USIM_SET_FILE_CNF_STRU)-VOS_MSG_HEAD_LENGTH);

    if(VOS_NULL_PTR == pUsimMsg)
    {
        USIMM_ERROR_LOG("USIMM_SetFileCnf: VOS_AllocMsg is Failed");

        return;
    }

    pUsimMsg->ulMsgName     = PS_USIM_SET_FILE_RSP;
    pUsimMsg->ulReceiverPid = ulReceiverPid;
    pUsimMsg->ulResult      = ulResult;
    pUsimMsg->ulErrorCode   = ulErrorCode;
    pUsimMsg->ulSendPara    = ulSendPara;
    pUsimMsg->usEfId        = pstCnfInfo->usEfid;
    pUsimMsg->usEfLen       = pstCnfInfo->usEFLen;
    pUsimMsg->ucRecordNum   = pstCnfInfo->ucRecordNum ;

    (VOS_VOID)VOS_SendMsg(pUsimMsg->ulSenderPid, pUsimMsg);

    return;
}
VOS_VOID USIMM_SetSPBFileCnf(VOS_UINT32                     ulReceiverPid,
                                      VOS_UINT32                    ulErrorCode,
                                      USIMM_SET_SPBFILE_REQ_STRU    *pstMsg)
{
    PS_USIM_SPB_CNF_STRU *pUsimMsg = VOS_NULL_PTR;
    VOS_UINT32           i;

    pUsimMsg = (PS_USIM_SPB_CNF_STRU *)VOS_AllocMsg(WUEPS_PID_USIM, sizeof(PS_USIM_SPB_CNF_STRU)-VOS_MSG_HEAD_LENGTH);

    if (VOS_NULL_PTR == pUsimMsg)
    {
        USIMM_ERROR_LOG("USIMM_SetSPBFileCnf: VOS_AllocMsg is Failed");

        return;
    }

    if(ulErrorCode != USIMM_SW_OK)
    {
        pUsimMsg->ulResult = VOS_ERR;
    }
    else
    {
        pUsimMsg->ulResult = VOS_OK;
    }

    pUsimMsg->ulReceiverPid = ulReceiverPid;
    pUsimMsg->ulMsgName     = PS_USIM_SET_SPBFILE_CNF;
    pUsimMsg->ulErrorCode   = ulErrorCode;
    pUsimMsg->ucFileNum     = (VOS_UINT8)pstMsg->ulSPBReqCount;

    if (VOS_OK == pUsimMsg->ulResult)
    {
        for(i = 0; i < pstMsg->ulSPBReqCount; i++)
        {
            pUsimMsg->ausEfId[i]      = pstMsg->stSPBReq[i].usFileID;
            pUsimMsg->aucRecordNum[i] = pstMsg->stSPBReq[i].ucRecordNum;
            pUsimMsg->ausEfLen[i]     = pstMsg->stSPBReq[i].usDataLen;
        }
    }

    (VOS_VOID)VOS_SendMsg(pUsimMsg->ulSenderPid, pUsimMsg);

    return;
}
VOS_UINT32 USIMM_IsSvlte(VOS_VOID)
{
#if (FEATURE_MULTI_MODEM == FEATURE_ON)
    SVLTE_SUPPORT_FLAG_STRU             stSvlteFlag;

    if (VOS_OK != NV_ReadEx(MODEM_ID_0, en_NV_Item_SVLTE_FLAG, &stSvlteFlag, sizeof(SVLTE_SUPPORT_FLAG_STRU)))
    {
        USIMM_ERROR_LOG("USIMM_IsSvlte: Read NV en_NV_Item_SVLTE_FLAG Fail");

        return VOS_FALSE;
    }

    return (VOS_UINT32)stSvlteFlag.ucSvlteSupportFlag;

#else

    return VOS_FALSE;

#endif
}