summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO/VolumeVerifier.cpp
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2019-08-23 22:38:44 +0200
committerJosJuice <josjuice@gmail.com>2019-08-24 16:37:19 +0200
commit3eb360b8185f8f0284e3f67de1bd3d9d8225e98d (patch)
tree4bf119fac63329500bdc2cf14aa33bbbcfd22a26 /Source/Core/DiscIO/VolumeVerifier.cpp
parent22933d85020b0b1f4ff285fbfdfca940f52fe1c3 (diff)
VolumeVerifier: Add zip support for datfile
Diffstat (limited to 'Source/Core/DiscIO/VolumeVerifier.cpp')
-rw-r--r--Source/Core/DiscIO/VolumeVerifier.cpp50
1 files changed, 38 insertions, 12 deletions
diff --git a/Source/Core/DiscIO/VolumeVerifier.cpp b/Source/Core/DiscIO/VolumeVerifier.cpp
index b0d4e8c3c5..de100bfb76 100644
--- a/Source/Core/DiscIO/VolumeVerifier.cpp
+++ b/Source/Core/DiscIO/VolumeVerifier.cpp
@@ -16,6 +16,7 @@
#include <mbedtls/md5.h>
#include <mbedtls/sha1.h>
+#include <minizip/unzip.h>
#include <pugixml.hpp>
#include <zlib.h>
@@ -25,7 +26,9 @@
#include "Common/CommonTypes.h"
#include "Common/FileUtil.h"
#include "Common/Logging/Log.h"
+#include "Common/MinizipUtil.h"
#include "Common/MsgHandler.h"
+#include "Common/ScopeGuard.h"
#include "Common/StringUtil.h"
#include "Common/Swap.h"
#include "Core/IOS/Device.h"
@@ -46,9 +49,9 @@ namespace DiscIO
void RedumpVerifier::Start(const Volume& volume)
{
if (volume.GetVolumeType() == Platform::GameCubeDisc)
- m_dat_filename = "gamecube.dat";
+ m_platform = "gc";
else if (volume.GetVolumeType() == Platform::WiiDisc)
- m_dat_filename = "wii.dat";
+ m_platform = "wii";
else
m_result.status = Status::Error;
@@ -62,7 +65,35 @@ void RedumpVerifier::Start(const Volume& volume)
m_disc_number = volume.GetDiscNumber().value_or(0);
m_size = volume.GetSize();
- m_future = std::async(std::launch::async, [this] { return ScanXML(); });
+ m_future = std::async(std::launch::async, [this] { return ScanDatfile(ReadDatfile()); });
+}
+
+std::vector<u8> RedumpVerifier::ReadDatfile()
+{
+ const std::string path = File::GetUserPath(D_REDUMPCACHE_IDX) + DIR_SEP + m_platform + ".zip";
+
+ unzFile file = unzOpen(path.c_str());
+ if (!file)
+ return {};
+
+ Common::ScopeGuard file_guard{[&] { unzClose(file); }};
+
+ // Check that the zip file contains exactly one file
+ if (unzGoToFirstFile(file) != UNZ_OK)
+ return {};
+ if (unzGoToNextFile(file) != UNZ_END_OF_LIST_OF_FILE)
+ return {};
+
+ // Read the file
+ if (unzGoToFirstFile(file) != UNZ_OK)
+ return {};
+ unz_file_info file_info;
+ unzGetCurrentFileInfo(file, &file_info, nullptr, 0, nullptr, 0, nullptr, 0);
+ std::vector<u8> data(file_info.uncompressed_size);
+ if (!Common::ReadFileFromZip(file, &data))
+ return {};
+
+ return data;
}
static u8 ParseHexDigit(char c)
@@ -93,18 +124,13 @@ static std::vector<u8> ParseHash(const char* str)
return hash;
}
-std::vector<RedumpVerifier::PotentialMatch> RedumpVerifier::ScanXML()
+std::vector<RedumpVerifier::PotentialMatch> RedumpVerifier::ScanDatfile(const std::vector<u8>& data)
{
- const std::string path = File::GetUserPath(D_REDUMPCACHE_IDX) + DIR_SEP + m_dat_filename;
-
pugi::xml_document doc;
+ if (!doc.load_buffer(data.data(), data.size()))
{
- std::string data;
- if (!File::ReadFileToString(path, data) || !doc.load_buffer(data.data(), data.size()))
- {
- m_result = {Status::Error, Common::GetStringT("Failed to parse Redump.org data")};
- return {};
- }
+ m_result = {Status::Error, Common::GetStringT("Failed to parse Redump.org data")};
+ return {};
}
std::vector<PotentialMatch> potential_matches;