From d1ea00ed884cf714a252d3194d3f8dbdc54ac937 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Wed, 21 Dec 2016 11:30:12 +0100 Subject: Only open file once when detecting blob type --- Source/Core/DiscIO/Blob.cpp | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) (limited to 'Source/Core/DiscIO/Blob.cpp') diff --git a/Source/Core/DiscIO/Blob.cpp b/Source/Core/DiscIO/Blob.cpp index d7aad9332a..d1dd0e7c1e 100644 --- a/Source/Core/DiscIO/Blob.cpp +++ b/Source/Core/DiscIO/Blob.cpp @@ -177,23 +177,31 @@ std::unique_ptr CreateBlobReader(const std::string& filename) if (cdio_is_cdrom(filename)) return DriveReader::Create(filename); - if (!File::Exists(filename)) + File::IOFile file(filename, "rb"); + u32 magic; + if (!file.ReadArray(&magic, 1)) return nullptr; - if (IsWbfsBlob(filename)) - return WbfsFileReader::Create(filename); - - if (IsGCZBlob(filename)) - return CompressedBlobReader::Create(filename); + // Conveniently, every supported file format (except for plain disc images) starts + // with a 4-byte magic number that identifies the format, so we just need a simple + // switch statement to create the right blob type. If the magic number doesn't + // match any known magic number, we assume it's a plain disc image. If that + // assumption is wrong, the volume code that runs later will notice the error + // because the blob won't provide valid data when reading the GC/Wii disc header. - if (IsCISOBlob(filename)) + switch (magic) + { + case CISO_MAGIC: return CISOFileReader::Create(filename); - - if (IsTGCBlob(filename)) + case GCZ_MAGIC: + return CompressedBlobReader::Create(filename); + case TGC_MAGIC: return TGCFileReader::Create(filename); - - // Still here? Assume plain file - since we know it exists due to the File::Exists check above. - return PlainFileReader::Create(filename); + case WBFS_MAGIC: + return WbfsFileReader::Create(filename); + default: + return PlainFileReader::Create(filename); + } } } // namespace -- cgit v1.2.3 From 8d54bbc52803a2e665e58a8a9b1b22182c7f0027 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Wed, 21 Dec 2016 12:50:15 +0100 Subject: Don't create new IOFiles when creating a blob ...except for WBFS, which is special because it has the ability to open multiple files. --- Source/Core/DiscIO/Blob.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'Source/Core/DiscIO/Blob.cpp') diff --git a/Source/Core/DiscIO/Blob.cpp b/Source/Core/DiscIO/Blob.cpp index d1dd0e7c1e..e40b530233 100644 --- a/Source/Core/DiscIO/Blob.cpp +++ b/Source/Core/DiscIO/Blob.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include "Common/CDUtils.h" #include "Common/CommonTypes.h" @@ -192,15 +193,15 @@ std::unique_ptr CreateBlobReader(const std::string& filename) switch (magic) { case CISO_MAGIC: - return CISOFileReader::Create(filename); + return CISOFileReader::Create(std::move(file)); case GCZ_MAGIC: - return CompressedBlobReader::Create(filename); + return CompressedBlobReader::Create(std::move(file), filename); case TGC_MAGIC: - return TGCFileReader::Create(filename); + return TGCFileReader::Create(std::move(file)); case WBFS_MAGIC: return WbfsFileReader::Create(filename); default: - return PlainFileReader::Create(filename); + return PlainFileReader::Create(std::move(file)); } } -- cgit v1.2.3 From 5c02795af0cbe3ad95c7d3fb2de9891af77e98bb Mon Sep 17 00:00:00 2001 From: JosJuice Date: Wed, 21 Dec 2016 14:01:00 +0100 Subject: WbfsBlob: Only open each file once The first file used to be opened once by CreateBlobReader and once inside WbfsFileReader. --- Source/Core/DiscIO/Blob.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/DiscIO/Blob.cpp') diff --git a/Source/Core/DiscIO/Blob.cpp b/Source/Core/DiscIO/Blob.cpp index e40b530233..7d30cfe212 100644 --- a/Source/Core/DiscIO/Blob.cpp +++ b/Source/Core/DiscIO/Blob.cpp @@ -199,7 +199,7 @@ std::unique_ptr CreateBlobReader(const std::string& filename) case TGC_MAGIC: return TGCFileReader::Create(std::move(file)); case WBFS_MAGIC: - return WbfsFileReader::Create(filename); + return WbfsFileReader::Create(std::move(file), filename); default: return PlainFileReader::Create(std::move(file)); } -- cgit v1.2.3