MinizipExtensions.h 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * MinizipExtensions.h, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #pragma once
  11. #ifdef USE_SYSTEM_MINIZIP
  12. #include <minizip/unzip.h>
  13. #include <minizip/zip.h>
  14. #include <minizip/ioapi.h>
  15. #else
  16. #include "../minizip/unzip.h"
  17. #include "../minizip/zip.h"
  18. #include "../minizip/ioapi.h"
  19. #endif
  20. // system zlib on old Androids isn't capable of using _64 functions: https://github.com/madler/zlib/pull/436
  21. #if defined(__ANDROID_API__) && (__ANDROID_API__ < 24)
  22. #define MINIZIP_NEEDS_32BIT_FUNCS 1
  23. #endif
  24. VCMI_LIB_NAMESPACE_BEGIN
  25. class CInputStream;
  26. class CInputOutputStream;
  27. class CMemoryBuffer;
  28. class DLL_LINKAGE CIOApi
  29. {
  30. public:
  31. virtual ~CIOApi() = default;
  32. virtual zlib_filefunc64_def getApiStructure() = 0;
  33. };
  34. ///redirects back to minizip ioapi
  35. //todo: replace with Virtual FileSystem interface
  36. class DLL_LINKAGE CDefaultIOApi: public CIOApi
  37. {
  38. public:
  39. zlib_filefunc64_def getApiStructure() override;
  40. #if MINIZIP_NEEDS_32BIT_FUNCS
  41. zlib_filefunc_def getApiStructure32();
  42. #endif
  43. };
  44. ///redirects all file IO to single stream
  45. class DLL_LINKAGE CProxyIOApi: public CIOApi
  46. {
  47. public:
  48. CProxyIOApi(CInputOutputStream * buffer);
  49. ~CProxyIOApi() override;
  50. zlib_filefunc64_def getApiStructure() override;
  51. private:
  52. CInputOutputStream * openFile(const boost::filesystem::path & filename, int mode);
  53. CInputOutputStream * data;
  54. static voidpf ZCALLBACK openFileProxy(voidpf opaque, const void * filename, int mode);
  55. static uLong ZCALLBACK readFileProxy(voidpf opaque, voidpf stream, void * buf, uLong size);
  56. static uLong ZCALLBACK writeFileProxy(voidpf opaque, voidpf stream, const void * buf, uLong size);
  57. static ZPOS64_T ZCALLBACK tellFileProxy(voidpf opaque, voidpf stream);
  58. static long ZCALLBACK seekFileProxy(voidpf opaque, voidpf stream, ZPOS64_T offset, int origin);
  59. static int ZCALLBACK closeFileProxy(voidpf opaque, voidpf stream);
  60. static int ZCALLBACK errorFileProxy(voidpf opaque, voidpf stream);
  61. };
  62. ///redirects all file IO to single stream read-only
  63. class DLL_LINKAGE CProxyROIOApi: public CIOApi
  64. {
  65. public:
  66. CProxyROIOApi(CInputStream * buffer);
  67. ~CProxyROIOApi() override;
  68. zlib_filefunc64_def getApiStructure() override;
  69. private:
  70. CInputStream * openFile(const boost::filesystem::path & filename, int mode);
  71. CInputStream * data;
  72. static voidpf ZCALLBACK openFileProxy(voidpf opaque, const void * filename, int mode);
  73. static uLong ZCALLBACK readFileProxy(voidpf opaque, voidpf stream, void * buf, uLong size);
  74. static uLong ZCALLBACK writeFileProxy(voidpf opaque, voidpf stream, const void * buf, uLong size);
  75. static ZPOS64_T ZCALLBACK tellFileProxy(voidpf opaque, voidpf stream);
  76. static long ZCALLBACK seekFileProxy(voidpf opaque, voidpf stream, ZPOS64_T offset, int origin);
  77. static int ZCALLBACK closeFileProxy(voidpf opaque, voidpf stream);
  78. static int ZCALLBACK errorFileProxy(voidpf opaque, voidpf stream);
  79. };
  80. VCMI_LIB_NAMESPACE_END