My Project
ParaFile.h
1 #pragma once
2 #include <list>
3 #include <vector>
4 #include <string>
5 
6 namespace ParaEngine
7 {
8  struct CParaFileInfo;
9  class CArchive;
10 
11  using namespace std;
12 
15  {
16  FILE_NOT_FOUND = 0,
17  FILE_ON_DISK = 1,
18  FILE_ON_ZIP_ARCHIVE = 2,
19  FILE_ON_SEARCH_PATH = 4,
20  FILE_ON_EXECUTABLE = 8, // embedded resource file
21  };
22 
31  class CParaFile
32  {
33  // disable copying
34  CParaFile(const CParaFile &f);
35 
36  private:
37  static string m_strExtractRootPath;
38  static bool m_bExtractFileToDisk;
40  static int m_nDiskFilePriority;
41  public:
45  PE_CORE_DECL CParaFile();
46 
55  PE_CORE_DECL CParaFile(char* buf, int nBufferSize, bool bCopyBuffer = false);
56 
61  PE_CORE_DECL CParaFile(const char* filename);
69  PE_CORE_DECL CParaFile(const char* filename, const char* relativePath);
70  PE_CORE_DECL ~CParaFile();
71  // static method
72  public:
74  PE_CORE_DECL static bool CreateDirectory(const char* filename);
75 
79  PE_CORE_DECL static bool MakeDirectoryFromFilePath(const char * filename);
80 
86 #ifdef WIN32
87  PE_CORE_DECL static void ToCanonicalFilePath(string & output, const string& input, bool bBackSlash = true);
88 #else
89  PE_CORE_DECL static void ToCanonicalFilePath(string & output, const string& input, bool bBackSlash = false);
90 #endif
91 
94 #ifdef WIN32
95  PE_CORE_DECL static void ToCanonicalFilePath(char* output, const char* input, bool bBackSlash = true);
96 #else
97  PE_CORE_DECL static void ToCanonicalFilePath(char* output, const char* input, bool bBackSlash = false);
98 #endif
99 
106  PE_CORE_DECL static bool DoesFileExist(const char* filename, bool bSearchZipFiles = false, bool bUseSearchPath = false);
107 
113  static int32 DoesFileExist2(const char* filename, uint32 dwWhereToSearch = FILE_ON_DISK, std::string* pDiskFilePath = NULL);
114 
124  static bool IsAbsolutePath(const std::string& path);
125 
131  PE_CORE_DECL static int DeleteTempFile(const string& sFilePattern);
138  PE_CORE_DECL static int DeleteFile(const string& sFilePattern, bool bSecureFolderOnly = true);
139 
146  PE_CORE_DECL static bool MoveFile(const char* src, const char* dest);
147 
153  PE_CORE_DECL static bool BackupFile(const char* filename);
154 
159  PE_CORE_DECL static unsigned long CRC32(const char* filename);
160 
169  PE_CORE_DECL static bool CopyFile(const char* src, const char* dest, bool bOverride);
170 
179  PE_CORE_DECL static string GetParentDirectoryFromPath(const string& sfilename, int nParentCounts = 0);
180 
186  PE_CORE_DECL static string AutoFindParaEngineRootPath(const string& sFile);
193  PE_CORE_DECL static string ChangeFileExtension(const string& sFile, const string & sExt);
194 
196  PE_CORE_DECL static string GetFileExtension(const string& sFile);
197 
207  PE_CORE_DECL static string GetRelativePath(const string& sAbsolutePath, const string& sRootPath);
208 
217  PE_CORE_DECL static string GetAbsolutePath(const string& sRelativePath, const string& sRootPath);
218 
222  PE_CORE_DECL static string GetFileName(const string& sFilePath);
223 
225  PE_CORE_DECL static bool IsFileName(const string& sFilePath);
226 
228  PE_CORE_DECL static int GetFileSize(const char* sFilePath);
229 
234  PE_CORE_DECL static const std::string& GetWritablePath();
235 
237  PE_CORE_DECL static void SetWritablePath(const std::string& writable_path);
239  PE_CORE_DECL static bool IsWritablePath(const std::string& filepath, bool bLogWarning = true);
240 
241  enum PARAENGINE_DIRECTORY{
242  APP_ROOT_DIR = 0,
243  APP_SCRIPT_DIR = 1,
244  APP_ARCHIVE_DIR = 2, // xmodels
245  APP_MODEL_DIR = 3,
246  APP_SHADER_DIR = 4,
247  APP_DATABASE_DIR = 5,
248  APP_TEMP_DIR = 6,
249  APP_USER_DIR = 7,
250  APP_BACKUP_DIR = 8,
251  APP_SCREENSHOT_DIR = 9,
252  APP_PLUGIN_DIR = 10,
253  APP_CONFIG_DIR = 11,
254  APP_CHARACTER_DIR = 12,
255  APP_SH_DESKTOP_DIR = 13,
256  APP_SH_DESKTOP_FOLDER_DIR = 14,
257  APP_SH_MYDOC_DIR = 15,
258  APP_SH_FAV_DIR = 16,
259  APP_SH_MUSIC_DIR = 17,
260  APP_SH_PICTURE_DIR = 18,
261  APP_SH_VIDEO_DIR = 19,
262  APP_DEV_DIR = 20,
263  APP_EXECUTABLE_DIR = 21,
264  APP_LAST_DIR,
265  };
266 
272  PE_CORE_DECL static const string& GetCurDirectory(DWORD dwDirectoryType);
273 
275  PE_CORE_DECL static void SetDevDirectory(const string& sFilePath);
276  PE_CORE_DECL static const string& GetDevDirectory();
277  public:
282  static void SetDiskFilePriority(int nPriority);
283 
288  static int GetDiskFilePriority();
289 
310  PE_CORE_DECL bool OpenFile(const char* filename, bool bReadyOnly = true, const char* relativePath = NULL, bool bUseCompressed = false, uint32 dwWhereToOpen = FILE_ON_DISK | FILE_ON_ZIP_ARCHIVE | FILE_ON_SEARCH_PATH);
311 
313  PE_CORE_DECL bool OpenFile(CArchive* pArchive, const char* filename, bool bUseCompressed = false);
314 
318  PE_CORE_DECL static bool GetFileInfo(const char* filename, CParaFileInfo& fileInfo, uint32 dwWhereToOpen = FILE_ON_DISK | FILE_ON_ZIP_ARCHIVE | FILE_ON_SEARCH_PATH);
319 
330  PE_CORE_DECL int OpenAssetFile(const char* filename, bool bDownloadIfNotUpToDate = true, const char* relativePath = NULL);
331 
333  PE_CORE_DECL static bool DoesAssetFileExist(const char* filename);
334  PE_CORE_DECL static bool DoesAssetFileExist2(const char* filename, bool bSearchZipFile = false);
335 
340  PE_CORE_DECL bool Decompress();
341 
343  PE_CORE_DECL bool IsCompressed();
344 
346  PE_CORE_DECL void SetIsCompressed(bool bCompressed);
347 
351  PE_CORE_DECL bool CreateNewFile(const char* filename, bool bAutoMakeFilePath = true);
355  PE_CORE_DECL void GiveupBufferOwnership();
356  PE_CORE_DECL void TakeBufferOwnership();
357 
362  PE_CORE_DECL bool ExtractFileToDisk(const string& filenameDest, bool bReplace);
367  PE_CORE_DECL static void SetExtractFileProperty(bool bExtractFile);
369  PE_CORE_DECL static bool GetExtractFileProperty();
370 
371 
376  PE_CORE_DECL static bool UnzipMemToFile(const char* buffer, int nSize, const char* destFilename, bool bAutoMakeDirectory);
377 
379  //
380  // file writing
381  //
383 
386  PE_CORE_DECL int write(const void* src, int bytes);
390  PE_CORE_DECL int WriteString(const string& sStr);
396  PE_CORE_DECL int WriteString(const char* sStr, int nLen = 0);
398  PE_CORE_DECL int WriteFormated(const char *, ...);
399 
400  inline int WriteDWORD(DWORD data){ return write(&data, sizeof(data)); }
401  inline int WriteWORD(WORD data) { return write(&data, sizeof(data)); }
402 
403 
414  void SetFilePointer(int lDistanceToMove, int dwMoveMethod);
415 
422  bool SetEndOfFile();
423 
425  //
426  // file reading: byte based
427  //
429 
431  PE_CORE_DECL size_t read(void* dest, size_t bytes);
432 
434  inline DWORD ReadDWORD(){ DWORD data; read(&data, 4); return data; }
436  inline WORD ReadWORD(){ WORD data; read(&data, 2); return data; }
437 
439  inline BYTE ReadByte(){ BYTE data; read(&data, 1); return data; }
440  inline int WriteByte(BYTE data){ return write(&data, 1); }
441 
443  DWORD ReadDWORD_LE();
445  WORD ReadWORD_LE();
446 
450  uint32_t ReadEncodedUInt();
452  int WriteEncodedUInt(uint32_t value);
453 
463  PE_CORE_DECL int GetNextLine(char* buf, int sizeBuf);
468  PE_CORE_DECL int SkipComment();
473  PE_CORE_DECL int SkipEqualMark();
474 
480  PE_CORE_DECL int SkipString(const char* sName);
481 
483  PE_CORE_DECL int SkipCurrentLine();
484 
502  PE_CORE_DECL bool GetNextAttribute(const char * sName, string& output);
504  PE_CORE_DECL bool GetNextAttribute(const char * sName, float& output);
506  PE_CORE_DECL bool GetNextAttribute(const char * sName, double& output);
508  PE_CORE_DECL bool GetNextAttribute(const char * sName, int& output);
510  PE_CORE_DECL bool GetNextAttribute(const char * sName, bool& output);
511 
514  PE_CORE_DECL bool GetNextAttribute(const char * sName);
515 
524  template <class TYPE_ARG1>
525  bool GetNextFormatted(const char * sFormat, TYPE_ARG1 a1)
526  {
527  bool bSucceed = false;
528  SkipComment();
529  size_t nOldPos = m_curPos;
530 
531  if (isEof())
532  return false;
533 
534  const char* pSrc = getPointer();
535 #ifdef WIN32
536  if (_snscanf(pSrc, m_size - m_curPos, sFormat, a1) >= 1)
537 #else
538  if (sscanf(pSrc, sFormat, a1) >= 1)
539 #endif
540  {
541  bSucceed = true;
542  SkipCurrentLine();
543  }
544  else
545  m_curPos = nOldPos;
546 
547  return bSucceed;
548  }
549  template <class TYPE_ARG1, class TYPE_ARG2>
550  bool GetNextFormatted(const char * sFormat, TYPE_ARG1 a1, TYPE_ARG2 a2)
551  {
552  bool bSucceed = false;
553  SkipComment();
554  size_t nOldPos = m_curPos;
555 
556  if (isEof())
557  return false;
558 
559  const char* pSrc = getPointer();
560 #ifdef WIN32
561  if (_snscanf(pSrc, m_size - m_curPos, sFormat, a1, a2) >= 2)
562 #else
563  if (sscanf(pSrc, sFormat, a1, a2) >= 2)
564 #endif
565  {
566  bSucceed = true;
567  SkipCurrentLine();
568  }
569  else
570  m_curPos = nOldPos;
571 
572  return bSucceed;
573  }
574 
575  template <class TYPE_ARG1, class TYPE_ARG2, class TYPE_ARG3>
576  bool GetNextFormatted(const char * sFormat, TYPE_ARG1 a1, TYPE_ARG2 a2, TYPE_ARG3 a3)
577  {
578  bool bSucceed = false;
579  SkipComment();
580  size_t nOldPos = m_curPos;
581 
582  if (isEof())
583  return false;
584 
585  const char* pSrc = getPointer();
586 #ifdef WIN32
587  if (_snscanf(pSrc, m_size - m_curPos, sFormat, a1, a2, a3) >= 3)
588 #else
589  if (sscanf(pSrc, sFormat, a1, a2, a3) >= 3)
590 #endif
591  {
592  bSucceed = true;
593  SkipCurrentLine();
594  }
595  else
596  m_curPos = nOldPos;
597 
598  return bSucceed;
599  }
600 
602  //
603  // common file interface functions
604  //
606 
608  PE_CORE_DECL const string& GetFileName();
609 
610  PE_CORE_DECL size_t getSize();
611  PE_CORE_DECL size_t getPos();
612  PE_CORE_DECL char* getBuffer();
613  PE_CORE_DECL inline char* getPointer(){ return m_buffer + m_curPos; }
614 
615  PE_CORE_DECL bool isEof();
616  PE_CORE_DECL void seek(int offset);
617  PE_CORE_DECL void seekRelative(int offset);
618  PE_CORE_DECL void close();
619 
621  //
622  // bit wise reading
623  //
625 
629  PE_CORE_DECL void synchBits();
630 
634  PE_CORE_DECL unsigned int readUBits(int numBits);
638  PE_CORE_DECL int readSBits(int numBits);
639 
640 
642  void* GetHandlePtr();
643  private:
645  FileHandle m_handle;
647  bool m_eof : 1;
649  bool m_bIsOwner : 1;
651  bool m_bDiskFileOpened : 1;
653  bool m_bIsCompressed : 1;
655  bool m_bMemoryFile : 1;
656  // Force alignment to next boundary.
657  DWORD: 0;
659  char *m_buffer;
661  size_t m_curPos;
663  size_t m_size;
665  size_t m_uncompressed_size;
666 
668  string m_filename;
669  //--Bit buffer..This is only used for bit wise reading
670  int m_bitBuf;
671  int m_bitPos; // a value in range [0,8]
672  };
673 }
file archiver base class.
Definition: Archive.h:24
a file handle in a Archive
Definition: FileHandle.h:13
file information.
Definition: FileUtils.h:11
bool GetNextFormatted(const char *sFormat, TYPE_ARG1 a1)
this is similar to GetNextAttribute().
Definition: ParaFile.h:525
different physics engine has different winding order.
Definition: EventBinding.h:32
WORD ReadWORD()
read WORD
Definition: ParaFile.h:436
DWORD ReadDWORD()
read DWORD
Definition: ParaFile.h:434
FileLocation
where to search the file and where the file is found
Definition: ParaFile.h:14
Definition: enum_maker.hpp:46
it presents a real or virtual file in ParaEngine.
Definition: ParaFile.h:31
BYTE ReadByte()
read WORD
Definition: ParaFile.h:439