/** Copyright Novatek Microelectronics Corp. 2009. All rights reserved. @file UIStorageCheck.c @ingroup Unknown @brief @note Nothing. @version @author @date */ /** \addtogroup Unknown*/ //@{ //////////////////////////////////////////////////////////////////////////////// #include "SysCommon.h" //#include "AppCommon.h" //////////////////////////////////////////////////////////////////////////////// #include "UIAppPhoto.h" #include "UIStorageCheck.h" //#include "FlowPanCap.h" #include "FileSysTsk.h" #include "PlaybackTsk.h" #include "DCF.h" #define THIS_DBGLVL 2 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER /////////////////////////////////////////////////////////////////////////////// #define __MODULE__ UIStorageCheck #define __DBGLVL__ 2 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER #define __DBGFLT__ "*" //*=All, [mark]=CustomClass #include #include "SF_SysStrgMng.h" #if USE_MMC_DEV_CHECK SF_ST_MMC_DEV *mmc_dev = NULL; #endif void UIStorageCheck_AllSize(UINT64 *uiTotal, UINT64 *uiRemain) { (*uiTotal) = FileSys_GetDiskInfo(FST_INFO_DISK_SIZE); (*uiRemain) = FileSys_GetDiskInfo(FST_INFO_FREE_SPACE); (*uiTotal) /= (1024 * 1024); (*uiRemain) /= (1024 * 1024); } static BOOL bIsFileReachMax = FALSE; void UIStorageCheck_ResetFileReachMax(void) { bIsFileReachMax = FALSE; } //#NT#2009/12/30#Ben Wang -begin //#NT#Add check for folder attribute static BOOL check_CurrDir_writable(void) { #if USE_MMC_DEV_CHECK if(mmc_dev == NULL) { DBG_ERR("No MMC_Dev Can use!\n"); return FALSE; } if(mmc_dev->dcf_handle < 0) { DBG_ERR("dcf_handle err!\n"); return FALSE; } #endif UINT32 useFileDB = 0; useFileDB = UI_GetData(FL_IsUseFileDB); if (useFileDB) { return TRUE; } else { #if (USE_DCF == ENABLE) UINT32 CurrDirID; SDCFDIRINFO dirinfo = {0}; #if USE_MMC_DEV_CHECK CurrDirID = DCF_GetDBInfoEx(mmc_dev->dcf_handle, DCF_INFO_CUR_DIR_ID); if (CurrDirID) { if (DCF_GetDirInfoEx(mmc_dev->dcf_handle, CurrDirID, &dirinfo)) { #else CurrDirID = DCF_GetDBInfo(DCF_INFO_CUR_DIR_ID); if (CurrDirID) { if (DCF_GetDirInfo(CurrDirID, &dirinfo)) { #endif if (M_IsReadOnly(dirinfo.ucAttrib)) { DBG_IND("DCF folder %d is READONLY.\r\n", CurrDirID); return FALSE; } else { DBG_IND("DCF folder %d is existing and writable.\r\n", CurrDirID); return TRUE; } } else { return FALSE; } } else { return FALSE; } #else return TRUE; #endif } } BOOL UIStorageCheck_DCIMWritable(void) { #if USE_MMC_DEV_CHECK if(mmc_dev == NULL) { DBG_ERR("No MMC_Dev Can use!\n"); return FALSE; } if(mmc_dev->dcf_handle < 0) { DBG_ERR("dcf_handle err!\n"); return FALSE; } #endif UINT32 useFileDB = 0; useFileDB = UI_GetData(FL_IsUseFileDB); if (useFileDB) { return TRUE; } else { INT32 uiStatus = 0; UINT8 ucAttrib = 0; BOOL ret = FALSE; #if USE_MMC_DEV_CHECK if(mmc_dev->dev_type == MMC_DEV_SD) { uiStatus = FileSys_GetAttrib("A:\\DCIM", &ucAttrib); } else { uiStatus = FileSys_GetAttrib("B:\\DCIM", &ucAttrib); } #else uiStatus = FileSys_GetAttrib("A:\\DCIM", &ucAttrib); #endif if (uiStatus == FST_STA_OK) { if (ucAttrib & FS_ATTRIB_DIRECTORY) { if (System_GetState(SYS_STATE_CARD) == CARD_REMOVED) { DBG_IND("SD Card is removed, DCIM is located on NAND.\r\n"); } if (ucAttrib & FS_ATTRIB_READ) { DBG_ERR("A:\\DCIM Directory is READONLY.\r\n"); } else { DBG_IND("A:\\DCIM Directory is existing and writable.\r\n"); ret = TRUE; } } else { DBG_ERR("A:\\DCIM is not existing.\r\n"); } } { ret = TRUE; DBG_IND("check_DCIM_writable: uiStatus=%d\r\n", uiStatus); } return ret; } } static BOOL UIStrgCheckFolderFull(DCF_HANDLE DcfHandle) { #if (USE_DCF == ENABLE) BOOL bIsFileReachMax = FALSE; UINT32 DCF_DirId = 0, DCF_FileId = 0; BOOL ret; if (System_GetState(SYS_STATE_FS) == FS_NUM_FULL) { DBG_ERR("UI_Validate_Storage: DIR:999 is existing!\r\n"); return TRUE; } bIsFileReachMax = FALSE; #if USE_MMC_DEV_CHECK ret = DCF_GetNextIDEx(DcfHandle, &DCF_DirId, &DCF_FileId); #else ret = DCF_GetNextID(&DCF_DirId, &DCF_FileId); #endif if (ret && DCF_DirId == 0 && DCF_FileId == 0) { bIsFileReachMax = TRUE; DBG_IND("Next dir_id =%d, file_id = %d \r\n", DCF_DirId, DCF_FileId); } else if (ret && DCF_GetDBInfoEx(DcfHandle, DCF_INFO_IS_9999) == TRUE) { bIsFileReachMax = TRUE; } return bIsFileReachMax; #else return FALSE; #endif } static BOOL UIStrgCheckFull(UINT32 *pFreeCount) { #if (PHOTO_MODE==ENABLE) UINT32 uiCountTmp = 0; #endif #if (PHOTO_MODE==ENABLE) uiCountTmp = PhotoExe_GetFreePicNum(); DBG_IND("uiCountTmp = %d, pFreeCount=%d\r\n",uiCountTmp,pFreeCount); if (pFreeCount) { *pFreeCount = uiCountTmp; } if (uiCountTmp == 0) { return TRUE; } else { return FALSE; } #else return FALSE; #endif } static BOOL UIStrgCheckErr(MMC_DEV_TYPE dev_id) { if(dev_id == MMC_DEV_SD) { FileSys_WaitFinishEx('A'); } else if(dev_id == MMC_DEV_EMMC) { FileSys_WaitFinishEx('B'); } if (System_GetState(SYS_STATE_FS) == FS_DISK_ERROR || System_GetState(SYS_STATE_FS) == FS_UNKNOWN_FORMAT || System_GetState(SYS_STATE_FS) == FS_UNFORMATTED //#NT#2016/12/06#Niven Cho -begin //#NT#MULTI_DRIVE || System_GetState(SYS_STATE_CARD) == CARD_REMOVED) //#NT#2016/12/06#Niven Cho -end //|| UIStorageCheck_Error() ) { DBG_ERR("UIStorageCheck: %d Card Error\r\n", System_GetState(SYS_STATE_FS)); return TRUE; } else { return FALSE; } } BOOL UIStorageCheck(UINT32 uiCheckItem, UINT32 *pFreeCount) { UINT32 useFileDB = 0; useFileDB = UI_GetData(FL_IsUseFileDB); DBG_IND("UI_StorageCheck: Check item = 0x%x\r\n", uiCheckItem); #if USE_MMC_DEV_CHECK mmc_dev = SF_GetMMCDev(); if(mmc_dev == NULL) { DBG_ERR("No MMC_Dev Can use!\n"); return FALSE; } if(mmc_dev->dcf_handle < 0) { DBG_ERR("dcf_handle err!\n"); return FALSE; } #endif switch (uiCheckItem) { case STORAGE_CHECK_FOLDER_FULL: if (useFileDB) { return FALSE; } else { #if USE_MMC_DEV_CHECK UIStrgCheckFolderFull(mmc_dev->dcf_handle); #else UIStrgCheckFolderFull(0); #endif } break; case STORAGE_CHECK_FULL: UIStrgCheckFull(pFreeCount); break; case STORAGE_CHECK_LOCKED: if (System_GetState(SYS_STATE_CARD) == CARD_LOCKED) { DBG_ERR("UIStorageCheck: %d Card locked\r\n", System_GetState(SYS_STATE_CARD)); return TRUE; } else { return FALSE; } break; case STORAGE_CHECK_ERROR: #if USE_MMC_DEV_CHECK UIStrgCheckErr(mmc_dev->dev_type); #else UIStrgCheckErr(0); #endif break; case STORAGE_CHECK_DCIM_READONLY: if ((UIStorageCheck_DCIMWritable() == FALSE) || (check_CurrDir_writable() == FALSE)) { return TRUE; } else { return FALSE; } break; default: DBG_ERR("UI_StorageCheck: Unknown item = 0x%x\r\n", uiCheckItem); return FALSE; } return FALSE; } //@}