(task_content.c) Move global variables to struct

This commit is contained in:
twinaphex 2020-03-12 06:45:17 +01:00
parent 0611581b28
commit f13a4b10ee

View File

@ -120,7 +120,7 @@ typedef struct content_information_ctx content_information_ctx_t;
#ifdef HAVE_CDROM
enum cdrom_dump_state
{
DUMP_STATE_TOC_PENDING,
DUMP_STATE_TOC_PENDING = 0,
DUMP_STATE_WRITE_CUE,
DUMP_STATE_NEXT_TRACK,
DUMP_STATE_READ_TRACK
@ -128,33 +128,43 @@ enum cdrom_dump_state
typedef struct
{
RFILE *file;
RFILE *output_file;
libretro_vfs_implementation_file *stream;
const cdrom_toc_t *toc;
char cdrom_path[64];
char drive_letter[2];
char title[512];
bool next;
enum cdrom_dump_state state;
unsigned char cur_track;
int64_t cur_track_bytes;
int64_t track_written_bytes;
int64_t disc_total_bytes;
int64_t disc_read_bytes;
bool next;
enum cdrom_dump_state state;
char drive_letter[2];
char cdrom_path[64];
char title[512];
const cdrom_toc_t *toc;
RFILE *file;
RFILE *output_file;
libretro_vfs_implementation_file *stream;
} task_cdrom_dump_state_t;
#endif
struct content_stream
{
uint32_t a;
const uint8_t *b;
size_t c;
uint32_t a;
uint32_t crc;
};
struct content_information_ctx
{
bool is_ips_pref;
bool is_bps_pref;
bool is_ups_pref;
bool block_extract;
bool need_fullpath;
bool set_supports_no_game_enable;
bool patch_is_blocked;
bool bios_is_missing;
bool check_firmware_before_loading;
struct
{
struct retro_subsystem_info *data;
@ -169,38 +179,33 @@ struct content_information_ctx
char *directory_cache;
char *directory_system;
bool is_ips_pref;
bool is_bps_pref;
bool is_ups_pref;
bool block_extract;
bool need_fullpath;
bool set_supports_no_game_enable;
bool patch_is_blocked;
bool bios_is_missing;
bool check_firmware_before_loading;
struct string_list *temporary_content;
};
static struct string_list *temporary_content = NULL;
static bool _launched_from_cli = true;
static bool _content_is_inited = false;
static bool core_does_not_need_content = false;
static uint32_t content_rom_crc = 0;
static bool pending_subsystem_init = false;
static int pending_subsystem_rom_num = 0;
static int pending_subsystem_id = 0;
static unsigned pending_subsystem_rom_id = 0;
typedef struct content_state
{
bool is_inited;
bool core_does_not_need_content;
bool pending_subsystem_init;
bool pending_rom_crc;
static bool pending_content_rom_crc = false;
static char pending_content_rom_crc_path[PATH_MAX_LENGTH] = {0};
int pending_subsystem_rom_num;
int pending_subsystem_id;
unsigned pending_subsystem_rom_id;
uint32_t rom_crc;
static char pending_subsystem_ident[255];
static char *pending_subsystem_roms[RARCH_MAX_SUBSYSTEM_ROMS];
char companion_ui_crc32[32];
char pending_subsystem_ident[255];
char pending_rom_crc_path[PATH_MAX_LENGTH];
char companion_ui_db_name[PATH_MAX_LENGTH];
char *pending_subsystem_roms[RARCH_MAX_SUBSYSTEM_ROMS];
static char companion_ui_db_name[PATH_MAX_LENGTH] = {0};
static char companion_ui_crc32[32] = {0};
struct string_list *temporary_content;
} content_state_t;
static content_state_t content_st = {};
#ifdef HAVE_CDROM
static void task_cdrom_dump_handler(retro_task_t *task)
@ -213,15 +218,11 @@ static void task_cdrom_dump_handler(retro_task_t *task)
if (task_get_progress(task) == 100)
{
if (state->file)
{
filestream_close(state->file);
state->file = NULL;
}
if (state->output_file)
{
filestream_close(state->output_file);
state->file = NULL;
}
state->file = NULL;
state->output_file = NULL;
task_set_finished(task, true);
@ -581,6 +582,7 @@ static bool content_load(content_ctx_info_t *info)
char **rarch_argv_ptr = (char**)info->argv;
int *rarch_argc_ptr = (int*)&info->argc;
struct rarch_main_wrap *wrap_args = NULL;
content_state_t *p_content = (content_state_t*)&content_st;
if (!(wrap_args = (struct rarch_main_wrap*)
calloc(1, sizeof(*wrap_args))))
@ -613,7 +615,7 @@ static bool content_load(content_ctx_info_t *info)
return false;
}
if (pending_subsystem_init)
if (p_content->pending_subsystem_init)
{
command_event(CMD_EVENT_CORE_INIT, NULL);
content_clear_subsystem();
@ -656,7 +658,8 @@ static bool load_content_into_memory(
unsigned i, const char *path, void **buf,
int64_t *length)
{
uint8_t *ret_buf = NULL;
uint8_t *ret_buf = NULL;
content_state_t *p_content = (content_state_t*)&content_st;
RARCH_LOG("%s: %s.\n",
msg_hash_to_str(MSG_LOADING_CONTENT_FILE), path);
@ -693,18 +696,18 @@ static bool load_content_into_memory(
if (has_patch)
{
content_rom_crc = encoding_crc32(0, ret_buf, (size_t)*length);
RARCH_LOG("CRC32: 0x%x .\n", (unsigned)content_rom_crc);
p_content->rom_crc = encoding_crc32(0, ret_buf, (size_t)*length);
RARCH_LOG("CRC32: 0x%x .\n", (unsigned)p_content->rom_crc);
}
else
{
pending_content_rom_crc = true;
strlcpy(pending_content_rom_crc_path,
path, sizeof(pending_content_rom_crc_path));
p_content->pending_rom_crc = true;
strlcpy(p_content->pending_rom_crc_path,
path, sizeof(p_content->pending_rom_crc_path));
}
}
else
content_rom_crc = 0;
p_content->rom_crc = 0;
}
*buf = ret_buf;
@ -898,6 +901,7 @@ static bool content_file_load(
#ifdef __WINRT__
rarch_system_info_t *system = runloop_get_system_info();
#endif
content_state_t *p_content = (content_state_t*)&content_st;
for (i = 0; i < content->size; i++)
{
@ -1042,9 +1046,9 @@ static bool content_file_load(
RARCH_LOG("%s\n", msg_hash_to_str(
MSG_CONTENT_LOADING_SKIPPED_IMPLEMENTATION_WILL_DO_IT));
pending_content_rom_crc = true;
strlcpy(pending_content_rom_crc_path,
path, sizeof(pending_content_rom_crc_path));
p_content->pending_rom_crc = true;
strlcpy(p_content->pending_rom_crc_path,
path, sizeof(p_content->pending_rom_crc_path));
}
}
@ -1300,8 +1304,9 @@ static void task_push_to_history_list(
bool launched_from_cli,
bool launched_from_companion_ui)
{
bool contentless = false;
bool is_inited = false;
bool contentless = false;
bool is_inited = false;
content_state_t *p_content = (content_state_t*)&content_st;
content_get_status(&contentless, &is_inited);
@ -1382,11 +1387,11 @@ static void task_push_to_history_list(
{
/* Database name + checksum are supplied
* by the companion UI itself */
if (!string_is_empty(companion_ui_crc32))
crc32 = companion_ui_crc32;
if (!string_is_empty(p_content->companion_ui_crc32))
crc32 = p_content->companion_ui_crc32;
if (!string_is_empty(companion_ui_db_name))
db_name = companion_ui_db_name;
if (!string_is_empty(p_content->companion_ui_db_name))
db_name = p_content->companion_ui_db_name;
}
#ifdef HAVE_MENU
else
@ -2094,19 +2099,22 @@ bool task_push_load_content_with_new_core_from_companion_ui(
retro_task_callback_t cb,
void *user_data)
{
global_t *global = global_get_ptr();
global_t *global = global_get_ptr();
content_state_t *p_content = (content_state_t*)&content_st;
path_set(RARCH_PATH_CONTENT, fullpath);
path_set(RARCH_PATH_CORE, core_path);
companion_ui_db_name[0] = '\0';
companion_ui_crc32[0] = '\0';
p_content->companion_ui_db_name[0] = '\0';
p_content->companion_ui_crc32[0] = '\0';
if (!string_is_empty(db_name))
strlcpy(companion_ui_db_name, db_name, sizeof(companion_ui_db_name));
strlcpy(p_content->companion_ui_db_name,
db_name, sizeof(p_content->companion_ui_db_name));
if (!string_is_empty(crc32))
strlcpy(companion_ui_crc32, crc32, sizeof(companion_ui_crc32));
strlcpy(p_content->companion_ui_crc32,
crc32, sizeof(p_content->companion_ui_crc32));
#ifdef HAVE_DYNAMIC
command_event(CMD_EVENT_LOAD_CORE, NULL);
@ -2184,12 +2192,14 @@ bool task_push_load_content_with_current_core_from_companion_ui(
retro_task_callback_t cb,
void *user_data)
{
content_state_t *p_content = (content_state_t*)&content_st;
path_set(RARCH_PATH_CONTENT, fullpath);
/* TODO/FIXME: Enable setting of these values
* via function arguments */
companion_ui_db_name[0] = '\0';
companion_ui_crc32[0] = '\0';
p_content->companion_ui_db_name[0] = '\0';
p_content->companion_ui_crc32[0] = '\0';
/* Load content
* > TODO/FIXME: Set loading_from_companion_ui 'false' for
@ -2239,7 +2249,9 @@ bool task_push_load_subsystem_with_core_from_menu(
retro_task_callback_t cb,
void *user_data)
{
pending_subsystem_init = true;
content_state_t *p_content = (content_state_t*)&content_st;
p_content->pending_subsystem_init = true;
/* Load content */
if (!task_load_content_callback(content_info, true, false, false))
@ -2261,24 +2273,27 @@ void content_get_status(
bool *contentless,
bool *is_inited)
{
*contentless = core_does_not_need_content;
*is_inited = _content_is_inited;
content_state_t *p_content = (content_state_t*)&content_st;
*contentless = p_content->core_does_not_need_content;
*is_inited = p_content->is_inited;
}
/* Clears the pending subsystem rom buffer*/
void content_clear_subsystem(void)
{
unsigned i;
content_state_t *p_content = (content_state_t*)&content_st;
pending_subsystem_rom_id = 0;
pending_subsystem_init = false;
p_content->pending_subsystem_rom_id = 0;
p_content->pending_subsystem_init = false;
for (i = 0; i < RARCH_MAX_SUBSYSTEM_ROMS; i++)
{
if (pending_subsystem_roms[i])
if (p_content->pending_subsystem_roms[i])
{
free(pending_subsystem_roms[i]);
pending_subsystem_roms[i] = NULL;
free(p_content->pending_subsystem_roms[i]);
p_content->pending_subsystem_roms[i] = NULL;
}
}
}
@ -2292,14 +2307,16 @@ bool content_launched_from_cli(void)
/* Get the current subsystem */
int content_get_subsystem(void)
{
return pending_subsystem_id;
content_state_t *p_content = (content_state_t*)&content_st;
return p_content->pending_subsystem_id;
}
/* Set the current subsystem*/
void content_set_subsystem(unsigned idx)
{
rarch_system_info_t *system = runloop_get_system_info();
const struct retro_subsystem_info *subsystem;
rarch_system_info_t *system = runloop_get_system_info();
content_state_t *p_content = (content_state_t*)&content_st;
/* Core fully loaded, use the subsystem data */
if (system->subsystem.data)
@ -2308,18 +2325,20 @@ void content_set_subsystem(unsigned idx)
else
subsystem = subsystem_data + idx;
pending_subsystem_id = idx;
p_content->pending_subsystem_id = idx;
if (subsystem && subsystem_current_count > 0)
{
strlcpy(pending_subsystem_ident,
subsystem->ident, sizeof(pending_subsystem_ident));
strlcpy(p_content->pending_subsystem_ident,
subsystem->ident, sizeof(p_content->pending_subsystem_ident));
pending_subsystem_rom_num = subsystem->num_roms;
p_content->pending_subsystem_rom_num = subsystem->num_roms;
}
RARCH_LOG("[subsystem] settings current subsytem to: %d(%s) roms: %d\n",
pending_subsystem_id, pending_subsystem_ident, pending_subsystem_rom_num);
p_content->pending_subsystem_id,
p_content->pending_subsystem_ident,
p_content->pending_subsystem_rom_num);
}
/* Sets the subsystem by name */
@ -2376,63 +2395,77 @@ void content_get_subsystem_friendly_name(const char* subsystem_name, char* subsy
/* Add a rom to the subsystem rom buffer */
void content_add_subsystem(const char* path)
{
size_t pending_size = PATH_MAX_LENGTH * sizeof(char);
pending_subsystem_roms[pending_subsystem_rom_id] = (char*)malloc(pending_size);
content_state_t *p_content = (content_state_t*)&content_st;
size_t pending_size = PATH_MAX_LENGTH * sizeof(char);
p_content->pending_subsystem_roms[p_content->pending_subsystem_rom_id] = (char*)malloc(pending_size);
strlcpy(pending_subsystem_roms[pending_subsystem_rom_id], path, pending_size);
RARCH_LOG("[subsystem] subsystem id: %d subsystem ident: %s rom id: %d, rom path: %s\n",
pending_subsystem_id, pending_subsystem_ident, pending_subsystem_rom_id,
pending_subsystem_roms[pending_subsystem_rom_id]);
pending_subsystem_rom_id++;
strlcpy(p_content->pending_subsystem_roms[
p_content->pending_subsystem_rom_id],
path, pending_size);
RARCH_LOG("[subsystem] subsystem id: %d subsystem ident:"
" %s rom id: %d, rom path: %s\n",
p_content->pending_subsystem_id,
p_content->pending_subsystem_ident,
p_content->pending_subsystem_rom_id,
p_content->pending_subsystem_roms[
p_content->pending_subsystem_rom_id]);
p_content->pending_subsystem_rom_id++;
}
/* Get the current subsystem rom id */
unsigned content_get_subsystem_rom_id(void)
{
return pending_subsystem_rom_id;
content_state_t *p_content = (content_state_t*)&content_st;
return p_content->pending_subsystem_rom_id;
}
void content_set_does_not_need_content(void)
{
core_does_not_need_content = true;
content_state_t *p_content = (content_state_t*)&content_st;
p_content->core_does_not_need_content = true;
}
void content_unset_does_not_need_content(void)
{
core_does_not_need_content = false;
content_state_t *p_content = (content_state_t*)&content_st;
p_content->core_does_not_need_content = false;
}
uint32_t content_get_crc(void)
{
if (pending_content_rom_crc)
content_state_t *p_content = (content_state_t*)&content_st;
if (p_content->pending_rom_crc)
{
pending_content_rom_crc = false;
content_rom_crc = file_crc32(0,
(const char*)pending_content_rom_crc_path);
RARCH_LOG("CRC32: 0x%x .\n", (unsigned)content_rom_crc);
p_content->pending_rom_crc = false;
p_content->rom_crc = file_crc32(0,
(const char*)p_content->pending_rom_crc_path);
RARCH_LOG("CRC32: 0x%x .\n", (unsigned)p_content->rom_crc);
}
return content_rom_crc;
return p_content->rom_crc;
}
char* content_get_subsystem_rom(unsigned index)
{
return pending_subsystem_roms[index];
content_state_t *p_content = (content_state_t*)&content_st;
return p_content->pending_subsystem_roms[index];
}
bool content_is_inited(void)
{
return _content_is_inited;
content_state_t *p_content = (content_state_t*)&content_st;
return p_content->is_inited;
}
void content_deinit(void)
{
unsigned i;
content_state_t *p_content = (content_state_t*)&content_st;
if (temporary_content)
if (p_content->temporary_content)
{
for (i = 0; i < temporary_content->size; i++)
for (i = 0; i < p_content->temporary_content->size; i++)
{
const char *path = temporary_content->elems[i].data;
const char *path = p_content->temporary_content->elems[i].data;
RARCH_LOG("%s: %s.\n",
msg_hash_to_str(MSG_REMOVING_TEMPORARY_CONTENT_FILE), path);
@ -2441,24 +2474,26 @@ void content_deinit(void)
msg_hash_to_str(MSG_FAILED_TO_REMOVE_TEMPORARY_FILE),
path);
}
string_list_free(temporary_content);
string_list_free(p_content->temporary_content);
}
temporary_content = NULL;
content_rom_crc = 0;
_content_is_inited = false;
core_does_not_need_content = false;
pending_content_rom_crc = false;
p_content->temporary_content = NULL;
p_content->rom_crc = 0;
p_content->is_inited = false;
p_content->core_does_not_need_content = false;
p_content->pending_rom_crc = false;
}
/* Set environment variables before a subsystem load */
void content_set_subsystem_info(void)
{
if (!pending_subsystem_init)
content_state_t *p_content = (content_state_t*)&content_st;
if (!p_content->pending_subsystem_init)
return;
path_set(RARCH_PATH_SUBSYSTEM, pending_subsystem_ident);
path_set_special(pending_subsystem_roms, pending_subsystem_rom_num);
path_set(RARCH_PATH_SUBSYSTEM, p_content->pending_subsystem_ident);
path_set_special(p_content->pending_subsystem_roms,
p_content->pending_subsystem_rom_num);
}
/* Initializes and loads a content file for the currently
@ -2466,6 +2501,7 @@ void content_set_subsystem_info(void)
bool content_init(void)
{
content_information_ctx_t content_ctx;
content_state_t *p_content = (content_state_t*)&content_st;
bool ret = true;
char *error_string = NULL;
@ -2478,14 +2514,14 @@ bool content_init(void)
const char *path_dir_system = settings->paths.directory_system;
const char *path_dir_cache = settings->paths.directory_cache;
temporary_content = string_list_new();
p_content->temporary_content = string_list_new();
content_ctx.check_firmware_before_loading = check_firmware_before_loading;
content_ctx.patch_is_blocked = rarch_ctl(RARCH_CTL_IS_PATCH_BLOCKED, NULL);
content_ctx.is_ips_pref = rarch_ctl(RARCH_CTL_IS_IPS_PREF, NULL);
content_ctx.is_bps_pref = rarch_ctl(RARCH_CTL_IS_BPS_PREF, NULL);
content_ctx.is_ups_pref = rarch_ctl(RARCH_CTL_IS_UPS_PREF, NULL);
content_ctx.temporary_content = temporary_content;
content_ctx.temporary_content = p_content->temporary_content;
content_ctx.directory_system = NULL;
content_ctx.directory_cache = NULL;
content_ctx.name_ips = NULL;
@ -2529,10 +2565,10 @@ bool content_init(void)
content_ctx.subsystem.size = sys_info->subsystem.size;
}
_content_is_inited = true;
content = string_list_new();
p_content->is_inited = true;
content = string_list_new();
if ( !temporary_content
if ( !p_content->temporary_content
|| !content_file_init(&content_ctx, content, &error_string))
{
content_deinit();