MCPcopy Create free account
hub / github.com/PCSX2/pcsx2 / lookupHash

Method lookupHash

pcsx2/GameDatabase.cpp:1242–1320  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1240}
1241
1242const GameDatabase::HashDatabaseEntry* GameDatabase::lookupHash(
1243 const TrackHash* tracks, size_t num_tracks, bool* tracks_matched, std::string* match_error)
1244{
1245 loadHashDatabase();
1246
1247 if (num_tracks == 0)
1248 {
1249 *match_error = TRANSLATE_STR("GameDatabase", "No tracks provided.");
1250 std::memset(tracks_matched, 0, sizeof(bool) * num_tracks);
1251 return nullptr;
1252 }
1253
1254 // match the first track, for DVDs this will be all there is anyway
1255 const auto data_iter = s_track_hash_to_entry_map.find(tracks[0]);
1256 if (data_iter == s_track_hash_to_entry_map.end())
1257 {
1258 *match_error = fmt::format(TRANSLATE_FS("GameDatabase", "Hash {} is not in database."), tracks[0].toString());
1259 std::memset(tracks_matched, 0, sizeof(bool) * num_tracks);
1260 return nullptr;
1261 }
1262
1263 // make sure they're not missing the data track
1264 const GameDatabase::HashDatabaseEntry* candidate = &s_hash_database[data_iter->second];
1265 if (getTrackIndex(candidate->tracks.data(), candidate->tracks.size(), tracks[0]) != 0)
1266 {
1267 *match_error = TRANSLATE_STR("GameDatabase", "Data track number does not match data track in database.");
1268 std::memset(tracks_matched, 0, sizeof(bool) * num_tracks);
1269 return nullptr;
1270 }
1271
1272 // first track is okay!
1273 tracks_matched[0] = true;
1274 match_error->clear();
1275
1276 // now check any audio tracks...
1277 bool all_okay = true;
1278 for (size_t track = 1; track < num_tracks; track++)
1279 {
1280 const auto audio_iter = s_track_hash_to_entry_map.find(tracks[track]);
1281 if (audio_iter != s_track_hash_to_entry_map.end())
1282 {
1283 fmt::format_to(std::back_inserter(*match_error),
1284 TRANSLATE_FS("GameDatabase", "Track {0} with hash {1} is not found in database.\n"), track + 1,
1285 tracks[track].toString());
1286 tracks_matched[track] = false;
1287 all_okay = false;
1288 continue;
1289 }
1290
1291 // same game?
1292 if (audio_iter->second != data_iter->second)
1293 {
1294 fmt::format_to(std::back_inserter(*match_error),
1295 TRANSLATE_FS("GameDatabase", "Track {0} with hash {1} is for a different game ({2}).\n"), track + 1,
1296 tracks[track].toString(), s_hash_database[audio_iter->second].name);
1297 tracks_matched[track] = false;
1298 all_okay = false;
1299 continue;

Callers

nothing calls this directly

Calls 12

getTrackIndexFunction · 0.85
formatFunction · 0.50
format_toFunction · 0.50
findMethod · 0.45
endMethod · 0.45
toStringMethod · 0.45
dataMethod · 0.45
sizeMethod · 0.45
clearMethod · 0.45
emptyMethod · 0.45
backMethod · 0.45
pop_backMethod · 0.45

Tested by

no test coverage detected