Merge pull request #3092 from JosJuice/compressed-blobs
Display all compressed formats in blue in GUI
This commit is contained in:
commit
34c020352f
|
@ -129,7 +129,7 @@ IBlobReader* CreateBlobReader(const std::string& filename)
|
||||||
if (IsWbfsBlob(filename))
|
if (IsWbfsBlob(filename))
|
||||||
return WbfsFileReader::Create(filename);
|
return WbfsFileReader::Create(filename);
|
||||||
|
|
||||||
if (IsCompressedBlob(filename))
|
if (IsGCZBlob(filename))
|
||||||
return CompressedBlobReader::Create(filename);
|
return CompressedBlobReader::Create(filename);
|
||||||
|
|
||||||
if (IsCISOBlob(filename))
|
if (IsCISOBlob(filename))
|
||||||
|
|
|
@ -25,7 +25,8 @@ class IBlobReader
|
||||||
public:
|
public:
|
||||||
virtual ~IBlobReader() {}
|
virtual ~IBlobReader() {}
|
||||||
|
|
||||||
virtual u64 GetRawSize() const = 0;
|
virtual bool IsCompressed() const = 0;
|
||||||
|
virtual u64 GetRawSize() const = 0;
|
||||||
virtual u64 GetDataSize() const = 0;
|
virtual u64 GetDataSize() const = 0;
|
||||||
// NOT thread-safe - can't call this from multiple threads.
|
// NOT thread-safe - can't call this from multiple threads.
|
||||||
virtual bool Read(u64 offset, u64 size, u8* out_ptr) = 0;
|
virtual bool Read(u64 offset, u64 size, u8* out_ptr) = 0;
|
||||||
|
|
|
@ -36,6 +36,7 @@ class CISOFileReader : public IBlobReader
|
||||||
public:
|
public:
|
||||||
static CISOFileReader* Create(const std::string& filename);
|
static CISOFileReader* Create(const std::string& filename);
|
||||||
|
|
||||||
|
bool IsCompressed() const override { return true; }
|
||||||
u64 GetDataSize() const override;
|
u64 GetDataSize() const override;
|
||||||
u64 GetRawSize() const override;
|
u64 GetRawSize() const override;
|
||||||
bool Read(u64 offset, u64 nbytes, u8* out_ptr) override;
|
bool Read(u64 offset, u64 nbytes, u8* out_ptr) override;
|
||||||
|
|
|
@ -57,7 +57,7 @@ CompressedBlobReader::CompressedBlobReader(const std::string& filename) : m_file
|
||||||
|
|
||||||
CompressedBlobReader* CompressedBlobReader::Create(const std::string& filename)
|
CompressedBlobReader* CompressedBlobReader::Create(const std::string& filename)
|
||||||
{
|
{
|
||||||
if (IsCompressedBlob(filename))
|
if (IsGCZBlob(filename))
|
||||||
return new CompressedBlobReader(filename);
|
return new CompressedBlobReader(filename);
|
||||||
else
|
else
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -150,7 +150,7 @@ bool CompressFileToBlob(const std::string& infile, const std::string& outfile, u
|
||||||
{
|
{
|
||||||
bool scrubbing = false;
|
bool scrubbing = false;
|
||||||
|
|
||||||
if (IsCompressedBlob(infile))
|
if (IsGCZBlob(infile))
|
||||||
{
|
{
|
||||||
PanicAlertT("\"%s\" is already compressed! Cannot compress it further.", infile.c_str());
|
PanicAlertT("\"%s\" is already compressed! Cannot compress it further.", infile.c_str());
|
||||||
return false;
|
return false;
|
||||||
|
@ -332,7 +332,7 @@ bool CompressFileToBlob(const std::string& infile, const std::string& outfile, u
|
||||||
|
|
||||||
bool DecompressBlobToFile(const std::string& infile, const std::string& outfile, CompressCB callback, void* arg)
|
bool DecompressBlobToFile(const std::string& infile, const std::string& outfile, CompressCB callback, void* arg)
|
||||||
{
|
{
|
||||||
if (!IsCompressedBlob(infile))
|
if (!IsGCZBlob(infile))
|
||||||
{
|
{
|
||||||
PanicAlertT("File not compressed");
|
PanicAlertT("File not compressed");
|
||||||
return false;
|
return false;
|
||||||
|
@ -402,7 +402,7 @@ bool DecompressBlobToFile(const std::string& infile, const std::string& outfile,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsCompressedBlob(const std::string& filename)
|
bool IsGCZBlob(const std::string& filename)
|
||||||
{
|
{
|
||||||
File::IOFile f(filename, "rb");
|
File::IOFile f(filename, "rb");
|
||||||
|
|
||||||
|
|
|
@ -23,11 +23,11 @@
|
||||||
namespace DiscIO
|
namespace DiscIO
|
||||||
{
|
{
|
||||||
|
|
||||||
bool IsCompressedBlob(const std::string& filename);
|
bool IsGCZBlob(const std::string& filename);
|
||||||
|
|
||||||
const u32 kBlobCookie = 0xB10BC001;
|
const u32 kBlobCookie = 0xB10BC001;
|
||||||
|
|
||||||
// A blob file structure:
|
// GCZ file structure:
|
||||||
// BlobHeader
|
// BlobHeader
|
||||||
// u64 offsetsToBlocks[n], top bit specifies whether the block is compressed, or not.
|
// u64 offsetsToBlocks[n], top bit specifies whether the block is compressed, or not.
|
||||||
// compressed data
|
// compressed data
|
||||||
|
@ -49,6 +49,7 @@ public:
|
||||||
static CompressedBlobReader* Create(const std::string& filename);
|
static CompressedBlobReader* Create(const std::string& filename);
|
||||||
~CompressedBlobReader();
|
~CompressedBlobReader();
|
||||||
const CompressedBlobHeader &GetHeader() const { return m_header; }
|
const CompressedBlobHeader &GetHeader() const { return m_header; }
|
||||||
|
bool IsCompressed() const override { return true; }
|
||||||
u64 GetDataSize() const override { return m_header.data_size; }
|
u64 GetDataSize() const override { return m_header.data_size; }
|
||||||
u64 GetRawSize() const override { return m_file_size; }
|
u64 GetRawSize() const override { return m_file_size; }
|
||||||
u64 GetBlockCompressedSize(u64 block_num) const;
|
u64 GetBlockCompressedSize(u64 block_num) const;
|
||||||
|
|
|
@ -23,6 +23,7 @@ class DriveReader : public SectorReader
|
||||||
public:
|
public:
|
||||||
static DriveReader* Create(const std::string& drive);
|
static DriveReader* Create(const std::string& drive);
|
||||||
~DriveReader();
|
~DriveReader();
|
||||||
|
bool IsCompressed() const override { return false; }
|
||||||
u64 GetDataSize() const override { return m_size; }
|
u64 GetDataSize() const override { return m_size; }
|
||||||
u64 GetRawSize() const override { return m_size; }
|
u64 GetRawSize() const override { return m_size; }
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ class PlainFileReader : public IBlobReader
|
||||||
public:
|
public:
|
||||||
static PlainFileReader* Create(const std::string& filename);
|
static PlainFileReader* Create(const std::string& filename);
|
||||||
|
|
||||||
|
bool IsCompressed() const override { return false; }
|
||||||
u64 GetDataSize() const override { return m_size; }
|
u64 GetDataSize() const override { return m_size; }
|
||||||
u64 GetRawSize() const override { return m_size; }
|
u64 GetRawSize() const override { return m_size; }
|
||||||
bool Read(u64 offset, u64 nbytes, u8* out_ptr) override;
|
bool Read(u64 offset, u64 nbytes, u8* out_ptr) override;
|
||||||
|
|
|
@ -101,8 +101,9 @@ public:
|
||||||
virtual bool ChangePartition(u64 offset) { return false; }
|
virtual bool ChangePartition(u64 offset) { return false; }
|
||||||
|
|
||||||
virtual ECountry GetCountry() const = 0;
|
virtual ECountry GetCountry() const = 0;
|
||||||
|
virtual bool IsCompressed() const = 0;
|
||||||
|
// Size of virtual disc (not always accurate)
|
||||||
virtual u64 GetSize() const = 0;
|
virtual u64 GetSize() const = 0;
|
||||||
|
|
||||||
// Size on disc (compressed size)
|
// Size on disc (compressed size)
|
||||||
virtual u64 GetRawSize() const = 0;
|
virtual u64 GetRawSize() const = 0;
|
||||||
|
|
||||||
|
|
|
@ -227,6 +227,11 @@ IVolume::EPlatform CVolumeDirectory::GetVolumeType() const
|
||||||
return m_is_wii ? WII_DISC : GAMECUBE_DISC;
|
return m_is_wii ? WII_DISC : GAMECUBE_DISC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CVolumeDirectory::IsCompressed() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
u64 CVolumeDirectory::GetSize() const
|
u64 CVolumeDirectory::GetSize() const
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -51,6 +51,7 @@ public:
|
||||||
|
|
||||||
ECountry GetCountry() const override;
|
ECountry GetCountry() const override;
|
||||||
|
|
||||||
|
bool IsCompressed() const override;
|
||||||
u64 GetSize() const override;
|
u64 GetSize() const override;
|
||||||
u64 GetRawSize() const override;
|
u64 GetRawSize() const override;
|
||||||
|
|
||||||
|
|
|
@ -169,6 +169,11 @@ std::string CVolumeGC::GetApploaderDate() const
|
||||||
return DecodeString(date);
|
return DecodeString(date);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CVolumeGC::IsCompressed() const
|
||||||
|
{
|
||||||
|
return m_pReader ? m_pReader->IsCompressed() : false;
|
||||||
|
}
|
||||||
|
|
||||||
u64 CVolumeGC::GetSize() const
|
u64 CVolumeGC::GetSize() const
|
||||||
{
|
{
|
||||||
if (m_pReader)
|
if (m_pReader)
|
||||||
|
|
|
@ -39,6 +39,7 @@ public:
|
||||||
|
|
||||||
EPlatform GetVolumeType() const override;
|
EPlatform GetVolumeType() const override;
|
||||||
ECountry GetCountry() const override;
|
ECountry GetCountry() const override;
|
||||||
|
bool IsCompressed() const override;
|
||||||
u64 GetSize() const override;
|
u64 GetSize() const override;
|
||||||
u64 GetRawSize() const override;
|
u64 GetRawSize() const override;
|
||||||
|
|
||||||
|
|
|
@ -126,6 +126,11 @@ std::map<IVolume::ELanguage, std::string> CVolumeWAD::GetNames(bool prefer_long)
|
||||||
return ReadWiiNames(name_data);
|
return ReadWiiNames(name_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CVolumeWAD::IsCompressed() const
|
||||||
|
{
|
||||||
|
return m_pReader ? m_pReader->IsCompressed() : false;
|
||||||
|
}
|
||||||
|
|
||||||
u64 CVolumeWAD::GetSize() const
|
u64 CVolumeWAD::GetSize() const
|
||||||
{
|
{
|
||||||
if (m_pReader)
|
if (m_pReader)
|
||||||
|
|
|
@ -37,8 +37,9 @@ public:
|
||||||
std::string GetApploaderDate() const override { return ""; }
|
std::string GetApploaderDate() const override { return ""; }
|
||||||
|
|
||||||
EPlatform GetVolumeType() const override;
|
EPlatform GetVolumeType() const override;
|
||||||
|
|
||||||
ECountry GetCountry() const override;
|
ECountry GetCountry() const override;
|
||||||
|
|
||||||
|
bool IsCompressed() const override;
|
||||||
u64 GetSize() const override;
|
u64 GetSize() const override;
|
||||||
u64 GetRawSize() const override;
|
u64 GetRawSize() const override;
|
||||||
|
|
||||||
|
|
|
@ -250,6 +250,11 @@ u8 CVolumeWiiCrypted::GetDiscNumber() const
|
||||||
return disc_number;
|
return disc_number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CVolumeWiiCrypted::IsCompressed() const
|
||||||
|
{
|
||||||
|
return m_pReader ? m_pReader->IsCompressed() : false;
|
||||||
|
}
|
||||||
|
|
||||||
u64 CVolumeWiiCrypted::GetSize() const
|
u64 CVolumeWiiCrypted::GetSize() const
|
||||||
{
|
{
|
||||||
if (m_pReader)
|
if (m_pReader)
|
||||||
|
|
|
@ -43,6 +43,7 @@ public:
|
||||||
bool ChangePartition(u64 offset) override;
|
bool ChangePartition(u64 offset) override;
|
||||||
|
|
||||||
ECountry GetCountry() const override;
|
ECountry GetCountry() const override;
|
||||||
|
bool IsCompressed() const override;
|
||||||
u64 GetSize() const override;
|
u64 GetSize() const override;
|
||||||
u64 GetRawSize() const override;
|
u64 GetRawSize() const override;
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ class WbfsFileReader : public IBlobReader
|
||||||
public:
|
public:
|
||||||
static WbfsFileReader* Create(const std::string& filename);
|
static WbfsFileReader* Create(const std::string& filename);
|
||||||
|
|
||||||
|
bool IsCompressed() const override { return true; }
|
||||||
u64 GetDataSize() const override { return m_size; }
|
u64 GetDataSize() const override { return m_size; }
|
||||||
u64 GetRawSize() const override { return m_size; }
|
u64 GetRawSize() const override { return m_size; }
|
||||||
bool Read(u64 offset, u64 nbytes, u8* out_ptr) override;
|
bool Read(u64 offset, u64 nbytes, u8* out_ptr) override;
|
||||||
|
|
|
@ -113,7 +113,7 @@ GameFile::GameFile(const QString& fileName)
|
||||||
m_volume_size = volume->GetSize();
|
m_volume_size = volume->GetSize();
|
||||||
|
|
||||||
m_unique_id = QString::fromStdString(volume->GetUniqueID());
|
m_unique_id = QString::fromStdString(volume->GetUniqueID());
|
||||||
m_compressed = DiscIO::IsCompressedBlob(fileName.toStdString());
|
m_compressed = volume->IsCompressed();
|
||||||
m_disc_number = volume->GetDiscNumber();
|
m_disc_number = volume->GetDiscNumber();
|
||||||
m_revision = volume->GetRevision();
|
m_revision = volume->GetRevision();
|
||||||
|
|
||||||
|
|
|
@ -111,7 +111,7 @@ GameListItem::GameListItem(const std::string& _rFileName, const std::unordered_m
|
||||||
m_VolumeSize = pVolume->GetSize();
|
m_VolumeSize = pVolume->GetSize();
|
||||||
|
|
||||||
m_UniqueID = pVolume->GetUniqueID();
|
m_UniqueID = pVolume->GetUniqueID();
|
||||||
m_BlobCompressed = DiscIO::IsCompressedBlob(_rFileName);
|
m_BlobCompressed = pVolume->IsCompressed();
|
||||||
m_disc_number = pVolume->GetDiscNumber();
|
m_disc_number = pVolume->GetDiscNumber();
|
||||||
m_Revision = pVolume->GetRevision();
|
m_Revision = pVolume->GetRevision();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue