4#include "Stroika/Foundation/StroikaPreComp.h"
13#include "Stroika/Foundation/Streams/MemoryStream.h"
146#if qStroika_HasComponent_zlib
151using namespace Stroika::Foundation::DataExchange::Archive;
156 constexpr uint32_t MAXU32 = numeric_limits<uint32_t>::max ();
161#define CRC32(c, b) ((*(pcrc_32_tab + (((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
164 int decrypt_byte (
unsigned long* pkeys, [[maybe_unused]]
const z_crc_t* pcrc_32_tab)
169 temp = ((unsigned)(*(pkeys + 2)) & 0xffff) | 2;
170 return (
int)(((temp * (temp ^ 1)) >> 8) & 0xff);
174 int update_keys (
unsigned long* pkeys,
const z_crc_t* pcrc_32_tab,
int c)
176 (*(pkeys + 0)) = CRC32 ((*(pkeys + 0)), c);
177 (*(pkeys + 1)) += (*(pkeys + 0)) & 0xff;
178 (*(pkeys + 1)) = (*(pkeys + 1)) * 134775813L + 1;
180 int keyshift = (int)((*(pkeys + 1)) >> 24);
181 (*(pkeys + 2)) = CRC32 ((*(pkeys + 2)), keyshift);
187 void init_keys (
const char* passwd,
unsigned long* pkeys,
const z_crc_t* pcrc_32_tab)
189 *(pkeys + 0) = 305419896L;
190 *(pkeys + 1) = 591751049L;
191 *(pkeys + 2) = 878082192L;
192 while (*passwd !=
'\0') {
193 update_keys (pkeys, pcrc_32_tab, (
int)*passwd);
198#define zdecode(pkeys, pcrc_32_tab, c) (update_keys (pkeys, pcrc_32_tab, c ^= decrypt_byte (pkeys, pcrc_32_tab)))
200#define zencode(pkeys, pcrc_32_tab, c, t) (t = decrypt_byte (pkeys, pcrc_32_tab), update_keys (pkeys, pcrc_32_tab, c), t ^ (c))
202#define RAND_HEAD_LEN 12
205 constexpr unsigned int ZCR_SEED2 = 3141592654UL;
207 int crypthead (
const char* passwd,
209 int bufSize,
unsigned long* pkeys,
const z_crc_t* pcrc_32_tab,
unsigned long crcForCrypting)
214 unsigned char header[RAND_HEAD_LEN - 2];
215 static unsigned calls = 0;
217 if (bufSize < RAND_HEAD_LEN)
225 srand ((
unsigned)(time (NULL) ^ ZCR_SEED2));
227 init_keys (passwd, pkeys, pcrc_32_tab);
228 for (n = 0; n < RAND_HEAD_LEN - 2; n++) {
229 c = (rand () >> 7) & 0xff;
230 header[n] = (
unsigned char)zencode (pkeys, pcrc_32_tab, c, t);
233 init_keys (passwd, pkeys, pcrc_32_tab);
234 for (n = 0; n < RAND_HEAD_LEN - 2; n++) {
235 buf[n] = (
unsigned char)zencode (pkeys, pcrc_32_tab, header[n], t);
237 buf[n++] = (
unsigned char)zencode (pkeys, pcrc_32_tab, (
int)(crcForCrypting >> 16) & 0xff, t);
238 buf[n++] = (
unsigned char)zencode (pkeys, pcrc_32_tab, (
int)(crcForCrypting >> 24) & 0xff, t);
247#ifdef HAVE_MINIZIP64_CONF_H
251 typedef uint64_t ZPOS64_T;
253#define ZLIB_FILEFUNC_SEEK_CUR (1)
254#define ZLIB_FILEFUNC_SEEK_END (2)
255#define ZLIB_FILEFUNC_SEEK_SET (0)
257#define ZLIB_FILEFUNC_MODE_READ (1)
258#define ZLIB_FILEFUNC_MODE_WRITE (2)
259#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
261#define ZLIB_FILEFUNC_MODE_EXISTING (4)
262#define ZLIB_FILEFUNC_MODE_CREATE (8)
264 typedef voidpf (*open_file_func) (voidpf opaque,
const char* filename,
int mode);
265 typedef uLong (*read_file_func) (voidpf opaque, voidpf stream,
void* buf, uLong size);
266 typedef uLong (*write_file_func) (voidpf opaque, voidpf stream,
const void* buf, uLong size);
267 typedef int (*close_file_func) (voidpf opaque, voidpf stream);
268 typedef int (*testerror_file_func) (voidpf opaque, voidpf stream);
270 typedef long (*tell_file_func) (voidpf opaque, voidpf stream);
271 typedef long (*seek_file_func) (voidpf opaque, voidpf stream, uLong offset,
int origin);
274 struct zlib_filefunc_def {
275 open_file_func zopen_file;
276 read_file_func zread_file;
277 write_file_func zwrite_file;
278 tell_file_func ztell_file;
279 seek_file_func zseek_file;
280 close_file_func zclose_file;
281 testerror_file_func zerror_file;
285 typedef ZPOS64_T (*tell64_file_func) (voidpf opaque, voidpf stream);
286 typedef long (*seek64_file_func) (voidpf opaque, voidpf stream, ZPOS64_T offset,
int origin);
287 typedef voidpf (*open64_file_func) (voidpf opaque,
const void* filename,
int mode);
289 struct zlib_filefunc64_def {
290 open64_file_func zopen64_file;
291 read_file_func zread_file;
292 write_file_func zwrite_file;
293 tell64_file_func ztell64_file;
294 seek64_file_func zseek64_file;
295 close_file_func zclose_file;
296 testerror_file_func zerror_file;
301 struct zlib_filefunc64_32_def {
302 zlib_filefunc64_def zfile_func64;
303 open_file_func zopen32_file;
304 tell_file_func ztell32_file;
305 seek_file_func zseek32_file;
308#define ZREAD64(filefunc, filestream, buf, size) \
309 ((*((filefunc).zfile_func64.zread_file)) ((filefunc).zfile_func64.opaque, filestream, buf, size))
310#define ZWRITE64(filefunc, filestream, buf, size) \
311 ((*((filefunc).zfile_func64.zwrite_file)) ((filefunc).zfile_func64.opaque, filestream, buf, size))
312#define ZCLOSE64(filefunc, filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque, filestream))
313#define ZERROR64(filefunc, filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque, filestream))
315 voidpf call_zopen64 (
const zlib_filefunc64_32_def* pfilefunc,
const void* filename,
int mode);
316 long call_zseek64 (
const zlib_filefunc64_32_def* pfilefunc, voidpf filestream, ZPOS64_T offset,
int origin);
317 ZPOS64_T call_ztell64 (
const zlib_filefunc64_32_def* pfilefunc, voidpf filestream);
319 void fill_zlib_filefunc64_32_def_from_filefunc32 (zlib_filefunc64_32_def* p_filefunc64_32,
const zlib_filefunc_def* p_filefunc32);
321#define ZOPEN64(filefunc, filename, mode) (call_zopen64 ((&(filefunc)), (filename), (mode)))
322#define ZTELL64(filefunc, filestream) (call_ztell64 ((&(filefunc)), (filestream)))
323#define ZSEEK64(filefunc, filestream, pos, mode) (call_zseek64 ((&(filefunc)), (filestream), (pos), (mode)))
332#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
335 typedef struct TagunzFile__ {
338 typedef unzFile__* unzFile;
340 typedef voidp unzFile;
344#define UNZ_END_OF_LIST_OF_FILE (-100)
345#define UNZ_ERRNO (Z_ERRNO)
347#define UNZ_PARAMERROR (-102)
348#define UNZ_BADZIPFILE (-103)
349#define UNZ_INTERNALERROR (-104)
350#define UNZ_CRCERROR (-105)
364 struct unz_global_info64 {
365 ZPOS64_T number_entry;
370 struct unz_global_info {
377 struct unz_file_info64 {
379 uLong version_needed;
381 uLong compression_method;
384 ZPOS64_T compressed_size;
385 ZPOS64_T uncompressed_size;
387 uLong size_file_extra;
388 uLong size_file_comment;
390 uLong disk_num_start;
397 struct unz_file_info {
399 uLong version_needed;
401 uLong compression_method;
404 uLong compressed_size;
405 uLong uncompressed_size;
407 uLong size_file_extra;
408 uLong size_file_comment;
410 uLong disk_num_start;
417 int unzStringFileNameCompare (
const char* fileName1,
const char* fileName2,
int iCaseSensitivity);
441 unzFile unzOpen (
const char* path);
442 unzFile unzOpen64 (
const void* path);
448 unzFile unzOpen2 (
const char* path, zlib_filefunc_def* pzlib_filefunc_def);
454 unzFile unzOpen2_64 (
const void* path, zlib_filefunc64_def* pzlib_filefunc_def);
456 int unzClose (unzFile file);
463 int unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info);
469 int unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info);
476 int unzGetGlobalComment (unzFile file,
char* szComment, uLong uSizeBuf);
485 int unzGoToFirstFile (unzFile file);
492 int unzGoToNextFile_ (unzFile file);
502 int unzLocateFile_ (unzFile file,
const char* szFileName,
int iCaseSensitivity);
507 struct unz_file_pos {
508 uLong pos_in_zip_directory;
512 int unzGetFilePos (unzFile file, unz_file_pos* file_pos);
514 int unzGoToFilePos (unzFile file, unz_file_pos* file_pos);
516 struct unz64_file_pos {
517 ZPOS64_T pos_in_zip_directory;
518 ZPOS64_T num_of_file;
521 int unzGetFilePos64 (unzFile file, unz64_file_pos* file_pos);
523 int unzGoToFilePos64 (unzFile file,
const unz64_file_pos* file_pos);
526 int unzGetCurrentFileInfo64 (unzFile file, unz_file_info64* pfile_info,
char* szFileName, uLong fileNameBufferSize,
void* extraField,
527 uLong extraFieldBufferSize,
char* szComment, uLong commentBufferSize);
529 int unzGetCurrentFileInfo (unzFile file, unz_file_info* pfile_info,
char* szFileName, uLong fileNameBufferSize,
void* extraField,
530 uLong extraFieldBufferSize,
char* szComment, uLong commentBufferSize);
544 ZPOS64_T unzGetCurrentFileZStreamPos64 (unzFile file);
554 int unzOpenCurrentFile (unzFile file);
561 int unzOpenCurrentFilePassword (unzFile file,
const char* password);
571 int unzOpenCurrentFile2 (unzFile file,
int* method,
int* level,
int raw);
581 int unzOpenCurrentFile3_ (unzFile file,
int* method,
int* level,
int raw,
const char* password);
587 int unzCloseCurrentFile_ (unzFile file);
599 int unzReadCurrentFile_ (unzFile file, voidp buf,
unsigned len);
601 z_off_t unztell (unzFile file);
603 ZPOS64_T unztell64 (unzFile file);
611 int unzeof (unzFile file);
625 int unzGetLocalExtrafield (unzFile file, voidp buf,
unsigned len);
630 ZPOS64_T unzGetOffset64 (unzFile file);
631 uLong unzGetOffset (unzFile file);
634 int unzSetOffset64 (unzFile file, ZPOS64_T pos);
635 int unzSetOffset (unzFile file, uLong pos);
653 voidpf call_zopen64 (
const zlib_filefunc64_32_def* pfilefunc,
const void* filename,
int mode)
655 if (pfilefunc->zfile_func64.zopen64_file != NULL)
656 return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque, filename, mode);
658 return (*(pfilefunc->zopen32_file)) (pfilefunc->zfile_func64.opaque, (
const char*)filename, mode);
661 long call_zseek64 (
const zlib_filefunc64_32_def* pfilefunc, voidpf filestream, ZPOS64_T offset,
int origin)
663 if (pfilefunc->zfile_func64.zseek64_file != NULL)
664 return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque, filestream, offset, origin);
666 uLong offsetTruncated = (uLong)offset;
667 if (offsetTruncated != offset)
670 return (*(pfilefunc->zseek32_file)) (pfilefunc->zfile_func64.opaque, filestream, offsetTruncated, origin);
673 ZPOS64_T call_ztell64 (
const zlib_filefunc64_32_def* pfilefunc, voidpf filestream)
675 if (pfilefunc->zfile_func64.zseek64_file != NULL)
676 return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque, filestream);
678 uLong tell_uLong = (*(pfilefunc->ztell32_file)) (pfilefunc->zfile_func64.opaque, filestream);
679 if ((tell_uLong) == numeric_limits<uLong>::max ())
685 void fill_zlib_filefunc64_32_def_from_filefunc32 (zlib_filefunc64_32_def* p_filefunc64_32,
const zlib_filefunc_def* p_filefunc32)
687 p_filefunc64_32->zfile_func64.zopen64_file = NULL;
688 p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file;
689 p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
690 p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file;
691 p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file;
692 p_filefunc64_32->zfile_func64.ztell64_file = NULL;
693 p_filefunc64_32->zfile_func64.zseek64_file = NULL;
694 p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file;
695 p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
696 p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque;
697 p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file;
698 p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file;
710#ifndef CASESENSITIVITYDEFAULT_NO
711#if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
712#define CASESENSITIVITYDEFAULT_NO
717#define UNZ_BUFSIZE (16384)
720#ifndef UNZ_MAXFILENAMEINZIP
721#define UNZ_MAXFILENAMEINZIP (256)
725#define ALLOC(size) (malloc (size))
735#define SIZECENTRALDIRITEM (0x2e)
736#define SIZEZIPLOCALHEADER (0x1e)
741 typedef struct unz_file_info64_internal_s {
742 ZPOS64_T offset_curfile;
743 } unz_file_info64_internal;
755 ZPOS64_T pos_in_zipfile;
756 uLong stream_initialised;
758 ZPOS64_T offset_local_extrafield;
759 uInt size_local_extrafield;
760 ZPOS64_T pos_local_extrafield;
761 ZPOS64_T total_out_64;
765 ZPOS64_T rest_read_compressed;
766 ZPOS64_T rest_read_uncompressed;
767 zlib_filefunc64_32_def z_filefunc;
769 uLong compression_method;
770 ZPOS64_T byte_before_the_zipfile;
772 } file_in_zip64_read_info_s;
777 zlib_filefunc64_32_def z_filefunc;
778 int is64bitOpenFunction;
780 unz_global_info64 gi;
781 ZPOS64_T byte_before_the_zipfile;
783 ZPOS64_T pos_in_central_dir;
784 ZPOS64_T current_file_ok;
785 ZPOS64_T central_pos;
787 ZPOS64_T size_central_dir;
788 ZPOS64_T offset_central_dir;
791 unz_file_info64 cur_file_info;
792 unz_file_info64_internal cur_file_info_internal;
793 file_in_zip64_read_info_s* pfile_in_zip_read;
800 unsigned long keys[3];
801 const z_crc_t* pcrc_32_tab;
810 int unz64local_getByte (
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream,
int* pi)
813 int err = (int)ZREAD64 (*pzlib_filefunc_def, filestream, &c, 1);
819 if (ZERROR64 (*pzlib_filefunc_def, filestream))
829 int unz64local_getShort (
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX)
835 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
839 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
840 x |= ((uLong)i) << 8;
849 int unz64local_getLong (
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX)
855 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
859 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
860 x |= ((uLong)i) << 8;
863 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
864 x |= ((uLong)i) << 16;
867 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
868 x += ((uLong)i) << 24;
877 int unz64local_getLong64 (
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T* pX)
883 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
887 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
888 x |= ((ZPOS64_T)i) << 8;
891 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
892 x |= ((ZPOS64_T)i) << 16;
895 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
896 x |= ((ZPOS64_T)i) << 24;
899 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
900 x |= ((ZPOS64_T)i) << 32;
903 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
904 x |= ((ZPOS64_T)i) << 40;
907 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
908 x |= ((ZPOS64_T)i) << 48;
911 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
912 x |= ((ZPOS64_T)i) << 56;
922 int strcmpcasenosensitive_internal (
const char* fileName1,
const char* fileName2)
925 char c1 = *(fileName1++);
926 char c2 = *(fileName2++);
927 if ((c1 >=
'a') and (c1 <=
'z'))
929 if ((c2 >=
'a') and (c2 <=
'z'))
932 return ((c2 ==
'\0') ? 0 : -1);
942#ifdef CASESENSITIVITYDEFAULT_NO
943#define CASESENSITIVITYDEFAULTVALUE 2
945#define CASESENSITIVITYDEFAULTVALUE 1
948#ifndef STRCMPCASENOSENTIVEFUNCTION
949#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
961 int unzStringFileNameCompare (
const char* fileName1,
const char* fileName2,
int iCaseSensitivity)
964 if (iCaseSensitivity == 0)
965 iCaseSensitivity = CASESENSITIVITYDEFAULTVALUE;
967 if (iCaseSensitivity == 1)
968 return strcmp (fileName1, fileName2);
970 return STRCMPCASENOSENTIVEFUNCTION (fileName1, fileName2);
973 constexpr size_t BUFREADCOMMENT = 0x400;
979 ZPOS64_T unz64local_SearchCentralDir (
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)
981 ZPOS64_T uPosFound = 0;
983 if (ZSEEK64 (*pzlib_filefunc_def, filestream, 0, ZLIB_FILEFUNC_SEEK_END) != 0)
986 ZPOS64_T uSizeFile = ZTELL64 (*pzlib_filefunc_def, filestream);
988 ZPOS64_T uMaxBack = 0xffff;
989 if (uMaxBack > uSizeFile)
990 uMaxBack = uSizeFile;
992 unsigned char* buf = (
unsigned char*)ALLOC (BUFREADCOMMENT + 4);
996 ZPOS64_T uBackRead = 4;
997 while (uBackRead < uMaxBack) {
1001 if (uBackRead + BUFREADCOMMENT > uMaxBack)
1002 uBackRead = uMaxBack;
1004 uBackRead += BUFREADCOMMENT;
1005 uReadPos = uSizeFile - uBackRead;
1007 uReadSize = ((BUFREADCOMMENT + 4) < (uSizeFile - uReadPos)) ? (BUFREADCOMMENT + 4) : (uLong)(uSizeFile - uReadPos);
1008 if (ZSEEK64 (*pzlib_filefunc_def, filestream, uReadPos, ZLIB_FILEFUNC_SEEK_SET) != 0)
1011 if (ZREAD64 (*pzlib_filefunc_def, filestream, buf, uReadSize) != uReadSize)
1014 for (i = (
int)uReadSize - 3; i-- > 0;)
1015 if (((*(buf + i)) == 0x50) and ((*(buf + i + 1)) == 0x4b) && ((*(buf + i + 2)) == 0x05) and ((*(buf + i + 3)) == 0x06)) {
1016 uPosFound = uReadPos + i;
1031 ZPOS64_T unz64local_SearchCentralDir64 (
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)
1036 ZPOS64_T uMaxBack = 0xffff;
1037 ZPOS64_T uPosFound = 0;
1039 ZPOS64_T relativeOffset;
1041 if (ZSEEK64 (*pzlib_filefunc_def, filestream, 0, ZLIB_FILEFUNC_SEEK_END) != 0)
1044 uSizeFile = ZTELL64 (*pzlib_filefunc_def, filestream);
1046 if (uMaxBack > uSizeFile)
1047 uMaxBack = uSizeFile;
1049 buf = (
unsigned char*)ALLOC (BUFREADCOMMENT + 4);
1054 while (uBackRead < uMaxBack) {
1058 if (uBackRead + BUFREADCOMMENT > uMaxBack)
1059 uBackRead = uMaxBack;
1061 uBackRead += BUFREADCOMMENT;
1062 uReadPos = uSizeFile - uBackRead;
1064 uReadSize = ((BUFREADCOMMENT + 4) < (uSizeFile - uReadPos)) ? (BUFREADCOMMENT + 4) : (uLong)(uSizeFile - uReadPos);
1065 if (ZSEEK64 (*pzlib_filefunc_def, filestream, uReadPos, ZLIB_FILEFUNC_SEEK_SET) != 0)
1068 if (ZREAD64 (*pzlib_filefunc_def, filestream, buf, uReadSize) != uReadSize)
1071 for (i = (
int)uReadSize - 3; i-- > 0;)
1072 if (((*(buf + i)) == 0x50) and ((*(buf + i + 1)) == 0x4b) && ((*(buf + i + 2)) == 0x06) and ((*(buf + i + 3)) == 0x07)) {
1073 uPosFound = uReadPos + i;
1085 if (ZSEEK64 (*pzlib_filefunc_def, filestream, uPosFound, ZLIB_FILEFUNC_SEEK_SET) != 0)
1089 if (unz64local_getLong (pzlib_filefunc_def, filestream, &uL) != UNZ_OK)
1093 if (unz64local_getLong (pzlib_filefunc_def, filestream, &uL) != UNZ_OK)
1099 if (unz64local_getLong64 (pzlib_filefunc_def, filestream, &relativeOffset) != UNZ_OK)
1103 if (unz64local_getLong (pzlib_filefunc_def, filestream, &uL) != UNZ_OK)
1109 if (ZSEEK64 (*pzlib_filefunc_def, filestream, relativeOffset, ZLIB_FILEFUNC_SEEK_SET) != 0)
1113 if (unz64local_getLong (pzlib_filefunc_def, filestream, &uL) != UNZ_OK)
1116 if (uL != 0x06064b50)
1119 return relativeOffset;
1131 unzFile unzOpenInternal (
const void* path, zlib_filefunc64_32_def* pzlib_filefunc64_32_def,
int is64bitOpenFunction)
1135 ZPOS64_T central_pos;
1140 uLong number_disk_with_CD;
1142 ZPOS64_T number_entry_CD;
1148 us.z_filefunc.zseek32_file = NULL;
1149 us.z_filefunc.ztell32_file = NULL;
1152 us.z_filefunc = *pzlib_filefunc64_32_def;
1153 us.is64bitOpenFunction = is64bitOpenFunction;
1155 us.filestream = ZOPEN64 (us.z_filefunc, path, ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING);
1156 if (us.filestream == NULL)
1159 central_pos = unz64local_SearchCentralDir64 (&us.z_filefunc, us.filestream);
1166 if (ZSEEK64 (us.z_filefunc, us.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
1170 if (unz64local_getLong (&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
1174 if (unz64local_getLong64 (&us.z_filefunc, us.filestream, &uL64) != UNZ_OK)
1178 if (unz64local_getShort (&us.z_filefunc, us.filestream, &uS) != UNZ_OK)
1182 if (unz64local_getShort (&us.z_filefunc, us.filestream, &uS) != UNZ_OK)
1186 if (unz64local_getLong (&us.z_filefunc, us.filestream, &number_disk) != UNZ_OK)
1190 if (unz64local_getLong (&us.z_filefunc, us.filestream, &number_disk_with_CD) != UNZ_OK)
1194 if (unz64local_getLong64 (&us.z_filefunc, us.filestream, &us.gi.number_entry) != UNZ_OK)
1198 if (unz64local_getLong64 (&us.z_filefunc, us.filestream, &number_entry_CD) != UNZ_OK)
1201 if ((number_entry_CD != us.gi.number_entry) or (number_disk_with_CD != 0) or (number_disk != 0))
1202 err = UNZ_BADZIPFILE;
1205 if (unz64local_getLong64 (&us.z_filefunc, us.filestream, &us.size_central_dir) != UNZ_OK)
1210 if (unz64local_getLong64 (&us.z_filefunc, us.filestream, &us.offset_central_dir) != UNZ_OK)
1213 us.gi.size_comment = 0;
1216 central_pos = unz64local_SearchCentralDir (&us.z_filefunc, us.filestream);
1217 if (central_pos == 0)
1222 if (ZSEEK64 (us.z_filefunc, us.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
1226 if (unz64local_getLong (&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
1230 if (unz64local_getShort (&us.z_filefunc, us.filestream, &number_disk) != UNZ_OK)
1234 if (unz64local_getShort (&us.z_filefunc, us.filestream, &number_disk_with_CD) != UNZ_OK)
1238 if (unz64local_getShort (&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
1240 us.gi.number_entry = uL;
1243 if (unz64local_getShort (&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
1245 number_entry_CD = uL;
1247 if ((number_entry_CD != us.gi.number_entry) || (number_disk_with_CD != 0) || (number_disk != 0))
1248 err = UNZ_BADZIPFILE;
1251 if (unz64local_getLong (&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
1253 us.size_central_dir = uL;
1257 if (unz64local_getLong (&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
1259 us.offset_central_dir = uL;
1262 if (unz64local_getShort (&us.z_filefunc, us.filestream, &us.gi.size_comment) != UNZ_OK)
1266 if ((central_pos < us.offset_central_dir + us.size_central_dir) && (err == UNZ_OK))
1267 err = UNZ_BADZIPFILE;
1269 if (err != UNZ_OK) {
1270 ZCLOSE64 (us.z_filefunc, us.filestream);
1274 us.byte_before_the_zipfile = central_pos - (us.offset_central_dir + us.size_central_dir);
1275 us.central_pos = central_pos;
1276 us.pfile_in_zip_read = NULL;
1279 s = (unz64_s*)ALLOC (
sizeof (unz64_s));
1282 unzGoToFirstFile ((unzFile)s);
1287 unzFile unzOpen2 (
const char* path, zlib_filefunc_def* pzlib_filefunc32_def)
1289 if (pzlib_filefunc32_def != NULL) {
1290 zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
1291 fill_zlib_filefunc64_32_def_from_filefunc32 (&zlib_filefunc64_32_def_fill, pzlib_filefunc32_def);
1292 return unzOpenInternal (path, &zlib_filefunc64_32_def_fill, 0);
1295 return unzOpenInternal (path, NULL, 0);
1298 unzFile unzOpen2_64 (
const void* path, zlib_filefunc64_def* pzlib_filefunc_def)
1300 if (pzlib_filefunc_def != NULL) {
1301 zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
1302 zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;
1303 zlib_filefunc64_32_def_fill.ztell32_file = NULL;
1304 zlib_filefunc64_32_def_fill.zseek32_file = NULL;
1305 return unzOpenInternal (path, &zlib_filefunc64_32_def_fill, 1);
1308 return unzOpenInternal (path, NULL, 1);
1311 unzFile unzOpen (
const char* path)
1313 return unzOpenInternal (path, NULL, 0);
1316 unzFile unzOpen64 (
const void* path)
1318 return unzOpenInternal (path, NULL, 1);
1326 int unzClose (unzFile file)
1330 return UNZ_PARAMERROR;
1333 if (s->pfile_in_zip_read != NULL)
1334 unzCloseCurrentFile_ (file);
1336 ZCLOSE64 (s->z_filefunc, s->filestream);
1345 int unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info)
1349 return UNZ_PARAMERROR;
1351 *pglobal_info = s->gi;
1355 int unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32)
1359 return UNZ_PARAMERROR;
1362 pglobal_info32->number_entry = (uLong)s->gi.number_entry;
1363 pglobal_info32->size_comment = s->gi.size_comment;
1369 void unz64local_DosDateToTmuDate_ (ZPOS64_T ulDosDate, tm_unz* ptm)
1372 uDate = (ZPOS64_T)(ulDosDate >> 16);
1373 ptm->tm_mday = (uInt)(uDate & 0x1f);
1374 ptm->tm_mon = (uInt)((((uDate) & 0x1E0) / 0x20) - 1);
1375 ptm->tm_year = (uInt)(((uDate & 0x0FE00) / 0x0200) + 1980);
1377 ptm->tm_hour = (uInt)((ulDosDate & 0xF800) / 0x800);
1378 ptm->tm_min = (uInt)((ulDosDate & 0x7E0) / 0x20);
1379 ptm->tm_sec = (uInt)(2 * (ulDosDate & 0x1f));
1385 int unz64local_GetCurrentFileInfoInternal_ (unzFile file, unz_file_info64* pfile_info, unz_file_info64_internal* pfile_info_internal,
1386 char* szFileName, uLong fileNameBufferSize,
void* extraField, uLong extraFieldBufferSize,
1387 char* szComment, uLong commentBufferSize)
1390 unz_file_info64 file_info;
1391 unz_file_info64_internal file_info_internal;
1397 return UNZ_PARAMERROR;
1399 if (ZSEEK64 (s->z_filefunc, s->filestream, s->pos_in_central_dir + s->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)
1403 if (err == UNZ_OK) {
1404 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uMagic) != UNZ_OK)
1406 else if (uMagic != 0x02014b50)
1407 err = UNZ_BADZIPFILE;
1410 if (unz64local_getShort (&s->z_filefunc, s->filestream, &file_info.version) != UNZ_OK)
1413 if (unz64local_getShort (&s->z_filefunc, s->filestream, &file_info.version_needed) != UNZ_OK)
1416 if (unz64local_getShort (&s->z_filefunc, s->filestream, &file_info.flag) != UNZ_OK)
1419 if (unz64local_getShort (&s->z_filefunc, s->filestream, &file_info.compression_method) != UNZ_OK)
1422 if (unz64local_getLong (&s->z_filefunc, s->filestream, &file_info.dosDate) != UNZ_OK)
1425 unz64local_DosDateToTmuDate_ (file_info.dosDate, &file_info.tmu_date);
1427 if (unz64local_getLong (&s->z_filefunc, s->filestream, &file_info.crc) != UNZ_OK)
1432 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uL) != UNZ_OK)
1434 file_info.compressed_size = uL;
1439 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uL) != UNZ_OK)
1441 file_info.uncompressed_size = uL;
1444 if (unz64local_getShort (&s->z_filefunc, s->filestream, &file_info.size_filename) != UNZ_OK)
1447 if (unz64local_getShort (&s->z_filefunc, s->filestream, &file_info.size_file_extra) != UNZ_OK)
1450 if (unz64local_getShort (&s->z_filefunc, s->filestream, &file_info.size_file_comment) != UNZ_OK)
1453 if (unz64local_getShort (&s->z_filefunc, s->filestream, &file_info.disk_num_start) != UNZ_OK)
1456 if (unz64local_getShort (&s->z_filefunc, s->filestream, &file_info.internal_fa) != UNZ_OK)
1459 if (unz64local_getLong (&s->z_filefunc, s->filestream, &file_info.external_fa) != UNZ_OK)
1465 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uL) != UNZ_OK)
1467 file_info_internal.offset_curfile = uL;
1470 lSeek += file_info.size_filename;
1471 if ((err == UNZ_OK) and (szFileName != NULL)) {
1473 if (file_info.size_filename < fileNameBufferSize) {
1474 *(szFileName + file_info.size_filename) =
'\0';
1475 uSizeRead = file_info.size_filename;
1478 uSizeRead = fileNameBufferSize;
1480 if ((file_info.size_filename > 0) and (fileNameBufferSize > 0))
1481 if (ZREAD64 (s->z_filefunc, s->filestream, szFileName, uSizeRead) != uSizeRead)
1487 if ((err == UNZ_OK) and (extraField != NULL)) {
1489 if (file_info.size_file_extra < extraFieldBufferSize)
1490 uSizeRead = file_info.size_file_extra;
1492 uSizeRead = extraFieldBufferSize;
1495 if (ZSEEK64 (s->z_filefunc, s->filestream, lSeek, ZLIB_FILEFUNC_SEEK_CUR) == 0)
1501 if ((file_info.size_file_extra > 0) and (extraFieldBufferSize > 0))
1502 if (ZREAD64 (s->z_filefunc, s->filestream, extraField, (uLong)uSizeRead) != uSizeRead)
1505 lSeek += file_info.size_file_extra - (uLong)uSizeRead;
1508 lSeek += file_info.size_file_extra;
1510 if ((err == UNZ_OK) and (file_info.size_file_extra != 0)) {
1514 lSeek -= file_info.size_file_extra;
1517 if (ZSEEK64 (s->z_filefunc, s->filestream, lSeek, ZLIB_FILEFUNC_SEEK_CUR) == 0)
1523 while (acc < file_info.size_file_extra) {
1527 if (unz64local_getShort (&s->z_filefunc, s->filestream, &headerId) != UNZ_OK)
1530 if (unz64local_getShort (&s->z_filefunc, s->filestream, &dataSize) != UNZ_OK)
1534 if (headerId == 0x0001) {
1537 if (file_info.uncompressed_size == MAXU32) {
1538 if (unz64local_getLong64 (&s->z_filefunc, s->filestream, &file_info.uncompressed_size) != UNZ_OK)
1542 if (file_info.compressed_size == MAXU32) {
1543 if (unz64local_getLong64 (&s->z_filefunc, s->filestream, &file_info.compressed_size) != UNZ_OK)
1547 if (file_info_internal.offset_curfile == MAXU32) {
1549 if (unz64local_getLong64 (&s->z_filefunc, s->filestream, &file_info_internal.offset_curfile) != UNZ_OK)
1553 if (file_info.disk_num_start == MAXU32) {
1555 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uL) != UNZ_OK)
1560 if (ZSEEK64 (s->z_filefunc, s->filestream, dataSize, ZLIB_FILEFUNC_SEEK_CUR) != 0)
1564 acc += 2 + 2 + dataSize;
1568 if ((err == UNZ_OK) and (szComment != NULL)) {
1570 if (file_info.size_file_comment < commentBufferSize) {
1571 *(szComment + file_info.size_file_comment) =
'\0';
1572 uSizeRead = file_info.size_file_comment;
1575 uSizeRead = commentBufferSize;
1578 if (ZSEEK64 (s->z_filefunc, s->filestream, lSeek, ZLIB_FILEFUNC_SEEK_CUR) == 0)
1584 if ((file_info.size_file_comment > 0) and (commentBufferSize > 0))
1585 if (ZREAD64 (s->z_filefunc, s->filestream, szComment, uSizeRead) != uSizeRead)
1587 lSeek += file_info.size_file_comment - uSizeRead;
1590 lSeek += file_info.size_file_comment;
1592 if ((err == UNZ_OK) and (pfile_info != NULL))
1593 *pfile_info = file_info;
1595 if ((err == UNZ_OK) and (pfile_info_internal != NULL))
1596 *pfile_info_internal = file_info_internal;
1606 int unzGetCurrentFileInfo64 (unzFile file, unz_file_info64* pfile_info,
char* szFileName, uLong fileNameBufferSize,
void* extraField,
1607 uLong extraFieldBufferSize,
char* szComment, uLong commentBufferSize)
1609 return unz64local_GetCurrentFileInfoInternal_ (file, pfile_info, NULL, szFileName, fileNameBufferSize, extraField,
1610 extraFieldBufferSize, szComment, commentBufferSize);
1613 int unzGetCurrentFileInfo (unzFile file, unz_file_info* pfile_info,
char* szFileName, uLong fileNameBufferSize,
void* extraField,
1614 uLong extraFieldBufferSize,
char* szComment, uLong commentBufferSize)
1617 unz_file_info64 file_info64;
1618 err = unz64local_GetCurrentFileInfoInternal_ (file, &file_info64, NULL, szFileName, fileNameBufferSize, extraField,
1619 extraFieldBufferSize, szComment, commentBufferSize);
1620 if ((err == UNZ_OK) and (pfile_info != NULL)) {
1621 pfile_info->version = file_info64.version;
1622 pfile_info->version_needed = file_info64.version_needed;
1623 pfile_info->flag = file_info64.flag;
1624 pfile_info->compression_method = file_info64.compression_method;
1625 pfile_info->dosDate = file_info64.dosDate;
1626 pfile_info->crc = file_info64.crc;
1628 pfile_info->size_filename = file_info64.size_filename;
1629 pfile_info->size_file_extra = file_info64.size_file_extra;
1630 pfile_info->size_file_comment = file_info64.size_file_comment;
1632 pfile_info->disk_num_start = file_info64.disk_num_start;
1633 pfile_info->internal_fa = file_info64.internal_fa;
1634 pfile_info->external_fa = file_info64.external_fa;
1636 pfile_info->tmu_date = file_info64.tmu_date,
1638 pfile_info->compressed_size = (uLong)file_info64.compressed_size;
1639 pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size;
1648 int unzGoToFirstFile (unzFile file)
1653 return UNZ_PARAMERROR;
1655 s->pos_in_central_dir = s->offset_central_dir;
1657 err = unz64local_GetCurrentFileInfoInternal_ (file, &s->cur_file_info, &s->cur_file_info_internal, NULL, 0, NULL, 0, NULL, 0);
1658 s->current_file_ok = (err == UNZ_OK);
1667 int unzGoToNextFile_ (unzFile file)
1673 return UNZ_PARAMERROR;
1675 if (!s->current_file_ok)
1676 return UNZ_END_OF_LIST_OF_FILE;
1677 if (s->gi.number_entry != 0xffff)
1678 if (s->num_file + 1 == s->gi.number_entry)
1679 return UNZ_END_OF_LIST_OF_FILE;
1681 s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment;
1683 err = unz64local_GetCurrentFileInfoInternal_ (file, &s->cur_file_info, &s->cur_file_info_internal, NULL, 0, NULL, 0, NULL, 0);
1684 s->current_file_ok = (err == UNZ_OK);
1696 int unzLocateFile_ (unzFile file,
const char* szFileName,
int iCaseSensitivity)
1704 unz_file_info64 cur_file_infoSaved;
1705 unz_file_info64_internal cur_file_info_internalSaved;
1706 ZPOS64_T num_fileSaved;
1707 ZPOS64_T pos_in_central_dirSaved;
1710 return UNZ_PARAMERROR;
1712 if (strlen (szFileName) >= UNZ_MAXFILENAMEINZIP)
1713 return UNZ_PARAMERROR;
1716 if (!s->current_file_ok)
1717 return UNZ_END_OF_LIST_OF_FILE;
1720 num_fileSaved = s->num_file;
1721 pos_in_central_dirSaved = s->pos_in_central_dir;
1722 cur_file_infoSaved = s->cur_file_info;
1723 cur_file_info_internalSaved = s->cur_file_info_internal;
1725 err = unzGoToFirstFile (file);
1727 while (err == UNZ_OK) {
1728 char szCurrentFileName[UNZ_MAXFILENAMEINZIP + 1];
1729 err = unzGetCurrentFileInfo64 (file, NULL, szCurrentFileName,
sizeof (szCurrentFileName) - 1, NULL, 0, NULL, 0);
1730 if (err == UNZ_OK) {
1731 if (unzStringFileNameCompare (szCurrentFileName, szFileName, iCaseSensitivity) == 0)
1733 err = unzGoToNextFile_ (file);
1740 s->num_file = num_fileSaved;
1741 s->pos_in_central_dir = pos_in_central_dirSaved;
1742 s->cur_file_info = cur_file_infoSaved;
1743 s->cur_file_info_internal = cur_file_info_internalSaved;
1749 // Contributed by Ryan Haksi (mailto://cryogen@infoserve.net)
1750 // I need random access
1752 // Further optimization could be realized by adding an ability
1753 // to cache the directory in memory. The goal being a single
1754 // comprehensive file read to put the file I need in a memory.
1765 int unzGetFilePos64 (unzFile file, unz64_file_pos* file_pos)
1769 if (file == NULL or file_pos == NULL)
1770 return UNZ_PARAMERROR;
1772 if (!s->current_file_ok)
1773 return UNZ_END_OF_LIST_OF_FILE;
1775 file_pos->pos_in_zip_directory = s->pos_in_central_dir;
1776 file_pos->num_of_file = s->num_file;
1781 int unzGetFilePos (unzFile file, unz_file_pos* file_pos)
1783 unz64_file_pos file_pos64;
1784 int err = unzGetFilePos64 (file, &file_pos64);
1785 if (err == UNZ_OK) {
1786 file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory;
1787 file_pos->num_of_file = (uLong)file_pos64.num_of_file;
1792 int unzGoToFilePos64 (unzFile file,
const unz64_file_pos* file_pos)
1797 if (file == NULL or file_pos == NULL)
1798 return UNZ_PARAMERROR;
1802 s->pos_in_central_dir = file_pos->pos_in_zip_directory;
1803 s->num_file = file_pos->num_of_file;
1806 err = unz64local_GetCurrentFileInfoInternal_ (file, &s->cur_file_info, &s->cur_file_info_internal, NULL, 0, NULL, 0, NULL, 0);
1808 s->current_file_ok = (err == UNZ_OK);
1812 int unzGoToFilePos (unzFile file, unz_file_pos* file_pos)
1814 unz64_file_pos file_pos64;
1815 if (file_pos == NULL)
1816 return UNZ_PARAMERROR;
1818 file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory;
1819 file_pos64.num_of_file = file_pos->num_of_file;
1820 return unzGoToFilePos64 (file, &file_pos64);
1835 int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar, ZPOS64_T* poffset_local_extrafield, uInt* psize_local_extrafield)
1837 uLong uMagic, uData, uFlags;
1838 uLong size_filename;
1839 uLong size_extra_field;
1843 *poffset_local_extrafield = 0;
1844 *psize_local_extrafield = 0;
1846 if (ZSEEK64 (s->z_filefunc, s->filestream, s->cur_file_info_internal.offset_curfile + s->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)
1849 if (err == UNZ_OK) {
1850 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uMagic) != UNZ_OK)
1852 else if (uMagic != 0x04034b50)
1853 err = UNZ_BADZIPFILE;
1856 if (unz64local_getShort (&s->z_filefunc, s->filestream, &uData) != UNZ_OK)
1862 if (unz64local_getShort (&s->z_filefunc, s->filestream, &uFlags) != UNZ_OK)
1865 if (unz64local_getShort (&s->z_filefunc, s->filestream, &uData) != UNZ_OK)
1867 else if ((err == UNZ_OK) and (uData != s->cur_file_info.compression_method))
1868 err = UNZ_BADZIPFILE;
1870 if ((err == UNZ_OK) and (s->cur_file_info.compression_method != 0) &&
1872 (s->cur_file_info.compression_method != Z_BZIP2ED) &&
1874 (s->cur_file_info.compression_method != Z_DEFLATED))
1875 err = UNZ_BADZIPFILE;
1877 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uData) != UNZ_OK)
1880 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uData) != UNZ_OK)
1882 else if ((err == UNZ_OK) and (uData != s->cur_file_info.crc) and ((uFlags & 8) == 0))
1883 err = UNZ_BADZIPFILE;
1885 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uData) != UNZ_OK)
1887 else if (uData != 0xFFFFFFFF and (err == UNZ_OK) and (uData != s->cur_file_info.compressed_size) and ((uFlags & 8) == 0))
1888 err = UNZ_BADZIPFILE;
1890 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uData) != UNZ_OK)
1892 else if (uData != 0xFFFFFFFF and (err == UNZ_OK) and (uData != s->cur_file_info.uncompressed_size) and ((uFlags & 8) == 0))
1893 err = UNZ_BADZIPFILE;
1895 if (unz64local_getShort (&s->z_filefunc, s->filestream, &size_filename) != UNZ_OK)
1897 else if ((err == UNZ_OK) and (size_filename != s->cur_file_info.size_filename))
1898 err = UNZ_BADZIPFILE;
1900 *piSizeVar += (uInt)size_filename;
1902 if (unz64local_getShort (&s->z_filefunc, s->filestream, &size_extra_field) != UNZ_OK)
1904 *poffset_local_extrafield = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + size_filename;
1905 *psize_local_extrafield = (uInt)size_extra_field;
1907 *piSizeVar += (uInt)size_extra_field;
1916 int unzOpenCurrentFile3_ (unzFile file,
int* method,
int* level,
int raw,
const char* password)
1921 file_in_zip64_read_info_s* pfile_in_zip_read_info;
1922 ZPOS64_T offset_local_extrafield;
1923 uInt size_local_extrafield;
1927 if (password != NULL)
1928 return UNZ_PARAMERROR;
1932 return UNZ_PARAMERROR;
1934 if (!s->current_file_ok)
1935 return UNZ_PARAMERROR;
1937 if (s->pfile_in_zip_read != NULL)
1938 unzCloseCurrentFile_ (file);
1940 if (unz64local_CheckCurrentFileCoherencyHeader (s, &iSizeVar, &offset_local_extrafield, &size_local_extrafield) != UNZ_OK)
1941 return UNZ_BADZIPFILE;
1943 pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC (
sizeof (file_in_zip64_read_info_s));
1944 if (pfile_in_zip_read_info == NULL)
1945 return UNZ_INTERNALERROR;
1947 pfile_in_zip_read_info->read_buffer = (
char*)ALLOC (UNZ_BUFSIZE);
1948 pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
1949 pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
1950 pfile_in_zip_read_info->pos_local_extrafield = 0;
1951 pfile_in_zip_read_info->raw = raw;
1953 if (pfile_in_zip_read_info->read_buffer == NULL) {
1954 TRYFREE (pfile_in_zip_read_info);
1955 return UNZ_INTERNALERROR;
1958 pfile_in_zip_read_info->stream_initialised = 0;
1961 *method = (int)s->cur_file_info.compression_method;
1963 if (level != NULL) {
1965 switch (s->cur_file_info.flag & 0x06) {
1978 if ((s->cur_file_info.compression_method != 0) &&
1980 (s->cur_file_info.compression_method != Z_BZIP2ED) &&
1982 (s->cur_file_info.compression_method != Z_DEFLATED))
1984 err = UNZ_BADZIPFILE;
1986 pfile_in_zip_read_info->crc32_wait = s->cur_file_info.crc;
1987 pfile_in_zip_read_info->crc32 = 0;
1988 pfile_in_zip_read_info->total_out_64 = 0;
1989 pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method;
1990 pfile_in_zip_read_info->filestream = s->filestream;
1991 pfile_in_zip_read_info->z_filefunc = s->z_filefunc;
1992 pfile_in_zip_read_info->byte_before_the_zipfile = s->byte_before_the_zipfile;
1994 pfile_in_zip_read_info->stream.total_out = 0;
1996 if ((s->cur_file_info.compression_method == Z_BZIP2ED) and (!raw)) {
1998 pfile_in_zip_read_info->bstream.bzalloc = (
void* (*)(
void*,
int,
int))0;
1999 pfile_in_zip_read_info->bstream.bzfree = (free_func)0;
2000 pfile_in_zip_read_info->bstream.opaque = (voidpf)0;
2001 pfile_in_zip_read_info->bstream.state = (voidpf)0;
2003 pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
2004 pfile_in_zip_read_info->stream.zfree = (free_func)0;
2005 pfile_in_zip_read_info->stream.opaque = (voidpf)0;
2006 pfile_in_zip_read_info->stream.next_in = (voidpf)0;
2007 pfile_in_zip_read_info->stream.avail_in = 0;
2009 err = BZ2_bzDecompressInit (&pfile_in_zip_read_info->bstream, 0, 0);
2011 pfile_in_zip_read_info->stream_initialised = Z_BZIP2ED;
2013 TRYFREE (pfile_in_zip_read_info);
2017 pfile_in_zip_read_info->raw = 1;
2020 else if ((s->cur_file_info.compression_method == Z_DEFLATED) and (!raw)) {
2021 pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
2022 pfile_in_zip_read_info->stream.zfree = (free_func)0;
2023 pfile_in_zip_read_info->stream.opaque = (voidpf)0;
2024 pfile_in_zip_read_info->stream.next_in = 0;
2025 pfile_in_zip_read_info->stream.avail_in = 0;
2027 err = inflateInit2 (&pfile_in_zip_read_info->stream, -MAX_WBITS);
2029 pfile_in_zip_read_info->stream_initialised = Z_DEFLATED;
2031 TRYFREE (pfile_in_zip_read_info);
2042 pfile_in_zip_read_info->rest_read_compressed = s->cur_file_info.compressed_size;
2043 pfile_in_zip_read_info->rest_read_uncompressed = s->cur_file_info.uncompressed_size;
2045 pfile_in_zip_read_info->pos_in_zipfile = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + iSizeVar;
2047 pfile_in_zip_read_info->stream.avail_in = (uInt)0;
2049 s->pfile_in_zip_read = pfile_in_zip_read_info;
2053 if (password != NULL) {
2055 s->pcrc_32_tab = get_crc_table ();
2056 init_keys (password, s->keys, s->pcrc_32_tab);
2057 if (ZSEEK64 (s->z_filefunc, s->filestream, s->pfile_in_zip_read->pos_in_zipfile + s->pfile_in_zip_read->byte_before_the_zipfile, SEEK_SET) != 0)
2058 return UNZ_INTERNALERROR;
2059 if (ZREAD64 (s->z_filefunc, s->filestream, source, 12) < 12)
2060 return UNZ_INTERNALERROR;
2062 for (i = 0; i < 12; ++i)
2063 zdecode (s->keys, s->pcrc_32_tab, source[i]);
2065 s->pfile_in_zip_read->pos_in_zipfile += 12;
2073 int unzOpenCurrentFile (unzFile file)
2075 return unzOpenCurrentFile3_ (file, NULL, NULL, 0, NULL);
2078 int unzOpenCurrentFilePassword (unzFile file,
const char* password)
2080 return unzOpenCurrentFile3_ (file, NULL, NULL, 0, password);
2083 int unzOpenCurrentFile2 (unzFile file,
int* method,
int* level,
int raw)
2085 return unzOpenCurrentFile3_ (file, method, level, raw, NULL);
2090 ZPOS64_T unzGetCurrentFileZStreamPos64 (unzFile file)
2093 file_in_zip64_read_info_s* pfile_in_zip_read_info;
2097 pfile_in_zip_read_info = s->pfile_in_zip_read;
2098 if (pfile_in_zip_read_info == NULL)
2100 return pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile;
2115 int unzReadCurrentFile_ (unzFile file, voidp buf,
unsigned len)
2120 file_in_zip64_read_info_s* pfile_in_zip_read_info;
2122 return UNZ_PARAMERROR;
2124 pfile_in_zip_read_info = s->pfile_in_zip_read;
2126 if (pfile_in_zip_read_info == NULL)
2127 return UNZ_PARAMERROR;
2129 if (pfile_in_zip_read_info->read_buffer == NULL)
2130 return UNZ_END_OF_LIST_OF_FILE;
2134 pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;
2136 pfile_in_zip_read_info->stream.avail_out = (uInt)len;
2138 if ((len > pfile_in_zip_read_info->rest_read_uncompressed) && (!(pfile_in_zip_read_info->raw)))
2139 pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
2141 if ((len > pfile_in_zip_read_info->rest_read_compressed + pfile_in_zip_read_info->stream.avail_in) && (pfile_in_zip_read_info->raw))
2142 pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_compressed + pfile_in_zip_read_info->stream.avail_in;
2144 while (pfile_in_zip_read_info->stream.avail_out > 0) {
2145 if ((pfile_in_zip_read_info->stream.avail_in == 0) && (pfile_in_zip_read_info->rest_read_compressed > 0)) {
2146 uInt uReadThis = UNZ_BUFSIZE;
2147 if (pfile_in_zip_read_info->rest_read_compressed < uReadThis)
2148 uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;
2151 if (ZSEEK64 (pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream,
2152 pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)
2154 if (ZREAD64 (pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->read_buffer, uReadThis) != uReadThis)
2160 for (i = 0; i < uReadThis; i++)
2161 pfile_in_zip_read_info->read_buffer[i] = zdecode (s->keys, s->pcrc_32_tab, pfile_in_zip_read_info->read_buffer[i]);
2165 pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
2167 pfile_in_zip_read_info->rest_read_compressed -= uReadThis;
2169 pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->read_buffer;
2170 pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
2173 if ((pfile_in_zip_read_info->compression_method == 0) || (pfile_in_zip_read_info->raw)) {
2176 if ((pfile_in_zip_read_info->stream.avail_in == 0) && (pfile_in_zip_read_info->rest_read_compressed == 0))
2177 return (iRead == 0) ? UNZ_EOF : iRead;
2179 if (pfile_in_zip_read_info->stream.avail_out < pfile_in_zip_read_info->stream.avail_in)
2180 uDoCopy = pfile_in_zip_read_info->stream.avail_out;
2182 uDoCopy = pfile_in_zip_read_info->stream.avail_in;
2184 for (i = 0; i < uDoCopy; i++)
2185 *(pfile_in_zip_read_info->stream.next_out + i) = *(pfile_in_zip_read_info->stream.next_in + i);
2187 pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uDoCopy;
2189 pfile_in_zip_read_info->crc32 = crc32 (pfile_in_zip_read_info->crc32, pfile_in_zip_read_info->stream.next_out, uDoCopy);
2190 pfile_in_zip_read_info->rest_read_uncompressed -= uDoCopy;
2191 pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
2192 pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
2193 pfile_in_zip_read_info->stream.next_out += uDoCopy;
2194 pfile_in_zip_read_info->stream.next_in += uDoCopy;
2195 pfile_in_zip_read_info->stream.total_out += uDoCopy;
2198 else if (pfile_in_zip_read_info->compression_method == Z_BZIP2ED) {
2200 uLong uTotalOutBefore, uTotalOutAfter;
2201 const Bytef* bufBefore;
2204 pfile_in_zip_read_info->bstream.next_in = (
char*)pfile_in_zip_read_info->stream.next_in;
2205 pfile_in_zip_read_info->bstream.avail_in = pfile_in_zip_read_info->stream.avail_in;
2206 pfile_in_zip_read_info->bstream.total_in_lo32 = pfile_in_zip_read_info->stream.total_in;
2207 pfile_in_zip_read_info->bstream.total_in_hi32 = 0;
2208 pfile_in_zip_read_info->bstream.next_out = (
char*)pfile_in_zip_read_info->stream.next_out;
2209 pfile_in_zip_read_info->bstream.avail_out = pfile_in_zip_read_info->stream.avail_out;
2210 pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out;
2211 pfile_in_zip_read_info->bstream.total_out_hi32 = 0;
2213 uTotalOutBefore = pfile_in_zip_read_info->bstream.total_out_lo32;
2214 bufBefore = (
const Bytef*)pfile_in_zip_read_info->bstream.next_out;
2216 err = BZ2_bzDecompress (&pfile_in_zip_read_info->bstream);
2218 uTotalOutAfter = pfile_in_zip_read_info->bstream.total_out_lo32;
2219 uOutThis = uTotalOutAfter - uTotalOutBefore;
2221 pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
2223 pfile_in_zip_read_info->crc32 = crc32 (pfile_in_zip_read_info->crc32, bufBefore, (uInt)(uOutThis));
2224 pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis;
2225 iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
2227 pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->bstream.next_in;
2228 pfile_in_zip_read_info->stream.avail_in = pfile_in_zip_read_info->bstream.avail_in;
2229 pfile_in_zip_read_info->stream.total_in = pfile_in_zip_read_info->bstream.total_in_lo32;
2230 pfile_in_zip_read_info->stream.next_out = (Bytef*)pfile_in_zip_read_info->bstream.next_out;
2231 pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out;
2232 pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32;
2234 if (err == BZ_STREAM_END)
2235 return (iRead == 0) ? UNZ_EOF : iRead;
2241 ZPOS64_T uTotalOutBefore, uTotalOutAfter;
2242 const Bytef* bufBefore;
2244 int flush = Z_SYNC_FLUSH;
2246 uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
2247 bufBefore = pfile_in_zip_read_info->stream.next_out;
2255 err = inflate (&pfile_in_zip_read_info->stream, flush);
2257 if ((err >= 0) and (pfile_in_zip_read_info->stream.msg != NULL))
2260 uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
2261 uOutThis = uTotalOutAfter - uTotalOutBefore;
2263 pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
2265 pfile_in_zip_read_info->crc32 = crc32 (pfile_in_zip_read_info->crc32, bufBefore, (uInt)(uOutThis));
2267 pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis;
2269 iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
2271 if (err == Z_STREAM_END)
2272 return (iRead == 0) ? UNZ_EOF : iRead;
2286 z_off_t unztell (unzFile file)
2289 file_in_zip64_read_info_s* pfile_in_zip_read_info;
2291 return UNZ_PARAMERROR;
2293 pfile_in_zip_read_info = s->pfile_in_zip_read;
2295 if (pfile_in_zip_read_info == NULL)
2296 return UNZ_PARAMERROR;
2298 return (z_off_t)pfile_in_zip_read_info->stream.total_out;
2301 ZPOS64_T unztell64 (unzFile file)
2305 file_in_zip64_read_info_s* pfile_in_zip_read_info;
2307 return (ZPOS64_T)-1;
2309 pfile_in_zip_read_info = s->pfile_in_zip_read;
2311 if (pfile_in_zip_read_info == NULL)
2312 return (ZPOS64_T)-1;
2314 return pfile_in_zip_read_info->total_out_64;
2320 int unzeof (unzFile file)
2323 file_in_zip64_read_info_s* pfile_in_zip_read_info;
2325 return UNZ_PARAMERROR;
2327 pfile_in_zip_read_info = s->pfile_in_zip_read;
2329 if (pfile_in_zip_read_info == NULL)
2330 return UNZ_PARAMERROR;
2332 if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
2350 int unzGetLocalExtrafield (unzFile file, voidp buf,
unsigned len)
2353 file_in_zip64_read_info_s* pfile_in_zip_read_info;
2355 ZPOS64_T size_to_read;
2358 return UNZ_PARAMERROR;
2360 pfile_in_zip_read_info = s->pfile_in_zip_read;
2362 if (pfile_in_zip_read_info == NULL)
2363 return UNZ_PARAMERROR;
2365 size_to_read = (pfile_in_zip_read_info->size_local_extrafield - pfile_in_zip_read_info->pos_local_extrafield);
2368 return (
int)size_to_read;
2370 if (len > size_to_read)
2371 read_now = (uInt)size_to_read;
2373 read_now = (uInt)len;
2378 if (ZSEEK64 (pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream,
2379 pfile_in_zip_read_info->offset_local_extrafield + pfile_in_zip_read_info->pos_local_extrafield, ZLIB_FILEFUNC_SEEK_SET) != 0)
2382 if (ZREAD64 (pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, buf, read_now) != read_now)
2385 return (
int)read_now;
2392 int unzCloseCurrentFile_ (unzFile file)
2397 file_in_zip64_read_info_s* pfile_in_zip_read_info;
2399 return UNZ_PARAMERROR;
2401 pfile_in_zip_read_info = s->pfile_in_zip_read;
2403 if (pfile_in_zip_read_info == NULL)
2404 return UNZ_PARAMERROR;
2406 if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && (!pfile_in_zip_read_info->raw)) {
2407 if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
2411 TRYFREE (pfile_in_zip_read_info->read_buffer);
2412 pfile_in_zip_read_info->read_buffer = NULL;
2413 if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED)
2414 inflateEnd (&pfile_in_zip_read_info->stream);
2416 else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED)
2417 BZ2_bzDecompressEnd (&pfile_in_zip_read_info->bstream);
2420 pfile_in_zip_read_info->stream_initialised = 0;
2421 TRYFREE (pfile_in_zip_read_info);
2423 s->pfile_in_zip_read = NULL;
2433 int unzGetGlobalComment (unzFile file,
char* szComment, uLong uSizeBuf)
2438 return (
int)UNZ_PARAMERROR;
2441 uReadThis = uSizeBuf;
2442 if (uReadThis > s->gi.size_comment)
2443 uReadThis = s->gi.size_comment;
2445 if (ZSEEK64 (s->z_filefunc, s->filestream, s->central_pos + 22, ZLIB_FILEFUNC_SEEK_SET) != 0)
2448 if (uReadThis > 0) {
2450 if (ZREAD64 (s->z_filefunc, s->filestream, szComment, uReadThis) != uReadThis)
2454 if ((szComment != NULL) and (uSizeBuf > s->gi.size_comment))
2455 *(szComment + s->gi.size_comment) =
'\0';
2456 return (
int)uReadThis;
2460 ZPOS64_T unzGetOffset64 (unzFile file)
2467 if (!s->current_file_ok)
2469 if (s->gi.number_entry != 0 and s->gi.number_entry != 0xffff)
2470 if (s->num_file == s->gi.number_entry)
2472 return s->pos_in_central_dir;
2475 uLong unzGetOffset (unzFile file)
2481 offset64 = unzGetOffset64 (file);
2482 return (uLong)offset64;
2485 int unzSetOffset64 (unzFile file, ZPOS64_T pos)
2491 return UNZ_PARAMERROR;
2494 s->pos_in_central_dir = pos;
2495 s->num_file = s->gi.number_entry;
2496 err = unz64local_GetCurrentFileInfoInternal_ (file, &s->cur_file_info, &s->cur_file_info_internal, NULL, 0, NULL, 0, NULL, 0);
2497 s->current_file_ok = (err == UNZ_OK);
2501 int unzSetOffset (unzFile file, uLong pos)
2503 return unzSetOffset64 (file, pos);
2509#if qStroika_HasComponent_zlib
2510class Zip::Reader::Rep_ :
public Reader::_IRep {
2512 struct MyISeekInStream : zlib_filefunc64_def {
2515 bool fOpened_{
false};
2520 this->zopen64_file = [] (voidpf opaqueStream,
const void* ,
int ) -> voidpf {
2521 MyISeekInStream* myThis =
reinterpret_cast<MyISeekInStream*
> (opaqueStream);
2523 Assert (not myThis->fOpened_);
2524 myThis->fOpened_ =
true;
2528 this->zread_file = [] (voidpf opaqueStream, [[maybe_unused]] voidpf stream,
void* buf, uLong size) -> uLong {
2529 Require (opaqueStream == stream);
2530 MyISeekInStream* myThis =
reinterpret_cast<MyISeekInStream*
> (opaqueStream);
2532 Assert (myThis->fOpened_);
2534 size_t sz = myThis->fInStream_.ReadBlocking (span{
reinterpret_cast<byte*
> (buf), size}).size ();
2535 Assert (sz <= size);
2536 return static_cast<uLong
> (sz);
2538 this->zwrite_file = [] (voidpf , voidpf ,
const void* , uLong ) -> uLong {
2540 return static_cast<uLong
> (UNZ_PARAMERROR);
2542 this->ztell64_file = [] (voidpf opaqueStream, [[maybe_unused]] voidpf stream) -> ZPOS64_T {
2543 Require (opaqueStream == stream);
2544 MyISeekInStream* myThis =
reinterpret_cast<MyISeekInStream*
> (opaqueStream);
2546 Assert (myThis->fOpened_);
2548 return myThis->fInStream_.GetOffset ();
2550 this->zseek64_file = [] (voidpf opaqueStream, [[maybe_unused]] voidpf stream, ZPOS64_T offset,
int origin) ->
long {
2551 Require (opaqueStream == stream);
2552 MyISeekInStream* myThis =
reinterpret_cast<MyISeekInStream*
> (opaqueStream);
2554 Assert (myThis->fOpened_);
2557 case ZLIB_FILEFUNC_SEEK_SET:
2558 myThis->fInStream_.Seek (offset);
2560 case ZLIB_FILEFUNC_SEEK_CUR:
2561 myThis->fInStream_.Seek (Streams::eFromCurrent, offset);
2563 case ZLIB_FILEFUNC_SEEK_END:
2564 myThis->fInStream_.Seek (Streams::eFromEnd, offset);
2568 return UNZ_PARAMERROR;
2572 this->zclose_file = [] ([[maybe_unused]] voidpf opaqueStream, [[maybe_unused]] voidpf stream) ->
int {
2574 Require (opaqueStream == stream);
2575 MyISeekInStream* myThis =
reinterpret_cast<MyISeekInStream*
> (opaqueStream);
2576 Assert (myThis->fOpened_);
2577 myThis->fOpened_ =
false;
2581 this->zerror_file = [] (voidpf opaqueStream, [[maybe_unused]] voidpf stream) ->
int {
2582 Require (opaqueStream == stream);
2583 [[maybe_unused]] MyISeekInStream* myThis =
reinterpret_cast<MyISeekInStream*
> (opaqueStream);
2585 Assert (myThis->fOpened_);
2589 this->opaque =
this;
2594 Assert (not fOpened_);
2598 MyISeekInStream fInSeekStream_;
2603 : fInSeekStream_ (in)
2604 , fZipFile_ (unzOpen2_64 (
"", &fInSeekStream_))
2606 if (fZipFile_ ==
nullptr) [[unlikely]] {
2608 Execution::Throw (kException_);
2614 unzClose (fZipFile_);
2616 virtual Set<String> GetContainedFiles ()
const override
2619 unz_global_info64 gi;
2620 int err = unzGetGlobalInfo64 (fZipFile_, &gi);
2621 if (err != UNZ_OK) [[unlikely]] {
2622 using namespace Characters;
2625 for (
size_t i = 0; i < gi.number_entry; i++) {
2626 char filename_inzip[10 * 1024];
2627 unz_file_info64 file_info;
2631 err = ::unzGetCurrentFileInfo64 (fZipFile_, &file_info, filename_inzip,
sizeof (filename_inzip), NULL, 0, NULL, 0);
2632 if (err != UNZ_OK) [[unlikely]] {
2633 using namespace Characters;
2637 if ((i + 1) < gi.number_entry) {
2638 err = ::unzGoToNextFile_ (fZipFile_);
2639 if (err != UNZ_OK) [[unlikely]] {
2640 using namespace Characters;
2646 if (filename_inzip[::strlen (filename_inzip) - 1] ==
'/') {
2654 unz_global_info64 gi;
2657 err = unzGetGlobalInfo64(uf, &gi);
2659 printf(
"error %d with zipfile in unzGetGlobalInfo \n", err);
2660 printf(
" Length Method Size Ratio Date Time CRC-32 Name\n");
2661 printf(
" ------ ------ ---- ----- ---- ---- ------ ----\n");
2662 for (i = 0; i < gi.number_entry; ++i) {
2663 char filename_inzip[256];
2664 unz_file_info64 file_info;
2666 const char* string_method;
2667 char charCrypt =
' ';
2668 err = unzGetCurrentFileInfo64(uf, &file_info, filename_inzip,
sizeof(filename_inzip), NULL, 0, NULL, 0);
2669 if (err != UNZ_OK) {
2670 printf(
"error %d with zipfile in unzGetCurrentFileInfo\n", err);
2673 if (file_info.uncompressed_size > 0)
2674 ratio = (uLong)((file_info.compressed_size * 100) / file_info.uncompressed_size);
2677 if ((file_info.flag & 1) != 0)
2680 if (file_info.compression_method == 0)
2681 string_method =
"Stored";
2682 else if (file_info.compression_method == Z_DEFLATED) {
2683 uInt iLevel = (uInt)((file_info.flag & 0x6) / 2);
2685 string_method =
"Defl:N";
2686 else if (iLevel == 1)
2687 string_method =
"Defl:X";
2688 else if ((iLevel == 2) or (iLevel == 3))
2689 string_method =
"Defl:F";
2691 else if (file_info.compression_method == Z_BZIP2ED) {
2692 string_method =
"BZip2 ";
2695 string_method =
"Unkn. ";
2697 Display64BitsSize(file_info.uncompressed_size, 7);
2698 printf(
" %6s%c", string_method, charCrypt);
2699 Display64BitsSize(file_info.compressed_size, 7);
2700 printf(
" %3lu%% %2.2lu-%2.2lu-%2.2lu %2.2lu:%2.2lu %8.8lx %s\n",
2702 (uLong)file_info.tmu_date.tm_mon + 1,
2703 (uLong)file_info.tmu_date.tm_mday,
2704 (uLong)file_info.tmu_date.tm_year % 100,
2705 (uLong)file_info.tmu_date.tm_hour, (uLong)file_info.tmu_date.tm_min,
2706 (uLong)file_info.crc, filename_inzip);
2707 if ((i + 1) < gi.number_entry) {
2708 err = unzGoToNextFile_ (uf);
2709 if (err != UNZ_OK) {
2710 printf(
"error %d with zipfile in unzGoToNextFile\n", err);
2716 for (
unsigned int i = 0; i < fDB_.NumFiles; i++) {
2717 if (not SzArEx_IsDir (&fDB_, i)) {
2718 size_t nameLen = ::SzArEx_GetFileNameUtf16 (&fDB_, i,
nullptr);
2723 size_t z = ::SzArEx_GetFileNameUtf16 (&fDB_, i,
reinterpret_cast<UInt16*
> (&fileName[0]));
2732 if (unzLocateFile_ (fZipFile_, fileName.
AsNarrowSDKString ().c_str (), 1) != UNZ_OK) [[unlikely]] {
2733 using namespace Characters;
2736 const char* password =
nullptr;
2737 int err = unzOpenCurrentFilePassword (fZipFile_, password);
2738 [[maybe_unused]]
auto&& cleanup = Execution::Finally ([
this] ()
noexcept { unzCloseCurrentFile_ (fZipFile_); });
2741 byte buf[10 * 1024];
2742 err = unzReadCurrentFile_ (fZipFile_, buf,
static_cast<unsigned int> (Memory::NEltsOf (buf)));
2743 if (err < 0) [[unlikely]] {
2744 using namespace Characters;
2748 Assert (
static_cast<size_t> (err) <= Memory::NEltsOf (buf));
2749 tmpBuf.Write (span{buf,
static_cast<size_t> (err)});
2757 : DataExchange::Archive::
Reader{make_shared<Rep_> (in)}
#define RequireNotReached()
#define AssertNotReached()
String is like std::u32string, except it is much easier to use, often much more space efficient,...
nonvirtual string AsNarrowSDKString() const
Set<T> is a container of T, where once an item is added, additionally adds () do nothing.
nonvirtual void Add(ArgByValueType< value_type > item)
Logically halfway between std::array and std::vector; Smart 'direct memory array' - which when needed...