361 lines
7.5 KiB
C
Executable File
361 lines
7.5 KiB
C
Executable File
/**
|
|
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 <kwrap/debug.h>
|
|
#include "SF_SysStrgMng.h"
|
|
#if USE_MMC_DEV_CHECK
|
|
|
|
static 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) {
|
|
#if (USE_DCF == ENABLE)
|
|
if (DCF_GetDBInfo(DCF_INFO_TOL_FILE_COUNT))
|
|
{
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
return TRUE;
|
|
}
|
|
#else
|
|
return TRUE;
|
|
#endif
|
|
} 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 0
|
|
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
|
|
#endif
|
|
{
|
|
if (UIStorageCheck_DCIMWritable() == FALSE)
|
|
{
|
|
return TRUE;
|
|
}
|
|
else{
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
BOOL UIStorageCheck(UINT32 uiCheckItem, UINT32 *pFreeCount)
|
|
{
|
|
UINT32 useFileDB = 0;
|
|
useFileDB = UI_GetData(FL_IsUseFileDB);
|
|
BOOL ret = FALSE;
|
|
|
|
DBG_IND("UI_StorageCheck: Check item = 0x%x\r\n", uiCheckItem);
|
|
#if USE_MMC_DEV_CHECK
|
|
static int erflag = 0;
|
|
mmc_dev = SF_GetMMCDev();
|
|
if(mmc_dev == NULL)
|
|
{
|
|
if(!erflag)
|
|
{
|
|
erflag = 1;
|
|
DBG_ERR("No MMC_Dev Can use!\n");
|
|
}
|
|
return TRUE;
|
|
}
|
|
if(mmc_dev->dcf_handle < 0)
|
|
{
|
|
if(!erflag)
|
|
{
|
|
erflag = 1;
|
|
DBG_ERR("dcf_handle err!\n");
|
|
}
|
|
return TRUE;
|
|
}
|
|
erflag = 0;
|
|
#endif
|
|
switch (uiCheckItem) {
|
|
case STORAGE_CHECK_FOLDER_FULL:
|
|
if (useFileDB) {
|
|
return FALSE;
|
|
} else {
|
|
|
|
#if USE_MMC_DEV_CHECK
|
|
ret = UIStrgCheckFolderFull(mmc_dev->dcf_handle);
|
|
#else
|
|
UIStrgCheckFolderFull(0);
|
|
#endif
|
|
}
|
|
break;
|
|
case STORAGE_CHECK_FULL:
|
|
ret = UIStrgCheckFull(pFreeCount);
|
|
//DBG_WRN("UIStorageCheck: retV:%d\r\n", ret);
|
|
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
|
|
ret = UIStrgCheckErr(mmc_dev->dev_type);
|
|
//DBG_WRN("UIStorageCheck: retV:%d\r\n", ret);
|
|
#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 ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//@}
|