mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-23 06:09:50 -06:00
DiscIO: Add functions CreateDisc and CreateWAD
...in addition to the existing function CreateVolume (renamed from CreateVolumeFromFilename). Lets code easily add constraints such as not letting the user select a WAD file when using the disc changing functionality.
This commit is contained in:
@ -43,23 +43,13 @@ std::map<Language, std::string> Volume::ReadWiiNames(const std::vector<char16_t>
|
||||
return names;
|
||||
}
|
||||
|
||||
std::unique_ptr<Volume> CreateVolumeFromFilename(const std::string& filename)
|
||||
static std::unique_ptr<VolumeDisc> CreateDisc(std::unique_ptr<BlobReader>& reader)
|
||||
{
|
||||
std::unique_ptr<BlobReader> reader(CreateBlobReader(filename));
|
||||
if (reader == nullptr)
|
||||
return nullptr;
|
||||
|
||||
// Check for Wii
|
||||
const std::optional<u32> wii_magic = reader->ReadSwapped<u32>(0x18);
|
||||
if (wii_magic == u32(0x5D1C9EA3))
|
||||
return std::make_unique<VolumeWii>(std::move(reader));
|
||||
|
||||
// Check for WAD
|
||||
// 0x206962 for boot2 wads
|
||||
const std::optional<u32> wad_magic = reader->ReadSwapped<u32>(0x02);
|
||||
if (wad_magic == u32(0x00204973) || wad_magic == u32(0x00206962))
|
||||
return std::make_unique<VolumeWAD>(std::move(reader));
|
||||
|
||||
// Check for GC
|
||||
const std::optional<u32> gc_magic = reader->ReadSwapped<u32>(0x1C);
|
||||
if (gc_magic == u32(0xC2339F3D))
|
||||
@ -69,4 +59,45 @@ std::unique_ptr<Volume> CreateVolumeFromFilename(const std::string& filename)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::unique_ptr<VolumeDisc> CreateDisc(const std::string& path)
|
||||
{
|
||||
std::unique_ptr<BlobReader> reader(CreateBlobReader(path));
|
||||
return reader ? CreateDisc(reader) : nullptr;
|
||||
}
|
||||
|
||||
static std::unique_ptr<VolumeWAD> CreateWAD(std::unique_ptr<BlobReader>& reader)
|
||||
{
|
||||
// Check for WAD
|
||||
// 0x206962 for boot2 wads
|
||||
const std::optional<u32> wad_magic = reader->ReadSwapped<u32>(0x02);
|
||||
if (wad_magic == u32(0x00204973) || wad_magic == u32(0x00206962))
|
||||
return std::make_unique<VolumeWAD>(std::move(reader));
|
||||
|
||||
// No known magic words found
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::unique_ptr<VolumeWAD> CreateWAD(const std::string& path)
|
||||
{
|
||||
std::unique_ptr<BlobReader> reader(CreateBlobReader(path));
|
||||
return reader ? CreateWAD(reader) : nullptr;
|
||||
}
|
||||
|
||||
std::unique_ptr<Volume> CreateVolume(const std::string& path)
|
||||
{
|
||||
std::unique_ptr<BlobReader> reader(CreateBlobReader(path));
|
||||
if (reader == nullptr)
|
||||
return nullptr;
|
||||
|
||||
std::unique_ptr<VolumeDisc> disc = CreateDisc(reader);
|
||||
if (disc)
|
||||
return disc;
|
||||
|
||||
std::unique_ptr<VolumeWAD> wad = CreateWAD(reader);
|
||||
if (wad)
|
||||
return wad;
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
} // namespace DiscIO
|
||||
|
Reference in New Issue
Block a user