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/DirectoryBlob.cpp | |
| parent | e1321b131d9e3386a4be17592363d72b13a15f66 (diff) | |
DirectoryBlob: Let DiscContent be backed by memory instead of file
Diffstat (limited to 'Source/Core/DiscIO/DirectoryBlob.cpp')
| -rw-r--r-- | Source/Core/DiscIO/DirectoryBlob.cpp | 24 |
1 files changed, 19 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; |
