From 3014dadfa8c2065f81009895ecf81396de5120bc Mon Sep 17 00:00:00 2001 From: JosJuice <josjuice@gmail.com> Date: Thu, 21 Mar 2019 22:20:23 +0100 Subject: [PATCH] DiscIO: Add way of checking whether blob data size is accurate --- Source/Core/DiscIO/Blob.h | 1 + Source/Core/DiscIO/CISOBlob.h | 1 + Source/Core/DiscIO/CompressedBlob.h | 3 ++- Source/Core/DiscIO/DirectoryBlob.h | 1 + Source/Core/DiscIO/DriveBlob.h | 3 ++- Source/Core/DiscIO/FileBlob.h | 3 ++- Source/Core/DiscIO/TGCBlob.h | 3 ++- Source/Core/DiscIO/Volume.h | 1 + Source/Core/DiscIO/VolumeFileBlobReader.h | 3 ++- Source/Core/DiscIO/VolumeGC.cpp | 5 +++++ Source/Core/DiscIO/VolumeGC.h | 1 + Source/Core/DiscIO/VolumeWad.cpp | 5 +++++ Source/Core/DiscIO/VolumeWad.h | 1 + Source/Core/DiscIO/VolumeWii.cpp | 5 +++++ Source/Core/DiscIO/VolumeWii.h | 1 + Source/Core/DiscIO/WbfsBlob.h | 3 ++- 16 files changed, 34 insertions(+), 6 deletions(-) diff --git a/Source/Core/DiscIO/Blob.h b/Source/Core/DiscIO/Blob.h index 703cf1199b..8c13354963 100644 --- a/Source/Core/DiscIO/Blob.h +++ b/Source/Core/DiscIO/Blob.h @@ -44,6 +44,7 @@ public: virtual BlobType GetBlobType() const = 0; virtual u64 GetRawSize() const = 0; virtual u64 GetDataSize() const = 0; + virtual bool IsDataSizeAccurate() const = 0; // NOT thread-safe - can't call this from multiple threads. virtual bool Read(u64 offset, u64 size, u8* out_ptr) = 0; diff --git a/Source/Core/DiscIO/CISOBlob.h b/Source/Core/DiscIO/CISOBlob.h index 07a340fe1d..c2de890495 100644 --- a/Source/Core/DiscIO/CISOBlob.h +++ b/Source/Core/DiscIO/CISOBlob.h @@ -40,6 +40,7 @@ public: // The CISO format does not save the original file size. // This function returns an upper bound. u64 GetDataSize() const override; + bool IsDataSizeAccurate() const override { return false; } u64 GetRawSize() const override; bool Read(u64 offset, u64 nbytes, u8* out_ptr) override; diff --git a/Source/Core/DiscIO/CompressedBlob.h b/Source/Core/DiscIO/CompressedBlob.h index ecf8695c53..1d53353ba8 100644 --- a/Source/Core/DiscIO/CompressedBlob.h +++ b/Source/Core/DiscIO/CompressedBlob.h @@ -49,8 +49,9 @@ public: ~CompressedBlobReader(); const CompressedBlobHeader& GetHeader() const { return m_header; } BlobType GetBlobType() const override { return BlobType::GCZ; } - u64 GetDataSize() const override { return m_header.data_size; } u64 GetRawSize() const override { return m_file_size; } + u64 GetDataSize() const override { return m_header.data_size; } + bool IsDataSizeAccurate() const override { return true; } u64 GetBlockCompressedSize(u64 block_num) const; bool GetBlock(u64 block_num, u8* out_ptr) override; diff --git a/Source/Core/DiscIO/DirectoryBlob.h b/Source/Core/DiscIO/DirectoryBlob.h index 9da34cc0f0..614afe77ac 100644 --- a/Source/Core/DiscIO/DirectoryBlob.h +++ b/Source/Core/DiscIO/DirectoryBlob.h @@ -146,6 +146,7 @@ public: BlobType GetBlobType() const override; u64 GetRawSize() const override; u64 GetDataSize() const override; + bool IsDataSizeAccurate() const override { return true; } private: struct PartitionWithType diff --git a/Source/Core/DiscIO/DriveBlob.h b/Source/Core/DiscIO/DriveBlob.h index 5580d30179..3d3997af1f 100644 --- a/Source/Core/DiscIO/DriveBlob.h +++ b/Source/Core/DiscIO/DriveBlob.h @@ -24,8 +24,9 @@ public: static std::unique_ptr<DriveReader> Create(const std::string& drive); ~DriveReader(); BlobType GetBlobType() const override { return BlobType::DRIVE; } - u64 GetDataSize() const override { return m_size; } u64 GetRawSize() const override { return m_size; } + u64 GetDataSize() const override { return m_size; } + bool IsDataSizeAccurate() const override { return true; } private: DriveReader(const std::string& drive); diff --git a/Source/Core/DiscIO/FileBlob.h b/Source/Core/DiscIO/FileBlob.h index 6543a2c218..30a707f746 100644 --- a/Source/Core/DiscIO/FileBlob.h +++ b/Source/Core/DiscIO/FileBlob.h @@ -20,8 +20,9 @@ public: static std::unique_ptr<PlainFileReader> Create(File::IOFile file); BlobType GetBlobType() const override { return BlobType::PLAIN; } - u64 GetDataSize() const override { return m_size; } u64 GetRawSize() const override { return m_size; } + u64 GetDataSize() const override { return m_size; } + bool IsDataSizeAccurate() const override { return true; } bool Read(u64 offset, u64 nbytes, u8* out_ptr) override; private: diff --git a/Source/Core/DiscIO/TGCBlob.h b/Source/Core/DiscIO/TGCBlob.h index 31a46fca00..47d3492744 100644 --- a/Source/Core/DiscIO/TGCBlob.h +++ b/Source/Core/DiscIO/TGCBlob.h @@ -43,8 +43,9 @@ public: static std::unique_ptr<TGCFileReader> Create(File::IOFile file); BlobType GetBlobType() const override { return BlobType::TGC; } - u64 GetDataSize() const override; u64 GetRawSize() const override { return m_size; } + u64 GetDataSize() const override; + bool IsDataSizeAccurate() const override { return true; } bool Read(u64 offset, u64 nbytes, u8* out_ptr) override; private: diff --git a/Source/Core/DiscIO/Volume.h b/Source/Core/DiscIO/Volume.h index 3b70f765b7..c7c8e5849a 100644 --- a/Source/Core/DiscIO/Volume.h +++ b/Source/Core/DiscIO/Volume.h @@ -101,6 +101,7 @@ public: virtual BlobType GetBlobType() const = 0; // Size of virtual disc (may be inaccurate depending on the blob type) virtual u64 GetSize() const = 0; + virtual bool IsSizeAccurate() const = 0; // Size on disc (compressed size) virtual u64 GetRawSize() const = 0; diff --git a/Source/Core/DiscIO/VolumeFileBlobReader.h b/Source/Core/DiscIO/VolumeFileBlobReader.h index 46a988d367..b3a8c2c3aa 100644 --- a/Source/Core/DiscIO/VolumeFileBlobReader.h +++ b/Source/Core/DiscIO/VolumeFileBlobReader.h @@ -23,8 +23,9 @@ public: Create(const Volume& volume, const Partition& partition, const std::string& file_path); BlobType GetBlobType() const override { return BlobType::PLAIN; } - u64 GetDataSize() const override; u64 GetRawSize() const override; + u64 GetDataSize() const override; + bool IsDataSizeAccurate() const override { return true; } bool Read(u64 offset, u64 length, u8* out_ptr) override; private: diff --git a/Source/Core/DiscIO/VolumeGC.cpp b/Source/Core/DiscIO/VolumeGC.cpp index e3db29c1f5..67cf71072e 100644 --- a/Source/Core/DiscIO/VolumeGC.cpp +++ b/Source/Core/DiscIO/VolumeGC.cpp @@ -179,6 +179,11 @@ u64 VolumeGC::GetSize() const return m_reader->GetDataSize(); } +bool VolumeGC::IsSizeAccurate() const +{ + return m_reader->IsDataSizeAccurate(); +} + u64 VolumeGC::GetRawSize() const { return m_reader->GetRawSize(); diff --git a/Source/Core/DiscIO/VolumeGC.h b/Source/Core/DiscIO/VolumeGC.h index 1bf6139768..fbbdad56e5 100644 --- a/Source/Core/DiscIO/VolumeGC.h +++ b/Source/Core/DiscIO/VolumeGC.h @@ -52,6 +52,7 @@ public: Country GetCountry(const Partition& partition = PARTITION_NONE) const override; BlobType GetBlobType() const override; u64 GetSize() const override; + bool IsSizeAccurate() const override; u64 GetRawSize() const override; private: diff --git a/Source/Core/DiscIO/VolumeWad.cpp b/Source/Core/DiscIO/VolumeWad.cpp index a49488506b..a7316ffde9 100644 --- a/Source/Core/DiscIO/VolumeWad.cpp +++ b/Source/Core/DiscIO/VolumeWad.cpp @@ -175,6 +175,11 @@ u64 VolumeWAD::GetSize() const return m_reader->GetDataSize(); } +bool VolumeWAD::IsSizeAccurate() const +{ + return m_reader->IsDataSizeAccurate(); +} + u64 VolumeWAD::GetRawSize() const { return m_reader->GetRawSize(); diff --git a/Source/Core/DiscIO/VolumeWad.h b/Source/Core/DiscIO/VolumeWad.h index 32d8bfe3a6..fce0a10d30 100644 --- a/Source/Core/DiscIO/VolumeWad.h +++ b/Source/Core/DiscIO/VolumeWad.h @@ -54,6 +54,7 @@ public: BlobType GetBlobType() const override; u64 GetSize() const override; + bool IsSizeAccurate() const override; u64 GetRawSize() const override; private: diff --git a/Source/Core/DiscIO/VolumeWii.cpp b/Source/Core/DiscIO/VolumeWii.cpp index 777d774d82..f7261b0a61 100644 --- a/Source/Core/DiscIO/VolumeWii.cpp +++ b/Source/Core/DiscIO/VolumeWii.cpp @@ -379,6 +379,11 @@ u64 VolumeWii::GetSize() const return m_reader->GetDataSize(); } +bool VolumeWii::IsSizeAccurate() const +{ + return m_reader->IsDataSizeAccurate(); +} + u64 VolumeWii::GetRawSize() const { return m_reader->GetRawSize(); diff --git a/Source/Core/DiscIO/VolumeWii.h b/Source/Core/DiscIO/VolumeWii.h index 48010d5b37..e2b82c79f2 100644 --- a/Source/Core/DiscIO/VolumeWii.h +++ b/Source/Core/DiscIO/VolumeWii.h @@ -62,6 +62,7 @@ public: Country GetCountry(const Partition& partition) const override; BlobType GetBlobType() const override; u64 GetSize() const override; + bool IsSizeAccurate() const override; u64 GetRawSize() const override; static constexpr unsigned int BLOCK_HEADER_SIZE = 0x0400; diff --git a/Source/Core/DiscIO/WbfsBlob.h b/Source/Core/DiscIO/WbfsBlob.h index 181e32b6b3..dacdb43b50 100644 --- a/Source/Core/DiscIO/WbfsBlob.h +++ b/Source/Core/DiscIO/WbfsBlob.h @@ -24,12 +24,13 @@ public: static std::unique_ptr<WbfsFileReader> Create(File::IOFile file, const std::string& path); BlobType GetBlobType() const override { return BlobType::WBFS; } + u64 GetRawSize() const override { return m_size; } // The WBFS format does not save the original file size. // This function returns a constant upper bound // (the size of a double-layer Wii disc). u64 GetDataSize() const override; + bool IsDataSizeAccurate() const override { return false; } - u64 GetRawSize() const override { return m_size; } bool Read(u64 offset, u64 nbytes, u8* out_ptr) override; private: