From 56d37d773bee782d64e9eaa32e881d9c6941e72b Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sat, 2 Nov 2019 16:47:08 +0100 Subject: [PATCH] RedumpVerifier: Show an error when datfile lacks serials or versions This happens if someone manually downloads a regular datfile from redump.org and puts it where Dolphin stores datfiles. Dolphin needs "special" datfiles that contain fields for serials and versions. Before this change, all discs (except Datel discs) would show up as "Unknown disc" when using a regular datfile. --- Source/Core/DiscIO/VolumeVerifier.cpp | 22 ++++++++++++++++++++-- Source/Core/DiscIO/VolumeVerifier.h | 2 +- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Source/Core/DiscIO/VolumeVerifier.cpp b/Source/Core/DiscIO/VolumeVerifier.cpp index bad2790a4d..67ade47f55 100644 --- a/Source/Core/DiscIO/VolumeVerifier.cpp +++ b/Source/Core/DiscIO/VolumeVerifier.cpp @@ -99,7 +99,7 @@ void RedumpVerifier::Start(const Volume& volume) ERROR_LOG(DISCIO, "Failed to fetch data from Redump.org, using old cached data instead"); [[fallthrough]]; case DownloadStatus::Success: - return ScanDatfile(ReadDatfile(system)); + return ScanDatfile(ReadDatfile(system), system); case DownloadStatus::SystemNotAvailable: m_result = {Status::Error, Common::GetStringT("Wii data is not public yet")}; @@ -213,7 +213,8 @@ static std::vector ParseHash(const char* str) return hash; } -std::vector RedumpVerifier::ScanDatfile(const std::vector& data) +std::vector RedumpVerifier::ScanDatfile(const std::vector& data, + const std::string& system) { pugi::xml_document doc; if (!doc.load_buffer(data.data(), data.size())) @@ -223,10 +224,14 @@ std::vector RedumpVerifier::ScanDatfile(const st } std::vector potential_matches; + bool serials_exist = false; + bool versions_exist = false; const pugi::xml_node datafile = doc.child("datafile"); for (const pugi::xml_node game : datafile.children("game")) { std::string version_string = game.child("version").text().as_string(); + if (!version_string.empty()) + versions_exist = true; // Strip out prefix (e.g. "v1.02" -> "02", "Rev 2" -> "2") const size_t last_non_numeric = version_string.find_last_not_of("0123456789"); @@ -241,6 +246,8 @@ std::vector RedumpVerifier::ScanDatfile(const st continue; const std::string serials = game.child("serial").text().as_string(); + if (!serials.empty()) + serials_exist = true; if (serials.empty() || StringBeginsWith(serials, "DS")) { // GC Datel discs have no serials in Redump, Wii Datel discs have serials like "DS000101" @@ -299,6 +306,17 @@ std::vector RedumpVerifier::ScanDatfile(const st potential_match.hashes.sha1 = ParseHash(rom.attribute("sha1").value()); } + if (!serials_exist || !versions_exist) + { + // If we reach this, the user has most likely downloaded a datfile manually, + // so show a panic alert rather than just using ERROR_LOG + + // i18n: "Serial" refers to serial numbers, e.g. RVL-RSBE-USA + PanicAlertT("Serial and/or version data is missing from %s", GetPathForSystem(system).c_str()); + m_result = {Status::Error, Common::GetStringT("Failed to parse Redump.org data")}; + return {}; + } + return potential_matches; } diff --git a/Source/Core/DiscIO/VolumeVerifier.h b/Source/Core/DiscIO/VolumeVerifier.h index b2f447db91..c9e69c3b09 100644 --- a/Source/Core/DiscIO/VolumeVerifier.h +++ b/Source/Core/DiscIO/VolumeVerifier.h @@ -88,7 +88,7 @@ private: static DownloadStatus DownloadDatfile(const std::string& system, DownloadStatus old_status); static std::vector ReadDatfile(const std::string& system); - std::vector ScanDatfile(const std::vector& data); + std::vector ScanDatfile(const std::vector& data, const std::string& system); std::string m_game_id; u16 m_revision;