diff options
| author | JosJuice <josjuice@gmail.com> | 2015-01-17 13:21:02 +0100 |
|---|---|---|
| committer | JosJuice <josjuice@gmail.com> | 2015-01-17 13:21:02 +0100 |
| commit | ace060748b572063b33acee13c19000783a6cdde (patch) | |
| tree | 0569a779c5d7fec8f954e09ef732b1972f4021a5 /Source/Core/DiscIO | |
| parent | 11a36ca8e28b233f34f5c48be19fabeea92f6d38 (diff) | |
Don't read from disk when checking volume type
Should be faster than relying on the OS to cache the magic words.
Also gets rid of the odd recursive call in VolumeDirectory.
Diffstat (limited to 'Source/Core/DiscIO')
| -rw-r--r-- | Source/Core/DiscIO/BannerLoader.cpp | 3 | ||||
| -rw-r--r-- | Source/Core/DiscIO/FileMonitor.cpp | 2 | ||||
| -rw-r--r-- | Source/Core/DiscIO/Volume.h | 4 | ||||
| -rw-r--r-- | Source/Core/DiscIO/VolumeCreator.cpp | 9 | ||||
| -rw-r--r-- | Source/Core/DiscIO/VolumeDirectory.cpp | 16 | ||||
| -rw-r--r-- | Source/Core/DiscIO/VolumeDirectory.h | 3 | ||||
| -rw-r--r-- | Source/Core/DiscIO/VolumeWad.cpp | 5 | ||||
| -rw-r--r-- | Source/Core/DiscIO/VolumeWad.h | 1 | ||||
| -rw-r--r-- | Source/Core/DiscIO/VolumeWiiCrypted.cpp | 5 | ||||
| -rw-r--r-- | Source/Core/DiscIO/VolumeWiiCrypted.h | 1 |
10 files changed, 29 insertions, 20 deletions
diff --git a/Source/Core/DiscIO/BannerLoader.cpp b/Source/Core/DiscIO/BannerLoader.cpp index 3dc989684a..b5353b5a0f 100644 --- a/Source/Core/DiscIO/BannerLoader.cpp +++ b/Source/Core/DiscIO/BannerLoader.cpp @@ -8,7 +8,6 @@ #include "DiscIO/BannerLoaderGC.h" #include "DiscIO/BannerLoaderWii.h" #include "DiscIO/Filesystem.h" -#include "DiscIO/VolumeCreator.h" namespace DiscIO { @@ -18,7 +17,7 @@ class IVolume; IBannerLoader* CreateBannerLoader(DiscIO::IFileSystem& _rFileSystem, DiscIO::IVolume *pVolume) { - if (IsVolumeWiiDisc(pVolume) || IsVolumeWadFile(pVolume)) + if (pVolume->IsWiiDisc() || pVolume->IsWadFile()) return new CBannerLoaderWii(pVolume); if (_rFileSystem.IsValid()) return new CBannerLoaderGC(_rFileSystem, pVolume); diff --git a/Source/Core/DiscIO/FileMonitor.cpp b/Source/Core/DiscIO/FileMonitor.cpp index 16c110716e..830cbfac41 100644 --- a/Source/Core/DiscIO/FileMonitor.cpp +++ b/Source/Core/DiscIO/FileMonitor.cpp @@ -79,7 +79,7 @@ void ReadFileSystem(const std::string& filename) if (!OpenISO) return; - if (!DiscIO::IsVolumeWadFile(OpenISO)) + if (!OpenISO->IsWadFile()) { pFileSystem = DiscIO::CreateFileSystem(OpenISO); diff --git a/Source/Core/DiscIO/Volume.h b/Source/Core/DiscIO/Volume.h index 097da655bc..b3bc4fc178 100644 --- a/Source/Core/DiscIO/Volume.h +++ b/Source/Core/DiscIO/Volume.h @@ -36,9 +36,11 @@ public: virtual std::vector<std::string> GetNames() const = 0; virtual u32 GetFSTSize() const = 0; virtual std::string GetApploaderDate() const = 0; + virtual bool IsDiscTwo() const { return false; } + virtual bool IsWiiDisc() const { return false; } + virtual bool IsWadFile() const { return false; } virtual bool SupportsIntegrityCheck() const { return false; } virtual bool CheckIntegrity() const { return false; } - virtual bool IsDiscTwo() const { return false; } virtual bool ChangePartition(u64 offset) { return false; } diff --git a/Source/Core/DiscIO/VolumeCreator.cpp b/Source/Core/DiscIO/VolumeCreator.cpp index 73feb93780..4b6053027c 100644 --- a/Source/Core/DiscIO/VolumeCreator.cpp +++ b/Source/Core/DiscIO/VolumeCreator.cpp @@ -120,15 +120,6 @@ IVolume* CreateVolumeFromDirectory(const std::string& _rDirectory, bool _bIsWii, return nullptr; } -bool IsVolumeWiiDisc(const IVolume *_rVolume) -{ - u32 MagicWord = 0; - _rVolume->Read(0x18, 4, (u8*)&MagicWord, false); - - return (Common::swap32(MagicWord) == 0x5D1C9EA3); - //GameCube 0xc2339f3d -} - bool IsVolumeWadFile(const IVolume *_rVolume) { u32 MagicWord = 0; diff --git a/Source/Core/DiscIO/VolumeDirectory.cpp b/Source/Core/DiscIO/VolumeDirectory.cpp index 10a3e51f05..385dd73e7d 100644 --- a/Source/Core/DiscIO/VolumeDirectory.cpp +++ b/Source/Core/DiscIO/VolumeDirectory.cpp @@ -66,12 +66,7 @@ bool CVolumeDirectory::IsValidDirectory(const std::string& _rDirectory) bool CVolumeDirectory::Read(u64 _Offset, u64 _Length, u8* _pBuffer, bool decrypt) const { - // VolumeHandler::IsWii is used here to check whether a Wii disc is used. - // That function calls this function to check a magic word in the disc header, - // so it is important that VolumeHandler::IsWii is not called when the header - // is being read with decrypt=false, as it would result in a stack overflow. - - if (!decrypt && (_Offset + _Length >= 0x400) && VolumeHandler::IsWii()) + if (!decrypt && (_Offset + _Length >= 0x400) && m_is_wii) { // Fully supporting this would require re-encrypting every file that's read. // Only supporting the areas that IOS allows software to read could be more feasible. @@ -81,7 +76,7 @@ bool CVolumeDirectory::Read(u64 _Offset, u64 _Length, u8* _pBuffer, bool decrypt return false; } - if (decrypt && !VolumeHandler::IsWii()) + if (decrypt && !m_is_wii) PanicAlertT("Tried to decrypt data from a non-Wii volume"); // header @@ -210,6 +205,11 @@ std::string CVolumeDirectory::GetApploaderDate() const return "VOID"; } +bool CVolumeDirectory::IsWiiDisc() const +{ + return m_is_wii; +} + u64 CVolumeDirectory::GetSize() const { return 0; @@ -253,6 +253,7 @@ void CVolumeDirectory::SetDiskTypeWii() m_diskHeader[0x1b] = 0xa3; memset(&m_diskHeader[0x1c], 0, 4); + m_is_wii = true; m_addressShift = 2; } @@ -264,6 +265,7 @@ void CVolumeDirectory::SetDiskTypeGC() m_diskHeader[0x1e] = 0x9f; m_diskHeader[0x1f] = 0x3d; + m_is_wii = false; m_addressShift = 0; } diff --git a/Source/Core/DiscIO/VolumeDirectory.h b/Source/Core/DiscIO/VolumeDirectory.h index 53ebb1acd2..16b77c5acc 100644 --- a/Source/Core/DiscIO/VolumeDirectory.h +++ b/Source/Core/DiscIO/VolumeDirectory.h @@ -45,6 +45,7 @@ public: u32 GetFSTSize() const override; std::string GetApploaderDate() const override; + bool IsWiiDisc() const override; ECountry GetCountry() const override; @@ -85,6 +86,8 @@ private: u32 m_totalNameSize; + bool m_is_wii; + // GameCube has no shift, Wii has 2 bit shift u32 m_addressShift; diff --git a/Source/Core/DiscIO/VolumeWad.cpp b/Source/Core/DiscIO/VolumeWad.cpp index 014792fc75..13fecce313 100644 --- a/Source/Core/DiscIO/VolumeWad.cpp +++ b/Source/Core/DiscIO/VolumeWad.cpp @@ -103,6 +103,11 @@ bool CVolumeWAD::GetTitleID(u8* _pBuffer) const return true; } +bool CVolumeWAD::IsWadFile() const +{ + return true; +} + std::vector<std::string> CVolumeWAD::GetNames() const { std::vector<std::string> names; diff --git a/Source/Core/DiscIO/VolumeWad.h b/Source/Core/DiscIO/VolumeWad.h index 93ed22949e..58dc662d73 100644 --- a/Source/Core/DiscIO/VolumeWad.h +++ b/Source/Core/DiscIO/VolumeWad.h @@ -32,6 +32,7 @@ public: std::vector<std::string> GetNames() const override; u32 GetFSTSize() const override { return 0; } std::string GetApploaderDate() const override { return "0"; } + bool IsWadFile() const override; ECountry GetCountry() const override; u64 GetSize() const override; u64 GetRawSize() const override; diff --git a/Source/Core/DiscIO/VolumeWiiCrypted.cpp b/Source/Core/DiscIO/VolumeWiiCrypted.cpp index 80dc53a123..d956b9444d 100644 --- a/Source/Core/DiscIO/VolumeWiiCrypted.cpp +++ b/Source/Core/DiscIO/VolumeWiiCrypted.cpp @@ -227,6 +227,11 @@ std::string CVolumeWiiCrypted::GetApploaderDate() const return date; } +bool CVolumeWiiCrypted::IsWiiDisc() const +{ + return true; +} + u64 CVolumeWiiCrypted::GetSize() const { if (m_pReader) diff --git a/Source/Core/DiscIO/VolumeWiiCrypted.h b/Source/Core/DiscIO/VolumeWiiCrypted.h index fd397e19c3..1cca81c410 100644 --- a/Source/Core/DiscIO/VolumeWiiCrypted.h +++ b/Source/Core/DiscIO/VolumeWiiCrypted.h @@ -32,6 +32,7 @@ public: std::vector<std::string> GetNames() const override; u32 GetFSTSize() const override; std::string GetApploaderDate() const override; + bool IsWiiDisc() const override; ECountry GetCountry() const override; u64 GetSize() const override; u64 GetRawSize() const override; |
