diff options
| author | JosJuice <josjuice@gmail.com> | 2017-06-10 17:51:22 +0200 |
|---|---|---|
| committer | JosJuice <josjuice@gmail.com> | 2017-08-01 11:36:40 +0200 |
| commit | d84bee3ff4bf084ccb10fd176244a436b50e40d4 (patch) | |
| tree | e8f6691b396c40c82cc6caa34f20fcbd0729d1a0 /Source/Core/DiscIO/DirectoryBlob.cpp | |
| parent | a3ee61e1a97899a0d29f15cdebf6a6589aa444dd (diff) | |
DirectoryBlob: Prepare more for supporting multiple partitions
Diffstat (limited to 'Source/Core/DiscIO/DirectoryBlob.cpp')
| -rw-r--r-- | Source/Core/DiscIO/DirectoryBlob.cpp | 30 |
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 |
