1 /*
2  * HLLib
3  * Copyright (C) 2006-2010 Ryan Gregg
4 
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later
9  * version.
10  */
11 
12 #ifndef XZPFILE_H
13 #define XZPFILE_H
14 
15 #include "stdafx.h"
16 #include "Package.h"
17 
18 namespace HLLib
19 {
20 	class HLLIB_API CXZPFile : public CPackage
21 	{
22 	private:
23 		#pragma pack(1)
24 
25 		struct XZPHeader
26 		{
27 			hlChar lpSignature[4];
28 			hlUInt uiVersion;
29 			hlUInt uiPreloadDirectoryEntryCount;
30 			hlUInt uiDirectoryEntryCount;
31 			hlUInt uiPreloadBytes;
32 			hlUInt uiHeaderLength;
33 			hlUInt uiDirectoryItemCount;
34 			hlUInt uiDirectoryItemOffset;
35 			hlUInt uiDirectoryItemLength;
36 		};
37 
38 		struct XZPDirectoryEntry
39 		{
40 			hlUInt uiFileNameCRC;
41 			hlUInt uiEntryLength;
42 			hlUInt uiEntryOffset;
43 		};
44 
45 		struct XZPDirectoryMapping
46 		{
47 			hlUInt16 uiPreloadDirectoryEntryIndex;
48 		};
49 
50 		struct XZPDirectoryItem
51 		{
52 			hlUInt uiFileNameCRC;
53 			hlUInt uiNameOffset;
54 			hlUInt uiTimeCreated;
55 		};
56 
57 		struct XZPFooter
58 		{
59 			hlUInt uiFileLength;
60 			hlChar lpSignature[4];
61 		};
62 
63 		#pragma pack()
64 
65 	private:
66 		static const char *lpAttributeNames[];
67 		static const char *lpItemAttributeNames[];
68 
69 		Mapping::CView *pHeaderView;
70 		Mapping::CView *pDirectoryEntryView;
71 		Mapping::CView *pDirectoryItemView;
72 		Mapping::CView *pFooterView;
73 
74 		const XZPHeader *pHeader;
75 		const XZPDirectoryEntry *lpDirectoryEntries;
76 		const XZPDirectoryEntry *lpPreloadDirectoryEntries;
77 		const XZPDirectoryMapping *lpPreloadDirectoryMappings;
78 		const XZPDirectoryItem *lpDirectoryItems;
79 		const XZPFooter *pFooter;
80 
81 	public:
82 		CXZPFile();
83 		virtual ~CXZPFile();
84 
85 		virtual HLPackageType GetType() const;
86 		virtual const hlChar *GetExtension() const;
87 		virtual const hlChar *GetDescription() const;
88 
89 	protected:
90 		virtual hlBool MapDataStructures();
91 		virtual hlVoid UnmapDataStructures();
92 
93 		virtual CDirectoryFolder *CreateRoot();
94 
95 		virtual hlUInt GetAttributeCountInternal() const;
96 		virtual const hlChar *GetAttributeNameInternal(HLPackageAttribute eAttribute) const;
97 		virtual hlBool GetAttributeInternal(HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
98 
99 		virtual hlUInt GetItemAttributeCountInternal() const;
100 		virtual const hlChar *GetItemAttributeNameInternal(HLPackageAttribute eAttribute) const;
101 		virtual hlBool GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
102 
103 		virtual hlBool GetFileSizeInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
104 		virtual hlBool GetFileSizeOnDiskInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
105 
106 		virtual hlBool CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStream *&pStream) const;
107 	};
108 }
109 
110 #endif
111