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 PACKAGE_H
13 #define PACKAGE_H
14 
15 #include "stdafx.h"
16 #include "DirectoryItems.h"
17 #include "Mapping.h"
18 #include "Stream.h"
19 
20 namespace HLLib
21 {
22 	typedef std::list<Streams::IStream *> CStreamList;
23 
24 	class HLLIB_API CPackage
25 	{
26 	private:
27 		hlBool bDeleteStream;
28 		hlBool bDeleteMapping;
29 		Streams::IStream *pStream;
30 
31 	protected:
32 		Mapping::CMapping *pMapping;
33 
34 		CDirectoryFolder *pRoot;
35 
36 	private:
37 		mutable CStreamList *pStreams;
38 
39 	public:
40 		CPackage();
41 		virtual ~CPackage();
42 
43 		virtual HLPackageType GetType() const = 0;
44 		virtual const hlChar *GetExtension() const = 0;
45 		virtual const hlChar *GetDescription() const = 0;
46 
47 		hlBool GetOpened() const;
48 
49 		hlBool Open(Streams::IStream &Stream, hlUInt uiMode);
50 		hlBool Open(Mapping::CMapping &Mapping, hlUInt uiMode);
51 		hlBool Open(const hlChar *lpFileName, hlUInt uiMode);
52 		hlBool Open(hlVoid *lpData, hlUInt uiBufferSize, hlUInt uiMode);
53 		hlBool Open(hlVoid *pUserData, hlUInt uiMode);
54 		hlVoid Close();
55 
56 		hlBool Defragment();
57 
58 		const Mapping::CMapping* GetMapping() const;
59 		CDirectoryFolder *GetRoot();
60 		const CDirectoryFolder *GetRoot() const;
61 
62 		hlUInt GetAttributeCount() const;
63 		const hlChar *GetAttributeName(HLPackageAttribute eAttribute) const;
64 		hlBool GetAttribute(HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
65 
66 		hlUInt GetItemAttributeCount() const;
67 		const hlChar *GetItemAttributeName(HLPackageAttribute eAttribute) const;
68 		hlBool GetItemAttribute(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
69 
70 		hlBool GetFileExtractable(const CDirectoryFile *pFile, hlBool &bExtractable) const;
71 		hlBool GetFileValidation(const CDirectoryFile *pFile, HLValidation &eValidation) const;
72 		hlBool GetFileSize(const CDirectoryFile *pFile, hlUInt &uiSize) const;
73 		hlBool GetFileSizeOnDisk(const CDirectoryFile *pFile, hlUInt &uiSize) const;
74 
75 		hlBool CreateStream(const CDirectoryFile *pFile, Streams::IStream *&pStream) const;
76 		hlVoid ReleaseStream(Streams::IStream *pStream) const;
77 
78 	protected:
79 		virtual hlBool MapDataStructures() = 0;
80 		virtual hlVoid UnmapDataStructures() = 0;
81 
82 		virtual hlBool DefragmentInternal();
83 
84 		virtual CDirectoryFolder *CreateRoot() = 0;
85 		virtual hlVoid ReleaseRoot();
86 
87 		virtual hlUInt GetAttributeCountInternal() const;
88 		virtual const hlChar *GetAttributeNameInternal(HLPackageAttribute eAttribute) const;
89 		virtual hlBool GetAttributeInternal(HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
90 
91 		virtual hlUInt GetItemAttributeCountInternal() const;
92 		virtual const hlChar *GetItemAttributeNameInternal(HLPackageAttribute eAttribute) const;
93 		virtual hlBool GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
94 
95 		virtual hlBool GetFileExtractableInternal(const CDirectoryFile *pFile, hlBool &bExtractable) const;
96 		virtual hlBool GetFileValidationInternal(const CDirectoryFile *pFile, HLValidation &eValidation) const;
97 		virtual hlBool GetFileSizeInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const = 0;
98 		virtual hlBool GetFileSizeOnDiskInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const = 0;
99 
100 		virtual hlBool CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStream *&pStream) const = 0;
101 		virtual hlVoid ReleaseStreamInternal(Streams::IStream &Stream) const;
102 
103 	private:
104 		hlBool Open(Streams::IStream *pStream, hlUInt uiMode, hlBool bDeleteStream);
105 		hlBool Open(Mapping::CMapping *pMapping, hlUInt uiMode, hlBool bDeleteMapping);
106 	};
107 }
108 
109 #endif
110