summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO/DirectoryBlob.cpp
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2017-06-08 16:37:51 +0200
committerJosJuice <josjuice@gmail.com>2017-08-01 11:36:40 +0200
commit936ef5b9dde767698fc2a61b1d2b2c2f867f60f0 (patch)
tree99cd9bddf27f210f3bc1e68b0f278e6cbd5a2e35 /Source/Core/DiscIO/DirectoryBlob.cpp
parente1321b131d9e3386a4be17592363d72b13a15f66 (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.cpp24
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;