4#include "Stroika/Foundation/StroikaPreComp.h"
6#if qStroika_HasComponent_zlib
16#include "Stroika/Foundation/Streams/MemoryStream.h"
18#include "Private_minizip_.h"
20#if qStroika_HasComponent_zlib
21using namespace Stroika::Foundation::DataExchange::Archive::Zip;
22using namespace Stroika::Foundation::DataExchange::Archive::Zip::PrivateMinizip_;
37voidpf PrivateMinizip_::call_zopen64 (
const zlib_filefunc64_32_def* pfilefunc,
const void* filename,
int mode)
39 if (pfilefunc->zfile_func64.zopen64_file != NULL)
40 return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque, filename, mode);
42 return (*(pfilefunc->zopen32_file)) (pfilefunc->zfile_func64.opaque, (
const char*)filename, mode);
45long PrivateMinizip_::call_zseek64 (
const zlib_filefunc64_32_def* pfilefunc, voidpf filestream, ZPOS64_T offset,
int origin)
47 if (pfilefunc->zfile_func64.zseek64_file != NULL)
48 return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque, filestream, offset, origin);
50 uLong offsetTruncated = (uLong)offset;
51 if (offsetTruncated != offset)
54 return (*(pfilefunc->zseek32_file)) (pfilefunc->zfile_func64.opaque, filestream, offsetTruncated, origin);
57ZPOS64_T PrivateMinizip_::call_ztell64 (
const zlib_filefunc64_32_def* pfilefunc, voidpf filestream)
59 if (pfilefunc->zfile_func64.zseek64_file != NULL)
60 return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque, filestream);
62 uLong tell_uLong = (*(pfilefunc->ztell32_file)) (pfilefunc->zfile_func64.opaque, filestream);
63 if ((tell_uLong) == numeric_limits<uLong>::max ())
69void PrivateMinizip_::fill_zlib_filefunc64_32_def_from_filefunc32 (zlib_filefunc64_32_def* p_filefunc64_32,
const zlib_filefunc_def* p_filefunc32)
71 p_filefunc64_32->zfile_func64.zopen64_file = NULL;
72 p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file;
73 p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
74 p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file;
75 p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file;
76 p_filefunc64_32->zfile_func64.ztell64_file = NULL;
77 p_filefunc64_32->zfile_func64.zseek64_file = NULL;
78 p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file;
79 p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
80 p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque;
81 p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file;
82 p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file;
93#ifndef CASESENSITIVITYDEFAULT_NO
94#if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
95#define CASESENSITIVITYDEFAULT_NO
100#define UNZ_BUFSIZE (16384)
103#ifndef UNZ_MAXFILENAMEINZIP
104#define UNZ_MAXFILENAMEINZIP (256)
108#define ALLOC(size) (malloc (size))
118#define SIZECENTRALDIRITEM (0x2e)
119#define SIZEZIPLOCALHEADER (0x1e)
124 typedef struct unz_file_info64_internal_s {
125 ZPOS64_T offset_curfile;
126 } unz_file_info64_internal;
138 ZPOS64_T pos_in_zipfile;
139 uLong stream_initialised;
141 ZPOS64_T offset_local_extrafield;
142 uInt size_local_extrafield;
143 ZPOS64_T pos_local_extrafield;
144 ZPOS64_T total_out_64;
148 ZPOS64_T rest_read_compressed;
149 ZPOS64_T rest_read_uncompressed;
150 zlib_filefunc64_32_def z_filefunc;
152 uLong compression_method;
153 ZPOS64_T byte_before_the_zipfile;
155 } file_in_zip64_read_info_s;
160 zlib_filefunc64_32_def z_filefunc;
161 int is64bitOpenFunction;
163 unz_global_info64 gi;
164 ZPOS64_T byte_before_the_zipfile;
166 ZPOS64_T pos_in_central_dir;
167 ZPOS64_T current_file_ok;
168 ZPOS64_T central_pos;
170 ZPOS64_T size_central_dir;
171 ZPOS64_T offset_central_dir;
174 unz_file_info64 cur_file_info;
175 unz_file_info64_internal cur_file_info_internal;
176 file_in_zip64_read_info_s* pfile_in_zip_read;
183 unsigned long keys[3];
184 const z_crc_t* pcrc_32_tab;
193 int unz64local_getByte (
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream,
int* pi)
196 int err = (int)ZREAD64 (*pzlib_filefunc_def, filestream, &c, 1);
202 if (ZERROR64 (*pzlib_filefunc_def, filestream))
212 int unz64local_getShort (
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX)
218 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
222 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
223 x |= ((uLong)i) << 8;
232 int unz64local_getLong (
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX)
238 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
242 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
243 x |= ((uLong)i) << 8;
246 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
247 x |= ((uLong)i) << 16;
250 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
251 x += ((uLong)i) << 24;
260 int unz64local_getLong64 (
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T* pX)
266 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
270 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
271 x |= ((ZPOS64_T)i) << 8;
274 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
275 x |= ((ZPOS64_T)i) << 16;
278 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
279 x |= ((ZPOS64_T)i) << 24;
282 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
283 x |= ((ZPOS64_T)i) << 32;
286 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
287 x |= ((ZPOS64_T)i) << 40;
290 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
291 x |= ((ZPOS64_T)i) << 48;
294 err = unz64local_getByte (pzlib_filefunc_def, filestream, &i);
295 x |= ((ZPOS64_T)i) << 56;
305 int strcmpcasenosensitive_internal (
const char* fileName1,
const char* fileName2)
308 char c1 = *(fileName1++);
309 char c2 = *(fileName2++);
310 if ((c1 >=
'a') and (c1 <=
'z'))
312 if ((c2 >=
'a') and (c2 <=
'z'))
315 return ((c2 ==
'\0') ? 0 : -1);
325#ifdef CASESENSITIVITYDEFAULT_NO
326#define CASESENSITIVITYDEFAULTVALUE 2
328#define CASESENSITIVITYDEFAULTVALUE 1
331#ifndef STRCMPCASENOSENTIVEFUNCTION
332#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
345int PrivateMinizip_::unzStringFileNameCompare (
const char* fileName1,
const char* fileName2,
int iCaseSensitivity)
347 if (iCaseSensitivity == 0)
348 iCaseSensitivity = CASESENSITIVITYDEFAULTVALUE;
350 if (iCaseSensitivity == 1)
351 return strcmp (fileName1, fileName2);
353 return STRCMPCASENOSENTIVEFUNCTION (fileName1, fileName2);
358 constexpr size_t BUFREADCOMMENT = 0x400;
364 ZPOS64_T unz64local_SearchCentralDir (
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)
366 ZPOS64_T uPosFound = 0;
368 if (ZSEEK64 (*pzlib_filefunc_def, filestream, 0, ZLIB_FILEFUNC_SEEK_END) != 0)
371 ZPOS64_T uSizeFile = ZTELL64 (*pzlib_filefunc_def, filestream);
373 ZPOS64_T uMaxBack = 0xffff;
374 if (uMaxBack > uSizeFile)
375 uMaxBack = uSizeFile;
377 unsigned char* buf = (
unsigned char*)ALLOC (BUFREADCOMMENT + 4);
381 ZPOS64_T uBackRead = 4;
382 while (uBackRead < uMaxBack) {
386 if (uBackRead + BUFREADCOMMENT > uMaxBack)
387 uBackRead = uMaxBack;
389 uBackRead += BUFREADCOMMENT;
390 uReadPos = uSizeFile - uBackRead;
392 uReadSize = ((BUFREADCOMMENT + 4) < (uSizeFile - uReadPos)) ? (BUFREADCOMMENT + 4) : (uLong)(uSizeFile - uReadPos);
393 if (ZSEEK64 (*pzlib_filefunc_def, filestream, uReadPos, ZLIB_FILEFUNC_SEEK_SET) != 0)
396 if (ZREAD64 (*pzlib_filefunc_def, filestream, buf, uReadSize) != uReadSize)
399 for (i = (
int)uReadSize - 3; i-- > 0;)
400 if (((*(buf + i)) == 0x50) and ((*(buf + i + 1)) == 0x4b) && ((*(buf + i + 2)) == 0x05) and ((*(buf + i + 3)) == 0x06)) {
401 uPosFound = uReadPos + i;
416 ZPOS64_T unz64local_SearchCentralDir64 (
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)
421 ZPOS64_T uMaxBack = 0xffff;
422 ZPOS64_T uPosFound = 0;
424 ZPOS64_T relativeOffset;
426 if (ZSEEK64 (*pzlib_filefunc_def, filestream, 0, ZLIB_FILEFUNC_SEEK_END) != 0)
429 uSizeFile = ZTELL64 (*pzlib_filefunc_def, filestream);
431 if (uMaxBack > uSizeFile)
432 uMaxBack = uSizeFile;
434 buf = (
unsigned char*)ALLOC (BUFREADCOMMENT + 4);
439 while (uBackRead < uMaxBack) {
443 if (uBackRead + BUFREADCOMMENT > uMaxBack)
444 uBackRead = uMaxBack;
446 uBackRead += BUFREADCOMMENT;
447 uReadPos = uSizeFile - uBackRead;
449 uReadSize = ((BUFREADCOMMENT + 4) < (uSizeFile - uReadPos)) ? (BUFREADCOMMENT + 4) : (uLong)(uSizeFile - uReadPos);
450 if (ZSEEK64 (*pzlib_filefunc_def, filestream, uReadPos, ZLIB_FILEFUNC_SEEK_SET) != 0)
453 if (ZREAD64 (*pzlib_filefunc_def, filestream, buf, uReadSize) != uReadSize)
456 for (i = (
int)uReadSize - 3; i-- > 0;)
457 if (((*(buf + i)) == 0x50) and ((*(buf + i + 1)) == 0x4b) && ((*(buf + i + 2)) == 0x06) and ((*(buf + i + 3)) == 0x07)) {
458 uPosFound = uReadPos + i;
470 if (ZSEEK64 (*pzlib_filefunc_def, filestream, uPosFound, ZLIB_FILEFUNC_SEEK_SET) != 0)
474 if (unz64local_getLong (pzlib_filefunc_def, filestream, &uL) != UNZ_OK)
478 if (unz64local_getLong (pzlib_filefunc_def, filestream, &uL) != UNZ_OK)
484 if (unz64local_getLong64 (pzlib_filefunc_def, filestream, &relativeOffset) != UNZ_OK)
488 if (unz64local_getLong (pzlib_filefunc_def, filestream, &uL) != UNZ_OK)
494 if (ZSEEK64 (*pzlib_filefunc_def, filestream, relativeOffset, ZLIB_FILEFUNC_SEEK_SET) != 0)
498 if (unz64local_getLong (pzlib_filefunc_def, filestream, &uL) != UNZ_OK)
501 if (uL != 0x06064b50)
504 return relativeOffset;
516 unzFile unzOpenInternal (
const void* path, zlib_filefunc64_32_def* pzlib_filefunc64_32_def,
int is64bitOpenFunction)
520 ZPOS64_T central_pos;
525 uLong number_disk_with_CD;
527 ZPOS64_T number_entry_CD;
533 us.z_filefunc.zseek32_file = NULL;
534 us.z_filefunc.ztell32_file = NULL;
537 us.z_filefunc = *pzlib_filefunc64_32_def;
538 us.is64bitOpenFunction = is64bitOpenFunction;
540 us.filestream = ZOPEN64 (us.z_filefunc, path, ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING);
541 if (us.filestream == NULL)
544 central_pos = unz64local_SearchCentralDir64 (&us.z_filefunc, us.filestream);
551 if (ZSEEK64 (us.z_filefunc, us.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
555 if (unz64local_getLong (&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
559 if (unz64local_getLong64 (&us.z_filefunc, us.filestream, &uL64) != UNZ_OK)
563 if (unz64local_getShort (&us.z_filefunc, us.filestream, &uS) != UNZ_OK)
567 if (unz64local_getShort (&us.z_filefunc, us.filestream, &uS) != UNZ_OK)
571 if (unz64local_getLong (&us.z_filefunc, us.filestream, &number_disk) != UNZ_OK)
575 if (unz64local_getLong (&us.z_filefunc, us.filestream, &number_disk_with_CD) != UNZ_OK)
579 if (unz64local_getLong64 (&us.z_filefunc, us.filestream, &us.gi.number_entry) != UNZ_OK)
583 if (unz64local_getLong64 (&us.z_filefunc, us.filestream, &number_entry_CD) != UNZ_OK)
586 if ((number_entry_CD != us.gi.number_entry) or (number_disk_with_CD != 0) or (number_disk != 0))
587 err = UNZ_BADZIPFILE;
590 if (unz64local_getLong64 (&us.z_filefunc, us.filestream, &us.size_central_dir) != UNZ_OK)
595 if (unz64local_getLong64 (&us.z_filefunc, us.filestream, &us.offset_central_dir) != UNZ_OK)
598 us.gi.size_comment = 0;
601 central_pos = unz64local_SearchCentralDir (&us.z_filefunc, us.filestream);
602 if (central_pos == 0)
607 if (ZSEEK64 (us.z_filefunc, us.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
611 if (unz64local_getLong (&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
615 if (unz64local_getShort (&us.z_filefunc, us.filestream, &number_disk) != UNZ_OK)
619 if (unz64local_getShort (&us.z_filefunc, us.filestream, &number_disk_with_CD) != UNZ_OK)
623 if (unz64local_getShort (&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
625 us.gi.number_entry = uL;
628 if (unz64local_getShort (&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
630 number_entry_CD = uL;
632 if ((number_entry_CD != us.gi.number_entry) || (number_disk_with_CD != 0) || (number_disk != 0))
633 err = UNZ_BADZIPFILE;
636 if (unz64local_getLong (&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
638 us.size_central_dir = uL;
642 if (unz64local_getLong (&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
644 us.offset_central_dir = uL;
647 if (unz64local_getShort (&us.z_filefunc, us.filestream, &us.gi.size_comment) != UNZ_OK)
651 if ((central_pos < us.offset_central_dir + us.size_central_dir) && (err == UNZ_OK))
652 err = UNZ_BADZIPFILE;
655 ZCLOSE64 (us.z_filefunc, us.filestream);
659 us.byte_before_the_zipfile = central_pos - (us.offset_central_dir + us.size_central_dir);
660 us.central_pos = central_pos;
661 us.pfile_in_zip_read = NULL;
664 s = (unz64_s*)ALLOC (
sizeof (unz64_s));
667 unzGoToFirstFile ((unzFile)s);
672 unzFile unzOpen2 (
const char* path, zlib_filefunc_def* pzlib_filefunc32_def)
674 if (pzlib_filefunc32_def != NULL) {
675 zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
676 fill_zlib_filefunc64_32_def_from_filefunc32 (&zlib_filefunc64_32_def_fill, pzlib_filefunc32_def);
677 return unzOpenInternal (path, &zlib_filefunc64_32_def_fill, 0);
680 return unzOpenInternal (path, NULL, 0);
684unzFile PrivateMinizip_::unzOpen2_64 (
const void* path, zlib_filefunc64_def* pzlib_filefunc_def)
686 if (pzlib_filefunc_def != NULL) {
687 zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
688 zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;
689 zlib_filefunc64_32_def_fill.ztell32_file = NULL;
690 zlib_filefunc64_32_def_fill.zseek32_file = NULL;
691 return unzOpenInternal (path, &zlib_filefunc64_32_def_fill, 1);
694 return unzOpenInternal (path, NULL, 1);
697unzFile PrivateMinizip_::unzOpen (
const char* path)
699 return unzOpenInternal (path, NULL, 0);
702unzFile PrivateMinizip_::unzOpen64 (
const void* path)
704 return unzOpenInternal (path, NULL, 1);
712int PrivateMinizip_::unzClose (unzFile file)
716 return UNZ_PARAMERROR;
719 if (s->pfile_in_zip_read != NULL)
720 unzCloseCurrentFile_ (file);
722 ZCLOSE64 (s->z_filefunc, s->filestream);
731int PrivateMinizip_::unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info)
735 return UNZ_PARAMERROR;
737 *pglobal_info = s->gi;
741int PrivateMinizip_::unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32)
745 return UNZ_PARAMERROR;
748 pglobal_info32->number_entry = (uLong)s->gi.number_entry;
749 pglobal_info32->size_comment = s->gi.size_comment;
757 void unz64local_DosDateToTmuDate_ (ZPOS64_T ulDosDate, tm_unz* ptm)
760 uDate = (ZPOS64_T)(ulDosDate >> 16);
761 ptm->tm_mday = (uInt)(uDate & 0x1f);
762 ptm->tm_mon = (uInt)((((uDate) & 0x1E0) / 0x20) - 1);
763 ptm->tm_year = (uInt)(((uDate & 0x0FE00) / 0x0200) + 1980);
765 ptm->tm_hour = (uInt)((ulDosDate & 0xF800) / 0x800);
766 ptm->tm_min = (uInt)((ulDosDate & 0x7E0) / 0x20);
767 ptm->tm_sec = (uInt)(2 * (ulDosDate & 0x1f));
773 int unz64local_GetCurrentFileInfoInternal_ (unzFile file, unz_file_info64* pfile_info, unz_file_info64_internal* pfile_info_internal,
774 char* szFileName, uLong fileNameBufferSize,
void* extraField, uLong extraFieldBufferSize,
775 char* szComment, uLong commentBufferSize)
778 unz_file_info64 file_info;
779 unz_file_info64_internal file_info_internal;
785 return UNZ_PARAMERROR;
787 if (ZSEEK64 (s->z_filefunc, s->filestream, s->pos_in_central_dir + s->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)
792 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uMagic) != UNZ_OK)
794 else if (uMagic != 0x02014b50)
795 err = UNZ_BADZIPFILE;
798 if (unz64local_getShort (&s->z_filefunc, s->filestream, &file_info.version) != UNZ_OK)
801 if (unz64local_getShort (&s->z_filefunc, s->filestream, &file_info.version_needed) != UNZ_OK)
804 if (unz64local_getShort (&s->z_filefunc, s->filestream, &file_info.flag) != UNZ_OK)
807 if (unz64local_getShort (&s->z_filefunc, s->filestream, &file_info.compression_method) != UNZ_OK)
810 if (unz64local_getLong (&s->z_filefunc, s->filestream, &file_info.dosDate) != UNZ_OK)
813 unz64local_DosDateToTmuDate_ (file_info.dosDate, &file_info.tmu_date);
815 if (unz64local_getLong (&s->z_filefunc, s->filestream, &file_info.crc) != UNZ_OK)
820 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uL) != UNZ_OK)
822 file_info.compressed_size = uL;
827 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uL) != UNZ_OK)
829 file_info.uncompressed_size = uL;
832 if (unz64local_getShort (&s->z_filefunc, s->filestream, &file_info.size_filename) != UNZ_OK)
835 if (unz64local_getShort (&s->z_filefunc, s->filestream, &file_info.size_file_extra) != UNZ_OK)
838 if (unz64local_getShort (&s->z_filefunc, s->filestream, &file_info.size_file_comment) != UNZ_OK)
841 if (unz64local_getShort (&s->z_filefunc, s->filestream, &file_info.disk_num_start) != UNZ_OK)
844 if (unz64local_getShort (&s->z_filefunc, s->filestream, &file_info.internal_fa) != UNZ_OK)
847 if (unz64local_getLong (&s->z_filefunc, s->filestream, &file_info.external_fa) != UNZ_OK)
853 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uL) != UNZ_OK)
855 file_info_internal.offset_curfile = uL;
858 lSeek += file_info.size_filename;
859 if ((err == UNZ_OK) and (szFileName != NULL)) {
861 if (file_info.size_filename < fileNameBufferSize) {
862 *(szFileName + file_info.size_filename) =
'\0';
863 uSizeRead = file_info.size_filename;
866 uSizeRead = fileNameBufferSize;
868 if ((file_info.size_filename > 0) and (fileNameBufferSize > 0))
869 if (ZREAD64 (s->z_filefunc, s->filestream, szFileName, uSizeRead) != uSizeRead)
875 if ((err == UNZ_OK) and (extraField != NULL)) {
877 if (file_info.size_file_extra < extraFieldBufferSize)
878 uSizeRead = file_info.size_file_extra;
880 uSizeRead = extraFieldBufferSize;
883 if (ZSEEK64 (s->z_filefunc, s->filestream, lSeek, ZLIB_FILEFUNC_SEEK_CUR) == 0)
889 if ((file_info.size_file_extra > 0) and (extraFieldBufferSize > 0))
890 if (ZREAD64 (s->z_filefunc, s->filestream, extraField, (uLong)uSizeRead) != uSizeRead)
893 lSeek += file_info.size_file_extra - (uLong)uSizeRead;
896 lSeek += file_info.size_file_extra;
898 if ((err == UNZ_OK) and (file_info.size_file_extra != 0)) {
902 lSeek -= file_info.size_file_extra;
905 if (ZSEEK64 (s->z_filefunc, s->filestream, lSeek, ZLIB_FILEFUNC_SEEK_CUR) == 0)
911 while (acc < file_info.size_file_extra) {
915 if (unz64local_getShort (&s->z_filefunc, s->filestream, &headerId) != UNZ_OK)
918 if (unz64local_getShort (&s->z_filefunc, s->filestream, &dataSize) != UNZ_OK)
922 if (headerId == 0x0001) {
925 if (file_info.uncompressed_size == MAXU32) {
926 if (unz64local_getLong64 (&s->z_filefunc, s->filestream, &file_info.uncompressed_size) != UNZ_OK)
930 if (file_info.compressed_size == MAXU32) {
931 if (unz64local_getLong64 (&s->z_filefunc, s->filestream, &file_info.compressed_size) != UNZ_OK)
935 if (file_info_internal.offset_curfile == MAXU32) {
937 if (unz64local_getLong64 (&s->z_filefunc, s->filestream, &file_info_internal.offset_curfile) != UNZ_OK)
941 if (file_info.disk_num_start == MAXU32) {
943 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uL) != UNZ_OK)
948 if (ZSEEK64 (s->z_filefunc, s->filestream, dataSize, ZLIB_FILEFUNC_SEEK_CUR) != 0)
952 acc += 2 + 2 + dataSize;
956 if ((err == UNZ_OK) and (szComment != NULL)) {
958 if (file_info.size_file_comment < commentBufferSize) {
959 *(szComment + file_info.size_file_comment) =
'\0';
960 uSizeRead = file_info.size_file_comment;
963 uSizeRead = commentBufferSize;
966 if (ZSEEK64 (s->z_filefunc, s->filestream, lSeek, ZLIB_FILEFUNC_SEEK_CUR) == 0)
972 if ((file_info.size_file_comment > 0) and (commentBufferSize > 0))
973 if (ZREAD64 (s->z_filefunc, s->filestream, szComment, uSizeRead) != uSizeRead)
975 lSeek += file_info.size_file_comment - uSizeRead;
978 lSeek += file_info.size_file_comment;
980 if ((err == UNZ_OK) and (pfile_info != NULL))
981 *pfile_info = file_info;
983 if ((err == UNZ_OK) and (pfile_info_internal != NULL))
984 *pfile_info_internal = file_info_internal;
994int PrivateMinizip_::unzGetCurrentFileInfo64 (unzFile file, unz_file_info64* pfile_info,
char* szFileName, uLong fileNameBufferSize,
995 void* extraField, uLong extraFieldBufferSize,
char* szComment, uLong commentBufferSize)
997 return unz64local_GetCurrentFileInfoInternal_ (file, pfile_info, NULL, szFileName, fileNameBufferSize, extraField, extraFieldBufferSize,
998 szComment, commentBufferSize);
1001int PrivateMinizip_::unzGetCurrentFileInfo (unzFile file, unz_file_info* pfile_info,
char* szFileName, uLong fileNameBufferSize,
1002 void* extraField, uLong extraFieldBufferSize,
char* szComment, uLong commentBufferSize)
1005 unz_file_info64 file_info64;
1006 err = unz64local_GetCurrentFileInfoInternal_ (file, &file_info64, NULL, szFileName, fileNameBufferSize, extraField,
1007 extraFieldBufferSize, szComment, commentBufferSize);
1008 if ((err == UNZ_OK) and (pfile_info != NULL)) {
1009 pfile_info->version = file_info64.version;
1010 pfile_info->version_needed = file_info64.version_needed;
1011 pfile_info->flag = file_info64.flag;
1012 pfile_info->compression_method = file_info64.compression_method;
1013 pfile_info->dosDate = file_info64.dosDate;
1014 pfile_info->crc = file_info64.crc;
1016 pfile_info->size_filename = file_info64.size_filename;
1017 pfile_info->size_file_extra = file_info64.size_file_extra;
1018 pfile_info->size_file_comment = file_info64.size_file_comment;
1020 pfile_info->disk_num_start = file_info64.disk_num_start;
1021 pfile_info->internal_fa = file_info64.internal_fa;
1022 pfile_info->external_fa = file_info64.external_fa;
1024 pfile_info->tmu_date = file_info64.tmu_date,
1026 pfile_info->compressed_size = (uLong)file_info64.compressed_size;
1027 pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size;
1036int PrivateMinizip_::unzGoToFirstFile (unzFile file)
1041 return UNZ_PARAMERROR;
1043 s->pos_in_central_dir = s->offset_central_dir;
1045 err = unz64local_GetCurrentFileInfoInternal_ (file, &s->cur_file_info, &s->cur_file_info_internal, NULL, 0, NULL, 0, NULL, 0);
1046 s->current_file_ok = (err == UNZ_OK);
1055int PrivateMinizip_::unzGoToNextFile_ (unzFile file)
1061 return UNZ_PARAMERROR;
1063 if (!s->current_file_ok)
1064 return UNZ_END_OF_LIST_OF_FILE;
1065 if (s->gi.number_entry != 0xffff)
1066 if (s->num_file + 1 == s->gi.number_entry)
1067 return UNZ_END_OF_LIST_OF_FILE;
1069 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;
1071 err = unz64local_GetCurrentFileInfoInternal_ (file, &s->cur_file_info, &s->cur_file_info_internal, NULL, 0, NULL, 0, NULL, 0);
1072 s->current_file_ok = (err == UNZ_OK);
1083int PrivateMinizip_::unzLocateFile_ (unzFile file,
const char* szFileName,
int iCaseSensitivity)
1091 unz_file_info64 cur_file_infoSaved;
1092 unz_file_info64_internal cur_file_info_internalSaved;
1093 ZPOS64_T num_fileSaved;
1094 ZPOS64_T pos_in_central_dirSaved;
1097 return UNZ_PARAMERROR;
1099 if (strlen (szFileName) >= UNZ_MAXFILENAMEINZIP)
1100 return UNZ_PARAMERROR;
1103 if (!s->current_file_ok)
1104 return UNZ_END_OF_LIST_OF_FILE;
1107 num_fileSaved = s->num_file;
1108 pos_in_central_dirSaved = s->pos_in_central_dir;
1109 cur_file_infoSaved = s->cur_file_info;
1110 cur_file_info_internalSaved = s->cur_file_info_internal;
1112 err = unzGoToFirstFile (file);
1114 while (err == UNZ_OK) {
1115 char szCurrentFileName[UNZ_MAXFILENAMEINZIP + 1];
1116 err = unzGetCurrentFileInfo64 (file, NULL, szCurrentFileName,
sizeof (szCurrentFileName) - 1, NULL, 0, NULL, 0);
1117 if (err == UNZ_OK) {
1118 if (unzStringFileNameCompare (szCurrentFileName, szFileName, iCaseSensitivity) == 0)
1120 err = unzGoToNextFile_ (file);
1127 s->num_file = num_fileSaved;
1128 s->pos_in_central_dir = pos_in_central_dirSaved;
1129 s->cur_file_info = cur_file_infoSaved;
1130 s->cur_file_info_internal = cur_file_info_internalSaved;
1137 // Contributed by Ryan Haksi (mailto://cryogen@infoserve.net)
1138 // I need random access
1140 // Further optimization could be realized by adding an ability
1141 // to cache the directory in memory. The goal being a single
1142 // comprehensive file read to put the file I need in a memory.
1153int PrivateMinizip_::unzGetFilePos64 (unzFile file, unz64_file_pos* file_pos)
1157 if (file == NULL or file_pos == NULL)
1158 return UNZ_PARAMERROR;
1160 if (!s->current_file_ok)
1161 return UNZ_END_OF_LIST_OF_FILE;
1163 file_pos->pos_in_zip_directory = s->pos_in_central_dir;
1164 file_pos->num_of_file = s->num_file;
1169int PrivateMinizip_::unzGetFilePos (unzFile file, unz_file_pos* file_pos)
1171 unz64_file_pos file_pos64;
1172 int err = unzGetFilePos64 (file, &file_pos64);
1173 if (err == UNZ_OK) {
1174 file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory;
1175 file_pos->num_of_file = (uLong)file_pos64.num_of_file;
1180int PrivateMinizip_::unzGoToFilePos64 (unzFile file,
const unz64_file_pos* file_pos)
1185 if (file == NULL or file_pos == NULL)
1186 return UNZ_PARAMERROR;
1190 s->pos_in_central_dir = file_pos->pos_in_zip_directory;
1191 s->num_file = file_pos->num_of_file;
1194 err = unz64local_GetCurrentFileInfoInternal_ (file, &s->cur_file_info, &s->cur_file_info_internal, NULL, 0, NULL, 0, NULL, 0);
1196 s->current_file_ok = (err == UNZ_OK);
1200int PrivateMinizip_::unzGoToFilePos (unzFile file, unz_file_pos* file_pos)
1202 unz64_file_pos file_pos64;
1203 if (file_pos == NULL)
1204 return UNZ_PARAMERROR;
1206 file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory;
1207 file_pos64.num_of_file = file_pos->num_of_file;
1208 return unzGoToFilePos64 (file, &file_pos64);
1223int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar, ZPOS64_T* poffset_local_extrafield, uInt* psize_local_extrafield)
1225 uLong uMagic, uData, uFlags;
1226 uLong size_filename;
1227 uLong size_extra_field;
1231 *poffset_local_extrafield = 0;
1232 *psize_local_extrafield = 0;
1234 if (ZSEEK64 (s->z_filefunc, s->filestream, s->cur_file_info_internal.offset_curfile + s->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)
1237 if (err == UNZ_OK) {
1238 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uMagic) != UNZ_OK)
1240 else if (uMagic != 0x04034b50)
1241 err = UNZ_BADZIPFILE;
1244 if (unz64local_getShort (&s->z_filefunc, s->filestream, &uData) != UNZ_OK)
1250 if (unz64local_getShort (&s->z_filefunc, s->filestream, &uFlags) != UNZ_OK)
1253 if (unz64local_getShort (&s->z_filefunc, s->filestream, &uData) != UNZ_OK)
1255 else if ((err == UNZ_OK) and (uData != s->cur_file_info.compression_method))
1256 err = UNZ_BADZIPFILE;
1258 if ((err == UNZ_OK) and (s->cur_file_info.compression_method != 0) &&
1260 (s->cur_file_info.compression_method != Z_BZIP2ED) &&
1262 (s->cur_file_info.compression_method != Z_DEFLATED))
1263 err = UNZ_BADZIPFILE;
1265 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uData) != UNZ_OK)
1268 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uData) != UNZ_OK)
1270 else if ((err == UNZ_OK) and (uData != s->cur_file_info.crc) and ((uFlags & 8) == 0))
1271 err = UNZ_BADZIPFILE;
1273 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uData) != UNZ_OK)
1275 else if (uData != 0xFFFFFFFF and (err == UNZ_OK) and (uData != s->cur_file_info.compressed_size) and ((uFlags & 8) == 0))
1276 err = UNZ_BADZIPFILE;
1278 if (unz64local_getLong (&s->z_filefunc, s->filestream, &uData) != UNZ_OK)
1280 else if (uData != 0xFFFFFFFF and (err == UNZ_OK) and (uData != s->cur_file_info.uncompressed_size) and ((uFlags & 8) == 0))
1281 err = UNZ_BADZIPFILE;
1283 if (unz64local_getShort (&s->z_filefunc, s->filestream, &size_filename) != UNZ_OK)
1285 else if ((err == UNZ_OK) and (size_filename != s->cur_file_info.size_filename))
1286 err = UNZ_BADZIPFILE;
1288 *piSizeVar += (uInt)size_filename;
1290 if (unz64local_getShort (&s->z_filefunc, s->filestream, &size_extra_field) != UNZ_OK)
1292 *poffset_local_extrafield = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + size_filename;
1293 *psize_local_extrafield = (uInt)size_extra_field;
1295 *piSizeVar += (uInt)size_extra_field;
1304int PrivateMinizip_::unzOpenCurrentFile3_ (unzFile file,
int* method,
int* level,
int raw,
const char* password)
1309 file_in_zip64_read_info_s* pfile_in_zip_read_info;
1310 ZPOS64_T offset_local_extrafield;
1311 uInt size_local_extrafield;
1315 if (password != NULL)
1316 return UNZ_PARAMERROR;
1320 return UNZ_PARAMERROR;
1322 if (!s->current_file_ok)
1323 return UNZ_PARAMERROR;
1325 if (s->pfile_in_zip_read != NULL)
1326 unzCloseCurrentFile_ (file);
1328 if (unz64local_CheckCurrentFileCoherencyHeader (s, &iSizeVar, &offset_local_extrafield, &size_local_extrafield) != UNZ_OK)
1329 return UNZ_BADZIPFILE;
1331 pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC (
sizeof (file_in_zip64_read_info_s));
1332 if (pfile_in_zip_read_info == NULL)
1333 return UNZ_INTERNALERROR;
1335 pfile_in_zip_read_info->read_buffer = (
char*)ALLOC (UNZ_BUFSIZE);
1336 pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
1337 pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
1338 pfile_in_zip_read_info->pos_local_extrafield = 0;
1339 pfile_in_zip_read_info->raw = raw;
1341 if (pfile_in_zip_read_info->read_buffer == NULL) {
1342 TRYFREE (pfile_in_zip_read_info);
1343 return UNZ_INTERNALERROR;
1346 pfile_in_zip_read_info->stream_initialised = 0;
1349 *method = (int)s->cur_file_info.compression_method;
1351 if (level != NULL) {
1353 switch (s->cur_file_info.flag & 0x06) {
1366 if ((s->cur_file_info.compression_method != 0) &&
1368 (s->cur_file_info.compression_method != Z_BZIP2ED) &&
1370 (s->cur_file_info.compression_method != Z_DEFLATED))
1372 err = UNZ_BADZIPFILE;
1374 pfile_in_zip_read_info->crc32_wait = s->cur_file_info.crc;
1375 pfile_in_zip_read_info->crc32 = 0;
1376 pfile_in_zip_read_info->total_out_64 = 0;
1377 pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method;
1378 pfile_in_zip_read_info->filestream = s->filestream;
1379 pfile_in_zip_read_info->z_filefunc = s->z_filefunc;
1380 pfile_in_zip_read_info->byte_before_the_zipfile = s->byte_before_the_zipfile;
1382 pfile_in_zip_read_info->stream.total_out = 0;
1384 if ((s->cur_file_info.compression_method == Z_BZIP2ED) and (!raw)) {
1386 pfile_in_zip_read_info->bstream.bzalloc = (
void* (*)(
void*,
int,
int))0;
1387 pfile_in_zip_read_info->bstream.bzfree = (free_func)0;
1388 pfile_in_zip_read_info->bstream.opaque = (voidpf)0;
1389 pfile_in_zip_read_info->bstream.state = (voidpf)0;
1391 pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
1392 pfile_in_zip_read_info->stream.zfree = (free_func)0;
1393 pfile_in_zip_read_info->stream.opaque = (voidpf)0;
1394 pfile_in_zip_read_info->stream.next_in = (voidpf)0;
1395 pfile_in_zip_read_info->stream.avail_in = 0;
1397 err = BZ2_bzDecompressInit (&pfile_in_zip_read_info->bstream, 0, 0);
1399 pfile_in_zip_read_info->stream_initialised = Z_BZIP2ED;
1401 TRYFREE (pfile_in_zip_read_info);
1405 pfile_in_zip_read_info->raw = 1;
1408 else if ((s->cur_file_info.compression_method == Z_DEFLATED) and (!raw)) {
1409 pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
1410 pfile_in_zip_read_info->stream.zfree = (free_func)0;
1411 pfile_in_zip_read_info->stream.opaque = (voidpf)0;
1412 pfile_in_zip_read_info->stream.next_in = 0;
1413 pfile_in_zip_read_info->stream.avail_in = 0;
1415 err = inflateInit2 (&pfile_in_zip_read_info->stream, -MAX_WBITS);
1417 pfile_in_zip_read_info->stream_initialised = Z_DEFLATED;
1419 TRYFREE (pfile_in_zip_read_info);
1430 pfile_in_zip_read_info->rest_read_compressed = s->cur_file_info.compressed_size;
1431 pfile_in_zip_read_info->rest_read_uncompressed = s->cur_file_info.uncompressed_size;
1433 pfile_in_zip_read_info->pos_in_zipfile = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + iSizeVar;
1435 pfile_in_zip_read_info->stream.avail_in = (uInt)0;
1437 s->pfile_in_zip_read = pfile_in_zip_read_info;
1441 if (password != NULL) {
1443 s->pcrc_32_tab = get_crc_table ();
1444 init_keys (password, s->keys, s->pcrc_32_tab);
1445 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)
1446 return UNZ_INTERNALERROR;
1447 if (ZREAD64 (s->z_filefunc, s->filestream, source, 12) < 12)
1448 return UNZ_INTERNALERROR;
1450 for (i = 0; i < 12; ++i)
1451 zdecode (s->keys, s->pcrc_32_tab, source[i]);
1453 s->pfile_in_zip_read->pos_in_zipfile += 12;
1461int PrivateMinizip_::unzOpenCurrentFile (unzFile file)
1463 return unzOpenCurrentFile3_ (file, NULL, NULL, 0, NULL);
1466int PrivateMinizip_::unzOpenCurrentFilePassword (unzFile file,
const char* password)
1468 return unzOpenCurrentFile3_ (file, NULL, NULL, 0, password);
1471int PrivateMinizip_::unzOpenCurrentFile2 (unzFile file,
int* method,
int* level,
int raw)
1473 return unzOpenCurrentFile3_ (file, method, level, raw, NULL);
1478ZPOS64_T PrivateMinizip_::unzGetCurrentFileZStreamPos64 (unzFile file)
1481 file_in_zip64_read_info_s* pfile_in_zip_read_info;
1485 pfile_in_zip_read_info = s->pfile_in_zip_read;
1486 if (pfile_in_zip_read_info == NULL)
1488 return pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile;
1503int PrivateMinizip_::unzReadCurrentFile_ (unzFile file, voidp buf,
unsigned len)
1508 file_in_zip64_read_info_s* pfile_in_zip_read_info;
1510 return UNZ_PARAMERROR;
1512 pfile_in_zip_read_info = s->pfile_in_zip_read;
1514 if (pfile_in_zip_read_info == NULL)
1515 return UNZ_PARAMERROR;
1517 if (pfile_in_zip_read_info->read_buffer == NULL)
1518 return UNZ_END_OF_LIST_OF_FILE;
1522 pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;
1524 pfile_in_zip_read_info->stream.avail_out = (uInt)len;
1526 if ((len > pfile_in_zip_read_info->rest_read_uncompressed) && (!(pfile_in_zip_read_info->raw)))
1527 pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
1529 if ((len > pfile_in_zip_read_info->rest_read_compressed + pfile_in_zip_read_info->stream.avail_in) && (pfile_in_zip_read_info->raw))
1530 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;
1532 while (pfile_in_zip_read_info->stream.avail_out > 0) {
1533 if ((pfile_in_zip_read_info->stream.avail_in == 0) && (pfile_in_zip_read_info->rest_read_compressed > 0)) {
1534 uInt uReadThis = UNZ_BUFSIZE;
1535 if (pfile_in_zip_read_info->rest_read_compressed < uReadThis)
1536 uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;
1539 if (ZSEEK64 (pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream,
1540 pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)
1542 if (ZREAD64 (pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->read_buffer, uReadThis) != uReadThis)
1548 for (i = 0; i < uReadThis; i++)
1549 pfile_in_zip_read_info->read_buffer[i] = zdecode (s->keys, s->pcrc_32_tab, pfile_in_zip_read_info->read_buffer[i]);
1553 pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
1555 pfile_in_zip_read_info->rest_read_compressed -= uReadThis;
1557 pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->read_buffer;
1558 pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
1561 if ((pfile_in_zip_read_info->compression_method == 0) || (pfile_in_zip_read_info->raw)) {
1564 if ((pfile_in_zip_read_info->stream.avail_in == 0) && (pfile_in_zip_read_info->rest_read_compressed == 0))
1565 return (iRead == 0) ? UNZ_EOF : iRead;
1567 if (pfile_in_zip_read_info->stream.avail_out < pfile_in_zip_read_info->stream.avail_in)
1568 uDoCopy = pfile_in_zip_read_info->stream.avail_out;
1570 uDoCopy = pfile_in_zip_read_info->stream.avail_in;
1572 for (i = 0; i < uDoCopy; i++)
1573 *(pfile_in_zip_read_info->stream.next_out + i) = *(pfile_in_zip_read_info->stream.next_in + i);
1575 pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uDoCopy;
1577 pfile_in_zip_read_info->crc32 = crc32 (pfile_in_zip_read_info->crc32, pfile_in_zip_read_info->stream.next_out, uDoCopy);
1578 pfile_in_zip_read_info->rest_read_uncompressed -= uDoCopy;
1579 pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
1580 pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
1581 pfile_in_zip_read_info->stream.next_out += uDoCopy;
1582 pfile_in_zip_read_info->stream.next_in += uDoCopy;
1583 pfile_in_zip_read_info->stream.total_out += uDoCopy;
1586 else if (pfile_in_zip_read_info->compression_method == Z_BZIP2ED) {
1588 uLong uTotalOutBefore, uTotalOutAfter;
1589 const Bytef* bufBefore;
1592 pfile_in_zip_read_info->bstream.next_in = (
char*)pfile_in_zip_read_info->stream.next_in;
1593 pfile_in_zip_read_info->bstream.avail_in = pfile_in_zip_read_info->stream.avail_in;
1594 pfile_in_zip_read_info->bstream.total_in_lo32 = pfile_in_zip_read_info->stream.total_in;
1595 pfile_in_zip_read_info->bstream.total_in_hi32 = 0;
1596 pfile_in_zip_read_info->bstream.next_out = (
char*)pfile_in_zip_read_info->stream.next_out;
1597 pfile_in_zip_read_info->bstream.avail_out = pfile_in_zip_read_info->stream.avail_out;
1598 pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out;
1599 pfile_in_zip_read_info->bstream.total_out_hi32 = 0;
1601 uTotalOutBefore = pfile_in_zip_read_info->bstream.total_out_lo32;
1602 bufBefore = (
const Bytef*)pfile_in_zip_read_info->bstream.next_out;
1604 err = BZ2_bzDecompress (&pfile_in_zip_read_info->bstream);
1606 uTotalOutAfter = pfile_in_zip_read_info->bstream.total_out_lo32;
1607 uOutThis = uTotalOutAfter - uTotalOutBefore;
1609 pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
1611 pfile_in_zip_read_info->crc32 = crc32 (pfile_in_zip_read_info->crc32, bufBefore, (uInt)(uOutThis));
1612 pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis;
1613 iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
1615 pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->bstream.next_in;
1616 pfile_in_zip_read_info->stream.avail_in = pfile_in_zip_read_info->bstream.avail_in;
1617 pfile_in_zip_read_info->stream.total_in = pfile_in_zip_read_info->bstream.total_in_lo32;
1618 pfile_in_zip_read_info->stream.next_out = (Bytef*)pfile_in_zip_read_info->bstream.next_out;
1619 pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out;
1620 pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32;
1622 if (err == BZ_STREAM_END)
1623 return (iRead == 0) ? UNZ_EOF : iRead;
1629 ZPOS64_T uTotalOutBefore, uTotalOutAfter;
1630 const Bytef* bufBefore;
1632 int flush = Z_SYNC_FLUSH;
1634 uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
1635 bufBefore = pfile_in_zip_read_info->stream.next_out;
1643 err = inflate (&pfile_in_zip_read_info->stream, flush);
1645 if ((err >= 0) and (pfile_in_zip_read_info->stream.msg != NULL))
1648 uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
1649 uOutThis = uTotalOutAfter - uTotalOutBefore;
1651 pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
1653 pfile_in_zip_read_info->crc32 = crc32 (pfile_in_zip_read_info->crc32, bufBefore, (uInt)(uOutThis));
1655 pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis;
1657 iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
1659 if (err == Z_STREAM_END)
1660 return (iRead == 0) ? UNZ_EOF : iRead;
1674z_off_t PrivateMinizip_::unztell (unzFile file)
1677 file_in_zip64_read_info_s* pfile_in_zip_read_info;
1679 return UNZ_PARAMERROR;
1681 pfile_in_zip_read_info = s->pfile_in_zip_read;
1683 if (pfile_in_zip_read_info == NULL)
1684 return UNZ_PARAMERROR;
1686 return (z_off_t)pfile_in_zip_read_info->stream.total_out;
1689ZPOS64_T PrivateMinizip_::unztell64 (unzFile file)
1693 file_in_zip64_read_info_s* pfile_in_zip_read_info;
1695 return (ZPOS64_T)-1;
1697 pfile_in_zip_read_info = s->pfile_in_zip_read;
1699 if (pfile_in_zip_read_info == NULL)
1700 return (ZPOS64_T)-1;
1702 return pfile_in_zip_read_info->total_out_64;
1708int PrivateMinizip_::unzeof (unzFile file)
1711 file_in_zip64_read_info_s* pfile_in_zip_read_info;
1713 return UNZ_PARAMERROR;
1715 pfile_in_zip_read_info = s->pfile_in_zip_read;
1717 if (pfile_in_zip_read_info == NULL)
1718 return UNZ_PARAMERROR;
1720 if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
1738int PrivateMinizip_::unzGetLocalExtrafield (unzFile file, voidp buf,
unsigned len)
1741 file_in_zip64_read_info_s* pfile_in_zip_read_info;
1743 ZPOS64_T size_to_read;
1746 return UNZ_PARAMERROR;
1748 pfile_in_zip_read_info = s->pfile_in_zip_read;
1750 if (pfile_in_zip_read_info == NULL)
1751 return UNZ_PARAMERROR;
1753 size_to_read = (pfile_in_zip_read_info->size_local_extrafield - pfile_in_zip_read_info->pos_local_extrafield);
1756 return (
int)size_to_read;
1758 if (len > size_to_read)
1759 read_now = (uInt)size_to_read;
1761 read_now = (uInt)len;
1766 if (ZSEEK64 (pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream,
1767 pfile_in_zip_read_info->offset_local_extrafield + pfile_in_zip_read_info->pos_local_extrafield, ZLIB_FILEFUNC_SEEK_SET) != 0)
1770 if (ZREAD64 (pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, buf, read_now) != read_now)
1773 return (
int)read_now;
1780int PrivateMinizip_::unzCloseCurrentFile_ (unzFile file)
1785 file_in_zip64_read_info_s* pfile_in_zip_read_info;
1787 return UNZ_PARAMERROR;
1789 pfile_in_zip_read_info = s->pfile_in_zip_read;
1791 if (pfile_in_zip_read_info == NULL)
1792 return UNZ_PARAMERROR;
1794 if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && (!pfile_in_zip_read_info->raw)) {
1795 if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
1799 TRYFREE (pfile_in_zip_read_info->read_buffer);
1800 pfile_in_zip_read_info->read_buffer = NULL;
1801 if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED)
1802 inflateEnd (&pfile_in_zip_read_info->stream);
1804 else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED)
1805 BZ2_bzDecompressEnd (&pfile_in_zip_read_info->bstream);
1808 pfile_in_zip_read_info->stream_initialised = 0;
1809 TRYFREE (pfile_in_zip_read_info);
1811 s->pfile_in_zip_read = NULL;
1821int PrivateMinizip_::unzGetGlobalComment (unzFile file,
char* szComment, uLong uSizeBuf)
1826 return (
int)UNZ_PARAMERROR;
1829 uReadThis = uSizeBuf;
1830 if (uReadThis > s->gi.size_comment)
1831 uReadThis = s->gi.size_comment;
1833 if (ZSEEK64 (s->z_filefunc, s->filestream, s->central_pos + 22, ZLIB_FILEFUNC_SEEK_SET) != 0)
1836 if (uReadThis > 0) {
1838 if (ZREAD64 (s->z_filefunc, s->filestream, szComment, uReadThis) != uReadThis)
1842 if ((szComment != NULL) and (uSizeBuf > s->gi.size_comment))
1843 *(szComment + s->gi.size_comment) =
'\0';
1844 return (
int)uReadThis;
1848ZPOS64_T PrivateMinizip_::unzGetOffset64 (unzFile file)
1855 if (!s->current_file_ok)
1857 if (s->gi.number_entry != 0 and s->gi.number_entry != 0xffff)
1858 if (s->num_file == s->gi.number_entry)
1860 return s->pos_in_central_dir;
1863uLong PrivateMinizip_::unzGetOffset (unzFile file)
1869 offset64 = unzGetOffset64 (file);
1870 return (uLong)offset64;
1873int PrivateMinizip_::unzSetOffset64 (unzFile file, ZPOS64_T pos)
1879 return UNZ_PARAMERROR;
1882 s->pos_in_central_dir = pos;
1883 s->num_file = s->gi.number_entry;
1884 err = unz64local_GetCurrentFileInfoInternal_ (file, &s->cur_file_info, &s->cur_file_info_internal, NULL, 0, NULL, 0, NULL, 0);
1885 s->current_file_ok = (err == UNZ_OK);
1889int PrivateMinizip_::unzSetOffset (unzFile file, uLong pos)
1891 return unzSetOffset64 (file, pos);
1897#ifndef VERSIONMADEBY
1898#define VERSIONMADEBY (0x0)
1902#define Z_BUFSIZE (64 * 1024)
1905#ifndef Z_MAXFILENAMEINZIP
1906#define Z_MAXFILENAMEINZIP (256)
1910#define ALLOC(size) (malloc (size))
1921#define MAKEULONG64(a, b) ((ZPOS64_T)(((unsigned long)(a)) | ((ZPOS64_T)((unsigned long)(b))) << 32))
1935#ifndef DEF_MEM_LEVEL
1936#if MAX_MEM_LEVEL >= 8
1937#define DEF_MEM_LEVEL 8
1939#define DEF_MEM_LEVEL MAX_MEM_LEVEL
1943 [[maybe_unused]]
const char zip_copyright[] =
" zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
1945#define SIZEDATA_INDATABLOCK (4096 - (4 * 4))
1947#define LOCALHEADERMAGIC (0x04034b50)
1948#define CENTRALHEADERMAGIC (0x02014b50)
1949#define ENDHEADERMAGIC (0x06054b50)
1950#define ZIP64ENDHEADERMAGIC (0x6064b50)
1951#define ZIP64ENDLOCHEADERMAGIC (0x7064b50)
1953#define FLAG_LOCALHEADER_OFFSET (0x06)
1954#define CRC_LOCALHEADER_OFFSET (0x0e)
1956#define SIZECENTRALHEADER (0x2e)
1958 typedef struct linkedlist_datablock_internal_s {
1959 struct linkedlist_datablock_internal_s* next_datablock;
1960 uLong avail_in_this_block;
1961 uLong filled_in_this_block;
1963 unsigned char data[SIZEDATA_INDATABLOCK];
1964 } linkedlist_datablock_internal;
1966 typedef struct linkedlist_data_s {
1967 linkedlist_datablock_internal* first_block;
1968 linkedlist_datablock_internal* last_block;
1977 int stream_initialised;
1978 uInt pos_in_buffered_data;
1980 ZPOS64_T pos_local_header;
1982 char* central_header;
1983 uLong size_centralExtra;
1984 uLong size_centralheader;
1985 uLong size_centralExtraFree;
1990 Byte buffered_data[Z_BUFSIZE];
1995 ZPOS64_T pos_zip64extrainfo;
1996 ZPOS64_T totalCompressedData;
1997 ZPOS64_T totalUncompressedData;
1999 unsigned long keys[3];
2000 const z_crc_t* pcrc_32_tab;
2001 unsigned crypt_header_size;
2006 zlib_filefunc64_32_def z_filefunc;
2008 linkedlist_data central_dir;
2009 int in_opened_file_inzip;
2013 ZPOS64_T add_position_when_writing_offset;
2014 ZPOS64_T number_entry;
2016#ifndef NO_ADDFILEINEXISTINGZIP
2017 char* globalcomment;
2022 linkedlist_datablock_internal* allocate_new_datablock (
void)
2024 linkedlist_datablock_internal* ldi;
2025 ldi = (linkedlist_datablock_internal*)ALLOC (
sizeof (linkedlist_datablock_internal));
2027 ldi->next_datablock = NULL;
2028 ldi->filled_in_this_block = 0;
2029 ldi->avail_in_this_block = SIZEDATA_INDATABLOCK;
2034 void free_datablock (linkedlist_datablock_internal* ldi)
2036 while (ldi != NULL) {
2037 linkedlist_datablock_internal* ldinext = ldi->next_datablock;
2043 void init_linkedlist (linkedlist_data* ll)
2045 ll->first_block = ll->last_block = NULL;
2048 void free_linkedlist (linkedlist_data* ll)
2050 free_datablock (ll->first_block);
2051 ll->first_block = ll->last_block = NULL;
2054 int add_data_in_datablock (linkedlist_data* ll,
const void* buf, uLong len)
2056 linkedlist_datablock_internal* ldi;
2057 const unsigned char* from_copy;
2060 return ZIP_INTERNALERROR;
2062 if (ll->last_block == NULL) {
2063 ll->first_block = ll->last_block = allocate_new_datablock ();
2064 if (ll->first_block == NULL)
2065 return ZIP_INTERNALERROR;
2068 ldi = ll->last_block;
2069 from_copy = (
const unsigned char*)buf;
2074 unsigned char* to_copy;
2076 if (ldi->avail_in_this_block == 0) {
2077 ldi->next_datablock = allocate_new_datablock ();
2078 if (ldi->next_datablock == NULL)
2079 return ZIP_INTERNALERROR;
2080 ldi = ldi->next_datablock;
2081 ll->last_block = ldi;
2084 if (ldi->avail_in_this_block < len)
2085 copy_this = (uInt)ldi->avail_in_this_block;
2087 copy_this = (uInt)len;
2089 to_copy = &(ldi->data[ldi->filled_in_this_block]);
2091 for (i = 0; i < copy_this; i++)
2092 *(to_copy + i) = *(from_copy + i);
2094 ldi->filled_in_this_block += copy_this;
2095 ldi->avail_in_this_block -= copy_this;
2096 from_copy += copy_this;
2104#ifndef NO_ADDFILEINEXISTINGZIP
2110 int zip64local_putValue (
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x,
int nbByte)
2112 unsigned char buf[8];
2114 for (n = 0; n < nbByte; n++) {
2115 buf[n] = (
unsigned char)(x & 0xff);
2119 for (n = 0; n < nbByte; n++) {
2124 if (ZWRITE64 (*pzlib_filefunc_def, filestream, buf, (uLong)nbByte) != (uLong)nbByte)
2130 void zip64local_putValue_inmemory (
void* dest, ZPOS64_T x,
int nbByte)
2132 unsigned char* buf = (
unsigned char*)dest;
2134 for (n = 0; n < nbByte; n++) {
2135 buf[n] = (
unsigned char)(x & 0xff);
2140 for (n = 0; n < nbByte; n++) {
2148 uLong zip64local_TmzDateToDosDate (
const tm_zip* ptm)
2150 uLong year = (uLong)ptm->tm_year;
2153 else if (year >= 80)
2155 return (uLong)(((uLong)(ptm->tm_mday) + (32 * (uLong)(ptm->tm_mon + 1)) + (512 * year)) << 16) |
2156 (((uLong)ptm->tm_sec / 2) + (32 * (uLong)ptm->tm_min) + (2048 * (uLong)ptm->tm_hour));
2161 int zip64local_getByte (
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream,
int* pi)
2164 int err = (int)ZREAD64 (*pzlib_filefunc_def, filestream, &c, 1);
2170 if (ZERROR64 (*pzlib_filefunc_def, filestream))
2180 int zip64local_getShort (
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX)
2186 err = zip64local_getByte (pzlib_filefunc_def, filestream, &i);
2190 err = zip64local_getByte (pzlib_filefunc_def, filestream, &i);
2191 x += ((uLong)i) << 8;
2200 int zip64local_getLong (
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX)
2206 err = zip64local_getByte (pzlib_filefunc_def, filestream, &i);
2210 err = zip64local_getByte (pzlib_filefunc_def, filestream, &i);
2211 x += ((uLong)i) << 8;
2214 err = zip64local_getByte (pzlib_filefunc_def, filestream, &i);
2215 x += ((uLong)i) << 16;
2218 err = zip64local_getByte (pzlib_filefunc_def, filestream, &i);
2219 x += ((uLong)i) << 24;
2228 int zip64local_getLong64 (
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T* pX)
2234 err = zip64local_getByte (pzlib_filefunc_def, filestream, &i);
2238 err = zip64local_getByte (pzlib_filefunc_def, filestream, &i);
2239 x += ((ZPOS64_T)i) << 8;
2242 err = zip64local_getByte (pzlib_filefunc_def, filestream, &i);
2243 x += ((ZPOS64_T)i) << 16;
2246 err = zip64local_getByte (pzlib_filefunc_def, filestream, &i);
2247 x += ((ZPOS64_T)i) << 24;
2250 err = zip64local_getByte (pzlib_filefunc_def, filestream, &i);
2251 x += ((ZPOS64_T)i) << 32;
2254 err = zip64local_getByte (pzlib_filefunc_def, filestream, &i);
2255 x += ((ZPOS64_T)i) << 40;
2258 err = zip64local_getByte (pzlib_filefunc_def, filestream, &i);
2259 x += ((ZPOS64_T)i) << 48;
2262 err = zip64local_getByte (pzlib_filefunc_def, filestream, &i);
2263 x += ((ZPOS64_T)i) << 56;
2273#ifndef BUFREADCOMMENT
2274#define BUFREADCOMMENT (0x400)
2280 ZPOS64_T zip64local_SearchCentralDir (
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)
2285 ZPOS64_T uMaxBack = 0xffff;
2286 ZPOS64_T uPosFound = 0;
2288 if (ZSEEK64 (*pzlib_filefunc_def, filestream, 0, ZLIB_FILEFUNC_SEEK_END) != 0)
2291 uSizeFile = ZTELL64 (*pzlib_filefunc_def, filestream);
2293 if (uMaxBack > uSizeFile)
2294 uMaxBack = uSizeFile;
2296 buf = (
unsigned char*)ALLOC (BUFREADCOMMENT + 4);
2301 while (uBackRead < uMaxBack) {
2305 if (uBackRead + BUFREADCOMMENT > uMaxBack)
2306 uBackRead = uMaxBack;
2308 uBackRead += BUFREADCOMMENT;
2309 uReadPos = uSizeFile - uBackRead;
2311 uReadSize = ((BUFREADCOMMENT + 4) < (uSizeFile - uReadPos)) ? (BUFREADCOMMENT + 4) : (uLong)(uSizeFile - uReadPos);
2312 if (ZSEEK64 (*pzlib_filefunc_def, filestream, uReadPos, ZLIB_FILEFUNC_SEEK_SET) != 0)
2315 if (ZREAD64 (*pzlib_filefunc_def, filestream, buf, uReadSize) != uReadSize)
2318 for (i = (
int)uReadSize - 3; (i--) > 0;)
2319 if (((*(buf + i)) == 0x50) && ((*(buf + i + 1)) == 0x4b) && ((*(buf + i + 2)) == 0x05) && ((*(buf + i + 3)) == 0x06)) {
2320 uPosFound = uReadPos + (unsigned)i;
2335 ZPOS64_T zip64local_SearchCentralDir64 (
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)
2340 ZPOS64_T uMaxBack = 0xffff;
2341 ZPOS64_T uPosFound = 0;
2343 ZPOS64_T relativeOffset;
2345 if (ZSEEK64 (*pzlib_filefunc_def, filestream, 0, ZLIB_FILEFUNC_SEEK_END) != 0)
2348 uSizeFile = ZTELL64 (*pzlib_filefunc_def, filestream);
2350 if (uMaxBack > uSizeFile)
2351 uMaxBack = uSizeFile;
2353 buf = (
unsigned char*)ALLOC (BUFREADCOMMENT + 4);
2358 while (uBackRead < uMaxBack) {
2362 if (uBackRead + BUFREADCOMMENT > uMaxBack)
2363 uBackRead = uMaxBack;
2365 uBackRead += BUFREADCOMMENT;
2366 uReadPos = uSizeFile - uBackRead;
2368 uReadSize = ((BUFREADCOMMENT + 4) < (uSizeFile - uReadPos)) ? (BUFREADCOMMENT + 4) : (uLong)(uSizeFile - uReadPos);
2369 if (ZSEEK64 (*pzlib_filefunc_def, filestream, uReadPos, ZLIB_FILEFUNC_SEEK_SET) != 0)
2372 if (ZREAD64 (*pzlib_filefunc_def, filestream, buf, uReadSize) != uReadSize)
2375 for (i = (
int)uReadSize - 3; (i--) > 0;) {
2377 if (((*(buf + i)) == 0x50) && ((*(buf + i + 1)) == 0x4b) && ((*(buf + i + 2)) == 0x06) && ((*(buf + i + 3)) == 0x07)) {
2378 uPosFound = uReadPos + (unsigned)i;
2392 if (ZSEEK64 (*pzlib_filefunc_def, filestream, uPosFound, ZLIB_FILEFUNC_SEEK_SET) != 0)
2396 if (zip64local_getLong (pzlib_filefunc_def, filestream, &uL) != ZIP_OK)
2400 if (zip64local_getLong (pzlib_filefunc_def, filestream, &uL) != ZIP_OK)
2406 if (zip64local_getLong64 (pzlib_filefunc_def, filestream, &relativeOffset) != ZIP_OK)
2410 if (zip64local_getLong (pzlib_filefunc_def, filestream, &uL) != ZIP_OK)
2416 if (ZSEEK64 (*pzlib_filefunc_def, filestream, relativeOffset, ZLIB_FILEFUNC_SEEK_SET) != 0)
2420 if (zip64local_getLong (pzlib_filefunc_def, filestream, &uL) != ZIP_OK)
2423 if (uL != 0x06064b50)
2426 return relativeOffset;
2429 int LoadCentralDirectoryRecord (zip64_internal* pziinit)
2432 ZPOS64_T byte_before_the_zipfile;
2434 ZPOS64_T size_central_dir;
2435 ZPOS64_T offset_central_dir;
2436 ZPOS64_T central_pos;
2441 uLong number_disk_with_CD;
2443 ZPOS64_T number_entry;
2444 ZPOS64_T number_entry_CD;
2447 uLong VersionMadeBy;
2448 uLong VersionNeeded;
2451 int hasZIP64Record = 0;
2454 central_pos = zip64local_SearchCentralDir64 (&pziinit->z_filefunc, pziinit->filestream);
2455 if (central_pos > 0) {
2458 else if (central_pos == 0) {
2459 central_pos = zip64local_SearchCentralDir (&pziinit->z_filefunc, pziinit->filestream);
2467 if (hasZIP64Record) {
2468 ZPOS64_T sizeEndOfCentralDirectory;
2469 if (ZSEEK64 (pziinit->z_filefunc, pziinit->filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
2473 if (zip64local_getLong (&pziinit->z_filefunc, pziinit->filestream, &uL) != ZIP_OK)
2477 if (zip64local_getLong64 (&pziinit->z_filefunc, pziinit->filestream, &sizeEndOfCentralDirectory) != ZIP_OK)
2481 if (zip64local_getShort (&pziinit->z_filefunc, pziinit->filestream, &VersionMadeBy) != ZIP_OK)
2485 if (zip64local_getShort (&pziinit->z_filefunc, pziinit->filestream, &VersionNeeded) != ZIP_OK)
2489 if (zip64local_getLong (&pziinit->z_filefunc, pziinit->filestream, &number_disk) != ZIP_OK)
2493 if (zip64local_getLong (&pziinit->z_filefunc, pziinit->filestream, &number_disk_with_CD) != ZIP_OK)
2497 if (zip64local_getLong64 (&pziinit->z_filefunc, pziinit->filestream, &number_entry) != ZIP_OK)
2501 if (zip64local_getLong64 (&pziinit->z_filefunc, pziinit->filestream, &number_entry_CD) != ZIP_OK)
2504 if ((number_entry_CD != number_entry) || (number_disk_with_CD != 0) || (number_disk != 0))
2505 err = ZIP_BADZIPFILE;
2508 if (zip64local_getLong64 (&pziinit->z_filefunc, pziinit->filestream, &size_central_dir) != ZIP_OK)
2513 if (zip64local_getLong64 (&pziinit->z_filefunc, pziinit->filestream, &offset_central_dir) != ZIP_OK)
2522 if (ZSEEK64 (pziinit->z_filefunc, pziinit->filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
2526 if (zip64local_getLong (&pziinit->z_filefunc, pziinit->filestream, &uL) != ZIP_OK)
2530 if (zip64local_getShort (&pziinit->z_filefunc, pziinit->filestream, &number_disk) != ZIP_OK)
2534 if (zip64local_getShort (&pziinit->z_filefunc, pziinit->filestream, &number_disk_with_CD) != ZIP_OK)
2539 if (zip64local_getShort (&pziinit->z_filefunc, pziinit->filestream, &uL) != ZIP_OK)
2545 number_entry_CD = 0;
2546 if (zip64local_getShort (&pziinit->z_filefunc, pziinit->filestream, &uL) != ZIP_OK)
2549 number_entry_CD = uL;
2551 if ((number_entry_CD != number_entry) || (number_disk_with_CD != 0) || (number_disk != 0))
2552 err = ZIP_BADZIPFILE;
2555 size_central_dir = 0;
2556 if (zip64local_getLong (&pziinit->z_filefunc, pziinit->filestream, &uL) != ZIP_OK)
2559 size_central_dir = uL;
2562 offset_central_dir = 0;
2563 if (zip64local_getLong (&pziinit->z_filefunc, pziinit->filestream, &uL) != ZIP_OK)
2566 offset_central_dir = uL;
2569 if (zip64local_getShort (&pziinit->z_filefunc, pziinit->filestream, &size_comment) != ZIP_OK)
2573 if ((central_pos < offset_central_dir + size_central_dir) && (err == ZIP_OK))
2574 err = ZIP_BADZIPFILE;
2576 if (err != ZIP_OK) {
2577 ZCLOSE64 (pziinit->z_filefunc, pziinit->filestream);
2581 if (size_comment > 0) {
2582 pziinit->globalcomment = (
char*)ALLOC (size_comment + 1);
2583 if (pziinit->globalcomment) {
2584 size_comment = ZREAD64 (pziinit->z_filefunc, pziinit->filestream, pziinit->globalcomment, size_comment);
2585 pziinit->globalcomment[size_comment] = 0;
2589 byte_before_the_zipfile = central_pos - (offset_central_dir + size_central_dir);
2590 pziinit->add_position_when_writing_offset = byte_before_the_zipfile;
2593 ZPOS64_T size_central_dir_to_read = size_central_dir;
2594 size_t buf_size = SIZEDATA_INDATABLOCK;
2595 void* buf_read = (
void*)ALLOC (buf_size);
2596 if (ZSEEK64 (pziinit->z_filefunc, pziinit->filestream, offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)
2599 while ((size_central_dir_to_read > 0) && (err == ZIP_OK)) {
2600 ZPOS64_T read_this = SIZEDATA_INDATABLOCK;
2601 if (read_this > size_central_dir_to_read)
2602 read_this = size_central_dir_to_read;
2604 if (ZREAD64 (pziinit->z_filefunc, pziinit->filestream, buf_read, (uLong)read_this) != read_this)
2608 err = add_data_in_datablock (&pziinit->central_dir, buf_read, (uLong)read_this);
2610 size_central_dir_to_read -= read_this;
2614 pziinit->begin_pos = byte_before_the_zipfile;
2615 pziinit->number_entry = number_entry_CD;
2617 if (ZSEEK64 (pziinit->z_filefunc, pziinit->filestream, offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)
2627zipFile PrivateMinizip_::zipOpen3 (
const void* pathname,
int append, zipcharpc* globalcomment, zlib_filefunc64_32_def* pzlib_filefunc64_32_def)
2629 zip64_internal ziinit;
2633 ziinit.z_filefunc.zseek32_file = NULL;
2634 ziinit.z_filefunc.ztell32_file = NULL;
2637 Require (pzlib_filefunc64_32_def != NULL);
2638 ziinit.z_filefunc = *pzlib_filefunc64_32_def;
2640 if (pzlib_filefunc64_32_def == NULL)
2641 fill_fopen64_filefunc (&ziinit.z_filefunc.zfile_func64);
2643 ziinit.z_filefunc = *pzlib_filefunc64_32_def;
2647 ZOPEN64 (ziinit.z_filefunc, pathname,
2648 (append == APPEND_STATUS_CREATE) ? (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE)
2649 : (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING));
2651 if (ziinit.filestream == NULL)
2654 if (append == APPEND_STATUS_CREATEAFTER)
2655 ZSEEK64 (ziinit.z_filefunc, ziinit.filestream, 0, SEEK_END);
2657 ziinit.begin_pos = ZTELL64 (ziinit.z_filefunc, ziinit.filestream);
2658 ziinit.in_opened_file_inzip = 0;
2659 ziinit.ci.stream_initialised = 0;
2660 ziinit.number_entry = 0;
2661 ziinit.add_position_when_writing_offset = 0;
2662 init_linkedlist (&(ziinit.central_dir));
2664 zi = (zip64_internal*)ALLOC (
sizeof (zip64_internal));
2666 ZCLOSE64 (ziinit.z_filefunc, ziinit.filestream);
2671#ifndef NO_ADDFILEINEXISTINGZIP
2672 ziinit.globalcomment = NULL;
2673 if (append == APPEND_STATUS_ADDINZIP) {
2675 err = LoadCentralDirectoryRecord (&ziinit);
2678 if (globalcomment) {
2679 *globalcomment = ziinit.globalcomment;
2683 if (err != ZIP_OK) {
2684#ifndef NO_ADDFILEINEXISTINGZIP
2685 free (ziinit.globalcomment);
2696zipFile PrivateMinizip_::zipOpen2 (
const char* pathname,
int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc32_def)
2698 if (pzlib_filefunc32_def != NULL) {
2699 zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
2700 fill_zlib_filefunc64_32_def_from_filefunc32 (&zlib_filefunc64_32_def_fill, pzlib_filefunc32_def);
2701 return zipOpen3 (pathname, append, globalcomment, &zlib_filefunc64_32_def_fill);
2704 return zipOpen3 (pathname, append, globalcomment, NULL);
2707zipFile PrivateMinizip_::zipOpen2_64 (
const void* pathname,
int append, zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def)
2709 if (pzlib_filefunc_def != NULL) {
2710 zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
2711 zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;
2712 zlib_filefunc64_32_def_fill.ztell32_file = NULL;
2713 zlib_filefunc64_32_def_fill.zseek32_file = NULL;
2714 return zipOpen3 (pathname, append, globalcomment, &zlib_filefunc64_32_def_fill);
2717 return zipOpen3 (pathname, append, globalcomment, NULL);
2720zipFile PrivateMinizip_::zipOpen (
const char* pathname,
int append)
2722 return zipOpen3 ((
const void*)pathname, append, NULL, NULL);
2725zipFile PrivateMinizip_::zipOpen64 (
const void* pathname,
int append)
2727 return zipOpen3 (pathname, append, NULL, NULL);
2732 int Write_LocalFileHeader (zip64_internal* zi,
const char* filename, uInt size_extrafield_local,
const void* extrafield_local)
2736 uInt size_filename = (uInt)strlen (filename);
2737 uInt size_extrafield = size_extrafield_local;
2739 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)LOCALHEADERMAGIC, 4);
2741 if (err == ZIP_OK) {
2743 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)45, 2);
2745 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)20, 2);
2749 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)zi->ci.flag, 2);
2752 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)zi->ci.method, 2);
2755 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)zi->ci.dosDate, 4);
2759 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)0, 4);
2760 if (err == ZIP_OK) {
2762 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)0xFFFFFFFF, 4);
2764 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)0, 4);
2766 if (err == ZIP_OK) {
2768 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)0xFFFFFFFF, 4);
2770 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)0, 4);
2774 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)size_filename, 2);
2777 size_extrafield += 20;
2781 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)size_extrafield, 2);
2783 if ((err == ZIP_OK) && (size_filename > 0)) {
2784 if (ZWRITE64 (zi->z_filefunc, zi->filestream, filename, size_filename) != size_filename)
2788 if ((err == ZIP_OK) && (size_extrafield_local > 0)) {
2789 if (ZWRITE64 (zi->z_filefunc, zi->filestream, extrafield_local, size_extrafield_local) != size_extrafield_local)
2793 if ((err == ZIP_OK) && (zi->ci.zip64)) {
2795 constexpr short HeaderID = 1;
2796 constexpr short DataSize = 16;
2797 constexpr ZPOS64_T CompressedSize = 0;
2798 constexpr ZPOS64_T UncompressedSize = 0;
2801 zi->ci.pos_zip64extrainfo = ZTELL64 (zi->z_filefunc, zi->filestream);
2803 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (ZPOS64_T)HeaderID, 2);
2804 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (ZPOS64_T)DataSize, 2);
2806 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (ZPOS64_T)UncompressedSize, 8);
2807 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (ZPOS64_T)CompressedSize, 8);
2821int PrivateMinizip_::zipOpenNewFileInZip4_64 (zipFile file,
const char* filename,
const zip_fileinfo* zipfi,
const void* extrafield_local,
2822 uInt size_extrafield_local,
const void* extrafield_global, uInt size_extrafield_global,
2823 const char* comment,
int method,
int level,
int raw,
int windowBits,
int memLevel,
int strategy,
2824 const char* password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase,
int zip64)
2834 if (password != NULL)
2835 return ZIP_PARAMERROR;
2839 return ZIP_PARAMERROR;
2842 if ((method != 0) && (method != Z_DEFLATED) && (method != Z_BZIP2ED))
2843 return ZIP_PARAMERROR;
2845 if ((method != 0) && (method != Z_DEFLATED))
2846 return ZIP_PARAMERROR;
2850 if ((filename != NULL) && (strlen (filename) > 0xffff))
2851 return ZIP_PARAMERROR;
2852 if ((comment != NULL) && (strlen (comment) > 0xffff))
2853 return ZIP_PARAMERROR;
2857 if ((size_extrafield_local > 0xffff) || (size_extrafield_global > 0xffff))
2858 return ZIP_PARAMERROR;
2860 zi = (zip64_internal*)file;
2862 if (zi->in_opened_file_inzip == 1) {
2863 err = zipCloseFileInZip (file);
2868 if (filename == NULL)
2871 if (comment == NULL)
2874 size_comment = (uInt)strlen (comment);
2876 size_filename = (uInt)strlen (filename);
2881 if (zipfi->dosDate != 0)
2882 zi->ci.dosDate = zipfi->dosDate;
2884 zi->ci.dosDate = zip64local_TmzDateToDosDate (&zipfi->tmz_date);
2887 zi->ci.flag = flagBase;
2888 if ((level == 8) || (level == 9))
2894 if (password != NULL)
2898 zi->ci.method = method;
2900 zi->ci.stream_initialised = 0;
2901 zi->ci.pos_in_buffered_data = 0;
2903 zi->ci.pos_local_header = ZTELL64 (zi->z_filefunc, zi->filestream);
2905 zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + size_extrafield_global + size_comment;
2906 zi->ci.size_centralExtraFree = 32;
2908 zi->ci.central_header = (
char*)ALLOC ((uInt)zi->ci.size_centralheader + zi->ci.size_centralExtraFree);
2910 zi->ci.size_centralExtra = size_extrafield_global;
2911 zip64local_putValue_inmemory (zi->ci.central_header, (uLong)CENTRALHEADERMAGIC, 4);
2913 zip64local_putValue_inmemory (zi->ci.central_header + 4, (uLong)versionMadeBy, 2);
2914 zip64local_putValue_inmemory (zi->ci.central_header + 6, (uLong)20, 2);
2915 zip64local_putValue_inmemory (zi->ci.central_header + 8, (uLong)zi->ci.flag, 2);
2916 zip64local_putValue_inmemory (zi->ci.central_header + 10, (uLong)zi->ci.method, 2);
2917 zip64local_putValue_inmemory (zi->ci.central_header + 12, (uLong)zi->ci.dosDate, 4);
2918 zip64local_putValue_inmemory (zi->ci.central_header + 16, (uLong)0, 4);
2919 zip64local_putValue_inmemory (zi->ci.central_header + 20, (uLong)0, 4);
2920 zip64local_putValue_inmemory (zi->ci.central_header + 24, (uLong)0, 4);
2921 zip64local_putValue_inmemory (zi->ci.central_header + 28, (uLong)size_filename, 2);
2922 zip64local_putValue_inmemory (zi->ci.central_header + 30, (uLong)size_extrafield_global, 2);
2923 zip64local_putValue_inmemory (zi->ci.central_header + 32, (uLong)size_comment, 2);
2924 zip64local_putValue_inmemory (zi->ci.central_header + 34, (uLong)0, 2);
2927 zip64local_putValue_inmemory (zi->ci.central_header + 36, (uLong)0, 2);
2929 zip64local_putValue_inmemory (zi->ci.central_header + 36, (uLong)zipfi->internal_fa, 2);
2932 zip64local_putValue_inmemory (zi->ci.central_header + 38, (uLong)0, 4);
2934 zip64local_putValue_inmemory (zi->ci.central_header + 38, (uLong)zipfi->external_fa, 4);
2936 if (zi->ci.pos_local_header >= 0xffffffff)
2937 zip64local_putValue_inmemory (zi->ci.central_header + 42, (uLong)0xffffffff, 4);
2939 zip64local_putValue_inmemory (zi->ci.central_header + 42, (uLong)zi->ci.pos_local_header - zi->add_position_when_writing_offset, 4);
2941 for (i = 0; i < size_filename; i++)
2942 *(zi->ci.central_header + SIZECENTRALHEADER + i) = *(filename + i);
2944 for (i = 0; i < size_extrafield_global; i++)
2945 *(zi->ci.central_header + SIZECENTRALHEADER + size_filename + i) = *(((
const char*)extrafield_global) + i);
2947 for (i = 0; i < size_comment; i++)
2948 *(zi->ci.central_header + SIZECENTRALHEADER + size_filename + size_extrafield_global + i) = *(comment + i);
2949 if (zi->ci.central_header == NULL)
2950 return ZIP_INTERNALERROR;
2952 zi->ci.zip64 = zip64;
2953 zi->ci.totalCompressedData = 0;
2954 zi->ci.totalUncompressedData = 0;
2955 zi->ci.pos_zip64extrainfo = 0;
2957 err = Write_LocalFileHeader (zi, filename, size_extrafield_local, extrafield_local);
2960 zi->ci.bstream.avail_in = (uInt)0;
2961 zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE;
2962 zi->ci.bstream.next_out = (
char*)zi->ci.buffered_data;
2963 zi->ci.bstream.total_in_hi32 = 0;
2964 zi->ci.bstream.total_in_lo32 = 0;
2965 zi->ci.bstream.total_out_hi32 = 0;
2966 zi->ci.bstream.total_out_lo32 = 0;
2969 zi->ci.stream.avail_in = (uInt)0;
2970 zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
2971 zi->ci.stream.next_out = zi->ci.buffered_data;
2972 zi->ci.stream.total_in = 0;
2973 zi->ci.stream.total_out = 0;
2974 zi->ci.stream.data_type = Z_BINARY;
2977 if ((err == ZIP_OK) && (zi->ci.method == Z_DEFLATED || zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw))
2979 if ((err == ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
2982 if (zi->ci.method == Z_DEFLATED) {
2983 zi->ci.stream.zalloc = (alloc_func)0;
2984 zi->ci.stream.zfree = (free_func)0;
2985 zi->ci.stream.opaque = (voidpf)0;
2988 windowBits = -windowBits;
2990 err = deflateInit2 (&zi->ci.stream, level, Z_DEFLATED, windowBits, memLevel, strategy);
2993 zi->ci.stream_initialised = Z_DEFLATED;
2995 else if (zi->ci.method == Z_BZIP2ED) {
2998 zi->ci.bstream.bzalloc = 0;
2999 zi->ci.bstream.bzfree = 0;
3000 zi->ci.bstream.opaque = (voidpf)0;
3002 err = BZ2_bzCompressInit (&zi->ci.bstream, level, 0, 35);
3004 zi->ci.stream_initialised = Z_BZIP2ED;
3010 zi->ci.crypt_header_size = 0;
3011 if ((err == Z_OK) && (password != NULL)) {
3012 unsigned char bufHead[RAND_HEAD_LEN];
3013 unsigned int sizeHead;
3015 zi->ci.pcrc_32_tab = get_crc_table ();
3018 sizeHead = crypthead (password, bufHead, RAND_HEAD_LEN, zi->ci.keys, zi->ci.pcrc_32_tab, crcForCrypting);
3019 zi->ci.crypt_header_size = sizeHead;
3021 if (ZWRITE64 (zi->z_filefunc, zi->filestream, bufHead, sizeHead) != sizeHead)
3027 zi->in_opened_file_inzip = 1;
3031int PrivateMinizip_::zipOpenNewFileInZip4 (zipFile file,
const char* filename,
const zip_fileinfo* zipfi,
const void* extrafield_local,
3032 uInt size_extrafield_local,
const void* extrafield_global, uInt size_extrafield_global,
3033 const char* comment,
int method,
int level,
int raw,
int windowBits,
int memLevel,
int strategy,
3034 const char* password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase)
3036 return zipOpenNewFileInZip4_64 (file, filename, zipfi, extrafield_local, size_extrafield_local, extrafield_global, size_extrafield_global, comment,
3037 method, level, raw, windowBits, memLevel, strategy, password, crcForCrypting, versionMadeBy, flagBase, 0);
3040int PrivateMinizip_::zipOpenNewFileInZip3 (zipFile file,
const char* filename,
const zip_fileinfo* zipfi,
const void* extrafield_local,
3041 uInt size_extrafield_local,
const void* extrafield_global, uInt size_extrafield_global,
3042 const char* comment,
int method,
int level,
int raw,
int windowBits,
int memLevel,
int strategy,
3043 const char* password, uLong crcForCrypting)
3045 return zipOpenNewFileInZip4_64 (file, filename, zipfi, extrafield_local, size_extrafield_local, extrafield_global, size_extrafield_global,
3046 comment, method, level, raw, windowBits, memLevel, strategy, password, crcForCrypting, VERSIONMADEBY, 0, 0);
3049int PrivateMinizip_::zipOpenNewFileInZip3_64 (zipFile file,
const char* filename,
const zip_fileinfo* zipfi,
const void* extrafield_local,
3050 uInt size_extrafield_local,
const void* extrafield_global, uInt size_extrafield_global,
3051 const char* comment,
int method,
int level,
int raw,
int windowBits,
int memLevel,
3052 int strategy,
const char* password, uLong crcForCrypting,
int zip64)
3054 return zipOpenNewFileInZip4_64 (file, filename, zipfi, extrafield_local, size_extrafield_local, extrafield_global, size_extrafield_global,
3055 comment, method, level, raw, windowBits, memLevel, strategy, password, crcForCrypting, VERSIONMADEBY, 0, zip64);
3058int PrivateMinizip_::zipOpenNewFileInZip2 (zipFile file,
const char* filename,
const zip_fileinfo* zipfi,
const void* extrafield_local,
3059 uInt size_extrafield_local,
const void* extrafield_global, uInt size_extrafield_global,
3060 const char* comment,
int method,
int level,
int raw)
3062 return zipOpenNewFileInZip4_64 (file, filename, zipfi, extrafield_local, size_extrafield_local, extrafield_global, size_extrafield_global,
3063 comment, method, level, raw, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, 0);
3066int PrivateMinizip_::zipOpenNewFileInZip2_64 (zipFile file,
const char* filename,
const zip_fileinfo* zipfi,
const void* extrafield_local,
3067 uInt size_extrafield_local,
const void* extrafield_global, uInt size_extrafield_global,
3068 const char* comment,
int method,
int level,
int raw,
int zip64)
3070 return zipOpenNewFileInZip4_64 (file, filename, zipfi, extrafield_local, size_extrafield_local, extrafield_global, size_extrafield_global,
3071 comment, method, level, raw, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, zip64);
3074int PrivateMinizip_::zipOpenNewFileInZip64 (zipFile file,
const char* filename,
const zip_fileinfo* zipfi,
const void* extrafield_local,
3075 uInt size_extrafield_local,
const void* extrafield_global, uInt size_extrafield_global,
3076 const char* comment,
int method,
int level,
int zip64)
3078 return zipOpenNewFileInZip4_64 (file, filename, zipfi, extrafield_local, size_extrafield_local, extrafield_global, size_extrafield_global,
3079 comment, method, level, 0, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, zip64);
3082int PrivateMinizip_::zipOpenNewFileInZip (zipFile file,
const char* filename,
const zip_fileinfo* zipfi,
const void* extrafield_local,
3083 uInt size_extrafield_local,
const void* extrafield_global, uInt size_extrafield_global,
3084 const char* comment,
int method,
int level)
3086 return zipOpenNewFileInZip4_64 (file, filename, zipfi, extrafield_local, size_extrafield_local, extrafield_global, size_extrafield_global,
3087 comment, method, level, 0, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, 0);
3092 int zip64FlushWriteBuffer (zip64_internal* zi)
3096 if (zi->ci.encrypt != 0) {
3100 DISABLE_COMPILER_MSC_WARNING_START (4244)
3101 for (i = 0; i < zi->ci.pos_in_buffered_data; i++)
3102 zi->ci.buffered_data[i] = zencode (zi->ci.keys, zi->ci.pcrc_32_tab, zi->ci.buffered_data[i], t);
3103 DISABLE_COMPILER_MSC_WARNING_END (4244)
3107 if (ZWRITE64 (zi->z_filefunc, zi->filestream, zi->ci.buffered_data, zi->ci.pos_in_buffered_data) != zi->ci.pos_in_buffered_data)
3110 zi->ci.totalCompressedData += zi->ci.pos_in_buffered_data;
3113 if (zi->ci.method == Z_BZIP2ED) {
3114 zi->ci.totalUncompressedData += zi->ci.bstream.total_in_lo32;
3115 zi->ci.bstream.total_in_lo32 = 0;
3116 zi->ci.bstream.total_in_hi32 = 0;
3121 zi->ci.totalUncompressedData += zi->ci.stream.total_in;
3122 zi->ci.stream.total_in = 0;
3125 zi->ci.pos_in_buffered_data = 0;
3131int PrivateMinizip_::zipWriteInFileInZip (zipFile file,
const void* buf,
unsigned int len)
3137 return ZIP_PARAMERROR;
3138 zi = (zip64_internal*)file;
3140 if (zi->in_opened_file_inzip == 0)
3141 return ZIP_PARAMERROR;
3143 zi->ci.crc32 = crc32 (zi->ci.crc32,
reinterpret_cast<const Bytef*
> (buf), (uInt)len);
3146 if (zi->ci.method == Z_BZIP2ED && (!zi->ci.raw)) {
3147 zi->ci.bstream.next_in = (
void*)buf;
3148 zi->ci.bstream.avail_in = len;
3151 while ((err == BZ_RUN_OK) && (zi->ci.bstream.avail_in > 0)) {
3152 if (zi->ci.bstream.avail_out == 0) {
3153 if (zip64FlushWriteBuffer (zi) == ZIP_ERRNO)
3155 zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE;
3156 zi->ci.bstream.next_out = (
char*)zi->ci.buffered_data;
3159 if (err != BZ_RUN_OK)
3162 if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) {
3163 uLong uTotalOutBefore_lo = zi->ci.bstream.total_out_lo32;
3165 err = BZ2_bzCompress (&zi->ci.bstream, BZ_RUN);
3167 zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore_lo);
3171 if (err == BZ_RUN_OK)
3177 zi->ci.stream.next_in = (Bytef*)(uintptr_t)buf;
3178 zi->ci.stream.avail_in = len;
3180 while ((err == ZIP_OK) && (zi->ci.stream.avail_in > 0)) {
3181 if (zi->ci.stream.avail_out == 0) {
3182 if (zip64FlushWriteBuffer (zi) == ZIP_ERRNO)
3184 zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
3185 zi->ci.stream.next_out = zi->ci.buffered_data;
3191 if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) {
3192 uLong uTotalOutBefore = zi->ci.stream.total_out;
3193 err = deflate (&zi->ci.stream, Z_NO_FLUSH);
3195 zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore);
3199 if (zi->ci.stream.avail_in < zi->ci.stream.avail_out)
3200 copy_this = zi->ci.stream.avail_in;
3202 copy_this = zi->ci.stream.avail_out;
3204 for (i = 0; i < copy_this; i++)
3205 *(((
char*)zi->ci.stream.next_out) + i) = *(((
const char*)zi->ci.stream.next_in) + i);
3207 zi->ci.stream.avail_in -= copy_this;
3208 zi->ci.stream.avail_out -= copy_this;
3209 zi->ci.stream.next_in += copy_this;
3210 zi->ci.stream.next_out += copy_this;
3211 zi->ci.stream.total_in += copy_this;
3212 zi->ci.stream.total_out += copy_this;
3213 zi->ci.pos_in_buffered_data += copy_this;
3222int PrivateMinizip_::zipCloseFileInZipRaw (zipFile file, uLong uncompressed_size, uLong crc32)
3224 return zipCloseFileInZipRaw64 (file, uncompressed_size, crc32);
3227int PrivateMinizip_::zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_size, uLong crc32)
3230 ZPOS64_T compressed_size;
3231 uLong invalidValue = 0xffffffff;
3232 unsigned datasize = 0;
3236 return ZIP_PARAMERROR;
3237 zi = (zip64_internal*)file;
3239 if (zi->in_opened_file_inzip == 0)
3240 return ZIP_PARAMERROR;
3241 zi->ci.stream.avail_in = 0;
3243 if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) {
3244 while (err == ZIP_OK) {
3245 uLong uTotalOutBefore;
3246 if (zi->ci.stream.avail_out == 0) {
3247 if (zip64FlushWriteBuffer (zi) == ZIP_ERRNO)
3249 zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
3250 zi->ci.stream.next_out = zi->ci.buffered_data;
3252 uTotalOutBefore = zi->ci.stream.total_out;
3253 err = deflate (&zi->ci.stream, Z_FINISH);
3254 zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore);
3257 else if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) {
3260 while (err == BZ_FINISH_OK) {
3261 uLong uTotalOutBefore;
3262 if (zi->ci.bstream.avail_out == 0) {
3263 if (zip64FlushWriteBuffer (zi) == ZIP_ERRNO)
3265 zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE;
3266 zi->ci.bstream.next_out = (
char*)zi->ci.buffered_data;
3268 uTotalOutBefore = zi->ci.bstream.total_out_lo32;
3269 err = BZ2_bzCompress (&zi->ci.bstream, BZ_FINISH);
3270 if (err == BZ_STREAM_END)
3273 zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore);
3276 if (err == BZ_FINISH_OK)
3281 if (err == Z_STREAM_END)
3284 if ((zi->ci.pos_in_buffered_data > 0) && (err == ZIP_OK)) {
3285 if (zip64FlushWriteBuffer (zi) == ZIP_ERRNO)
3289 if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) {
3290 int tmp_err = deflateEnd (&zi->ci.stream);
3293 zi->ci.stream_initialised = 0;
3296 else if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) {
3297 int tmperr = BZ2_bzCompressEnd (&zi->ci.bstream);
3300 zi->ci.stream_initialised = 0;
3305 crc32 = (uLong)zi->ci.crc32;
3306 uncompressed_size = zi->ci.totalUncompressedData;
3308 compressed_size = zi->ci.totalCompressedData;
3311 compressed_size += zi->ci.crypt_header_size;
3315 if (compressed_size >= 0xffffffff || uncompressed_size >= 0xffffffff || zi->ci.pos_local_header >= 0xffffffff) {
3317 zip64local_putValue_inmemory (zi->ci.central_header + 4, (uLong)45, 2);
3319 zip64local_putValue_inmemory (zi->ci.central_header + 6, (uLong)45, 2);
3322 zip64local_putValue_inmemory (zi->ci.central_header + 16, crc32, 4);
3324 if (compressed_size >= 0xffffffff)
3325 zip64local_putValue_inmemory (zi->ci.central_header + 20, invalidValue, 4);
3327 zip64local_putValue_inmemory (zi->ci.central_header + 20, compressed_size, 4);
3330 if (zi->ci.stream.data_type == Z_ASCII)
3331 zip64local_putValue_inmemory (zi->ci.central_header + 36, (uLong)Z_ASCII, 2);
3333 if (uncompressed_size >= 0xffffffff)
3334 zip64local_putValue_inmemory (zi->ci.central_header + 24, invalidValue, 4);
3336 zip64local_putValue_inmemory (zi->ci.central_header + 24, uncompressed_size, 4);
3339 if (uncompressed_size >= 0xffffffff)
3343 if (compressed_size >= 0xffffffff)
3347 if (zi->ci.pos_local_header >= 0xffffffff)
3353 if ((uLong)(datasize + 4) > zi->ci.size_centralExtraFree) {
3355 return ZIP_BADZIPFILE;
3358 p = zi->ci.central_header + zi->ci.size_centralheader;
3361 zip64local_putValue_inmemory (p, 0x0001, 2);
3363 zip64local_putValue_inmemory (p, datasize, 2);
3366 if (uncompressed_size >= 0xffffffff) {
3367 zip64local_putValue_inmemory (p, uncompressed_size, 8);
3371 if (compressed_size >= 0xffffffff) {
3372 zip64local_putValue_inmemory (p, compressed_size, 8);
3376 if (zi->ci.pos_local_header >= 0xffffffff) {
3377 zip64local_putValue_inmemory (p, zi->ci.pos_local_header, 8);
3384 zi->ci.size_centralExtraFree -= datasize + 4;
3385 zi->ci.size_centralheader += datasize + 4;
3388 zi->ci.size_centralExtra += datasize + 4;
3389 zip64local_putValue_inmemory (zi->ci.central_header + 30, (uLong)zi->ci.size_centralExtra, 2);
3393 err = add_data_in_datablock (&zi->central_dir, zi->ci.central_header, (uLong)zi->ci.size_centralheader);
3395 free (zi->ci.central_header);
3397 if (err == ZIP_OK) {
3400 ZPOS64_T cur_pos_inzip = ZTELL64 (zi->z_filefunc, zi->filestream);
3402 if (ZSEEK64 (zi->z_filefunc, zi->filestream, zi->ci.pos_local_header + 14, ZLIB_FILEFUNC_SEEK_SET) != 0)
3406 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, crc32, 4);
3408 if (uncompressed_size >= 0xffffffff || compressed_size >= 0xffffffff) {
3409 if (zi->ci.pos_zip64extrainfo > 0) {
3411 if (ZSEEK64 (zi->z_filefunc, zi->filestream, zi->ci.pos_zip64extrainfo + 4, ZLIB_FILEFUNC_SEEK_SET) != 0)
3415 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, uncompressed_size, 8);
3418 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, compressed_size, 8);
3421 err = ZIP_BADZIPFILE;
3425 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, compressed_size, 4);
3428 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, uncompressed_size, 4);
3431 if (ZSEEK64 (zi->z_filefunc, zi->filestream, cur_pos_inzip, ZLIB_FILEFUNC_SEEK_SET) != 0)
3436 zi->in_opened_file_inzip = 0;
3441int PrivateMinizip_::zipCloseFileInZip (zipFile file)
3443 return zipCloseFileInZipRaw (file, 0, 0);
3448 int Write_Zip64EndOfCentralDirectoryLocator (zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip)
3451 ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writing_offset;
3453 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)ZIP64ENDLOCHEADERMAGIC, 4);
3457 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)0, 4);
3461 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, pos, 8);
3465 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)1, 4);
3470 int Write_Zip64EndOfCentralDirectoryRecord (zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip)
3474 uLong Zip64DataSize = 44;
3476 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)ZIP64ENDHEADERMAGIC, 4);
3479 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (ZPOS64_T)Zip64DataSize, 8);
3482 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)45, 2);
3485 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)45, 2);
3488 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)0, 4);
3491 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)0, 4);
3494 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, zi->number_entry, 8);
3497 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, zi->number_entry, 8);
3500 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (ZPOS64_T)size_centraldir, 8);
3504 ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writing_offset;
3505 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (ZPOS64_T)pos, 8);
3510 int Write_EndOfCentralDirectoryRecord (zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip)
3515 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)ENDHEADERMAGIC, 4);
3518 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)0, 2);
3521 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)0, 2);
3526 if (zi->number_entry >= 0xFFFF)
3527 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)0xffff, 2);
3529 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)zi->number_entry, 2);
3535 if (zi->number_entry >= 0xFFFF)
3536 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)0xffff, 2);
3538 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)zi->number_entry, 2);
3542 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)size_centraldir, 4);
3546 ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writing_offset;
3547 if (pos >= 0xffffffff) {
3548 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)0xffffffff, 4);
3551 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)(centraldir_pos_inzip - zi->add_position_when_writing_offset), 4);
3557 int Write_GlobalComment (zip64_internal* zi,
const char* global_comment)
3560 uInt size_global_comment = 0;
3562 if (global_comment != NULL)
3563 size_global_comment = (uInt)strlen (global_comment);
3565 err = zip64local_putValue (&zi->z_filefunc, zi->filestream, (uLong)size_global_comment, 2);
3567 if (err == ZIP_OK && size_global_comment > 0) {
3568 if (ZWRITE64 (zi->z_filefunc, zi->filestream, global_comment, size_global_comment) != size_global_comment)
3575int PrivateMinizip_::zipClose (zipFile file,
const char* global_comment)
3579 uLong size_centraldir = 0;
3580 ZPOS64_T centraldir_pos_inzip;
3584 return ZIP_PARAMERROR;
3586 zi = (zip64_internal*)file;
3588 if (zi->in_opened_file_inzip == 1) {
3589 err = zipCloseFileInZip (file);
3592#ifndef NO_ADDFILEINEXISTINGZIP
3593 if (global_comment == NULL)
3594 global_comment = zi->globalcomment;
3597 centraldir_pos_inzip = ZTELL64 (zi->z_filefunc, zi->filestream);
3599 if (err == ZIP_OK) {
3600 linkedlist_datablock_internal* ldi = zi->central_dir.first_block;
3601 while (ldi != NULL) {
3602 if ((err == ZIP_OK) && (ldi->filled_in_this_block > 0)) {
3603 if (ZWRITE64 (zi->z_filefunc, zi->filestream, ldi->data, ldi->filled_in_this_block) != ldi->filled_in_this_block)
3607 size_centraldir += ldi->filled_in_this_block;
3608 ldi = ldi->next_datablock;
3611 free_linkedlist (&(zi->central_dir));
3613 pos = centraldir_pos_inzip - zi->add_position_when_writing_offset;
3614 if (pos >= 0xffffffff || zi->number_entry >= 0xFFFF) {
3615 ZPOS64_T Zip64EOCDpos = ZTELL64 (zi->z_filefunc, zi->filestream);
3616 Write_Zip64EndOfCentralDirectoryRecord (zi, size_centraldir, centraldir_pos_inzip);
3618 Write_Zip64EndOfCentralDirectoryLocator (zi, Zip64EOCDpos);
3622 err = Write_EndOfCentralDirectoryRecord (zi, size_centraldir, centraldir_pos_inzip);
3625 err = Write_GlobalComment (zi, global_comment);
3627 if (ZCLOSE64 (zi->z_filefunc, zi->filestream) != 0)
3631#ifndef NO_ADDFILEINEXISTINGZIP
3632 free (zi->globalcomment);
3639int PrivateMinizip_::zipRemoveExtraInfoBlock (
char* pData,
int* dataLen,
short sHeader)
3648 int retVal = ZIP_OK;
3650 if (pData == NULL || dataLen == NULL || *dataLen < 4)
3651 return ZIP_PARAMERROR;
3653 pNewHeader = (
char*)ALLOC ((
unsigned)*dataLen);
3656 while (p < (pData + *dataLen)) {
3657 header = *(
short*)p;
3658 dataSize = *(((
short*)p) + 1);
3660 if (header == sHeader)
3666 memcpy (pTmp, p, dataSize + 4);
3668 size += dataSize + 4;
3672 if (size < *dataLen) {
3674 memset (pData, 0, *dataLen);
3678 memcpy (pData, pNewHeader, size);