JNIEXPORT jboolean JNICALL Java_com_retroarch_browser_NativeInterface_extractArchiveTo( JNIEnv *env, jclass cls, jstring archive, jstring subdir, jstring dest) { const char *archive_c = (*env)->GetStringUTFChars(env, archive, NULL); const char *subdir_c = (*env)->GetStringUTFChars(env, subdir, NULL); const char *dest_c = (*env)->GetStringUTFChars(env, dest, NULL); jboolean ret = JNI_TRUE; struct userdata data = { .subdir = subdir_c, .dest = dest_c, }; if (!zlib_parse_file(archive_c, zlib_cb, &data)) { RARCH_ERR("Failed to parse APK: %s.\n", archive_c); ret = JNI_FALSE; } (*env)->ReleaseStringUTFChars(env, archive, archive_c); (*env)->ReleaseStringUTFChars(env, subdir, subdir_c); (*env)->ReleaseStringUTFChars(env, dest, dest_c); return ret; }
struct string_list *zlib_get_file_list(const char *path) { struct string_list *list = string_list_new(); if (!list) return NULL; if (!zlib_parse_file(path, zlib_get_file_list_cb, list)) { RARCH_ERR("Parsing ZIP failed.\n"); string_list_free(list); return NULL; } else return list; }
/** * zlib_get_file_list: * @path : filename path of archive * * Returns: string listing of files from archive on success, otherwise NULL. **/ struct string_list *zlib_get_file_list(const char *path, const char *valid_exts) { struct string_list *list = string_list_new(); if (!list) return NULL; if (!zlib_parse_file(path, valid_exts, zlib_get_file_list_cb, list)) { /* Parsing ZIP failed. */ string_list_free(list); return NULL; } return list; }
int cb_core_updater_download(void *data_, size_t len) { FILE *f; const char* file_ext = NULL; char output_path[PATH_MAX_LENGTH], msg[PATH_MAX_LENGTH]; char *data = (char*)data_; if (!data) return -1; fill_pathname_join(output_path, g_settings.libretro_directory, core_updater_path, sizeof(output_path)); f = fopen(output_path, "wb"); if (!f) return -1; fwrite(data, 1, len, f); fclose(f); snprintf(msg, sizeof(msg), "Download complete: %s.", core_updater_path); rarch_main_msg_queue_push(msg, 1, 90, true); #ifdef HAVE_ZLIB file_ext = path_get_extension(output_path); if (!g_settings.network.buildbot_auto_extract_archive) return 0; if (!strcasecmp(file_ext,"zip")) { if (!zlib_parse_file(output_path, NULL, zlib_extract_core_callback, (void*)g_settings.libretro_directory)) RARCH_LOG("Could not process ZIP file.\n"); } #endif return 0; }
static int cb_generic_download(void *data, size_t len, const char *dir_path) { char msg[PATH_MAX_LENGTH]; char output_path[PATH_MAX_LENGTH]; const char *file_ext = NULL; settings_t *settings = config_get_ptr(); if (!data) return -1; fill_pathname_join(output_path, dir_path, core_updater_path, sizeof(output_path)); if (!write_file(output_path, data, len)) return -1; snprintf(msg, sizeof(msg), "%s: %s.", msg_hash_to_str(MSG_DOWNLOAD_COMPLETE), core_updater_path); rarch_main_msg_queue_push(msg, 1, 90, true); #ifdef HAVE_ZLIB file_ext = path_get_extension(output_path); if (!settings->network.buildbot_auto_extract_archive) return 0; if (!strcasecmp(file_ext,"zip")) { if (!zlib_parse_file(output_path, NULL, zlib_extract_core_callback, (void*)dir_path)) RARCH_LOG(msg_hash_to_str(MSG_COULD_NOT_PROCESS_ZIP_FILE)); if (path_file_exists(output_path)) remove(output_path); } #endif return 0; }
/** * zlib_extract_first_content_file: * @zip_path : filename path to ZIP archive. * @zip_path_size : size of ZIP archive. * @valid_exts : valid extensions for a content file. * @extraction_directory : the directory to extract temporary * unzipped content to. * * Extract first content file from archive. * * Returns : true (1) on success, otherwise false (0). **/ bool zlib_extract_first_content_file(char *zip_path, size_t zip_path_size, const char *valid_exts, const char *extraction_directory) { struct string_list *list; bool ret = true; struct zip_extract_userdata userdata = {0}; if (!valid_exts) { /* Libretro implementation does not have any valid extensions. * Cannot unzip without knowing this. */ return false; } list = string_split(valid_exts, "|"); if (!list) GOTO_END_ERROR(); userdata.zip_path = zip_path; userdata.zip_path_size = zip_path_size; userdata.extraction_directory = extraction_directory; userdata.ext = list; if (!zlib_parse_file(zip_path, valid_exts, zip_extract_cb, &userdata)) { /* Parsing ZIP failed. */ GOTO_END_ERROR(); } if (!userdata.found_content) { /* Didn't find any content that matched valid extensions * for libretro implementation. */ GOTO_END_ERROR(); } end: if (list) string_list_free(list); return ret; }
bool zlib_extract_first_rom(char *zip_path, size_t zip_path_size, const char *valid_exts) { bool ret; struct zip_extract_userdata userdata = {0}; struct string_list *list; if (!valid_exts) { RARCH_ERR("Libretro implementation does not have any valid extensions. Cannot unzip without knowing this.\n"); return false; } ret = true; list = string_split(valid_exts, "|"); if (!list) GOTO_END_ERROR(); userdata.zip_path = zip_path; userdata.zip_path_size = zip_path_size; userdata.ext = list; if (!zlib_parse_file(zip_path, zip_extract_cb, &userdata)) { RARCH_ERR("Parsing ZIP failed.\n"); GOTO_END_ERROR(); } if (!userdata.found_rom) { RARCH_ERR("Didn't find any ROMS that matched valid extensions for libretro implementation.\n"); GOTO_END_ERROR(); } end: if (list) string_list_free(list); return ret; }
static int cb_core_updater_download(void *data, size_t len) { const char *file_ext = NULL; char output_path[PATH_MAX_LENGTH] = {0}; char msg[PATH_MAX_LENGTH] = {0}; settings_t *settings = config_get_ptr(); if (!data) return -1; fill_pathname_join(output_path, settings->libretro_directory, core_updater_path, sizeof(output_path)); if (!write_file(output_path, data, len)) return -1; snprintf(msg, sizeof(msg), "Download complete: %s.", core_updater_path); rarch_main_msg_queue_push(msg, 1, 90, true); #ifdef HAVE_ZLIB file_ext = path_get_extension(output_path); if (!settings->network.buildbot_auto_extract_archive) return 0; if (!strcasecmp(file_ext,"zip")) { if (!zlib_parse_file(output_path, NULL, zlib_extract_core_callback, (void*)settings->libretro_directory)) RARCH_LOG("Could not process ZIP file.\n"); } #endif return 0; }