diff options
| author | JosJuice <josjuice@gmail.com> | 2019-07-14 15:49:42 +0200 |
|---|---|---|
| committer | JosJuice <josjuice@gmail.com> | 2019-07-18 22:29:04 +0200 |
| commit | 0f5a4b37ee8e00210b211953969f10bfb48c5aaa (patch) | |
| tree | 1abe4225206f0f2d6522a6dea28213a7ec12bdcb /Source/Core/DiscIO/Volume.cpp | |
| parent | a77b571da7a31fe30f35605a90d040325cb1e595 (diff) | |
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.
Diffstat (limited to 'Source/Core/DiscIO/Volume.cpp')
| -rw-r--r-- | Source/Core/DiscIO/Volume.cpp | 51 |
1 files changed, 41 insertions, 10 deletions
diff --git a/Source/Core/DiscIO/Volume.cpp b/Source/Core/DiscIO/Volume.cpp index e699e46a93..e1f1bbae4e 100644 --- a/Source/Core/DiscIO/Volume.cpp +++ b/Source/Core/DiscIO/Volume.cpp @@ -43,30 +43,61 @@ 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 GC + const std::optional<u32> gc_magic = reader->ReadSwapped<u32>(0x1C); + if (gc_magic == u32(0xC2339F3D)) + return std::make_unique<VolumeGC>(std::move(reader)); + + // No known magic words found + 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)); - // Check for GC - const std::optional<u32> gc_magic = reader->ReadSwapped<u32>(0x1C); - if (gc_magic == u32(0xC2339F3D)) - return std::make_unique<VolumeGC>(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 |
