static void on_zip_downloaded(_unused_ void* userdata, void* buffer, int size) { log_info("Done."); mz_zip_archive za; if (!mz_zip_reader_init_mem(&za, buffer, size, 0)) { log_error("Cannot unzip game files: invalid archive"); return; } for (mz_uint i = 0; i < mz_zip_reader_get_num_files(&za); i++) { mz_zip_archive_file_stat file_stat; if (!mz_zip_reader_file_stat(&za, i, &file_stat)) { log_error("Cannot unzip game files"); break; } const char* filename = file_stat.m_filename; int r = mkdir_p(filename); if (r < 0) { log_error("Cannot unzip game files: %s", strerror(-r)); break; } if (!mz_zip_reader_is_file_a_directory(&za, i)) { mz_zip_reader_extract_to_file(&za, i, filename, 0); } } mz_zip_reader_end(&za); engine_load(); }
BYTE uncomp_zip_file_from_archive(_uncomp_file_data *file) { mz_zip_archive zip_archive; memset(&zip_archive, 0, sizeof(zip_archive)); if (!mz_zip_reader_init_file(&zip_archive, info.rom_file, 0)) { fprintf(stderr, "mz_zip_reader_init_file() failed!\n"); return (EXIT_ERROR); } mz_zip_reader_get_filename(&zip_archive, file->num, uncomp.buffer, sizeof(uncomp.buffer)); snprintf(uncomp.uncompress_file, sizeof(uncomp.uncompress_file), "%s" TMP_FOLDER "/%s", info.base_folder, basename(uncomp.buffer)); if (mz_zip_reader_extract_to_file(&zip_archive, file->num, uncomp.uncompress_file, 0)) { strncpy(uncomp.compress_archive, info.rom_file, sizeof(uncomp.compress_archive)); strncpy(info.rom_file, uncomp.uncompress_file, sizeof(info.rom_file)); info.uncompress_rom = TRUE; } else { fprintf(stderr, "unzip file failed!\n"); } // Close the archive, freeing any resources it was using mz_zip_reader_end(&zip_archive); return (EXIT_OK); }
bool decompress_archive( const char* data, std::size_t size, const std::string& directory ) { auto zip_archive = sys::create_zeroed<mz_zip_archive>(); if( !mz_zip_reader_init_mem( &zip_archive, data, size, 0 ) ) { std::cout << "mz_zip_reader_init_mem() failed!\n"; return false; } for( unsigned int i = 0; i < mz_zip_reader_get_num_files( &zip_archive ); i++ ) { mz_zip_archive_file_stat file_stat; if( !mz_zip_reader_file_stat( &zip_archive, i, &file_stat ) ) { std::cout << "mz_zip_reader_file_stat() failed!\n"; mz_zip_reader_end( &zip_archive ); return false; } if( !mz_zip_reader_is_file_a_directory( &zip_archive, i ) ) { auto filename = directory + ( directory.empty() ? "" : "/" ) + file_stat.m_filename; if( !sys::create_directory_if_required( filename ) ) { std::cout << "decompress_archive could not create directory.\n"; return false; } if( !mz_zip_reader_extract_to_file( &zip_archive, i, filename.c_str(), 0 ) ) { std::cout << "mz_zip_reader_extract_to_file() failed!\n"; mz_zip_reader_end( &zip_archive ); return false; } } } if( !mz_zip_reader_end( &zip_archive ) ) { std::cout << "mz_zip_reader_end() failed!\n"; return false; } return true; }