mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	introduced zip support into vcmi
- minizip library is now part of sources, located at lib/minizip - cmakefiles will compile minizip as dynamic library (Note: only 2 files used by vcmi are included in minizip.so) - zip files can be loaded similar to other archives via filesystem.json - mods can use Content.zip instead of Content/ directory. Files in directory will replace files in archive.
This commit is contained in:
		| @@ -121,6 +121,7 @@ SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/vcmi") | ||||
| SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) | ||||
|  | ||||
| add_subdirectory(lib) | ||||
| add_subdirectory(lib/minizip) | ||||
| add_subdirectory(client) | ||||
| add_subdirectory(server) | ||||
| add_subdirectory(AI) | ||||
|   | ||||
| @@ -364,12 +364,11 @@ CDefHandler * CDefHandler::giveDef(const std::string & defName) | ||||
| { | ||||
| 	ResourceID resID(std::string("SPRITES/") + defName, EResType::ANIMATION); | ||||
|  | ||||
| 	ui8 * data = CResourceHandler::get()->load(resID)->readAll().first.release(); | ||||
| 	auto data = CResourceHandler::get()->load(resID)->readAll().first; | ||||
| 	if(!data) | ||||
| 		throw std::runtime_error("bad def name!"); | ||||
| 	auto   nh = new CDefHandler(); | ||||
| 	nh->openFromMemory(data, defName); | ||||
| 	delete [] data; | ||||
| 	nh->openFromMemory(data.get(), defName); | ||||
| 	return nh; | ||||
| } | ||||
| CDefEssential * CDefHandler::giveDefEss(const std::string & defName) | ||||
|   | ||||
| @@ -51,7 +51,6 @@ CDefObjInfoHandler::CDefObjInfoHandler() | ||||
| 	VLC->dobjinfo = this; | ||||
|  | ||||
| 	auto textFile = CResourceHandler::get()->load(ResourceID("DATA/OBJECTS.TXT"))->readAll(); | ||||
|  | ||||
| 	std::istringstream inp(std::string((char*)textFile.first.get(), textFile.second)); | ||||
| 	int objNumber; | ||||
| 	inp>>objNumber; | ||||
|   | ||||
| @@ -13,6 +13,7 @@ set(lib_SRCS | ||||
| 		filesystem/CMemoryStream.cpp | ||||
| 		filesystem/CBinaryReader.cpp | ||||
| 		filesystem/CFileInputStream.cpp | ||||
| 		filesystem/CZipLoader.cpp | ||||
| 		filesystem/Filesystem.cpp | ||||
|  | ||||
| 		logging/CBasicLogConfigurator.cpp | ||||
| @@ -88,7 +89,7 @@ set(lib_HEADERS | ||||
|  | ||||
| add_library(vcmi SHARED ${lib_SRCS} ${lib_HEADERS}) | ||||
| set_target_properties(vcmi PROPERTIES XCODE_ATTRIBUTE_LD_DYLIB_INSTALL_NAME "@executable_path/libvcmi.dylib") | ||||
| target_link_libraries(vcmi ${Boost_LIBRARIES} ${SDL_LIBRARY} ${ZLIB_LIBRARIES}) | ||||
| target_link_libraries(vcmi minizip ${Boost_LIBRARIES} ${SDL_LIBRARY} ${ZLIB_LIBRARIES}) | ||||
|  | ||||
| if (NOT APPLE) # Already inside vcmiclient bundle | ||||
|     install(TARGETS vcmi DESTINATION ${LIB_DIR}) | ||||
|   | ||||
| @@ -34,20 +34,20 @@ DLL_LINKAGE void preinitDLL(CConsoleHandler *Console) | ||||
| { | ||||
| 	console = Console; | ||||
| 	VLC = new LibClasses; | ||||
| 	//try | ||||
| 	try | ||||
| 	{ | ||||
| 		VLC->loadFilesystem(); | ||||
| 	} | ||||
| 	//HANDLE_EXCEPTION; | ||||
| 	HANDLE_EXCEPTION; | ||||
| } | ||||
|  | ||||
| DLL_LINKAGE void loadDLLClasses() | ||||
| { | ||||
| 	//try | ||||
| 	try | ||||
| 	{ | ||||
| 		VLC->init(); | ||||
| 	} | ||||
| 	//HANDLE_EXCEPTION; | ||||
| 	HANDLE_EXCEPTION; | ||||
| } | ||||
|  | ||||
| const IBonusTypeHandler * LibClasses::getBth() const | ||||
|   | ||||
| @@ -5,12 +5,81 @@ | ||||
|  | ||||
| static const int inflateBlockSize = 10000; | ||||
|  | ||||
| CBufferedStream::CBufferedStream(): | ||||
|     position(0), | ||||
|     endOfFileReached(false) | ||||
| { | ||||
| } | ||||
|  | ||||
| si64 CBufferedStream::read(ui8 * data, si64 size) | ||||
| { | ||||
| 	ensureSize(position + size); | ||||
|  | ||||
| 	auto start = buffer.data() + position; | ||||
| 	si64 toRead = std::min<si64>(size, buffer.size() - position); | ||||
|  | ||||
| 	std::copy(start, start + toRead, data); | ||||
| 	position += toRead; | ||||
| 	return size; | ||||
| } | ||||
|  | ||||
| si64 CBufferedStream::seek(si64 position) | ||||
| { | ||||
| 	ensureSize(position); | ||||
| 	this->position = std::min<si64>(position, buffer.size()); | ||||
| 	return this->position; | ||||
| } | ||||
|  | ||||
| si64 CBufferedStream::tell() | ||||
| { | ||||
| 	return position; | ||||
| } | ||||
|  | ||||
| si64 CBufferedStream::skip(si64 delta) | ||||
| { | ||||
| 	return seek(position + delta) - delta; | ||||
| } | ||||
|  | ||||
| si64 CBufferedStream::getSize() | ||||
| { | ||||
| 	si64 prevPos = tell(); | ||||
| 	seek(std::numeric_limits<si64>::max()); | ||||
| 	si64 size = tell(); | ||||
| 	seek(prevPos); | ||||
| 	return size; | ||||
| } | ||||
|  | ||||
| void CBufferedStream::ensureSize(si64 size) | ||||
| { | ||||
| 	while (buffer.size() < size && !endOfFileReached) | ||||
| 	{ | ||||
| 		si64 initialSize = buffer.size(); | ||||
| 		si64 currentStep = std::min<si64>(size, buffer.size()); | ||||
| 		vstd::amax(currentStep, 1024); // to avoid large number of calls at start | ||||
|  | ||||
| 		buffer.resize(initialSize + currentStep); | ||||
|  | ||||
| 		si64 readSize = readMore(buffer.data() + initialSize, currentStep); | ||||
| 		if (readSize != currentStep) | ||||
| 		{ | ||||
| 			endOfFileReached = true; | ||||
| 			buffer.resize(initialSize + readSize); | ||||
| 			buffer.shrink_to_fit(); | ||||
| 			return; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void CBufferedStream::reset() | ||||
| { | ||||
| 	buffer.clear(); | ||||
| 	position = 0; | ||||
| 	endOfFileReached = false; | ||||
| } | ||||
|  | ||||
| CCompressedStream::CCompressedStream(std::unique_ptr<CInputStream> stream, bool gzip, size_t decompressedSize): | ||||
| 	gzipStream(std::move(stream)), | ||||
| 	buffer(decompressedSize), | ||||
| 	decompressedSize(0), | ||||
| 	compressedBuffer(inflateBlockSize), | ||||
| 	position(0) | ||||
| 	compressedBuffer(inflateBlockSize) | ||||
| { | ||||
| 	assert(gzipStream); | ||||
|  | ||||
| @@ -33,132 +102,67 @@ CCompressedStream::CCompressedStream(std::unique_ptr<CInputStream> stream, bool | ||||
|  | ||||
| CCompressedStream::~CCompressedStream() | ||||
| { | ||||
| 	if (inflateState) | ||||
| 	{ | ||||
| 		inflateEnd(inflateState); | ||||
| 		delete inflateState; | ||||
| 	} | ||||
| 	delete inflateState; | ||||
| } | ||||
|  | ||||
| si64 CCompressedStream::read(ui8 * data, si64 size) | ||||
| { | ||||
| 	decompressTill(position + size); | ||||
|  | ||||
| 	auto start = buffer.begin() + position; | ||||
| 	si64 toRead = std::min<si64>(size, decompressedSize - position); | ||||
|  | ||||
| 	std::copy(start, start + toRead, data); | ||||
| 	position += toRead; | ||||
| 	return size; | ||||
| } | ||||
|  | ||||
| si64 CCompressedStream::seek(si64 position) | ||||
| { | ||||
| 	decompressTill(position); | ||||
| 	this->position = std::min<si64>(position, decompressedSize); | ||||
| 	return this->position; | ||||
| } | ||||
|  | ||||
| si64 CCompressedStream::tell() | ||||
| { | ||||
| 	return position; | ||||
| } | ||||
|  | ||||
| si64 CCompressedStream::skip(si64 delta) | ||||
| { | ||||
| 	decompressTill(position + delta); | ||||
|  | ||||
| 	si64 oldPosition = position; | ||||
| 	position = std::min<si64>(position + delta , decompressedSize); | ||||
| 	return position - oldPosition; | ||||
| } | ||||
|  | ||||
| si64 CCompressedStream::getSize() | ||||
| { | ||||
| 	decompressTill(-1); | ||||
| 	return decompressedSize; | ||||
| } | ||||
|  | ||||
| void CCompressedStream::decompressTill(si64 newSize) | ||||
| si64 CCompressedStream::readMore(ui8 *data, si64 size) | ||||
| { | ||||
| 	if (inflateState == nullptr) | ||||
| 		return; //file already decompressed | ||||
|  | ||||
| 	if (newSize >= 0 && newSize <= inflateState->total_out) | ||||
| 		return; //no need to decompress anything | ||||
|  | ||||
| 	bool toEnd = newSize < 0; //if true - we've got request to read whole file | ||||
|  | ||||
| 	if (toEnd && buffer.empty()) | ||||
| 		buffer.resize(16 * 1024); //some space for initial decompression | ||||
|  | ||||
| 	if (!toEnd && buffer.size() < newSize) | ||||
| 		buffer.resize(newSize); | ||||
| 		return 0; //file already decompressed | ||||
|  | ||||
| 	bool fileEnded = false; //end of file reached | ||||
| 	bool endLoop = false; | ||||
|  | ||||
| 	int decompressed = inflateState->total_out; | ||||
|  | ||||
| 	inflateState->avail_out = size; | ||||
| 	inflateState->next_out = data; | ||||
|  | ||||
| 	int endLoop = false; | ||||
| 	do | ||||
| 	{ | ||||
| 		if (inflateState->avail_in == 0) | ||||
| 		{ | ||||
| 			//inflate ran out of available data or was not initialized yet | ||||
| 			// get new input data and update state accordingly | ||||
| 			si64 size = gzipStream->read(compressedBuffer.data(), compressedBuffer.size()); | ||||
| 			if (size != compressedBuffer.size()) | ||||
| 				fileEnded = true; //end of file reached | ||||
| 			si64 availSize = gzipStream->read(compressedBuffer.data(), compressedBuffer.size()); | ||||
| 			if (availSize != compressedBuffer.size()) | ||||
| 				gzipStream.reset(); | ||||
|  | ||||
| 			inflateState->avail_in = size; | ||||
| 			inflateState->avail_in = availSize; | ||||
| 			inflateState->next_in  = compressedBuffer.data(); | ||||
| 		} | ||||
|  | ||||
| 		inflateState->avail_out = buffer.size() - inflateState->total_out; | ||||
| 		inflateState->next_out = buffer.data() + inflateState->total_out; | ||||
|  | ||||
| 		int ret = inflate(inflateState, Z_NO_FLUSH); | ||||
|  | ||||
| 		if (inflateState->avail_in == 0 && gzipStream == nullptr) | ||||
| 			fileEnded = true; | ||||
|  | ||||
| 		switch (ret) | ||||
| 		{ | ||||
| 		case Z_STREAM_END: //end decompression | ||||
| 			endLoop = true; | ||||
| 			break; | ||||
| 		case Z_OK: //decompress next chunk | ||||
| 		case Z_OK: //input data ended/ output buffer full | ||||
| 			endLoop = false; | ||||
| 			break; | ||||
| 		case Z_BUF_ERROR: | ||||
| 			{ | ||||
| 				if (toEnd) | ||||
| 				{ | ||||
| 					//not enough memory. Allocate bigger buffer and try again | ||||
| 					buffer.resize(buffer.size() * 2); | ||||
| 					endLoop = false; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					//specific amount of data was requested. inflate extracted all requested data | ||||
| 					// but returned "error". Ensure that enough data was extracted and return | ||||
| 					assert(inflateState->total_out == newSize); | ||||
| 					endLoop = true; | ||||
| 				} | ||||
| 			} | ||||
| 		case Z_STREAM_END: // stream ended. Note that campaign files consist from multiple such streams | ||||
| 			endLoop = true; | ||||
| 			break; | ||||
| 		case Z_BUF_ERROR: // output buffer full. Can be triggered? | ||||
| 			endLoop = true; | ||||
| 			break; | ||||
| 		default: | ||||
| 			throw std::runtime_error("Decompression error!\n"); | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
| 	while (!endLoop); | ||||
| 	while (endLoop == false && inflateState->avail_out != 0 ); | ||||
|  | ||||
| 	decompressed = inflateState->total_out - decompressed; | ||||
|  | ||||
| 	// Clean up and return | ||||
| 	if (fileEnded) | ||||
| 	{ | ||||
| 		inflateEnd(inflateState); | ||||
| 		buffer.resize(inflateState->total_out); | ||||
| 		decompressedSize = inflateState->total_out; | ||||
| 		vstd::clear_pointer(inflateState); | ||||
| 	} | ||||
| 	else | ||||
| 		decompressedSize = inflateState->total_out; | ||||
| 	return decompressed; | ||||
| } | ||||
|  | ||||
| bool CCompressedStream::getNextBlock() | ||||
| @@ -169,8 +173,6 @@ bool CCompressedStream::getNextBlock() | ||||
| 	if (inflateReset(inflateState) < 0) | ||||
| 		return false; | ||||
|  | ||||
| 	decompressedSize = 0; | ||||
| 	position = 0; | ||||
| 	buffer.clear(); | ||||
| 	reset(); | ||||
| 	return true; | ||||
| } | ||||
|   | ||||
| @@ -14,11 +14,81 @@ | ||||
|  | ||||
| struct z_stream_s; | ||||
|  | ||||
| class CBufferedStream : public CInputStream | ||||
| { | ||||
| public: | ||||
| 	CBufferedStream(); | ||||
|  | ||||
| 	/** | ||||
| 	 * Reads n bytes from the stream into the data buffer. | ||||
| 	 * | ||||
| 	 * @param data A pointer to the destination data array. | ||||
| 	 * @param size The number of bytes to read. | ||||
| 	 * @return the number of bytes read actually. | ||||
| 	 * | ||||
| 	 * @throws std::runtime_error if the file decompression was not successful | ||||
| 	 */ | ||||
| 	si64 read(ui8 * data, si64 size) override; | ||||
|  | ||||
| 	/** | ||||
| 	 * Seeks the internal read pointer to the specified position. | ||||
| 	 * This will cause decompressing data till this position is found | ||||
| 	 * | ||||
| 	 * @param position The read position from the beginning. | ||||
| 	 * @return the position actually moved to, -1 on error. | ||||
| 	 */ | ||||
| 	si64 seek(si64 position) override; | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the current read position in the stream. | ||||
| 	 * | ||||
| 	 * @return the read position. | ||||
| 	 */ | ||||
| 	si64 tell() override; | ||||
|  | ||||
| 	/** | ||||
| 	 * Skips delta numbers of bytes. | ||||
| 	 * | ||||
| 	 * @param delta The count of bytes to skip. | ||||
| 	 * @return the count of bytes skipped actually. | ||||
| 	 */ | ||||
| 	si64 skip(si64 delta) override; | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the length in bytes of the stream. | ||||
| 	 * Causes complete data decompression | ||||
| 	 * | ||||
| 	 * @return the length in bytes of the stream. | ||||
| 	 */ | ||||
| 	si64 getSize() override; | ||||
|  | ||||
| protected: | ||||
| 	/** | ||||
| 	 * @brief virtual method to get more data into the buffer | ||||
| 	 * @return amount of bytes actually read, non-positive values are considered to be end-of-file mark | ||||
| 	 */ | ||||
| 	virtual si64 readMore(ui8 * data, si64 size) = 0; | ||||
|  | ||||
| 	/// resets all internal state | ||||
| 	void reset(); | ||||
| private: | ||||
| 	/// ensures that buffer contains at lest size of bytes. Calls readMore() to fill remaining part | ||||
| 	void ensureSize(si64 size); | ||||
|  | ||||
| 	/** buffer with already decompressed data */ | ||||
| 	std::vector<ui8> buffer; | ||||
|  | ||||
| 	/** Current read position */ | ||||
| 	si64 position; | ||||
|  | ||||
| 	bool endOfFileReached; | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * A class which provides method definitions for reading a gzip-compressed file | ||||
|  * This class implements lazy loading - data will be decompressed (and cached by this class) only by request | ||||
|  */ | ||||
| class DLL_LINKAGE CCompressedStream : public CInputStream | ||||
| class DLL_LINKAGE CCompressedStream : public CBufferedStream | ||||
| { | ||||
| public: | ||||
| 	/** | ||||
| @@ -32,49 +102,6 @@ public: | ||||
|  | ||||
| 	~CCompressedStream(); | ||||
|  | ||||
| 	/** | ||||
| 	 * Reads n bytes from the stream into the data buffer. | ||||
| 	 * | ||||
| 	 * @param data A pointer to the destination data array. | ||||
| 	 * @param size The number of bytes to read. | ||||
| 	 * @return the number of bytes read actually. | ||||
| 	 * | ||||
| 	 * @throws std::runtime_error if the file decompression was not successful | ||||
| 	 */ | ||||
| 	si64 read(ui8 * data, si64 size); | ||||
|  | ||||
| 	/** | ||||
| 	 * Seeks the internal read pointer to the specified position. | ||||
| 	 * This will cause decompressing data till this position is found | ||||
| 	 * | ||||
| 	 * @param position The read position from the beginning. | ||||
| 	 * @return the position actually moved to, -1 on error. | ||||
| 	 */ | ||||
| 	si64 seek(si64 position); | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the current read position in the stream. | ||||
| 	 * | ||||
| 	 * @return the read position. | ||||
| 	 */ | ||||
| 	si64 tell(); | ||||
|  | ||||
| 	/** | ||||
| 	 * Skips delta numbers of bytes. | ||||
| 	 * | ||||
| 	 * @param delta The count of bytes to skip. | ||||
| 	 * @return the count of bytes skipped actually. | ||||
| 	 */ | ||||
| 	si64 skip(si64 delta); | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the length in bytes of the stream. | ||||
| 	 * Causes complete data decompression | ||||
| 	 * | ||||
| 	 * @return the length in bytes of the stream. | ||||
| 	 */ | ||||
| 	si64 getSize(); | ||||
|  | ||||
| 	/** | ||||
| 	 * Prepare stream for decompression of next block (e.g. nect part of h3c) | ||||
| 	 * Applicable only for streams that contain multiple concatenated compressed data | ||||
| @@ -87,26 +114,17 @@ private: | ||||
| 	/** | ||||
| 	 * Decompresses data to ensure that buffer has newSize bytes or end of stream was reached | ||||
| 	 */ | ||||
| 	void decompressTill(si64 newSize); | ||||
| 	si64 readMore(ui8 * data, si64 size); | ||||
|  | ||||
| 	/** The file stream with compressed data. */ | ||||
| 	std::unique_ptr<CInputStream> gzipStream; | ||||
|  | ||||
| 	/** buffer with already decompressed data. Please note that size() != decompressed size */ | ||||
| 	std::vector<ui8> buffer; | ||||
|  | ||||
| 	/** size of already decompressed data */ | ||||
| 	si64 decompressedSize; | ||||
|  | ||||
| 	/** buffer with not yet decompressed data*/ | ||||
| 	std::vector<ui8> compressedBuffer; | ||||
|  | ||||
| 	/** struct with current zlib inflate state */ | ||||
| 	z_stream_s * inflateState; | ||||
|  | ||||
| 	/** Current read position */ | ||||
| 	si64 position; | ||||
|  | ||||
| 	enum EState | ||||
| 	{ | ||||
| 		ERROR, | ||||
| @@ -115,5 +133,4 @@ private: | ||||
| 		STREAM_END, | ||||
| 		FINISHED | ||||
| 	}; | ||||
|  | ||||
| }; | ||||
|   | ||||
| @@ -81,6 +81,7 @@ std::unordered_map<ResourceID, std::string> CFilesystemLoader::listFiles(const s | ||||
| 	initialTypes.insert(EResType::ARCHIVE_LOD); | ||||
| 	initialTypes.insert(EResType::ARCHIVE_VID); | ||||
| 	initialTypes.insert(EResType::ARCHIVE_SND); | ||||
| 	initialTypes.insert(EResType::ARCHIVE_ZIP); | ||||
|  | ||||
| 	assert(boost::filesystem::is_directory(baseDirectory)); | ||||
| 	std::unordered_map<ResourceID, std::string> fileList; | ||||
|   | ||||
							
								
								
									
										101
									
								
								lib/filesystem/CZipLoader.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								lib/filesystem/CZipLoader.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | ||||
| #include "Global.h" | ||||
| #include "CZipLoader.h" | ||||
|  | ||||
| /* | ||||
|  * CZipLoader.cpp, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
|  * License: GNU General Public License v2.0 or later | ||||
|  * Full text of license available in license.txt file, in main folder | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| CZipStream::CZipStream(const std::string & archive, unz_file_pos filepos) | ||||
| { | ||||
| 	file = unzOpen(archive.c_str()); | ||||
| 	unzGoToFilePos(file, &filepos); | ||||
| 	unzOpenCurrentFile(file); | ||||
| } | ||||
|  | ||||
| CZipStream::~CZipStream() | ||||
| { | ||||
| 	unzCloseCurrentFile(file); | ||||
| 	unzClose(file); | ||||
| } | ||||
|  | ||||
| si64 CZipStream::readMore(ui8 * data, si64 size) | ||||
| { | ||||
| 	return unzReadCurrentFile(file, data, size); | ||||
| } | ||||
|  | ||||
| si64 CZipStream::getSize() | ||||
| { | ||||
| 	unz_file_info info; | ||||
| 	unzGetCurrentFileInfo (file, &info, nullptr, 0, nullptr, 0, nullptr, 0); | ||||
| 	return info.uncompressed_size; | ||||
| } | ||||
|  | ||||
| CZipLoader::CZipLoader(const std::string & mountPoint, const std::string & archive): | ||||
|     archiveName(archive), | ||||
|     mountPoint(mountPoint), | ||||
|     files(listFiles(mountPoint, archive)) | ||||
| { | ||||
| 	logGlobal->traceStream() << "Zip archive loaded, " << files.size() << " files found"; | ||||
| } | ||||
|  | ||||
| std::unordered_map<ResourceID, unz_file_pos> CZipLoader::listFiles(const std::string & mountPoint, const std::string & archive) | ||||
| { | ||||
| 	std::unordered_map<ResourceID, unz_file_pos> ret; | ||||
|  | ||||
| 	unzFile file = unzOpen(archive.c_str()); | ||||
|  | ||||
| 	if (unzGoToFirstFile(file) == UNZ_OK) | ||||
| 	{ | ||||
| 		do | ||||
| 		{ | ||||
| 			unz_file_info info; | ||||
| 			std::vector<char> filename; | ||||
| 			// Fill unz_file_info structure with current file info | ||||
| 			unzGetCurrentFileInfo (file, &info, nullptr, 0, nullptr, 0, nullptr, 0); | ||||
|  | ||||
| 			filename.resize(info.size_filename); | ||||
| 			// Get name of current file. Contrary to docs "info" parameter can't be null | ||||
| 			unzGetCurrentFileInfo (file, &info, filename.data(), filename.size(), nullptr, 0, nullptr, 0); | ||||
|  | ||||
| 			std::string filenameString(filename.data(), filename.size()); | ||||
| 			unzGetFilePos(file, &ret[ResourceID(mountPoint + filenameString)]); | ||||
| 		} | ||||
| 		while (unzGoToNextFile(file) == UNZ_OK); | ||||
| 	} | ||||
| 	unzClose(file); | ||||
|  | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| std::unique_ptr<CInputStream> CZipLoader::load(const ResourceID & resourceName) const | ||||
| { | ||||
| 	return std::unique_ptr<CInputStream>(new CZipStream(archiveName, files.at(resourceName))); | ||||
| } | ||||
|  | ||||
| bool CZipLoader::existsResource(const ResourceID & resourceName) const | ||||
| { | ||||
| 	return files.count(resourceName) != 0; | ||||
| } | ||||
|  | ||||
| std::string CZipLoader::getMountPoint() const | ||||
| { | ||||
| 	return mountPoint; | ||||
| } | ||||
|  | ||||
| std::unordered_set<ResourceID> CZipLoader::getFilteredFiles(std::function<bool(const ResourceID &)> filter) const | ||||
| { | ||||
| 	std::unordered_set<ResourceID> foundID; | ||||
|  | ||||
| 	for (auto & file : files) | ||||
| 	{ | ||||
| 		if (filter(file.first)) | ||||
| 			foundID.insert(file.first); | ||||
| 	} | ||||
| 	return foundID; | ||||
| } | ||||
							
								
								
									
										57
									
								
								lib/filesystem/CZipLoader.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								lib/filesystem/CZipLoader.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| #pragma once | ||||
|  | ||||
| /* | ||||
|  * CZipLoader.h, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
|  * License: GNU General Public License v2.0 or later | ||||
|  * Full text of license available in license.txt file, in main folder | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include "ISimpleResourceLoader.h" | ||||
| #include "CInputStream.h" | ||||
| #include "Filesystem.h" | ||||
| #include "CCompressedStream.h" | ||||
|  | ||||
| // Necessary here in order to get all types | ||||
| #include "../minizip/unzip.h" | ||||
|  | ||||
| class DLL_LINKAGE CZipStream : public CBufferedStream | ||||
| { | ||||
| 	unzFile file; | ||||
|  | ||||
| public: | ||||
| 	/** | ||||
| 	 * @brief constructs zip stream from already opened file | ||||
| 	 * @param archive path to archive to open | ||||
| 	 * @param filepos position of file to open | ||||
| 	 */ | ||||
| 	CZipStream(const std::string & archive, unz_file_pos filepos); | ||||
| 	~CZipStream(); | ||||
|  | ||||
| 	si64 getSize(); | ||||
|  | ||||
| protected: | ||||
| 	si64 readMore(ui8 * data, si64 size) override; | ||||
| }; | ||||
|  | ||||
| class DLL_LINKAGE CZipLoader : public ISimpleResourceLoader | ||||
| { | ||||
| 	std::string archiveName; | ||||
| 	std::string mountPoint; | ||||
|  | ||||
| 	std::unordered_map<ResourceID, unz_file_pos> files; | ||||
|  | ||||
| 	std::unordered_map<ResourceID, unz_file_pos> listFiles(const std::string & mountPoint, const std::string &archive); | ||||
| public: | ||||
| 	CZipLoader(const std::string & mountPoint, const std::string & archive); | ||||
|  | ||||
| 	/// Interface implementation | ||||
| 	/// @see ISimpleResourceLoader | ||||
| 	std::unique_ptr<CInputStream> load(const ResourceID & resourceName) const override; | ||||
| 	bool existsResource(const ResourceID & resourceName) const override; | ||||
| 	std::string getMountPoint() const override; | ||||
| 	std::unordered_set<ResourceID> getFilteredFiles(std::function<bool(const ResourceID &)> filter) const override; | ||||
| }; | ||||
| @@ -6,6 +6,7 @@ | ||||
| #include "CArchiveLoader.h" | ||||
| #include "CFilesystemLoader.h" | ||||
| #include "AdapterLoaders.h" | ||||
| #include "CZipLoader.h" | ||||
|  | ||||
| //For filesystem initialization | ||||
| #include "../JsonNode.h" | ||||
| @@ -190,7 +191,6 @@ void CResourceHandler::initialize() | ||||
| void CResourceHandler::loadDirectory(const std::string &prefix, const std::string &mountPoint, const JsonNode & config) | ||||
| { | ||||
| 	std::string URI = prefix + config["path"].String(); | ||||
| 	bool writeable = config["writeable"].Bool(); | ||||
| 	int depth = 16; | ||||
| 	if (!config["depth"].isNull()) | ||||
| 		depth = config["depth"].Float(); | ||||
| @@ -200,10 +200,18 @@ void CResourceHandler::loadDirectory(const std::string &prefix, const std::strin | ||||
| 	for(auto & loader : initialLoader->getResourcesWithName(resID)) | ||||
| 	{ | ||||
| 		auto filename = loader->getResourceName(resID); | ||||
| 		resourceLoader->addLoader(new CFilesystemLoader(mountPoint, *filename, depth), writeable); | ||||
| 		resourceLoader->addLoader(new CFilesystemLoader(mountPoint, *filename, depth), false); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void CResourceHandler::loadZipArchive(const std::string &prefix, const std::string &mountPoint, const JsonNode & config) | ||||
| { | ||||
| 	std::string URI = prefix + config["path"].String(); | ||||
| 	auto filename = initialLoader->getResourceName(ResourceID(URI, EResType::ARCHIVE_ZIP)); | ||||
| 	if (filename) | ||||
| 		resourceLoader->addLoader(new CZipLoader(mountPoint, *filename), false); | ||||
| } | ||||
|  | ||||
| void CResourceHandler::loadArchive(const std::string &prefix, const std::string &mountPoint, const JsonNode & config, EResType::Type archiveType) | ||||
| { | ||||
| 	std::string URI = prefix + config["path"].String(); | ||||
| @@ -257,6 +265,8 @@ void CResourceHandler::loadModFileSystem(const std::string & prefix, const JsonN | ||||
| 				loadArchive(prefix, mountPoint.first, entry, EResType::ARCHIVE_SND); | ||||
| 			if (entry["type"].String() == "vid") | ||||
| 				loadArchive(prefix, mountPoint.first, entry, EResType::ARCHIVE_VID); | ||||
| 			if (entry["type"].String() == "zip") | ||||
| 				loadZipArchive(prefix, mountPoint.first, entry); | ||||
|  | ||||
| 			logGlobal->debugStream() << "Resource loaded in " << timer.getDiff() << " ms."; | ||||
| 		} | ||||
| @@ -300,9 +310,11 @@ void CResourceHandler::setActiveMods(std::vector<std::string> enabledMods) | ||||
| 	// default FS config for mods: directory "Content" that acts as H3 root directory | ||||
| 	JsonNode defaultFS; | ||||
|  | ||||
| 	defaultFS[""].Vector().resize(1); | ||||
| 	defaultFS[""].Vector()[0]["type"].String() = "dir"; | ||||
| 	defaultFS[""].Vector()[0]["path"].String() = "/Content"; | ||||
| 	defaultFS[""].Vector().resize(2); | ||||
| 	defaultFS[""].Vector()[0]["type"].String() = "zip"; | ||||
| 	defaultFS[""].Vector()[0]["path"].String() = "/Content.zip"; | ||||
| 	defaultFS[""].Vector()[1]["type"].String() = "dir"; | ||||
| 	defaultFS[""].Vector()[1]["path"].String() = "/Content"; | ||||
|  | ||||
| 	for(std::string & modName : enabledMods) | ||||
| 	{ | ||||
|   | ||||
| @@ -31,7 +31,7 @@ class JsonNode; | ||||
|  * Sound: .wav .82m | ||||
|  * Video: .smk, .bik .mjpg .mpg | ||||
|  * Music: .mp3, .ogg | ||||
|  * Archive: .lod, .snd, .vid .pac | ||||
|  * Archive: .lod, .snd, .vid .pac .zip | ||||
|  * Palette: .pal | ||||
|  * Savegame: .v*gm1 | ||||
|  */ | ||||
| @@ -169,6 +169,7 @@ public: | ||||
| 	static void loadMainFileSystem(const std::string & fsConfigURI); | ||||
| 	static void loadModFileSystem(const std::string &prefix, const JsonNode & fsConfig); | ||||
| 	static void loadDirectory(const std::string &prefix, const std::string & mountPoint, const JsonNode & config); | ||||
| 	static void loadZipArchive(const std::string &prefix, const std::string & mountPoint, const JsonNode & config); | ||||
| 	static void loadArchive(const std::string &prefix, const std::string & mountPoint, const JsonNode & config, EResType::Type archiveType); | ||||
| 	static void loadJsonMap(const std::string &prefix, const std::string & mountPoint, const JsonNode & config); | ||||
|  | ||||
|   | ||||
							
								
								
									
										16
									
								
								lib/minizip/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								lib/minizip/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| project(minizip) | ||||
| cmake_minimum_required(VERSION 2.6) | ||||
|  | ||||
| include_directories(${ZLIB_INCLUDE_DIR}) | ||||
|  | ||||
| #NOTE: full library consists from several more files | ||||
| # but right now VCMI does not need any extra functionality | ||||
| set(lib_SRCS | ||||
| 		unzip.c | ||||
| 		ioapi.c | ||||
| ) | ||||
|  | ||||
| add_library(minizip SHARED ${lib_SRCS}) | ||||
| target_link_libraries(minizip ${ZLIB_LIBRARIES}) | ||||
|  | ||||
| install(TARGETS minizip DESTINATION ${LIB_DIR}) | ||||
							
								
								
									
										6
									
								
								lib/minizip/MiniZip64_Changes.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								lib/minizip/MiniZip64_Changes.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
|  | ||||
| MiniZip 1.1 was derrived from MiniZip at version 1.01f | ||||
|  | ||||
| Change in 1.0 (Okt 2009) | ||||
|  - **TODO - Add history** | ||||
|  | ||||
							
								
								
									
										74
									
								
								lib/minizip/MiniZip64_info.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								lib/minizip/MiniZip64_info.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | ||||
| MiniZip - Copyright (c) 1998-2010 - by Gilles Vollant - version 1.1 64 bits from Mathias Svensson | ||||
|  | ||||
| Introduction | ||||
| --------------------- | ||||
| MiniZip 1.1 is built from MiniZip 1.0 by Gilles Vollant ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
| When adding ZIP64 support into minizip it would result into risk of breaking compatibility with minizip 1.0. | ||||
| All possible work was done for compatibility. | ||||
|  | ||||
|  | ||||
| Background | ||||
| --------------------- | ||||
| When adding ZIP64 support Mathias Svensson found that Even Rouault have added ZIP64  | ||||
| support for unzip.c into minizip for a open source project called gdal ( http://www.gdal.org/ ) | ||||
|  | ||||
| That was used as a starting point. And after that ZIP64 support was added to zip.c | ||||
| some refactoring and code cleanup was also done. | ||||
|  | ||||
|  | ||||
| Changed from MiniZip 1.0 to MiniZip 1.1 | ||||
| --------------------------------------- | ||||
| * Added ZIP64 support for unzip ( by Even Rouault ) | ||||
| * Added ZIP64 support for zip ( by Mathias Svensson ) | ||||
| * Reverted some changed that Even Rouault did. | ||||
| * Bunch of patches received from Gulles Vollant that he received for MiniZip from various users. | ||||
| * Added unzip patch for BZIP Compression method (patch create by Daniel Borca) | ||||
| * Added BZIP Compress method for zip | ||||
| * Did some refactoring and code cleanup | ||||
|  | ||||
|  | ||||
| Credits | ||||
|  | ||||
|  Gilles Vollant    - Original MiniZip author | ||||
|  Even Rouault      - ZIP64 unzip Support | ||||
|  Daniel Borca      - BZip Compression method support in unzip | ||||
|  Mathias Svensson  - ZIP64 zip support | ||||
|  Mathias Svensson  - BZip Compression method support in zip | ||||
|  | ||||
|  Resources | ||||
|  | ||||
|  ZipLayout   http://result42.com/projects/ZipFileLayout | ||||
|              Command line tool for Windows that shows the layout and information of the headers in a zip archive. | ||||
|              Used when debugging and validating the creation of zip files using MiniZip64 | ||||
|  | ||||
|  | ||||
|  ZIP App Note  http://www.pkware.com/documents/casestudies/APPNOTE.TXT | ||||
|                Zip File specification | ||||
|  | ||||
|  | ||||
| Notes. | ||||
|  * To be able to use BZip compression method in zip64.c or unzip64.c the BZIP2 lib is needed and HAVE_BZIP2 need to be defined. | ||||
|  | ||||
| License | ||||
| ---------------------------------------------------------- | ||||
|    Condition of use and distribution are the same than zlib : | ||||
|  | ||||
|   This software is provided 'as-is', without any express or implied | ||||
|   warranty.  In no event will the authors be held liable for any damages | ||||
|   arising from the use of this software. | ||||
|  | ||||
|   Permission is granted to anyone to use this software for any purpose, | ||||
|   including commercial applications, and to alter it and redistribute it | ||||
|   freely, subject to the following restrictions: | ||||
|  | ||||
|   1. The origin of this software must not be misrepresented; you must not | ||||
|      claim that you wrote the original software. If you use this software | ||||
|      in a product, an acknowledgment in the product documentation would be | ||||
|      appreciated but is not required. | ||||
|   2. Altered source versions must be plainly marked as such, and must not be | ||||
|      misrepresented as being the original software. | ||||
|   3. This notice may not be removed or altered from any source distribution. | ||||
|  | ||||
| ---------------------------------------------------------- | ||||
|  | ||||
							
								
								
									
										131
									
								
								lib/minizip/crypt.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								lib/minizip/crypt.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,131 @@ | ||||
| /* crypt.h -- base code for crypt/uncrypt ZIPfile | ||||
|  | ||||
|  | ||||
|    Version 1.01e, February 12th, 2005 | ||||
|  | ||||
|    Copyright (C) 1998-2005 Gilles Vollant | ||||
|  | ||||
|    This code is a modified version of crypting code in Infozip distribution | ||||
|  | ||||
|    The encryption/decryption parts of this source code (as opposed to the | ||||
|    non-echoing password parts) were originally written in Europe.  The | ||||
|    whole source package can be freely distributed, including from the USA. | ||||
|    (Prior to January 2000, re-export from the US was a violation of US law.) | ||||
|  | ||||
|    This encryption code is a direct transcription of the algorithm from | ||||
|    Roger Schlafly, described by Phil Katz in the file appnote.txt.  This | ||||
|    file (appnote.txt) is distributed with the PKZIP program (even in the | ||||
|    version without encryption capabilities). | ||||
|  | ||||
|    If you don't need crypting in your application, just define symbols | ||||
|    NOCRYPT and NOUNCRYPT. | ||||
|  | ||||
|    This code support the "Traditional PKWARE Encryption". | ||||
|  | ||||
|    The new AES encryption added on Zip format by Winzip (see the page | ||||
|    http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong | ||||
|    Encryption is not supported. | ||||
| */ | ||||
|  | ||||
| #define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) | ||||
|  | ||||
| /*********************************************************************** | ||||
|  * Return the next byte in the pseudo-random sequence | ||||
|  */ | ||||
| static int decrypt_byte(unsigned long* pkeys, const z_crc_t* pcrc_32_tab) | ||||
| { | ||||
|     unsigned temp;  /* POTENTIAL BUG:  temp*(temp^1) may overflow in an | ||||
|                      * unpredictable manner on 16-bit systems; not a problem | ||||
|                      * with any known compiler so far, though */ | ||||
|  | ||||
|     temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; | ||||
|     return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); | ||||
| } | ||||
|  | ||||
| /*********************************************************************** | ||||
|  * Update the encryption keys with the next byte of plain text | ||||
|  */ | ||||
| static int update_keys(unsigned long* pkeys,const z_crc_t* pcrc_32_tab,int c) | ||||
| { | ||||
|     (*(pkeys+0)) = CRC32((*(pkeys+0)), c); | ||||
|     (*(pkeys+1)) += (*(pkeys+0)) & 0xff; | ||||
|     (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; | ||||
|     { | ||||
|       register int keyshift = (int)((*(pkeys+1)) >> 24); | ||||
|       (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); | ||||
|     } | ||||
|     return c; | ||||
| } | ||||
|  | ||||
|  | ||||
| /*********************************************************************** | ||||
|  * Initialize the encryption keys and the random header according to | ||||
|  * the given password. | ||||
|  */ | ||||
| static void init_keys(const char* passwd,unsigned long* pkeys,const z_crc_t* pcrc_32_tab) | ||||
| { | ||||
|     *(pkeys+0) = 305419896L; | ||||
|     *(pkeys+1) = 591751049L; | ||||
|     *(pkeys+2) = 878082192L; | ||||
|     while (*passwd != '\0') { | ||||
|         update_keys(pkeys,pcrc_32_tab,(int)*passwd); | ||||
|         passwd++; | ||||
|     } | ||||
| } | ||||
|  | ||||
| #define zdecode(pkeys,pcrc_32_tab,c) \ | ||||
|     (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) | ||||
|  | ||||
| #define zencode(pkeys,pcrc_32_tab,c,t) \ | ||||
|     (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) | ||||
|  | ||||
| #ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED | ||||
|  | ||||
| #define RAND_HEAD_LEN  12 | ||||
|    /* "last resort" source for second part of crypt seed pattern */ | ||||
| #  ifndef ZCR_SEED2 | ||||
| #    define ZCR_SEED2 3141592654UL     /* use PI as default pattern */ | ||||
| #  endif | ||||
|  | ||||
| static int crypthead(const char* passwd,      /* password string */ | ||||
|                      unsigned char* buf,      /* where to write header */ | ||||
|                      int bufSize, | ||||
|                      unsigned long* pkeys, | ||||
|                      const z_crc_t* pcrc_32_tab, | ||||
|                      unsigned long crcForCrypting) | ||||
| { | ||||
|     int n;                       /* index in random header */ | ||||
|     int t;                       /* temporary */ | ||||
|     int c;                       /* random byte */ | ||||
|     unsigned char header[RAND_HEAD_LEN-2]; /* random header */ | ||||
|     static unsigned calls = 0;   /* ensure different random header each time */ | ||||
|  | ||||
|     if (bufSize<RAND_HEAD_LEN) | ||||
|       return 0; | ||||
|  | ||||
|     /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the | ||||
|      * output of rand() to get less predictability, since rand() is | ||||
|      * often poorly implemented. | ||||
|      */ | ||||
|     if (++calls == 1) | ||||
|     { | ||||
|         srand((unsigned)(time(NULL) ^ ZCR_SEED2)); | ||||
|     } | ||||
|     init_keys(passwd, pkeys, pcrc_32_tab); | ||||
|     for (n = 0; n < RAND_HEAD_LEN-2; n++) | ||||
|     { | ||||
|         c = (rand() >> 7) & 0xff; | ||||
|         header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); | ||||
|     } | ||||
|     /* Encrypt random header (last two bytes is high word of crc) */ | ||||
|     init_keys(passwd, pkeys, pcrc_32_tab); | ||||
|     for (n = 0; n < RAND_HEAD_LEN-2; n++) | ||||
|     { | ||||
|         buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); | ||||
|     } | ||||
|     buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); | ||||
|     buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); | ||||
|     return n; | ||||
| } | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										247
									
								
								lib/minizip/ioapi.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										247
									
								
								lib/minizip/ioapi.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,247 @@ | ||||
| /* ioapi.h -- IO base function header for compress/uncompress .zip | ||||
|    part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Modifications for Zip64 support | ||||
|          Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) | ||||
|  | ||||
|          For more info read MiniZip_info.txt | ||||
|  | ||||
| */ | ||||
|  | ||||
| #if defined(_WIN32) && (!(defined(_CRT_SECURE_NO_WARNINGS))) | ||||
|         #define _CRT_SECURE_NO_WARNINGS | ||||
| #endif | ||||
|  | ||||
| #if defined(__APPLE__) || defined(IOAPI_NO_64) | ||||
| // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions | ||||
| #define FOPEN_FUNC(filename, mode) fopen(filename, mode) | ||||
| #define FTELLO_FUNC(stream) ftello(stream) | ||||
| #define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) | ||||
| #else | ||||
| #define FOPEN_FUNC(filename, mode) fopen64(filename, mode) | ||||
| #define FTELLO_FUNC(stream) ftello64(stream) | ||||
| #define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #include "ioapi.h" | ||||
|  | ||||
| voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode) | ||||
| { | ||||
|     if (pfilefunc->zfile_func64.zopen64_file != NULL) | ||||
|         return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode); | ||||
|     else | ||||
|     { | ||||
|         return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode); | ||||
|     } | ||||
| } | ||||
|  | ||||
| long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin) | ||||
| { | ||||
|     if (pfilefunc->zfile_func64.zseek64_file != NULL) | ||||
|         return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin); | ||||
|     else | ||||
|     { | ||||
|         uLong offsetTruncated = (uLong)offset; | ||||
|         if (offsetTruncated != offset) | ||||
|             return -1; | ||||
|         else | ||||
|             return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin); | ||||
|     } | ||||
| } | ||||
|  | ||||
| ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream) | ||||
| { | ||||
|     if (pfilefunc->zfile_func64.zseek64_file != NULL) | ||||
|         return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream); | ||||
|     else | ||||
|     { | ||||
|         uLong tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream); | ||||
|         if ((tell_uLong) == MAXU32) | ||||
|             return (ZPOS64_T)-1; | ||||
|         else | ||||
|             return tell_uLong; | ||||
|     } | ||||
| } | ||||
|  | ||||
| void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32) | ||||
| { | ||||
|     p_filefunc64_32->zfile_func64.zopen64_file = NULL; | ||||
|     p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file; | ||||
|     p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; | ||||
|     p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file; | ||||
|     p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file; | ||||
|     p_filefunc64_32->zfile_func64.ztell64_file = NULL; | ||||
|     p_filefunc64_32->zfile_func64.zseek64_file = NULL; | ||||
|     p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file; | ||||
|     p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; | ||||
|     p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque; | ||||
|     p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file; | ||||
|     p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| static voidpf  ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode)); | ||||
| static uLong   ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); | ||||
| static uLong   ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size)); | ||||
| static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream)); | ||||
| static long    ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); | ||||
| static int     ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream)); | ||||
| static int     ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream)); | ||||
|  | ||||
| static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode) | ||||
| { | ||||
|     FILE* file = NULL; | ||||
|     const char* mode_fopen = NULL; | ||||
|     if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) | ||||
|         mode_fopen = "rb"; | ||||
|     else | ||||
|     if (mode & ZLIB_FILEFUNC_MODE_EXISTING) | ||||
|         mode_fopen = "r+b"; | ||||
|     else | ||||
|     if (mode & ZLIB_FILEFUNC_MODE_CREATE) | ||||
|         mode_fopen = "wb"; | ||||
|  | ||||
|     if ((filename!=NULL) && (mode_fopen != NULL)) | ||||
|         file = fopen(filename, mode_fopen); | ||||
|     return file; | ||||
| } | ||||
|  | ||||
| static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode) | ||||
| { | ||||
|     FILE* file = NULL; | ||||
|     const char* mode_fopen = NULL; | ||||
|     if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) | ||||
|         mode_fopen = "rb"; | ||||
|     else | ||||
|     if (mode & ZLIB_FILEFUNC_MODE_EXISTING) | ||||
|         mode_fopen = "r+b"; | ||||
|     else | ||||
|     if (mode & ZLIB_FILEFUNC_MODE_CREATE) | ||||
|         mode_fopen = "wb"; | ||||
|  | ||||
|     if ((filename!=NULL) && (mode_fopen != NULL)) | ||||
|         file = FOPEN_FUNC((const char*)filename, mode_fopen); | ||||
|     return file; | ||||
| } | ||||
|  | ||||
|  | ||||
| static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size) | ||||
| { | ||||
|     uLong ret; | ||||
|     ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size) | ||||
| { | ||||
|     uLong ret; | ||||
|     ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream) | ||||
| { | ||||
|     long ret; | ||||
|     ret = ftell((FILE *)stream); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
|  | ||||
| static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream) | ||||
| { | ||||
|     ZPOS64_T ret; | ||||
|     ret = FTELLO_FUNC((FILE *)stream); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| static long ZCALLBACK fseek_file_func (voidpf  opaque, voidpf stream, uLong offset, int origin) | ||||
| { | ||||
|     int fseek_origin=0; | ||||
|     long ret; | ||||
|     switch (origin) | ||||
|     { | ||||
|     case ZLIB_FILEFUNC_SEEK_CUR : | ||||
|         fseek_origin = SEEK_CUR; | ||||
|         break; | ||||
|     case ZLIB_FILEFUNC_SEEK_END : | ||||
|         fseek_origin = SEEK_END; | ||||
|         break; | ||||
|     case ZLIB_FILEFUNC_SEEK_SET : | ||||
|         fseek_origin = SEEK_SET; | ||||
|         break; | ||||
|     default: return -1; | ||||
|     } | ||||
|     ret = 0; | ||||
|     if (fseek((FILE *)stream, offset, fseek_origin) != 0) | ||||
|         ret = -1; | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| static long ZCALLBACK fseek64_file_func (voidpf  opaque, voidpf stream, ZPOS64_T offset, int origin) | ||||
| { | ||||
|     int fseek_origin=0; | ||||
|     long ret; | ||||
|     switch (origin) | ||||
|     { | ||||
|     case ZLIB_FILEFUNC_SEEK_CUR : | ||||
|         fseek_origin = SEEK_CUR; | ||||
|         break; | ||||
|     case ZLIB_FILEFUNC_SEEK_END : | ||||
|         fseek_origin = SEEK_END; | ||||
|         break; | ||||
|     case ZLIB_FILEFUNC_SEEK_SET : | ||||
|         fseek_origin = SEEK_SET; | ||||
|         break; | ||||
|     default: return -1; | ||||
|     } | ||||
|     ret = 0; | ||||
|  | ||||
|     if(FSEEKO_FUNC((FILE *)stream, offset, fseek_origin) != 0) | ||||
|                         ret = -1; | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
|  | ||||
| static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream) | ||||
| { | ||||
|     int ret; | ||||
|     ret = fclose((FILE *)stream); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream) | ||||
| { | ||||
|     int ret; | ||||
|     ret = ferror((FILE *)stream); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| void fill_fopen_filefunc (pzlib_filefunc_def) | ||||
|   zlib_filefunc_def* pzlib_filefunc_def; | ||||
| { | ||||
|     pzlib_filefunc_def->zopen_file = fopen_file_func; | ||||
|     pzlib_filefunc_def->zread_file = fread_file_func; | ||||
|     pzlib_filefunc_def->zwrite_file = fwrite_file_func; | ||||
|     pzlib_filefunc_def->ztell_file = ftell_file_func; | ||||
|     pzlib_filefunc_def->zseek_file = fseek_file_func; | ||||
|     pzlib_filefunc_def->zclose_file = fclose_file_func; | ||||
|     pzlib_filefunc_def->zerror_file = ferror_file_func; | ||||
|     pzlib_filefunc_def->opaque = NULL; | ||||
| } | ||||
|  | ||||
| void fill_fopen64_filefunc (zlib_filefunc64_def*  pzlib_filefunc_def) | ||||
| { | ||||
|     pzlib_filefunc_def->zopen64_file = fopen64_file_func; | ||||
|     pzlib_filefunc_def->zread_file = fread_file_func; | ||||
|     pzlib_filefunc_def->zwrite_file = fwrite_file_func; | ||||
|     pzlib_filefunc_def->ztell64_file = ftell64_file_func; | ||||
|     pzlib_filefunc_def->zseek64_file = fseek64_file_func; | ||||
|     pzlib_filefunc_def->zclose_file = fclose_file_func; | ||||
|     pzlib_filefunc_def->zerror_file = ferror_file_func; | ||||
|     pzlib_filefunc_def->opaque = NULL; | ||||
| } | ||||
							
								
								
									
										208
									
								
								lib/minizip/ioapi.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										208
									
								
								lib/minizip/ioapi.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,208 @@ | ||||
| /* ioapi.h -- IO base function header for compress/uncompress .zip | ||||
|    part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Modifications for Zip64 support | ||||
|          Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) | ||||
|  | ||||
|          For more info read MiniZip_info.txt | ||||
|  | ||||
|          Changes | ||||
|  | ||||
|     Oct-2009 - Defined ZPOS64_T to fpos_t on windows and u_int64_t on linux. (might need to find a better why for this) | ||||
|     Oct-2009 - Change to fseeko64, ftello64 and fopen64 so large files would work on linux. | ||||
|                More if/def section may be needed to support other platforms | ||||
|     Oct-2009 - Defined fxxxx64 calls to normal fopen/ftell/fseek so they would compile on windows. | ||||
|                           (but you should use iowin32.c for windows instead) | ||||
|  | ||||
| */ | ||||
|  | ||||
| #ifndef _ZLIBIOAPI64_H | ||||
| #define _ZLIBIOAPI64_H | ||||
|  | ||||
| #if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) | ||||
|  | ||||
|   // Linux needs this to support file operation on files larger then 4+GB | ||||
|   // But might need better if/def to select just the platforms that needs them. | ||||
|  | ||||
|         #ifndef __USE_FILE_OFFSET64 | ||||
|                 #define __USE_FILE_OFFSET64 | ||||
|         #endif | ||||
|         #ifndef __USE_LARGEFILE64 | ||||
|                 #define __USE_LARGEFILE64 | ||||
|         #endif | ||||
|         #ifndef _LARGEFILE64_SOURCE | ||||
|                 #define _LARGEFILE64_SOURCE | ||||
|         #endif | ||||
|         #ifndef _FILE_OFFSET_BIT | ||||
|                 #define _FILE_OFFSET_BIT 64 | ||||
|         #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include "zlib.h" | ||||
|  | ||||
| #if defined(USE_FILE32API) | ||||
| #define fopen64 fopen | ||||
| #define ftello64 ftell | ||||
| #define fseeko64 fseek | ||||
| #else | ||||
| #ifdef __FreeBSD__ | ||||
| #define fopen64 fopen | ||||
| #define ftello64 ftello | ||||
| #define fseeko64 fseeko | ||||
| #endif | ||||
| #ifdef _MSC_VER | ||||
|  #define fopen64 fopen | ||||
|  #if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC))) | ||||
|   #define ftello64 _ftelli64 | ||||
|   #define fseeko64 _fseeki64 | ||||
|  #else // old MSC | ||||
|   #define ftello64 ftell | ||||
|   #define fseeko64 fseek | ||||
|  #endif | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| /* | ||||
| #ifndef ZPOS64_T | ||||
|   #ifdef _WIN32 | ||||
|                 #define ZPOS64_T fpos_t | ||||
|   #else | ||||
|     #include <stdint.h> | ||||
|     #define ZPOS64_T uint64_t | ||||
|   #endif | ||||
| #endif | ||||
| */ | ||||
|  | ||||
| #ifdef HAVE_MINIZIP64_CONF_H | ||||
| #include "mz64conf.h" | ||||
| #endif | ||||
|  | ||||
| /* a type choosen by DEFINE */ | ||||
| #ifdef HAVE_64BIT_INT_CUSTOM | ||||
| typedef  64BIT_INT_CUSTOM_TYPE ZPOS64_T; | ||||
| #else | ||||
| #ifdef HAS_STDINT_H | ||||
| #include "stdint.h" | ||||
| typedef uint64_t ZPOS64_T; | ||||
| #else | ||||
|  | ||||
| /* Maximum unsigned 32-bit value used as placeholder for zip64 */ | ||||
| #define MAXU32 0xffffffff | ||||
|  | ||||
| #if defined(_MSC_VER) || defined(__BORLANDC__) | ||||
| typedef unsigned __int64 ZPOS64_T; | ||||
| #else | ||||
| typedef unsigned long long int ZPOS64_T; | ||||
| #endif | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #define ZLIB_FILEFUNC_SEEK_CUR (1) | ||||
| #define ZLIB_FILEFUNC_SEEK_END (2) | ||||
| #define ZLIB_FILEFUNC_SEEK_SET (0) | ||||
|  | ||||
| #define ZLIB_FILEFUNC_MODE_READ      (1) | ||||
| #define ZLIB_FILEFUNC_MODE_WRITE     (2) | ||||
| #define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) | ||||
|  | ||||
| #define ZLIB_FILEFUNC_MODE_EXISTING (4) | ||||
| #define ZLIB_FILEFUNC_MODE_CREATE   (8) | ||||
|  | ||||
|  | ||||
| #ifndef ZCALLBACK | ||||
|  #if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) | ||||
|    #define ZCALLBACK CALLBACK | ||||
|  #else | ||||
|    #define ZCALLBACK | ||||
|  #endif | ||||
| #endif | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| typedef voidpf   (ZCALLBACK *open_file_func)      OF((voidpf opaque, const char* filename, int mode)); | ||||
| typedef uLong    (ZCALLBACK *read_file_func)      OF((voidpf opaque, voidpf stream, void* buf, uLong size)); | ||||
| typedef uLong    (ZCALLBACK *write_file_func)     OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); | ||||
| typedef int      (ZCALLBACK *close_file_func)     OF((voidpf opaque, voidpf stream)); | ||||
| typedef int      (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); | ||||
|  | ||||
| typedef long     (ZCALLBACK *tell_file_func)      OF((voidpf opaque, voidpf stream)); | ||||
| typedef long     (ZCALLBACK *seek_file_func)      OF((voidpf opaque, voidpf stream, uLong offset, int origin)); | ||||
|  | ||||
|  | ||||
| /* here is the "old" 32 bits structure structure */ | ||||
| typedef struct zlib_filefunc_def_s | ||||
| { | ||||
|     open_file_func      zopen_file; | ||||
|     read_file_func      zread_file; | ||||
|     write_file_func     zwrite_file; | ||||
|     tell_file_func      ztell_file; | ||||
|     seek_file_func      zseek_file; | ||||
|     close_file_func     zclose_file; | ||||
|     testerror_file_func zerror_file; | ||||
|     voidpf              opaque; | ||||
| } zlib_filefunc_def; | ||||
|  | ||||
| typedef ZPOS64_T (ZCALLBACK *tell64_file_func)    OF((voidpf opaque, voidpf stream)); | ||||
| typedef long     (ZCALLBACK *seek64_file_func)    OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); | ||||
| typedef voidpf   (ZCALLBACK *open64_file_func)    OF((voidpf opaque, const void* filename, int mode)); | ||||
|  | ||||
| typedef struct zlib_filefunc64_def_s | ||||
| { | ||||
|     open64_file_func    zopen64_file; | ||||
|     read_file_func      zread_file; | ||||
|     write_file_func     zwrite_file; | ||||
|     tell64_file_func    ztell64_file; | ||||
|     seek64_file_func    zseek64_file; | ||||
|     close_file_func     zclose_file; | ||||
|     testerror_file_func zerror_file; | ||||
|     voidpf              opaque; | ||||
| } zlib_filefunc64_def; | ||||
|  | ||||
| void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def)); | ||||
| void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); | ||||
|  | ||||
| /* now internal definition, only for zip.c and unzip.h */ | ||||
| typedef struct zlib_filefunc64_32_def_s | ||||
| { | ||||
|     zlib_filefunc64_def zfile_func64; | ||||
|     open_file_func      zopen32_file; | ||||
|     tell_file_func      ztell32_file; | ||||
|     seek_file_func      zseek32_file; | ||||
| } zlib_filefunc64_32_def; | ||||
|  | ||||
|  | ||||
| #define ZREAD64(filefunc,filestream,buf,size)     ((*((filefunc).zfile_func64.zread_file))   ((filefunc).zfile_func64.opaque,filestream,buf,size)) | ||||
| #define ZWRITE64(filefunc,filestream,buf,size)    ((*((filefunc).zfile_func64.zwrite_file))  ((filefunc).zfile_func64.opaque,filestream,buf,size)) | ||||
| //#define ZTELL64(filefunc,filestream)            ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream)) | ||||
| //#define ZSEEK64(filefunc,filestream,pos,mode)   ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode)) | ||||
| #define ZCLOSE64(filefunc,filestream)             ((*((filefunc).zfile_func64.zclose_file))  ((filefunc).zfile_func64.opaque,filestream)) | ||||
| #define ZERROR64(filefunc,filestream)             ((*((filefunc).zfile_func64.zerror_file))  ((filefunc).zfile_func64.opaque,filestream)) | ||||
|  | ||||
| voidpf call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)); | ||||
| long    call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)); | ||||
| ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)); | ||||
|  | ||||
| void    fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32); | ||||
|  | ||||
| #define ZOPEN64(filefunc,filename,mode)         (call_zopen64((&(filefunc)),(filename),(mode))) | ||||
| #define ZTELL64(filefunc,filestream)            (call_ztell64((&(filefunc)),(filestream))) | ||||
| #define ZSEEK64(filefunc,filestream,pos,mode)   (call_zseek64((&(filefunc)),(filestream),(pos),(mode))) | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										461
									
								
								lib/minizip/iowin32.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										461
									
								
								lib/minizip/iowin32.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,461 @@ | ||||
| /* iowin32.c -- IO base function header for compress/uncompress .zip | ||||
|      Version 1.1, February 14h, 2010 | ||||
|      part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Modifications for Zip64 support | ||||
|          Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) | ||||
|  | ||||
|      For more info read MiniZip_info.txt | ||||
|  | ||||
| */ | ||||
|  | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #include "zlib.h" | ||||
| #include "ioapi.h" | ||||
| #include "iowin32.h" | ||||
|  | ||||
| #ifndef INVALID_HANDLE_VALUE | ||||
| #define INVALID_HANDLE_VALUE (0xFFFFFFFF) | ||||
| #endif | ||||
|  | ||||
| #ifndef INVALID_SET_FILE_POINTER | ||||
| #define INVALID_SET_FILE_POINTER ((DWORD)-1) | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API))) | ||||
| #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) | ||||
| #define IOWIN32_USING_WINRT_API 1 | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| voidpf  ZCALLBACK win32_open_file_func  OF((voidpf opaque, const char* filename, int mode)); | ||||
| uLong   ZCALLBACK win32_read_file_func  OF((voidpf opaque, voidpf stream, void* buf, uLong size)); | ||||
| uLong   ZCALLBACK win32_write_file_func OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); | ||||
| ZPOS64_T ZCALLBACK win32_tell64_file_func  OF((voidpf opaque, voidpf stream)); | ||||
| long    ZCALLBACK win32_seek64_file_func  OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); | ||||
| int     ZCALLBACK win32_close_file_func OF((voidpf opaque, voidpf stream)); | ||||
| int     ZCALLBACK win32_error_file_func OF((voidpf opaque, voidpf stream)); | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|     HANDLE hf; | ||||
|     int error; | ||||
| } WIN32FILE_IOWIN; | ||||
|  | ||||
|  | ||||
| static void win32_translate_open_mode(int mode, | ||||
|                                       DWORD* lpdwDesiredAccess, | ||||
|                                       DWORD* lpdwCreationDisposition, | ||||
|                                       DWORD* lpdwShareMode, | ||||
|                                       DWORD* lpdwFlagsAndAttributes) | ||||
| { | ||||
|     *lpdwDesiredAccess = *lpdwShareMode = *lpdwFlagsAndAttributes = *lpdwCreationDisposition = 0; | ||||
|  | ||||
|     if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) | ||||
|     { | ||||
|         *lpdwDesiredAccess = GENERIC_READ; | ||||
|         *lpdwCreationDisposition = OPEN_EXISTING; | ||||
|         *lpdwShareMode = FILE_SHARE_READ; | ||||
|     } | ||||
|     else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) | ||||
|     { | ||||
|         *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ; | ||||
|         *lpdwCreationDisposition = OPEN_EXISTING; | ||||
|     } | ||||
|     else if (mode & ZLIB_FILEFUNC_MODE_CREATE) | ||||
|     { | ||||
|         *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ; | ||||
|         *lpdwCreationDisposition = CREATE_ALWAYS; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static voidpf win32_build_iowin(HANDLE hFile) | ||||
| { | ||||
|     voidpf ret=NULL; | ||||
|  | ||||
|     if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE)) | ||||
|     { | ||||
|         WIN32FILE_IOWIN w32fiow; | ||||
|         w32fiow.hf = hFile; | ||||
|         w32fiow.error = 0; | ||||
|         ret = malloc(sizeof(WIN32FILE_IOWIN)); | ||||
|  | ||||
|         if (ret==NULL) | ||||
|             CloseHandle(hFile); | ||||
|         else | ||||
|             *((WIN32FILE_IOWIN*)ret) = w32fiow; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| voidpf ZCALLBACK win32_open64_file_func (voidpf opaque,const void* filename,int mode) | ||||
| { | ||||
|     const char* mode_fopen = NULL; | ||||
|     DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; | ||||
|     HANDLE hFile = NULL; | ||||
|  | ||||
|     win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); | ||||
|  | ||||
| #ifdef IOWIN32_USING_WINRT_API | ||||
| #ifdef UNICODE | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|         hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); | ||||
| #else | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|     { | ||||
|         WCHAR filenameW[FILENAME_MAX + 0x200 + 1]; | ||||
|         MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200); | ||||
|         hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); | ||||
|     } | ||||
| #endif | ||||
| #else | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|         hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); | ||||
| #endif | ||||
|  | ||||
|     return win32_build_iowin(hFile); | ||||
| } | ||||
|  | ||||
|  | ||||
| voidpf ZCALLBACK win32_open64_file_funcA (voidpf opaque,const void* filename,int mode) | ||||
| { | ||||
|     const char* mode_fopen = NULL; | ||||
|     DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; | ||||
|     HANDLE hFile = NULL; | ||||
|  | ||||
|     win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); | ||||
|  | ||||
| #ifdef IOWIN32_USING_WINRT_API | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|     { | ||||
|         WCHAR filenameW[FILENAME_MAX + 0x200 + 1]; | ||||
|         MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200); | ||||
|         hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); | ||||
|     } | ||||
| #else | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|         hFile = CreateFileA((LPCSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); | ||||
| #endif | ||||
|  | ||||
|     return win32_build_iowin(hFile); | ||||
| } | ||||
|  | ||||
|  | ||||
| voidpf ZCALLBACK win32_open64_file_funcW (voidpf opaque,const void* filename,int mode) | ||||
| { | ||||
|     const char* mode_fopen = NULL; | ||||
|     DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; | ||||
|     HANDLE hFile = NULL; | ||||
|  | ||||
|     win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); | ||||
|  | ||||
| #ifdef IOWIN32_USING_WINRT_API | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|         hFile = CreateFile2((LPCWSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition,NULL); | ||||
| #else | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|         hFile = CreateFileW((LPCWSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); | ||||
| #endif | ||||
|  | ||||
|     return win32_build_iowin(hFile); | ||||
| } | ||||
|  | ||||
|  | ||||
| voidpf ZCALLBACK win32_open_file_func (voidpf opaque,const char* filename,int mode) | ||||
| { | ||||
|     const char* mode_fopen = NULL; | ||||
|     DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; | ||||
|     HANDLE hFile = NULL; | ||||
|  | ||||
|     win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); | ||||
|  | ||||
| #ifdef IOWIN32_USING_WINRT_API | ||||
| #ifdef UNICODE | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|         hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); | ||||
| #else | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|     { | ||||
|         WCHAR filenameW[FILENAME_MAX + 0x200 + 1]; | ||||
|         MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200); | ||||
|         hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); | ||||
|     } | ||||
| #endif | ||||
| #else | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|         hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); | ||||
| #endif | ||||
|  | ||||
|     return win32_build_iowin(hFile); | ||||
| } | ||||
|  | ||||
|  | ||||
| uLong ZCALLBACK win32_read_file_func (voidpf opaque, voidpf stream, void* buf,uLong size) | ||||
| { | ||||
|     uLong ret=0; | ||||
|     HANDLE hFile = NULL; | ||||
|     if (stream!=NULL) | ||||
|         hFile = ((WIN32FILE_IOWIN*)stream) -> hf; | ||||
|  | ||||
|     if (hFile != NULL) | ||||
|     { | ||||
|         if (!ReadFile(hFile, buf, size, &ret, NULL)) | ||||
|         { | ||||
|             DWORD dwErr = GetLastError(); | ||||
|             if (dwErr == ERROR_HANDLE_EOF) | ||||
|                 dwErr = 0; | ||||
|             ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
|  | ||||
| uLong ZCALLBACK win32_write_file_func (voidpf opaque,voidpf stream,const void* buf,uLong size) | ||||
| { | ||||
|     uLong ret=0; | ||||
|     HANDLE hFile = NULL; | ||||
|     if (stream!=NULL) | ||||
|         hFile = ((WIN32FILE_IOWIN*)stream) -> hf; | ||||
|  | ||||
|     if (hFile != NULL) | ||||
|     { | ||||
|         if (!WriteFile(hFile, buf, size, &ret, NULL)) | ||||
|         { | ||||
|             DWORD dwErr = GetLastError(); | ||||
|             if (dwErr == ERROR_HANDLE_EOF) | ||||
|                 dwErr = 0; | ||||
|             ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| static BOOL MySetFilePointerEx(HANDLE hFile, LARGE_INTEGER pos, LARGE_INTEGER *newPos,  DWORD dwMoveMethod) | ||||
| { | ||||
| #ifdef IOWIN32_USING_WINRT_API | ||||
|     return SetFilePointerEx(hFile, pos, newPos, dwMoveMethod); | ||||
| #else | ||||
|     LONG lHigh = pos.HighPart; | ||||
|     DWORD dwNewPos = SetFilePointer(hFile, pos.LowPart, &lHigh, FILE_CURRENT); | ||||
|     BOOL fOk = TRUE; | ||||
|     if (dwNewPos == 0xFFFFFFFF) | ||||
|         if (GetLastError() != NO_ERROR) | ||||
|             fOk = FALSE; | ||||
|     if ((newPos != NULL) && (fOk)) | ||||
|     { | ||||
|         newPos->LowPart = dwNewPos; | ||||
|         newPos->HighPart = lHigh; | ||||
|     } | ||||
|     return fOk; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| long ZCALLBACK win32_tell_file_func (voidpf opaque,voidpf stream) | ||||
| { | ||||
|     long ret=-1; | ||||
|     HANDLE hFile = NULL; | ||||
|     if (stream!=NULL) | ||||
|         hFile = ((WIN32FILE_IOWIN*)stream) -> hf; | ||||
|     if (hFile != NULL) | ||||
|     { | ||||
|         LARGE_INTEGER pos; | ||||
|         pos.QuadPart = 0; | ||||
|  | ||||
|         if (!MySetFilePointerEx(hFile, pos, &pos, FILE_CURRENT)) | ||||
|         { | ||||
|             DWORD dwErr = GetLastError(); | ||||
|             ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; | ||||
|             ret = -1; | ||||
|         } | ||||
|         else | ||||
|             ret=(long)pos.LowPart; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| ZPOS64_T ZCALLBACK win32_tell64_file_func (voidpf opaque, voidpf stream) | ||||
| { | ||||
|     ZPOS64_T ret= (ZPOS64_T)-1; | ||||
|     HANDLE hFile = NULL; | ||||
|     if (stream!=NULL) | ||||
|         hFile = ((WIN32FILE_IOWIN*)stream)->hf; | ||||
|  | ||||
|     if (hFile) | ||||
|     { | ||||
|         LARGE_INTEGER pos; | ||||
|         pos.QuadPart = 0; | ||||
|  | ||||
|         if (!MySetFilePointerEx(hFile, pos, &pos, FILE_CURRENT)) | ||||
|         { | ||||
|             DWORD dwErr = GetLastError(); | ||||
|             ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; | ||||
|             ret = (ZPOS64_T)-1; | ||||
|         } | ||||
|         else | ||||
|             ret=pos.QuadPart; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
|  | ||||
| long ZCALLBACK win32_seek_file_func (voidpf opaque,voidpf stream,uLong offset,int origin) | ||||
| { | ||||
|     DWORD dwMoveMethod=0xFFFFFFFF; | ||||
|     HANDLE hFile = NULL; | ||||
|  | ||||
|     long ret=-1; | ||||
|     if (stream!=NULL) | ||||
|         hFile = ((WIN32FILE_IOWIN*)stream) -> hf; | ||||
|     switch (origin) | ||||
|     { | ||||
|     case ZLIB_FILEFUNC_SEEK_CUR : | ||||
|         dwMoveMethod = FILE_CURRENT; | ||||
|         break; | ||||
|     case ZLIB_FILEFUNC_SEEK_END : | ||||
|         dwMoveMethod = FILE_END; | ||||
|         break; | ||||
|     case ZLIB_FILEFUNC_SEEK_SET : | ||||
|         dwMoveMethod = FILE_BEGIN; | ||||
|         break; | ||||
|     default: return -1; | ||||
|     } | ||||
|  | ||||
|     if (hFile != NULL) | ||||
|     { | ||||
|         LARGE_INTEGER pos; | ||||
|         pos.QuadPart = offset; | ||||
|         if (!MySetFilePointerEx(hFile, pos, NULL, dwMoveMethod)) | ||||
|         { | ||||
|             DWORD dwErr = GetLastError(); | ||||
|             ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; | ||||
|             ret = -1; | ||||
|         } | ||||
|         else | ||||
|             ret=0; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| long ZCALLBACK win32_seek64_file_func (voidpf opaque, voidpf stream,ZPOS64_T offset,int origin) | ||||
| { | ||||
|     DWORD dwMoveMethod=0xFFFFFFFF; | ||||
|     HANDLE hFile = NULL; | ||||
|     long ret=-1; | ||||
|  | ||||
|     if (stream!=NULL) | ||||
|         hFile = ((WIN32FILE_IOWIN*)stream)->hf; | ||||
|  | ||||
|     switch (origin) | ||||
|     { | ||||
|         case ZLIB_FILEFUNC_SEEK_CUR : | ||||
|             dwMoveMethod = FILE_CURRENT; | ||||
|             break; | ||||
|         case ZLIB_FILEFUNC_SEEK_END : | ||||
|             dwMoveMethod = FILE_END; | ||||
|             break; | ||||
|         case ZLIB_FILEFUNC_SEEK_SET : | ||||
|             dwMoveMethod = FILE_BEGIN; | ||||
|             break; | ||||
|         default: return -1; | ||||
|     } | ||||
|  | ||||
|     if (hFile) | ||||
|     { | ||||
|         LARGE_INTEGER pos; | ||||
|         pos.QuadPart = offset; | ||||
|         if (!MySetFilePointerEx(hFile, pos, NULL, FILE_CURRENT)) | ||||
|         { | ||||
|             DWORD dwErr = GetLastError(); | ||||
|             ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; | ||||
|             ret = -1; | ||||
|         } | ||||
|         else | ||||
|             ret=0; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int ZCALLBACK win32_close_file_func (voidpf opaque, voidpf stream) | ||||
| { | ||||
|     int ret=-1; | ||||
|  | ||||
|     if (stream!=NULL) | ||||
|     { | ||||
|         HANDLE hFile; | ||||
|         hFile = ((WIN32FILE_IOWIN*)stream) -> hf; | ||||
|         if (hFile != NULL) | ||||
|         { | ||||
|             CloseHandle(hFile); | ||||
|             ret=0; | ||||
|         } | ||||
|         free(stream); | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int ZCALLBACK win32_error_file_func (voidpf opaque,voidpf stream) | ||||
| { | ||||
|     int ret=-1; | ||||
|     if (stream!=NULL) | ||||
|     { | ||||
|         ret = ((WIN32FILE_IOWIN*)stream) -> error; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| void fill_win32_filefunc (zlib_filefunc_def* pzlib_filefunc_def) | ||||
| { | ||||
|     pzlib_filefunc_def->zopen_file = win32_open_file_func; | ||||
|     pzlib_filefunc_def->zread_file = win32_read_file_func; | ||||
|     pzlib_filefunc_def->zwrite_file = win32_write_file_func; | ||||
|     pzlib_filefunc_def->ztell_file = win32_tell_file_func; | ||||
|     pzlib_filefunc_def->zseek_file = win32_seek_file_func; | ||||
|     pzlib_filefunc_def->zclose_file = win32_close_file_func; | ||||
|     pzlib_filefunc_def->zerror_file = win32_error_file_func; | ||||
|     pzlib_filefunc_def->opaque = NULL; | ||||
| } | ||||
|  | ||||
| void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def) | ||||
| { | ||||
|     pzlib_filefunc_def->zopen64_file = win32_open64_file_func; | ||||
|     pzlib_filefunc_def->zread_file = win32_read_file_func; | ||||
|     pzlib_filefunc_def->zwrite_file = win32_write_file_func; | ||||
|     pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; | ||||
|     pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; | ||||
|     pzlib_filefunc_def->zclose_file = win32_close_file_func; | ||||
|     pzlib_filefunc_def->zerror_file = win32_error_file_func; | ||||
|     pzlib_filefunc_def->opaque = NULL; | ||||
| } | ||||
|  | ||||
|  | ||||
| void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def) | ||||
| { | ||||
|     pzlib_filefunc_def->zopen64_file = win32_open64_file_funcA; | ||||
|     pzlib_filefunc_def->zread_file = win32_read_file_func; | ||||
|     pzlib_filefunc_def->zwrite_file = win32_write_file_func; | ||||
|     pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; | ||||
|     pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; | ||||
|     pzlib_filefunc_def->zclose_file = win32_close_file_func; | ||||
|     pzlib_filefunc_def->zerror_file = win32_error_file_func; | ||||
|     pzlib_filefunc_def->opaque = NULL; | ||||
| } | ||||
|  | ||||
|  | ||||
| void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def) | ||||
| { | ||||
|     pzlib_filefunc_def->zopen64_file = win32_open64_file_funcW; | ||||
|     pzlib_filefunc_def->zread_file = win32_read_file_func; | ||||
|     pzlib_filefunc_def->zwrite_file = win32_write_file_func; | ||||
|     pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; | ||||
|     pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; | ||||
|     pzlib_filefunc_def->zclose_file = win32_close_file_func; | ||||
|     pzlib_filefunc_def->zerror_file = win32_error_file_func; | ||||
|     pzlib_filefunc_def->opaque = NULL; | ||||
| } | ||||
							
								
								
									
										28
									
								
								lib/minizip/iowin32.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								lib/minizip/iowin32.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| /* iowin32.h -- IO base function header for compress/uncompress .zip | ||||
|      Version 1.1, February 14h, 2010 | ||||
|      part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Modifications for Zip64 support | ||||
|          Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) | ||||
|  | ||||
|          For more info read MiniZip_info.txt | ||||
|  | ||||
| */ | ||||
|  | ||||
| #include <windows.h> | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); | ||||
| void fill_win32_filefunc64 OF((zlib_filefunc64_def* pzlib_filefunc_def)); | ||||
| void fill_win32_filefunc64A OF((zlib_filefunc64_def* pzlib_filefunc_def)); | ||||
| void fill_win32_filefunc64W OF((zlib_filefunc64_def* pzlib_filefunc_def)); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										660
									
								
								lib/minizip/miniunz.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										660
									
								
								lib/minizip/miniunz.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,660 @@ | ||||
| /* | ||||
|    miniunz.c | ||||
|    Version 1.1, February 14h, 2010 | ||||
|    sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Modifications of Unzip for Zip64 | ||||
|          Copyright (C) 2007-2008 Even Rouault | ||||
|  | ||||
|          Modifications for Zip64 support on both zip and unzip | ||||
|          Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) | ||||
| */ | ||||
|  | ||||
| #if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) | ||||
|         #ifndef __USE_FILE_OFFSET64 | ||||
|                 #define __USE_FILE_OFFSET64 | ||||
|         #endif | ||||
|         #ifndef __USE_LARGEFILE64 | ||||
|                 #define __USE_LARGEFILE64 | ||||
|         #endif | ||||
|         #ifndef _LARGEFILE64_SOURCE | ||||
|                 #define _LARGEFILE64_SOURCE | ||||
|         #endif | ||||
|         #ifndef _FILE_OFFSET_BIT | ||||
|                 #define _FILE_OFFSET_BIT 64 | ||||
|         #endif | ||||
| #endif | ||||
|  | ||||
| #ifdef __APPLE__ | ||||
| // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions | ||||
| #define FOPEN_FUNC(filename, mode) fopen(filename, mode) | ||||
| #define FTELLO_FUNC(stream) ftello(stream) | ||||
| #define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) | ||||
| #else | ||||
| #define FOPEN_FUNC(filename, mode) fopen64(filename, mode) | ||||
| #define FTELLO_FUNC(stream) ftello64(stream) | ||||
| #define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <time.h> | ||||
| #include <errno.h> | ||||
| #include <fcntl.h> | ||||
|  | ||||
| #ifdef _WIN32 | ||||
| # include <direct.h> | ||||
| # include <io.h> | ||||
| #else | ||||
| # include <unistd.h> | ||||
| # include <utime.h> | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #include "unzip.h" | ||||
|  | ||||
| #define CASESENSITIVITY (0) | ||||
| #define WRITEBUFFERSIZE (8192) | ||||
| #define MAXFILENAME (256) | ||||
|  | ||||
| #ifdef _WIN32 | ||||
| #define USEWIN32IOAPI | ||||
| #include "iowin32.h" | ||||
| #endif | ||||
| /* | ||||
|   mini unzip, demo of unzip package | ||||
|  | ||||
|   usage : | ||||
|   Usage : miniunz [-exvlo] file.zip [file_to_extract] [-d extractdir] | ||||
|  | ||||
|   list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT | ||||
|     if it exists | ||||
| */ | ||||
|  | ||||
|  | ||||
| /* change_file_date : change the date/time of a file | ||||
|     filename : the filename of the file where date/time must be modified | ||||
|     dosdate : the new date at the MSDos format (4 bytes) | ||||
|     tmu_date : the SAME new date at the tm_unz format */ | ||||
| void change_file_date(filename,dosdate,tmu_date) | ||||
|     const char *filename; | ||||
|     uLong dosdate; | ||||
|     tm_unz tmu_date; | ||||
| { | ||||
| #ifdef _WIN32 | ||||
|   HANDLE hFile; | ||||
|   FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite; | ||||
|  | ||||
|   hFile = CreateFileA(filename,GENERIC_READ | GENERIC_WRITE, | ||||
|                       0,NULL,OPEN_EXISTING,0,NULL); | ||||
|   GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite); | ||||
|   DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal); | ||||
|   LocalFileTimeToFileTime(&ftLocal,&ftm); | ||||
|   SetFileTime(hFile,&ftm,&ftLastAcc,&ftm); | ||||
|   CloseHandle(hFile); | ||||
| #else | ||||
| #ifdef unix || __APPLE__ | ||||
|   struct utimbuf ut; | ||||
|   struct tm newdate; | ||||
|   newdate.tm_sec = tmu_date.tm_sec; | ||||
|   newdate.tm_min=tmu_date.tm_min; | ||||
|   newdate.tm_hour=tmu_date.tm_hour; | ||||
|   newdate.tm_mday=tmu_date.tm_mday; | ||||
|   newdate.tm_mon=tmu_date.tm_mon; | ||||
|   if (tmu_date.tm_year > 1900) | ||||
|       newdate.tm_year=tmu_date.tm_year - 1900; | ||||
|   else | ||||
|       newdate.tm_year=tmu_date.tm_year ; | ||||
|   newdate.tm_isdst=-1; | ||||
|  | ||||
|   ut.actime=ut.modtime=mktime(&newdate); | ||||
|   utime(filename,&ut); | ||||
| #endif | ||||
| #endif | ||||
| } | ||||
|  | ||||
|  | ||||
| /* mymkdir and change_file_date are not 100 % portable | ||||
|    As I don't know well Unix, I wait feedback for the unix portion */ | ||||
|  | ||||
| int mymkdir(dirname) | ||||
|     const char* dirname; | ||||
| { | ||||
|     int ret=0; | ||||
| #ifdef _WIN32 | ||||
|     ret = _mkdir(dirname); | ||||
| #elif unix | ||||
|     ret = mkdir (dirname,0775); | ||||
| #elif __APPLE__ | ||||
|     ret = mkdir (dirname,0775); | ||||
| #endif | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int makedir (newdir) | ||||
|     char *newdir; | ||||
| { | ||||
|   char *buffer ; | ||||
|   char *p; | ||||
|   int  len = (int)strlen(newdir); | ||||
|  | ||||
|   if (len <= 0) | ||||
|     return 0; | ||||
|  | ||||
|   buffer = (char*)malloc(len+1); | ||||
|         if (buffer==NULL) | ||||
|         { | ||||
|                 printf("Error allocating memory\n"); | ||||
|                 return UNZ_INTERNALERROR; | ||||
|         } | ||||
|   strcpy(buffer,newdir); | ||||
|  | ||||
|   if (buffer[len-1] == '/') { | ||||
|     buffer[len-1] = '\0'; | ||||
|   } | ||||
|   if (mymkdir(buffer) == 0) | ||||
|     { | ||||
|       free(buffer); | ||||
|       return 1; | ||||
|     } | ||||
|  | ||||
|   p = buffer+1; | ||||
|   while (1) | ||||
|     { | ||||
|       char hold; | ||||
|  | ||||
|       while(*p && *p != '\\' && *p != '/') | ||||
|         p++; | ||||
|       hold = *p; | ||||
|       *p = 0; | ||||
|       if ((mymkdir(buffer) == -1) && (errno == ENOENT)) | ||||
|         { | ||||
|           printf("couldn't create directory %s\n",buffer); | ||||
|           free(buffer); | ||||
|           return 0; | ||||
|         } | ||||
|       if (hold == 0) | ||||
|         break; | ||||
|       *p++ = hold; | ||||
|     } | ||||
|   free(buffer); | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
| void do_banner() | ||||
| { | ||||
|     printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n"); | ||||
|     printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); | ||||
| } | ||||
|  | ||||
| void do_help() | ||||
| { | ||||
|     printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \ | ||||
|            "  -e  Extract without pathname (junk paths)\n" \ | ||||
|            "  -x  Extract with pathname\n" \ | ||||
|            "  -v  list files\n" \ | ||||
|            "  -l  list files\n" \ | ||||
|            "  -d  directory to extract into\n" \ | ||||
|            "  -o  overwrite files without prompting\n" \ | ||||
|            "  -p  extract crypted file using password\n\n"); | ||||
| } | ||||
|  | ||||
| void Display64BitsSize(ZPOS64_T n, int size_char) | ||||
| { | ||||
|   /* to avoid compatibility problem , we do here the conversion */ | ||||
|   char number[21]; | ||||
|   int offset=19; | ||||
|   int pos_string = 19; | ||||
|   number[20]=0; | ||||
|   for (;;) { | ||||
|       number[offset]=(char)((n%10)+'0'); | ||||
|       if (number[offset] != '0') | ||||
|           pos_string=offset; | ||||
|       n/=10; | ||||
|       if (offset==0) | ||||
|           break; | ||||
|       offset--; | ||||
|   } | ||||
|   { | ||||
|       int size_display_string = 19-pos_string; | ||||
|       while (size_char > size_display_string) | ||||
|       { | ||||
|           size_char--; | ||||
|           printf(" "); | ||||
|       } | ||||
|   } | ||||
|  | ||||
|   printf("%s",&number[pos_string]); | ||||
| } | ||||
|  | ||||
| int do_list(uf) | ||||
|     unzFile uf; | ||||
| { | ||||
|     uLong i; | ||||
|     unz_global_info64 gi; | ||||
|     int err; | ||||
|  | ||||
|     err = unzGetGlobalInfo64(uf,&gi); | ||||
|     if (err!=UNZ_OK) | ||||
|         printf("error %d with zipfile in unzGetGlobalInfo \n",err); | ||||
|     printf("  Length  Method     Size Ratio   Date    Time   CRC-32     Name\n"); | ||||
|     printf("  ------  ------     ---- -----   ----    ----   ------     ----\n"); | ||||
|     for (i=0;i<gi.number_entry;i++) | ||||
|     { | ||||
|         char filename_inzip[256]; | ||||
|         unz_file_info64 file_info; | ||||
|         uLong ratio=0; | ||||
|         const char *string_method; | ||||
|         char charCrypt=' '; | ||||
|         err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); | ||||
|         if (err!=UNZ_OK) | ||||
|         { | ||||
|             printf("error %d with zipfile in unzGetCurrentFileInfo\n",err); | ||||
|             break; | ||||
|         } | ||||
|         if (file_info.uncompressed_size>0) | ||||
|             ratio = (uLong)((file_info.compressed_size*100)/file_info.uncompressed_size); | ||||
|  | ||||
|         /* display a '*' if the file is crypted */ | ||||
|         if ((file_info.flag & 1) != 0) | ||||
|             charCrypt='*'; | ||||
|  | ||||
|         if (file_info.compression_method==0) | ||||
|             string_method="Stored"; | ||||
|         else | ||||
|         if (file_info.compression_method==Z_DEFLATED) | ||||
|         { | ||||
|             uInt iLevel=(uInt)((file_info.flag & 0x6)/2); | ||||
|             if (iLevel==0) | ||||
|               string_method="Defl:N"; | ||||
|             else if (iLevel==1) | ||||
|               string_method="Defl:X"; | ||||
|             else if ((iLevel==2) || (iLevel==3)) | ||||
|               string_method="Defl:F"; /* 2:fast , 3 : extra fast*/ | ||||
|         } | ||||
|         else | ||||
|         if (file_info.compression_method==Z_BZIP2ED) | ||||
|         { | ||||
|               string_method="BZip2 "; | ||||
|         } | ||||
|         else | ||||
|             string_method="Unkn. "; | ||||
|  | ||||
|         Display64BitsSize(file_info.uncompressed_size,7); | ||||
|         printf("  %6s%c",string_method,charCrypt); | ||||
|         Display64BitsSize(file_info.compressed_size,7); | ||||
|         printf(" %3lu%%  %2.2lu-%2.2lu-%2.2lu  %2.2lu:%2.2lu  %8.8lx   %s\n", | ||||
|                 ratio, | ||||
|                 (uLong)file_info.tmu_date.tm_mon + 1, | ||||
|                 (uLong)file_info.tmu_date.tm_mday, | ||||
|                 (uLong)file_info.tmu_date.tm_year % 100, | ||||
|                 (uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min, | ||||
|                 (uLong)file_info.crc,filename_inzip); | ||||
|         if ((i+1)<gi.number_entry) | ||||
|         { | ||||
|             err = unzGoToNextFile(uf); | ||||
|             if (err!=UNZ_OK) | ||||
|             { | ||||
|                 printf("error %d with zipfile in unzGoToNextFile\n",err); | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) | ||||
|     unzFile uf; | ||||
|     const int* popt_extract_without_path; | ||||
|     int* popt_overwrite; | ||||
|     const char* password; | ||||
| { | ||||
|     char filename_inzip[256]; | ||||
|     char* filename_withoutpath; | ||||
|     char* p; | ||||
|     int err=UNZ_OK; | ||||
|     FILE *fout=NULL; | ||||
|     void* buf; | ||||
|     uInt size_buf; | ||||
|  | ||||
|     unz_file_info64 file_info; | ||||
|     uLong ratio=0; | ||||
|     err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); | ||||
|  | ||||
|     if (err!=UNZ_OK) | ||||
|     { | ||||
|         printf("error %d with zipfile in unzGetCurrentFileInfo\n",err); | ||||
|         return err; | ||||
|     } | ||||
|  | ||||
|     size_buf = WRITEBUFFERSIZE; | ||||
|     buf = (void*)malloc(size_buf); | ||||
|     if (buf==NULL) | ||||
|     { | ||||
|         printf("Error allocating memory\n"); | ||||
|         return UNZ_INTERNALERROR; | ||||
|     } | ||||
|  | ||||
|     p = filename_withoutpath = filename_inzip; | ||||
|     while ((*p) != '\0') | ||||
|     { | ||||
|         if (((*p)=='/') || ((*p)=='\\')) | ||||
|             filename_withoutpath = p+1; | ||||
|         p++; | ||||
|     } | ||||
|  | ||||
|     if ((*filename_withoutpath)=='\0') | ||||
|     { | ||||
|         if ((*popt_extract_without_path)==0) | ||||
|         { | ||||
|             printf("creating directory: %s\n",filename_inzip); | ||||
|             mymkdir(filename_inzip); | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         const char* write_filename; | ||||
|         int skip=0; | ||||
|  | ||||
|         if ((*popt_extract_without_path)==0) | ||||
|             write_filename = filename_inzip; | ||||
|         else | ||||
|             write_filename = filename_withoutpath; | ||||
|  | ||||
|         err = unzOpenCurrentFilePassword(uf,password); | ||||
|         if (err!=UNZ_OK) | ||||
|         { | ||||
|             printf("error %d with zipfile in unzOpenCurrentFilePassword\n",err); | ||||
|         } | ||||
|  | ||||
|         if (((*popt_overwrite)==0) && (err==UNZ_OK)) | ||||
|         { | ||||
|             char rep=0; | ||||
|             FILE* ftestexist; | ||||
|             ftestexist = FOPEN_FUNC(write_filename,"rb"); | ||||
|             if (ftestexist!=NULL) | ||||
|             { | ||||
|                 fclose(ftestexist); | ||||
|                 do | ||||
|                 { | ||||
|                     char answer[128]; | ||||
|                     int ret; | ||||
|  | ||||
|                     printf("The file %s exists. Overwrite ? [y]es, [n]o, [A]ll: ",write_filename); | ||||
|                     ret = scanf("%1s",answer); | ||||
|                     if (ret != 1) | ||||
|                     { | ||||
|                        exit(EXIT_FAILURE); | ||||
|                     } | ||||
|                     rep = answer[0] ; | ||||
|                     if ((rep>='a') && (rep<='z')) | ||||
|                         rep -= 0x20; | ||||
|                 } | ||||
|                 while ((rep!='Y') && (rep!='N') && (rep!='A')); | ||||
|             } | ||||
|  | ||||
|             if (rep == 'N') | ||||
|                 skip = 1; | ||||
|  | ||||
|             if (rep == 'A') | ||||
|                 *popt_overwrite=1; | ||||
|         } | ||||
|  | ||||
|         if ((skip==0) && (err==UNZ_OK)) | ||||
|         { | ||||
|             fout=FOPEN_FUNC(write_filename,"wb"); | ||||
|             /* some zipfile don't contain directory alone before file */ | ||||
|             if ((fout==NULL) && ((*popt_extract_without_path)==0) && | ||||
|                                 (filename_withoutpath!=(char*)filename_inzip)) | ||||
|             { | ||||
|                 char c=*(filename_withoutpath-1); | ||||
|                 *(filename_withoutpath-1)='\0'; | ||||
|                 makedir(write_filename); | ||||
|                 *(filename_withoutpath-1)=c; | ||||
|                 fout=FOPEN_FUNC(write_filename,"wb"); | ||||
|             } | ||||
|  | ||||
|             if (fout==NULL) | ||||
|             { | ||||
|                 printf("error opening %s\n",write_filename); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (fout!=NULL) | ||||
|         { | ||||
|             printf(" extracting: %s\n",write_filename); | ||||
|  | ||||
|             do | ||||
|             { | ||||
|                 err = unzReadCurrentFile(uf,buf,size_buf); | ||||
|                 if (err<0) | ||||
|                 { | ||||
|                     printf("error %d with zipfile in unzReadCurrentFile\n",err); | ||||
|                     break; | ||||
|                 } | ||||
|                 if (err>0) | ||||
|                     if (fwrite(buf,err,1,fout)!=1) | ||||
|                     { | ||||
|                         printf("error in writing extracted file\n"); | ||||
|                         err=UNZ_ERRNO; | ||||
|                         break; | ||||
|                     } | ||||
|             } | ||||
|             while (err>0); | ||||
|             if (fout) | ||||
|                     fclose(fout); | ||||
|  | ||||
|             if (err==0) | ||||
|                 change_file_date(write_filename,file_info.dosDate, | ||||
|                                  file_info.tmu_date); | ||||
|         } | ||||
|  | ||||
|         if (err==UNZ_OK) | ||||
|         { | ||||
|             err = unzCloseCurrentFile (uf); | ||||
|             if (err!=UNZ_OK) | ||||
|             { | ||||
|                 printf("error %d with zipfile in unzCloseCurrentFile\n",err); | ||||
|             } | ||||
|         } | ||||
|         else | ||||
|             unzCloseCurrentFile(uf); /* don't lose the error */ | ||||
|     } | ||||
|  | ||||
|     free(buf); | ||||
|     return err; | ||||
| } | ||||
|  | ||||
|  | ||||
| int do_extract(uf,opt_extract_without_path,opt_overwrite,password) | ||||
|     unzFile uf; | ||||
|     int opt_extract_without_path; | ||||
|     int opt_overwrite; | ||||
|     const char* password; | ||||
| { | ||||
|     uLong i; | ||||
|     unz_global_info64 gi; | ||||
|     int err; | ||||
|     FILE* fout=NULL; | ||||
|  | ||||
|     err = unzGetGlobalInfo64(uf,&gi); | ||||
|     if (err!=UNZ_OK) | ||||
|         printf("error %d with zipfile in unzGetGlobalInfo \n",err); | ||||
|  | ||||
|     for (i=0;i<gi.number_entry;i++) | ||||
|     { | ||||
|         if (do_extract_currentfile(uf,&opt_extract_without_path, | ||||
|                                       &opt_overwrite, | ||||
|                                       password) != UNZ_OK) | ||||
|             break; | ||||
|  | ||||
|         if ((i+1)<gi.number_entry) | ||||
|         { | ||||
|             err = unzGoToNextFile(uf); | ||||
|             if (err!=UNZ_OK) | ||||
|             { | ||||
|                 printf("error %d with zipfile in unzGoToNextFile\n",err); | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,password) | ||||
|     unzFile uf; | ||||
|     const char* filename; | ||||
|     int opt_extract_without_path; | ||||
|     int opt_overwrite; | ||||
|     const char* password; | ||||
| { | ||||
|     int err = UNZ_OK; | ||||
|     if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK) | ||||
|     { | ||||
|         printf("file %s not found in the zipfile\n",filename); | ||||
|         return 2; | ||||
|     } | ||||
|  | ||||
|     if (do_extract_currentfile(uf,&opt_extract_without_path, | ||||
|                                       &opt_overwrite, | ||||
|                                       password) == UNZ_OK) | ||||
|         return 0; | ||||
|     else | ||||
|         return 1; | ||||
| } | ||||
|  | ||||
|  | ||||
| int main(argc,argv) | ||||
|     int argc; | ||||
|     char *argv[]; | ||||
| { | ||||
|     const char *zipfilename=NULL; | ||||
|     const char *filename_to_extract=NULL; | ||||
|     const char *password=NULL; | ||||
|     char filename_try[MAXFILENAME+16] = ""; | ||||
|     int i; | ||||
|     int ret_value=0; | ||||
|     int opt_do_list=0; | ||||
|     int opt_do_extract=1; | ||||
|     int opt_do_extract_withoutpath=0; | ||||
|     int opt_overwrite=0; | ||||
|     int opt_extractdir=0; | ||||
|     const char *dirname=NULL; | ||||
|     unzFile uf=NULL; | ||||
|  | ||||
|     do_banner(); | ||||
|     if (argc==1) | ||||
|     { | ||||
|         do_help(); | ||||
|         return 0; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         for (i=1;i<argc;i++) | ||||
|         { | ||||
|             if ((*argv[i])=='-') | ||||
|             { | ||||
|                 const char *p=argv[i]+1; | ||||
|  | ||||
|                 while ((*p)!='\0') | ||||
|                 { | ||||
|                     char c=*(p++);; | ||||
|                     if ((c=='l') || (c=='L')) | ||||
|                         opt_do_list = 1; | ||||
|                     if ((c=='v') || (c=='V')) | ||||
|                         opt_do_list = 1; | ||||
|                     if ((c=='x') || (c=='X')) | ||||
|                         opt_do_extract = 1; | ||||
|                     if ((c=='e') || (c=='E')) | ||||
|                         opt_do_extract = opt_do_extract_withoutpath = 1; | ||||
|                     if ((c=='o') || (c=='O')) | ||||
|                         opt_overwrite=1; | ||||
|                     if ((c=='d') || (c=='D')) | ||||
|                     { | ||||
|                         opt_extractdir=1; | ||||
|                         dirname=argv[i+1]; | ||||
|                     } | ||||
|  | ||||
|                     if (((c=='p') || (c=='P')) && (i+1<argc)) | ||||
|                     { | ||||
|                         password=argv[i+1]; | ||||
|                         i++; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 if (zipfilename == NULL) | ||||
|                     zipfilename = argv[i]; | ||||
|                 else if ((filename_to_extract==NULL) && (!opt_extractdir)) | ||||
|                         filename_to_extract = argv[i] ; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (zipfilename!=NULL) | ||||
|     { | ||||
|  | ||||
| #        ifdef USEWIN32IOAPI | ||||
|         zlib_filefunc64_def ffunc; | ||||
| #        endif | ||||
|  | ||||
|         strncpy(filename_try, zipfilename,MAXFILENAME-1); | ||||
|         /* strncpy doesnt append the trailing NULL, of the string is too long. */ | ||||
|         filename_try[ MAXFILENAME ] = '\0'; | ||||
|  | ||||
| #        ifdef USEWIN32IOAPI | ||||
|         fill_win32_filefunc64A(&ffunc); | ||||
|         uf = unzOpen2_64(zipfilename,&ffunc); | ||||
| #        else | ||||
|         uf = unzOpen64(zipfilename); | ||||
| #        endif | ||||
|         if (uf==NULL) | ||||
|         { | ||||
|             strcat(filename_try,".zip"); | ||||
| #            ifdef USEWIN32IOAPI | ||||
|             uf = unzOpen2_64(filename_try,&ffunc); | ||||
| #            else | ||||
|             uf = unzOpen64(filename_try); | ||||
| #            endif | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (uf==NULL) | ||||
|     { | ||||
|         printf("Cannot open %s or %s.zip\n",zipfilename,zipfilename); | ||||
|         return 1; | ||||
|     } | ||||
|     printf("%s opened\n",filename_try); | ||||
|  | ||||
|     if (opt_do_list==1) | ||||
|         ret_value = do_list(uf); | ||||
|     else if (opt_do_extract==1) | ||||
|     { | ||||
| #ifdef _WIN32 | ||||
|         if (opt_extractdir && _chdir(dirname)) | ||||
| #else | ||||
|         if (opt_extractdir && chdir(dirname)) | ||||
| #endif | ||||
|         { | ||||
|           printf("Error changing into %s, aborting\n", dirname); | ||||
|           exit(-1); | ||||
|         } | ||||
|  | ||||
|         if (filename_to_extract == NULL) | ||||
|             ret_value = do_extract(uf, opt_do_extract_withoutpath, opt_overwrite, password); | ||||
|         else | ||||
|             ret_value = do_extract_onefile(uf, filename_to_extract, opt_do_extract_withoutpath, opt_overwrite, password); | ||||
|     } | ||||
|  | ||||
|     unzClose(uf); | ||||
|  | ||||
|     return ret_value; | ||||
| } | ||||
							
								
								
									
										520
									
								
								lib/minizip/minizip.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										520
									
								
								lib/minizip/minizip.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,520 @@ | ||||
| /* | ||||
|    minizip.c | ||||
|    Version 1.1, February 14h, 2010 | ||||
|    sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Modifications of Unzip for Zip64 | ||||
|          Copyright (C) 2007-2008 Even Rouault | ||||
|  | ||||
|          Modifications for Zip64 support on both zip and unzip | ||||
|          Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) | ||||
| */ | ||||
|  | ||||
|  | ||||
| #if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) | ||||
|         #ifndef __USE_FILE_OFFSET64 | ||||
|                 #define __USE_FILE_OFFSET64 | ||||
|         #endif | ||||
|         #ifndef __USE_LARGEFILE64 | ||||
|                 #define __USE_LARGEFILE64 | ||||
|         #endif | ||||
|         #ifndef _LARGEFILE64_SOURCE | ||||
|                 #define _LARGEFILE64_SOURCE | ||||
|         #endif | ||||
|         #ifndef _FILE_OFFSET_BIT | ||||
|                 #define _FILE_OFFSET_BIT 64 | ||||
|         #endif | ||||
| #endif | ||||
|  | ||||
| #ifdef __APPLE__ | ||||
| // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions | ||||
| #define FOPEN_FUNC(filename, mode) fopen(filename, mode) | ||||
| #define FTELLO_FUNC(stream) ftello(stream) | ||||
| #define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) | ||||
| #else | ||||
| #define FOPEN_FUNC(filename, mode) fopen64(filename, mode) | ||||
| #define FTELLO_FUNC(stream) ftello64(stream) | ||||
| #define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) | ||||
| #endif | ||||
|  | ||||
|  | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <time.h> | ||||
| #include <errno.h> | ||||
| #include <fcntl.h> | ||||
|  | ||||
| #ifdef _WIN32 | ||||
| # include <direct.h> | ||||
| # include <io.h> | ||||
| #else | ||||
| # include <unistd.h> | ||||
| # include <utime.h> | ||||
| # include <sys/types.h> | ||||
| # include <sys/stat.h> | ||||
| #endif | ||||
|  | ||||
| #include "zip.h" | ||||
|  | ||||
| #ifdef _WIN32 | ||||
|         #define USEWIN32IOAPI | ||||
|         #include "iowin32.h" | ||||
| #endif | ||||
|  | ||||
|  | ||||
|  | ||||
| #define WRITEBUFFERSIZE (16384) | ||||
| #define MAXFILENAME (256) | ||||
|  | ||||
| #ifdef _WIN32 | ||||
| uLong filetime(f, tmzip, dt) | ||||
|     char *f;                /* name of file to get info on */ | ||||
|     tm_zip *tmzip;             /* return value: access, modific. and creation times */ | ||||
|     uLong *dt;             /* dostime */ | ||||
| { | ||||
|   int ret = 0; | ||||
|   { | ||||
|       FILETIME ftLocal; | ||||
|       HANDLE hFind; | ||||
|       WIN32_FIND_DATAA ff32; | ||||
|  | ||||
|       hFind = FindFirstFileA(f,&ff32); | ||||
|       if (hFind != INVALID_HANDLE_VALUE) | ||||
|       { | ||||
|         FileTimeToLocalFileTime(&(ff32.ftLastWriteTime),&ftLocal); | ||||
|         FileTimeToDosDateTime(&ftLocal,((LPWORD)dt)+1,((LPWORD)dt)+0); | ||||
|         FindClose(hFind); | ||||
|         ret = 1; | ||||
|       } | ||||
|   } | ||||
|   return ret; | ||||
| } | ||||
| #else | ||||
| #ifdef unix || __APPLE__ | ||||
| uLong filetime(f, tmzip, dt) | ||||
|     char *f;               /* name of file to get info on */ | ||||
|     tm_zip *tmzip;         /* return value: access, modific. and creation times */ | ||||
|     uLong *dt;             /* dostime */ | ||||
| { | ||||
|   int ret=0; | ||||
|   struct stat s;        /* results of stat() */ | ||||
|   struct tm* filedate; | ||||
|   time_t tm_t=0; | ||||
|  | ||||
|   if (strcmp(f,"-")!=0) | ||||
|   { | ||||
|     char name[MAXFILENAME+1]; | ||||
|     int len = strlen(f); | ||||
|     if (len > MAXFILENAME) | ||||
|       len = MAXFILENAME; | ||||
|  | ||||
|     strncpy(name, f,MAXFILENAME-1); | ||||
|     /* strncpy doesnt append the trailing NULL, of the string is too long. */ | ||||
|     name[ MAXFILENAME ] = '\0'; | ||||
|  | ||||
|     if (name[len - 1] == '/') | ||||
|       name[len - 1] = '\0'; | ||||
|     /* not all systems allow stat'ing a file with / appended */ | ||||
|     if (stat(name,&s)==0) | ||||
|     { | ||||
|       tm_t = s.st_mtime; | ||||
|       ret = 1; | ||||
|     } | ||||
|   } | ||||
|   filedate = localtime(&tm_t); | ||||
|  | ||||
|   tmzip->tm_sec  = filedate->tm_sec; | ||||
|   tmzip->tm_min  = filedate->tm_min; | ||||
|   tmzip->tm_hour = filedate->tm_hour; | ||||
|   tmzip->tm_mday = filedate->tm_mday; | ||||
|   tmzip->tm_mon  = filedate->tm_mon ; | ||||
|   tmzip->tm_year = filedate->tm_year; | ||||
|  | ||||
|   return ret; | ||||
| } | ||||
| #else | ||||
| uLong filetime(f, tmzip, dt) | ||||
|     char *f;                /* name of file to get info on */ | ||||
|     tm_zip *tmzip;             /* return value: access, modific. and creation times */ | ||||
|     uLong *dt;             /* dostime */ | ||||
| { | ||||
|     return 0; | ||||
| } | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| int check_exist_file(filename) | ||||
|     const char* filename; | ||||
| { | ||||
|     FILE* ftestexist; | ||||
|     int ret = 1; | ||||
|     ftestexist = FOPEN_FUNC(filename,"rb"); | ||||
|     if (ftestexist==NULL) | ||||
|         ret = 0; | ||||
|     else | ||||
|         fclose(ftestexist); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| void do_banner() | ||||
| { | ||||
|     printf("MiniZip 1.1, demo of zLib + MiniZip64 package, written by Gilles Vollant\n"); | ||||
|     printf("more info on MiniZip at http://www.winimage.com/zLibDll/minizip.html\n\n"); | ||||
| } | ||||
|  | ||||
| void do_help() | ||||
| { | ||||
|     printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] [-j] file.zip [files_to_add]\n\n" \ | ||||
|            "  -o  Overwrite existing file.zip\n" \ | ||||
|            "  -a  Append to existing file.zip\n" \ | ||||
|            "  -0  Store only\n" \ | ||||
|            "  -1  Compress faster\n" \ | ||||
|            "  -9  Compress better\n\n" \ | ||||
|            "  -j  exclude path. store only the file name.\n\n"); | ||||
| } | ||||
|  | ||||
| /* calculate the CRC32 of a file, | ||||
|    because to encrypt a file, we need known the CRC32 of the file before */ | ||||
| int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc) | ||||
| { | ||||
|    unsigned long calculate_crc=0; | ||||
|    int err=ZIP_OK; | ||||
|    FILE * fin = FOPEN_FUNC(filenameinzip,"rb"); | ||||
|  | ||||
|    unsigned long size_read = 0; | ||||
|    unsigned long total_read = 0; | ||||
|    if (fin==NULL) | ||||
|    { | ||||
|        err = ZIP_ERRNO; | ||||
|    } | ||||
|  | ||||
|     if (err == ZIP_OK) | ||||
|         do | ||||
|         { | ||||
|             err = ZIP_OK; | ||||
|             size_read = (int)fread(buf,1,size_buf,fin); | ||||
|             if (size_read < size_buf) | ||||
|                 if (feof(fin)==0) | ||||
|             { | ||||
|                 printf("error in reading %s\n",filenameinzip); | ||||
|                 err = ZIP_ERRNO; | ||||
|             } | ||||
|  | ||||
|             if (size_read>0) | ||||
|                 calculate_crc = crc32(calculate_crc,buf,size_read); | ||||
|             total_read += size_read; | ||||
|  | ||||
|         } while ((err == ZIP_OK) && (size_read>0)); | ||||
|  | ||||
|     if (fin) | ||||
|         fclose(fin); | ||||
|  | ||||
|     *result_crc=calculate_crc; | ||||
|     printf("file %s crc %lx\n", filenameinzip, calculate_crc); | ||||
|     return err; | ||||
| } | ||||
|  | ||||
| int isLargeFile(const char* filename) | ||||
| { | ||||
|   int largeFile = 0; | ||||
|   ZPOS64_T pos = 0; | ||||
|   FILE* pFile = FOPEN_FUNC(filename, "rb"); | ||||
|  | ||||
|   if(pFile != NULL) | ||||
|   { | ||||
|     int n = FSEEKO_FUNC(pFile, 0, SEEK_END); | ||||
|     pos = FTELLO_FUNC(pFile); | ||||
|  | ||||
|                 printf("File : %s is %lld bytes\n", filename, pos); | ||||
|  | ||||
|     if(pos >= 0xffffffff) | ||||
|      largeFile = 1; | ||||
|  | ||||
|                 fclose(pFile); | ||||
|   } | ||||
|  | ||||
|  return largeFile; | ||||
| } | ||||
|  | ||||
| int main(argc,argv) | ||||
|     int argc; | ||||
|     char *argv[]; | ||||
| { | ||||
|     int i; | ||||
|     int opt_overwrite=0; | ||||
|     int opt_compress_level=Z_DEFAULT_COMPRESSION; | ||||
|     int opt_exclude_path=0; | ||||
|     int zipfilenamearg = 0; | ||||
|     char filename_try[MAXFILENAME+16]; | ||||
|     int zipok; | ||||
|     int err=0; | ||||
|     int size_buf=0; | ||||
|     void* buf=NULL; | ||||
|     const char* password=NULL; | ||||
|  | ||||
|  | ||||
|     do_banner(); | ||||
|     if (argc==1) | ||||
|     { | ||||
|         do_help(); | ||||
|         return 0; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         for (i=1;i<argc;i++) | ||||
|         { | ||||
|             if ((*argv[i])=='-') | ||||
|             { | ||||
|                 const char *p=argv[i]+1; | ||||
|  | ||||
|                 while ((*p)!='\0') | ||||
|                 { | ||||
|                     char c=*(p++);; | ||||
|                     if ((c=='o') || (c=='O')) | ||||
|                         opt_overwrite = 1; | ||||
|                     if ((c=='a') || (c=='A')) | ||||
|                         opt_overwrite = 2; | ||||
|                     if ((c>='0') && (c<='9')) | ||||
|                         opt_compress_level = c-'0'; | ||||
|                     if ((c=='j') || (c=='J')) | ||||
|                         opt_exclude_path = 1; | ||||
|  | ||||
|                     if (((c=='p') || (c=='P')) && (i+1<argc)) | ||||
|                     { | ||||
|                         password=argv[i+1]; | ||||
|                         i++; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 if (zipfilenamearg == 0) | ||||
|                 { | ||||
|                     zipfilenamearg = i ; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     size_buf = WRITEBUFFERSIZE; | ||||
|     buf = (void*)malloc(size_buf); | ||||
|     if (buf==NULL) | ||||
|     { | ||||
|         printf("Error allocating memory\n"); | ||||
|         return ZIP_INTERNALERROR; | ||||
|     } | ||||
|  | ||||
|     if (zipfilenamearg==0) | ||||
|     { | ||||
|         zipok=0; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         int i,len; | ||||
|         int dot_found=0; | ||||
|  | ||||
|         zipok = 1 ; | ||||
|         strncpy(filename_try, argv[zipfilenamearg],MAXFILENAME-1); | ||||
|         /* strncpy doesnt append the trailing NULL, of the string is too long. */ | ||||
|         filename_try[ MAXFILENAME ] = '\0'; | ||||
|  | ||||
|         len=(int)strlen(filename_try); | ||||
|         for (i=0;i<len;i++) | ||||
|             if (filename_try[i]=='.') | ||||
|                 dot_found=1; | ||||
|  | ||||
|         if (dot_found==0) | ||||
|             strcat(filename_try,".zip"); | ||||
|  | ||||
|         if (opt_overwrite==2) | ||||
|         { | ||||
|             /* if the file don't exist, we not append file */ | ||||
|             if (check_exist_file(filename_try)==0) | ||||
|                 opt_overwrite=1; | ||||
|         } | ||||
|         else | ||||
|         if (opt_overwrite==0) | ||||
|             if (check_exist_file(filename_try)!=0) | ||||
|             { | ||||
|                 char rep=0; | ||||
|                 do | ||||
|                 { | ||||
|                     char answer[128]; | ||||
|                     int ret; | ||||
|                     printf("The file %s exists. Overwrite ? [y]es, [n]o, [a]ppend : ",filename_try); | ||||
|                     ret = scanf("%1s",answer); | ||||
|                     if (ret != 1) | ||||
|                     { | ||||
|                        exit(EXIT_FAILURE); | ||||
|                     } | ||||
|                     rep = answer[0] ; | ||||
|                     if ((rep>='a') && (rep<='z')) | ||||
|                         rep -= 0x20; | ||||
|                 } | ||||
|                 while ((rep!='Y') && (rep!='N') && (rep!='A')); | ||||
|                 if (rep=='N') | ||||
|                     zipok = 0; | ||||
|                 if (rep=='A') | ||||
|                     opt_overwrite = 2; | ||||
|             } | ||||
|     } | ||||
|  | ||||
|     if (zipok==1) | ||||
|     { | ||||
|         zipFile zf; | ||||
|         int errclose; | ||||
| #        ifdef USEWIN32IOAPI | ||||
|         zlib_filefunc64_def ffunc; | ||||
|         fill_win32_filefunc64A(&ffunc); | ||||
|         zf = zipOpen2_64(filename_try,(opt_overwrite==2) ? 2 : 0,NULL,&ffunc); | ||||
| #        else | ||||
|         zf = zipOpen64(filename_try,(opt_overwrite==2) ? 2 : 0); | ||||
| #        endif | ||||
|  | ||||
|         if (zf == NULL) | ||||
|         { | ||||
|             printf("error opening %s\n",filename_try); | ||||
|             err= ZIP_ERRNO; | ||||
|         } | ||||
|         else | ||||
|             printf("creating %s\n",filename_try); | ||||
|  | ||||
|         for (i=zipfilenamearg+1;(i<argc) && (err==ZIP_OK);i++) | ||||
|         { | ||||
|             if (!((((*(argv[i]))=='-') || ((*(argv[i]))=='/')) && | ||||
|                   ((argv[i][1]=='o') || (argv[i][1]=='O') || | ||||
|                    (argv[i][1]=='a') || (argv[i][1]=='A') || | ||||
|                    (argv[i][1]=='p') || (argv[i][1]=='P') || | ||||
|                    ((argv[i][1]>='0') || (argv[i][1]<='9'))) && | ||||
|                   (strlen(argv[i]) == 2))) | ||||
|             { | ||||
|                 FILE * fin; | ||||
|                 int size_read; | ||||
|                 const char* filenameinzip = argv[i]; | ||||
|                 const char *savefilenameinzip; | ||||
|                 zip_fileinfo zi; | ||||
|                 unsigned long crcFile=0; | ||||
|                 int zip64 = 0; | ||||
|  | ||||
|                 zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour = | ||||
|                 zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0; | ||||
|                 zi.dosDate = 0; | ||||
|                 zi.internal_fa = 0; | ||||
|                 zi.external_fa = 0; | ||||
|                 filetime(filenameinzip,&zi.tmz_date,&zi.dosDate); | ||||
|  | ||||
| /* | ||||
|                 err = zipOpenNewFileInZip(zf,filenameinzip,&zi, | ||||
|                                  NULL,0,NULL,0,NULL / * comment * /, | ||||
|                                  (opt_compress_level != 0) ? Z_DEFLATED : 0, | ||||
|                                  opt_compress_level); | ||||
| */ | ||||
|                 if ((password != NULL) && (err==ZIP_OK)) | ||||
|                     err = getFileCrc(filenameinzip,buf,size_buf,&crcFile); | ||||
|  | ||||
|                 zip64 = isLargeFile(filenameinzip); | ||||
|  | ||||
|                                                          /* The path name saved, should not include a leading slash. */ | ||||
|                /*if it did, windows/xp and dynazip couldn't read the zip file. */ | ||||
|                  savefilenameinzip = filenameinzip; | ||||
|                  while( savefilenameinzip[0] == '\\' || savefilenameinzip[0] == '/' ) | ||||
|                  { | ||||
|                      savefilenameinzip++; | ||||
|                  } | ||||
|  | ||||
|                  /*should the zip file contain any path at all?*/ | ||||
|                  if( opt_exclude_path ) | ||||
|                  { | ||||
|                      const char *tmpptr; | ||||
|                      const char *lastslash = 0; | ||||
|                      for( tmpptr = savefilenameinzip; *tmpptr; tmpptr++) | ||||
|                      { | ||||
|                          if( *tmpptr == '\\' || *tmpptr == '/') | ||||
|                          { | ||||
|                              lastslash = tmpptr; | ||||
|                          } | ||||
|                      } | ||||
|                      if( lastslash != NULL ) | ||||
|                      { | ||||
|                          savefilenameinzip = lastslash+1; // base filename follows last slash. | ||||
|                      } | ||||
|                  } | ||||
|  | ||||
|                  /**/ | ||||
|                 err = zipOpenNewFileInZip3_64(zf,savefilenameinzip,&zi, | ||||
|                                  NULL,0,NULL,0,NULL /* comment*/, | ||||
|                                  (opt_compress_level != 0) ? Z_DEFLATED : 0, | ||||
|                                  opt_compress_level,0, | ||||
|                                  /* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */ | ||||
|                                  -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, | ||||
|                                  password,crcFile, zip64); | ||||
|  | ||||
|                 if (err != ZIP_OK) | ||||
|                     printf("error in opening %s in zipfile\n",filenameinzip); | ||||
|                 else | ||||
|                 { | ||||
|                     fin = FOPEN_FUNC(filenameinzip,"rb"); | ||||
|                     if (fin==NULL) | ||||
|                     { | ||||
|                         err=ZIP_ERRNO; | ||||
|                         printf("error in opening %s for reading\n",filenameinzip); | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 if (err == ZIP_OK) | ||||
|                     do | ||||
|                     { | ||||
|                         err = ZIP_OK; | ||||
|                         size_read = (int)fread(buf,1,size_buf,fin); | ||||
|                         if (size_read < size_buf) | ||||
|                             if (feof(fin)==0) | ||||
|                         { | ||||
|                             printf("error in reading %s\n",filenameinzip); | ||||
|                             err = ZIP_ERRNO; | ||||
|                         } | ||||
|  | ||||
|                         if (size_read>0) | ||||
|                         { | ||||
|                             err = zipWriteInFileInZip (zf,buf,size_read); | ||||
|                             if (err<0) | ||||
|                             { | ||||
|                                 printf("error in writing %s in the zipfile\n", | ||||
|                                                  filenameinzip); | ||||
|                             } | ||||
|  | ||||
|                         } | ||||
|                     } while ((err == ZIP_OK) && (size_read>0)); | ||||
|  | ||||
|                 if (fin) | ||||
|                     fclose(fin); | ||||
|  | ||||
|                 if (err<0) | ||||
|                     err=ZIP_ERRNO; | ||||
|                 else | ||||
|                 { | ||||
|                     err = zipCloseFileInZip(zf); | ||||
|                     if (err!=ZIP_OK) | ||||
|                         printf("error in closing %s in the zipfile\n", | ||||
|                                     filenameinzip); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         errclose = zipClose(zf,NULL); | ||||
|         if (errclose != ZIP_OK) | ||||
|             printf("error in closing %s\n",filename_try); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|        do_help(); | ||||
|     } | ||||
|  | ||||
|     free(buf); | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										291
									
								
								lib/minizip/mztools.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										291
									
								
								lib/minizip/mztools.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,291 @@ | ||||
| /* | ||||
|   Additional tools for Minizip | ||||
|   Code: Xavier Roche '2004 | ||||
|   License: Same as ZLIB (www.gzip.org) | ||||
| */ | ||||
|  | ||||
| /* Code */ | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "zlib.h" | ||||
| #include "unzip.h" | ||||
|  | ||||
| #define READ_8(adr)  ((unsigned char)*(adr)) | ||||
| #define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) ) | ||||
| #define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) ) | ||||
|  | ||||
| #define WRITE_8(buff, n) do { \ | ||||
|   *((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \ | ||||
| } while(0) | ||||
| #define WRITE_16(buff, n) do { \ | ||||
|   WRITE_8((unsigned char*)(buff), n); \ | ||||
|   WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \ | ||||
| } while(0) | ||||
| #define WRITE_32(buff, n) do { \ | ||||
|   WRITE_16((unsigned char*)(buff), (n) & 0xffff); \ | ||||
|   WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \ | ||||
| } while(0) | ||||
|  | ||||
| extern int ZEXPORT unzRepair(file, fileOut, fileOutTmp, nRecovered, bytesRecovered) | ||||
| const char* file; | ||||
| const char* fileOut; | ||||
| const char* fileOutTmp; | ||||
| uLong* nRecovered; | ||||
| uLong* bytesRecovered; | ||||
| { | ||||
|   int err = Z_OK; | ||||
|   FILE* fpZip = fopen(file, "rb"); | ||||
|   FILE* fpOut = fopen(fileOut, "wb"); | ||||
|   FILE* fpOutCD = fopen(fileOutTmp, "wb"); | ||||
|   if (fpZip != NULL &&  fpOut != NULL) { | ||||
|     int entries = 0; | ||||
|     uLong totalBytes = 0; | ||||
|     char header[30]; | ||||
|     char filename[1024]; | ||||
|     char extra[1024]; | ||||
|     int offset = 0; | ||||
|     int offsetCD = 0; | ||||
|     while ( fread(header, 1, 30, fpZip) == 30 ) { | ||||
|       int currentOffset = offset; | ||||
|  | ||||
|       /* File entry */ | ||||
|       if (READ_32(header) == 0x04034b50) { | ||||
|         unsigned int version = READ_16(header + 4); | ||||
|         unsigned int gpflag = READ_16(header + 6); | ||||
|         unsigned int method = READ_16(header + 8); | ||||
|         unsigned int filetime = READ_16(header + 10); | ||||
|         unsigned int filedate = READ_16(header + 12); | ||||
|         unsigned int crc = READ_32(header + 14); /* crc */ | ||||
|         unsigned int cpsize = READ_32(header + 18); /* compressed size */ | ||||
|         unsigned int uncpsize = READ_32(header + 22); /* uncompressed sz */ | ||||
|         unsigned int fnsize = READ_16(header + 26); /* file name length */ | ||||
|         unsigned int extsize = READ_16(header + 28); /* extra field length */ | ||||
|         filename[0] = extra[0] = '\0'; | ||||
|  | ||||
|         /* Header */ | ||||
|         if (fwrite(header, 1, 30, fpOut) == 30) { | ||||
|           offset += 30; | ||||
|         } else { | ||||
|           err = Z_ERRNO; | ||||
|           break; | ||||
|         } | ||||
|  | ||||
|         /* Filename */ | ||||
|         if (fnsize > 0) { | ||||
|           if (fnsize < sizeof(filename)) { | ||||
|             if (fread(filename, 1, fnsize, fpZip) == fnsize) { | ||||
|                 if (fwrite(filename, 1, fnsize, fpOut) == fnsize) { | ||||
|                 offset += fnsize; | ||||
|               } else { | ||||
|                 err = Z_ERRNO; | ||||
|                 break; | ||||
|               } | ||||
|             } else { | ||||
|               err = Z_ERRNO; | ||||
|               break; | ||||
|             } | ||||
|           } else { | ||||
|             err = Z_ERRNO; | ||||
|             break; | ||||
|           } | ||||
|         } else { | ||||
|           err = Z_STREAM_ERROR; | ||||
|           break; | ||||
|         } | ||||
|  | ||||
|         /* Extra field */ | ||||
|         if (extsize > 0) { | ||||
|           if (extsize < sizeof(extra)) { | ||||
|             if (fread(extra, 1, extsize, fpZip) == extsize) { | ||||
|               if (fwrite(extra, 1, extsize, fpOut) == extsize) { | ||||
|                 offset += extsize; | ||||
|                 } else { | ||||
|                 err = Z_ERRNO; | ||||
|                 break; | ||||
|               } | ||||
|             } else { | ||||
|               err = Z_ERRNO; | ||||
|               break; | ||||
|             } | ||||
|           } else { | ||||
|             err = Z_ERRNO; | ||||
|             break; | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         /* Data */ | ||||
|         { | ||||
|           int dataSize = cpsize; | ||||
|           if (dataSize == 0) { | ||||
|             dataSize = uncpsize; | ||||
|           } | ||||
|           if (dataSize > 0) { | ||||
|             char* data = malloc(dataSize); | ||||
|             if (data != NULL) { | ||||
|               if ((int)fread(data, 1, dataSize, fpZip) == dataSize) { | ||||
|                 if ((int)fwrite(data, 1, dataSize, fpOut) == dataSize) { | ||||
|                   offset += dataSize; | ||||
|                   totalBytes += dataSize; | ||||
|                 } else { | ||||
|                   err = Z_ERRNO; | ||||
|                 } | ||||
|               } else { | ||||
|                 err = Z_ERRNO; | ||||
|               } | ||||
|               free(data); | ||||
|               if (err != Z_OK) { | ||||
|                 break; | ||||
|               } | ||||
|             } else { | ||||
|               err = Z_MEM_ERROR; | ||||
|               break; | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         /* Central directory entry */ | ||||
|         { | ||||
|           char header[46]; | ||||
|           char* comment = ""; | ||||
|           int comsize = (int) strlen(comment); | ||||
|           WRITE_32(header, 0x02014b50); | ||||
|           WRITE_16(header + 4, version); | ||||
|           WRITE_16(header + 6, version); | ||||
|           WRITE_16(header + 8, gpflag); | ||||
|           WRITE_16(header + 10, method); | ||||
|           WRITE_16(header + 12, filetime); | ||||
|           WRITE_16(header + 14, filedate); | ||||
|           WRITE_32(header + 16, crc); | ||||
|           WRITE_32(header + 20, cpsize); | ||||
|           WRITE_32(header + 24, uncpsize); | ||||
|           WRITE_16(header + 28, fnsize); | ||||
|           WRITE_16(header + 30, extsize); | ||||
|           WRITE_16(header + 32, comsize); | ||||
|           WRITE_16(header + 34, 0);     /* disk # */ | ||||
|           WRITE_16(header + 36, 0);     /* int attrb */ | ||||
|           WRITE_32(header + 38, 0);     /* ext attrb */ | ||||
|           WRITE_32(header + 42, currentOffset); | ||||
|           /* Header */ | ||||
|           if (fwrite(header, 1, 46, fpOutCD) == 46) { | ||||
|             offsetCD += 46; | ||||
|  | ||||
|             /* Filename */ | ||||
|             if (fnsize > 0) { | ||||
|               if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) { | ||||
|                 offsetCD += fnsize; | ||||
|               } else { | ||||
|                 err = Z_ERRNO; | ||||
|                 break; | ||||
|               } | ||||
|             } else { | ||||
|               err = Z_STREAM_ERROR; | ||||
|               break; | ||||
|             } | ||||
|  | ||||
|             /* Extra field */ | ||||
|             if (extsize > 0) { | ||||
|               if (fwrite(extra, 1, extsize, fpOutCD) == extsize) { | ||||
|                 offsetCD += extsize; | ||||
|               } else { | ||||
|                 err = Z_ERRNO; | ||||
|                 break; | ||||
|               } | ||||
|             } | ||||
|  | ||||
|             /* Comment field */ | ||||
|             if (comsize > 0) { | ||||
|               if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) { | ||||
|                 offsetCD += comsize; | ||||
|               } else { | ||||
|                 err = Z_ERRNO; | ||||
|                 break; | ||||
|               } | ||||
|             } | ||||
|  | ||||
|  | ||||
|           } else { | ||||
|             err = Z_ERRNO; | ||||
|             break; | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         /* Success */ | ||||
|         entries++; | ||||
|  | ||||
|       } else { | ||||
|         break; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     /* Final central directory  */ | ||||
|     { | ||||
|       int entriesZip = entries; | ||||
|       char header[22]; | ||||
|       char* comment = ""; // "ZIP File recovered by zlib/minizip/mztools"; | ||||
|       int comsize = (int) strlen(comment); | ||||
|       if (entriesZip > 0xffff) { | ||||
|         entriesZip = 0xffff; | ||||
|       } | ||||
|       WRITE_32(header, 0x06054b50); | ||||
|       WRITE_16(header + 4, 0);    /* disk # */ | ||||
|       WRITE_16(header + 6, 0);    /* disk # */ | ||||
|       WRITE_16(header + 8, entriesZip);   /* hack */ | ||||
|       WRITE_16(header + 10, entriesZip);  /* hack */ | ||||
|       WRITE_32(header + 12, offsetCD);    /* size of CD */ | ||||
|       WRITE_32(header + 16, offset);      /* offset to CD */ | ||||
|       WRITE_16(header + 20, comsize);     /* comment */ | ||||
|  | ||||
|       /* Header */ | ||||
|       if (fwrite(header, 1, 22, fpOutCD) == 22) { | ||||
|  | ||||
|         /* Comment field */ | ||||
|         if (comsize > 0) { | ||||
|           if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) { | ||||
|             err = Z_ERRNO; | ||||
|           } | ||||
|         } | ||||
|  | ||||
|       } else { | ||||
|         err = Z_ERRNO; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     /* Final merge (file + central directory) */ | ||||
|     fclose(fpOutCD); | ||||
|     if (err == Z_OK) { | ||||
|       fpOutCD = fopen(fileOutTmp, "rb"); | ||||
|       if (fpOutCD != NULL) { | ||||
|         int nRead; | ||||
|         char buffer[8192]; | ||||
|         while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) { | ||||
|           if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) { | ||||
|             err = Z_ERRNO; | ||||
|             break; | ||||
|           } | ||||
|         } | ||||
|         fclose(fpOutCD); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     /* Close */ | ||||
|     fclose(fpZip); | ||||
|     fclose(fpOut); | ||||
|  | ||||
|     /* Wipe temporary file */ | ||||
|     (void)remove(fileOutTmp); | ||||
|  | ||||
|     /* Number of recovered entries */ | ||||
|     if (err == Z_OK) { | ||||
|       if (nRecovered != NULL) { | ||||
|         *nRecovered = entries; | ||||
|       } | ||||
|       if (bytesRecovered != NULL) { | ||||
|         *bytesRecovered = totalBytes; | ||||
|       } | ||||
|     } | ||||
|   } else { | ||||
|     err = Z_STREAM_ERROR; | ||||
|   } | ||||
|   return err; | ||||
| } | ||||
							
								
								
									
										37
									
								
								lib/minizip/mztools.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								lib/minizip/mztools.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| /* | ||||
|   Additional tools for Minizip | ||||
|   Code: Xavier Roche '2004 | ||||
|   License: Same as ZLIB (www.gzip.org) | ||||
| */ | ||||
|  | ||||
| #ifndef _zip_tools_H | ||||
| #define _zip_tools_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #ifndef _ZLIB_H | ||||
| #include "zlib.h" | ||||
| #endif | ||||
|  | ||||
| #include "unzip.h" | ||||
|  | ||||
| /* Repair a ZIP file (missing central directory) | ||||
|    file: file to recover | ||||
|    fileOut: output file after recovery | ||||
|    fileOutTmp: temporary file name used for recovery | ||||
| */ | ||||
| extern int ZEXPORT unzRepair(const char* file, | ||||
|                              const char* fileOut, | ||||
|                              const char* fileOutTmp, | ||||
|                              uLong* nRecovered, | ||||
|                              uLong* bytesRecovered); | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										2125
									
								
								lib/minizip/unzip.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2125
									
								
								lib/minizip/unzip.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										437
									
								
								lib/minizip/unzip.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										437
									
								
								lib/minizip/unzip.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,437 @@ | ||||
| /* unzip.h -- IO for uncompress .zip files using zlib | ||||
|    Version 1.1, February 14h, 2010 | ||||
|    part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Modifications of Unzip for Zip64 | ||||
|          Copyright (C) 2007-2008 Even Rouault | ||||
|  | ||||
|          Modifications for Zip64 support on both zip and unzip | ||||
|          Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) | ||||
|  | ||||
|          For more info read MiniZip_info.txt | ||||
|  | ||||
|          --------------------------------------------------------------------------------- | ||||
|  | ||||
|         Condition of use and distribution are the same than zlib : | ||||
|  | ||||
|   This software is provided 'as-is', without any express or implied | ||||
|   warranty.  In no event will the authors be held liable for any damages | ||||
|   arising from the use of this software. | ||||
|  | ||||
|   Permission is granted to anyone to use this software for any purpose, | ||||
|   including commercial applications, and to alter it and redistribute it | ||||
|   freely, subject to the following restrictions: | ||||
|  | ||||
|   1. The origin of this software must not be misrepresented; you must not | ||||
|      claim that you wrote the original software. If you use this software | ||||
|      in a product, an acknowledgment in the product documentation would be | ||||
|      appreciated but is not required. | ||||
|   2. Altered source versions must be plainly marked as such, and must not be | ||||
|      misrepresented as being the original software. | ||||
|   3. This notice may not be removed or altered from any source distribution. | ||||
|  | ||||
|   --------------------------------------------------------------------------------- | ||||
|  | ||||
|         Changes | ||||
|  | ||||
|         See header of unzip64.c | ||||
|  | ||||
| */ | ||||
|  | ||||
| #ifndef _unz64_H | ||||
| #define _unz64_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #ifndef _ZLIB_H | ||||
| #include "zlib.h" | ||||
| #endif | ||||
|  | ||||
| #ifndef  _ZLIBIOAPI_H | ||||
| #include "ioapi.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_BZIP2 | ||||
| #include "bzlib.h" | ||||
| #endif | ||||
|  | ||||
| #define Z_BZIP2ED 12 | ||||
|  | ||||
| #if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) | ||||
| /* like the STRICT of WIN32, we define a pointer that cannot be converted | ||||
|     from (void*) without cast */ | ||||
| typedef struct TagunzFile__ { int unused; } unzFile__; | ||||
| typedef unzFile__ *unzFile; | ||||
| #else | ||||
| typedef voidp unzFile; | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #define UNZ_OK                          (0) | ||||
| #define UNZ_END_OF_LIST_OF_FILE         (-100) | ||||
| #define UNZ_ERRNO                       (Z_ERRNO) | ||||
| #define UNZ_EOF                         (0) | ||||
| #define UNZ_PARAMERROR                  (-102) | ||||
| #define UNZ_BADZIPFILE                  (-103) | ||||
| #define UNZ_INTERNALERROR               (-104) | ||||
| #define UNZ_CRCERROR                    (-105) | ||||
|  | ||||
| /* tm_unz contain date/time info */ | ||||
| typedef struct tm_unz_s | ||||
| { | ||||
|     uInt tm_sec;            /* seconds after the minute - [0,59] */ | ||||
|     uInt tm_min;            /* minutes after the hour - [0,59] */ | ||||
|     uInt tm_hour;           /* hours since midnight - [0,23] */ | ||||
|     uInt tm_mday;           /* day of the month - [1,31] */ | ||||
|     uInt tm_mon;            /* months since January - [0,11] */ | ||||
|     uInt tm_year;           /* years - [1980..2044] */ | ||||
| } tm_unz; | ||||
|  | ||||
| /* unz_global_info structure contain global data about the ZIPfile | ||||
|    These data comes from the end of central dir */ | ||||
| typedef struct unz_global_info64_s | ||||
| { | ||||
|     ZPOS64_T number_entry;         /* total number of entries in | ||||
|                                      the central dir on this disk */ | ||||
|     uLong size_comment;         /* size of the global comment of the zipfile */ | ||||
| } unz_global_info64; | ||||
|  | ||||
| typedef struct unz_global_info_s | ||||
| { | ||||
|     uLong number_entry;         /* total number of entries in | ||||
|                                      the central dir on this disk */ | ||||
|     uLong size_comment;         /* size of the global comment of the zipfile */ | ||||
| } unz_global_info; | ||||
|  | ||||
| /* unz_file_info contain information about a file in the zipfile */ | ||||
| typedef struct unz_file_info64_s | ||||
| { | ||||
|     uLong version;              /* version made by                 2 bytes */ | ||||
|     uLong version_needed;       /* version needed to extract       2 bytes */ | ||||
|     uLong flag;                 /* general purpose bit flag        2 bytes */ | ||||
|     uLong compression_method;   /* compression method              2 bytes */ | ||||
|     uLong dosDate;              /* last mod file date in Dos fmt   4 bytes */ | ||||
|     uLong crc;                  /* crc-32                          4 bytes */ | ||||
|     ZPOS64_T compressed_size;   /* compressed size                 8 bytes */ | ||||
|     ZPOS64_T uncompressed_size; /* uncompressed size               8 bytes */ | ||||
|     uLong size_filename;        /* filename length                 2 bytes */ | ||||
|     uLong size_file_extra;      /* extra field length              2 bytes */ | ||||
|     uLong size_file_comment;    /* file comment length             2 bytes */ | ||||
|  | ||||
|     uLong disk_num_start;       /* disk number start               2 bytes */ | ||||
|     uLong internal_fa;          /* internal file attributes        2 bytes */ | ||||
|     uLong external_fa;          /* external file attributes        4 bytes */ | ||||
|  | ||||
|     tm_unz tmu_date; | ||||
| } unz_file_info64; | ||||
|  | ||||
| typedef struct unz_file_info_s | ||||
| { | ||||
|     uLong version;              /* version made by                 2 bytes */ | ||||
|     uLong version_needed;       /* version needed to extract       2 bytes */ | ||||
|     uLong flag;                 /* general purpose bit flag        2 bytes */ | ||||
|     uLong compression_method;   /* compression method              2 bytes */ | ||||
|     uLong dosDate;              /* last mod file date in Dos fmt   4 bytes */ | ||||
|     uLong crc;                  /* crc-32                          4 bytes */ | ||||
|     uLong compressed_size;      /* compressed size                 4 bytes */ | ||||
|     uLong uncompressed_size;    /* uncompressed size               4 bytes */ | ||||
|     uLong size_filename;        /* filename length                 2 bytes */ | ||||
|     uLong size_file_extra;      /* extra field length              2 bytes */ | ||||
|     uLong size_file_comment;    /* file comment length             2 bytes */ | ||||
|  | ||||
|     uLong disk_num_start;       /* disk number start               2 bytes */ | ||||
|     uLong internal_fa;          /* internal file attributes        2 bytes */ | ||||
|     uLong external_fa;          /* external file attributes        4 bytes */ | ||||
|  | ||||
|     tm_unz tmu_date; | ||||
| } unz_file_info; | ||||
|  | ||||
| extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, | ||||
|                                                  const char* fileName2, | ||||
|                                                  int iCaseSensitivity)); | ||||
| /* | ||||
|    Compare two filename (fileName1,fileName2). | ||||
|    If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) | ||||
|    If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi | ||||
|                                 or strcasecmp) | ||||
|    If iCaseSenisivity = 0, case sensitivity is defaut of your operating system | ||||
|     (like 1 on Unix, 2 on Windows) | ||||
| */ | ||||
|  | ||||
|  | ||||
| extern unzFile ZEXPORT unzOpen OF((const char *path)); | ||||
| extern unzFile ZEXPORT unzOpen64 OF((const void *path)); | ||||
| /* | ||||
|   Open a Zip file. path contain the full pathname (by example, | ||||
|      on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer | ||||
|      "zlib/zlib113.zip". | ||||
|      If the zipfile cannot be opened (file don't exist or in not valid), the | ||||
|        return value is NULL. | ||||
|      Else, the return value is a unzFile Handle, usable with other function | ||||
|        of this unzip package. | ||||
|      the "64" function take a const void* pointer, because the path is just the | ||||
|        value passed to the open64_file_func callback. | ||||
|      Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path | ||||
|        is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char* | ||||
|        does not describe the reality | ||||
| */ | ||||
|  | ||||
|  | ||||
| extern unzFile ZEXPORT unzOpen2 OF((const char *path, | ||||
|                                     zlib_filefunc_def* pzlib_filefunc_def)); | ||||
| /* | ||||
|    Open a Zip file, like unzOpen, but provide a set of file low level API | ||||
|       for read/write the zip file (see ioapi.h) | ||||
| */ | ||||
|  | ||||
| extern unzFile ZEXPORT unzOpen2_64 OF((const void *path, | ||||
|                                     zlib_filefunc64_def* pzlib_filefunc_def)); | ||||
| /* | ||||
|    Open a Zip file, like unz64Open, but provide a set of file low level API | ||||
|       for read/write the zip file (see ioapi.h) | ||||
| */ | ||||
|  | ||||
| extern int ZEXPORT unzClose OF((unzFile file)); | ||||
| /* | ||||
|   Close a ZipFile opened with unzOpen. | ||||
|   If there is files inside the .Zip opened with unzOpenCurrentFile (see later), | ||||
|     these files MUST be closed with unzCloseCurrentFile before call unzClose. | ||||
|   return UNZ_OK if there is no problem. */ | ||||
|  | ||||
| extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, | ||||
|                                         unz_global_info *pglobal_info)); | ||||
|  | ||||
| extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file, | ||||
|                                         unz_global_info64 *pglobal_info)); | ||||
| /* | ||||
|   Write info about the ZipFile in the *pglobal_info structure. | ||||
|   No preparation of the structure is needed | ||||
|   return UNZ_OK if there is no problem. */ | ||||
|  | ||||
|  | ||||
| extern int ZEXPORT unzGetGlobalComment OF((unzFile file, | ||||
|                                            char *szComment, | ||||
|                                            uLong uSizeBuf)); | ||||
| /* | ||||
|   Get the global comment string of the ZipFile, in the szComment buffer. | ||||
|   uSizeBuf is the size of the szComment buffer. | ||||
|   return the number of byte copied or an error code <0 | ||||
| */ | ||||
|  | ||||
|  | ||||
| /***************************************************************************/ | ||||
| /* Unzip package allow you browse the directory of the zipfile */ | ||||
|  | ||||
| extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); | ||||
| /* | ||||
|   Set the current file of the zipfile to the first file. | ||||
|   return UNZ_OK if there is no problem | ||||
| */ | ||||
|  | ||||
| extern int ZEXPORT unzGoToNextFile OF((unzFile file)); | ||||
| /* | ||||
|   Set the current file of the zipfile to the next file. | ||||
|   return UNZ_OK if there is no problem | ||||
|   return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. | ||||
| */ | ||||
|  | ||||
| extern int ZEXPORT unzLocateFile OF((unzFile file, | ||||
|                      const char *szFileName, | ||||
|                      int iCaseSensitivity)); | ||||
| /* | ||||
|   Try locate the file szFileName in the zipfile. | ||||
|   For the iCaseSensitivity signification, see unzStringFileNameCompare | ||||
|  | ||||
|   return value : | ||||
|   UNZ_OK if the file is found. It becomes the current file. | ||||
|   UNZ_END_OF_LIST_OF_FILE if the file is not found | ||||
| */ | ||||
|  | ||||
|  | ||||
| /* ****************************************** */ | ||||
| /* Ryan supplied functions */ | ||||
| /* unz_file_info contain information about a file in the zipfile */ | ||||
| typedef struct unz_file_pos_s | ||||
| { | ||||
|     uLong pos_in_zip_directory;   /* offset in zip file directory */ | ||||
|     uLong num_of_file;            /* # of file */ | ||||
| } unz_file_pos; | ||||
|  | ||||
| extern int ZEXPORT unzGetFilePos( | ||||
|     unzFile file, | ||||
|     unz_file_pos* file_pos); | ||||
|  | ||||
| extern int ZEXPORT unzGoToFilePos( | ||||
|     unzFile file, | ||||
|     unz_file_pos* file_pos); | ||||
|  | ||||
| typedef struct unz64_file_pos_s | ||||
| { | ||||
|     ZPOS64_T pos_in_zip_directory;   /* offset in zip file directory */ | ||||
|     ZPOS64_T num_of_file;            /* # of file */ | ||||
| } unz64_file_pos; | ||||
|  | ||||
| extern int ZEXPORT unzGetFilePos64( | ||||
|     unzFile file, | ||||
|     unz64_file_pos* file_pos); | ||||
|  | ||||
| extern int ZEXPORT unzGoToFilePos64( | ||||
|     unzFile file, | ||||
|     const unz64_file_pos* file_pos); | ||||
|  | ||||
| /* ****************************************** */ | ||||
|  | ||||
| extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, | ||||
|                          unz_file_info64 *pfile_info, | ||||
|                          char *szFileName, | ||||
|                          uLong fileNameBufferSize, | ||||
|                          void *extraField, | ||||
|                          uLong extraFieldBufferSize, | ||||
|                          char *szComment, | ||||
|                          uLong commentBufferSize)); | ||||
|  | ||||
| extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, | ||||
|                          unz_file_info *pfile_info, | ||||
|                          char *szFileName, | ||||
|                          uLong fileNameBufferSize, | ||||
|                          void *extraField, | ||||
|                          uLong extraFieldBufferSize, | ||||
|                          char *szComment, | ||||
|                          uLong commentBufferSize)); | ||||
| /* | ||||
|   Get Info about the current file | ||||
|   if pfile_info!=NULL, the *pfile_info structure will contain somes info about | ||||
|         the current file | ||||
|   if szFileName!=NULL, the filemane string will be copied in szFileName | ||||
|             (fileNameBufferSize is the size of the buffer) | ||||
|   if extraField!=NULL, the extra field information will be copied in extraField | ||||
|             (extraFieldBufferSize is the size of the buffer). | ||||
|             This is the Central-header version of the extra field | ||||
|   if szComment!=NULL, the comment string of the file will be copied in szComment | ||||
|             (commentBufferSize is the size of the buffer) | ||||
| */ | ||||
|  | ||||
|  | ||||
| /** Addition for GDAL : START */ | ||||
|  | ||||
| extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file)); | ||||
|  | ||||
| /** Addition for GDAL : END */ | ||||
|  | ||||
|  | ||||
| /***************************************************************************/ | ||||
| /* for reading the content of the current zipfile, you can open it, read data | ||||
|    from it, and close it (you can close it before reading all the file) | ||||
|    */ | ||||
|  | ||||
| extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); | ||||
| /* | ||||
|   Open for reading data the current file in the zipfile. | ||||
|   If there is no error, the return value is UNZ_OK. | ||||
| */ | ||||
|  | ||||
| extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, | ||||
|                                                   const char* password)); | ||||
| /* | ||||
|   Open for reading data the current file in the zipfile. | ||||
|   password is a crypting password | ||||
|   If there is no error, the return value is UNZ_OK. | ||||
| */ | ||||
|  | ||||
| extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, | ||||
|                                            int* method, | ||||
|                                            int* level, | ||||
|                                            int raw)); | ||||
| /* | ||||
|   Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) | ||||
|     if raw==1 | ||||
|   *method will receive method of compression, *level will receive level of | ||||
|      compression | ||||
|   note : you can set level parameter as NULL (if you did not want known level, | ||||
|          but you CANNOT set method parameter as NULL | ||||
| */ | ||||
|  | ||||
| extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, | ||||
|                                            int* method, | ||||
|                                            int* level, | ||||
|                                            int raw, | ||||
|                                            const char* password)); | ||||
| /* | ||||
|   Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) | ||||
|     if raw==1 | ||||
|   *method will receive method of compression, *level will receive level of | ||||
|      compression | ||||
|   note : you can set level parameter as NULL (if you did not want known level, | ||||
|          but you CANNOT set method parameter as NULL | ||||
| */ | ||||
|  | ||||
|  | ||||
| extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); | ||||
| /* | ||||
|   Close the file in zip opened with unzOpenCurrentFile | ||||
|   Return UNZ_CRCERROR if all the file was read but the CRC is not good | ||||
| */ | ||||
|  | ||||
| extern int ZEXPORT unzReadCurrentFile OF((unzFile file, | ||||
|                       voidp buf, | ||||
|                       unsigned len)); | ||||
| /* | ||||
|   Read bytes from the current file (opened by unzOpenCurrentFile) | ||||
|   buf contain buffer where data must be copied | ||||
|   len the size of buf. | ||||
|  | ||||
|   return the number of byte copied if somes bytes are copied | ||||
|   return 0 if the end of file was reached | ||||
|   return <0 with error code if there is an error | ||||
|     (UNZ_ERRNO for IO error, or zLib error for uncompress error) | ||||
| */ | ||||
|  | ||||
| extern z_off_t ZEXPORT unztell OF((unzFile file)); | ||||
|  | ||||
| extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file)); | ||||
| /* | ||||
|   Give the current position in uncompressed data | ||||
| */ | ||||
|  | ||||
| extern int ZEXPORT unzeof OF((unzFile file)); | ||||
| /* | ||||
|   return 1 if the end of file was reached, 0 elsewhere | ||||
| */ | ||||
|  | ||||
| extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, | ||||
|                                              voidp buf, | ||||
|                                              unsigned len)); | ||||
| /* | ||||
|   Read extra field from the current file (opened by unzOpenCurrentFile) | ||||
|   This is the local-header version of the extra field (sometimes, there is | ||||
|     more info in the local-header version than in the central-header) | ||||
|  | ||||
|   if buf==NULL, it return the size of the local extra field | ||||
|  | ||||
|   if buf!=NULL, len is the size of the buffer, the extra header is copied in | ||||
|     buf. | ||||
|   the return value is the number of bytes copied in buf, or (if <0) | ||||
|     the error code | ||||
| */ | ||||
|  | ||||
| /***************************************************************************/ | ||||
|  | ||||
| /* Get the current file offset */ | ||||
| extern ZPOS64_T ZEXPORT unzGetOffset64 (unzFile file); | ||||
| extern uLong ZEXPORT unzGetOffset (unzFile file); | ||||
|  | ||||
| /* Set the current file offset */ | ||||
| extern int ZEXPORT unzSetOffset64 (unzFile file, ZPOS64_T pos); | ||||
| extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); | ||||
|  | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* _unz64_H */ | ||||
							
								
								
									
										2007
									
								
								lib/minizip/zip.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2007
									
								
								lib/minizip/zip.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										362
									
								
								lib/minizip/zip.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										362
									
								
								lib/minizip/zip.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,362 @@ | ||||
| /* zip.h -- IO on .zip files using zlib | ||||
|    Version 1.1, February 14h, 2010 | ||||
|    part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Modifications for Zip64 support | ||||
|          Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) | ||||
|  | ||||
|          For more info read MiniZip_info.txt | ||||
|  | ||||
|          --------------------------------------------------------------------------- | ||||
|  | ||||
|    Condition of use and distribution are the same than zlib : | ||||
|  | ||||
|   This software is provided 'as-is', without any express or implied | ||||
|   warranty.  In no event will the authors be held liable for any damages | ||||
|   arising from the use of this software. | ||||
|  | ||||
|   Permission is granted to anyone to use this software for any purpose, | ||||
|   including commercial applications, and to alter it and redistribute it | ||||
|   freely, subject to the following restrictions: | ||||
|  | ||||
|   1. The origin of this software must not be misrepresented; you must not | ||||
|      claim that you wrote the original software. If you use this software | ||||
|      in a product, an acknowledgment in the product documentation would be | ||||
|      appreciated but is not required. | ||||
|   2. Altered source versions must be plainly marked as such, and must not be | ||||
|      misrepresented as being the original software. | ||||
|   3. This notice may not be removed or altered from any source distribution. | ||||
|  | ||||
|         --------------------------------------------------------------------------- | ||||
|  | ||||
|         Changes | ||||
|  | ||||
|         See header of zip.h | ||||
|  | ||||
| */ | ||||
|  | ||||
| #ifndef _zip12_H | ||||
| #define _zip12_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| //#define HAVE_BZIP2 | ||||
|  | ||||
| #ifndef _ZLIB_H | ||||
| #include "zlib.h" | ||||
| #endif | ||||
|  | ||||
| #ifndef _ZLIBIOAPI_H | ||||
| #include "ioapi.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_BZIP2 | ||||
| #include "bzlib.h" | ||||
| #endif | ||||
|  | ||||
| #define Z_BZIP2ED 12 | ||||
|  | ||||
| #if defined(STRICTZIP) || defined(STRICTZIPUNZIP) | ||||
| /* like the STRICT of WIN32, we define a pointer that cannot be converted | ||||
|     from (void*) without cast */ | ||||
| typedef struct TagzipFile__ { int unused; } zipFile__; | ||||
| typedef zipFile__ *zipFile; | ||||
| #else | ||||
| typedef voidp zipFile; | ||||
| #endif | ||||
|  | ||||
| #define ZIP_OK                          (0) | ||||
| #define ZIP_EOF                         (0) | ||||
| #define ZIP_ERRNO                       (Z_ERRNO) | ||||
| #define ZIP_PARAMERROR                  (-102) | ||||
| #define ZIP_BADZIPFILE                  (-103) | ||||
| #define ZIP_INTERNALERROR               (-104) | ||||
|  | ||||
| #ifndef DEF_MEM_LEVEL | ||||
| #  if MAX_MEM_LEVEL >= 8 | ||||
| #    define DEF_MEM_LEVEL 8 | ||||
| #  else | ||||
| #    define DEF_MEM_LEVEL  MAX_MEM_LEVEL | ||||
| #  endif | ||||
| #endif | ||||
| /* default memLevel */ | ||||
|  | ||||
| /* tm_zip contain date/time info */ | ||||
| typedef struct tm_zip_s | ||||
| { | ||||
|     uInt tm_sec;            /* seconds after the minute - [0,59] */ | ||||
|     uInt tm_min;            /* minutes after the hour - [0,59] */ | ||||
|     uInt tm_hour;           /* hours since midnight - [0,23] */ | ||||
|     uInt tm_mday;           /* day of the month - [1,31] */ | ||||
|     uInt tm_mon;            /* months since January - [0,11] */ | ||||
|     uInt tm_year;           /* years - [1980..2044] */ | ||||
| } tm_zip; | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|     tm_zip      tmz_date;       /* date in understandable format           */ | ||||
|     uLong       dosDate;       /* if dos_date == 0, tmu_date is used      */ | ||||
| /*    uLong       flag;        */   /* general purpose bit flag        2 bytes */ | ||||
|  | ||||
|     uLong       internal_fa;    /* internal file attributes        2 bytes */ | ||||
|     uLong       external_fa;    /* external file attributes        4 bytes */ | ||||
| } zip_fileinfo; | ||||
|  | ||||
| typedef const char* zipcharpc; | ||||
|  | ||||
|  | ||||
| #define APPEND_STATUS_CREATE        (0) | ||||
| #define APPEND_STATUS_CREATEAFTER   (1) | ||||
| #define APPEND_STATUS_ADDINZIP      (2) | ||||
|  | ||||
| extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); | ||||
| extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append)); | ||||
| /* | ||||
|   Create a zipfile. | ||||
|      pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on | ||||
|        an Unix computer "zlib/zlib113.zip". | ||||
|      if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip | ||||
|        will be created at the end of the file. | ||||
|          (useful if the file contain a self extractor code) | ||||
|      if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will | ||||
|        add files in existing zip (be sure you don't add file that doesn't exist) | ||||
|      If the zipfile cannot be opened, the return value is NULL. | ||||
|      Else, the return value is a zipFile Handle, usable with other function | ||||
|        of this zip package. | ||||
| */ | ||||
|  | ||||
| /* Note : there is no delete function into a zipfile. | ||||
|    If you want delete file into a zipfile, you must open a zipfile, and create another | ||||
|    Of couse, you can use RAW reading and writing to copy the file you did not want delte | ||||
| */ | ||||
|  | ||||
| extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, | ||||
|                                    int append, | ||||
|                                    zipcharpc* globalcomment, | ||||
|                                    zlib_filefunc_def* pzlib_filefunc_def)); | ||||
|  | ||||
| extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname, | ||||
|                                    int append, | ||||
|                                    zipcharpc* globalcomment, | ||||
|                                    zlib_filefunc64_def* pzlib_filefunc_def)); | ||||
|  | ||||
| extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, | ||||
|                        const char* filename, | ||||
|                        const zip_fileinfo* zipfi, | ||||
|                        const void* extrafield_local, | ||||
|                        uInt size_extrafield_local, | ||||
|                        const void* extrafield_global, | ||||
|                        uInt size_extrafield_global, | ||||
|                        const char* comment, | ||||
|                        int method, | ||||
|                        int level)); | ||||
|  | ||||
| extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file, | ||||
|                        const char* filename, | ||||
|                        const zip_fileinfo* zipfi, | ||||
|                        const void* extrafield_local, | ||||
|                        uInt size_extrafield_local, | ||||
|                        const void* extrafield_global, | ||||
|                        uInt size_extrafield_global, | ||||
|                        const char* comment, | ||||
|                        int method, | ||||
|                        int level, | ||||
|                        int zip64)); | ||||
|  | ||||
| /* | ||||
|   Open a file in the ZIP for writing. | ||||
|   filename : the filename in zip (if NULL, '-' without quote will be used | ||||
|   *zipfi contain supplemental information | ||||
|   if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local | ||||
|     contains the extrafield data the the local header | ||||
|   if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global | ||||
|     contains the extrafield data the the local header | ||||
|   if comment != NULL, comment contain the comment string | ||||
|   method contain the compression method (0 for store, Z_DEFLATED for deflate) | ||||
|   level contain the level of compression (can be Z_DEFAULT_COMPRESSION) | ||||
|   zip64 is set to 1 if a zip64 extended information block should be added to the local file header. | ||||
|                     this MUST be '1' if the uncompressed size is >= 0xffffffff. | ||||
|  | ||||
| */ | ||||
|  | ||||
|  | ||||
| extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, | ||||
|                                             const char* filename, | ||||
|                                             const zip_fileinfo* zipfi, | ||||
|                                             const void* extrafield_local, | ||||
|                                             uInt size_extrafield_local, | ||||
|                                             const void* extrafield_global, | ||||
|                                             uInt size_extrafield_global, | ||||
|                                             const char* comment, | ||||
|                                             int method, | ||||
|                                             int level, | ||||
|                                             int raw)); | ||||
|  | ||||
|  | ||||
| extern int ZEXPORT zipOpenNewFileInZip2_64 OF((zipFile file, | ||||
|                                             const char* filename, | ||||
|                                             const zip_fileinfo* zipfi, | ||||
|                                             const void* extrafield_local, | ||||
|                                             uInt size_extrafield_local, | ||||
|                                             const void* extrafield_global, | ||||
|                                             uInt size_extrafield_global, | ||||
|                                             const char* comment, | ||||
|                                             int method, | ||||
|                                             int level, | ||||
|                                             int raw, | ||||
|                                             int zip64)); | ||||
| /* | ||||
|   Same than zipOpenNewFileInZip, except if raw=1, we write raw file | ||||
|  */ | ||||
|  | ||||
| extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, | ||||
|                                             const char* filename, | ||||
|                                             const zip_fileinfo* zipfi, | ||||
|                                             const void* extrafield_local, | ||||
|                                             uInt size_extrafield_local, | ||||
|                                             const void* extrafield_global, | ||||
|                                             uInt size_extrafield_global, | ||||
|                                             const char* comment, | ||||
|                                             int method, | ||||
|                                             int level, | ||||
|                                             int raw, | ||||
|                                             int windowBits, | ||||
|                                             int memLevel, | ||||
|                                             int strategy, | ||||
|                                             const char* password, | ||||
|                                             uLong crcForCrypting)); | ||||
|  | ||||
| extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file, | ||||
|                                             const char* filename, | ||||
|                                             const zip_fileinfo* zipfi, | ||||
|                                             const void* extrafield_local, | ||||
|                                             uInt size_extrafield_local, | ||||
|                                             const void* extrafield_global, | ||||
|                                             uInt size_extrafield_global, | ||||
|                                             const char* comment, | ||||
|                                             int method, | ||||
|                                             int level, | ||||
|                                             int raw, | ||||
|                                             int windowBits, | ||||
|                                             int memLevel, | ||||
|                                             int strategy, | ||||
|                                             const char* password, | ||||
|                                             uLong crcForCrypting, | ||||
|                                             int zip64 | ||||
|                                             )); | ||||
|  | ||||
| /* | ||||
|   Same than zipOpenNewFileInZip2, except | ||||
|     windowBits,memLevel,,strategy : see parameter strategy in deflateInit2 | ||||
|     password : crypting password (NULL for no crypting) | ||||
|     crcForCrypting : crc of file to compress (needed for crypting) | ||||
|  */ | ||||
|  | ||||
| extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file, | ||||
|                                             const char* filename, | ||||
|                                             const zip_fileinfo* zipfi, | ||||
|                                             const void* extrafield_local, | ||||
|                                             uInt size_extrafield_local, | ||||
|                                             const void* extrafield_global, | ||||
|                                             uInt size_extrafield_global, | ||||
|                                             const char* comment, | ||||
|                                             int method, | ||||
|                                             int level, | ||||
|                                             int raw, | ||||
|                                             int windowBits, | ||||
|                                             int memLevel, | ||||
|                                             int strategy, | ||||
|                                             const char* password, | ||||
|                                             uLong crcForCrypting, | ||||
|                                             uLong versionMadeBy, | ||||
|                                             uLong flagBase | ||||
|                                             )); | ||||
|  | ||||
|  | ||||
| extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file, | ||||
|                                             const char* filename, | ||||
|                                             const zip_fileinfo* zipfi, | ||||
|                                             const void* extrafield_local, | ||||
|                                             uInt size_extrafield_local, | ||||
|                                             const void* extrafield_global, | ||||
|                                             uInt size_extrafield_global, | ||||
|                                             const char* comment, | ||||
|                                             int method, | ||||
|                                             int level, | ||||
|                                             int raw, | ||||
|                                             int windowBits, | ||||
|                                             int memLevel, | ||||
|                                             int strategy, | ||||
|                                             const char* password, | ||||
|                                             uLong crcForCrypting, | ||||
|                                             uLong versionMadeBy, | ||||
|                                             uLong flagBase, | ||||
|                                             int zip64 | ||||
|                                             )); | ||||
| /* | ||||
|   Same than zipOpenNewFileInZip4, except | ||||
|     versionMadeBy : value for Version made by field | ||||
|     flag : value for flag field (compression level info will be added) | ||||
|  */ | ||||
|  | ||||
|  | ||||
| extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, | ||||
|                        const void* buf, | ||||
|                        unsigned len)); | ||||
| /* | ||||
|   Write data in the zipfile | ||||
| */ | ||||
|  | ||||
| extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); | ||||
| /* | ||||
|   Close the current file in the zipfile | ||||
| */ | ||||
|  | ||||
| extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, | ||||
|                                             uLong uncompressed_size, | ||||
|                                             uLong crc32)); | ||||
|  | ||||
| extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file, | ||||
|                                             ZPOS64_T uncompressed_size, | ||||
|                                             uLong crc32)); | ||||
|  | ||||
| /* | ||||
|   Close the current file in the zipfile, for file opened with | ||||
|     parameter raw=1 in zipOpenNewFileInZip2 | ||||
|   uncompressed_size and crc32 are value for the uncompressed size | ||||
| */ | ||||
|  | ||||
| extern int ZEXPORT zipClose OF((zipFile file, | ||||
|                 const char* global_comment)); | ||||
| /* | ||||
|   Close the zipfile | ||||
| */ | ||||
|  | ||||
|  | ||||
| extern int ZEXPORT zipRemoveExtraInfoBlock OF((char* pData, int* dataLen, short sHeader)); | ||||
| /* | ||||
|   zipRemoveExtraInfoBlock -  Added by Mathias Svensson | ||||
|  | ||||
|   Remove extra information block from a extra information data for the local file header or central directory header | ||||
|  | ||||
|   It is needed to remove ZIP64 extra information blocks when before data is written if using RAW mode. | ||||
|  | ||||
|   0x0001 is the signature header for the ZIP64 extra information blocks | ||||
|  | ||||
|   usage. | ||||
|                         Remove ZIP64 Extra information from a central director extra field data | ||||
|               zipRemoveExtraInfoBlock(pCenDirExtraFieldData, &nCenDirExtraFieldDataLen, 0x0001); | ||||
|  | ||||
|                         Remove ZIP64 Extra information from a Local File Header extra field data | ||||
|         zipRemoveExtraInfoBlock(pLocalHeaderExtraFieldData, &nLocalHeaderExtraFieldDataLen, 0x0001); | ||||
| */ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* _zip64_H */ | ||||
		Reference in New Issue
	
	Block a user