FileSystem.c
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:76k
源码类别:

DVD

开发平台:

Others

  1. /****************************************************************************************
  2.  *  Copyright (c) 2002 ZORAN Corporation, All Rights Reserved
  3.  *  THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ZORAN CORPORATION
  4.  *
  5.  *  File: $Workfile: FileSystem.c $             
  6.  *
  7.  * Description:
  8.  * ============
  9.  * 
  10.  * 
  11.  * Log:
  12.  * ====
  13.  * $Revision: 31 $
  14.  * Last Modified by $Author: Jerryc $ at $Modtime: 04-03-19 15:28 $ 
  15.  ****************************************************************************************
  16.  * Updates:
  17.  ****************************************************************************************
  18.  * $Log: /I76/I76_Common/I76_Reference/Playcore/FileSys/FileSystem.c $
  19.  * 
  20.  * 31    04-03-19 15:28 Jerryc
  21.  * 
  22.  * 30    04-03-19 15:27 Jerryc
  23.  * 
  24.  * 29    04-03-19 14:40 Jerryc
  25.  * 
  26.  * 28    04-03-19 11:03 Jerryc
  27.  * replace SUPPORT_FLASH_CARD with ENABLE_FILEX.
  28.  * 
  29.  * 27    04-03-16 11:11 Jerryc
  30.  * filex structure is allocated from heap.
  31.  * 
  32.  * 26    12/10/03 9:45a Leslie
  33.  * change searching filesystem process.
  34.  * signature: MikeX_1205_2003_B
  35.  * 
  36.  * 25    11/26/03 3:38p Leslie
  37.  * Free search infomation pool on FileSys_close() function.
  38.  * signature: MikeX_1125_2003
  39.  * 
  40.  * 24    11/19/03 10:44a Leslie
  41.  * If current session haven't filesystem, then skip current session and
  42.  * search next session.
  43.  * signature:MikeX_1114_2003
  44.  * 
  45.  * 23    11/07/03 5:57a Leslie
  46.  * changed the search BEA01 identifier mode
  47.  * MikeX_1105_2003
  48.  * 
  49.  * 22    03-08-28 23:56 Leslie
  50.  * Code cleanup
  51.  * 
  52.  * 21    03-07-15 18:58 Jerryc
  53.  * for CDROM don't use UDF_bridge, always use ISO9660.
  54.  * 
  55.  * 20    03-06-03 18:22 Leonh
  56.  * support long folder name
  57.  * 
  58.  * 19    03-06-03 11:41 Jerryc
  59.  * allocate filex in gns.
  60.  * 
  61.  * 18    03-06-02 14:57 Jerryc
  62.  * don't do _fx_media_close.
  63.  * 
  64.  * 17    03-06-02 14:52 Jerryc
  65.  * dynamic allocate memory for fileX.
  66.  * 
  67.  * 16    5/30/03 4:57p Alexeib
  68.  * 
  69.  * 14    03-05-30 11:43 Jerryc
  70.  * fix compile warning.
  71.  * 
  72.  * 13    03-05-29 18:11 Jerryc
  73.  * support flash card
  74.  * 
  75.  * 12    03-03-12 19:48 Jerryc
  76.  * replace wcscat with wcsncat as wcscat not function properly.
  77.  * 
  78.  * 11    2/07/03 10:40p Tomasp
  79.  * - changed SW feature selection to compilation switch
  80.  * 
  81.  * 10    03-02-02 19:19 Leslie
  82.  * Fix the multi-session problem.
  83.  * 
  84.  * 9     03-01-30 23:13 Leslie
  85.  * Add new functions FileSys_SetCurrentDirICB and FileSys_GetCurrentDirICB
  86.  * 
  87.  * 8     03-01-10 12:19 Leslie
  88.  * Add builtin unicode support
  89.  * 
  90.  * 12    9/05/02 16:16 Nirm
  91.  * - Expanded FileSys_getDVDFileInfo() functionality, to increase
  92.  * efficiency.
  93.  * 
  94.  * 11    23/04/02 9:30 Nirm
  95.  * - Added dependency in "Config.h".
  96.  * 
  97.  * 10    13/03/02 21:27 Nirm
  98.  * - Fixed an overflow of Current Path name, if the directory names are
  99.  * too long to fit into the allocated Current-Path string length.
  100.  * 
  101.  * 9     3/03/02 20:14 Nirm
  102.  * - Added Multisession support.
  103.  * 
  104.  * 8     7/02/02 10:42 Nirm
  105.  * Added FileSys_getPathDelimiter().
  106.  * 
  107.  * 7     30/01/02 18:15 Nirm
  108.  * - Integrated UDF;
  109.  * - Changed Search-ID to 16-bit.
  110.  * 
  111.  * 6     27/01/02 17:48 Nirm
  112.  * - Added automatic selection of the File-System type;
  113.  * - Search-handles are 16-bit long instead of 32 bit;
  114.  * - Added support for a Search-Info Pool.
  115.  * 
  116.  * 5     21/01/02 22:06 Nirm
  117.  * Fixed wrong path-management.
  118.  * 
  119.  * 4     16/01/02 11:44 Atai
  120.  * Change debug printing
  121.  * 
  122.  * 3     13/01/02 15:59 Nirm
  123.  * Disabled UDF support until UDF is integrated.
  124.  * 
  125.  * 2     9/01/02 14:58 Nirm
  126.  * Corrected Include-Paths.
  127.  * 
  128.  * 1     12/27/01 14:19 Idan
  129.  ****************************************************************************************/
  130. /////////////////////////////////////////////////////////////////////////////
  131. // FileSystem.c - Implementation of an Abstract interface to File Systems
  132. //
  133. // Author: Nir Milstein
  134. #include "Config.h" // Global Configuration - do not remove!
  135. #ifdef _DEBUG
  136. #undef IFTRACE
  137. #define IFTRACE if (gTraceFileSys)
  138. #include "DebugDbgMain.h"
  139. #endif
  140. #include "PlaycoreFileSysFileSystem.h"
  141. #include "PlaycoreFileSysFileSystem_Impl.h"
  142. #include "includestring_ex.h"
  143. #include "Drivedrv_api.h"
  144. #include "PlaycoreDataStructuresArray.h"
  145. #include "PlaycoreAuxCacheAuxCache.h"
  146. #include "PlaycoreFileSysISO9660ISO9660_API.h"
  147. #include "PlaycoreFileSysUDFUDF_API.h"
  148. #include "PlaycoreCoremaincoregdef.h"
  149. #include "Playcorenav_cddaPE_CD.h"
  150. #include "PlaycoreScPadScPadAlloc.h"
  151. #ifdef DVD_VR_SUPPORT
  152. #include "KernelEventDef.h"
  153. #include "PlaycoreNav_VrVr_nm.h"
  154. #endif
  155. #ifdef ENABLE_FILEX
  156. #include "DriveFE_Manager.h"
  157. #include "PlaycoreFileSysFileXHeaderFx_dir.h"
  158. #include "PlaycoreFileSysFileXHeaderFx_fil.h"
  159. #include "PlaycoreFileSysFileXHeaderFx_med.h"
  160. #include "PlaycoreFileSysFileXHeaderFx_sys.h"
  161. #include "PlaycoreFileSysFileXHeaderFx_uti.h"
  162. #include "drivecardreadercardreaderDriver.h"
  163. #include "mediacardsincluderegister.h"
  164. #include "playcoreexceptionexception.h"
  165. CARD_DETECT_TYPE card_type;
  166. #ifndef V882_FLASH_CARD
  167. CARD_DETECT_TYPE FileSys_GetCardType(void);
  168. #endif
  169. #endif
  170. /////////////////////////////////////////////////////////////////////////////
  171. // Constants
  172. //#define MAX_PATH 128 // To support long folder name
  173. //<<<MikeX_1114_2003
  174. #define SKIP_INVALID_SESSION_HAVE_NOT_FILESYSTEM 1
  175. /////////////////////////////////////////////////////////////////////////////
  176. // Macros
  177. #define SEARCHINFO_POOL_REG_SZ(iSearchCnt) ((iSearchCnt + 7) / 8)
  178. /////////////////////////////////////////////////////////////////////////////
  179. // Globals and Singletons
  180. //#ifdef HW_POWER_ON_RESUME
  181. WORD NewChecksum= 0;
  182. //#endif
  183. LPCWSTR g_pszWildcardSearch= FILESYS_WILDCARD_SEARCH;
  184. static struct FileSystemInfo_TAG {
  185. // File-System Location related
  186. DWORD dwFileSysStartLBN;
  187. // File-System Type related
  188. enFileSysType eCurrFileSysType;
  189. UINT16 uRevision;
  190. // Path and Path-parsing related
  191. WCHAR cPathDelimiter;
  192. // WCHAR szCurrPath[MAX_PATH];
  193. //WCHAR * pszCurrPath;
  194. // Search-Info Pool related
  195. UINT32 hSearchInfoPool;
  196. BYTE   aSearchInfoPoolRegistry[SEARCHINFO_POOL_REG_SZ(FILESYSTEM_MAX_CONCURRENT_SEARCHES)];
  197. } g_FSInfo;
  198. #ifdef ENABLE_FILEX
  199. #define FILEX_FILENAME_LENGTH FX_MAX_LONG_NAME_LEN
  200. #ifdef INTERNAL_MEM_CARD_READER
  201. #include "Mediacardsincludefs.h"
  202. #include "Mediacardsincluderegister.h"
  203. #include _FCU_LL_DIR_
  204. #define NUM_OF_CARD_TYPES 6
  205. typedef VOID (*MEDIA_DRIVER)(FX_MEDIA *);
  206. //The sequence in the array is defined by enum CARD_DETECT_TYPE.
  207. CONST MEDIA_DRIVER card_media_driver[NUM_OF_CARD_TYPES] = {
  208. NULL,
  209. FsSdDriver,
  210. FsMsDriver,
  211. FsCfDriver,
  212. FsSsfdcDriver,
  213. FsMsProDriver
  214. };
  215. #endif
  216. static FILEX * gpFileX = NULL;
  217. static void FileX_destruct(void);
  218. static BOOL CDROM_FileOpen(STRUCT_FILE * file_ptr, DWORD dwStartAddr, UINT32 cbFileSizeHigh, UINT32 cbFileSizeLow); 
  219. static BOOL  CDROM_FileSeek(STRUCT_FILE *file_ptr, UINT32 byte_offset);
  220. static UINT16 CDROM_FileRead(FX_FILE *file_ptr, BYTE *buffer_ptr, UINT16 request_size, UINT32 *actual_size);
  221. static BOOL CDROM_FileClose(STRUCT_FILE *file_ptr);
  222. #endif
  223. /////////////////////////////////////////////////////////////////////////////
  224. // Public Methods
  225. /////////////////////////////////////////////////////////////////////////////
  226. /////////////////////////////////////////////////////////////////////////////
  227. // File-System Identification
  228. /////////////////////////////////////////////////////////////////////////////
  229. // FileSys_determineType()
  230. //
  231. // Description: Determines the type of File-System resident on the Medium.
  232. //
  233. // Input: None
  234. // Output: None
  235. // In/Out: None
  236. // Return: An enum of type enFileSysType, indicating the type of File-System
  237. // detected on the Medium.
  238. //
  239. // Remarks:
  240. // The supported types of File-System are:
  241. // - ISO-9660 (aka ECMA-119)
  242. // - UDF-1.02
  243. // - UDF-2.00
  244. // - UDF-Bridge (a hybrid ISO-9660 and one of UDF-1.02 or UDF-2.00)
  245. //
  246. // If none of the above is found, an Unknown type is reported.
  247. enFileSysType FileSys_determineType(void)
  248. {
  249. BOOL bSuccess=TRUE;
  250. // int iTotalTracksCnt;//Leslie_0823_2003_A: Comment out
  251. DWORD dwPossibleSessionLBN =0;
  252. DWORD dwLastSessionAddress = 0;
  253. enFileSysType eRetValue= eUnknown;
  254. g_FSInfo.dwFileSysStartLBN= 0;
  255. //<<<MikeX_1205_2003_B
  256. //get first track address of the last session
  257. if (!IS_DVD_MEDIA) {
  258. bSuccess = drv_get_last_session_address(&dwLastSessionAddress);
  259. if(bSuccess)
  260. bSuccess=drv_get_first_possible_session(&dwPossibleSessionLBN);
  261. while(bSuccess){
  262. if( dwPossibleSessionLBN >= dwLastSessionAddress )
  263. break;
  264. bSuccess=drv_get_next_possible_session(&dwPossibleSessionLBN);
  265. }
  266. }
  267. else
  268. bSuccess=drv_get_first_possible_session(&dwPossibleSessionLBN);
  269. //search from first track address to the last track in last session
  270. while (bSuccess) {
  271. bSuccess= FALSE;
  272. // Check if ISO-9660 is resident
  273. if (ISO9660_isResident(dwPossibleSessionLBN)) {
  274. g_FSInfo.uRevision= 0x0100;
  275. eRetValue= eISO9660;
  276. #ifdef FILESYSTEM_SUPPORT_UDF
  277. // Check if UDF is also resident (creating a UDF-Bridge)
  278. //if (UDF_isResident((dwPossibleSessionLBN+2), &g_FSInfo.uRevision))
  279. if (UDF_isResident((dwPossibleSessionLBN), &g_FSInfo.uRevision))//MikeX_1105_2003
  280. eRetValue= eUDF_Bridge;
  281. #endif //FILESYSTEM_SUPPORT_UDF
  282. //jerry cai, eUDF_Bridge doesn't work for CDROM, so use eISO9660.
  283. if(eUDF_Bridge == eRetValue && IS_CD_MEDIA)
  284. eRetValue = eISO9660;
  285. bSuccess= TRUE;
  286. }
  287. else
  288. #ifdef FILESYSTEM_SUPPORT_UDF
  289. // Check if UDF is resident
  290. if (UDF_isResident(dwPossibleSessionLBN, &g_FSInfo.uRevision)) {
  291. if ((0x0102 <= g_FSInfo.uRevision) && (g_FSInfo.uRevision < 0x0200))
  292. eRetValue= eUDF_102;
  293. else if (0x0200 <= g_FSInfo.uRevision)
  294. eRetValue= eUDF_200;
  295. bSuccess= TRUE;
  296. }
  297. #endif //FILESYSTEM_SUPPORT_UDF
  298. //<<<MikeX_1114_2003
  299. #ifdef SKIP_INVALID_SESSION_HAVE_NOT_FILESYSTEM
  300. //if current session haven't filesystem, then skip current session and find next session
  301. if( bSuccess )
  302. {
  303. g_FSInfo.dwFileSysStartLBN= dwPossibleSessionLBN;
  304. break;
  305. }
  306. #else
  307. // If no File-System instance was found, abort
  308. if (bSuccess)
  309. break;
  310. // Some File-System instance was found: record its address, and continue to the
  311. // next Session.
  312. g_FSInfo.dwFileSysStartLBN= dwPossibleSessionLBN;
  313. #endif
  314. //MikeX_1114_2003>>>
  315. bSuccess=drv_get_next_possible_session(&dwPossibleSessionLBN);
  316. }
  317. if( eRetValue != eUnknown )
  318. return eRetValue;
  319. //search filesystem from first track of the first session to the first track of the last session.
  320. while (bSuccess) {
  321. bSuccess= FALSE;
  322. // Check if ISO-9660 is resident
  323. if (ISO9660_isResident(dwPossibleSessionLBN)) {
  324. g_FSInfo.uRevision= 0x0100;
  325. eRetValue= eISO9660;
  326. #ifdef FILESYSTEM_SUPPORT_UDF
  327. // Check if UDF is also resident (creating a UDF-Bridge)
  328. //if (UDF_isResident((dwPossibleSessionLBN+2), &g_FSInfo.uRevision))
  329. if (UDF_isResident((dwPossibleSessionLBN), &g_FSInfo.uRevision))//MikeX_1105_2003
  330. eRetValue= eUDF_Bridge;
  331. #endif //FILESYSTEM_SUPPORT_UDF
  332. //jerry cai, eUDF_Bridge doesn't work for CDROM, so use eISO9660.
  333. if(eUDF_Bridge == eRetValue && IS_CD_MEDIA)
  334. eRetValue = eISO9660;
  335. bSuccess= TRUE;
  336. }
  337. else
  338. #ifdef FILESYSTEM_SUPPORT_UDF
  339. // Check if UDF is resident
  340. if (UDF_isResident(dwPossibleSessionLBN, &g_FSInfo.uRevision)) {
  341. if ((0x0102 <= g_FSInfo.uRevision) && (g_FSInfo.uRevision < 0x0200))
  342. eRetValue= eUDF_102;
  343. else if (0x0200 <= g_FSInfo.uRevision)
  344. eRetValue= eUDF_200;
  345. bSuccess= TRUE;
  346. }
  347. #endif //FILESYSTEM_SUPPORT_UDF
  348. //<<<MikeX_1114_2003
  349. #ifdef SKIP_INVALID_SESSION_HAVE_NOT_FILESYSTEM
  350. //if current session haven't filesystem, then skip current session and find next session
  351. if( bSuccess )
  352. {
  353. g_FSInfo.dwFileSysStartLBN= dwPossibleSessionLBN;
  354. break;
  355. }
  356. #else
  357. // If no File-System instance was found, abort
  358. if (bSuccess)
  359. break;
  360. // Some File-System instance was found: record its address, and continue to the
  361. // next Session.
  362. g_FSInfo.dwFileSysStartLBN= dwPossibleSessionLBN;
  363. #endif
  364. //MikeX_1114_2003>>>
  365. bSuccess= drv_get_next_possible_session(&dwPossibleSessionLBN);
  366. if(dwLastSessionAddress == dwPossibleSessionLBN)
  367. bSuccess = 0;
  368. }
  369. //MikeX_1205_2003_B>>>
  370. return eRetValue;
  371. }
  372. /////////////////////////////////////////////////////////////////////////////
  373. // FileSys_selectType()
  374. //
  375. // Description: Selects the type of File-System to use.
  376. //
  377. // Input: eNewType - An enum of type enFileSysType, which specifies the
  378. //    type of File-System to use.
  379. // Output: None
  380. // In/Out: None
  381. // Return: TRUE if the File-System was selected successfully; FALSE otherwise.
  382. //
  383. // Remarks:
  384. // 1. This method must be called prior to initializing the File-System.
  385. // 2. The return value of FileSys_determineType() may be supplied to this
  386. //    method without change.
  387. // 3. A FALSE return value means that the requested type of File-System is
  388. //    incompatible with the type resident on the Medium. For example, an
  389. //    attempt of selecting UDF-2.00 while the Medium holds UDF-1.02 will result
  390. //    in failure, since these two versions of UDF are not compatible.
  391. // 4. The default behaviour when selecting UDF-Bridge is to use the instance
  392. //    of UDF resident on the Medium. To force use of ISO-9660, supply a
  393. //    value of eISO9660, rather than eUDF_Bridge.
  394. BOOL FileSys_selectType(enFileSysType eNewType)
  395. {
  396. int i;
  397. static BOOL bIsFirstTime= TRUE;
  398. BOOL bIsChoiceValid= TRUE;
  399. enFileSysType eExistingFileSys;
  400. UINT16 res;
  401. dbg_printf(("FileSys_selectType(%d) calling.n", eNewType));
  402. if (bIsFirstTime) {
  403. g_FSInfo.eCurrFileSysType= eUnknown;
  404. g_FSInfo.hSearchInfoPool= NULL;
  405. bIsFirstTime= FALSE;
  406. }
  407. #ifdef _DEBUG
  408. // Sanity check
  409. if (eUnknown == eNewType) {
  410. dbg_printf(("WARNING: FileSys_selectType() Failed [1]: Unknown Type.n"));
  411. return FALSE;
  412. }
  413. #endif //_DEBUG
  414. #ifdef ENABLE_FILEX
  415. if (eFileX == g_FSInfo.eCurrFileSysType && (eFileX == eNewType || eAny == eNewType))
  416. {
  417.    return TRUE;
  418.   }
  419. #endif
  420. #ifdef ENABLE_FILEX
  421. if(IS_PLAYING_CARD)
  422.   {
  423. #ifdef I86_HW_FCU
  424. gpFileX = malloc(sizeof(FILEX));
  425.       if(NULL == gpFileX)
  426.        printf("Fatal: Low system resources on allocating gpFileX.n");
  427. #else
  428. gpFileX = (FILEX *)(FCU_FILEX_CACHE_START_ADDR);
  429. #endif
  430.   
  431.     fx_system_initialize();
  432. #ifdef EXTERNAL_CARD_READER
  433.     if(FX_SUCCESS == fx_media_open(&(gpFileX->FileX_media),
  434.                                    NULL,//*media_name
  435.                                    _fx_ram_driver, //*media_driver
  436.                                    NULL, //VOID *driver_info_ptr,
  437.                                    &(gpFileX->ucFileXCacheBuff[0]),//VOID *memory_ptr,
  438. #ifdef I86_HW_FCU
  439.                                    FCU_FILEX_CACHE_SIZE,//ULONG memory_size,
  440. #else
  441.                                    FILEX_CACHE_SIZE,//ULONG memory_size,
  442. #endif
  443.                                    0)) //UINT partition)
  444. #else //internal card reader
  445. {
  446.       int i;
  447. #ifdef V882_FLASH_CARD
  448. card_type = FcuSelectACardToPlay();
  449. #else
  450. card_type = FileSys_GetCardType();
  451. #endif
  452. #ifndef I86_HW_FCU
  453. #ifdef SEPERATE_CF_CARD_DETECT
  454. if(card_type == CARD_DETECT_CF)
  455. #ifdef I77_COMPANION_CHIP
  456. I77_AndPort(I77_GPIO_OUT_1, I77_GPIO_OUT_1, ~0x1 ); // Set bit/GPIO #8 to 1
  457. #else
  458. ClearGPIO(PIO_DATA_E, CARD_SEL);
  459. #endif
  460.        else
  461. #ifdef I77_COMPANION_CHIP
  462. I77_OrPort(I77_GPIO_OUT_1, I77_GPIO_OUT_1, 0x1 ); // Set bit/GPIO #8 to 1
  463. #else
  464. SetGPIO(PIO_DATA_E, CARD_SEL);
  465. #endif
  466. #endif
  467. #endif
  468.       if(card_type == NO_CARD_DETECT)
  469.        res = FX_GENERAL_ERROR;
  470.       else
  471. res = fx_media_open(&(gpFileX->FileX_media),
  472.                                    NULL,//*media_name
  473.                           card_media_driver[card_type>>4], //*media_driver
  474.                                    NULL, //VOID *driver_info_ptr,
  475. #ifdef I86_HW_FCU
  476.                                    (void *)FCU_FILEX_CACHE_ADDR,//VOID *memory_ptr,
  477.                                    FCU_FILEX_CACHE_SIZE,//ULONG memory_size,
  478. #else
  479.                                    &(gpFileX->ucFileXCacheBuff[0]),//VOID *memory_ptr,
  480.                                    FILEX_CACHE_SIZE,//ULONG memory_size,
  481. #endif
  482.                           0); //UINT partition)
  483. //check MS pro card.
  484. if(res != FX_SUCCESS && card_type == CARD_DETECT_MS_MSPRO &&
  485. (!(Exception_catchAndRethrow(EXCEPTION_MEDIUM_EJECTED | EXCEPTION_POWER_DOWN_REQUEST) )))
  486.       {
  487.          
  488. usleep(100000ul);    //JERRYC_2004AUG25     
  489. res = fx_media_open(&(gpFileX->FileX_media),
  490.                           NULL,//*media_name
  491.                           card_media_driver[5], //*media_driver
  492.                           NULL, //VOID *driver_info_ptr,
  493. #ifdef I86_HW_FCU
  494.                           (void *)FCU_FILEX_CACHE_ADDR,//VOID *memory_ptr,
  495.                           FCU_FILEX_CACHE_SIZE,//ULONG memory_size,
  496. #else
  497.                           &(gpFileX->ucFileXCacheBuff[0]),//VOID *memory_ptr,
  498.                           FILEX_CACHE_SIZE,//ULONG memory_size,
  499. #endif
  500.                           0); //UINT partition)
  501. }
  502.       }
  503. if(res == FX_SUCCESS)
  504. #endif
  505.       eExistingFileSys = eFileX;
  506.     else{
  507.   
  508. #ifdef I86_HW_FCU
  509.       if(NULL != gpFileX)
  510.        free(gpFileX);
  511. gpFileX = NULL;
  512. #endif
  513.       eExistingFileSys = eUnknown;
  514.     }
  515.   }
  516.   else    
  517. #endif
  518. eExistingFileSys= FileSys_determineType();
  519. if (eUnknown == eExistingFileSys) {
  520. dbg_printf(("WARNING: FileSys_selectType() Failed [2]: No File-System found.n"));
  521. return FALSE;
  522. }
  523. // If the caller will take any Type, select the Existing Type
  524. if (eAny == eNewType)
  525. eNewType= eExistingFileSys;
  526. // Make sure that the caller's choice can be handled
  527. if (eNewType != eExistingFileSys) {
  528. // Prohibit any incompatibilities
  529. #ifdef FILESYSTEM_SUPPORT_UDF
  530. if (eUDF_Bridge == eExistingFileSys) {
  531. if ((eISO9660 == eNewType) ||
  532. ((eUDF_102 == eNewType) && (0x0102 == g_FSInfo.uRevision)) ||
  533. ((eUDF_200 == eNewType) && (0x0200 == g_FSInfo.uRevision)) )
  534. bIsChoiceValid= TRUE;
  535. else
  536. bIsChoiceValid= FALSE;
  537. }
  538. else
  539. bIsChoiceValid= FALSE;
  540. #else //FILESYSTEM_SUPPORT_UDF
  541. bIsChoiceValid= ((eUDF_Bridge == eExistingFileSys) && (eISO9660 == eNewType));
  542. #endif //FILESYSTEM_SUPPORT_UDF
  543. }
  544. if (! bIsChoiceValid) {
  545. dbg_printf(("WARNING: FileSys_selectType() Failed [3]: Invalid type.n"));
  546. return FALSE;
  547. }
  548. // Destroy the instance of the currently-selected Type, if any
  549. switch (g_FSInfo.eCurrFileSysType)
  550. {
  551. case eISO9660:
  552. ISO9660_destruct();
  553. break;
  554. case eUDF_Bridge: // Fall-Through!
  555. case eUDF_102: // Fall-Through!
  556. case eUDF_200:
  557. #ifdef FILESYSTEM_SUPPORT_UDF
  558. UDF_destruct();
  559. #endif //FILESYSTEM_SUPPORT_UDF
  560. break;
  561. #ifdef ENABLE_FILEX
  562.   case eFileX:
  563.     FileX_destruct();
  564.     break;
  565. #endif
  566. }
  567. // Construct an instance of the newly-selected Type
  568. switch (eNewType)
  569. {
  570. case eISO9660:
  571. ISO9660_construct(g_FSInfo.dwFileSysStartLBN);
  572. break;
  573. case eUDF_Bridge: // Fall-Through!
  574. case eUDF_102: // Fall-Through!
  575. case eUDF_200:
  576. #ifdef FILESYSTEM_SUPPORT_UDF
  577. UDF_construct(g_FSInfo.dwFileSysStartLBN, g_FSInfo.uRevision);
  578. #endif //FILESYSTEM_SUPPORT_UDF
  579. break;
  580. #ifdef ENABLE_FILEX
  581.   case eFileX:
  582. //   FileX already constructed during determining type.
  583.     break;
  584. #endif
  585. }
  586. g_FSInfo.eCurrFileSysType= eNewType;
  587. return TRUE;
  588. }
  589. /////////////////////////////////////////////////////////////////////////////
  590. // FileSys_getSelectedType()
  591. //
  592. // Description: Retrieves the value of the currently-selected File-System type.
  593. //
  594. // Input: None
  595. // Output: None
  596. // In/Out: None
  597. // Return: An enum of type enFileSysType, representing the currently 
  598. // selected type. eUnknown is returned if no supported type of
  599. // File-System was selected.
  600. //
  601. // Remarks: None
  602. enFileSysType FileSys_getSelectedType()
  603. {
  604. return g_FSInfo.eCurrFileSysType;
  605. }
  606. /////////////////////////////////////////////////////////////////////////////
  607. // Initialization
  608. /////////////////////////////////////////////////////////////////////////////
  609. // FileSys_initialize()
  610. //
  611. // Description: Initializes the currently-selected File-System.
  612. //
  613. // Input: bLongFilenameSupport - Determines whether or not Long-Filenames
  614. //    Support is enabled.
  615. // Output: None
  616. // In/Out: None
  617. // Return: TRUE if the File-System was successfully initialized; FALSE
  618. // otherwise.
  619. //
  620. // Remarks:
  621. // 1. In case of failure, none of the Navigation or Queries methods may
  622. //    be used.
  623. // 2. Long-Filenames Support is only relevant for ISO-9660. When the
  624. //    selected File-System type is UDF or UDF-Bridge, this argument is
  625. //    ignored, since UDF automatically supports Long-Filenames.
  626. BOOL FileSys_initialize(BOOL bLongFilenameSupport)
  627. {
  628. BOOL bSuccess;
  629. WCHAR buff = 0;
  630. dbg_printf(("FileSys_initialize(%s) calling.n", (bLongFilenameSupport ? "TRUE" : "FALSE")));
  631. #ifdef _DEBUG
  632. // Sanity check
  633. if (eUnknown == g_FSInfo.eCurrFileSysType) {
  634. dbg_printf(("WARNING: FileSys_initialize() Failed [1]: File-System type is unknown.n"));
  635. return FALSE;
  636. }
  637. #endif //_DEBUG
  638. // Reset the Volume-Name
  639. sc_SetBytes(SC_VOLUME_ID_ADDR, 0, 2, (BYTE*)&buff);
  640. // Reset the Path-delimiter
  641. g_FSInfo.cPathDelimiter= '\';
  642. // Reset the Current-Path
  643. sc_SetBytes(SC_CURRENT_PATHNAME_ADDR, 0, 2, (BYTE*)&buff);
  644. // Initialize the appropriate File-System
  645. switch (g_FSInfo.eCurrFileSysType) 
  646. {
  647. case eISO9660:
  648. bSuccess= ISO9660_initialize(bLongFilenameSupport);
  649. break;
  650. case eUDF_Bridge: // Fall-Through!
  651. case eUDF_102: // Fall-Through!
  652. case eUDF_200:
  653. #ifdef FILESYSTEM_SUPPORT_UDF
  654. bSuccess= UDF_initialize(bLongFilenameSupport);
  655. #endif //FILESYSTEM_SUPPORT_UDF
  656. break;
  657. #ifdef ENABLE_FILEX
  658.   case eFileX:
  659.     //nothing to do
  660.     bSuccess = TRUE;
  661.     break;
  662. #endif
  663. }
  664. return bSuccess;
  665. }
  666. /////////////////////////////////////////////////////////////////////////////
  667. // FileSys_setPathDelimiter()
  668. //
  669. // Description: Sets the character to be used as the Path delimiter when
  670. // paths are supplied to the various calls.
  671. //
  672. // Input: cPathDelimiter - The character that serves as the Path delimiter.
  673. // Output: None
  674. // In/Out: None
  675. // Return: None
  676. //
  677. // Remarks: None
  678. void FileSys_setPathDelimiter(WCHAR cPathDelimiter)
  679. {
  680. g_FSInfo.cPathDelimiter= cPathDelimiter;
  681. return;
  682. }
  683. /////////////////////////////////////////////////////////////////////////////
  684. // FileSys_getPathDelimiter()
  685. //
  686. // Description: Retrieves the character being used as the Path delimiter.
  687. //
  688. // Input: None
  689. // Output: None
  690. // In/Out: None
  691. // Return: The Path-Delimiter character.
  692. //
  693. // Remarks: None
  694. WCHAR FileSys_getPathDelimiter(void)
  695. {
  696. return g_FSInfo.cPathDelimiter;
  697. }
  698. /////////////////////////////////////////////////////////////////////////////
  699. // Navigation
  700. /////////////////////////////////////////////////////////////////////////////
  701. // FileSys_goToRootDir()
  702. //
  703. // Description: Sets the current working-directory to the Root directory.
  704. //
  705. // Input: None
  706. // Output: None
  707. // In/Out: None
  708. // Return: TRUE if the current working-directory was successfully switched
  709. // to the Root; FALSE otherwise.
  710. //
  711. // Remarks: None
  712. BOOL FileSys_goToRootDir()
  713. {
  714. BOOL bSuccess;
  715. dbg_printf(("FileSys_goToRootDir() calling.n"));
  716. #ifdef _DEBUG
  717. // Sanity check
  718. if (eUnknown == g_FSInfo.eCurrFileSysType) {
  719. dbg_printf(("WARNING: FileSys_goToRootDir() Failed [1]: File-System type is unknown.n"));
  720. return FALSE;
  721. }
  722. #endif //_DEBUG
  723. switch (g_FSInfo.eCurrFileSysType)
  724. {
  725. case eISO9660:
  726. bSuccess= ISO9660_goToRootDir();
  727. break;
  728. case eUDF_Bridge: // Fall-Through!
  729. case eUDF_102: // Fall-Through!
  730. case eUDF_200:
  731. #ifdef FILESYSTEM_SUPPORT_UDF
  732. bSuccess= UDF_goToRootDir();
  733. #endif //FILESYSTEM_SUPPORT_UDF
  734. break;
  735. #ifdef ENABLE_FILEX
  736.   case eFileX:
  737.     bSuccess= (FX_SUCCESS == fx_directory_default_set(&(gpFileX->FileX_media), "\"));
  738.     break;
  739. #endif
  740. }
  741. if (bSuccess)
  742. {
  743. WCHAR buff = 0;
  744. sc_SetBytes(SC_CURRENT_PATHNAME_ADDR, 0, 2, (BYTE*)&buff);
  745. }
  746. return bSuccess;
  747. }
  748. /////////////////////////////////////////////////////////////////////////////
  749. // FileSys_changeDir()
  750. //
  751. // Description: Changes the current working-directory to a desired directory.
  752. //
  753. // Input: i_pszDestDirName - A string holding the name of the destination
  754. //    Directory.
  755. // Output: None
  756. // In/Out: None
  757. // Return: TRUE if the current working-directory was successfully changed;
  758. // FALSE otherwise.
  759. //
  760. // Remarks:
  761. // 1. The destination Directory must be a direct descendant of the current
  762. //    working-directory.
  763. // 2. If a Directory-Path is supplied, the Path-delimiter must be identical
  764. //    to the one supplied via the FileSys_setPathDelimiter() method.
  765. // 3. Only a single directory may be specified inside i_pszDestDirName.
  766. //    I.e., i_pszDestDirName is treated as a name of a single directory
  767. //    (directory hierarchy cannot be specified).
  768. BOOL FileSys_changeDir(LPCWSTR i_pszDestDirName)
  769. {
  770. BOOL bSuccess= TRUE;
  771. LPWSTR pszDirName, pszDelimiter;
  772. LPWSTR pszDirPath= NULL;
  773. dbg_printf(("FileSys_changeDir() calling.n"));
  774. #ifdef _DEBUG
  775. // Sanity check
  776. if (eUnknown == g_FSInfo.eCurrFileSysType) {
  777. dbg_printf(("WARNING: FileSys_changeDir() Failed [1]: File-System type is unknown.n"));
  778. return FALSE;
  779. }
  780. #endif //_DEBUG
  781. // Allocate a copy for the Destination Path, if required
  782. if (NULL != wcschr(i_pszDestDirName, g_FSInfo.cPathDelimiter)) {
  783. pszDirPath= (LPWSTR)malloc((1 + wcslen(i_pszDestDirName)) * sizeof(WCHAR));
  784. if (NULL == pszDirPath) {
  785. tr_printf(("FATAL: FileSys_changeDir() Failed [2]: Low system resources.n"));
  786. return FALSE;
  787. }
  788. // Make a local copy of the Destination Path
  789. wcscpy(pszDirPath, i_pszDestDirName);
  790. pszDirName= pszDirPath;
  791. }
  792. else {
  793. pszDirName= (LPWSTR)i_pszDestDirName;
  794. }
  795. // Store the Current Working-Directory, in case of failure
  796. switch (g_FSInfo.eCurrFileSysType)
  797. {
  798. case eISO9660:
  799. ISO9660_storeWorkingDirectory();
  800. break;
  801. case eUDF_Bridge: // Fall-Through!
  802. case eUDF_102: // Fall-Through!
  803. case eUDF_200:
  804. #ifdef FILESYSTEM_SUPPORT_UDF
  805. UDF_storeWorkingDirectory();
  806. #endif //FILESYSTEM_SUPPORT_UDF
  807. break;
  808. #ifdef ENABLE_FILEX
  809.   case eFileX:
  810.     //TODO: implement fx_storeWorkingDirectory();
  811.     break;
  812. #endif
  813. }
  814. // Change directories, one at a time
  815. while (bSuccess) {
  816. if (g_FSInfo.cPathDelimiter)
  817. pszDelimiter= wcschr(pszDirName, g_FSInfo.cPathDelimiter);
  818. else
  819. pszDelimiter= NULL;
  820. // Break the Path such, that pszDirName points to a single Directory name
  821. if (NULL != pszDelimiter) {
  822. *(pszDelimiter++)= 0;
  823. }
  824. // Go one level down the hierarchy
  825. switch (g_FSInfo.eCurrFileSysType)
  826. {
  827. case eISO9660:
  828. bSuccess= ISO9660_changeDir(pszDirName);
  829. break;
  830. case eUDF_Bridge: // Fall-Through!
  831. case eUDF_102: // Fall-Through!
  832. case eUDF_200:
  833. #ifdef FILESYSTEM_SUPPORT_UDF
  834. bSuccess= UDF_changeDir(pszDirName);
  835. #endif //FILESYSTEM_SUPPORT_UDF
  836. break;
  837. #ifdef ENABLE_FILEX
  838.   case eFileX:
  839.   {
  840.     char *pucBuff = (char *)malloc(1 + wcslen(pszDirName));
  841. if (NULL == pucBuff) {
  842. tr_printf(("FATAL: FileSys_changeDir() Failed [3]: Low system resources.n"));
  843. return FALSE;
  844. }
  845.     _wcs2str(pszDirName, pucBuff, wcslen(pszDirName)+1);
  846.     bSuccess= (FX_SUCCESS == fx_directory_default_set(&(gpFileX->FileX_media), pucBuff));
  847. free(pucBuff);
  848.   }
  849.     break;
  850. #endif
  851. }
  852. // Move to the next component on the Path, if one exists
  853. if (NULL == pszDelimiter)
  854. break;
  855. pszDirName= pszDelimiter;
  856. }
  857. if (NULL != pszDirPath)
  858. free(pszDirPath);
  859. // In case of failure, restore the original Working-Directory.
  860. if (! bSuccess) {
  861. switch (g_FSInfo.eCurrFileSysType)
  862. {
  863. case eISO9660:
  864. ISO9660_recallWorkingDirectory();
  865. break;
  866. case eUDF_Bridge: // Fall-Through!
  867. case eUDF_102: // Fall-Through!
  868. case eUDF_200:
  869. #ifdef FILESYSTEM_SUPPORT_UDF
  870. UDF_recallWorkingDirectory();
  871. #endif //FILESYSTEM_SUPPORT_UDF
  872. break;
  873. #ifdef ENABLE_FILEX
  874.   case eFileX:
  875.    //TODO: implement fx_recallWorkingDirectory.
  876.      break;
  877. #endif
  878. }
  879. }
  880. else {
  881. // Update the Current Path
  882. WCHAR path[MAX_PATH];
  883. sc_GetBytes(SC_CURRENT_PATHNAME_ADDR, 0, MAX_PATH * sizeof(WCHAR), (BYTE*)path);
  884. if (MAX_PATH >= (2 + wcslen(path) + wcslen(i_pszDestDirName))) {
  885. wcsncat(path, &g_FSInfo.cPathDelimiter, 1);
  886. wcsncat(path, i_pszDestDirName, MAX_PATH - wcslen(path) - 1);
  887. sc_SetBytes(SC_CURRENT_PATHNAME_ADDR, 0, MAX_PATH * sizeof(WCHAR), (BYTE*)path);
  888. }
  889. else {
  890. dbg_printf(("WARNING: FileSys_changeDir(): Current-Path exceeds maximum length.n"));
  891. }
  892. }
  893. return bSuccess;
  894. }
  895. /////////////////////////////////////////////////////////////////////////////
  896. // FileSys_goUp()
  897. //
  898. // Description: Moves up one level in the Directories hierarchy.
  899. //
  900. // Input: None
  901. // Output: None
  902. // In/Out: None
  903. // Return: TRUE if the current working-directory was successfully changed;
  904. // FALSE otherwise.
  905. //
  906. // Remarks:
  907. // This method changes the current working-directory to its direct parent
  908. // in the Directories hierarchy. If the current working-directory is already
  909. // the Root when this method is called, no change is made.
  910. BOOL FileSys_goUp()
  911. {
  912. BOOL bSuccess;
  913. dbg_printf(("FileSys_goUp() calling.n"));
  914. #ifdef _DEBUG
  915. // Sanity check
  916. if (eUnknown == g_FSInfo.eCurrFileSysType) {
  917. dbg_printf(("WARNING: FileSys_goUp() Failed [1]: File-System type is unknown.n"));
  918. return FALSE;
  919. }
  920. #endif //_DEBUG
  921. switch (g_FSInfo.eCurrFileSysType)
  922. {
  923. case eISO9660:
  924. bSuccess= ISO9660_goUp();
  925. break;
  926. case eUDF_Bridge: // Fall-Through!
  927. case eUDF_102: // Fall-Through!
  928. case eUDF_200:
  929. #ifdef FILESYSTEM_SUPPORT_UDF
  930. bSuccess= UDF_goUp();
  931. #endif //FILESYSTEM_SUPPORT_UDF
  932. break;
  933. #ifdef ENABLE_FILEX
  934.   case eFileX:
  935.     bSuccess= (FX_SUCCESS == fx_directory_default_set(&(gpFileX->FileX_media), ".."));
  936.     if(!bSuccess)
  937.     bSuccess= (FX_SUCCESS == fx_directory_default_set(&(gpFileX->FileX_media), "\"));
  938.     break;
  939. #endif
  940. }
  941. if (bSuccess) {
  942. // Update the Current Path
  943. WCHAR path[MAX_PATH];
  944. LPWSTR pszDelimiter;
  945. sc_GetBytes(SC_CURRENT_PATHNAME_ADDR, 0, MAX_PATH * sizeof(WCHAR), (BYTE*)path);
  946. pszDelimiter = wcsrchr(path, g_FSInfo.cPathDelimiter);
  947. if (NULL != pszDelimiter)
  948. *pszDelimiter= 0;
  949. sc_SetBytes(SC_CURRENT_PATHNAME_ADDR, 0, MAX_PATH * sizeof(WCHAR), (BYTE*)path);
  950. }
  951. return bSuccess;
  952. }
  953. /////////////////////////////////////////////////////////////////////////////
  954. // Queries
  955. /////////////////////////////////////////////////////////////////////////////
  956. // FileSys_getVolumeName()
  957. //
  958. // Description: Retrieves the Name of the Primary-Volume on the Medium.
  959. //
  960. // Input: None
  961. // Output: None
  962. // In/Out: None
  963. // Return: A pointer to a constant String, containing the Volume-Name.
  964. // A NULL string is returned if the File-System type is unknown.
  965. //
  966. // Remarks:
  967. // The returned String must not be modified or freed by the caller.
  968. void FileSys_getVolumeName(LPCWSTR volumeName)
  969. {
  970. //LPCWSTR pszVolumeName;
  971. dbg_printf(("FileSys_getVolumeName() calling.n"));
  972. #ifdef _DEBUG
  973. // Sanity check
  974. if (eUnknown == g_FSInfo.eCurrFileSysType) {
  975. dbg_printf(("WARNING: FileSys_getVolumeName() Failed [1]: File-System type is unknown.n"));
  976. return NULL;
  977. }
  978. #endif //_DEBUG
  979. switch (g_FSInfo.eCurrFileSysType)
  980. {
  981. case eISO9660:
  982. ISO9660_getVolumeName(volumeName);
  983. break;
  984. case eUDF_Bridge: // Fall-Through!
  985. case eUDF_102: // Fall-Through!
  986. case eUDF_200:
  987. #ifdef FILESYSTEM_SUPPORT_UDF
  988. UDF_getVolumeName(volumeName);
  989. #endif //FILESYSTEM_SUPPORT_UDF
  990. break;
  991. #ifdef ENABLE_FILEX
  992.   case eFileX:
  993. {
  994. WCHAR buff=0;
  995. sc_SetBytes(SC_VOLUME_ID_ADDR, 0, 2, (BYTE*)&buff);
  996. //*volumeName = 0; // not supported yet.
  997. }
  998.     break;
  999. #endif
  1000. }
  1001. return;
  1002. }
  1003. /////////////////////////////////////////////////////////////////////////////
  1004. // FileSys_getCurrentPath()
  1005. //
  1006. // Description: Retrieves the full Path of the Current Working-Directory.
  1007. //
  1008. // Input: None
  1009. // Output: None
  1010. // In/Out: currPath
  1011. // Return: None
  1012. //
  1013. // Remarks:
  1014. // The returned String must not be modified or freed by the caller.
  1015. void FileSys_getCurrentPath(LPCWSTR currPath)
  1016. {
  1017. sc_GetBytes(SC_CURRENT_PATHNAME_ADDR, 0, MAX_PATH * sizeof(WCHAR), (BYTE*)currPath);
  1018. return;
  1019. }
  1020. /////////////////////////////////////////////////////////////////////////////
  1021. // FileSys_fileExists()
  1022. //
  1023. // Description: Tests whether a certain file exists in the current working-
  1024. // directory, or not.
  1025. //
  1026. // Input: i_pszFilename - A string holding the name of the File to test.
  1027. // Output: None
  1028. // In/Out: None
  1029. // Return: TRUE if the requested File exists in the current working-directory;
  1030. // FALSE otherwise.
  1031. //
  1032. // Remarks:
  1033. // A return value of FALSE may also indicate that the currently-selected
  1034. // File-System is unknown. The user is responsible for verifying correctness
  1035. // by assuring that the File-System type was selected and the File-System 
  1036. // successfully initialized.
  1037. BOOL FileSys_fileExists(LPCWSTR i_pszFilename)
  1038. {
  1039. BOOL bSuccess;
  1040. dbg_printf(("FileSys_fileExists() calling.n"));
  1041. #ifdef _DEBUG
  1042. // Sanity check
  1043. if (eUnknown == g_FSInfo.eCurrFileSysType) {
  1044. dbg_printf(("WARNING: FileSys_fileExists() Failed [1]: File-System type is unknown.n"));
  1045. return FALSE;
  1046. }
  1047. #endif //_DEBUG
  1048. switch (g_FSInfo.eCurrFileSysType)
  1049. {
  1050. case eISO9660:
  1051. bSuccess= ISO9660_fileExists(i_pszFilename);
  1052. break;
  1053. case eUDF_Bridge: // Fall-Through!
  1054. case eUDF_102: // Fall-Through!
  1055. case eUDF_200:
  1056. #ifdef FILESYSTEM_SUPPORT_UDF
  1057. bSuccess= UDF_fileExists(i_pszFilename);
  1058. #endif //FILESYSTEM_SUPPORT_UDF
  1059. break;
  1060. #ifdef ENABLE_FILEX
  1061.   case eFileX:
  1062.   {
  1063.     char *pucBuff = (char *)malloc(1 + wcslen(i_pszFilename));
  1064. if (NULL == pucBuff) {
  1065. tr_printf(("FATAL: FileSys_changeDir() Failed [3]: Low system resources.n"));
  1066. return FALSE;
  1067. }
  1068.     _wcs2str(i_pszFilename, pucBuff, wcslen(i_pszFilename)+1);
  1069.     bSuccess= (FX_NOT_DIRECTORY == fx_directory_name_test(&(gpFileX->FileX_media), pucBuff));
  1070. free(pucBuff);
  1071.   }
  1072.     break;
  1073. #endif
  1074. }
  1075. return bSuccess;
  1076. }
  1077. /////////////////////////////////////////////////////////////////////////////
  1078. // FileSys_getFileLocation()
  1079. //
  1080. // Description: Retrieves the location of a certain file (its start address).
  1081. //
  1082. // Input: i_pszFilename - A string holding the name of the requested File.
  1083. // Output: o_pFileLocation - Points to a DWORD to receive the File's start
  1084. //   address.
  1085. // In/Out: None
  1086. // Return: TRUE if the requested File was located and its address retrieved;
  1087. // FALSE otherwise.
  1088. //
  1089. // Remarks:
  1090. // 1. A return value of FALSE indicates that the requested File does not
  1091. //    exist in the current working-directory.
  1092. // 2. The File's start-address is given in terms of the Medium's native
  1093. //    addressing system. E.g., for Optical-Storage Media, the returned
  1094. //    address is expressed in terms of Logical-Block-Number (LBN).
  1095. BOOL FileSys_getFileLocation(LPCWSTR i_pszFilename, DWORD *o_pFileLocation)
  1096. {
  1097. BOOL bSuccess;
  1098. dbg_printf(("FileSys_getFileLocation() calling.n"));
  1099. #ifdef _DEBUG
  1100. // Sanity check
  1101. if (eUnknown == g_FSInfo.eCurrFileSysType) {
  1102. dbg_printf(("WARNING: FileSys_fileExists() Failed [1]: File-System type is unknown.n"));
  1103. return FALSE;
  1104. }
  1105. #endif //_DEBUG
  1106. switch (g_FSInfo.eCurrFileSysType)
  1107. {
  1108. case eISO9660:
  1109. bSuccess= ISO9660_fileLocation(i_pszFilename, o_pFileLocation);
  1110. break;
  1111. case eUDF_Bridge: // Fall-Through!
  1112. case eUDF_102: // Fall-Through!
  1113. case eUDF_200:
  1114. #ifdef FILESYSTEM_SUPPORT_UDF
  1115. bSuccess= UDF_fileLocation(i_pszFilename, o_pFileLocation);
  1116. #endif //FILESYSTEM_SUPPORT_UDF
  1117. break;
  1118. #ifdef ENABLE_FILEX
  1119.   case eFileX:
  1120.     //TODO: to be implemented.
  1121.     bSuccess = FALSE; 
  1122.     break;
  1123. #endif
  1124. }
  1125. return bSuccess;
  1126. }
  1127. /////////////////////////////////////////////////////////////////////////////
  1128. // FileSys_getDVDFileInfo()
  1129. //
  1130. // Description: Retrieves DVD-Specific information about some file.
  1131. //
  1132. // Input: i_pszFilename - A string holding the name of the requested File,
  1133. // or a pattern to match.
  1134. // eType - An enumerator indicating the Type of DVD Information to
  1135. // retrieve.
  1136. // Output: o_pFileInfo - Points to a DVDFileInfo structure, to receive the
  1137. //   File's DVD-information upon successful completion;
  1138. // o_pFindData - Points to a FindData structure, to receive the File's
  1139. //   details upon successful completion. May be NULL.
  1140. // In/Out: None
  1141. // Return: TRUE if the requested file was found and the required DVD
  1142. // information was successfully retrieved;
  1143. // FALSE if the file couldn't be found, or if the file has no
  1144. // associated DVD information of the requested type.
  1145. //
  1146. // Remarks:
  1147. // - The value of o_pFindData may be NULL, in which case the FindData
  1148. //   is not retrieved.
  1149. BOOL FileSys_getDVDFileInfo(LPCWSTR i_pszFilename, enDVD_FileInfoType eType, 
  1150. DVDFileInfo *o_pFileInfo, FindData *o_pFindData)
  1151. {
  1152. BOOL bRetValue= FALSE;
  1153. LPWSTR pszFilePath= NULL;
  1154. LPCWSTR pszFilename= i_pszFilename;
  1155. dbg_printf(("FileSys_getDVDFileInfo() calling.n"));
  1156. #ifdef _DEBUG
  1157. // Sanity check
  1158. if (eUnknown == g_FSInfo.eCurrFileSysType) {
  1159. dbg_printf(("WARNING: FileSys_getDVDFileInfo() Failed [1]: File-System type is unknown.n"));
  1160. return FALSE;
  1161. }
  1162. #endif //_DEBUG
  1163. // Isolate the File's Path, if the Path-Delimiter is set
  1164. if (g_FSInfo.cPathDelimiter) {
  1165. // Search for the File-Name component
  1166. LPCWSTR pszDelimiter= (LPCWSTR)wcsrchr(i_pszFilename, g_FSInfo.cPathDelimiter);
  1167. if (NULL != pszDelimiter) {
  1168. UINT16 uPathLength= (UINT16)((pszDelimiter - i_pszFilename) / sizeof(WCHAR));
  1169. // Set the Filename to point past the Path-Delimiter
  1170. pszFilename= ++pszDelimiter;
  1171. // Copy only the File's path
  1172. pszFilePath= (LPWSTR)malloc((1 + uPathLength) * sizeof(WCHAR));
  1173. if (NULL == pszFilePath) {
  1174. tr_printf(("FATAL: FileSys_getDVDFileInfo() Failed [2]: Low system resources.n"));
  1175. return FALSE;
  1176. }
  1177. wcsncpy(pszFilePath, i_pszFilename, uPathLength);
  1178. pszFilePath[uPathLength]= 0;
  1179. }
  1180. }
  1181. // Prepare for the query
  1182. switch (g_FSInfo.eCurrFileSysType)
  1183. {
  1184. case eISO9660:
  1185. // This query is unsupported by ISO-9660
  1186. bRetValue= FALSE;
  1187. break;
  1188. case eUDF_Bridge: // Fall-Through!
  1189. case eUDF_102: // Fall-Through!
  1190. case eUDF_200:
  1191. #ifdef FILESYSTEM_SUPPORT_UDF
  1192. // Store the current Working-Directory
  1193. UDF_storeWorkingDirectory();
  1194. // Change Working-Directory to the File's Path
  1195. if ((NULL != pszFilePath) && (! FileSys_changeDir(pszFilePath)))
  1196. break;
  1197. // Initiate the search
  1198. bRetValue= UDF_getDVDFileInfo(pszFilename, eType, o_pFileInfo, o_pFindData);
  1199. // Recall the original Working-Directory
  1200. UDF_recallWorkingDirectory();
  1201. #endif //FILESYSTEM_SUPPORT_UDF
  1202. break;
  1203. }
  1204. // Free the File's Path string
  1205. if (pszFilePath)
  1206. free(pszFilePath);
  1207. return bRetValue;
  1208. }
  1209. /////////////////////////////////////////////////////////////////////////////
  1210. // FileSys_findFirstFile()
  1211. //
  1212. // Description: Initiates a search for a certain file, or collection of
  1213. // files.
  1214. //
  1215. // Input: i_pszFilename - A string holding the name of the requested File,
  1216. // or a pattern to match.
  1217. // Output: o_pFindData - Points to a FindData structure, to receive the File's
  1218. //   details upon successful completion of the search.
  1219. // In/Out: None
  1220. // Return: A UINT16 which serves as the Handle to this search. This value
  1221. // must be saved for later use with other find-related methods.
  1222. // NULL is returned if the search fails.
  1223. //
  1224. // Remarks:
  1225. // 1. The user must save the returned Handle in order to supply it to future
  1226. //    calls to any of the other find-related methods.
  1227. // 2. If the returned Handle is NULL, then no File matching the supplied
  1228. //    name/pattern could be located in the current working-directory.
  1229. // 3. If a Directory-Path is supplied, it is assumed to be relative to
  1230. //    the Current Working-Directory.
  1231. // 4. The following patterns may be supplied in i_pszFilename:
  1232. // - An empty string ("") - matches any File/Sub-Directory;
  1233. // - Some non-empty string: treated as a Filename/Sub-Directory prefix.
  1234. //   For a string of length N, only the first N characters are used
  1235. //   for matching.
  1236. //   For example: supplying a value of i_pszFilename="A" would retrieve
  1237. //   the first File/Sub-Directory whose name begins with a Captial 'A',
  1238. //   if such a File/Sub-Directory exists.
  1239. // 5. The search is Case-Sensitive.
  1240. // 6. FileSys_findClose() must be called when no additional searches are needed.
  1241. UINT16 FileSys_findFirstFile(LPCWSTR i_pszFilename, FindData *o_pFindData)
  1242. {
  1243. UINT16 uCurrPathLength;
  1244. UINT16 uRetValue= NULL;
  1245. LPWSTR pszFilePath= NULL;
  1246. LPCWSTR pszFilename= i_pszFilename;
  1247. dbg_printf(("FileSys_findFirstFile() calling.n"));
  1248. {
  1249. WCHAR path[MAX_PATH];
  1250. sc_GetBytes(SC_CURRENT_PATHNAME_ADDR, 0, MAX_PATH * sizeof(WCHAR), (BYTE*)path);
  1251. uCurrPathLength = wcslen(path);
  1252. }
  1253. #ifdef _DEBUG
  1254. // Sanity check
  1255. if (eUnknown == g_FSInfo.eCurrFileSysType) {
  1256. dbg_printf(("WARNING: FileSys_findFirstFile() Failed [1]: File-System type is unknown.n"));
  1257. return NULL;
  1258. }
  1259. #endif //_DEBUG
  1260. // Isolate the File's Path, if the Path-Delimiter is set
  1261. if (g_FSInfo.cPathDelimiter) {
  1262. // Search for the File-Name component
  1263. LPCWSTR pszDelimiter= (LPCWSTR)wcsrchr(i_pszFilename, g_FSInfo.cPathDelimiter);
  1264. if (NULL != pszDelimiter) {
  1265. UINT16 uPathLength= (UINT16)(pszDelimiter - i_pszFilename);
  1266. // Set the Filename to point past the Path-Delimiter
  1267. pszFilename= ++pszDelimiter;
  1268. // Copy only the File's path
  1269. pszFilePath= (LPWSTR)malloc((1 + uPathLength) * sizeof(WCHAR));
  1270. if (NULL == pszFilePath) {
  1271. tr_printf(("FATAL: FileSys_findFirstFile() Failed [2]: Low system resources.n"));
  1272. return NULL;
  1273. }
  1274. wcsncpy(pszFilePath, i_pszFilename, uPathLength);
  1275. pszFilePath[uPathLength]= 0;
  1276. }
  1277. }
  1278. // Prepare for the search
  1279. switch (g_FSInfo.eCurrFileSysType)
  1280. {
  1281. case eISO9660:
  1282. // Store the current Working-Directory
  1283. ISO9660_storeWorkingDirectory();
  1284. // Change Working-Directory to the File's Path
  1285. if ((NULL != pszFilePath) && (! FileSys_changeDir(pszFilePath)))
  1286. break;
  1287. // Initiate the search
  1288. uRetValue= ISO9660_findFirstFile(pszFilename, o_pFindData);
  1289. // Recall the original Working-Directory
  1290. ISO9660_recallWorkingDirectory();
  1291. break;
  1292. case eUDF_Bridge: // Fall-Through!
  1293. case eUDF_102: // Fall-Through!
  1294. case eUDF_200:
  1295. #ifdef FILESYSTEM_SUPPORT_UDF
  1296. // Store the current Working-Directory
  1297. UDF_storeWorkingDirectory();
  1298. // Change Working-Directory to the File's Path
  1299. if ((NULL != pszFilePath) && (! FileSys_changeDir(pszFilePath)))
  1300. break;
  1301. // Initiate the search
  1302. uRetValue= UDF_findFirstFile(pszFilename, o_pFindData);
  1303. // Recall the original Working-Directory
  1304. UDF_recallWorkingDirectory();
  1305. #endif //FILESYSTEM_SUPPORT_UDF
  1306. break;
  1307. #ifdef ENABLE_FILEX
  1308. case eFileX:
  1309. {
  1310. char * directory_name;
  1311. //TODO: add fx_storeWorkingDirectory();
  1312. // Change Working-Directory to the File's Path
  1313. if ((NULL != pszFilePath) && (! FileSys_changeDir(pszFilePath)))
  1314. break;
  1315. directory_name= (char *)malloc(1 + FILEX_FILENAME_LENGTH);
  1316. if(NULL == directory_name)
  1317. {
  1318. tr_printf(("Fatal: FileSys_findFirstFile() Failed [3]: Low System resource.n"));
  1319. break;
  1320. }
  1321. if(FILESYS_BLURRED_SEARCH == pszFilename[0]) // wildcard search
  1322. {
  1323. FX_DIR_ENTRY entry;
  1324. /* Set the current entry to 0 in order to pickup the first entry.  */
  1325. gpFileX->FileX_media.fx_media_default_path.fx_path_current_entry =  0;
  1326. if ( FX_SUCCESS != _fx_directory_next_entry_find_new(&(gpFileX->FileX_media), &entry ) )
  1327. {
  1328. uRetValue = NULL;
  1329. } else
  1330. {
  1331. if ( FX_VOLUME&entry.fx_dir_entry_attributes )
  1332. {
  1333. o_pFindData-> uFileType = FILETYPE_VOLUME;
  1334. } else
  1335. {
  1336. _str2wcs(entry.fx_dir_entry_name, o_pFindData->szFileID, 2*(1 + FILEX_FILENAME_LENGTH));
  1337. if( FX_DIRECTORY&entry.fx_dir_entry_attributes )
  1338. {
  1339. o_pFindData-> uFileType = FILETYPE_DIRECTORY;
  1340. } else
  1341. {
  1342. o_pFindData-> uFileType = FILETYPE_NORMAL;
  1343. o_pFindData-> cbFileSizeHigh = 0;
  1344. o_pFindData->dwStartAddr = entry.fx_dir_entry_cluster;
  1345. o_pFindData->cbFileSizeLow = entry.fx_dir_entry_file_size;
  1346. }
  1347. }
  1348. uRetValue = 1;
  1349. }
  1350. } else // search for a file with a given name.
  1351. {
  1352. FX_DIR_ENTRY entry;
  1353. // <<<MikeX_1213_2004_A: support blurred searching
  1354. BOOL bBlurredlySearch = FALSE;
  1355. UINT8 uFileIDLength = wcslen(pszFilename);
  1356. if(FILESYS_BLURRED_SEARCH == pszFilename[uFileIDLength-1] )
  1357. {
  1358. bBlurredlySearch = TRUE;
  1359. uFileIDLength --;
  1360. }
  1361. //MikeX_1213_2004_A>>>
  1362.                
  1363. /* Set the current entry to 0 in order to pickup the first entry.  */
  1364. uRetValue = NULL;
  1365. gpFileX->FileX_media.fx_media_default_path.fx_path_current_entry =  0;
  1366.             while(1){
  1367. if ( FX_SUCCESS != _fx_directory_next_entry_find_new(&(gpFileX->FileX_media), &entry ) )
  1368. {
  1369. break;
  1370. } else
  1371. {
  1372. if ( FX_VOLUME&entry.fx_dir_entry_attributes )
  1373. {
  1374. continue;
  1375. } else
  1376. {
  1377. _str2wcs(entry.fx_dir_entry_name, o_pFindData->szFileID, 2*(1 + FILEX_FILENAME_LENGTH));
  1378. if( FX_DIRECTORY&entry.fx_dir_entry_attributes )
  1379. {
  1380. continue;
  1381. } else
  1382. {
  1383.                    if( (wcsncmp(o_pFindData->szFileID, pszFilename, uFileIDLength) != 0) ||
  1384. ( (!bBlurredlySearch) && (wcslen(o_pFindData->szFileID) != uFileIDLength))) //MikeX_1213_2004_A: support blurred searching
  1385.                       continue;
  1386. o_pFindData-> uFileType = FILETYPE_NORMAL;
  1387. o_pFindData-> cbFileSizeHigh = 0;
  1388. o_pFindData->dwStartAddr = entry.fx_dir_entry_cluster;
  1389. o_pFindData->cbFileSizeLow = entry.fx_dir_entry_file_size;
  1390. uRetValue = 1;
  1391.                      break;
  1392. }
  1393. }
  1394.                }
  1395. }
  1396. }
  1397. free(directory_name);
  1398. }
  1399. break;
  1400. #endif
  1401. }
  1402. // Free the File's Path string
  1403. if (NULL != pszFilePath) {
  1404. free(pszFilePath);
  1405. // Reconstruct the original Path, since it was changed by FileSys_changeDir()
  1406. {
  1407. WCHAR buff = 0;
  1408. sc_SetBytes(SC_CURRENT_PATHNAME_ADDR, 0, 2, (BYTE*)&buff);
  1409. }
  1410. }
  1411. return uRetValue;
  1412. }
  1413. /////////////////////////////////////////////////////////////////////////////
  1414. // FileSys_findNextFile()
  1415. //
  1416. // Description: Continues a search that was previously initiated using a call
  1417. // to FileSys_findFirstFile().
  1418. //
  1419. // Input: hFindFile - A Handle to a file-search, that was returned from 
  1420. // a previous call to FileSys_findFirstFile().
  1421. // Output: o_pFindData - Points to a FindData structure, to receive the File's
  1422. //   details upon successful completion of the search.
  1423. // In/Out: None
  1424. // Return: TRUE if the search succeeded, and an additional File matching
  1425. // the Filename/pattern was found. In this case, the supplied
  1426. // o_pFindData contains updated information of the found File.
  1427. // FALSE is returned if no more Files/Sub-Directories matching the
  1428. // supplied Filename/pattern could be found. In this case, the
  1429. // supplied o_pFindData is invalid.
  1430. //
  1431. // Remarks:
  1432. // 1. This method continues a previous search from the point it left off.
  1433. // 2. The search relates to the Directory that was supplied at the time the 
  1434. //    search was initiated via FileSys_findFirstFile().
  1435. // 3. The search uses the same Filename/pattern as was originally supplied
  1436. //    to FileSys_findFirstFile().
  1437. // 4. FileSys_findClose() must be called when no additional searches are needed.
  1438. BOOL FileSys_findNextFile(UINT16 hFindFile, FindData *o_pFindData)
  1439. {
  1440. BOOL bSuccess;
  1441. dbg_printf(("FileSys_findNextFile() calling.n"));
  1442. #ifdef _DEBUG
  1443. // Sanity check
  1444. if (eUnknown == g_FSInfo.eCurrFileSysType) {
  1445. dbg_printf(("WARNING: FileSys_findNextFile() Failed [1]: File-System type is unknown.n"));
  1446. return FALSE;
  1447. }
  1448. #endif //_DEBUG
  1449. switch (g_FSInfo.eCurrFileSysType)
  1450. {
  1451. case eISO9660:
  1452. bSuccess= ISO9660_findNextFile(hFindFile, o_pFindData);
  1453. break;
  1454. case eUDF_Bridge: // Fall-Through!
  1455. case eUDF_102: // Fall-Through!
  1456. case eUDF_200:
  1457. #ifdef FILESYSTEM_SUPPORT_UDF
  1458. bSuccess= UDF_findNextFile(hFindFile, o_pFindData);
  1459. #endif //FILESYSTEM_SUPPORT_UDF
  1460. break;
  1461. #ifdef ENABLE_FILEX
  1462.   case eFileX:
  1463.   {
  1464.       FX_DIR_ENTRY entry;
  1465.       if ( FX_SUCCESS != _fx_directory_next_entry_find_new(&(gpFileX->FileX_media), &entry ) )
  1466.          return FALSE;
  1467.        if ( FX_VOLUME&entry.fx_dir_entry_attributes )
  1468.        {
  1469.         o_pFindData-> uFileType = FILETYPE_VOLUME;
  1470.        } else
  1471.        {
  1472.          _str2wcs(entry.fx_dir_entry_name, o_pFindData->szFileID, 2*(1 + FILEX_FILENAME_LENGTH));
  1473.            if( FX_DIRECTORY&entry.fx_dir_entry_attributes )
  1474.           {
  1475.            o_pFindData-> uFileType = FILETYPE_DIRECTORY;
  1476.           } else
  1477.           {
  1478.             o_pFindData-> uFileType = FILETYPE_NORMAL;
  1479.             o_pFindData-> cbFileSizeHigh = 0;
  1480.             o_pFindData->dwStartAddr = entry.fx_dir_entry_cluster;
  1481.             o_pFindData->cbFileSizeLow = entry.fx_dir_entry_file_size;
  1482.           }
  1483.        }
  1484.        return TRUE;
  1485.   }
  1486. #endif
  1487. }
  1488. return bSuccess;
  1489. }
  1490. /////////////////////////////////////////////////////////////////////////////
  1491. // FileSys_findClose()
  1492. //
  1493. // Description: Terminates a file-search.
  1494. //
  1495. // Input: hFindFile - A Handle to a file-search, that was returned from 
  1496. // a previous call to FileSys_findFirstFile().
  1497. // Output: None
  1498. // In/Out: None
  1499. // Return: TRUE if the search was successfully terminated; FALSE othewise.
  1500. //
  1501. // Remarks:
  1502. // Any search that is initiated via FileSys_findFirstFile() must be terminated
  1503. // using a call to this method, in order to allow for proper release of
  1504. // resources that were allocated for that search.
  1505. BOOL FileSys_findClose(UINT16 hFindFile)
  1506. {
  1507. BOOL bSuccess;
  1508. dbg_printf(("FileSys_findClose() calling.n"));
  1509. #ifdef _DEBUG
  1510. // Sanity check
  1511. if (eUnknown == g_FSInfo.eCurrFileSysType) {
  1512. dbg_printf(("WARNING: FileSys_findClose() Failed [1]: File-System type is unknown.n"));
  1513. return FALSE;
  1514. }
  1515. #endif //_DEBUG
  1516. switch (g_FSInfo.eCurrFileSysType)
  1517. {
  1518. case eISO9660:
  1519. bSuccess= ISO9660_findClose(hFindFile);
  1520. break;
  1521. case eUDF_Bridge: // Fall-Through!
  1522. case eUDF_102: // Fall-Through!
  1523. case eUDF_200:
  1524. #ifdef FILESYSTEM_SUPPORT_UDF
  1525. bSuccess= UDF_findClose(hFindFile);
  1526. #endif //FILESYSTEM_SUPPORT_UDF
  1527. break;
  1528. #ifdef ENABLE_FILEX
  1529.   case eFileX:
  1530.     //nothing to do.
  1531.     bSuccess = TRUE;
  1532.     break;
  1533. #endif
  1534. }
  1535. return bSuccess;
  1536. }
  1537. #ifdef ENABLE_FILEX
  1538. /*
  1539. Desc: Open a file telling it's starting physical cluster number.
  1540.       for read only.
  1541. In:   STRUCT_FILE * file_ptr, pointer to the file control block.
  1542.       DWORD dwStartAddr, starting physical cluster number(or logical sector num for CDROM).
  1543.       UINT32 cbFileSizeHigh, high DWORD for file size in bytes.
  1544.       UINT32 cbFileSizeLow,  low DWORD for file size in bytes.
  1545.       
  1546. ret:  TRUE, succeeds.
  1547.       FALSE, fails.      
  1548. */
  1549. BOOL FileSys_FileOpen(STRUCT_FILE * file_ptr, DWORD dwStartAddr, UINT32 cbFileSizeHigh, UINT32 cbFileSizeLow) 
  1550. {
  1551. BOOL bSuccess;
  1552. dbg_printf(("FileSys_FileOpen() calling.n"));
  1553.    
  1554. switch (g_FSInfo.eCurrFileSysType)
  1555. {
  1556. case eISO9660:    // Fall-Through!
  1557. case eUDF_Bridge: // Fall-Through!
  1558. case eUDF_102: // Fall-Through!
  1559. case eUDF_200:
  1560. case eUnknown:    //file system might be closed.
  1561. bSuccess= CDROM_FileOpen(file_ptr, dwStartAddr, cbFileSizeHigh, cbFileSizeLow);
  1562. break;
  1563. case eFileX:
  1564. bSuccess = (FX_SUCCESS == fx_file_open_by_addr(&(gpFileX->FileX_media), file_ptr, dwStartAddr, cbFileSizeLow));
  1565.   break;
  1566. }
  1567. return bSuccess;
  1568. }
  1569. /*
  1570. Desc: Move the file read pointer to the specified offset.
  1571. In:   STRUCT_FILE * file_ptr, pointer to the file control block.
  1572.       UINT32 cbFileOffsetHigh, high DWORD for offset in bytes.
  1573.       UINT32 cbFileOffsetLow,  low DWORD for offset in bytes.
  1574. */
  1575. BOOL FileSys_FileSeek(STRUCT_FILE * file_ptr, UINT32 cbFileOffsetHigh, UINT32 cbFileOffsetLow)
  1576. {
  1577. BOOL bSuccess;
  1578. dbg_printf(("FileSys_FileSeek() calling.n"));
  1579. switch (g_FSInfo.eCurrFileSysType)
  1580. {
  1581. case eISO9660:    // Fall-Through!
  1582. case eUDF_Bridge: // Fall-Through!
  1583. case eUDF_102: // Fall-Through!
  1584. case eUDF_200:
  1585. case eUnknown:    //file system might be closed.
  1586. bSuccess= CDROM_FileSeek(file_ptr, cbFileOffsetLow);
  1587. break;
  1588. case eFileX:
  1589. bSuccess = (FX_SUCCESS == fx_file_seek(file_ptr, cbFileOffsetLow));
  1590.   break;
  1591. }
  1592. return bSuccess;
  1593. }
  1594. /*
  1595. Desc: Read bytes from file.
  1596. In:   STRUCT_FILE * file_ptr, pointer to the file to read.
  1597.       BYTE * read_buff, the destination buffer.
  1598.       UINT32 request_size, number of bytes to read.
  1599.       UINT32 * actual_size, destination for actual number of bytes read.
  1600. ret:  FileX errors.
  1601. */
  1602. UINT16 FileSys_FileRead(STRUCT_FILE * file_ptr, BYTE * read_buff, UINT32 request_size,UINT32 * actual_size)
  1603. {
  1604. UINT16 res;
  1605. dbg_printf(("FileSys_FileRead() calling.n"));
  1606.    
  1607. switch (g_FSInfo.eCurrFileSysType)
  1608. {
  1609. case eISO9660:    // Fall-Through!
  1610. case eUDF_Bridge: // Fall-Through!
  1611. case eUDF_102: // Fall-Through!
  1612. case eUDF_200:
  1613. res= CDROM_FileRead(file_ptr, read_buff, request_size, actual_size);
  1614. break;
  1615. case eFileX:
  1616.   {
  1617. res= fx_file_read(file_ptr, read_buff, request_size, actual_size);
  1618.       
  1619.   break;
  1620.   }
  1621. case eUnknown:    //file system might be closed.
  1622. return FX_NOT_OPEN;
  1623. }
  1624. return res;
  1625. }
  1626. /*
  1627. Desc: Close the file.
  1628. In:   STRUCT_FILE * file_ptr, pointer to the file to close.
  1629. ret:  TRUE, succeeds.
  1630.       FALSE, fails.  
  1631. */
  1632. BOOL FileSys_FileClose(STRUCT_FILE * file_ptr)
  1633. {
  1634. BOOL res;
  1635. dbg_printf(("FileSys_FileClose() calling.n"));
  1636.    
  1637. switch (g_FSInfo.eCurrFileSysType)
  1638. {
  1639. case eISO9660:    // Fall-Through!
  1640. case eUDF_Bridge: // Fall-Through!
  1641. case eUDF_102: // Fall-Through!
  1642. case eUDF_200:
  1643. case eUnknown:    //file system might be closed.
  1644. res= CDROM_FileClose(file_ptr);
  1645. break;
  1646. case eFileX:
  1647.   {
  1648. res= (FX_SUCCESS == fx_file_close(file_ptr));
  1649.       
  1650.   break;
  1651.   }
  1652. }
  1653. return res;
  1654. /*
  1655. Desc: Is file closed?
  1656. In:   STRUCT_FILE * file_ptr, the file to be checked.
  1657. Out:  TRUE, file is closed.
  1658.       FALSE, file is opened.
  1659. */
  1660. BOOL FileSys_IsFileClosed(STRUCT_FILE * file_ptr)
  1661. {
  1662.   return (FX_FILE_ID != file_ptr->fx_file_id)? TRUE : FALSE;
  1663. }
  1664. #ifndef V882_FLASH_CARD
  1665. /*
  1666. Desc: Get card type.
  1667. ret:  card type.
  1668. */
  1669. CARD_DETECT_TYPE FileSys_GetCardType(void)
  1670. {
  1671. int i;
  1672. CARD_DETECT_TYPE res, res1, res2;
  1673. dbg_printf(("FileSys_GetCardType() calling.n"));
  1674. #ifdef EXTERNAL_CARD_READER
  1675. res= (MEDIA_REMOVED != card_reader_status());
  1676. #endif
  1677. #ifdef INTERNAL_MEM_CARD_READER
  1678. for(i = 0; i < 100; i++)
  1679.    {
  1680. usleep(10000);
  1681. res= FcuMediaCardDetect();
  1682. usleep(10000);
  1683.                       
  1684. res1= FcuMediaCardDetect();
  1685.                       
  1686. usleep(10000);
  1687. res2= FcuMediaCardDetect();
  1688.       if(res == res1 && res1 == res2)
  1689.        break;
  1690. }
  1691. #endif
  1692. return res;
  1693. }
  1694. #endif
  1695. #endif
  1696. /////////////////////////////////////////////////////////////////////////////
  1697. // Protected Methods
  1698. /////////////////////////////////////////////////////////////////////////////
  1699. /////////////////////////////////////////////////////////////////////////////
  1700. // Search-Info Pool Management
  1701. /////////////////////////////////////////////////////////////////////////////
  1702. // _FileSys_resetSearchInfoPool()
  1703. //
  1704. // Description: Resets the Search-Info Pool.
  1705. //
  1706. // Input: uSearchInfoSize - The size, in Bytes, of a single Search-Info.
  1707. // Output: None
  1708. // In/Out: None
  1709. // Return: TRUE if the Search-Info Pool was reset successfully;
  1710. // FALSE otherwise.
  1711. //
  1712. // Remarks:
  1713. // In case a Search-Info Pool already exists, the method destroys the
  1714. // existing Pool, and creates a new one instead.
  1715. BOOL _FileSys_resetSearchInfoPool(UINT8 uSearchInfoSize)
  1716. {
  1717. // Destroy any existing Search-Info Pool
  1718. if (NULL != g_FSInfo.hSearchInfoPool)
  1719. Array_destruct(g_FSInfo.hSearchInfoPool);
  1720. // Construct the Search-Info Pool and clear it
  1721. g_FSInfo.hSearchInfoPool= Array_construct(FILESYSTEM_MAX_CONCURRENT_SEARCHES,
  1722.   uSearchInfoSize, NULL);
  1723. if (NULL == g_FSInfo.hSearchInfoPool) {
  1724. dbg_printf(("WARNING: _FileSys_resetSearchInfoPool() Failed [1]: Low system resourcesn"));
  1725. return FALSE;
  1726. }
  1727. Array_clear(g_FSInfo.hSearchInfoPool);
  1728. // Clear the Search-Info Pool Registry
  1729. memset(g_FSInfo.aSearchInfoPoolRegistry, 0, sizeof(g_FSInfo.aSearchInfoPoolRegistry));
  1730. return TRUE;
  1731. }
  1732. /////////////////////////////////////////////////////////////////////////////
  1733. // _FileSys_allocateSearchInfo()
  1734. //
  1735. // Description: Allocates the next available slot from the Search-Info Pool.
  1736. //
  1737. // Input: None
  1738. // Output: None
  1739. // In/Out: None
  1740. // Return: The ID of the newly allocated Search-Info; NULL if no available
  1741. // Search-Info was found.
  1742. //
  1743. // Remarks:
  1744. // The allocation is protected using a Semaphore, to guarantee consistency
  1745. // of the Search-Info Pool Registry when called from multiple Tasks.
  1746. UINT16 _FileSys_allocateSearchInfo(void)
  1747. {
  1748. UINT8 uRegistryPos, uSlotPos;
  1749. UINT8 uSlotMask= 0x80;
  1750. UINT16 uResult= NULL;
  1751. BYTE *pRegistryByte;
  1752. // TODO
  1753. // Semapore_obtain()
  1754. // Iterate over the Directory-Search Pool Registry, trying to find a
  1755. // Byte that has at least one clear Bit.
  1756. pRegistryByte= &g_FSInfo.aSearchInfoPoolRegistry[0];
  1757. for (uRegistryPos=0; 
  1758.  uRegistryPos < sizeof(g_FSInfo.aSearchInfoPoolRegistry);
  1759.  uRegistryPos++, pRegistryByte++)
  1760. {
  1761. if (0xFF != (*pRegistryByte))
  1762. break;
  1763. }
  1764. // Check if anything was found
  1765. if (0xFF != (*pRegistryByte)) {
  1766. // Locate the first clear Bit inside the Registry-Byte just found
  1767. for (uSlotPos=0; uSlotPos < 8; uSlotPos++) {
  1768. if (0 == ((*pRegistryByte) & uSlotMask))
  1769. break;
  1770. // Move to the next Slot
  1771. uSlotMask >>= 1;
  1772. }
  1773. // Check if a valid Slot was found
  1774. if (FILESYSTEM_MAX_CONCURRENT_SEARCHES > ((uRegistryPos * 8) + uSlotPos)) {
  1775. // Allocate the Slot
  1776. *pRegistryByte |= uSlotMask;
  1777. // Assign the serial-number of the Slot just allocated
  1778. uResult= (1 + ((uRegistryPos * 8) + uSlotPos));
  1779. }
  1780. }
  1781. // TODO:
  1782. // Semaphore_release()
  1783. return uResult;
  1784. }
  1785. /////////////////////////////////////////////////////////////////////////////
  1786. // _FileSys_freeSearchInfo()
  1787. //
  1788. // Description: Frees a Search-Info Pool slot.
  1789. //
  1790. // Input: uSearchInfoID - The ID given to the Search-Info upon allocation.
  1791. // Output: None
  1792. // In/Out: None
  1793. // Return: None
  1794. //
  1795. // Remarks:
  1796. // The deallocation is protected using a Semaphore, to guarantee consistency
  1797. // of the Search-Info Pool Registry when called from multiple Tasks.
  1798. void _FileSys_freeSearchInfo(UINT16 uSearchInfoID)
  1799. {
  1800. UINT8 uRegitryPos, uSlotPos;
  1801. // Make sure that the supplied Slot number is valid
  1802. if ((NULL == uSearchInfoID) ||
  1803. ((uSearchInfoID-1) >= FILESYSTEM_MAX_CONCURRENT_SEARCHES))
  1804. {
  1805. return;
  1806. }
  1807. // TODO:
  1808. // Semaphore_obtain()
  1809. // Calculate the position of the Registry Byte conmtaining this Slot
  1810. uRegitryPos= ((uSearchInfoID-1) / 8);
  1811. // Calculate the Slot position within the Registry Byte
  1812. uSlotPos= ((uSearchInfoID-1) % 8);
  1813. // Free the Slot
  1814. g_FSInfo.aSearchInfoPoolRegistry[uRegitryPos] &= ~(0x80 >> uSlotPos);
  1815. // TODO:
  1816. // Semaphore_release()
  1817. return;
  1818. }
  1819. /////////////////////////////////////////////////////////////////////////////
  1820. // _FileSys_getSearchInfo()
  1821. //
  1822. // Description: Retrieves the contents of a previously allocated Search-Info.
  1823. //
  1824. // Input: uSearchInfoID - The ID of the Search-Info to retrieve.
  1825. // Output: o_pSearchInfo - A container to hold the retrived Search-Info.
  1826. // In/Out: None
  1827. // Return: TRUE if the requested Search-Info was retrieved successfully;
  1828. // FALSE otherwise.
  1829. //
  1830. // Remarks: None
  1831. BOOL _FileSys_getSearchInfo(UINT16 uSearchInfoID, BYTE *o_pSearchInfo)
  1832. {
  1833. return Array_getAt(g_FSInfo.hSearchInfoPool, (uSearchInfoID-1), o_pSearchInfo);
  1834. }
  1835. /////////////////////////////////////////////////////////////////////////////
  1836. // _FileSys_setSearchInfo()
  1837. //
  1838. // Description: Sets the contents of a previously allocated Search-Info.
  1839. //
  1840. // Input: uSearchInfoID - The ID of the Search-Info to set;
  1841. // i_pSearchInfo - Points to a Search-Info to set.
  1842. // Output: None
  1843. // In/Out: None
  1844. // Return: TRUE if the requested Search-Info was set successfully;
  1845. // FALSE otherwise.
  1846. //
  1847. // Remarks: None
  1848. BOOL _FileSys_setSearchInfo(UINT16 uSearchInfoID, const BYTE *i_pSearchInfo)
  1849. {
  1850. return Array_setAt(g_FSInfo.hSearchInfoPool, (uSearchInfoID-1), i_pSearchInfo);
  1851. }
  1852. #ifdef ENABLE_FILEX
  1853. /*
  1854. Desc: Open a file on CDROM media by it's start logical sector number.
  1855. In:   STRUCT_FILE * file, destination file pointer.
  1856.       DWORD dwStartAddr, start logical sector number.
  1857.       UINT32 cbFileSizeHigh, high DWORD of the file size, not used.
  1858.       UINT32 cbFileSizeLow,  low DWORD of the file size.
  1859. ret:  always TRUE.      
  1860. */
  1861. static BOOL CDROM_FileOpen(STRUCT_FILE * file_ptr, DWORD dwStartAddr, UINT32 cbFileSizeHigh, UINT32 cbFileSizeLow) 
  1862. {
  1863.   /* Protect against other threads accessing the media.  */
  1864.   //FX_PROTECT
  1865.   file_ptr->fx_file_id = FX_FILE_ID;
  1866.   
  1867.   //file_ptr->fx_file_name = NULL; //not available
  1868.   
  1869.   /* Define the open mode request.  */
  1870.   file_ptr->fx_file_open_mode = FX_OPEN_FOR_READ;
  1871.     /* Define the file modified field.  */
  1872.   file_ptr->fx_file_modified = FX_FALSE;
  1873.     /* Define the complete directory entry structure.  */
  1874.   //file_ptr->fx_file_dir_entry; //not available, not used by file read.
  1875.     /* Define the data storage parameters.  */
  1876.   //file_ptr->fx_file_total_clusters;
  1877.   file_ptr->fx_file_first_physical_cluster = dwStartAddr;
  1878.   //file_ptr->fx_file_consecutive_cluster;
  1879.   //file_ptr->fx_file_last_physical_cluster;
  1880.   file_ptr->fx_file_current_physical_cluster = file_ptr->fx_file_first_physical_cluster;
  1881.  
  1882.   //file_ptr->fx_file_current_logical_sector = 0;
  1883.   
  1884.   file_ptr->fx_file_current_logical_offset = 0;
  1885.   
  1886.   file_ptr->fx_file_current_relative_cluster = 0;
  1887.   
  1888.   //file_ptr->fx_file_current_relative_sector = 0;
  1889.   
  1890.   file_ptr->fx_file_current_file_offset = 0;
  1891.  
  1892.   file_ptr->fx_file_current_file_size = cbFileSizeLow;
  1893.   file_ptr->fx_file_current_available_size = cbFileSizeLow;
  1894.     /* Remember the media that is associated with this file. */
  1895.   //file_ptr->fx_file_media_ptr = media_ptr;
  1896.     /* Define the pointers necessary to maintain the open file on 
  1897.        the list of open files.  */
  1898.   //file_ptr->fx_file_opened_next;
  1899.   //file_ptr->fx_file_opened_previous;
  1900.   
  1901.   /* Release media protection.  */
  1902. //  FX_UNPROTECT
  1903.   /* Open is complete, return successful status.  */
  1904.   return TRUE;
  1905. }
  1906. /*
  1907. Desc: set the file read pointer to the specified offset for file ON CDROM media.
  1908. In:   STRUCT_FILE *file_ptr, pointer to the file.
  1909.       UINT32 byte_offset, offset in bytes.
  1910. ret:  TRUE, succeeds.
  1911.       FALSE, fails.      
  1912. */
  1913. static BOOL  CDROM_FileSeek(STRUCT_FILE *file_ptr, UINT32 byte_offset)
  1914. {
  1915.   /* Protect against other threads accessing the media.  */
  1916.   //FX_PROTECT
  1917.   /* First, determine if the file is still open.  */
  1918.   if (file_ptr -> fx_file_id != FX_FILE_ID)
  1919.   {
  1920.        /* Return the file not open error status.  */
  1921.        return FALSE;
  1922.   }
  1923.   if(byte_offset >= file_ptr->fx_file_current_available_size)
  1924.    return FALSE;
  1925.   file_ptr->fx_file_current_relative_cluster = byte_offset/LOGICAL_BLOCK_SIZE;
  1926.   file_ptr->fx_file_current_physical_cluster = file_ptr->fx_file_first_physical_cluster + file_ptr->fx_file_current_relative_cluster;
  1927.   file_ptr->fx_file_current_logical_offset = byte_offset%LOGICAL_BLOCK_SIZE;
  1928.   
  1929.   
  1930.   file_ptr->fx_file_current_file_offset = byte_offset;
  1931.  
  1932.  
  1933.   
  1934.   /* Release media protection.  */
  1935. //  FX_UNPROTECT
  1936.   /* Open is complete, return successful status.  */
  1937.   return TRUE;
  1938. }
  1939. /*
  1940. Desc: read bytes from CDROM files.
  1941. in:   FX_FILE *file_ptr, pointer to the file to read.
  1942.       BYTE *buffer_ptr, the destination buffer pointer.
  1943.       UINT32 request_size, bytes to read.
  1944.       UINT32 *actual_size, bytes read.
  1945. ret:  FileX errors.      
  1946. */
  1947. static UINT16 CDROM_FileRead(FX_FILE *file_ptr, BYTE *buffer_ptr, UINT16 request_size, UINT32 *actual_size)
  1948. {
  1949.     /* First, determine if the file is still open.  */
  1950.     if (file_ptr -> fx_file_id != FX_FILE_ID)
  1951.     {
  1952.         /* Return the file not open error status.  */
  1953.         return(FX_NOT_OPEN);
  1954.     }
  1955.     /* Protect against other threads accessing the media.  */
  1956. //    FX_PROTECT
  1957.     /* Next, determine if there is any more bytes to read in the file.  */
  1958.     if (file_ptr -> fx_file_current_file_offset >=
  1959.                                     file_ptr -> fx_file_current_file_size)
  1960.     {
  1961.         /* Release media protection.  */
  1962. //        FX_UNPROTECT
  1963.         /* The file is at the end, return the proper status and set the
  1964.            actual size to 0.  */
  1965.         *actual_size =  0;
  1966.         return(FX_END_OF_FILE);
  1967.     }
  1968.     /* At this point there is something to read.  */
  1969.     /* Determine if there are less bytes left in the file than that specified
  1970.        by the request.  If so, ajust the requested size.  */
  1971.     if (request_size > 
  1972.                 (file_ptr -> fx_file_current_file_size - file_ptr -> fx_file_current_file_offset))
  1973.     {
  1974.         /* Adjust the bytes remaining to what's available.  */
  1975.         request_size =  file_ptr -> fx_file_current_file_size - file_ptr -> fx_file_current_file_offset;
  1976.     }
  1977.     if(FALSE == AuxCache_GetBytes(file_ptr -> fx_file_current_physical_cluster, file_ptr->fx_file_current_logical_offset,
  1978.                              request_size, buffer_ptr))
  1979.     {
  1980.       *actual_size =  0;
  1981.       return FX_IO_ERROR;
  1982.     }
  1983.     else
  1984.     {
  1985.       *actual_size =  request_size;
  1986.       if(CDROM_FileSeek(file_ptr,  file_ptr->fx_file_current_file_offset + request_size))
  1987.         return FX_SUCCESS;
  1988.       else
  1989.         return FX_IO_ERROR;  
  1990.     }
  1991.       
  1992. }
  1993. /*
  1994. Desc: Close CDROM file.
  1995. In:   STRUCT_FILE *file_ptr, pointer to the file to close.
  1996. ret:  TRUE, file is closed.
  1997.       FALSE, file is already closed. 
  1998. */
  1999. static BOOL CDROM_FileClose(STRUCT_FILE *file_ptr)
  2000. {
  2001.     /* First, determine if the file is still open.  */
  2002.     if (file_ptr -> fx_file_id != FX_FILE_ID)
  2003.     {
  2004.         /* Return the file not open error status.  */
  2005.         return FALSE;
  2006.     }
  2007.     
  2008.     /* Finally, Indicate that this file is closed.  */
  2009.     file_ptr -> fx_file_id =  FX_FILE_CLOSED_ID;
  2010.     return TRUE;
  2011. }
  2012. /*
  2013. Desc: reset card reader.
  2014. */  
  2015. extern UINT16 IDE_Reset (VOID);
  2016. static void FileX_destruct(void)
  2017. {
  2018.  fx_media_abort(&(gpFileX->FileX_media));
  2019. #ifdef I86_HW_FCU
  2020.  if(NULL != gpFileX)
  2021.      free(gpFileX);
  2022.     gpFileX = NULL;
  2023. #endif
  2024. #ifdef EXTERNAL_CARD_READER
  2025.     IDE_Reset();
  2026. #endif
  2027. }
  2028. #endif
  2029. BOOL FileSys_close(void)
  2030. {
  2031. // Destroy the instance of the currently-selected Type, if any
  2032. switch (g_FSInfo.eCurrFileSysType)
  2033. {
  2034. case eISO9660:
  2035. ISO9660_destruct();
  2036. break;
  2037. case eUDF_Bridge: // Fall-Through!
  2038. case eUDF_102: // Fall-Through!
  2039. case eUDF_200:
  2040. #ifdef FILESYSTEM_SUPPORT_UDF
  2041. UDF_destruct();
  2042. #endif //FILESYSTEM_SUPPORT_UDF
  2043. break;
  2044. #ifdef ENABLE_FILEX
  2045.   case eFileX:
  2046.     FileX_destruct();
  2047.     break;
  2048. #endif
  2049. }
  2050. g_FSInfo.eCurrFileSysType= eUnknown;
  2051. //<<<MikeX_1125_2003: free search infomation pool
  2052. if (NULL != g_FSInfo.hSearchInfoPool)
  2053. {
  2054. Array_destruct(g_FSInfo.hSearchInfoPool);
  2055. g_FSInfo.hSearchInfoPool = NULL;
  2056. }
  2057. //MikeX_1125_2003>>>
  2058. }
  2059. #ifdef DVD_VR_SUPPORT
  2060. DWORD g_pDVDVR_PlayQueue; //Points to the Play Queue
  2061. BYTE g_DVDVR_PlayQueue_Head; //point to the Play Queue head
  2062. BYTE g_DVDVR_PlayQueue_Tail; // point to the Play Queue tail
  2063. BYTE g_DVDVR_PlayQueue_Size; // extent number in the Play Queue
  2064. BYTE g_DVDVR_ExtentsInFE; // extents number in the Front End
  2065. DVDVR_PLAY_QUEUE_NODE g_lastPlayExtent;
  2066. BOOL g_ExtentIsPlaying;
  2067. /////////////////////////////////////////////////////////////////////////////
  2068. // FileSys_DVDVR_getFileExtent()
  2069. //
  2070. // Description: cache the file extents table to the SDRAM.
  2071. //
  2072. // Input: i_pszFilename - A string holding the name of the requested File,
  2073. // or a pattern to match.
  2074. // Output: o_pFileExtent - Points to the Array which points to the extents 
  2075. //   table of the file.
  2076. // In/Out: None
  2077. // Return: TRUE if the requested file was found and the extents table
  2078. // was successfully retrieved; FALSE otherwise.
  2079. //
  2080. // Remarks:
  2081. // - The value of o_pFileExtent may be NULL, in which case the o_pFileExtent
  2082. //   is not retrieved.
  2083. BOOL FileSys_DVDVR_getFileExtent(LPCWSTR i_pszFilename, DWORD *o_pFileExtent)
  2084. {
  2085. BOOL bRetValue= FALSE;
  2086. LPWSTR pszFilePath= NULL;
  2087. LPCWSTR pszFilename= i_pszFilename;
  2088. dbg_printf(("FileSys_getDVDVRFileExtent() calling.n"));
  2089. #ifdef _DEBUG
  2090. // Sanity check
  2091. if (eUnknown == g_FSInfo.eCurrFileSysType) {
  2092. dbg_printf(("WARNING: FileSys_getDVDVRFileExtent() Failed [1]: File-System type is unknown.n"));
  2093. return FALSE;
  2094. }
  2095. #endif //_DEBUG
  2096. g_ExtentIsPlaying = FALSE;
  2097. // Isolate the File's Path, if the Path-Delimiter is set
  2098. if (g_FSInfo.cPathDelimiter) {
  2099. // Search for the File-Name component
  2100. LPCWSTR pszDelimiter= (LPCWSTR)wcsrchr(i_pszFilename, g_FSInfo.cPathDelimiter);
  2101. if (NULL != pszDelimiter) {
  2102. UINT16 uPathLength= (UINT16)((pszDelimiter - i_pszFilename) / sizeof(WCHAR));
  2103. // Set the Filename to point past the Path-Delimiter
  2104. pszFilename= ++pszDelimiter;
  2105. // Copy only the File's path
  2106. pszFilePath= (LPWSTR)malloc((1 + uPathLength) * sizeof(WCHAR));
  2107. if (NULL == pszFilePath) {
  2108. tr_printf(("FATAL: FileSys_getDVDVRFileExtent() Failed [2]: Low system resources.n"));
  2109. return FALSE;
  2110. }
  2111. wcsncpy(pszFilePath, i_pszFilename, uPathLength);
  2112. pszFilePath[uPathLength]= 0;
  2113. }
  2114. }
  2115. // Prepare for the query
  2116. switch (g_FSInfo.eCurrFileSysType)
  2117. {
  2118. case eISO9660:
  2119. // This query is unsupported by ISO-9660
  2120. bRetValue= FALSE;
  2121. break;
  2122. case eUDF_Bridge: // Fall-Through!
  2123. case eUDF_102: // Fall-Through!
  2124. case eUDF_200:
  2125. #ifdef FILESYSTEM_SUPPORT_UDF
  2126. // Store the current Working-Directory
  2127. UDF_storeWorkingDirectory();
  2128. // Change Working-Directory to the File's Path
  2129. if ((NULL != pszFilePath) && (! FileSys_changeDir(pszFilePath)))
  2130. break;
  2131. // Initiate the search
  2132. bRetValue= UDF_getDVDVRFileExtent(pszFilename, o_pFileExtent);
  2133. // Recall the original Working-Directory
  2134. UDF_recallWorkingDirectory();
  2135. #endif //FILESYSTEM_SUPPORT_UDF
  2136. break;
  2137. }
  2138. // Free the File's Path string
  2139. if (pszFilePath)
  2140. free(pszFilePath);
  2141. return bRetValue;
  2142. }
  2143. /////////////////////////////////////////////////////////////////////////////
  2144. // FileSys_DVDVR_FreeFileExtent()
  2145. //
  2146. // Description: free the file extents table in the SDRAM.
  2147. //
  2148. // Input: i_pFileExtent - Points to the Array which points to the extents 
  2149. //  table of the file.
  2150. // Output: None
  2151. // In/Out: None
  2152. // Return: TRUE if success; FALSE otherwise.
  2153. //
  2154. // Remarks:
  2155. // - The value of i_pFileExtent shouldn't be NULL.
  2156. BOOL FileSys_DVDVR_FreeFileExtent(DWORD i_pFileExtent)
  2157. {
  2158. if(i_pFileExtent !=  (DWORD)NULL)
  2159. Array_destruct(i_pFileExtent);
  2160. else
  2161. return FALSE;
  2162. return TRUE;
  2163. }
  2164. /////////////////////////////////////////////////////////////////////////////
  2165. // FileSys_DVDVR_ReadFile()
  2166. //
  2167. // Description: read some bytes from a file
  2168. //
  2169. // Input: pFileHandle - points to the file extents table
  2170. // dwOffset - the start byte offset in the file
  2171. // dwSize - the bytes number want to read
  2172. //
  2173. // Output: o_pBuffer - Points to the buffer of the output data
  2174. // In/Out: None
  2175. // Return: TRUE if read successfully,FALSE otherwise
  2176. //
  2177. // Remarks:
  2178. // - The pFileHandle should not be NULL, and the dwSize should over the file size.
  2179. BOOL FileSys_DVDVR_ReadFile(DWORD pFileHandle, DWORD dwOffset, DWORD dwSize, BYTE* o_pBuffer)
  2180. {
  2181. dbg_printf(("FileSys_DVDVR_ReadFile(0x%08lx, 0x%08lx, 0x%08lx, 0x%08lx)n",pFileHandle, dwOffset, dwSize, o_pBuffer));
  2182. if( g_FSInfo.eCurrFileSysType != eUDF_200 )
  2183. {
  2184. tr_printf(("FATAL: FileSys_ReadFile() Failed [1]: This function was only used for UDF 2.00.n"));
  2185. return FALSE;
  2186. }
  2187. g_ExtentIsPlaying = FALSE;
  2188. return UDF_ReadFile(pFileHandle, dwOffset, dwSize, o_pBuffer);
  2189. }
  2190. /////////////////////////////////////////////////////////////////////////////
  2191. // UDF_PlayExtents()
  2192. //
  2193. // Description: play a part of a file.
  2194. //
  2195. // Input: pFileHandle - points to the extents table of the playback file
  2196. // dwOffset - start sector number from the file begining
  2197. // dwSize - playback size by sector
  2198. // Output: None
  2199. // In/Out: None
  2200. // Return: TRUE if play successfully,FALSE otherwise
  2201. //
  2202. // Remarks:
  2203. // - the pFileHandle shoulen't NULL.
  2204. BOOL FileSys_DVDVR_PlayExtents(DWORD pFileHandle, DWORD dwOffset, DWORD dwSize)
  2205. {
  2206. dbg_printf(("FileSys_DVDVR_PlayExtents(0x%08lx, 0x%08lx, 0x%08lx)n",pFileHandle, dwOffset, dwSize));
  2207. if( g_FSInfo.eCurrFileSysType != eUDF_200 )
  2208. {
  2209. tr_printf(("FATAL: FileSys_PlayExtents() Failed [1]: This function was only used for UDF 2.00.n"));
  2210. return FALSE;
  2211. }
  2212. return UDF_PlayExtents(pFileHandle, dwOffset, dwSize);
  2213. }
  2214. /////////////////////////////////////////////////////////////////////////////
  2215. // FileSys_DVDVR_PlayQueue_NextExtent()
  2216. //
  2217. // Description: play next extent in the Play Queue.
  2218. //
  2219. // Input: None
  2220. // Output: None
  2221. // In/Out: None
  2222. // Return: TRUE if play successfully,FALSE otherwise
  2223. //
  2224. // Remarks:
  2225. // - the Play Queue shouldn't be empty.
  2226. BOOL FileSys_DVDVR_PlayQueue_NextExtent()
  2227. {
  2228. dbg_printf(("FileSys_DVDVR_PlayQueue_NextExtent()"));
  2229. if(g_DVDVR_ExtentsInFE >0)
  2230. {
  2231. tr_printf(("FATAL:FileSys_DVDVR_PlayQueue_NextExtent() Failed [1]: There aren't playing items in FE!n"));
  2232. return FALSE;
  2233. }
  2234. //g_DVDVR_ExtentsInFE--;//Move to DRV to decrease this value after DRV finished one extent.
  2235. g_ExtentIsPlaying = FALSE;
  2236. if( g_DVDVR_PlayQueue_Size == 0 && g_DVDVR_ExtentsInFE == 0 )
  2237. return FALSE;
  2238. UDF_TransferExtentToFE();
  2239. if( g_DVDVR_PlayQueue_Size == 0 )
  2240. { //this playback is only one extent.
  2241. ie_send_ex(IE_CORE_PLAYBACK_FINISHIED,(void*)QUE_PlaybackFinished);
  2242. }
  2243. return TRUE;
  2244. }
  2245. /////////////////////////////////////////////////////////////////////////////
  2246. // FileSys_DVDVR_PlayQueue_NextExtent()
  2247. //
  2248. // Description: construct a Play Queue.
  2249. //
  2250. // Input: None
  2251. // Output: None
  2252. // In/Out: None
  2253. // Return: TRUE if play successfully,FALSE otherwise
  2254. //
  2255. // Remarks:
  2256. BOOL FileSys_DVDVR_PlayQueue_Construct()
  2257. {
  2258. dbg_printf(("FileSys_DVDVR_PlayQueue_Construct()"));
  2259. g_pDVDVR_PlayQueue=Array_construct(DVDVR_PLAY_QUEUE_SIZE, sizeof(DVDVR_PLAY_QUEUE_NODE),NULL);
  2260. if( g_pDVDVR_PlayQueue == (DWORD)NULL )
  2261. {
  2262. tr_printf(("FATAL: FileSys_PlayQueue_Construct() Failed [1]: Low system resources.n"));
  2263. return FALSE;
  2264. }
  2265. Array_clear(g_pDVDVR_PlayQueue);
  2266. g_DVDVR_PlayQueue_Head=0;
  2267. g_DVDVR_PlayQueue_Tail=0;
  2268. g_DVDVR_PlayQueue_Size=0;
  2269. g_DVDVR_ExtentsInFE=0;
  2270. g_ExtentIsPlaying = FALSE;
  2271. g_lastPlayExtent.dwStartLBN = 0UL;
  2272. g_lastPlayExtent.dwLength = 0UL;
  2273. return TRUE;
  2274. }
  2275. /////////////////////////////////////////////////////////////////////////////
  2276. // FileSys_DVDVR_PlayQueue_Clear()
  2277. //
  2278. // Description: clear the Play Queue.
  2279. //
  2280. // Input: None
  2281. // Output: None
  2282. // In/Out: None
  2283. // Return: TRUE if play successfully,FALSE otherwise
  2284. //
  2285. // Remarks:
  2286. void FileSys_DVDVR_PlayQueue_Clear()
  2287. {
  2288. dbg_printf(("FileSys_DVDVR_PlayQueue_Clear()"));
  2289. Array_clear(g_pDVDVR_PlayQueue);
  2290. g_DVDVR_PlayQueue_Head=0;
  2291. g_DVDVR_PlayQueue_Tail=0;
  2292. g_DVDVR_PlayQueue_Size=0;
  2293. g_DVDVR_ExtentsInFE=0;
  2294. g_ExtentIsPlaying = FALSE;
  2295. g_lastPlayExtent.dwStartLBN = 0UL;
  2296. g_lastPlayExtent.dwLength = 0UL;
  2297. return;
  2298. }
  2299. /////////////////////////////////////////////////////////////////////////////
  2300. // FileSys_DVDVR_PlayQueue_Destruct()
  2301. //
  2302. // Description: destruct the Play Queue.
  2303. //
  2304. // Input: None
  2305. // Output: None
  2306. // In/Out: None
  2307. // Return: TRUE if play successfully,FALSE otherwise
  2308. //
  2309. // Remarks:
  2310. void FileSys_DVDVR_PlayQueue_Destruct()
  2311. {
  2312. dbg_printf(("FileSys_DVDVR_PlayQueue_Destruct()"));
  2313. Array_destruct(g_pDVDVR_PlayQueue);
  2314. g_DVDVR_PlayQueue_Head=0;
  2315. g_DVDVR_PlayQueue_Tail=0;
  2316. g_DVDVR_PlayQueue_Size=0;
  2317. g_DVDVR_ExtentsInFE=0;
  2318. g_ExtentIsPlaying = FALSE;
  2319. g_lastPlayExtent.dwStartLBN = 0UL;
  2320. g_lastPlayExtent.dwLength = 0UL;
  2321. return;
  2322. }
  2323. #endif