VOS_VOID TAF_SPM_FillImsaEconfCallList(
    TAF_CALL_ECONF_CALL_LIST_STRU      *pstCallList
)
{
    TAF_SPM_CALL_ECONF_INFO_STRU       *pstEconfInfoAddr    = VOS_NULL_PTR;
    VOS_UINT32                          ulIndex;
    VOS_UINT32                          ulCallNum;

    pstEconfInfoAddr    = TAF_SPM_GetCallEconfInfoAddr();
    ulCallNum           = 0;

    for (ulIndex = 0; ulIndex < pstEconfInfoAddr->ucCallNum; ulIndex++)
    {
        if (TAF_CS_CAUSE_SUCCESS == pstEconfInfoAddr->astEconfCheckInfo[ulIndex].enCheckRslt)
        {
            PS_MEM_CPY(&pstCallList->astDialNumber[ulCallNum],
                       &pstEconfInfoAddr->astEconfCheckInfo[ulIndex].stCalledNumber,
                       sizeof(MN_CALL_CALLED_NUM_STRU));

            PS_MEM_CPY(&pstCallList->astSubaddr[ulCallNum],
                       &pstEconfInfoAddr->astEconfCheckInfo[ulIndex].stSubaddr,
                       sizeof(MN_CALL_SUBADDR_STRU));

            ulCallNum++;
        }
    }

    pstCallList->ulCallNum = ulCallNum;

    return;
}
VOS_UINT32  TAF_SPM_SendUsimEconfFdnReq(
    VOS_UINT16                          usClientId,
    struct MsgCB                       *pstMsg
)
{
    TAF_SPM_CALL_ECONF_INFO_STRU       *pstEconfInfoAddr    = VOS_NULL_PTR;
    MN_CALL_CALLED_NUM_STRU            *pstCalledNumber     = VOS_NULL_PTR;
    PS_PB_FDN_NUM_STRU                  stFdnInfo;
    VOS_UINT32                          ulRet;
    VOS_UINT8                           ucIndex;
    VOS_UINT32                          ulSendPara;

    PS_MEM_SET(&stFdnInfo, 0x0, sizeof(stFdnInfo));
    pstEconfInfoAddr    = TAF_SPM_GetCallEconfInfoAddr();

    pstEconfInfoAddr->ucSendSuccNum = 0;
    pstEconfInfoAddr->ucRcvNum      = 0;
    for (ucIndex = 0; ucIndex < pstEconfInfoAddr->ucCallNum; ucIndex++)
    {
        pstEconfInfoAddr->astEconfCheckInfo[ucIndex].ulCheckCnfFlag = VOS_FALSE;

        pstCalledNumber = &pstEconfInfoAddr->astEconfCheckInfo[ucIndex].stCalledNumber;

        stFdnInfo.ulNum1Len = pstCalledNumber->ucNumLen <= MN_CALL_MAX_BCD_NUM_LEN ?
                          pstCalledNumber->ucNumLen : MN_CALL_MAX_BCD_NUM_LEN;

        PS_MEM_CPY(stFdnInfo.aucNum1, pstCalledNumber->aucBcdNum, stFdnInfo.ulNum1Len);

        /* 增强型多方通话情况下,高16位为表示第几个电话号码,低16位为ClinedId */
        ulSendPara = TAF_SPM_ECONF_SET_SEND_PARA(ucIndex, usClientId);

        ulRet = NAS_PBAPI_FdnNumCheck(WUEPS_PID_TAF, 0, ulSendPara, &stFdnInfo);
        if (VOS_OK != ulRet)
        {
            /* 记录为失败 */
            TAF_SPM_RecordEconfCheckRslt(ucIndex, TAF_CS_CAUSE_FDN_CHECK_FAILURE);
        }
        else
        {
            pstEconfInfoAddr->ucSendSuccNum++;
        }
    }

    /* 全部发送失败,则退出 */
    if (0 == pstEconfInfoAddr->ucSendSuccNum)
    {
        /* 上报结果 */
        TAF_SPM_ReportEconfCheckRslt();
        return VOS_FALSE;
    }

    return VOS_TRUE;

}
VOS_VOID TAF_SPM_SetEconfPreRslt(
    TAF_CS_CAUSE_ENUM_UINT32            enCause
)
{
    TAF_SPM_CALL_ECONF_INFO_STRU       *pstEconfInfoAddr    = VOS_NULL_PTR;
    VOS_UINT32                          ulIndex;

    pstEconfInfoAddr    = TAF_SPM_GetCallEconfInfoAddr();

    for (ulIndex = 0; ulIndex < pstEconfInfoAddr->ucCallNum; ulIndex++)
    {
        TAF_SPM_RecordEconfCheckRslt(ulIndex, enCause);
    }

    return;
}
VOS_VOID TAF_SPM_GetEconfCheckResultSuccNum(
    VOS_UINT32                         *pulSuccNum
)
{
    TAF_SPM_CALL_ECONF_INFO_STRU       *pstEconfInfoAddr    = VOS_NULL_PTR;
    VOS_UINT32                          ulIndex;

    pstEconfInfoAddr    = TAF_SPM_GetCallEconfInfoAddr();

    for (ulIndex = 0; ulIndex < pstEconfInfoAddr->ucCallNum; ulIndex++)
    {
        if (TAF_CS_CAUSE_SUCCESS == pstEconfInfoAddr->astEconfCheckInfo[ulIndex].enCheckRslt)
        {
            (*pulSuccNum)++;
        }
    }

    return;

}
VOS_VOID TAF_SPM_RecordEconfCheckRslt(
    VOS_UINT32                          ulIndex,
    VOS_UINT32                          ulResult
)
{
    TAF_SPM_CALL_ECONF_INFO_STRU       *pstEconfInfoAddr    = VOS_NULL_PTR;

    pstEconfInfoAddr    = TAF_SPM_GetCallEconfInfoAddr();

    /* ulIndex错误 */
    if (ulIndex >= pstEconfInfoAddr->ucCallNum)
    {
        return;
    }

    pstEconfInfoAddr->astEconfCheckInfo[ulIndex].enCheckRslt        = ulResult;
    pstEconfInfoAddr->astEconfCheckInfo[ulIndex].ulCheckCnfFlag     = VOS_TRUE;

    return;
}
VOS_VOID TAF_SPM_ParseEconfDailInfoFromMsg(
    struct MsgCB                       *pstMsg
)
{
    MN_CALL_APP_REQ_MSG_STRU                *pstAppMsg           = VOS_NULL_PTR;
    TAF_CALL_ECONF_DIAL_REQ_STRU            *pstEconfParam       = VOS_NULL_PTR;
    TAF_SPM_CALL_ECONF_INFO_STRU            *pstEconfInfoAddr    = VOS_NULL_PTR;
    VOS_UINT32                               ulIndex;

    pstEconfInfoAddr    = TAF_SPM_GetCallEconfInfoAddr();
    pstAppMsg           = (MN_CALL_APP_REQ_MSG_STRU *)pstMsg;
    pstEconfParam       = &pstAppMsg->unParm.stEconfDial;
    PS_MEM_SET(pstEconfInfoAddr, 0x0, sizeof(TAF_SPM_CALL_ECONF_INFO_STRU));

    pstEconfInfoAddr->ucCallNum     = (VOS_UINT8)((pstEconfParam->stEconfCalllist.ulCallNum > TAF_CALL_MAX_ECONF_CALLED_NUM) ?
                                       TAF_CALL_MAX_ECONF_CALLED_NUM : pstEconfParam->stEconfCalllist.ulCallNum);
    pstEconfInfoAddr->usClientId    = pstAppMsg->clientId;
    pstEconfInfoAddr->ucopId        = pstAppMsg->opId;
    pstEconfInfoAddr->enCallMode    = pstEconfParam->enCallMode;
    pstEconfInfoAddr->enCallType    = pstEconfParam->enCallType;

    /* 将电话号码存到上下文中 */
    for (ulIndex = 0; ulIndex < pstEconfInfoAddr->ucCallNum; ulIndex++)
    {
        PS_MEM_CPY(&pstEconfInfoAddr->astEconfCheckInfo[ulIndex].stCalledNumber,
                   &pstEconfParam->stEconfCalllist.astDialNumber[ulIndex],
                   sizeof(MN_CALL_CALLED_NUM_STRU));

        PS_MEM_CPY(&pstEconfInfoAddr->astEconfCheckInfo[ulIndex].stSubaddr,
                   &pstEconfParam->stEconfCalllist.astSubaddr[ulIndex],
                   sizeof(MN_CALL_SUBADDR_STRU));
    }

    PS_MEM_CPY(&pstEconfInfoAddr->stDataCfg,
               &pstEconfParam->stDataCfg,
               sizeof(pstEconfParam->stDataCfg));

    return;
}
VOS_VOID TAF_SPM_ReportEconfCheckRslt(VOS_VOID)
{
    TAF_SPM_CALL_ECONF_INFO_STRU       *pstEconfInfoAddr    = VOS_NULL_PTR;
    TAF_CALL_ECONF_INFO_PARAM_STRU     *pstCallInfo         = VOS_NULL_PTR;
    TAF_CALL_ECONF_INFO_PARAM_STRU     *pstTemp             = VOS_NULL_PTR;
    VOS_UINT32                          ulIndex;
    MN_OPERATION_ID_T                   ucOpId;

    pstEconfInfoAddr    = TAF_SPM_GetCallEconfInfoAddr();
    ucOpId              = pstEconfInfoAddr->ucopId;

    pstCallInfo = (TAF_CALL_ECONF_INFO_PARAM_STRU *)PS_MEM_ALLOC(WUEPS_PID_TAF, sizeof(TAF_CALL_ECONF_INFO_PARAM_STRU) * TAF_CALL_MAX_ECONF_CALLED_NUM);
    if (VOS_NULL_PTR == pstCallInfo)
    {
        return;
    }

    PS_MEM_SET(pstCallInfo, 0, sizeof(TAF_CALL_ECONF_INFO_PARAM_STRU) * TAF_CALL_MAX_ECONF_CALLED_NUM);

    pstTemp = pstCallInfo;

    for (ulIndex = 0; ulIndex < pstEconfInfoAddr->ucCallNum; ulIndex++)
    {
        pstTemp->enCause = pstEconfInfoAddr->astEconfCheckInfo[ulIndex].enCheckRslt;
        PS_MEM_CPY(&pstTemp->stCallNumber,
                   &pstEconfInfoAddr->astEconfCheckInfo[ulIndex].stCalledNumber,
                   sizeof(MN_CALL_CALLED_NUM_STRU));
        pstTemp++;
    }

    /* 给AT上报TAF_CALL_EVT_ECONF_NOTIFY_IND */
    TAF_SPM_SendEconfNotifyInd(ucOpId, pstEconfInfoAddr->ucCallNum, pstCallInfo);

    PS_MEM_FREE(WUEPS_PID_TAF, pstCallInfo);

    return;
}
VOS_UINT32 TAF_SPM_ProcEconfCheckResult(VOS_VOID)
{
    TAF_SPM_CALL_ECONF_INFO_STRU       *pstEconfInfoAddr    = VOS_NULL_PTR;
    VOS_UINT32                          ulSuccNum;

    pstEconfInfoAddr    = TAF_SPM_GetCallEconfInfoAddr();
    ulSuccNum           = 0;

    TAF_SPM_GetEconfCheckResultSuccNum(&ulSuccNum);

    /* 全部成功 */
    if (pstEconfInfoAddr->ucCallNum == ulSuccNum)
    {
        /* 不需要给AT上报结果 */
        return VOS_TRUE;
    }
    /* 部分失败或者全部失败 */
    else
    {
        TAF_SPM_ReportEconfCheckRslt();
        return VOS_FALSE;
    }

}
VOS_UINT32  TAF_SPM_SendUsimEconfEnvelopeReq(
    VOS_UINT16                          usClientId,
    struct MsgCB                       *pstMsg
)
{
    TAF_SPM_CALL_ECONF_INFO_STRU       *pstEconfInfoAddr    = VOS_NULL_PTR;
    MN_CALL_CS_DATA_CFG_INFO_STRU       stDataCfgInfo;
    MN_CALL_CALLED_NUM_STRU             stCalledNumber;
    VOS_UINT32                          ulRet;
    VOS_UINT8                           ucIndex;
    MN_CALL_TYPE_ENUM_U8                enCallType;
    MN_CALL_MODE_ENUM_U8                enCallMode;
    VOS_UINT32                          ulSendPara;

    PS_MEM_SET(&stCalledNumber, 0x0, sizeof(stCalledNumber));
    PS_MEM_SET(&stDataCfgInfo, 0x0, sizeof(MN_CALL_CS_DATA_CFG_INFO_STRU));
    pstEconfInfoAddr    = TAF_SPM_GetCallEconfInfoAddr();

    pstEconfInfoAddr->ucSendSuccNum = 0;
    pstEconfInfoAddr->ucRcvNum      = 0;
    enCallType                      = pstEconfInfoAddr->enCallType;
    enCallMode                      = pstEconfInfoAddr->enCallMode;
    PS_MEM_CPY(&stDataCfgInfo, &pstEconfInfoAddr->stDataCfg, sizeof(stDataCfgInfo));

    for (ucIndex = 0; ucIndex < pstEconfInfoAddr->ucCallNum; ucIndex++)
    {
        PS_MEM_CPY(&stCalledNumber,
               &pstEconfInfoAddr->astEconfCheckInfo[ucIndex].stCalledNumber,
               sizeof(MN_CALL_CALLED_NUM_STRU));

        pstEconfInfoAddr->astEconfCheckInfo[ucIndex].ulCheckCnfFlag = VOS_FALSE;

        /* 增强型多方通话情况下,高16位为表示第几个电话号码,低16位为ClinedId */
        ulSendPara = TAF_SPM_ECONF_SET_SEND_PARA(ucIndex, usClientId);

        ulRet = TAF_SPM_SendUsimCallEnvelopeReq(&stCalledNumber,
                                                &stDataCfgInfo,
                                                ulSendPara,
                                                enCallType,
                                                enCallMode);
        if (VOS_FALSE == ulRet)
        {
            /* 记录为失败 */
            TAF_SPM_RecordEconfCheckRslt(ucIndex, TAF_CS_CAUSE_CALL_CTRL_INVALID_PARAMETER);
        }
        else
        {
            pstEconfInfoAddr->ucSendSuccNum++;
        }
    }

    /* 全部发送失败,则退出 */
    if (0 == pstEconfInfoAddr->ucSendSuccNum)
    {
        /* 上报结果 */
        TAF_SPM_ReportEconfCheckRslt();
        return VOS_FALSE;
    }

    return VOS_TRUE;

}