1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-02-21 19:19:26 +02:00

use 32-bit minizip file funcs on old Android

This commit is contained in:
Andrey Filipenkov 2024-02-06 01:29:13 +03:00
parent d321a01e1b
commit 5a58edde22
4 changed files with 35 additions and 7 deletions

View File

@ -181,12 +181,17 @@ std::vector<std::string> ZipArchive::listFiles()
ZipArchive::ZipArchive(const boost::filesystem::path & from)
{
CDefaultIOApi zipAPI;
auto zipStructure = zipAPI.getApiStructure();
#if MINIZIP_NEEDS_32BIT_FUNCS
auto zipStructure = zipAPI.getApiStructure32();
archive = unzOpen2(from.c_str(), &zipStructure);
#else
auto zipStructure = zipAPI.getApiStructure();
archive = unzOpen2_64(from.c_str(), &zipStructure);
#endif
if (archive == nullptr)
throw std::runtime_error("Failed to open file" + from.string() + "'%s'! Unable to list files!");
throw std::runtime_error("Failed to open file '" + from.string() + "' - unable to list files!");
}
ZipArchive::~ZipArchive()

View File

@ -50,7 +50,7 @@ class DLL_LINKAGE CZipLoader : public ISimpleResourceLoader
std::unordered_map<ResourcePath, unz64_file_pos> listFiles(const std::string & mountPoint, const boost::filesystem::path &archive);
public:
CZipLoader(const std::string & mountPoint, const boost::filesystem::path & archive, std::shared_ptr<CIOApi> api = std::shared_ptr<CIOApi>(new CDefaultIOApi()));
CZipLoader(const std::string & mountPoint, const boost::filesystem::path & archive, std::shared_ptr<CIOApi> api = std::make_shared<CDefaultIOApi>());
/// Interface implementation
/// @see ISimpleResourceLoader

View File

@ -12,6 +12,8 @@
#include "CMemoryBuffer.h"
#include <mutex>
VCMI_LIB_NAMESPACE_BEGIN
template<class Stream>
@ -130,16 +132,29 @@ static voidpf ZCALLBACK MinizipOpenFunc(voidpf opaque, const void* filename, int
zlib_filefunc64_def CDefaultIOApi::getApiStructure()
{
static zlib_filefunc64_def MinizipFilefunc;
static bool initialized = false;
if (!initialized)
static std::once_flag flag;
std::call_once(flag, []
{
fill_fopen64_filefunc(&MinizipFilefunc);
MinizipFilefunc.zopen64_file = &MinizipOpenFunc;
initialized = true;
}
});
return MinizipFilefunc;
}
#if MINIZIP_NEEDS_32BIT_FUNCS
zlib_filefunc_def CDefaultIOApi::getApiStructure32()
{
static zlib_filefunc_def MinizipFilefunc;
static std::once_flag flag;
std::call_once(flag, []
{
fill_fopen_filefunc(&MinizipFilefunc);
MinizipFilefunc.zopen_file = reinterpret_cast<void*(*)(void*, const char*, int)>(&MinizipOpenFunc);
});
return MinizipFilefunc;
}
#endif
///CProxyIOApi
CProxyIOApi::CProxyIOApi(CInputOutputStream * buffer):
data(buffer)

View File

@ -19,6 +19,11 @@
#include "../minizip/ioapi.h"
#endif
// system zlib on old Androids isn't capable of using _64 functions: https://github.com/madler/zlib/pull/436
#if defined(__ANDROID_API__) && (__ANDROID_API__ < 24)
#define MINIZIP_NEEDS_32BIT_FUNCS 1
#endif
VCMI_LIB_NAMESPACE_BEGIN
class CInputStream;
@ -39,6 +44,9 @@ class DLL_LINKAGE CDefaultIOApi: public CIOApi
{
public:
zlib_filefunc64_def getApiStructure() override;
#if MINIZIP_NEEDS_32BIT_FUNCS
zlib_filefunc_def getApiStructure32();
#endif
};
///redirects all file IO to single stream