summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO
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
parente1321b131d9e3386a4be17592363d72b13a15f66 (diff)
DirectoryBlob: Let DiscContent be backed by memory instead of file
Diffstat (limited to 'Source/Core/DiscIO')
-rw-r--r--Source/Core/DiscIO/DirectoryBlob.cpp24
-rw-r--r--Source/Core/DiscIO/DirectoryBlob.h11
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;