summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO/DirectoryBlob.cpp
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2017-06-10 17:51:22 +0200
committerJosJuice <josjuice@gmail.com>2017-08-01 11:36:40 +0200
commitd84bee3ff4bf084ccb10fd176244a436b50e40d4 (patch)
treee8f6691b396c40c82cc6caa34f20fcbd0729d1a0 /Source/Core/DiscIO/DirectoryBlob.cpp
parenta3ee61e1a97899a0d29f15cdebf6a6589aa444dd (diff)
DirectoryBlob: Prepare more for supporting multiple partitions
Diffstat (limited to 'Source/Core/DiscIO/DirectoryBlob.cpp')
-rw-r--r--Source/Core/DiscIO/DirectoryBlob.cpp30
1 files changed, 22 insertions, 8 deletions
diff --git a/Source/Core/DiscIO/DirectoryBlob.cpp b/Source/Core/DiscIO/DirectoryBlob.cpp
index e8db47d29a..0b16c4da7b 100644
--- a/Source/Core/DiscIO/DirectoryBlob.cpp
+++ b/Source/Core/DiscIO/DirectoryBlob.cpp
@@ -10,6 +10,7 @@
#include <cstddef>
#include <cstring>
#include <locale>
+#include <map>
#include <memory>
#include <set>
#include <string>
@@ -156,13 +157,21 @@ std::unique_ptr<DirectoryBlobReader> DirectoryBlobReader::Create(const std::stri
}
DirectoryBlobReader::DirectoryBlobReader(const std::string& root_directory)
- : m_root_directory(root_directory), m_game_partition(root_directory, {})
+ : m_root_directory(root_directory)
{
- m_is_wii = m_game_partition.IsWii();
+ DirectoryBlobPartition game_partition(root_directory, {});
+ m_is_wii = game_partition.IsWii();
- if (m_is_wii)
+ if (!m_is_wii)
+ {
+ m_gamecube_pseudopartition = std::move(game_partition);
+ }
+ else
{
- SetNonpartitionDiscHeader(m_game_partition.GetHeader());
+ SetNonpartitionDiscHeader(game_partition.GetHeader());
+
+ m_partitions.emplace(GAME_PARTITION_ADDRESS, std::move(game_partition));
+
SetPartitionTable();
SetWiiRegionData();
SetTMDAndTicket();
@@ -205,8 +214,9 @@ bool DirectoryBlobReader::Read(u64 offset, u64 length, u8* buffer)
{
// TODO: We don't handle raw access to the encrypted area of Wii discs correctly.
- return ReadInternal(offset, length, buffer,
- m_is_wii ? m_nonpartition_contents : m_game_partition.GetContents());
+ const std::set<DiscContent>& contents =
+ m_is_wii ? m_nonpartition_contents : m_gamecube_pseudopartition.GetContents();
+ return ReadInternal(offset, length, buffer, contents);
}
bool DirectoryBlobReader::SupportsReadWiiDecrypted() const
@@ -216,10 +226,14 @@ bool DirectoryBlobReader::SupportsReadWiiDecrypted() const
bool DirectoryBlobReader::ReadWiiDecrypted(u64 offset, u64 size, u8* buffer, u64 partition_offset)
{
- if (!m_is_wii || partition_offset != GAME_PARTITION_ADDRESS)
+ if (!m_is_wii)
+ return false;
+
+ auto it = m_partitions.find(partition_offset);
+ if (it == m_partitions.end())
return false;
- return ReadInternal(offset, size, buffer, m_game_partition.GetContents());
+ return ReadInternal(offset, size, buffer, it->second.GetContents());
}
BlobType DirectoryBlobReader::GetBlobType() const