mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	Define bridge interface to minizip IOAPI
This commit is contained in:
		| @@ -19,6 +19,7 @@ set(lib_SRCS | ||||
| 		filesystem/CZipLoader.cpp | ||||
| 		filesystem/Filesystem.cpp | ||||
| 		filesystem/ResourceID.cpp | ||||
|                 filesystem/MinizipExtensions.cpp | ||||
|  | ||||
| 		mapObjects/CArmedInstance.cpp | ||||
| 		mapObjects/CBank.cpp | ||||
|   | ||||
| @@ -222,6 +222,7 @@ | ||||
| 		<Unit filename="filesystem/CFileInputStream.h" /> | ||||
| 		<Unit filename="filesystem/CFilesystemLoader.cpp" /> | ||||
| 		<Unit filename="filesystem/CFilesystemLoader.h" /> | ||||
| 		<Unit filename="filesystem/CInputOutputStream.h" /> | ||||
| 		<Unit filename="filesystem/CInputStream.h" /> | ||||
| 		<Unit filename="filesystem/CMemoryBuffer.cpp" /> | ||||
| 		<Unit filename="filesystem/CMemoryBuffer.h" /> | ||||
| @@ -234,6 +235,8 @@ | ||||
| 		<Unit filename="filesystem/Filesystem.cpp" /> | ||||
| 		<Unit filename="filesystem/Filesystem.h" /> | ||||
| 		<Unit filename="filesystem/ISimpleResourceLoader.h" /> | ||||
| 		<Unit filename="filesystem/MinizipExtensions.cpp" /> | ||||
| 		<Unit filename="filesystem/MinizipExtensions.h" /> | ||||
| 		<Unit filename="filesystem/ResourceID.cpp" /> | ||||
| 		<Unit filename="filesystem/ResourceID.h" /> | ||||
| 		<Unit filename="int3.h" /> | ||||
|   | ||||
							
								
								
									
										9
									
								
								lib/filesystem/CInputOutputStream.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								lib/filesystem/CInputOutputStream.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "CInputStream.h" | ||||
| #include "COutputStream.h" | ||||
|  | ||||
| class CInputOutputStream: public CInputStream, public COutputStream | ||||
| { | ||||
| 	 | ||||
| }; | ||||
| @@ -18,7 +18,7 @@ CMemoryBuffer::CMemoryBuffer(): | ||||
| 	 | ||||
| } | ||||
|  | ||||
| si64 CMemoryBuffer::write(ui8 * data, si64 size) | ||||
| si64 CMemoryBuffer::write(const ui8 * data, si64 size) | ||||
| { | ||||
| 	buffer.reserve(tell()+size); | ||||
| 	 | ||||
|   | ||||
| @@ -11,14 +11,14 @@ | ||||
|  */ | ||||
|   | ||||
|  | ||||
| #include "CInputStream.h" | ||||
| #include "COutputStream.h" | ||||
| #include "CInputOutputStream.h" | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * A class which provides IO memory buffer. | ||||
|  */ | ||||
|   | ||||
| class DLL_LINKAGE CMemoryBuffer : public CInputStream, public COutputStream | ||||
| class DLL_LINKAGE CMemoryBuffer : public CInputOutputStream | ||||
| { | ||||
| public: | ||||
| 	typedef std::vector<ui8> TBuffer; | ||||
| @@ -36,7 +36,7 @@ public: | ||||
| 	 * @param size The number of bytes to write. | ||||
| 	 * @return the number of bytes written actually. | ||||
| 	 */ | ||||
| 	si64 write(ui8 * data, si64 size) override;	 | ||||
| 	si64 write(const ui8 * data, si64 size) override;	 | ||||
|  | ||||
| 	/** | ||||
| 	 * Reads n bytes from the stream into the data buffer. | ||||
|   | ||||
| @@ -30,5 +30,5 @@ public: | ||||
| 	 * @param size The number of bytes to write. | ||||
| 	 * @return the number of bytes written actually. | ||||
| 	 */ | ||||
| 	virtual si64 write(ui8 * data, si64 size) = 0; | ||||
| 	virtual si64 write(const ui8 * data, si64 size) = 0; | ||||
| }; | ||||
|   | ||||
							
								
								
									
										106
									
								
								lib/filesystem/MinizipExtensions.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								lib/filesystem/MinizipExtensions.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,106 @@ | ||||
| /* | ||||
|  * MinizipExtensions.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 | ||||
|  * | ||||
|  */ | ||||
| #include "StdInc.h" | ||||
|  | ||||
| #include "MinizipExtensions.h" | ||||
|  | ||||
| static voidpf ZCALLBACK openFileProxy(voidpf opaque, const void * filename, int mode) | ||||
| { | ||||
| 	assert(opaque != nullptr); | ||||
| 	 | ||||
| 	std::string filename_s; | ||||
| 	 | ||||
| 	if(filename != nullptr) | ||||
| 		filename_s = (const char *)filename; | ||||
| 	 | ||||
| 	return ((CIOApi *)opaque)->openFile(filename_s, mode); | ||||
| } | ||||
|  | ||||
| static uLong ZCALLBACK readFileProxy(voidpf opaque, voidpf stream, void * buf, uLong size) | ||||
| { | ||||
| 	assert(opaque != nullptr); | ||||
| 	assert(stream != nullptr); | ||||
| 	 | ||||
| 	CInputOutputStream * actualStream = static_cast<CInputOutputStream *>(stream); | ||||
| 	 | ||||
| 	return actualStream->read((ui8 *)buf, size); | ||||
| } | ||||
|  | ||||
| static uLong ZCALLBACK writeFileProxy(voidpf opaque, voidpf stream, const void * buf, uLong size) | ||||
| { | ||||
| 	assert(opaque != nullptr); | ||||
| 	assert(stream != nullptr); | ||||
|  | ||||
| 	CInputOutputStream * actualStream = static_cast<CInputOutputStream *>(stream); | ||||
|     return (uLong)actualStream->write((const ui8 *)buf, size); | ||||
| } | ||||
|  | ||||
| static ZPOS64_T ZCALLBACK tellFileProxy(voidpf opaque, voidpf stream) | ||||
| { | ||||
| 	assert(opaque != nullptr); | ||||
| 	assert(stream != nullptr); | ||||
| 	 | ||||
| 	CInputOutputStream * actualStream = static_cast<CInputOutputStream *>(stream);	 | ||||
|     return actualStream->tell(); | ||||
| } | ||||
|  | ||||
| static long ZCALLBACK seekFileProxy(voidpf  opaque, voidpf stream, ZPOS64_T offset, int origin) | ||||
| { | ||||
| 	assert(opaque != nullptr); | ||||
| 	assert(stream != nullptr); | ||||
| 		 | ||||
| 	CInputOutputStream * actualStream = static_cast<CInputOutputStream *>(stream);	 | ||||
|  | ||||
|     long ret = 0; | ||||
|     switch (origin) | ||||
|     { | ||||
|     case ZLIB_FILEFUNC_SEEK_CUR : | ||||
|         actualStream->skip(offset);//TODO: should we check actual skipped?  | ||||
|         break; | ||||
|     case ZLIB_FILEFUNC_SEEK_END : | ||||
|     	ret = -1; | ||||
|         break; | ||||
|     case ZLIB_FILEFUNC_SEEK_SET : | ||||
|     	ret = actualStream->seek(offset); | ||||
|         break; | ||||
|     default: ret = -1; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| static int ZCALLBACK closeFileProxy(voidpf opaque, voidpf stream) | ||||
| { | ||||
| 	assert(opaque != nullptr); | ||||
| 	assert(stream != nullptr); | ||||
| 		 | ||||
| 	CInputOutputStream * actualStream = static_cast<CInputOutputStream *>(stream); | ||||
| 	 | ||||
| 	delete actualStream; | ||||
| 	 | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int ZCALLBACK errorFileProxy(voidpf opaque, voidpf stream) | ||||
| { | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| void CIOApi::fillApiStructure(zlib_filefunc64_def & api) | ||||
| { | ||||
| 	api.opaque = this; | ||||
| 	api.zopen64_file = &openFileProxy; | ||||
| 	api.zread_file = &readFileProxy; | ||||
| 	api.zwrite_file = &writeFileProxy; | ||||
| 	api.ztell64_file = &tellFileProxy; | ||||
| 	api.zseek64_file = &seekFileProxy; | ||||
| 	api.zclose_file = &closeFileProxy; | ||||
| 	api.zerror_file = &errorFileProxy;	 | ||||
| } | ||||
|  | ||||
							
								
								
									
										34
									
								
								lib/filesystem/MinizipExtensions.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								lib/filesystem/MinizipExtensions.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| #pragma once | ||||
|  | ||||
| /* | ||||
|  * MinizipExtensions.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 | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #ifdef USE_SYSTEM_MINIZIP | ||||
| #include <minizip/unzip.h> | ||||
| #include <minizip/zip.h> | ||||
| #include <minizip/ioapi.h> | ||||
| #else | ||||
| #include "../minizip/unzip.h" | ||||
| #include "../minizip/zip.h" | ||||
| #include "../minizip/ioapi.h" | ||||
| #endif | ||||
|  | ||||
| #include "CInputOutputStream.h" | ||||
|  | ||||
| class CIOApi | ||||
| { | ||||
| public: | ||||
| 	virtual ~CIOApi(){}; | ||||
| 	 | ||||
| 	void fillApiStructure(zlib_filefunc64_def & api); | ||||
| 	 | ||||
| 	virtual CInputOutputStream * openFile(const std::string & filename, int mode) = 0;	 | ||||
|  | ||||
| }; | ||||
		Reference in New Issue
	
	Block a user