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/CISOBlob.cpp | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) (limited to 'Source/Core/DiscIO/CISOBlob.cpp') diff --git a/Source/Core/DiscIO/CISOBlob.cpp b/Source/Core/DiscIO/CISOBlob.cpp index 37e427793b..388fd71d60 100644 --- a/Source/Core/DiscIO/CISOBlob.cpp +++ b/Source/Core/DiscIO/CISOBlob.cpp @@ -12,8 +12,6 @@ namespace DiscIO { -static const char CISO_MAGIC[] = "CISO"; - CISOFileReader::CISOFileReader(std::FILE* file) : m_file(file) { m_size = m_file.GetSize(); @@ -30,11 +28,10 @@ CISOFileReader::CISOFileReader(std::FILE* file) : m_file(file) std::unique_ptr CISOFileReader::Create(const std::string& filename) { - if (IsCISOBlob(filename)) - { - File::IOFile f(filename, "rb"); + File::IOFile f(filename, "rb"); + CISOHeader header; + if (f.ReadArray(&header, 1) && header.magic == CISO_MAGIC) return std::unique_ptr(new CISOFileReader(f.ReleaseHandle())); - } return nullptr; } @@ -81,13 +78,4 @@ bool CISOFileReader::Read(u64 offset, u64 nbytes, u8* out_ptr) return true; } -bool IsCISOBlob(const std::string& filename) -{ - File::IOFile f(filename, "rb"); - - CISOHeader header; - return (f.ReadArray(&header, 1) && - std::equal(header.magic, header.magic + sizeof(header.magic), CISO_MAGIC)); -} - } // 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/CISOBlob.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'Source/Core/DiscIO/CISOBlob.cpp') diff --git a/Source/Core/DiscIO/CISOBlob.cpp b/Source/Core/DiscIO/CISOBlob.cpp index 388fd71d60..846952ce8a 100644 --- a/Source/Core/DiscIO/CISOBlob.cpp +++ b/Source/Core/DiscIO/CISOBlob.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "Common/CommonTypes.h" #include "Common/FileUtil.h" @@ -12,11 +13,12 @@ namespace DiscIO { -CISOFileReader::CISOFileReader(std::FILE* file) : m_file(file) +CISOFileReader::CISOFileReader(File::IOFile file) : m_file(std::move(file)) { m_size = m_file.GetSize(); CISOHeader header; + m_file.Seek(0, SEEK_SET); m_file.ReadArray(&header, 1); m_block_size = header.block_size; @@ -26,12 +28,11 @@ CISOFileReader::CISOFileReader(std::FILE* file) : m_file(file) m_ciso_map[idx] = (1 == header.map[idx]) ? count++ : UNUSED_BLOCK_ID; } -std::unique_ptr CISOFileReader::Create(const std::string& filename) +std::unique_ptr CISOFileReader::Create(File::IOFile file) { - File::IOFile f(filename, "rb"); CISOHeader header; - if (f.ReadArray(&header, 1) && header.magic == CISO_MAGIC) - return std::unique_ptr(new CISOFileReader(f.ReleaseHandle())); + if (file.Seek(0, SEEK_SET) && file.ReadArray(&header, 1) && header.magic == CISO_MAGIC) + return std::unique_ptr(new CISOFileReader(std::move(file))); return nullptr; } -- cgit v1.2.3