VOS_UINT32 TAF_SPM_IsPhoneEmergencyNum( MN_CALL_CALLED_NUM_STRU *pstDialNum ) { VOS_UINT32 ulLoop; VOS_CHAR **pucEmcNumsNoUsim = VOS_NULL_PTR; VOS_CHAR **pucEmcNumsWithUsim = VOS_NULL_PTR; VOS_INT8 acCalledNum[MN_CALL_MAX_CALLED_ASCII_NUM_LEN + 1]; /* 号码转换 BCD-> Ascii */ if (MN_ERR_NO_ERROR != TAF_STD_ConvertBcdNumberToAscii(pstDialNum->aucBcdNum, pstDialNum->ucNumLen, (VOS_CHAR *)acCalledNum)) { MN_WARN_LOG("TAF_SPM_IsPhoneEmergencyNum: BCD -> Ascii ERROR."); return VOS_FALSE; } pucEmcNumsNoUsim = TAF_SDC_GetCallEmerNumsNoUsimTblAddr(); pucEmcNumsWithUsim = TAF_SDC_GetCallEmerNumsWithUsimTblAddr(); if (TAF_SDC_USIM_STATUS_NO_PRESENT == TAF_SDC_GetSimStatus()) { for (ulLoop = 0; ulLoop < TAF_SDC_NUMOF_EMER_NUMS_NO_USIM; ulLoop++) { if (0 == VOS_StrCmp(pucEmcNumsNoUsim[ulLoop], (VOS_CHAR *)acCalledNum)) { return VOS_TRUE; } } } else { /* 有卡时检查手机中存储的紧急呼叫号码 */ for (ulLoop = 0; ulLoop < TAF_SDC_NUMOF_EMER_NUMS_WITH_USIM; ulLoop++ ) { if (0 == VOS_StrCmp(pucEmcNumsWithUsim[ulLoop], (VOS_CHAR *)acCalledNum)) { return VOS_TRUE; } } } return VOS_FALSE; }
VOS_VOID MN_CALL_LineInfo( MNPH_USIM_STATUS_ENUM_U32 enUsimStatus ) { MN_CALL_ALS_LINE_INFO_STRU stAlsInfo; VOS_UINT8 aucMmaImsi[9]; VOS_BOOL bWriteNvim; VOS_UINT32 ulLength; ulLength = 0; stAlsInfo.enAlsLine = MN_CALL_ALS_LINE_NO_BUTT; PS_MEM_SET(stAlsInfo.aucMmaImsi, 0x00, sizeof(stAlsInfo.aucMmaImsi)); if ( MNPH_USIM_STATUS_AVILABLE == enUsimStatus ) { bWriteNvim = VOS_FALSE; if ( NV_OK != NV_Read(en_NV_Item_ALS_LINE_Config,&stAlsInfo,sizeof(stAlsInfo))) { return; } if ( USIMM_API_SUCCESS != NAS_USIMMAPI_GetCardIMSI(aucMmaImsi) ) { return ; } /*线路号值不在取值范围内*/ if ( ( MN_CALL_ALS_LINE_NO_1 != stAlsInfo.enAlsLine ) && ( MN_CALL_ALS_LINE_NO_2 != stAlsInfo.enAlsLine ) ) { stAlsInfo.enAlsLine = MN_CALL_ALS_LINE_NO_1; bWriteNvim = VOS_TRUE; } /*判断NV中当前使用线路号对应的IMSI和SIM卡中IMSI是否相同,若不同则清NV 项,并填入默认线路号1*/ if ( 0 != VOS_StrCmp( (VOS_CHAR *)aucMmaImsi, (VOS_CHAR *)stAlsInfo.aucMmaImsi) ) { stAlsInfo.enAlsLine = MN_CALL_ALS_LINE_NO_1; PS_MEM_CPY(stAlsInfo.aucMmaImsi,aucMmaImsi,9); bWriteNvim = VOS_TRUE; } /*需要更新NVIM*/ if ( VOS_TRUE == bWriteNvim ) { NV_GetLength(en_NV_Item_ALS_LINE_Config, &ulLength); if (NV_OK != NV_Write(en_NV_Item_ALS_LINE_Config, &stAlsInfo, ulLength) ) { TAF_WARNING_LOG(WUEPS_PID_TAF, "MN_CALL_LineInfo: en_NV_Item_ALS_LINE_Config NV Write Fail!"); } } MN_CALL_UpdateAlsLineInfo(stAlsInfo.enAlsLine,VOS_FALSE); } }
VOS_UINT32 diag_FsGetDirInfo(VOS_CHAR *pDirName, VOS_UINT32 *pulTotalNum) { VOS_INT32 dir_handle =0; VOS_INT32 nRead =0; VOS_INT32 nCount =0; VOS_UINT32 i=0; VOS_UINT8* buf =NULL; DIAG_DIRENT_STRU *pstTmpDirent; mm_segment_t old_fs; old_fs = get_fs(); set_fs(KERNEL_DS); /*打开目录*/ if((dir_handle = DIAG_FS_OPENDIR((VOS_CHAR*)pDirName,DIAG_FS_RDONLY|DIAG_FS_DIRECTORY,0))< 0) { set_fs(old_fs); printk( "[%s]DIAG_FS_OPENDIR error!",__FUNCTION__); return VOS_ERR; } buf =(VOS_UINT8*)VOS_MemAlloc(diag_GetAgentPid(), DYNAMIC_MEM_PT,MSP_DF_DIR_BUF_LEN); if(NULL == buf) { printk( "[%s]Alloc mem error!",__FUNCTION__); DIAG_FS_CLOSEDIR(dir_handle); set_fs(old_fs); return VOS_ERR; } nRead = DIAG_FS_GETDENTS(dir_handle, (struct linux_dirent __user *)buf, MSP_DF_DIR_BUF_LEN); if(-1 == nRead) { printk("[%s]dents error,nRead=%d!\n",__FUNCTION__,(VOS_INT)nRead); *pulTotalNum =0; VOS_MemFree(diag_GetAgentPid(), buf); DIAG_FS_CLOSEDIR(dir_handle); set_fs(old_fs); return VOS_ERR; } if(0 == nRead) { diag_printf("[%s]dents zero!\n",__FUNCTION__); *pulTotalNum = 0; VOS_MemFree(diag_GetAgentPid(), buf); DIAG_FS_CLOSEDIR(dir_handle); set_fs(old_fs); return VOS_OK; } for(i=0; i<(VOS_UINT32)nRead;) { pstTmpDirent = (DIAG_DIRENT_STRU*)(buf + i); i += pstTmpDirent->d_reclen; if((0 == VOS_StrCmp((char *) pstTmpDirent->d_name, ".")) ||(0 == VOS_StrCmp ((char *) pstTmpDirent->d_name, ".."))) { diag_printf("diag_FsGetDirInfo:d_name=%S!\n",pstTmpDirent->d_name); continue; } #if 0 if (nCount>=FILENAME_NUM_MAX) { DIAG_FS_CLOSEDIR(dir_handle); set_fs(old_fs); return VOS_ERR; } #endif nCount++; } *pulTotalNum = nCount; /*关闭目录*/ if (DIAG_FS_ERROR == DIAG_FS_CLOSEDIR(dir_handle)) { VOS_MemFree(diag_GetAgentPid(), buf); printk("[%s]DIAG_FS_CLOSEDIR zero!\n",__FUNCTION__); set_fs(old_fs); return VOS_ERR; } VOS_MemFree(diag_GetAgentPid(), buf); set_fs(old_fs); return VOS_OK; }
VOS_UINT32 diag_FsGetItemInfo(VOS_CHAR *pDirectory,DIAG_DIR_FILE_INFO_STRU *pstDirFileInfo) { DIAG_DIRENT_STRU *pstTmpDirent; DIAG_STAT_STRU stStat; VOS_UINT8 ucDirName[MSP_DF_DIR_MAX_LEN]; VOS_INT32 dir_handle =0; VOS_INT32 nRead =0; VOS_INT32 i=0; VOS_UINT8* buf =NULL; mm_segment_t old_fs; old_fs = get_fs(); set_fs(KERNEL_DS); /*再次打开目录*/ if((dir_handle = DIAG_FS_OPENDIR(pDirectory,DIAG_FS_RDONLY|DIAG_FS_DIRECTORY,0))< 0) { printk( "[%s]DIAG_FS_OPENDIR error!",__FUNCTION__); set_fs(old_fs); return VOS_ERR; } buf =(VOS_UINT8*)VOS_MemAlloc(diag_GetAgentPid(), DYNAMIC_MEM_PT,MSP_DF_DIR_BUF_LEN); if(NULL == buf) { printk( "[%s]Alloc mem error!",__FUNCTION__); DIAG_FS_CLOSEDIR(dir_handle); set_fs(old_fs); return VOS_ERR; } nRead = DIAG_FS_GETDENTS(dir_handle, (struct linux_dirent __user *)buf, MSP_DF_DIR_BUF_LEN); if((-1 == nRead)||(0 == nRead)) { printk("[%s]dents error,nRead=%d!\n",__FUNCTION__,(VOS_INT)nRead); VOS_MemFree(diag_GetAgentPid(), buf); DIAG_FS_CLOSEDIR(dir_handle); set_fs(old_fs); return VOS_ERR; } /*轮询文件夹将所有文件名保存至全局变量*/ for(i=0; i<nRead; ) { pstTmpDirent = (DIAG_DIRENT_STRU*)(buf + i); i += pstTmpDirent->d_reclen; if((0 == VOS_StrCmp((char *) pstTmpDirent->d_name, ".")) ||(0 == VOS_StrCmp ((char *) pstTmpDirent->d_name, ".."))) { diag_printf("[%s]:d_name=%S!\n",__FUNCTION__,pstTmpDirent->d_name); continue; } VOS_StrCpy((VOS_CHAR *)ucDirName, pDirectory); strncat((VOS_CHAR *)ucDirName, "/",sizeof(VOS_CHAR)); strncat((VOS_CHAR *)ucDirName, pstTmpDirent->d_name,strlen(pstTmpDirent->d_name)); /*通过stat获取文件或文件夹的信息*/ if (DIAG_FS_ERROR == DIAG_FS_STAT((VOS_CHAR *)ucDirName, &stStat)) { printk("DIAG_FS_STAT: error!\n"); pstDirFileInfo->ulItemType = DIAG_FS_ITEM_FILE; pstDirFileInfo->st_size = 0; pstDirFileInfo->st_mode = 0; pstDirFileInfo->st_atime = 0; pstDirFileInfo->st_mtime = 0; pstDirFileInfo->st_ctime = 0; } else { /*目录*/ if (0 != (DIAG_IF_DIR&stStat.mode)) { pstDirFileInfo->ulItemType = DIAG_FS_ITEM_FOLDER; } /*文件*/ else { pstDirFileInfo->ulItemType = DIAG_FS_ITEM_FILE; } pstDirFileInfo->st_size = (stStat.size & 0xFFFFFFFF);/* 目前文件大小不会超过32位大小 */ pstDirFileInfo->st_atime = stStat.atime.tv_sec; pstDirFileInfo->st_mtime = stStat.mtime.tv_sec; pstDirFileInfo->st_ctime = stStat.ctime.tv_sec; pstDirFileInfo->st_mode = stStat.mode; } /*文件或文件夹名*/ VOS_MemSet(pstDirFileInfo->aucDirName, 0,DIAG_CMD_FILE_NAME_LEN); VOS_StrCpy(pstDirFileInfo->aucDirName, pstTmpDirent->d_name); pstDirFileInfo++; } VOS_MemFree(diag_GetAgentPid(), buf); DIAG_FS_CLOSEDIR(dir_handle); set_fs(old_fs); return VOS_OK; }
VOS_VOID MN_CALL_LineInfo( MNPH_USIM_STATUS_ENUM_U32 enUsimStatus ) { MN_CALL_ALS_LINE_INFO_STRU stAlsInfo; VOS_UINT8 aucMmaImsi[9]; VOS_BOOL bWriteNvim; VOS_UINT32 ulLength; VOS_UINT32 ulGetCardImsiRslt; ulGetCardImsiRslt = USIMM_API_RESULT_BUTT; ulLength = 0; stAlsInfo.enAlsLine = MN_CALL_ALS_LINE_NO_BUTT; PS_MEM_SET(stAlsInfo.aucMmaImsi, 0x00, sizeof(stAlsInfo.aucMmaImsi)); if ( MNPH_USIM_STATUS_AVILABLE == enUsimStatus ) { bWriteNvim = VOS_FALSE; if ( NV_OK != NV_Read(en_NV_Item_ALS_LINE_Config,&stAlsInfo,sizeof(stAlsInfo))) { return; } ulGetCardImsiRslt = NAS_USIMMAPI_GetCardIMSI(aucMmaImsi); if ( USIMM_API_SUCCESS != ulGetCardImsiRslt) { if (VOS_TRUE == TAF_SDC_IsImsiAvailableInCurrSimStatus(TAF_SDC_GetSimStatus())) { #if (FEATURE_ON == FEATURE_PTM) /* 记录获取卡IMSI异常log */ TAF_SDC_GetCardImsiFailRecord(ulGetCardImsiRslt, aucMmaImsi); #endif } return ; } /*线路号值不在取值范围内*/ if ( ( MN_CALL_ALS_LINE_NO_1 != stAlsInfo.enAlsLine ) && ( MN_CALL_ALS_LINE_NO_2 != stAlsInfo.enAlsLine ) ) { stAlsInfo.enAlsLine = MN_CALL_ALS_LINE_NO_1; bWriteNvim = VOS_TRUE; } /*判断NV中当前使用线路号对应的IMSI和SIM卡中IMSI是否相同,若不同则清NV 项,并填入默认线路号1*/ if ( 0 != VOS_StrCmp( (VOS_CHAR *)aucMmaImsi, (VOS_CHAR *)stAlsInfo.aucMmaImsi) ) { stAlsInfo.enAlsLine = MN_CALL_ALS_LINE_NO_1; PS_MEM_CPY(stAlsInfo.aucMmaImsi,aucMmaImsi,9); bWriteNvim = VOS_TRUE; } /*需要更新NVIM*/ if ( VOS_TRUE == bWriteNvim ) { (VOS_VOID)NV_GetLength(en_NV_Item_ALS_LINE_Config, &ulLength); if (NV_OK != NV_Write(en_NV_Item_ALS_LINE_Config, &stAlsInfo, ulLength) ) { TAF_WARNING_LOG(WUEPS_PID_TAF, "MN_CALL_LineInfo: en_NV_Item_ALS_LINE_Config NV Write Fail!"); } } (VOS_VOID)MN_CALL_UpdateAlsLineInfo(stAlsInfo.enAlsLine,VOS_FALSE); } }
/***************************************************************************** Function : NV_DeleteFileBySuffix Description: Delete files by file's suffix name. Input : pcDirName - the file's directory. Return : VOID Other : *****************************************************************************/ VOS_VOID NV_DeleteFilesBySuffix(VOS_CHAR *pcDirPath, VOS_CHAR *pcSuffixName) { DRV_DIR_STRU *pstTmpDir; DRV_DIRENT_STRU *pstTmpDirent; VOS_UINT32 ulNameLen; VOS_CHAR acSuffixSrc[NV_XML_SUFFIX_STR_SIZE]; VOS_UINT32 i; VOS_UINT32 ulLoopNum = 0; VOS_UINT32 ulFileNum = 0; pstTmpDir = DRV_FILE_OPENDIR(pcDirPath); if (VOS_NULL_PTR == pstTmpDir) { NV_Printf("NV_DeleteFilesBySuffix, DRV_FILE_OPENDIR %s fail.\r\n", pcDirPath); return; } do { pstTmpDirent = DRV_FILE_READDIR(pstTmpDir); /* readdir's return value is zero, so the loop should be over. */ if (VOS_NULL_PTR != pstTmpDirent) { /* ulNumLen includes the ending of string. */ ulNameLen = VOS_StrLen(pstTmpDirent->d_name) + 1; if (NV_XML_SUFFIX_STR_SIZE < ulNameLen) { for (i = 0; i < NV_XML_SUFFIX_STR_SIZE; i++) { acSuffixSrc[i] = (VOS_CHAR)tolower(pstTmpDirent->d_name[ulNameLen - (NV_XML_SUFFIX_STR_SIZE - i)]); } if (VOS_OK == VOS_StrCmp(acSuffixSrc, pcSuffixName)) { NV_File_Remove(pcDirPath, pstTmpDirent->d_name); ulFileNum++; } } } /* Avoid dead loop.*/ ulLoopNum++; }while ((VOS_NULL_PTR != pstTmpDirent) && (ulLoopNum < NV_XML_FILE_MAX_NUM)); if (VOS_OK != DRV_FILE_CLOSEDIR(pstTmpDir)) { NV_Printf("NV_DeleteFilesBySuffix, DRV_FILE_CLOSEDIR fail.\r\n"); } if (NV_XML_FILE_MAX_NUM == ulLoopNum) { NV_Printf("NV_DeleteFilesBySuffix, File system crashed.\r\n"); } /* Record the number of deleted files. */ if (0 != ulFileNum) { NV_Printf("NV_DeleteFilesBySuffix, the num of deleted files: %d.\r\n", ulFileNum); } return; }
VOS_UINT32 TAF_SPM_IsUsimEmergencyNum( MN_CALL_CALLED_NUM_STRU *pstDialNum, VOS_UINT32 *pulEmcCatExist, VOS_UINT8 *pucEmerCategory ) { SI_PB_ECC_DATA_STRU *pstEccData = VOS_NULL_PTR; VOS_INT8 acUsimCalledNum[MN_CALL_MAX_ASCII_NUM_LEN + 1]; VOS_INT8 acCalledNum[MN_CALL_MAX_CALLED_ASCII_NUM_LEN + 1]; MN_CALL_TYPE_ENUM_U8 enCallType; VOS_UINT32 i; enCallType = MN_CALL_TYPE_VOICE; /* 获取USIM中的紧急呼叫号码 */ pstEccData = (SI_PB_ECC_DATA_STRU *)PS_MEM_ALLOC(WUEPS_PID_TAF, sizeof(SI_PB_ECC_DATA_STRU)); if (VOS_NULL_PTR == pstEccData) { MN_WARN_LOG("TAF_SPM_IsUsimEmergencyNum: Alloc Mem Fail."); return VOS_FALSE; } /* 号码转换 BCD-> Ascii */ if (MN_ERR_NO_ERROR != TAF_STD_ConvertBcdNumberToAscii(pstDialNum->aucBcdNum, pstDialNum->ucNumLen, (VOS_CHAR *)acCalledNum)) { MN_WARN_LOG("TAF_SPM_IsUsimEmergencyNum: BCD -> Ascii ERROR."); PS_MEM_FREE(WUEPS_PID_TAF, pstEccData); return VOS_FALSE; } PS_MEM_SET(pstEccData, 0, sizeof(SI_PB_ECC_DATA_STRU)); NAS_PBAPI_GetEccNumber(pstEccData); /* 比较号码是否是EFECC文件中的紧急呼叫号码 */ for (i = 0; i< pstEccData->ulReocrdNum; i++) { PS_MEM_SET(acUsimCalledNum,0,MN_CALL_MAX_ASCII_NUM_LEN + 1); if (MN_ERR_NO_ERROR != TAF_STD_ConvertBcdNumberToAscii(pstEccData->astEccRecord[i].aucEccCode, USIM_ECC_LEN, (VOS_CHAR *)acUsimCalledNum)) { MN_INFO_LOG("TAF_SPM_IsUsimEmergencyNum: TAF_STD_ConvertBcdNumberToAscii fail"); } if (0 == VOS_StrCmp((VOS_CHAR *)acUsimCalledNum, (VOS_CHAR *)acCalledNum)) { enCallType = MN_CALL_TYPE_EMERGENCY; MN_INFO_LOG("TAF_SPM_IsUsimEmergencyNum: get card Ecc change to emergency"); break; } } /* 当前是紧急呼叫号码则判断号码类型是否有效 */ if (MN_CALL_TYPE_EMERGENCY == enCallType) { if (VOS_TRUE == pstEccData->astEccRecord[i].bESC) { *pulEmcCatExist = TAF_SPM_IsValidEmerCategory(pstEccData->astEccRecord[i].ucESC); } if (VOS_TRUE == *pulEmcCatExist) { *pucEmerCategory = (pstEccData->astEccRecord[i].ucESC & MN_CALL_EMER_CATEGORG_VAL_MAX); } PS_MEM_FREE(WUEPS_PID_TAF, pstEccData); return VOS_TRUE; } PS_MEM_FREE(WUEPS_PID_TAF, pstEccData); return VOS_FALSE; }