"L. Spiro Engine"
|
00001 00017 #ifndef __LSF_FILELIB_H__ 00018 #define __LSF_FILELIB_H__ 00019 00020 // Include the memory library. 00021 #include "LSAMemLib.h" 00022 using namespace ::lsa; 00023 00024 // Include the threading library. 00025 #include "LSHThreadLib.h" 00026 using namespace ::lsh; 00027 00028 // Include the standard library. 00029 #include "LSSTDStandardLib.h" 00030 using namespace ::lsstd; 00031 00032 // Include the LSTL. 00033 #include "LSTLib.h" 00034 using namespace ::lstl; 00035 00036 00037 #if defined( LSE_WINDOWS ) 00038 #include "Windows/LSSTDWindows.h" 00039 00040 // Max file path. 00041 #define LSF_MAX_PATH MAX_PATH 00042 00043 #elif defined( LSE_MAC ) // Macintosh uses standard C fopen() and etc. 00044 #include <CoreFoundation/CoreFoundation.h> 00045 00046 // Max file path. 00047 #define LSF_MAX_PATH PATH_MAX 00048 00049 #endif // #if defined( LSE_WINDOWS ) 00050 00051 00052 // TODO: Learn and add the headers for other systems. 00053 00054 00055 namespace lsf { 00056 00057 // == Enumerations. 00061 enum LSF_OPEN_FILE { 00062 #ifdef LSE_WINDOWS 00063 LSF_OF_READ = FILE_READ_DATA, 00064 LSF_OF_WRITE = FILE_WRITE_DATA, 00065 LSF_OF_APPEND = FILE_APPEND_DATA, 00066 #elif defined( LSE_MAC ) 00067 LSF_OF_READ = (1 << 0), 00068 LSF_OF_WRITE = (1 << 1), 00069 LSF_OF_APPEND = (1 << 2), 00070 #endif // LSE_WINDOWS 00071 }; 00072 00073 00074 // == Types. 00075 #ifdef LSE_WINDOWS 00076 // A few namespace-specific types. 00077 typedef HANDLE LSF_FILE; 00078 00082 enum LSF_SEEK { 00083 LSF_S_BEGIN = FILE_BEGIN, 00084 LSF_S_CURRENT = FILE_CURRENT, 00085 LSF_S_END = FILE_END 00086 }; 00087 00091 typedef struct LSF_FILE_MAP { 00092 // Handle for the open file. 00093 HANDLE hFile; 00094 00095 // Handle for the file map. 00096 HANDLE hFileMap; 00097 00098 // Mapping mode. 00099 LSUINT32 ui32Mode; 00100 00101 } * LPLSF_FILE_MAP, * const LPCLSF_FILE_MAP; 00102 #elif defined( LSE_MAC ) 00103 typedef FILE * LSF_FILE; 00104 00108 enum LSF_SEEK { 00109 LSF_S_BEGIN = SEEK_SET, 00110 LSF_S_CURRENT = SEEK_CUR, 00111 LSF_S_END = SEEK_END 00112 }; 00113 00117 typedef struct LSF_FILE_MAP { 00118 // Handle for the open file and later close. 00119 int iFile; 00120 00121 // Mapping mode. 00122 LSUINT32 ui32Mode; 00123 } * LPLSF_FILE_MAP, * const LPCLSF_FILE_MAP; 00124 #endif // LSE_WINDOWS 00125 00126 00127 00135 class CFileLib { 00136 public : 00137 00138 // == Functions. 00148 static LSF_FILE LSE_CALL OpenFile( const LSCHAR * _pcFile, LSF_OPEN_FILE _ofOpenType, LSBOOL _bOpenAlways ); 00149 00158 static LSBOOL LSE_CALL CloseFile( LSF_FILE &_fFile ); 00159 00170 static LSBOOL LSE_CALL ReadFile( LSF_FILE _fFile, LSVOID * _pvBuffer, LSUINTPTR _uiptrBytesToRead ); 00171 00182 static LSBOOL LSE_CALL WriteFile( LSF_FILE _fFile, const LSVOID * _pvBuffer, LSUINTPTR _uiptrBytesToWrite ); 00183 00192 static LSBOOL LSE_CALL SetFilePointer( LSF_FILE _fFile, LSINT64 _i64DistanceToMove, LSF_SEEK _sMoveMethod ); 00193 00200 static LSUINT64 LSE_CALL GetFilePointer( LSF_FILE _fFile ); 00201 00213 static LSBOOL LSE_CALL CreateFileMap( const LSCHAR * _pcFile, LSF_OPEN_FILE _ofOpenType, 00214 LSF_FILE_MAP &_fmMap ); 00215 00227 static LSBOOL LSE_CALL CreateFileMap( const LSWCHAR_T * _pwcFile, LSF_OPEN_FILE _ofOpenType, 00228 LSF_FILE_MAP &_fmMap ); 00229 00236 static LSVOID LSE_CALL DestroyFileMap( LSF_FILE_MAP &_fmMap ); 00237 00248 static LSVOID * LSE_CALL Map( const LSF_FILE_MAP &_fmMap, LSUINT64 _ui64Offset, 00249 LSUINTPTR _uiptrLen ); 00250 00257 static LSVOID LSE_CALL UnMap( const LSVOID * _pvAddr, LSUINTPTR _uiptrLen ); 00258 00265 static LSBOOL LSE_CALL CanWriteToFileMap( const LSF_FILE_MAP &_fmMap ); 00266 00272 static LSUINT32 LSE_CALL GetPageSize(); 00273 00280 static LSUINT64 LSE_CALL GetFileSize( LSF_FILE _fFile ); 00281 00288 static LSUINT64 LSE_CALL GetFileSize( const LSCHAR * _pcFile ); 00289 00296 static LSUINT64 LSE_CALL GetFileSize( const LSWCHAR_T * _pwcFile ); 00297 00305 static LSBOOL LSE_CALL Exists( const LSCHAR * _pcFile ); 00306 00314 static LSBOOL LSE_CALL Exists( const LSWCHAR_T * _pwcFile ); 00315 00325 static LSCHAR * LSE_CALL GetSelfDir( LSCHAR * _pcRet ); 00326 00336 static LSWCHAR_T * LSE_CALL GetSelfDir( LSWCHAR_T * _pwcRet ); 00337 00347 static LSCHAR * LSE_CALL ExpandPath( const LSCHAR * _pcPath, LSCHAR * _pcRet ); 00348 00357 static LSWCHAR_T * LSE_CALL ExpandPath( const LSWCHAR_T * _pwcPath, LSWCHAR_T * _pwcRet ); 00358 00368 static LSCHAR * LSE_CALL ExpandResourcePath( const LSCHAR * _pcPath, LSCHAR * _pcRet ); 00369 00378 static LSCHAR * LSE_CALL NoExtension( LSCHAR * _pcPath ); 00379 00387 static LSWCHAR_T * LSE_CALL NoExtension( LSWCHAR_T * _pwcPath ); 00388 00398 static LSCHAR * LSE_CALL NoPath( LSCHAR * _pcPath ); 00399 00408 static LSWCHAR_T * LSE_CALL NoPath( LSWCHAR_T * _pwcPath ); 00409 00419 static LSCHAR * LSE_CALL NoFile( LSCHAR * _pcPath ); 00420 00430 static LSWCHAR_T * LSE_CALL NoFile( LSWCHAR_T * _pwcPath ); 00431 00437 static LSINT32 LSE_CALL Eof(); 00438 00444 static LSVOID LSE_CALL SetResPath( const LSCHAR * _pcPath ); 00445 00451 static LSE_INLINE const LSCHAR * LSE_CALL 00452 GetResPath(); 00453 00454 00455 protected : 00459 static LSCHAR m_szResourcePath[LSF_MAX_PATH]; 00460 00464 static LSUINT32 m_ui32ResPathLen; 00465 }; 00466 00467 // == Functions. 00473 LSE_INLINE const LSCHAR * LSE_CALL CFileLib::GetResPath() { 00474 return m_szResourcePath; 00475 } 00476 00477 } // namespace lsf 00478 00479 #endif // __LSF_FILELIB_H__