static bool load_content(const struct retro_subsystem_info *special, const struct string_list *content) { unsigned i; bool ret = true; struct retro_game_info *info = (struct retro_game_info*)calloc(content->size, sizeof(*info)); if (!info) return false; for (i = 0; i < content->size; i++) { const char *path = content->elems[i].data; int attr = content->elems[i].attr.i; bool need_fullpath = attr & 2; bool require_content = attr & 4; if (require_content && !*path) { RARCH_LOG("libretro core requires content, but nothing was provided.\n"); ret = false; goto end; } info[i].path = *path ? path : NULL; if (!need_fullpath && *path) // Load the content into memory. { RARCH_LOG("Loading content file: %s.\n", path); // First content file is significant, attempt to do patching, CRC checking, etc ... long size = i == 0 ? read_content_file(path, (void**)&info[i].data) : read_file(path, (void**)&info[i].data); if (size < 0) { RARCH_ERR("Could not read content file \"%s\".\n", path); ret = false; goto end; } info[i].size = size; } else RARCH_LOG("Content loading skipped. Implementation will load it on its own.\n"); } if (special) ret = pretro_load_game_special(special->id, info, content->size); else ret = pretro_load_game(*content->elems[0].data ? info : NULL); if (!ret) RARCH_ERR("Failed to load game.\n"); end: for (i = 0; i < content->size; i++) free((void*)info[i].data); free(info); return ret; }
static bool load_content(const struct retro_subsystem_info *special, const struct string_list *content) { unsigned i; bool ret = true; struct string_list* additional_path_allocs = string_list_new(); struct retro_game_info *info = (struct retro_game_info*) calloc(content->size, sizeof(*info)); if (!info) return false; for (i = 0; i < content->size; i++) { const char *path = content->elems[i].data; int attr = content->elems[i].attr.i; bool need_fullpath = attr & 2; bool require_content = attr & 4; if (require_content && !*path) { RARCH_LOG("libretro core requires content, but nothing was provided.\n"); ret = false; goto end; } info[i].path = *path ? path : NULL; if (!need_fullpath && *path) { /* Load the content into memory. */ RARCH_LOG("Loading content file: %s.\n", path); /* First content file is significant, attempt to do patching, * CRC checking, etc. */ long size = i == 0 ? read_content_file(path, (void**)&info[i].data) : read_file(path, (void**)&info[i].data); if (size < 0) { RARCH_ERR("Could not read content file \"%s\".\n", path); ret = false; goto end; } info[i].size = size; } else { RARCH_LOG("Content loading skipped. Implementation will" " load it on its own.\n"); if (need_fullpath && path_contains_compressed_file(path)) { RARCH_LOG("Compressed file in case of need_fullpath." "Now extracting to temporary directory.\n"); if ((!strcmp(g_settings.extraction_directory,"")) || !path_is_directory(g_settings.extraction_directory)) { RARCH_ERR("Tried extracting to extraction directory, but " "extraction directory was not set or found. Exiting.\n"); rarch_assert(false); } char new_path[PATH_MAX]; union string_list_elem_attr attr; attr.i = 0; fill_pathname_join(new_path,g_settings.extraction_directory, path_basename(path),sizeof(new_path)); read_compressed_file(path,NULL,new_path); string_list_append(additional_path_allocs,new_path,attr); info[i].path = additional_path_allocs->elems [additional_path_allocs->size -1 ].data; } } } if (special) ret = pretro_load_game_special(special->id, info, content->size); else ret = pretro_load_game(*content->elems[0].data ? info : NULL); if (!ret) RARCH_ERR("Failed to load game.\n"); end: for (i = 0; i < content->size; i++) free((void*)info[i].data); string_list_free(additional_path_allocs); free(info); return ret; }
static bool load_roms(unsigned rom_type, const char **rom_paths, size_t roms) { size_t i; bool ret = true; if (roms == 0) return false; if (roms > MAX_ROMS) return false; void *rom_buf[MAX_ROMS] = {NULL}; long rom_len[MAX_ROMS] = {0}; struct retro_game_info info[MAX_ROMS] = {{NULL}}; if (!g_extern.system.info.need_fullpath) { RARCH_LOG("Loading ROM file: %s.\n", rom_paths[0]); if ((rom_len[0] = read_rom_file(rom_paths[0], &rom_buf[0])) == -1) { RARCH_ERR("Could not read ROM file.\n"); ret = false; goto end; } RARCH_LOG("ROM size: %u bytes.\n", (unsigned)rom_len[0]); } else RARCH_LOG("ROM loading skipped. Implementation will load it on its own.\n"); info[0].path = rom_paths[0]; info[0].data = rom_buf[0]; info[0].size = rom_len[0]; info[0].meta = NULL; // Not relevant at this moment. for (i = 1; i < roms; i++) { if (rom_paths[i] && !g_extern.system.info.need_fullpath && (rom_len[i] = read_file(rom_paths[i], &rom_buf[i])) == -1) { RARCH_ERR("Could not read ROM file: \"%s\".\n", rom_paths[i]); ret = false; goto end; } info[i].path = rom_paths[i]; info[i].data = rom_buf[i]; info[i].size = rom_len[i]; info[i].meta = NULL; } if (rom_type == 0) ret = pretro_load_game(&info[0]); else ret = pretro_load_game_special(rom_type, info, roms); if (!ret) RARCH_ERR("Failed to load game.\n"); end: for (i = 0; i < MAX_ROMS; i++) free(rom_buf[i]); return ret; }
/** * load_content: * @special : subsystem of content to be loaded. Can be NULL. * content : * * Load content file (for libretro core). * * Returns : true if successful, otherwise false. **/ static bool load_content(const struct retro_subsystem_info *special, const struct string_list *content) { unsigned i; bool ret = true; struct string_list* additional_path_allocs = string_list_new(); struct retro_game_info *info = (struct retro_game_info*) calloc(content->size, sizeof(*info)); if (!info) { string_list_free(additional_path_allocs); return false; } for (i = 0; i < content->size; i++) { const char *path = content->elems[i].data; int attr = content->elems[i].attr.i; bool need_fullpath = attr & 2; bool require_content = attr & 4; if (require_content && !*path) { RARCH_LOG("libretro core requires content, but nothing was provided.\n"); ret = false; goto end; } info[i].path = NULL; if (*path) info[i].path = path; if (!need_fullpath && *path) { if (!load_content_dont_need_fullpath(&info[i], i, path)) goto end; } else { RARCH_LOG("Content loading skipped. Implementation will" " load it on its own.\n"); if (!load_content_need_fullpath(&info[i], i, additional_path_allocs, need_fullpath, path)) goto end; } } if (special) ret = pretro_load_game_special(special->id, info, content->size); else ret = pretro_load_game(*content->elems[0].data ? info : NULL); if (!ret) RARCH_ERR("%s.\n", msg_hash_to_str(MSG_FAILED_TO_LOAD_CONTENT)); end: for (i = 0; i < content->size; i++) free((void*)info[i].data); string_list_free(additional_path_allocs); if (info) free(info); return ret; }
static bool load_roms(unsigned rom_type, const char **rom_paths, size_t roms) { bool ret = true; if (roms == 0) return false; if (roms > MAX_ROMS) return false; void *rom_buf[MAX_ROMS] = {NULL}; ssize_t rom_len[MAX_ROMS] = {0}; struct retro_game_info info[MAX_ROMS] = {{NULL}}; char *xml_buf = load_xml_map(g_extern.xml_name); FILE *rom_file = NULL; if (rom_paths[0]) { RARCH_LOG("Loading ROM file: %s.\n", rom_paths[0]); rom_file = fopen(rom_paths[0], "rb"); } if (!g_extern.system.info.need_fullpath) { if ((rom_len[0] = read_rom_file(rom_file, &rom_buf[0])) == -1) { RARCH_ERR("Could not read ROM file.\n"); ret = false; goto end; } RARCH_LOG("ROM size: %u bytes.\n", (unsigned)rom_len[0]); } else { if (!rom_file) { RARCH_ERR("Implementation requires a full path to be set, cannot load ROM from stdin. Aborting ...\n"); ret = false; goto end; } RARCH_LOG("ROM loading skipped. Implementation will load it on its own.\n"); } info[0].path = rom_paths[0]; info[0].data = rom_buf[0]; info[0].size = rom_len[0]; info[0].meta = xml_buf; for (size_t i = 1; i < roms; i++) { if (rom_paths[i] && !g_extern.system.info.need_fullpath && (rom_len[i] = read_file(rom_paths[i], &rom_buf[i])) == -1) { RARCH_ERR("Could not read ROM file: \"%s\".\n", rom_paths[i]); ret = false; goto end; } info[i].path = rom_paths[i]; info[i].data = rom_buf[i]; info[i].size = rom_len[i]; } if (rom_type == 0) ret = pretro_load_game(&info[0]); else ret = pretro_load_game_special(rom_type, info, roms); if (!ret) RARCH_ERR("Failed to load game.\n"); end: for (unsigned i = 0; i < MAX_ROMS; i++) free(rom_buf[i]); free(xml_buf); if (rom_file) fclose(rom_file); return ret; }