Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(Database) Serial scanning for Gamecube/MegaCD/SegaCD/Saturn/PSX/PSP/Dreamcast/Wii #10291

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
132 changes: 80 additions & 52 deletions tasks/task_database.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
#include "../gfx/video_display_server.h"
#endif
#include "../verbosity.h"
#include <retroarch.h>

typedef struct database_state_handle
{
Expand Down Expand Up @@ -83,10 +84,16 @@ int gdi_find_track(const char *gdi_path, bool first,
char *track_path, uint64_t max_len);
bool gdi_next_file(intfstream_t *fd, const char *gdi_path,
char *path, uint64_t max_len);
int detect_system(intfstream_t *fd, const char** system_name);
int detect_ps1_game(intfstream_t *fd, char *game_id);
int detect_psp_game(intfstream_t *fd, char *game_id);
int detect_gc_game(intfstream_t *fd, char *game_id);

/* Database scanning system */
int detect_system(intfstream_t *fd, const char** system_name, const char *filename);
int detect_ps1_game(intfstream_t *fd, char *game_id, const char *filename);
int detect_psp_game(intfstream_t *fd, char *game_id, const char *filename);
int detect_gc_game(intfstream_t *fd, char *game_id, const char *filename);
int detect_scd_game(intfstream_t *fd, char *game_id, const char *filename);
int detect_sat_game(intfstream_t *fd, char *game_id, const char *filename);
int detect_dc_game(intfstream_t *fd, char *game_id, const char *filename);
int detect_wii_game(intfstream_t *fd, char *game_id, const char *filename);
int detect_serial_ascii_game(intfstream_t *fd, char *game_id);

static void database_info_set_type(
Expand Down Expand Up @@ -152,7 +159,7 @@ static int task_database_iterate_start(retro_task_t *task,
task_set_title(task, strdup(msg));
if (db->list->size != 0)
task_set_progress(task,
roundf((float)db->list_ptr /
roundf((float)db->list_ptr /
((float)db->list->size / 100.0f)));
#else
fprintf(stderr, "msg: %s\n", msg);
Expand All @@ -164,52 +171,73 @@ static int task_database_iterate_start(retro_task_t *task,
return 0;
}

static int intfstream_get_serial(intfstream_t *fd, char *serial)
static int intfstream_get_serial(intfstream_t *fd, char *game_id, const char *filename)
{
const char *system_name = NULL;

/* Check if the system was not auto-detected. */
if (detect_system(fd, &system_name) < 0)
{
/* Attempt to read an ASCII serial, like Wii. */
if (detect_serial_ascii_game(fd, serial))
{
/* ASCII serial (Wii) was detected. */
RARCH_LOG("%s '%s'\n", msg_hash_to_str(MSG_FOUND_DISK_LABEL), serial);
const char *system_name = NULL;
if (detect_system(fd, &system_name, filename) >= 1)
{
/** Debug: runloop_msg_queue_push(system_name, 0, 180, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); **/
}
else
{
return 0;
}

/* Any other non-system specific detection methods? */
return 0;
}
}

if (string_is_equal(system_name, "psp"))
{
if (detect_psp_game(fd, serial) == 0)
return 0;
RARCH_LOG("%s '%s'\n", msg_hash_to_str(MSG_FOUND_DISK_LABEL), serial);
}
else if (string_is_equal(system_name, "ps1"))
{
if (detect_ps1_game(fd, serial) == 0)
return 0;
RARCH_LOG("%s '%s'\n", msg_hash_to_str(MSG_FOUND_DISK_LABEL), serial);
}
else if (string_is_equal(system_name, "gc"))
{
if (detect_gc_game(fd, serial) == 0)
return 0;
RARCH_LOG("%s '%s'\n", msg_hash_to_str(MSG_FOUND_DISK_LABEL), serial);
}
else {
return 0;
}
if (string_is_equal(system_name, "Sony - PlayStation Portable"))
{
if (detect_psp_game(fd, game_id, filename) == 0)
return 0;
RARCH_LOG("Serial: %s\n", game_id);
return 1;
}
else if (string_is_equal(system_name, "Sony - PlayStation"))
{
if (detect_ps1_game(fd, game_id, filename) == 0)
return 0;
RARCH_LOG("Serial: %s\n", game_id);
return 1;
}
else if (string_is_equal(system_name, "Nintendo - GameCube"))
{
if (detect_gc_game(fd, game_id, filename) == 0)
return 0;
RARCH_LOG("Serial: %s\n", game_id);
return 1;
}
else if (string_is_equal(system_name, "Sega - Mega-CD - Sega CD"))
{
if (detect_scd_game(fd, game_id, filename) == 0)
return 0;
RARCH_LOG("Serial: %s\n", game_id);
return 1;
}
else if (string_is_equal(system_name, "Sega - Saturn"))
{
if (detect_sat_game(fd, game_id, filename) == 0)
return 0;
RARCH_LOG("Serial: %s\n", game_id);
return 1;
}
else if (string_is_equal(system_name, "Sega - Dreamcast"))
{
if (detect_dc_game(fd, game_id, filename) == 0)
return 0;
RARCH_LOG("Serial: %s\n", game_id);
return 1;
}
else if (string_is_equal(system_name, "Nintendo - Wii"))
{
if (detect_wii_game(fd, game_id, filename) == 0)
return 0;
RARCH_LOG("Serial: %s\n", game_id);
return 1;
}

return 1;
return 0;
}

static bool intfstream_file_get_serial(const char *name,
uint64_t offset, uint64_t size, char *serial)
uint64_t offset, uint64_t size, char *game_id)
{
int rv;
uint8_t *data = NULL;
Expand Down Expand Up @@ -256,7 +284,7 @@ static bool intfstream_file_get_serial(const char *name,
}
}

rv = intfstream_get_serial(fd, serial);
rv = intfstream_get_serial(fd, game_id, name);
intfstream_close(fd);
free(fd);
free(data);
Expand All @@ -268,7 +296,7 @@ static bool intfstream_file_get_serial(const char *name,
return 0;
}

static int task_database_cue_get_serial(const char *name, char* serial)
static int task_database_cue_get_serial(const char *name, char* game_id)
{
char *track_path = (char*)malloc(PATH_MAX_LENGTH
* sizeof(char));
Expand All @@ -292,13 +320,13 @@ static int task_database_cue_get_serial(const char *name, char* serial)

RARCH_LOG("%s\n", msg_hash_to_str(MSG_READING_FIRST_DATA_TRACK));

ret = intfstream_file_get_serial(track_path, offset, size, serial);
ret = intfstream_file_get_serial(track_path, offset, size, game_id);
free(track_path);

return ret;
}

static int task_database_gdi_get_serial(const char *name, char* serial)
static int task_database_gdi_get_serial(const char *name, char* game_id)
{
char *track_path = (char*)malloc(PATH_MAX_LENGTH
* sizeof(char));
Expand All @@ -320,13 +348,13 @@ static int task_database_gdi_get_serial(const char *name, char* serial)

RARCH_LOG("%s\n", msg_hash_to_str(MSG_READING_FIRST_DATA_TRACK));

ret = intfstream_file_get_serial(track_path, 0, SIZE_MAX, serial);
ret = intfstream_file_get_serial(track_path, 0, SIZE_MAX, game_id);
free(track_path);

return ret;
}

static int task_database_chd_get_serial(const char *name, char* serial)
static int task_database_chd_get_serial(const char *name, char* game_id)
{
int result;
intfstream_t *fd = intfstream_open_chd_track(
Expand All @@ -337,7 +365,7 @@ static int task_database_chd_get_serial(const char *name, char* serial)
if (!fd)
return 0;

result = intfstream_get_serial(fd, serial);
result = intfstream_get_serial(fd, game_id, name);
intfstream_close(fd);
free(fd);
return result;
Expand Down Expand Up @@ -792,7 +820,7 @@ static int database_info_list_iterate_found_match(
playlist = playlist_init(db_playlist_path, COLLECTION_SIZE);

snprintf(db_crc, PATH_MAX_LENGTH * sizeof(char),
"%08X|crc", db_info_entry->crc32);
"%s|serial", db_state->serial);

if (entry_path)
strlcpy(entry_path_str, entry_path, PATH_MAX_LENGTH * sizeof(char));
Expand Down