VOS_VOID  MN_CAL_ReadCallDeflectionNvim( VOS_VOID )
{
    MN_CALL_NVIM_CALL_DEFLECTION_SUPPORT_FLG_STRU           stCallDeflectionSupportFlg;
    MN_CALL_CUSTOM_CFG_INFO_STRU                           *pstCallDeflectionSupportFlg = VOS_NULL_PTR;


    stCallDeflectionSupportFlg.ucCallDeflectionSupportFlg = MN_CALL_NV_ITEM_DEACTIVE;

    pstCallDeflectionSupportFlg = MN_CALL_GetCustomCfgInfo();

    if (NV_OK != NV_Read(en_NV_Item_NVIM_CALL_DEFLECTION_SUPPORT_FLG,
                         &stCallDeflectionSupportFlg, sizeof(MN_CALL_NVIM_CALL_DEFLECTION_SUPPORT_FLG_STRU)))
    {
        MN_WARN_LOG("MN_CAL_ReadCallDeflectionNvim():WARNING: en_NV_Item_NVIM_CALL_DEFLECTION_SUPPORT_FLG Error");

        return;
    }


    if ((MN_CALL_NV_ITEM_ACTIVE != stCallDeflectionSupportFlg.ucCallDeflectionSupportFlg)
     && (MN_CALL_NV_ITEM_DEACTIVE != stCallDeflectionSupportFlg.ucCallDeflectionSupportFlg))
    {
        pstCallDeflectionSupportFlg->ucCallDeflectionSupportFlg = MN_CALL_NV_ITEM_DEACTIVE;
        MN_WARN_LOG("MN_CAL_ReadCallDeflectionNvim():WARNING: NV parameter Error");
        return;
    }

    pstCallDeflectionSupportFlg->ucCallDeflectionSupportFlg = stCallDeflectionSupportFlg.ucCallDeflectionSupportFlg;

    return;
}
VOS_VOID TAF_CALL_SetCcwaCtrlMode(
    TAF_CALL_CCWA_CTRL_MODE_ENUM_U8     enCcwaCtrlMode
)
{
    MN_CALL_GetCustomCfgInfo()->enCcwaCtrlMode = enCcwaCtrlMode;

    return;
}
VOS_VOID  MN_CALL_ReadReportEccNumSupportNvim( VOS_VOID )
{
    MN_CALL_NVIM_REPORT_ECC_NUM_SUPPORT_FLG_STRU            stCustomSetEcc;
    MN_CALL_CUSTOM_CFG_INFO_STRU                           *pstCustomCfg = VOS_NULL_PTR;
    VOS_UINT32                                              ulLength;


    ulLength = 0;
    PS_MEM_SET(&stCustomSetEcc, 0x00, sizeof(stCustomSetEcc));

    pstCustomCfg = MN_CALL_GetCustomCfgInfo();

    /* 先获取NV的长度 */
    NV_GetLength(en_NV_Item_REPORT_ECC_NUM_SUPPORT_FLAG, &ulLength);

    if (ulLength > sizeof(MN_CALL_NVIM_REPORT_ECC_NUM_SUPPORT_FLG_STRU))
    {
        MN_WARN_LOG("MN_CALL_ReadReportEccNumSupportNvim():WARNING: en_NV_Item_REPORT_ECC_NUM_SUPPORT_FLAG length Error");
        pstCustomCfg->ucReportEccNumFlg = VOS_FALSE;

        return;
    }

    NV_GetLength(en_NV_Item_REPORT_ECC_NUM_SUPPORT_FLAG, &ulLength);	
    if (ulLength > sizeof(MN_CALL_NVIM_REPORT_ECC_NUM_SUPPORT_FLG_STRU))
    {
        return;
    }

    /* 如果NV读取失败,则设置为不激活 */
    if (NV_OK != NV_Read(en_NV_Item_REPORT_ECC_NUM_SUPPORT_FLAG,
                         &stCustomSetEcc, ulLength))
    {
        MN_WARN_LOG("MN_CAL_ReadReportEccNumSupportNvim():WARNING: en_NV_Item_REPORT_ECC_NUM_SUPPORT_FLAG Error");

        pstCustomCfg->ucReportEccNumFlg = VOS_FALSE;

        return;
    }

    /* NV激活则设置主动上报激活标志为VOS_TRUE */
    if (MN_CALL_NV_ITEM_ACTIVE == stCustomSetEcc.ucReportEccNumFlg)
    {
        pstCustomCfg->ucReportEccNumFlg = VOS_TRUE;
    }
    else
    {
        pstCustomCfg->ucReportEccNumFlg = VOS_FALSE;
    }

    return;
}
VOS_VOID MN_ProcUsimStatus(
    struct MsgCB                        * pstMsg
)
{
    MNPH_USIM_STATUS_IND_STRU           *pstUsimStatus;
    MN_CALL_CUSTOM_CFG_INFO_STRU        *pstCustomCfgAddr;

    /* 获取特性控制NV地址 */
    pstCustomCfgAddr                    = MN_CALL_GetCustomCfgInfo();

    MN_MSG_SetSmsFileRefreshFlag(EF_SMS_SMSS_ID, VOS_TRUE);
    MN_MSG_SetSmsFileRefreshFlag(EF_SMS_SMS_ID, VOS_TRUE);
    MN_MSG_SetSmsFileRefreshFlag(EF_SMS_SMSP_ID, VOS_TRUE);
    MN_MSG_SetSmsFileRefreshFlag(EF_SMS_SMSR_ID, VOS_TRUE);


    pstUsimStatus = (MNPH_USIM_STATUS_IND_STRU *)pstMsg;
    MN_MSG_CfgDataInit(pstUsimStatus->enUsimStatus);

#if ((FEATURE_ON == FEATURE_GCBS) || (FEATURE_ON == FEATURE_WCBS))

    TAF_CBA_MsgProc(pstMsg);

#endif

    if (MN_CALL_NV_ITEM_ACTIVE == pstCustomCfgAddr->ucAlsSupportFlg )
    {
        MN_CALL_LineInfo(pstUsimStatus->enUsimStatus);
    }

    /* 在PID init读取呼叫重建nv的时候判断是否是测试卡,但可能由于时序问题导致判断结果错误,
       因此在运行时再读调用一次读取NV的函数,在函数中判断是否是测试卡 */
    MN_CALL_ReadCallRedialCfgNvim();

    /* 在PID init读取ss重建nv的时候判断是否是测试卡,但可能由于时序问题usim未初始化结束调用usim接口
       获取是否是测试卡返回不准导致判断结果错误,因此在运行时再读调用一次读取NV的函数,
       在函数中判断是否是测试卡 */
    TAF_SSA_ReadSsRetryCfgNvim();

}
VOS_VOID TAF_CALL_ReadCallNotSupportedCause(VOS_VOID)
{
    MN_CALL_CUSTOM_CFG_INFO_STRU        *pstCustomCfg = VOS_NULL_PTR;
    TAF_CALL_NVIM_CALL_NOT_SUPPORTED_CAUSE_STRU             stVoiceCallNotSupportedCause;

    if (NV_OK != NV_Read(en_NV_Item_CALL_CallNotSupportedCause,
                         &stVoiceCallNotSupportedCause,
                         sizeof(stVoiceCallNotSupportedCause)))
    {
        stVoiceCallNotSupportedCause.ucVoiceCallNotSupportedCause = MN_CALL_USER_BUSY;
        stVoiceCallNotSupportedCause.ucVideoCallNotSupportedCause = MN_CALL_INCOMPATIBLE_DESTINATION;
    }

    pstCustomCfg = MN_CALL_GetCustomCfgInfo();
    
    pstCustomCfg->ucVoiceCallNotSupportedCause = 
                      stVoiceCallNotSupportedCause.ucVoiceCallNotSupportedCause;
    pstCustomCfg->ucVideoCallNotSupportedCause = 
                      stVoiceCallNotSupportedCause.ucVideoCallNotSupportedCause;

    return;
}
VOS_VOID  MN_CAL_ReadAlsSupportNvim( VOS_VOID )
{
    MN_CALL_NVIM_ALS_SUPPORT_FLG_STRU                       stAlsSupportFlg;
    MN_CALL_CUSTOM_CFG_INFO_STRU                           *pstCustomCfg = VOS_NULL_PTR;
    VOS_UINT32                                              ulLength;

    ulLength                        = 0;

    stAlsSupportFlg.ucAlsSupportFlg = MN_CALL_NV_ITEM_DEACTIVE;

    pstCustomCfg = MN_CALL_GetCustomCfgInfo();
    
    NV_GetLength(en_NV_Item_NVIM_ALS_SUPPORT_FLG, &ulLength);	
    if (ulLength > sizeof(MN_CALL_NVIM_ALS_SUPPORT_FLG_STRU))
    {
        return;
    }
    
    if (NV_OK != NV_Read(en_NV_Item_NVIM_ALS_SUPPORT_FLG,
                         &stAlsSupportFlg, ulLength))
    {
        MN_WARN_LOG("MN_CAL_ReadAlsSupportNvim():WARNING: en_NV_Item_NVIM_ALS_SUPPORT_FLG Error");

        return;
    }


    if ((MN_CALL_NV_ITEM_ACTIVE != stAlsSupportFlg.ucAlsSupportFlg)
     && (MN_CALL_NV_ITEM_DEACTIVE != stAlsSupportFlg.ucAlsSupportFlg))
    {
        pstCustomCfg->ucAlsSupportFlg = MN_CALL_NV_ITEM_DEACTIVE;
        MN_WARN_LOG("MN_CAL_ReadAlsSupportNvim():WARNING: NV parameter Error");
        return;
    }

    pstCustomCfg->ucAlsSupportFlg = stAlsSupportFlg.ucAlsSupportFlg;

    return;
}
VOS_VOID  MN_CALL_ReadCallRedialCfgNvim( VOS_VOID )
{
    MN_CALL_REDIAL_CFG_STRU             stCallRedialCfg;
    MN_CALL_CUSTOM_CFG_INFO_STRU       *pstCustomCfg = VOS_NULL_PTR;
    VOS_UINT32                          ulLength;


    ulLength = 0;

    pstCustomCfg = MN_CALL_GetCustomCfgInfo();

    /* GCF测试,短信重发功能需要关闭 */
    if (VOS_TRUE == NAS_USIMMAPI_IsTestCard())
    {
        pstCustomCfg->stCallRedialCfg.ucIsCallRedialSupportFlg = VOS_FALSE;
        pstCustomCfg->stCallRedialCfg.ulCallRedialPeriod       = 0;
        pstCustomCfg->stCallRedialCfg.ulCallRedialInterval     = 0;

        MN_CALL_UpdateTimerPeriod(MN_CALL_TID_WAIT_CALL_REDIAL_PERIOD,
                                    pstCustomCfg->stCallRedialCfg.ulCallRedialPeriod);

        MN_CALL_UpdateTimerPeriod(MN_CALL_TID_WAIT_CALL_REDAIL_INTERVAL,
                                    pstCustomCfg->stCallRedialCfg.ulCallRedialInterval);

        return;
    }

    /* 先获取NV的长度 */
    NV_GetLength(en_NV_Item_CS_Call_Redial_CFG, &ulLength);

    PS_MEM_SET(&stCallRedialCfg, 0x0, sizeof(MN_CALL_REDIAL_CFG_STRU));

    if (ulLength > sizeof(MN_CALL_REDIAL_CFG_STRU))
    {
        MN_WARN_LOG("MN_CALL_ReadCallRedialCfgNvim():WARNING: en_NV_Item_CS_Call_Redial_CFG length Error");
        pstCustomCfg->stCallRedialCfg.ucIsCallRedialSupportFlg = VOS_FALSE;
        pstCustomCfg->stCallRedialCfg.ulCallRedialPeriod       = 0;
        pstCustomCfg->stCallRedialCfg.ulCallRedialInterval     = 0;
        MN_CALL_UpdateTimerPeriod(MN_CALL_TID_WAIT_CALL_REDIAL_PERIOD,
                              pstCustomCfg->stCallRedialCfg.ulCallRedialPeriod);
        MN_CALL_UpdateTimerPeriod(MN_CALL_TID_WAIT_CALL_REDAIL_INTERVAL,
                              pstCustomCfg->stCallRedialCfg.ulCallRedialInterval);
        return;
    }

    /* 如果NV读取失败,则设置为不激活 */
    if (NV_OK != NV_Read(en_NV_Item_CS_Call_Redial_CFG,
                         &stCallRedialCfg, sizeof(MN_CALL_REDIAL_CFG_STRU)))
    {
        MN_WARN_LOG("MN_CALL_ReadCallRedialCfgNvim():WARNING: en_NV_Item_CS_Call_Redial_CFG Error");
        pstCustomCfg->stCallRedialCfg.ucIsCallRedialSupportFlg = VOS_FALSE;
        pstCustomCfg->stCallRedialCfg.ulCallRedialPeriod       = 0;
        pstCustomCfg->stCallRedialCfg.ulCallRedialInterval     = 0;
        MN_CALL_UpdateTimerPeriod(MN_CALL_TID_WAIT_CALL_REDIAL_PERIOD,
                              pstCustomCfg->stCallRedialCfg.ulCallRedialPeriod);
        MN_CALL_UpdateTimerPeriod(MN_CALL_TID_WAIT_CALL_REDAIL_INTERVAL,
                              pstCustomCfg->stCallRedialCfg.ulCallRedialInterval);
        return;
    }

    if (MN_CALL_NV_ITEM_ACTIVE == stCallRedialCfg.ucIsCallRedialSupportFlg)
    {
        pstCustomCfg->stCallRedialCfg.ucIsCallRedialSupportFlg = VOS_TRUE;

        /* nv中存的时长为秒,需要转换为毫秒 */
        pstCustomCfg->stCallRedialCfg.ulCallRedialPeriod
            = MN_CALL_ONE_THOUSAND_MILLISECOND * stCallRedialCfg.ulCallRedialPeriod;
        pstCustomCfg->stCallRedialCfg.ulCallRedialInterval
            = MN_CALL_ONE_THOUSAND_MILLISECOND * stCallRedialCfg.ulCallRedialInterval;
    }
    else
    {
        pstCustomCfg->stCallRedialCfg.ucIsCallRedialSupportFlg = VOS_FALSE;
        pstCustomCfg->stCallRedialCfg.ulCallRedialPeriod       = 0;
        pstCustomCfg->stCallRedialCfg.ulCallRedialInterval     = 0;
    }

    MN_CALL_UpdateTimerPeriod(MN_CALL_TID_WAIT_CALL_REDIAL_PERIOD,
                              pstCustomCfg->stCallRedialCfg.ulCallRedialPeriod);
    MN_CALL_UpdateTimerPeriod(MN_CALL_TID_WAIT_CALL_REDAIL_INTERVAL,
                              pstCustomCfg->stCallRedialCfg.ulCallRedialInterval);

    return;
}
TAF_CALL_CCWA_CTRL_MODE_ENUM_U8 TAF_CALL_GetCcwaCtrlMode(VOS_VOID)
{
    return MN_CALL_GetCustomCfgInfo()->enCcwaCtrlMode;
}
TAF_CALL_REDIAL_CFG_STRU *MN_CALL_GetCallRedialCfg(VOS_VOID)
{
    return &(MN_CALL_GetCustomCfgInfo()->stCallRedialCfgInfo.stCallRedialCfg);
}
VOS_VOID  MN_CALL_ProcMnccPrimMsg(
    const VOS_VOID                      *pMsg
)
{
    MNCC_IND_PRIM_MSG_STRU              *pstMnccMsg;
    MN_CALL_CUSTOM_CFG_INFO_STRU        *pstCustomCfgAddr;

    /* 获取特性控制NV地址 */
    pstCustomCfgAddr                    = MN_CALL_GetCustomCfgInfo();

    pstMnccMsg = (MNCC_IND_PRIM_MSG_STRU*)pMsg;
    MN_NORM_LOG1("MN_CALL_ProcAppReqMsg: enPrimName:", pstMnccMsg->enPrimName);

    /* 根据消息中的原语名,将消息交给相应的MNCC原语处理函数处理 */
    switch(pstMnccMsg->enPrimName)
    {
    case MNCC_SETUP_IND:
/*PC回放导出全局变量使用*/
#ifndef __PS_WIN32_RECUR__
        NAS_CALL_SndOutsideContextData();
#endif
        MN_CALL_ProcMnccSetupInd(pstMnccMsg);
        break;

    case MNCC_SETUP_CNF:
        MN_CALL_ProcMnccSetupCnf(pstMnccMsg);
        break;

    case MNCC_SETUP_COMPL_IND:
        MN_CALL_ProcMnccSetupComplInd(pstMnccMsg);
        break;

    case MNCC_CALL_PROC_IND:
        MN_CALL_ProcMnccCallProcInd(pstMnccMsg);
        break;

    case MNCC_ALERT_IND:
        MN_CALL_ProcMnccAlertInd(pstMnccMsg);
        break;

    case MNCC_DISC_IND:
        MN_CALL_ProcMnccDiscInd(pstMnccMsg);
        break;

    case MNCC_REL_IND:
        MN_CALL_ProcMnccRelInd(pstMnccMsg);
        break;

    case MNCC_REL_CNF:
        MN_CALL_ModifyCallId(pstMnccMsg);
        MN_CALL_ProcMnccRelCnf(pstMnccMsg);
        break;

    case MNCC_REJ_IND:
        MN_CALL_ProcMnccRejInd(pstMnccMsg);
        break;

    case MNCC_FACILITY_IND:
        MN_CALL_ProcMnccFacilityInd(pstMnccMsg);
        break;

    case MNCC_FACILITY_LOCAL_REJ:
        MN_CALL_ProcMnccFacilityLocalRej(pstMnccMsg);
        break;

    case MNCC_HOLD_CNF:
        MN_CALL_ProcMnccHoldCnf(pstMnccMsg);
        break;

    case MNCC_HOLD_REJ:
        MN_CALL_ProcMnccHoldRej(pstMnccMsg);
        break;

    case MNCC_RETRIEVE_CNF:
        MN_CALL_ProcMnccRetrieveCnf(pstMnccMsg);
        break;

    case MNCC_RETRIEVE_REJ:
        MN_CALL_ProcMnccRetrieveRej(pstMnccMsg);
        break;

    case MNCC_START_DTMF_CNF:
        TAF_CALL_RcvCcStartDtmfCnf(pstMnccMsg);
        break;

    case MNCC_START_DTMF_REJ:
        TAF_CALL_RcvCcStartDtmfRej(pstMnccMsg);
        break;

    case MNCC_STOP_DTMF_CNF:
        TAF_CALL_RcvCcStopDtmfCnf(pstMnccMsg);
        break;

    case MNCC_MODIFY_IND:
        /* in-call modification, CC暂不支持 */
        break;

    case MNCC_MODIFY_CNF:
        /* in-call modification, CC暂不支持 */
        break;

    case MNCC_MODIFY_REJ_IND:
        /* in-call modification, CC暂不支持 */
        break;

    case MNCC_SYNC_IND:
        MN_CALL_ProcMnccSyncInd(pstMnccMsg);
        break;

    case MNCC_PROGRESS_IND:
        MN_CALL_ProcMnccProgressInd(pstMnccMsg);
        break;

    case MNCC_CC_EST_IND:

        /*如果控制CCBS的NV打开,则处理*/
        if (MN_CALL_NV_ITEM_ACTIVE == pstCustomCfgAddr->ucCcbsSupportFlg)
        {
            MN_CALL_ProcMnccEstInd(pstMnccMsg);
        }
        break;

    case MNCC_RECALL_IND:

        /*如果控制CCBS的NV打开,则处理*/
        if (MN_CALL_NV_ITEM_ACTIVE == pstCustomCfgAddr->ucCcbsSupportFlg)
        {
            MN_CALL_ProcMnccRecallInd(pstMnccMsg);
        }
        break;

    case MNCC_UUSINFO_IND:
        MN_CALL_ProcUusInfoInd(pstMnccMsg);
        break;

    case MNCC_EMERGENCY_LIST_IND:
        MN_CALL_ProcEmergencyListInd(pstMnccMsg);
        break;

#if (FEATURE_ON == FEATURE_IMS)
    case MNCC_SRVCC_STATUS_IND:
        TAF_CALL_ProcMnccSrvccStatusInd((MNCC_SRVCC_STATUS_IND_STRU*)&(pstMnccMsg->unParam.stSrvccStaInd));
        break;
#endif

    default:
        MN_WARN_LOG("MN_CALL_ProcAppReqMsg:Invalid Msg Name");
        break;
    }

}