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