#pragma once #include #include #include #include #include #include namespace GC { class IBlockReader { public: virtual ~IBlockReader() = default; virtual void Read(uint64_t offset, void* dst, size_t size) = 0; virtual uint64_t Size() const = 0; std::vector Read(uint64_t offset, size_t size) { std::vector out(size); Read(offset, out.data(), size); return out; } }; class RawImageReader : public IBlockReader { public: explicit RawImageReader(const std::filesystem::path& path); void Read(uint64_t offset, void* dst, size_t size) override; uint64_t Size() const override { return mSize; } private: std::ifstream mFile; uint64_t mSize; std::mutex mMutex; }; class MemoryBlockReader : public IBlockReader { public: explicit MemoryBlockReader(std::vector data) : mData(std::move(data)) {} void Read(uint64_t offset, void* dst, size_t size) override; uint64_t Size() const override { return mData.size(); } private: std::vector mData; }; class CisoReader : public IBlockReader { public: explicit CisoReader(std::shared_ptr base); void Read(uint64_t offset, void* dst, size_t size) override; uint64_t Size() const override { return mSize; } static bool Probe(IBlockReader& base); private: std::shared_ptr mBase; uint32_t mBlockSize; uint64_t mSize; std::vector mBlockOffsets; }; class GczReader : public IBlockReader { public: explicit GczReader(std::shared_ptr base); void Read(uint64_t offset, void* dst, size_t size) override; uint64_t Size() const override { return mDataSize; } static bool Probe(IBlockReader& base); private: void LoadBlock(uint32_t index); std::shared_ptr mBase; uint64_t mDataSize; uint32_t mBlockSize; uint64_t mDataStart; uint64_t mCompressedSize; std::vector mBlockPointers; std::vector mCache; int64_t mCachedBlock = -1; std::mutex mMutex; }; std::shared_ptr OpenDiscImage(const std::filesystem::path& path); std::shared_ptr WrapDiscImage(std::shared_ptr base); uint32_t ReadBE32(const uint8_t* p); uint16_t ReadBE16(const uint8_t* p); void WriteBE32(uint8_t* p, uint32_t v); void WriteBE16(uint8_t* p, uint16_t v); } // namespace GC