#pragma once #include "ZipBase.h" #include "tl/memory_buffer.h" #include "tl/result.h" #include "tl/vector.h" namespace fs { ////////////////////////////////////////////////////////////////////////// class ISource; ////////////////////////////////////////////////////////////////////////// class ZipReader : public ZipBase { public: enum class ErrorCode : uint8_t { InvalidStream, BadSignature, BadOffset, CorruptedFile, }; typedef tl::error Error; typedef tl::result CreateResult; static CreateResult create(ISource& source); struct Entry { tl::string name; CompressionMethod compressionMethod = CompressionMethod::Store; GeneralBitFlags generalBitFlags; uint64_t uncompressedSize = 0; uint64_t compressedSize = 0; uint32_t crc32 = 0; uint64_t localHeaderOffset = 0; uint64_t dataOffset = 0; time_t lastModTimePoint = 0; tl::memory_buffer comment; }; size_t getEntryCount() const; const Entry& getEntry(size_t index) const; typedef tl::result SeekResult; SeekResult seekSourceToEntryData(const Entry& entry, ISource& o_source) const; private: explicit ZipReader(tl::vector entries); typedef tl::result, Error> CentralDirectoryResult; static CentralDirectoryResult findCentralDirectoryBounds(ISource& source); tl::vector m_entries; }; ////////////////////////////////////////////////////////////////////////// }