From 56d37d773bee782d64e9eaa32e881d9c6941e72b Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sat, 2 Nov 2019 16:47:08 +0100 Subject: 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 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'Source/Core/DiscIO/VolumeVerifier.cpp') 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; } -- cgit v1.2.3