DirectoryBlob: Support multiple partitions

This commit is contained in:
JosJuice
2017-06-11 13:22:13 +02:00
parent 955ab72b1d
commit 34fd08e7eb
2 changed files with 181 additions and 46 deletions

View File

@ -25,6 +25,8 @@ class IOFile;
namespace DiscIO
{
enum class PartitionType : u32;
class DiscContent
{
public:
@ -67,6 +69,7 @@ public:
bool IsWii() const { return m_is_wii; }
u64 GetDataSize() const { return m_data_size; }
const std::string& GetRootDirectory() const { return m_root_directory; }
const std::vector<u8>& GetHeader() const { return m_disk_header; }
const std::set<DiscContent>& GetContents() const { return m_contents; }
private:
@ -120,15 +123,27 @@ public:
u64 GetDataSize() const override;
private:
explicit DirectoryBlobReader(const std::string& game_partition_root);
struct PartitionWithType
{
PartitionWithType(DirectoryBlobPartition&& partition_, PartitionType type_)
: partition(std::move(partition_)), type(type_)
{
}
DirectoryBlobPartition partition;
PartitionType type;
};
explicit DirectoryBlobReader(const std::string& game_partition_root,
const std::string& true_root);
bool ReadInternal(u64 offset, u64 length, u8* buffer, const std::set<DiscContent>& contents);
void SetNonpartitionDiscHeader(const std::vector<u8>& partition_header,
const std::string& game_partition_root);
void SetPartitionTable();
void SetWiiRegionData(const std::string& game_partition_root);
void SetTMDAndTicket(const std::string& partition_root);
void SetPartitions(std::vector<PartitionWithType>&& partitions);
void SetTMDAndTicket(const std::string& partition_root, u64 partition_address);
// For GameCube:
DirectoryBlobPartition m_gamecube_pseudopartition;
@ -140,16 +155,9 @@ private:
bool m_is_wii;
std::vector<u8> m_disk_header_nonpartition;
std::vector<u8> m_partition_table;
std::vector<u8> m_wii_region_data;
#pragma pack(push, 1)
struct TMDHeader
{
u32 tmd_size;
u32 tmd_offset;
} m_tmd_header;
static_assert(sizeof(TMDHeader) == 8, "Wrong size for TMDHeader");
#pragma pack(pop)
std::vector<std::vector<u8>> m_tmd_headers;
u64 m_data_size;
};