⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fsal.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 2 页
字号:
}

/*------ file system abstraction layer ------*/

/* The following functions are file-system dependent. */



FSAL_Status FSAL_Direct_Open(STFSAL *pstFSAL, void* szFile, FSAL_FileMode eMode)
{
   FSAL_CHECK_ARG(pstFSAL!=NULL);
   FSAL_CHECK_ARG(szFile!=NULL);
   if ( FSAL_ROMFILE == eMode ) {
      /* uRamFileSize should be set in advance. */
      FSAL_ASSERT(pstFSAL->uRamFileSize!=0);
#if FSAL_PLATFORM_WIN32
      pstFSAL->hFile = (FILE*)-1;
#elif FSAL_PLATFORM_KAL
      pstFSAL->hFile = -1;
#endif
      pstFSAL->pbFile = (kal_uint8*)szFile;
      return FSAL_OK;
   }
   pstFSAL->pbFile = 0;
#if FSAL_PLATFORM_WIN32
   {
      char* szMode;
      switch(eMode) {
      case FSAL_READ:
         szMode = "rb";
         break;
      case FSAL_WRITE:
         szMode = "wb+";
         break;
      case FSAL_APPEND:
         szMode = "ab+";
         break;
      default:
         FSAL_CHECK_ARG(KAL_FALSE);
      }
      if (0 == (pstFSAL->hFile = fopen((char*)szFile, szMode)))
         return FSAL_OPEN_ERROR;
    }
#elif FSAL_PLATFORM_KAL
   {
      kal_uint32 uFlags;
      switch (eMode & ~FSAL_NONBLOCKING) {
      case FSAL_READ:
         uFlags = FS_READ_ONLY | FS_OPEN_NO_DIR;
         break;
      case FSAL_WRITE:
         uFlags = FS_READ_WRITE | FS_CREATE_ALWAYS;
         break;
      case FSAL_APPEND:
         uFlags = FS_READ_WRITE | FS_CREATE;
         break;
      default:
         FSAL_CHECK_ARG(KAL_FALSE);
      }
      if(eMode & FSAL_NONBLOCKING)
         uFlags |= FS_NONBLOCK_MODE;
      if ((pstFSAL->hFile = DRM_open_file((kal_wchar*)szFile, uFlags, 0)) < 0) {
         pstFSAL->iFSErrorCode = pstFSAL->hFile;
         if (pstFSAL->iFSErrorCode==FS_DEVICE_BUSY || pstFSAL->iFSErrorCode==FS_LOCK_MUTEX_FAIL)
            return FSAL_DEVICE_BUSY;
         else {
            kal_prompt_trace(MOD_MED, "[FSAL] FS_Open Error:%d\n", pstFSAL->iFSErrorCode);
            return FSAL_OPEN_ERROR;
         }
      }
   }
#endif
   return FSAL_OK;
}



kal_bool FSAL_IsRamFile(STFSAL *pstFSAL) {
   if (pstFSAL->uRamFileSize != 0) {
      return KAL_TRUE;
   } else {
      return KAL_FALSE;
   }
}



kal_uint8* FSAL_GetRamFilePointer(STFSAL *pstFSAL) {
   if (pstFSAL->uRamFileSize != 0) {
      return (kal_uint8*)pstFSAL->pbFile;
   } else {
      return NULL;  
   }
}



void FSAL_Direct_SetRamFileSize(STFSAL *pstFSAL, kal_uint32 uSize)
{
   FSAL_ASSERT_NO_RET_VAL(pstFSAL!=NULL);
   pstFSAL->uRamFileSize = uSize;
}



void FSAL_Direct_SetMaxRamFileSize(STFSAL *pstFSAL, kal_uint32 uSize)
{
#if FSAL_PLATFORM_MEMORY
   FSAL_CHECK_ARG(pstFSAL!=NULL);
   pstFSAL->uMaxRamFileSize = uSize;
#endif
}



FSAL_Status FSAL_Direct_Close(STFSAL *pstFSAL)
{
   FSAL_CHECK_ARG(pstFSAL!=NULL);
   if ( pstFSAL->pbFile ) {
      pstFSAL->pbFile = 0;
      pstFSAL->uRamFileSize = 0;
      pstFSAL->uRamFileOffset = 0;
      return FSAL_OK;
   }
#if FSAL_PLATFORM_WIN32
   FSAL_CHECK_ARG(pstFSAL->hFile!=NULL);
   if (fclose((FILE*)pstFSAL->hFile)!=0)
      return FSAL_CLOSE_ERROR;
#elif FSAL_PLATFORM_KAL
   {
      FSAL_CHECK_ARG(pstFSAL->hFile>=0);
      if ((pstFSAL->iFSErrorCode = DRM_close_file(pstFSAL->hFile)) < 0) {
         if (pstFSAL->iFSErrorCode==FS_DEVICE_BUSY || pstFSAL->iFSErrorCode==FS_LOCK_MUTEX_FAIL)
            return FSAL_DEVICE_BUSY;
         else {
            kal_prompt_trace(MOD_MED, "[FSAL] FS_Close Error:%d\n", pstFSAL->iFSErrorCode);
            return FSAL_CLOSE_ERROR;
         }
      }
      pstFSAL->hFile = -1;
      pstFSAL->uFileSize = 0;
      pstFSAL->uFileOffset = 0;
   }
#endif
   return FSAL_OK;
}



FSAL_Status FSAL_Direct_Read(STFSAL *pstFSAL, kal_uint8* pbBuf, kal_uint32 uSize)
{
   FSAL_CHECK_ARG(pstFSAL!=NULL);
   FSAL_CHECK_ARG(uSize>0);
   if( pstFSAL->pbFile )
   {
      kal_mem_cpy(pbBuf, pstFSAL->pbFile + pstFSAL->uRamFileOffset, uSize);
      pstFSAL->uRamFileOffset += uSize;
      if (pstFSAL->uRamFileOffset > pstFSAL->uRamFileSize)
         return FSAL_READ_ERROR;
      return FSAL_OK;
   }
#if FSAL_PLATFORM_WIN32
   FSAL_CHECK_ARG(pstFSAL->hFile!=NULL);
   if (fread(pbBuf, uSize, 1, (FILE*)pstFSAL->hFile)!=1)
     return FSAL_READ_ERROR;
#elif FSAL_PLATFORM_KAL
   FSAL_CHECK_ARG(pstFSAL->hFile>=0);
   {
      kal_uint32 uBytesRead;
      pstFSAL->iFSErrorCode = DRM_read_file(pstFSAL->hFile, (void*)pbBuf, uSize, &uBytesRead);
      if ((pstFSAL->iFSErrorCode<0) || (uBytesRead!=uSize)) {
         if(pstFSAL->iFSErrorCode==FS_DEVICE_BUSY || pstFSAL->iFSErrorCode==FS_LOCK_MUTEX_FAIL)
            return FSAL_DEVICE_BUSY;
         else {
            kal_prompt_trace(MOD_MED, "[FSAL] FS_Read Error:%d\n", pstFSAL->iFSErrorCode);
            return FSAL_READ_ERROR;
         }
      }
   }
#endif
   return FSAL_OK;
}



FSAL_Status FSAL_Direct_Write(STFSAL *pstFSAL, kal_uint8* pbBuf, kal_uint32 uSize)
{
   FSAL_CHECK_ARG(pstFSAL!=NULL);
   FSAL_CHECK_ARG(pbBuf!=NULL);
   FSAL_CHECK_ARG(uSize>0);
#if FSAL_PLATFORM_WIN32
   FSAL_CHECK_ARG(pstFSAL->hFile!=NULL);
   if (fwrite(pbBuf, uSize, 1, (FILE*)pstFSAL->hFile)!=1)
     return FSAL_WRITE_ERROR;
#elif FSAL_PLATFORM_KAL
   FSAL_CHECK_ARG(pstFSAL->hFile>=0);
   {
      kal_uint32 uBytesWritten;
      pstFSAL->iFSErrorCode = FS_Write(pstFSAL->hFile, (void*)pbBuf, uSize, &uBytesWritten);
      if ((pstFSAL->iFSErrorCode<0) || (uBytesWritten!=uSize)) {
         if(pstFSAL->iFSErrorCode==FS_DEVICE_BUSY || pstFSAL->iFSErrorCode==FS_LOCK_MUTEX_FAIL)
            return FSAL_DEVICE_BUSY;
         else {
            kal_prompt_trace(MOD_MED, "[FSAL] FS_Write Error:%d\n", pstFSAL->iFSErrorCode);
            return FSAL_WRITE_ERROR;
         }
      }
   }
#elif FSAL_PLATFORM_MEMORY
   FSAL_CHECK_ARG(pstFSAL->pbFile!=NULL);
   {
      kal_mem_cpy(pstFSAL->pbFile + pstFSAL->uRamFileOffset, pbBuf, uSize);
      pstFSAL->uRamFileOffset += uSize;
      if (pstFSAL->uRamFileOffset > pstFSAL->uRamFileSize) {
         pstFSAL->uRamFileSize = pstFSAL->uRamFileOffset;
      }
      FSAL_CHECK_ARG(pstFSAL->uRamFileOffset <= pstFSAL->uMaxRamFileSize);
   }
#endif
   return FSAL_OK;
}



FSAL_Status FSAL_Direct_Seek(STFSAL *pstFSAL, kal_uint32 uOffset)
{
   FSAL_CHECK_ARG(pstFSAL!=NULL);
   if( pstFSAL->pbFile )
   {
      pstFSAL->uRamFileOffset = uOffset;
      if (pstFSAL->uRamFileOffset > pstFSAL->uRamFileSize)
         return FSAL_SEEK_ERROR;
      return FSAL_OK;
   }
#if FSAL_PLATFORM_WIN32
   FSAL_CHECK_ARG(pstFSAL->hFile!=NULL);
   {
      kal_uint32 uCurOffset;
      FSAL_Status eFSALRet;
      static kal_uint32 uHit=0;
      static kal_uint32 uMiss=0;
      printf("uHit=%d, uMiss=%d\n", uHit, uMiss);
      if ((eFSALRet=FSAL_Direct_GetCurPos(pstFSAL, &uCurOffset))!=FSAL_OK)
         return eFSALRet;
      if (uCurOffset == uOffset) {
         uHit++;
         return FSAL_OK;
      } else {
         uMiss++;
         if (fseek((FILE*)pstFSAL->hFile, uOffset, SEEK_SET)!=0)
           return FSAL_SEEK_ERROR;
      }
   }
#elif FSAL_PLATFORM_KAL
   {
      FSAL_CHECK_ARG(pstFSAL->hFile>=0);
      {
         kal_uint32 uCurOffset;
         FSAL_Status eFSALRet;
         if ((eFSALRet=FSAL_Direct_GetCurPos(pstFSAL, &uCurOffset))!=FSAL_OK)
            return eFSALRet;
         /* Because FS_Seek has performance issue, avoid to call FS_Seek
            whenever possible. */
         if (uCurOffset == uOffset)
            return FSAL_OK;
         else
         {
            pstFSAL->iFSErrorCode = DRM_seek_file(pstFSAL->hFile, uOffset, FS_FILE_BEGIN);
            if ((pstFSAL->iFSErrorCode<0) || (pstFSAL->iFSErrorCode!=(kal_int32)uOffset)) {
               if (pstFSAL->iFSErrorCode==FS_DEVICE_BUSY || pstFSAL->iFSErrorCode==FS_LOCK_MUTEX_FAIL)
                  return FSAL_DEVICE_BUSY;
               else {
                  kal_prompt_trace(MOD_MED, "[FSAL] FS_Seek Error:%d\n", pstFSAL->iFSErrorCode);
                  return FSAL_SEEK_ERROR;
               }
            }
         }
      }
   }
#endif
   return FSAL_OK;
}



FSAL_Status FSAL_Direct_GetCurPos(STFSAL *pstFSAL, kal_uint32* puPosition)
{
   FSAL_CHECK_ARG(pstFSAL!=NULL);
   FSAL_CHECK_ARG(puPosition!=NULL);
   if ( pstFSAL->pbFile ) {
      *puPosition = pstFSAL->uRamFileOffset;
      return FSAL_OK;
   }
#if FSAL_PLATFORM_WIN32
   FSAL_CHECK_ARG(pstFSAL->hFile!=NULL);
   *puPosition = ftell((FILE*)pstFSAL->hFile);
#elif FSAL_PLATFORM_KAL
   {
      FSAL_CHECK_ARG(pstFSAL->hFile>=0);
      pstFSAL->iFSErrorCode = FS_GetFilePosition(pstFSAL->hFile, puPosition);
      if (pstFSAL->iFSErrorCode < 0) {
         if (pstFSAL->iFSErrorCode==FS_DEVICE_BUSY || pstFSAL->iFSErrorCode==FS_LOCK_MUTEX_FAIL)
            return FSAL_DEVICE_BUSY;
         else {
            kal_prompt_trace(MOD_MED, "[FSAL] FS_GetFilePosition Error:%d\n", pstFSAL->iFSErrorCode);
            return FSAL_FATAL_ERROR;
         }
      }
   }
#endif
   return FSAL_OK;
}



FSAL_Status FSAL_Direct_GetFileSize(STFSAL *pstFSAL, kal_uint32 *puFileSize)
{
   FSAL_CHECK_ARG(pstFSAL!=NULL);
   FSAL_CHECK_ARG(puFileSize!=NULL);
   if ( pstFSAL->pbFile ) {
      *puFileSize = pstFSAL->uRamFileSize;
      return FSAL_OK;
   }
#if FSAL_PLATFORM_WIN32
   FSAL_CHECK_ARG(pstFSAL->hFile!=NULL);
   {
      kal_uint32 uCurPos;
      uCurPos = ftell((FILE*)pstFSAL->hFile);
      if (fseek((FILE*)pstFSAL->hFile, 0, SEEK_END)!=0)
        return FSAL_SEEK_ERROR;
      *puFileSize = ftell((FILE*)pstFSAL->hFile);
      if (fseek((FILE*)pstFSAL->hFile, uCurPos, SEEK_SET)!=0)
        return FSAL_SEEK_ERROR;
   }
#elif FSAL_PLATFORM_KAL
   {
      FSAL_CHECK_ARG(pstFSAL->hFile>=0);
      pstFSAL->iFSErrorCode = DRM_file_size(pstFSAL->hFile, puFileSize);
      if (pstFSAL->iFSErrorCode<0) {
         if (pstFSAL->iFSErrorCode==FS_DEVICE_BUSY || pstFSAL->iFSErrorCode==FS_LOCK_MUTEX_FAIL)
            return FSAL_DEVICE_BUSY;
         else {
         	kal_prompt_trace(MOD_MED, "[FSAL] FS_GetFileSize Error:%d\n", pstFSAL->iFSErrorCode);
            return FSAL_FATAL_ERROR;
         }
      }
   }
#endif
   return FSAL_OK;
}



/* Return the last file system error for error handling */
int FSAL_GetLastError(STFSAL *pstFSAL)
{
   FSAL_CHECK_ARG(pstFSAL != NULL);

#if FSAL_PLATFORM_WIN32
   return FSAL_FATAL_ERROR;
#elif FSAL_PLATFORM_KAL
   return pstFSAL->iFSErrorCode;
#elif FSAL_PLATFORM_MEMORY
   return FSAL_FATAL_ERROR;
#endif
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -