diff options
| author | JosJuice <josjuice@gmail.com> | 2017-06-08 16:37:51 +0200 |
|---|---|---|
| committer | JosJuice <josjuice@gmail.com> | 2017-08-01 11:36:40 +0200 |
| commit | 936ef5b9dde767698fc2a61b1d2b2c2f867f60f0 (patch) | |
| tree | 99cd9bddf27f210f3bc1e68b0f278e6cbd5a2e35 /Source/Core/DiscIO | |
| parent | e1321b131d9e3386a4be17592363d72b13a15f66 (diff) | |
DirectoryBlob: Let DiscContent be backed by memory instead of file
Diffstat (limited to 'Source/Core/DiscIO')
| -rw-r--r-- | Source/Core/DiscIO/DirectoryBlob.cpp | 24 | ||||
| -rw-r--r-- | Source/Core/DiscIO/DirectoryBlob.h | 11 |
2 files changed, 30 insertions, 5 deletions
diff --git a/Source/Core/DiscIO/DirectoryBlob.cpp b/Source/Core/DiscIO/DirectoryBlob.cpp index a974e882d6..8f000454e8 100644 --- a/Source/Core/DiscIO/DirectoryBlob.cpp +++ b/Source/Core/DiscIO/DirectoryBlob.cpp @@ -14,6 +14,7 @@ #include <set> #include <string> #include <utility> +#include <variant> #include <vector> #include "Common/Align.h" @@ -50,7 +51,12 @@ const std::array<u32, 10> PARTITION_TABLE = { Common::swap32(GAME_PARTITION_ADDRESS >> 2), 0}}; DiscContent::DiscContent(u64 offset, u64 size, const std::string& path) - : m_offset(offset), m_size(size), m_path(path) + : m_offset(offset), m_size(size), m_content_source(path) +{ +} + +DiscContent::DiscContent(u64 offset, u64 size, const u8* data) + : m_offset(offset), m_size(size), m_content_source(data) { } @@ -80,10 +86,18 @@ bool DiscContent::Read(u64* offset, u64* length, u8** buffer) const { const u64 bytes_to_read = std::min(m_size - offset_in_content, *length); - File::IOFile file(m_path, "rb"); - file.Seek(offset_in_content, SEEK_SET); - if (!file.ReadBytes(*buffer, bytes_to_read)) - return false; + if (std::holds_alternative<std::string>(m_content_source)) + { + File::IOFile file(std::get<std::string>(m_content_source), "rb"); + file.Seek(offset_in_content, SEEK_SET); + if (!file.ReadBytes(*buffer, bytes_to_read)) + return false; + } + else + { + const u8* const content_pointer = std::get<const u8*>(m_content_source) + offset_in_content; + std::copy(content_pointer, content_pointer + bytes_to_read, *buffer); + } *length -= bytes_to_read; *buffer += bytes_to_read; diff --git a/Source/Core/DiscIO/DirectoryBlob.h b/Source/Core/DiscIO/DirectoryBlob.h index 3e4683b906..f3879c97f6 100644 --- a/Source/Core/DiscIO/DirectoryBlob.h +++ b/Source/Core/DiscIO/DirectoryBlob.h @@ -9,6 +9,7 @@ #include <optional> #include <set> #include <string> +#include <variant> #include <vector> #include "Common/CommonTypes.h" @@ -26,7 +27,10 @@ namespace DiscIO class DiscContent { public: + using ContentSource = std::variant<std::string, const u8*>; + DiscContent(u64 offset, u64 size, const std::string& path); + DiscContent(u64 offset, u64 size, const u8* data); // Provided because it's convenient when searching for DiscContent in an std::set explicit DiscContent(u64 offset); @@ -45,6 +49,7 @@ private: u64 m_offset; u64 m_size = 0; std::string m_path; + ContentSource m_content_source; }; class DirectoryBlobReader : public BlobReader @@ -53,6 +58,12 @@ public: static bool IsValidDirectoryBlob(const std::string& dol_path); static std::unique_ptr<DirectoryBlobReader> Create(File::IOFile dol, const std::string& dol_path); + // We do not allow copying, because it might mess up the pointers inside DiscContents + DirectoryBlobReader(const DirectoryBlobReader&) = delete; + DirectoryBlobReader& operator=(const DirectoryBlobReader&) = delete; + DirectoryBlobReader(DirectoryBlobReader&&) = default; + DirectoryBlobReader& operator=(DirectoryBlobReader&&) = default; + bool Read(u64 offset, u64 length, u8* buffer) override; bool SupportsReadWiiDecrypted() const override; bool ReadWiiDecrypted(u64 offset, u64 size, u8* buffer, u64 partition_offset) override; |
