bool zlib_perform_mode(const char *path, const char *valid_exts, const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size, uint32_t crc32, void *userdata) { switch (cmode) { case 0: /* Uncompressed */ if (!zlib_write_file(path, cdata, size)) return false; break; case 8: /* Deflate */ { int ret = 0; zlib_file_handle_t handle = {0}; if (!zlib_inflate_data_to_file_init(&handle, cdata, csize, size)) return false; do{ ret = zlib_inflate_data_to_file_iterate(handle.stream); }while(ret == 0); if (!zlib_inflate_data_to_file(&handle, ret, path, valid_exts, cdata, csize, size, crc32)) return false; } break; default: return false; } return true; }
static int zip_extract_cb(const char *name, const char *valid_exts, const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size, uint32_t checksum, void *userdata) { struct zip_extract_userdata *data = (struct zip_extract_userdata*)userdata; /* Extract first content that matches our list. */ const char *ext = path_get_extension(name); if (ext && string_list_find_elem(data->ext, ext)) { char new_path[PATH_MAX_LENGTH] = {0}; if (data->extraction_directory) fill_pathname_join(new_path, data->extraction_directory, path_basename(name), sizeof(new_path)); else fill_pathname_resolve_relative(new_path, data->zip_path, path_basename(name), sizeof(new_path)); switch (cmode) { case ZLIB_MODE_UNCOMPRESSED: data->found_content = zlib_write_file(new_path, cdata, size); return false; case ZLIB_MODE_DEFLATE: { int ret = 0; zlib_file_handle_t handle = {0}; if (!zlib_inflate_data_to_file_init(&handle, cdata, csize, size)) return 0; do{ ret = zlib_inflate_data_to_file_iterate(handle.stream); }while(ret == 0); if (zlib_inflate_data_to_file(&handle, ret, new_path, valid_exts, cdata, csize, size, checksum)) { strlcpy(data->zip_path, new_path, data->zip_path_size); data->found_content = true; return 0; } return 0; } default: return 0; } } return 1; }
static bool zlib_cb(const char *name, const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size, uint32_t crc32, void *userdata) { struct userdata *user = userdata; const char *subdir = user->subdir; const char *dest = user->dest; if (strstr(name, subdir) != name) return true; name += strlen(subdir) + 1; char path[PATH_MAX]; char path_dir[PATH_MAX]; fill_pathname_join(path, dest, name, sizeof(path)); fill_pathname_basedir(path_dir, path, sizeof(path_dir)); if (!path_mkdir(path_dir)) { RARCH_ERR("Failed to create dir: %s.\n", path_dir); return false; } RARCH_LOG("Extracting %s -> %s ...\n", name, path); switch (cmode) { case 0: // Uncompressed if (!write_file(path, cdata, size)) { RARCH_ERR("Failed to write file: %s.\n", path); return false; } break; case 8: // Deflate if (!zlib_inflate_data_to_file(path, cdata, csize, size, crc32)) { RARCH_ERR("Failed to deflate to: %s.\n", path); return false; } break; default: return false; } return true; }
static bool zip_extract_cb(const char *name, const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size, uint32_t crc32, void *userdata) { struct zip_extract_userdata *data = (struct zip_extract_userdata*)userdata; /* Extract first content that matches our list. */ const char *ext = path_get_extension(name); if (ext && string_list_find_elem(data->ext, ext)) { char new_path[PATH_MAX]; if (data->extraction_directory) fill_pathname_join(new_path, data->extraction_directory, path_basename(name), sizeof(new_path)); else fill_pathname_resolve_relative(new_path, data->zip_path, path_basename(name), sizeof(new_path)); switch (cmode) { /* Uncompressed. */ case 0: data->found_content = write_file(new_path, cdata, size); return false; /* Deflate. */ case 8: if (zlib_inflate_data_to_file(new_path, cdata, csize, size, crc32)) { strlcpy(data->zip_path, new_path, data->zip_path_size); data->found_content = true; return false; } return false; default: return false; } } return true; }
static int zlib_extract_core_callback(const char *name, const char *valid_exts, const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size, uint32_t crc32, void *userdata) { char path[PATH_MAX_LENGTH]; /* Make directory */ fill_pathname_join(path, (const char*)userdata, name, sizeof(path)); path_basedir(path); if (!path_mkdir(path)) { RARCH_ERR("Failed to create directory: %s.\n", path); return 0; } /* Ignore directories. */ if (name[strlen(name) - 1] == '/' || name[strlen(name) - 1] == '\\') return 1; fill_pathname_join(path, (const char*)userdata, name, sizeof(path)); RARCH_LOG("path is: %s, CRC32: 0x%x\n", path, crc32); switch (cmode) { case 0: /* Uncompressed */ write_file(path, cdata, size); break; case 8: /* Deflate */ zlib_inflate_data_to_file(path, valid_exts, cdata, csize, size, crc32); break; } return 1; }
static bool zip_extract_cb(const char *name, const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size, uint32_t crc32, void *userdata) { struct zip_extract_userdata *data = (struct zip_extract_userdata*)userdata; // Extract first ROM that matches our list. const char *ext = path_get_extension(name); if (ext && string_list_find_elem(data->ext, ext)) { char new_path[PATH_MAX]; fill_pathname_resolve_relative(new_path, data->zip_path, path_basename(name), sizeof(new_path)); switch (cmode) { case 0: // Uncompressed data->found_rom = write_file(new_path, cdata, size); return false; case 8: // Deflate if (zlib_inflate_data_to_file(new_path, cdata, csize, size, crc32)) { strlcpy(data->zip_path, new_path, data->zip_path_size); data->found_rom = true; return false; } else return false; default: return false; } } return true; }