summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO/Volume.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/DiscIO/Volume.cpp')
-rw-r--r--Source/Core/DiscIO/Volume.cpp51
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