1 #ifndef _PSFFS_H_ 2 #define _PSFFS_H_ 3 4 #include "PsfBase.h" 5 #include <list> 6 7 class CPsfFs 8 { 9 public: 10 CPsfFs(); 11 virtual ~CPsfFs(); 12 13 void AppendArchive(const CPsfBase&); 14 Framework::CStream* GetFile(const char*); 15 16 private: 17 struct NODE 18 { NODENODE19 NODE() 20 : offset(0) 21 , size(0) 22 , blockSize(0) 23 { 24 name[0] = 0; 25 } 26 ~NODENODE27 virtual ~NODE() 28 { 29 } 30 IsDirectoryNODE31 bool IsDirectory() const 32 { 33 return (size == 0 && blockSize == 0 && offset != 0); 34 } 35 36 char name[37]; 37 uint32 offset; 38 uint32 size; 39 uint32 blockSize; 40 }; 41 42 struct FILE : public NODE 43 { FILEFILE44 FILE(const NODE& baseNode) 45 : NODE(baseNode) 46 { 47 data = new uint8[baseNode.size]; 48 } 49 ~FILEFILE50 virtual ~FILE() 51 { 52 delete[] data; 53 } 54 55 uint8* data; 56 }; 57 58 struct DIRECTORY : public NODE 59 { 60 typedef std::list<NODE*> FileListType; 61 DIRECTORYDIRECTORY62 DIRECTORY() 63 { 64 } 65 DIRECTORYDIRECTORY66 DIRECTORY(const NODE& baseNode) 67 : NODE(baseNode) 68 { 69 } 70 ~DIRECTORYDIRECTORY71 virtual ~DIRECTORY() 72 { 73 for(FileListType::const_iterator nodeIterator(fileList.begin()); 74 fileList.end() != nodeIterator; nodeIterator++) 75 { 76 delete(*nodeIterator); 77 } 78 } 79 80 FileListType fileList; 81 }; 82 83 static void ReadFile(Framework::CStream&, FILE&); 84 static void ReadDirectory(Framework::CStream&, DIRECTORY&); 85 86 const FILE* GetFileDetail(const DIRECTORY&, const char*) const; 87 static NODE* GetFileFindNode(const DIRECTORY&, const char*); 88 89 DIRECTORY m_root; 90 }; 91 92 #endif 93