/* Starshatter: The Open Source Project Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors Copyright (c) 1997-2006, Destroyer Studios LLC. AUTHOR: John DiCamillo */ #ifndef Archive_h #define Archive_h #include #include "Types.h" // +------------------------------------------------------------------+ namespace Archive { static constexpr std::uint32_t VERSION {0x0010}; static constexpr std::size_t BLOCK_SIZE {1024}; static constexpr std::size_t NAMELEN {64}; } // +------------------------------------------------------------------+ struct DataHeader { static const char* TYPENAME() { return "DataHeader"; } DWORD version; DWORD nfiles; DWORD dir_blocks; DWORD dir_size_comp; DWORD dir_offset; }; struct DataEntry { static const char* TYPENAME() { return "DataEntry"; } char name[Archive::NAMELEN]; DWORD size_orig; DWORD size_comp; DWORD offset; }; class DataArchive { public: static const char* TYPENAME() { return "DataArchive"; } // ctor: DataArchive(const char* name = 0); ~DataArchive(); // operations: void LoadDatafile(const char* name); void Insert(const char* name); void Extract(const char* name); void Remove(const char* name); void List(); void WriteEntry(int index, BYTE* buf); int FindEntry(const char* req_name); int ExpandEntry(int index, BYTE*& buf, bool null_terminate=false); BYTE* CompressEntry(int index); int InsertEntry(const char* name); void RemoveEntry(int index); DWORD Blocks(DWORD raw_size); DWORD DirBlocks(); DWORD FileBlocks(int index); int FindDataBlocks(int blocks_needed); void CreateBlockMap(); DWORD NumFiles() { return header.nfiles; } DataEntry* GetFile(int i) { if (i>=0 && i<(int)header.nfiles) return &directory[i]; return 0; } const char* Name() const { return datafile; } private: // persistent data members: DataHeader header; DataEntry* directory; BYTE* dirbuf; // transient members: char datafile[Archive::NAMELEN]; DWORD* block_map; DWORD nblocks; }; #endif // Archive_h