示例#1
0
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();
}
示例#2
0
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);
}
示例#3
0
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;
}