summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO/VolumeCreator.cpp
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2017-05-19 18:18:43 +0200
committerJosJuice <josjuice@gmail.com>2017-05-19 18:18:43 +0200
commit56b218a7505d11b72dec1d5b36e948f77950331a (patch)
tree1bb28ad7665c804678e6d980d63d0881885a7c4f /Source/Core/DiscIO/VolumeCreator.cpp
parent643b218c1dbc26f619b2ed6dac29925bab85fccc (diff)
DiscIO: Simplify volume creation
Basically inlining GetDiscType into CreateVolumeFromFilename.
Diffstat (limited to 'Source/Core/DiscIO/VolumeCreator.cpp')
-rw-r--r--Source/Core/DiscIO/VolumeCreator.cpp73
1 files changed, 20 insertions, 53 deletions
diff --git a/Source/Core/DiscIO/VolumeCreator.cpp b/Source/Core/DiscIO/VolumeCreator.cpp
index 4b2c23aea9..63046bce95 100644
--- a/Source/Core/DiscIO/VolumeCreator.cpp
+++ b/Source/Core/DiscIO/VolumeCreator.cpp
@@ -22,39 +22,37 @@
namespace DiscIO
{
-enum EDiscType
-{
- DISC_TYPE_UNK,
- DISC_TYPE_WII,
- DISC_TYPE_WII_CONTAINER,
- DISC_TYPE_GC,
- DISC_TYPE_WAD
-};
-
-EDiscType GetDiscType(IBlobReader& _rReader);
-
std::unique_ptr<IVolume> CreateVolumeFromFilename(const std::string& filename)
{
std::unique_ptr<IBlobReader> reader(CreateBlobReader(filename));
if (reader == nullptr)
return nullptr;
+ CBlobBigEndianReader be_reader(*reader);
- switch (GetDiscType(*reader))
- {
- case DISC_TYPE_WII:
- case DISC_TYPE_GC:
+ // Check for Wii
+ u32 wii_magic = 0;
+ be_reader.ReadSwapped(0x18, &wii_magic);
+ u32 wii_container_magic = 0;
+ be_reader.ReadSwapped(0x60, &wii_container_magic);
+ if (wii_magic == 0x5D1C9EA3 && wii_container_magic != 0)
return std::make_unique<CVolumeGC>(std::move(reader));
+ if (wii_magic == 0x5D1C9EA3 && wii_container_magic == 0)
+ return std::make_unique<CVolumeWiiCrypted>(std::move(reader));
- case DISC_TYPE_WAD:
+ // Check for WAD
+ // 0x206962 for boot2 wads
+ u32 wad_magic = 0;
+ be_reader.ReadSwapped(0x02, &wad_magic);
+ if (wad_magic == 0x00204973 || wad_magic == 0x00206962)
return std::make_unique<CVolumeWAD>(std::move(reader));
- case DISC_TYPE_WII_CONTAINER:
- return std::make_unique<CVolumeWiiCrypted>(std::move(reader));
-
- case DISC_TYPE_UNK:
- return nullptr;
- }
+ // Check for GC
+ u32 gc_magic = 0;
+ be_reader.ReadSwapped(0x1C, &gc_magic);
+ if (gc_magic == 0xC2339F3D)
+ return std::make_unique<CVolumeGC>(std::move(reader));
+ // No known magic words found
return nullptr;
}
@@ -68,35 +66,4 @@ std::unique_ptr<IVolume> CreateVolumeFromDirectory(const std::string& directory,
return nullptr;
}
-EDiscType GetDiscType(IBlobReader& _rReader)
-{
- CBlobBigEndianReader Reader(_rReader);
-
- // Check for Wii
- u32 WiiMagic = 0;
- Reader.ReadSwapped(0x18, &WiiMagic);
- u32 WiiContainerMagic = 0;
- Reader.ReadSwapped(0x60, &WiiContainerMagic);
- if (WiiMagic == 0x5D1C9EA3 && WiiContainerMagic != 0)
- return DISC_TYPE_WII;
- if (WiiMagic == 0x5D1C9EA3 && WiiContainerMagic == 0)
- return DISC_TYPE_WII_CONTAINER;
-
- // Check for WAD
- // 0x206962 for boot2 wads
- u32 WADMagic = 0;
- Reader.ReadSwapped(0x02, &WADMagic);
- if (WADMagic == 0x00204973 || WADMagic == 0x00206962)
- return DISC_TYPE_WAD;
-
- // Check for GC
- u32 GCMagic = 0;
- Reader.ReadSwapped(0x1C, &GCMagic);
- if (GCMagic == 0xC2339F3D)
- return DISC_TYPE_GC;
-
- // No known magic words found
- return DISC_TYPE_UNK;
-}
-
} // namespace