diff --git a/menu/cbs/menu_cbs_deferred_push.c b/menu/cbs/menu_cbs_deferred_push.c index 36da17311d..9bd5365ed7 100644 --- a/menu/cbs/menu_cbs_deferred_push.c +++ b/menu/cbs/menu_cbs_deferred_push.c @@ -32,26 +32,20 @@ #include "../../verbosity.h" #include "../../tasks/tasks.h" -#define CB_CORE_UPDATER_DOWNLOAD 0x7412da7dU -#define CB_CORE_UPDATER_LIST 0x32fd4f01U -#define CB_UPDATE_ASSETS 0xbf85795eU -#define CB_UPDATE_CORE_INFO_FILES 0xe6084091U -#define CB_UPDATE_AUTOCONFIG_PROFILES 0x28ada67dU -#define CB_UPDATE_CHEATS 0xc360fec3U -#define CB_UPDATE_OVERLAYS 0x699009a0U -#define CB_UPDATE_DATABASES 0x931eb8d3U -#define CB_UPDATE_SHADERS_GLSL 0x0121a186U -#define CB_UPDATE_SHADERS_CG 0xc93a53feU -#define CB_CORE_CONTENT_LIST 0xebc51227U -#define CB_CORE_CONTENT_DOWNLOAD 0x03b3c0a3U -#define CB_LAKKA_DOWNLOAD 0x54eaa904U - #ifndef BIND_ACTION_DEFERRED_PUSH #define BIND_ACTION_DEFERRED_PUSH(cbs, name) \ cbs->action_deferred_push = name; \ cbs->action_deferred_push_ident = #name; #endif +enum +{ + PUSH_ARCHIVE_OPEN_DETECT_CORE = 0, + PUSH_ARCHIVE_OPEN, + PUSH_DEFAULT, + PUSH_DETECT_CORE_LIST +}; + static int deferred_push_dlist(menu_displaylist_info_t *info, unsigned val) { if (menu_displaylist_push_list(info, val) != 0) @@ -299,153 +293,6 @@ static int deferred_push_disk_options(menu_displaylist_info_t *info) } #ifdef HAVE_NETWORKING -static void cb_decompressed(void *task_data, void *user_data, const char *err) -{ - decompress_task_data_t *dec = (decompress_task_data_t*)task_data; - unsigned type_hash = (uintptr_t)user_data; - - if (dec && !err) - { - if (type_hash == CB_CORE_UPDATER_DOWNLOAD) - event_cmd_ctl(EVENT_CMD_CORE_INFO_INIT, NULL); - else if (type_hash == CB_UPDATE_ASSETS) - event_cmd_ctl(EVENT_CMD_REINIT, NULL); - } - - if (err) - RARCH_ERR("%s", err); - - if (dec) - { - if (path_file_exists(dec->source_file)) - remove(dec->source_file); - - free(dec->source_file); - free(dec); - } -} - -/* expects http_transfer_t*, menu_file_transfer_t* */ -void cb_generic_download(void *task_data, void *user_data, const char *err) -{ - char output_path[PATH_MAX_LENGTH]; - char shaderdir[PATH_MAX_LENGTH]; - const char *file_ext = NULL; - const char *dir_path = NULL; - menu_file_transfer_t *transf = (menu_file_transfer_t*)user_data; - settings_t *settings = config_get_ptr(); - http_transfer_data_t *data = (http_transfer_data_t*)task_data; - - if (!data || !data->data | !transf) - goto finish; - - /* we have to determine dir_path at the time of writting or else - * we'd run into races when the user changes the setting during an - * http transfer. */ - switch (transf->type_hash) - { - case CB_CORE_UPDATER_DOWNLOAD: - dir_path = settings->libretro_directory; - break; - case CB_CORE_CONTENT_DOWNLOAD: - dir_path = settings->core_assets_directory; - break; - case CB_UPDATE_CORE_INFO_FILES: - dir_path = settings->libretro_info_path; - break; - case CB_UPDATE_ASSETS: - dir_path = settings->assets_directory; - break; - case CB_UPDATE_AUTOCONFIG_PROFILES: - dir_path = settings->input.autoconfig_dir; - break; - case CB_UPDATE_DATABASES: - dir_path = settings->content_database; - break; - case CB_UPDATE_OVERLAYS: - dir_path = settings->overlay_directory; - break; - case CB_UPDATE_CHEATS: - dir_path = settings->cheat_database; - break; - case CB_UPDATE_SHADERS_CG: - case CB_UPDATE_SHADERS_GLSL: - { - const char *dirname = transf->type_hash == CB_UPDATE_SHADERS_CG ? - "shaders_cg" : "shaders_glsl"; - - fill_pathname_join(shaderdir, settings->video.shader_dir, dirname, - sizeof(shaderdir)); - if (!path_file_exists(shaderdir)) - if (!path_mkdir(shaderdir)) - goto finish; - - dir_path = shaderdir; - break; - } - case CB_LAKKA_DOWNLOAD: - dir_path = "/storage/.update/"; /* TODO unhardcode this ? */ - break; - default: - RARCH_WARN("Unknown transfer type '%u' bailing out.\n", - transf->type_hash); - break; - } - - fill_pathname_join(output_path, dir_path, - transf->path, sizeof(output_path)); - - /* Make sure the directory exists */ - path_basedir(output_path); - if (!path_mkdir(output_path)) - { - err = "Failed to create the directory."; - goto finish; - } - - fill_pathname_join(output_path, dir_path, - transf->path, sizeof(output_path)); - - if (!retro_write_file(output_path, data->data, data->len)) - { - err = "Write failed."; - goto finish; - } - -#ifdef HAVE_ZLIB - file_ext = path_get_extension(output_path); - - if (!settings->network.buildbot_auto_extract_archive) - goto finish; - - if (string_is_equal_noncase(file_ext, "zip")) - { - rarch_task_push_decompress(output_path, dir_path, NULL, NULL, NULL, - cb_decompressed, (void*)(uintptr_t)transf->type_hash); - } -#else - if (transf->type_hash == CB_CORE_UPDATER_DOWNLOAD) - event_cmd_ctl(EVENT_CMD_CORE_INFO_INIT, NULL); -#endif - -finish: - if (err) - { - RARCH_ERR("Download of '%s' failed: %s\n", - (transf ? transf->path: "unknown"), err); - } - - if (data) - { - if (data->data) - free(data->data); - free(data); - } - - if (transf) - free(transf); -} - static int deferred_push_core_updater_list(menu_displaylist_info_t *info) { return deferred_push_dlist(info, DISPLAYLIST_CORES_UPDATER); @@ -473,13 +320,6 @@ static int deferred_archive_action(menu_displaylist_info_t *info) return deferred_push_dlist(info, DISPLAYLIST_ARCHIVE_ACTION); } -enum -{ - PUSH_ARCHIVE_OPEN_DETECT_CORE = 0, - PUSH_ARCHIVE_OPEN, - PUSH_DEFAULT, - PUSH_DETECT_CORE_LIST -}; static int general_push(menu_displaylist_info_t *info, diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 06c30808c1..1de4c7d514 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -15,6 +15,7 @@ #include #include +#include #include #include "../menu_driver.h" @@ -1217,6 +1218,156 @@ static int action_ok_save_state(const char *path, return generic_action_ok_command(EVENT_CMD_RESUME); } +#ifdef HAVE_NETWORKING +static void cb_decompressed(void *task_data, void *user_data, const char *err) +{ + decompress_task_data_t *dec = (decompress_task_data_t*)task_data; + unsigned type_hash = (uintptr_t)user_data; + + if (dec && !err) + { + if (type_hash == CB_CORE_UPDATER_DOWNLOAD) + event_cmd_ctl(EVENT_CMD_CORE_INFO_INIT, NULL); + else if (type_hash == CB_UPDATE_ASSETS) + event_cmd_ctl(EVENT_CMD_REINIT, NULL); + } + + if (err) + RARCH_ERR("%s", err); + + if (dec) + { + if (path_file_exists(dec->source_file)) + remove(dec->source_file); + + free(dec->source_file); + free(dec); + } +} + +/* expects http_transfer_t*, menu_file_transfer_t* */ +static void cb_generic_download(void *task_data, + void *user_data, const char *err) +{ + char output_path[PATH_MAX_LENGTH]; + char shaderdir[PATH_MAX_LENGTH]; + const char *file_ext = NULL; + const char *dir_path = NULL; + menu_file_transfer_t *transf = (menu_file_transfer_t*)user_data; + settings_t *settings = config_get_ptr(); + http_transfer_data_t *data = (http_transfer_data_t*)task_data; + + if (!data || !data->data | !transf) + goto finish; + + /* we have to determine dir_path at the time of writting or else + * we'd run into races when the user changes the setting during an + * http transfer. */ + switch (transf->type_hash) + { + case CB_CORE_UPDATER_DOWNLOAD: + dir_path = settings->libretro_directory; + break; + case CB_CORE_CONTENT_DOWNLOAD: + dir_path = settings->core_assets_directory; + break; + case CB_UPDATE_CORE_INFO_FILES: + dir_path = settings->libretro_info_path; + break; + case CB_UPDATE_ASSETS: + dir_path = settings->assets_directory; + break; + case CB_UPDATE_AUTOCONFIG_PROFILES: + dir_path = settings->input.autoconfig_dir; + break; + case CB_UPDATE_DATABASES: + dir_path = settings->content_database; + break; + case CB_UPDATE_OVERLAYS: + dir_path = settings->overlay_directory; + break; + case CB_UPDATE_CHEATS: + dir_path = settings->cheat_database; + break; + case CB_UPDATE_SHADERS_CG: + case CB_UPDATE_SHADERS_GLSL: + { + const char *dirname = transf->type_hash == CB_UPDATE_SHADERS_CG ? + "shaders_cg" : "shaders_glsl"; + + fill_pathname_join(shaderdir, settings->video.shader_dir, dirname, + sizeof(shaderdir)); + if (!path_file_exists(shaderdir)) + if (!path_mkdir(shaderdir)) + goto finish; + + dir_path = shaderdir; + break; + } + case CB_LAKKA_DOWNLOAD: + dir_path = "/storage/.update/"; /* TODO unhardcode this ? */ + break; + default: + RARCH_WARN("Unknown transfer type '%u' bailing out.\n", + transf->type_hash); + break; + } + + fill_pathname_join(output_path, dir_path, + transf->path, sizeof(output_path)); + + /* Make sure the directory exists */ + path_basedir(output_path); + if (!path_mkdir(output_path)) + { + err = "Failed to create the directory."; + goto finish; + } + + fill_pathname_join(output_path, dir_path, + transf->path, sizeof(output_path)); + + if (!retro_write_file(output_path, data->data, data->len)) + { + err = "Write failed."; + goto finish; + } + +#ifdef HAVE_ZLIB + file_ext = path_get_extension(output_path); + + if (!settings->network.buildbot_auto_extract_archive) + goto finish; + + if (string_is_equal_noncase(file_ext, "zip")) + { + rarch_task_push_decompress(output_path, dir_path, NULL, NULL, NULL, + cb_decompressed, (void*)(uintptr_t)transf->type_hash); + } +#else + if (transf->type_hash == CB_CORE_UPDATER_DOWNLOAD) + event_cmd_ctl(EVENT_CMD_CORE_INFO_INIT, NULL); +#endif + +finish: + if (err) + { + RARCH_ERR("Download of '%s' failed: %s\n", + (transf ? transf->path: "unknown"), err); + } + + if (data) + { + if (data->data) + free(data->data); + free(data); + } + + if (transf) + free(transf); +} +#endif + static int action_ok_download_generic(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx, const char *type_msg) diff --git a/menu/menu_cbs.h b/menu/menu_cbs.h index 5210a550bc..8a11e2f4b9 100644 --- a/menu/menu_cbs.h +++ b/menu/menu_cbs.h @@ -23,6 +23,20 @@ #include "menu_entries.h" #include "menu_hash.h" +#define CB_CORE_UPDATER_DOWNLOAD 0x7412da7dU +#define CB_CORE_UPDATER_LIST 0x32fd4f01U +#define CB_UPDATE_ASSETS 0xbf85795eU +#define CB_UPDATE_CORE_INFO_FILES 0xe6084091U +#define CB_UPDATE_AUTOCONFIG_PROFILES 0x28ada67dU +#define CB_UPDATE_CHEATS 0xc360fec3U +#define CB_UPDATE_OVERLAYS 0x699009a0U +#define CB_UPDATE_DATABASES 0x931eb8d3U +#define CB_UPDATE_SHADERS_GLSL 0x0121a186U +#define CB_UPDATE_SHADERS_CG 0xc93a53feU +#define CB_CORE_CONTENT_LIST 0xebc51227U +#define CB_CORE_CONTENT_DOWNLOAD 0x03b3c0a3U +#define CB_LAKKA_DOWNLOAD 0x54eaa904U + enum { ACTION_OK_DL_DEFAULT = 0, @@ -209,7 +223,6 @@ typedef struct uint32_t type_hash; char path[PATH_MAX_LENGTH]; } menu_file_transfer_t; -void cb_generic_download(void *task_data, void *user_data, const char *err); #endif #endif