mirror of
https://github.com/libretro/RetroArch
synced 2025-03-28 19:20:35 +00:00
only scan the content databases that support the file's extension
This commit is contained in:
parent
49e54356f4
commit
fc1f2cdcf4
46
core_info.c
46
core_info.c
@ -688,6 +688,52 @@ size_t core_info_list_num_info_files(core_info_list_t *core_info_list)
|
||||
return num;
|
||||
}
|
||||
|
||||
bool core_info_unsupported_content_path(const char *path)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (!core_info_curr_list)
|
||||
return false;
|
||||
|
||||
for (i = 0; i < core_info_curr_list->count; i++)
|
||||
{
|
||||
const core_info_t *info = &core_info_curr_list->list[i];
|
||||
|
||||
if (string_list_find_elem(info->supported_extensions_list, path_get_extension(path)))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool core_info_database_supports_content_path(const char *database_path, const char *path)
|
||||
{
|
||||
size_t i;
|
||||
char *database = NULL;
|
||||
|
||||
if (!core_info_curr_list)
|
||||
return false;
|
||||
|
||||
database = strdup(path_basename(database_path));
|
||||
|
||||
path_remove_extension(database);
|
||||
|
||||
for (i = 0; i < core_info_curr_list->count; i++)
|
||||
{
|
||||
const core_info_t *info = &core_info_curr_list->list[i];
|
||||
|
||||
if (string_list_find_elem(info->supported_extensions_list, path_get_extension(path)))
|
||||
if (string_list_find_elem(info->databases_list, database))
|
||||
{
|
||||
free(database);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
free(database);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool core_info_list_get_display_name(core_info_list_t *core_info_list,
|
||||
const char *path, char *s, size_t len)
|
||||
{
|
||||
|
@ -52,7 +52,7 @@ typedef struct
|
||||
char *notes;
|
||||
struct string_list *categories_list;
|
||||
struct string_list *databases_list;
|
||||
struct string_list *note_list;
|
||||
struct string_list *note_list;
|
||||
struct string_list *supported_extensions_list;
|
||||
struct string_list *authors_list;
|
||||
struct string_list *permissions_list;
|
||||
@ -119,6 +119,10 @@ bool core_info_find(core_info_ctx_find_t *info, const char *name);
|
||||
|
||||
bool core_info_load(core_info_ctx_find_t *info);
|
||||
|
||||
bool core_info_database_supports_content_path(const char *database_path, const char *path);
|
||||
|
||||
bool core_info_unsupported_content_path(const char *path);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
#endif /* CORE_INFO_H_ */
|
||||
|
@ -23,7 +23,6 @@
|
||||
#include <queues/message_queue.h>
|
||||
#include <encodings/crc32.h>
|
||||
#include <streams/file_stream.h>
|
||||
|
||||
#include "tasks_internal.h"
|
||||
|
||||
#include "../database_info.h"
|
||||
@ -35,6 +34,7 @@
|
||||
#include "../playlist.h"
|
||||
#include "../runloop.h"
|
||||
#include "../verbosity.h"
|
||||
#include "../core_info.h"
|
||||
|
||||
#ifndef COLLECTION_SIZE
|
||||
#define COLLECTION_SIZE 99999
|
||||
@ -206,6 +206,7 @@ static int database_info_list_iterate_new(database_state_handle_t *db_state,
|
||||
const char *query)
|
||||
{
|
||||
const char *new_database = database_info_get_current_name(db_state);
|
||||
|
||||
#if 0
|
||||
RARCH_LOG("Check database [%d/%d] : %s\n", (unsigned)db_state->list_index,
|
||||
(unsigned)db_state->list->size, new_database);
|
||||
@ -311,6 +312,7 @@ static int database_info_list_iterate_next(
|
||||
static int task_database_iterate_crc_lookup(
|
||||
database_state_handle_t *db_state,
|
||||
database_info_handle_t *db,
|
||||
const char *name,
|
||||
const char *archive_entry)
|
||||
{
|
||||
|
||||
@ -321,6 +323,11 @@ static int task_database_iterate_crc_lookup(
|
||||
if (db_state->entry_index == 0)
|
||||
{
|
||||
char query[50] = {0};
|
||||
|
||||
if (!core_info_database_supports_content_path(db_state->list->elems[db_state->list_index].data, name) &&
|
||||
!core_info_unsupported_content_path(name))
|
||||
return database_info_list_iterate_next(db_state);
|
||||
|
||||
snprintf(query, sizeof(query),
|
||||
"{crc:or(b\"%08X\",b\"%08X\")}",
|
||||
swap_if_big32(db_state->crc), swap_if_big32(db_state->archive_crc));
|
||||
@ -362,7 +369,10 @@ static int task_database_iterate_crc_lookup(
|
||||
return 1;
|
||||
|
||||
database_info_list_free(db_state->info);
|
||||
free(db_state->info);
|
||||
|
||||
if (db_state->info)
|
||||
free(db_state->info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -373,7 +383,7 @@ static int task_database_iterate_playlist_archive(
|
||||
#ifdef HAVE_COMPRESSION
|
||||
if (db_state->crc != 0)
|
||||
return task_database_iterate_crc_lookup(
|
||||
db_state, db, db_state->archive_name);
|
||||
db_state, db, name, db_state->archive_name);
|
||||
|
||||
db_state->crc = file_archive_get_file_crc32(name);
|
||||
#endif
|
||||
@ -500,7 +510,7 @@ static int task_database_iterate(database_state_handle_t *db_state,
|
||||
case DATABASE_TYPE_SERIAL_LOOKUP:
|
||||
return task_database_iterate_serial_lookup(db_state, db, name);
|
||||
case DATABASE_TYPE_CRC_LOOKUP:
|
||||
return task_database_iterate_crc_lookup(db_state, db, NULL);
|
||||
return task_database_iterate_crc_lookup(db_state, db, name, NULL);
|
||||
case DATABASE_TYPE_NONE:
|
||||
default:
|
||||
break;
|
||||
@ -561,7 +571,7 @@ static void task_database_handler(retro_task_t *task)
|
||||
task_database_iterate_start(dbinfo, name);
|
||||
break;
|
||||
case DATABASE_STATUS_ITERATE:
|
||||
if (dbstate && task_database_iterate(dbstate, dbinfo) == 0)
|
||||
if (task_database_iterate(dbstate, dbinfo) == 0)
|
||||
{
|
||||
dbinfo->status = DATABASE_STATUS_ITERATE_NEXT;
|
||||
dbinfo->type = DATABASE_TYPE_ITERATE;
|
||||
|
Loading…
x
Reference in New Issue
Block a user