bool content_ctl(enum content_ctl_state state, void *data) { unsigned i; static const struct file_archive_file_backend *stream_backend = NULL; static struct string_list *temporary_content = NULL; static bool content_is_inited = false; static bool core_does_not_need_content = false; static uint32_t content_crc = 0; switch(state) { case CONTENT_CTL_LOAD_RAM_FILE: return load_ram_file(data); case CONTENT_CTL_SAVE_RAM_FILE: { ram_type_t *ram = (ram_type_t*)data; if (!ram) return false; save_ram_file(ram); } break; case CONTENT_CTL_DOES_NOT_NEED_CONTENT: return core_does_not_need_content; case CONTENT_CTL_SET_DOES_NOT_NEED_CONTENT: core_does_not_need_content = true; break; case CONTENT_CTL_GET_CRC: { uint32_t **content_crc_ptr = (uint32_t**)data; if (!content_crc_ptr) return false; *content_crc_ptr = &content_crc; } break; case CONTENT_CTL_LOAD_STATE: { const char *path = (const char*)data; if (!path) return false; return content_load_state(path); } case CONTENT_CTL_SAVE_STATE: { const char *path = (const char*)data; if (!path) return false; return content_save_state(path); } case CONTENT_CTL_IS_INITED: return content_is_inited; case CONTENT_CTL_DEINIT: content_ctl(CONTENT_CTL_TEMPORARY_FREE, NULL); content_crc = 0; content_is_inited = false; core_does_not_need_content = false; break; case CONTENT_CTL_INIT: content_is_inited = false; temporary_content = string_list_new(); if (!temporary_content) return false; if (content_init_file(temporary_content)) { content_is_inited = true; return true; } content_ctl(CONTENT_CTL_DEINIT, NULL); return false; case CONTENT_CTL_TEMPORARY_FREE: if (!temporary_content) return false; for (i = 0; i < temporary_content->size; i++) { const char *path = temporary_content->elems[i].data; RARCH_LOG("%s: %s.\n", msg_hash_to_str(MSG_REMOVING_TEMPORARY_CONTENT_FILE), path); if (remove(path) < 0) RARCH_ERR("%s: %s.\n", msg_hash_to_str(MSG_FAILED_TO_REMOVE_TEMPORARY_FILE), path); } string_list_free(temporary_content); temporary_content = NULL; break; case CONTENT_CTL_STREAM_INIT: #ifdef HAVE_ZLIB if (!stream_backend) stream_backend = file_archive_get_default_file_backend(); #endif break; case CONTENT_CTL_STREAM_CRC_CALCULATE: { content_stream_t *stream = NULL; content_ctl(CONTENT_CTL_STREAM_INIT, NULL); stream = (content_stream_t*)data; stream->crc = stream_backend->stream_crc_calculate( stream->a, stream->b, stream->c); } break; case CONTENT_CTL_LOAD: return content_load((content_ctx_info_t*)data); case CONTENT_CTL_NONE: default: break; } return true; }
/** * task_load_content: * * Loads content into currently selected core. * Will also optionally push the content entry to the history playlist. * * Returns: true (1) if successful, otherwise false (0). **/ static bool task_load_content(content_ctx_info_t *content_info, content_information_ctx_t *content_ctx, bool launched_from_menu, enum content_mode_load mode, char **error_string) { char name[255]; char msg[255]; name[0] = msg[0] = '\0'; if (!content_load(content_info)) goto error; /* Push entry to top of history playlist */ if (_content_is_inited || content_does_not_need_content()) { char tmp[PATH_MAX_LENGTH]; struct retro_system_info *info = NULL; rarch_system_info_t *sys_info = NULL; tmp[0] = '\0'; runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &sys_info); if (sys_info) info = &sys_info->info; #ifdef HAVE_MENU if (launched_from_menu) menu_driver_ctl(RARCH_MENU_CTL_SYSTEM_INFO_GET, &info); #endif strlcpy(tmp, path_get(RARCH_PATH_CONTENT), sizeof(tmp)); if (!launched_from_menu) { /* Path can be relative here. * Ensure we're pushing absolute path. */ if (!string_is_empty(tmp)) path_resolve_realpath(tmp, sizeof(tmp)); } if (info && !string_is_empty(tmp)) { const char *core_path = NULL; const char *core_name = NULL; playlist_t *playlist_tmp = g_defaults.content_history; switch (path_is_media_type(tmp)) { case RARCH_CONTENT_MOVIE: #ifdef HAVE_FFMPEG playlist_tmp = g_defaults.video_history; core_name = "movieplayer"; core_path = "builtin"; #endif break; case RARCH_CONTENT_MUSIC: #ifdef HAVE_FFMPEG playlist_tmp = g_defaults.music_history; core_name = "musicplayer"; core_path = "builtin"; #endif break; case RARCH_CONTENT_IMAGE: #ifdef HAVE_IMAGEVIEWER playlist_tmp = g_defaults.image_history; core_name = "imageviewer"; core_path = "builtin"; #endif break; default: core_path = path_get(RARCH_PATH_CORE); core_name = info->library_name; break; } if (mode == CONTENT_MODE_LOAD_FROM_CLI) { settings_t *settings = config_get_ptr(); content_ctx->history_list_enable = settings->history_list_enable; } if ( content_ctx->history_list_enable && playlist_tmp && playlist_push( playlist_tmp, tmp, NULL, core_path, core_name, NULL, NULL) ) playlist_write_file(playlist_tmp); } } return true; error: if (launched_from_menu) { if (!path_is_empty(RARCH_PATH_CONTENT) && !string_is_empty(name)) { snprintf(msg, sizeof(msg), "%s %s.\n", msg_hash_to_str(MSG_FAILED_TO_LOAD), name); if (error_string) free(error_string); *error_string = strdup(msg); } } return false; }
static bool content_load_wrapper( content_ctx_info_t *content_info, bool launched_from_menu) { char name[PATH_MAX_LENGTH]; char msg[PATH_MAX_LENGTH]; char *fullpath = NULL; runloop_ctl(RUNLOOP_CTL_GET_CONTENT_PATH, &fullpath); #ifdef HAVE_MENU if (launched_from_menu) { /* redraw menu frame */ menu_display_set_msg_force(true); menu_driver_ctl(RARCH_MENU_CTL_RENDER, NULL); fill_pathname_base(name, fullpath, sizeof(name)); } #endif if (!content_load(content_info)) goto error; if (launched_from_menu) { /** Show loading OSD message */ if (*fullpath) { snprintf(msg, sizeof(msg), "INFO - Loading %s ...", name); runloop_msg_queue_push(msg, 1, 1, false); } } /* Push entry to top of history playlist */ if (content_is_inited() || content_does_not_need_content()) { char tmp[PATH_MAX_LENGTH]; struct retro_system_info *info = NULL; rarch_system_info_t *system = NULL; runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system); if (system) info = &system->info; #ifdef HAVE_MENU if (launched_from_menu) menu_driver_ctl(RARCH_MENU_CTL_SYSTEM_INFO_GET, &info); #endif strlcpy(tmp, fullpath, sizeof(tmp)); if (!launched_from_menu) { /* Path can be relative here. * Ensure we're pushing absolute path. */ if (*tmp) path_resolve_realpath(tmp, sizeof(tmp)); } if (info && *tmp) { content_push_to_history_playlist( true, tmp, info); playlist_write_file(g_defaults.history); } } return true; error: if (launched_from_menu) { if (!string_is_empty(fullpath) && !string_is_empty(name)) { snprintf(msg, sizeof(msg), "Failed to load %s.\n", name); runloop_msg_queue_push(msg, 1, 90, false); } } return false; }
bool content_ctl(enum content_ctl_state state, void *data) { static const struct file_archive_file_backend *stream_backend = NULL; static struct string_list *temporary_content = NULL; static bool content_is_inited = false; static bool core_does_not_need_content = false; static uint32_t content_crc = 0; switch(state) { case CONTENT_CTL_LOAD_RAM_FILE: return load_ram_file(data); case CONTENT_CTL_SAVE_RAM_FILE: return save_ram_file((ram_type_t*)data); case CONTENT_CTL_DOES_NOT_NEED_CONTENT: return core_does_not_need_content; case CONTENT_CTL_SET_DOES_NOT_NEED_CONTENT: core_does_not_need_content = true; break; case CONTENT_CTL_UNSET_DOES_NOT_NEED_CONTENT: core_does_not_need_content = false; break; case CONTENT_CTL_GET_CRC: { uint32_t **content_crc_ptr = (uint32_t**)data; if (!content_crc_ptr) return false; *content_crc_ptr = &content_crc; } break; case CONTENT_CTL_LOAD_STATE: { const char *path = (const char*)data; if (!path) return false; return content_load_state(path); } case CONTENT_CTL_SAVE_STATE: { const char *path = (const char*)data; if (!path) return false; return content_save_state(path); } case CONTENT_CTL_IS_INITED: return content_is_inited; case CONTENT_CTL_DEINIT: content_ctl(CONTENT_CTL_TEMPORARY_FREE, NULL); content_crc = 0; content_is_inited = false; core_does_not_need_content = false; break; case CONTENT_CTL_INIT: content_is_inited = false; temporary_content = string_list_new(); if (!temporary_content) return false; if (content_file_init(temporary_content)) { content_is_inited = true; return true; } content_ctl(CONTENT_CTL_DEINIT, NULL); return false; case CONTENT_CTL_TEMPORARY_FREE: content_file_free(temporary_content); temporary_content = NULL; break; case CONTENT_CTL_STREAM_INIT: #ifdef HAVE_ZLIB if (!stream_backend) stream_backend = file_archive_get_default_file_backend(); #endif break; case CONTENT_CTL_STREAM_CRC_CALCULATE: { content_stream_t *stream = NULL; content_ctl(CONTENT_CTL_STREAM_INIT, NULL); stream = (content_stream_t*)data; #ifdef HAVE_ZLIB stream->crc = stream_backend->stream_crc_calculate( stream->a, stream->b, stream->c); #endif } break; case CONTENT_CTL_LOAD: return content_load((content_ctx_info_t*)data); case CONTENT_CTL_NONE: default: break; } return true; }
/** * task_load_content: * * Loads content into currently selected core. * Will also optionally push the content entry to the history playlist. * * Returns: true (1) if successful, otherwise false (0). **/ static bool task_load_content(content_ctx_info_t *content_info, bool launched_from_menu, enum content_mode_load mode) { char name[256]; char msg[256]; name[0] = msg[0] = '\0'; if (launched_from_menu) { #ifdef HAVE_MENU /* redraw menu frame */ menu_display_set_msg_force(true); menu_driver_ctl(RARCH_MENU_CTL_RENDER, NULL); if (!path_is_empty(RARCH_PATH_CONTENT)) fill_pathname_base(name, path_get(RARCH_PATH_CONTENT), sizeof(name)); #endif /** Show loading OSD message */ if (!string_is_empty(path_get(RARCH_PATH_CONTENT))) { snprintf(msg, sizeof(msg), "%s %s ...", msg_hash_to_str(MSG_LOADING), name); runloop_msg_queue_push(msg, 2, 1, true); } } if (!content_load(content_info)) goto error; /* Push entry to top of history playlist */ if (content_is_inited() || content_does_not_need_content()) { char tmp[PATH_MAX_LENGTH]; struct retro_system_info *info = NULL; rarch_system_info_t *system = NULL; tmp[0] = '\0'; runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system); if (system) info = &system->info; #ifdef HAVE_MENU if (launched_from_menu) menu_driver_ctl(RARCH_MENU_CTL_SYSTEM_INFO_GET, &info); #endif strlcpy(tmp, path_get(RARCH_PATH_CONTENT), sizeof(tmp)); if (!launched_from_menu) { /* Path can be relative here. * Ensure we're pushing absolute path. */ if (!string_is_empty(tmp)) path_resolve_realpath(tmp, sizeof(tmp)); } if (info && *tmp) { const char *core_path = NULL; const char *core_name = NULL; playlist_t *playlist_tmp = g_defaults.content_history; switch (path_is_media_type(tmp)) { case RARCH_CONTENT_MOVIE: #ifdef HAVE_FFMPEG playlist_tmp = g_defaults.video_history; core_name = "movieplayer"; core_path = "builtin"; #endif break; case RARCH_CONTENT_MUSIC: #ifdef HAVE_FFMPEG playlist_tmp = g_defaults.music_history; core_name = "musicplayer"; core_path = "builtin"; #endif break; case RARCH_CONTENT_IMAGE: #ifdef HAVE_IMAGEVIEWER playlist_tmp = g_defaults.image_history; core_name = "imageviewer"; core_path = "builtin"; #endif break; default: core_path = path_get(RARCH_PATH_CORE); core_name = info->library_name; break; } if (content_push_to_history_playlist(playlist_tmp, tmp, core_name, core_path)) playlist_write_file(playlist_tmp); } } return true; error: if (launched_from_menu) { if (!path_is_empty(RARCH_PATH_CONTENT) && !string_is_empty(name)) { snprintf(msg, sizeof(msg), "%s %s.\n", msg_hash_to_str(MSG_FAILED_TO_LOAD), name); runloop_msg_queue_push(msg, 2, 90, true); } } return false; }