GameDatabase: Fix identification of misnamed-exe games

This commit is contained in:
Stenzek 2023-11-29 23:05:27 +10:00
parent 35799aba47
commit 4ac4388b08
No known key found for this signature in database
5 changed files with 51 additions and 12 deletions

View File

@ -41,6 +41,7 @@ enum : u32
}; };
static Entry* GetMutableEntry(const std::string_view& serial); static Entry* GetMutableEntry(const std::string_view& serial);
static const Entry* GetEntryForId(const std::string_view& code);
static bool LoadFromCache(); static bool LoadFromCache();
static bool SaveToCache(); static bool SaveToCache();
@ -149,15 +150,32 @@ std::string GameDatabase::GetSerialForPath(const char* path)
const GameDatabase::Entry* GameDatabase::GetEntryForDisc(CDImage* image) const GameDatabase::Entry* GameDatabase::GetEntryForDisc(CDImage* image)
{ {
std::string id; std::string id;
System::GetGameDetailsFromImage(image, &id, nullptr); System::GameHash hash;
System::GetGameDetailsFromImage(image, &id, &hash);
const Entry* entry = GetEntryForGameDetails(id, hash);
if (entry)
return entry;
Log_WarningPrintf("No entry found for disc '%s'", id.c_str());
return nullptr;
}
const GameDatabase::Entry* GameDatabase::GetEntryForGameDetails(const std::string& id, u64 hash)
{
const Entry* entry;
if (!id.empty()) if (!id.empty())
{ {
const Entry* entry = GetEntryForId(id); entry = GetEntryForId(id);
if (entry) if (entry)
return entry; return entry;
} }
Log_WarningPrintf("No entry found for disc '%s'", id.c_str()); // some games with invalid serials use the hash
entry = GetEntryForId(System::GetGameHashId(hash));
if (entry)
return entry;
return nullptr; return nullptr;
} }

View File

@ -92,7 +92,7 @@ void EnsureLoaded();
void Unload(); void Unload();
const Entry* GetEntryForDisc(CDImage* image); const Entry* GetEntryForDisc(CDImage* image);
const Entry* GetEntryForId(const std::string_view& code); const Entry* GetEntryForGameDetails(const std::string& id, u64 hash);
const Entry* GetEntryForSerial(const std::string_view& serial); const Entry* GetEntryForSerial(const std::string_view& serial);
std::string GetSerialForDisc(CDImage* image); std::string GetSerialForDisc(CDImage* image);
std::string GetSerialForPath(const char* path); std::string GetSerialForPath(const char* path);

View File

@ -216,7 +216,7 @@ bool GameList::GetDiscListEntry(const std::string& path, Entry* entry)
System::GetGameDetailsFromImage(cdi.get(), &id, &entry->hash); System::GetGameDetailsFromImage(cdi.get(), &id, &entry->hash);
// try the database first // try the database first
const GameDatabase::Entry* dentry = GameDatabase::GetEntryForId(id); const GameDatabase::Entry* dentry = GameDatabase::GetEntryForGameDetails(id, entry->hash);
if (dentry) if (dentry)
{ {
// pull from database // pull from database

View File

@ -3346,7 +3346,7 @@ void System::UpdateRunningGame(const char* path, CDImage* image, bool booting)
std::string id; std::string id;
GetGameDetailsFromImage(image, &id, &s_running_game_hash); GetGameDetailsFromImage(image, &id, &s_running_game_hash);
s_running_game_entry = GameDatabase::GetEntryForId(id); s_running_game_entry = GameDatabase::GetEntryForGameDetails(id, s_running_game_hash);
if (s_running_game_entry) if (s_running_game_entry)
{ {
s_running_game_serial = s_running_game_entry->serial; s_running_game_serial = s_running_game_entry->serial;

View File

@ -26,11 +26,15 @@
#include "util/ini_settings_interface.h" #include "util/ini_settings_interface.h"
#include "common/assert.h" #include "common/assert.h"
#include "common/error.h"
#include "common/file_system.h" #include "common/file_system.h"
#include "common/log.h"
#include <QtWidgets/QMessageBox> #include <QtWidgets/QMessageBox>
#include <QtWidgets/QTextEdit> #include <QtWidgets/QTextEdit>
Log_SetChannel(SettingsWindow);
static QList<SettingsWindow*> s_open_game_properties_dialogs; static QList<SettingsWindow*> s_open_game_properties_dialogs;
SettingsWindow::SettingsWindow() : QWidget() SettingsWindow::SettingsWindow() : QWidget()
@ -484,18 +488,35 @@ void SettingsWindow::openGamePropertiesDialog(const std::string& path, const std
} }
} }
std::string filename(System::GetGameSettingsPath(serial)); const GameDatabase::Entry* dentry = nullptr;
std::unique_ptr<INISettingsInterface> sif = std::make_unique<INISettingsInterface>(std::move(filename)); if (!System::IsExeFileName(path) && !System::IsPsfFileName(path))
{
// Need to resolve hash games.
Error error;
std::unique_ptr<CDImage> image = CDImage::Open(path.c_str(), false, &error);
if (image)
dentry = GameDatabase::GetEntryForDisc(image.get());
else
Log_ErrorFmt("Failed to open '{}' for game properties: {}", path, error.GetDescription());
if (!dentry)
{
// Use the serial and hope for the best...
dentry = GameDatabase::GetEntryForSerial(serial);
}
}
const std::string& real_serial = dentry ? dentry->serial : serial;
std::string ini_filename = System::GetGameSettingsPath(real_serial);
std::unique_ptr<INISettingsInterface> sif = std::make_unique<INISettingsInterface>(std::move(ini_filename));
if (FileSystem::FileExists(sif->GetFileName().c_str())) if (FileSystem::FileExists(sif->GetFileName().c_str()))
sif->Load(); sif->Load();
const GameDatabase::Entry* dentry = GameDatabase::GetEntryForSerial(serial);
const QString window_title(tr("%1 [%2]") const QString window_title(tr("%1 [%2]")
.arg(dentry ? QtUtils::StringViewToQString(dentry->title) : QStringLiteral("<UNKNOWN>")) .arg(dentry ? QtUtils::StringViewToQString(dentry->title) : QStringLiteral("<UNKNOWN>"))
.arg(QtUtils::StringViewToQString(serial))); .arg(QtUtils::StringViewToQString(real_serial)));
SettingsWindow* dialog = new SettingsWindow(path, serial, region, dentry, std::move(sif)); SettingsWindow* dialog = new SettingsWindow(path, real_serial, region, dentry, std::move(sif));
dialog->setWindowTitle(window_title); dialog->setWindowTitle(window_title);
dialog->show(); dialog->show();
} }