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