| 1240 | } |
| 1241 | |
| 1242 | const 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; |
nothing calls this directly
no test coverage detected