Compare commits
23 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a289602590 | ||
|
|
6e16750451 | ||
|
|
0582706134 | ||
|
|
ed43028b8d | ||
|
|
e136e27380 | ||
|
|
61b0029250 | ||
|
|
54de82a95b | ||
|
|
04d8d9d1d4 | ||
|
|
cc40af1311 | ||
|
|
1dbde8f9c9 | ||
|
|
5a90a66267 | ||
|
|
00386a3fe9 | ||
|
|
ec6056de67 | ||
|
|
2485f97586 | ||
|
|
8364f87f9a | ||
|
|
9dfa7e43da | ||
|
|
401dfa4b17 | ||
|
|
a1e5810879 | ||
|
|
64185c4750 | ||
|
|
4ed48f8e04 | ||
|
|
6797222f63 | ||
|
|
f1f4fee67f | ||
|
|
07288c8e00 |
158
MiniZip/crypt.c
Normal file
158
MiniZip/crypt.c
Normal file
@@ -0,0 +1,158 @@
|
||||
/* crypt.h -- base code for traditional PKWARE encryption
|
||||
Version 1.01e, February 12th, 2005
|
||||
|
||||
Copyright (C) 1998-2005 Gilles Vollant
|
||||
Modifications for Info-ZIP crypting
|
||||
Copyright (C) 2003 Terry Thorsen
|
||||
|
||||
This code is a modified version of crypting code in Info-ZIP distribution
|
||||
|
||||
Copyright (C) 1990-2000 Info-ZIP. All rights reserved.
|
||||
|
||||
This program is distributed under the terms of the same license as zlib.
|
||||
See the accompanying LICENSE file for the full text of the license.
|
||||
|
||||
This encryption code is a direct transcription of the algorithm from
|
||||
Roger Schlafly, described by Phil Katz in the file appnote.txt. This
|
||||
file (appnote.txt) is distributed with the PKZIP program (even in the
|
||||
version without encryption capabilities).
|
||||
|
||||
If you don't need crypting in your application, just define symbols
|
||||
NOCRYPT and NOUNCRYPT.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <time.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
# include <windows.h>
|
||||
# include <wincrypt.h>
|
||||
#else
|
||||
# include <sys/stat.h>
|
||||
# include <fcntl.h>
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "zlib.h"
|
||||
|
||||
#include "crypt.h"
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
#define CRC32(c, b) ((*(pcrc_32_tab+(((uint32_t)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
|
||||
|
||||
#ifndef ZCR_SEED2
|
||||
# define ZCR_SEED2 3141592654UL /* use PI as default pattern */
|
||||
#endif
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
uint8_t decrypt_byte(uint32_t *pkeys)
|
||||
{
|
||||
unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
|
||||
* unpredictable manner on 16-bit systems; not a problem
|
||||
* with any known compiler so far, though */
|
||||
|
||||
temp = ((uint32_t)(*(pkeys+2)) & 0xffff) | 2;
|
||||
return (uint8_t)(((temp * (temp ^ 1)) >> 8) & 0xff);
|
||||
}
|
||||
|
||||
uint8_t update_keys(uint32_t *pkeys, const z_crc_t *pcrc_32_tab, int32_t c)
|
||||
{
|
||||
(*(pkeys+0)) = (uint32_t)CRC32((*(pkeys+0)), c);
|
||||
(*(pkeys+1)) += (*(pkeys+0)) & 0xff;
|
||||
(*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
|
||||
{
|
||||
register int32_t keyshift = (int32_t)((*(pkeys + 1)) >> 24);
|
||||
(*(pkeys+2)) = (uint32_t)CRC32((*(pkeys+2)), keyshift);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
void init_keys(const char *passwd, uint32_t *pkeys, const z_crc_t *pcrc_32_tab)
|
||||
{
|
||||
*(pkeys+0) = 305419896L;
|
||||
*(pkeys+1) = 591751049L;
|
||||
*(pkeys+2) = 878082192L;
|
||||
while (*passwd != 0)
|
||||
{
|
||||
update_keys(pkeys, pcrc_32_tab, *passwd);
|
||||
passwd += 1;
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
int cryptrand(unsigned char *buf, unsigned int len)
|
||||
{
|
||||
static unsigned calls = 0;
|
||||
int rlen = 0;
|
||||
#ifdef _WIN32
|
||||
HCRYPTPROV provider;
|
||||
unsigned __int64 pentium_tsc[1];
|
||||
int result = 0;
|
||||
|
||||
|
||||
if (CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
|
||||
{
|
||||
result = CryptGenRandom(provider, len, buf);
|
||||
CryptReleaseContext(provider, 0);
|
||||
if (result)
|
||||
return len;
|
||||
}
|
||||
|
||||
for (rlen = 0; rlen < (int)len; ++rlen)
|
||||
{
|
||||
if (rlen % 8 == 0)
|
||||
QueryPerformanceCounter((LARGE_INTEGER *)pentium_tsc);
|
||||
buf[rlen] = ((unsigned char*)pentium_tsc)[rlen % 8];
|
||||
}
|
||||
#else
|
||||
int frand = open("/dev/urandom", O_RDONLY);
|
||||
if (frand != -1)
|
||||
{
|
||||
rlen = (int)read(frand, buf, len);
|
||||
close(frand);
|
||||
}
|
||||
#endif
|
||||
if (rlen < (int)len)
|
||||
{
|
||||
/* Ensure different random header each time */
|
||||
if (++calls == 1)
|
||||
srand((unsigned)(time(NULL) ^ ZCR_SEED2));
|
||||
|
||||
while (rlen < (int)len)
|
||||
buf[rlen++] = (rand() >> 7) & 0xff;
|
||||
}
|
||||
return rlen;
|
||||
}
|
||||
|
||||
int crypthead(const char *passwd, uint8_t *buf, int buf_size,
|
||||
uint32_t *pkeys, const z_crc_t *pcrc_32_tab, uint32_t crc_for_crypting)
|
||||
{
|
||||
uint8_t n = 0; /* index in random header */
|
||||
uint8_t header[RAND_HEAD_LEN-2]; /* random header */
|
||||
uint16_t t = 0; /* temporary */
|
||||
|
||||
if (buf_size < RAND_HEAD_LEN)
|
||||
return 0;
|
||||
|
||||
init_keys(passwd, pkeys, pcrc_32_tab);
|
||||
|
||||
/* First generate RAND_HEAD_LEN-2 random bytes. */
|
||||
cryptrand(header, RAND_HEAD_LEN-2);
|
||||
|
||||
/* Encrypt random header (last two bytes is high word of crc) */
|
||||
init_keys(passwd, pkeys, pcrc_32_tab);
|
||||
|
||||
for (n = 0; n < RAND_HEAD_LEN-2; n++)
|
||||
buf[n] = (uint8_t)zencode(pkeys, pcrc_32_tab, header[n], t);
|
||||
|
||||
buf[n++] = (uint8_t)zencode(pkeys, pcrc_32_tab, (uint8_t)((crc_for_crypting >> 16) & 0xff), t);
|
||||
buf[n++] = (uint8_t)zencode(pkeys, pcrc_32_tab, (uint8_t)((crc_for_crypting >> 24) & 0xff), t);
|
||||
return n;
|
||||
}
|
||||
|
||||
/***************************************************************************/
|
||||
154
MiniZip/crypt.h
Executable file → Normal file
154
MiniZip/crypt.h
Executable file → Normal file
@@ -1,131 +1,57 @@
|
||||
/* crypt.h -- base code for crypt/uncrypt ZIPfile
|
||||
|
||||
|
||||
/* crypt.h -- base code for traditional PKWARE encryption
|
||||
Version 1.01e, February 12th, 2005
|
||||
|
||||
Copyright (C) 1998-2005 Gilles Vollant
|
||||
Modifications for Info-ZIP crypting
|
||||
Copyright (C) 2003 Terry Thorsen
|
||||
|
||||
This code is a modified version of crypting code in Infozip distribution
|
||||
This code is a modified version of crypting code in Info-ZIP distribution
|
||||
|
||||
The encryption/decryption parts of this source code (as opposed to the
|
||||
non-echoing password parts) were originally written in Europe. The
|
||||
whole source package can be freely distributed, including from the USA.
|
||||
(Prior to January 2000, re-export from the US was a violation of US law.)
|
||||
Copyright (C) 1990-2000 Info-ZIP. All rights reserved.
|
||||
|
||||
This encryption code is a direct transcription of the algorithm from
|
||||
Roger Schlafly, described by Phil Katz in the file appnote.txt. This
|
||||
file (appnote.txt) is distributed with the PKZIP program (even in the
|
||||
version without encryption capabilities).
|
||||
|
||||
If you don't need crypting in your application, just define symbols
|
||||
NOCRYPT and NOUNCRYPT.
|
||||
|
||||
This code support the "Traditional PKWARE Encryption".
|
||||
|
||||
The new AES encryption added on Zip format by Winzip (see the page
|
||||
http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong
|
||||
Encryption is not supported.
|
||||
This program is distributed under the terms of the same license as zlib.
|
||||
See the accompanying LICENSE file for the full text of the license.
|
||||
*/
|
||||
|
||||
#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
|
||||
#ifndef _MINICRYPT_H
|
||||
#define _MINICRYPT_H
|
||||
|
||||
/***********************************************************************
|
||||
* Return the next byte in the pseudo-random sequence
|
||||
*/
|
||||
static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
|
||||
{
|
||||
unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
|
||||
* unpredictable manner on 16-bit systems; not a problem
|
||||
* with any known compiler so far, though */
|
||||
|
||||
temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
|
||||
return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* Update the encryption keys with the next byte of plain text
|
||||
*/
|
||||
static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
|
||||
{
|
||||
(*(pkeys+0)) = CRC32((*(pkeys+0)), c);
|
||||
(*(pkeys+1)) += (*(pkeys+0)) & 0xff;
|
||||
(*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
|
||||
{
|
||||
register int keyshift = (int)((*(pkeys+1)) >> 24);
|
||||
(*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* Initialize the encryption keys and the random header according to
|
||||
* the given password.
|
||||
*/
|
||||
static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
|
||||
{
|
||||
*(pkeys+0) = 305419896L;
|
||||
*(pkeys+1) = 591751049L;
|
||||
*(pkeys+2) = 878082192L;
|
||||
while (*passwd != '\0') {
|
||||
update_keys(pkeys,pcrc_32_tab,(int)*passwd);
|
||||
passwd++;
|
||||
}
|
||||
}
|
||||
|
||||
#define zdecode(pkeys,pcrc_32_tab,c) \
|
||||
(update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
|
||||
|
||||
#define zencode(pkeys,pcrc_32_tab,c,t) \
|
||||
(t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
|
||||
|
||||
#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define RAND_HEAD_LEN 12
|
||||
/* "last resort" source for second part of crypt seed pattern */
|
||||
# ifndef ZCR_SEED2
|
||||
# define ZCR_SEED2 3141592654UL /* use PI as default pattern */
|
||||
# endif
|
||||
|
||||
static int crypthead(const char* passwd, /* password string */
|
||||
unsigned char* buf, /* where to write header */
|
||||
int bufSize,
|
||||
unsigned long* pkeys,
|
||||
const unsigned long* pcrc_32_tab,
|
||||
unsigned long crcForCrypting)
|
||||
{
|
||||
int n; /* index in random header */
|
||||
int t; /* temporary */
|
||||
int c; /* random byte */
|
||||
unsigned char header[RAND_HEAD_LEN-2]; /* random header */
|
||||
static unsigned calls = 0; /* ensure different random header each time */
|
||||
/***************************************************************************/
|
||||
|
||||
if (bufSize<RAND_HEAD_LEN)
|
||||
return 0;
|
||||
#define zdecode(pkeys,pcrc_32_tab,c) \
|
||||
(update_keys(pkeys,pcrc_32_tab, c ^= decrypt_byte(pkeys)))
|
||||
|
||||
/* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
|
||||
* output of rand() to get less predictability, since rand() is
|
||||
* often poorly implemented.
|
||||
*/
|
||||
if (++calls == 1)
|
||||
{
|
||||
srand((unsigned)(time(NULL) ^ ZCR_SEED2));
|
||||
}
|
||||
init_keys(passwd, pkeys, pcrc_32_tab);
|
||||
for (n = 0; n < RAND_HEAD_LEN-2; n++)
|
||||
{
|
||||
c = (rand() >> 7) & 0xff;
|
||||
header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
|
||||
}
|
||||
/* Encrypt random header (last two bytes is high word of crc) */
|
||||
init_keys(passwd, pkeys, pcrc_32_tab);
|
||||
for (n = 0; n < RAND_HEAD_LEN-2; n++)
|
||||
{
|
||||
buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
|
||||
}
|
||||
buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
|
||||
buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
|
||||
return n;
|
||||
#define zencode(pkeys,pcrc_32_tab,c,t) \
|
||||
(t = decrypt_byte(pkeys), update_keys(pkeys,pcrc_32_tab,c), t^(c))
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
/* Return the next byte in the pseudo-random sequence */
|
||||
uint8_t decrypt_byte(uint32_t *pkeys);
|
||||
|
||||
/* Update the encryption keys with the next byte of plain text */
|
||||
uint8_t update_keys(uint32_t *pkeys, const z_crc_t *pcrc_32_tab, int32_t c);
|
||||
|
||||
/* Initialize the encryption keys and the random header according to the given password. */
|
||||
void init_keys(const char *passwd, uint32_t *pkeys, const z_crc_t *pcrc_32_tab);
|
||||
|
||||
/* Generate cryptographically secure random numbers */
|
||||
int cryptrand(unsigned char *buf, unsigned int len);
|
||||
|
||||
/* Create encryption header */
|
||||
int crypthead(const char *passwd, uint8_t *buf, int buf_size, uint32_t *pkeys,
|
||||
const z_crc_t *pcrc_32_tab, uint32_t crc_for_crypting);
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
238
MiniZip/ioapi.c
238
MiniZip/ioapi.c
@@ -1,86 +1,67 @@
|
||||
/* ioapi.h -- IO base function header for compress/uncompress .zip
|
||||
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
||||
|
||||
Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
|
||||
part of the MiniZip project
|
||||
|
||||
Copyright (C) 1998-2010 Gilles Vollant
|
||||
http://www.winimage.com/zLibDll/minizip.html
|
||||
Modifications for Zip64 support
|
||||
Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
|
||||
Copyright (C) 2009-2010 Mathias Svensson
|
||||
http://result42.com
|
||||
|
||||
For more info read MiniZip_info.txt
|
||||
This program is distributed under the terms of the same license as zlib.
|
||||
See the accompanying LICENSE file for the full text of the license.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#if defined unix || defined __APPLE__
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "ioapi.h"
|
||||
|
||||
#if (defined(_WIN32))
|
||||
#include <tchar.h>
|
||||
#define snprintf _snprintf
|
||||
#ifndef _CRT_SECURE_NO_WARNINGS
|
||||
#define _CRT_SECURE_NO_WARNINGS
|
||||
#endif
|
||||
#if defined(_WIN32)
|
||||
# define snprintf _snprintf
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__) || defined(IOAPI_NO_64)
|
||||
// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
|
||||
#define FOPEN_FUNC(filename, mode) fopen(filename, mode)
|
||||
#define FTELLO_FUNC(stream) ftello(stream)
|
||||
#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin)
|
||||
#else
|
||||
#define FOPEN_FUNC(filename, mode) fopen64(filename, mode)
|
||||
#define FTELLO_FUNC(stream) ftello64(stream)
|
||||
#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin)
|
||||
#endif
|
||||
|
||||
/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
|
||||
#ifndef SEEK_CUR
|
||||
#define SEEK_CUR 1
|
||||
#endif
|
||||
#ifndef SEEK_END
|
||||
#define SEEK_END 2
|
||||
#endif
|
||||
#ifndef SEEK_SET
|
||||
#define SEEK_SET 0
|
||||
#endif
|
||||
|
||||
voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)
|
||||
voidpf call_zopen64(const zlib_filefunc64_32_def *pfilefunc, const void *filename, int mode)
|
||||
{
|
||||
if (pfilefunc->zfile_func64.zopen64_file != NULL)
|
||||
return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode);
|
||||
return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode);
|
||||
return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque, filename, mode);
|
||||
return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque, (const char*)filename, mode);
|
||||
}
|
||||
|
||||
voidpf call_zopendisk64 OF((const zlib_filefunc64_32_def* pfilefunc, voidpf filestream, int number_disk, int mode))
|
||||
voidpf call_zopendisk64(const zlib_filefunc64_32_def *pfilefunc, voidpf filestream, uint32_t number_disk, int mode)
|
||||
{
|
||||
if (pfilefunc->zfile_func64.zopendisk64_file != NULL)
|
||||
return (*(pfilefunc->zfile_func64.zopendisk64_file)) (pfilefunc->zfile_func64.opaque,filestream,number_disk,mode);
|
||||
return (*(pfilefunc->zopendisk32_file))(pfilefunc->zfile_func64.opaque,filestream,number_disk,mode);
|
||||
return (*(pfilefunc->zfile_func64.zopendisk64_file)) (pfilefunc->zfile_func64.opaque, filestream, number_disk, mode);
|
||||
return (*(pfilefunc->zopendisk32_file))(pfilefunc->zfile_func64.opaque, filestream, number_disk, mode);
|
||||
}
|
||||
|
||||
long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)
|
||||
long call_zseek64(const zlib_filefunc64_32_def *pfilefunc, voidpf filestream, uint64_t offset, int origin)
|
||||
{
|
||||
uLong offsetTruncated;
|
||||
uint32_t offset_truncated = 0;
|
||||
if (pfilefunc->zfile_func64.zseek64_file != NULL)
|
||||
return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin);
|
||||
offsetTruncated = (uLong)offset;
|
||||
if (offsetTruncated != offset)
|
||||
offset_truncated = (uint32_t)offset;
|
||||
if (offset_truncated != offset)
|
||||
return -1;
|
||||
return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin);
|
||||
return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream, offset_truncated, origin);
|
||||
}
|
||||
|
||||
ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)
|
||||
uint64_t call_ztell64(const zlib_filefunc64_32_def *pfilefunc, voidpf filestream)
|
||||
{
|
||||
uLong tell_uLong;
|
||||
uint64_t position;
|
||||
if (pfilefunc->zfile_func64.zseek64_file != NULL)
|
||||
return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream);
|
||||
tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream);
|
||||
if ((tell_uLong) == 0xffffffff)
|
||||
return (ZPOS64_T)-1;
|
||||
return tell_uLong;
|
||||
return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque, filestream);
|
||||
position = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque, filestream);
|
||||
if ((position) == UINT32_MAX)
|
||||
return (uint64_t)-1;
|
||||
return position;
|
||||
}
|
||||
|
||||
void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32)
|
||||
void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def *p_filefunc64_32, const zlib_filefunc_def *p_filefunc32)
|
||||
{
|
||||
p_filefunc64_32->zfile_func64.zopen64_file = NULL;
|
||||
p_filefunc64_32->zfile_func64.zopendisk64_file = NULL;
|
||||
@@ -98,13 +79,13 @@ void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filef
|
||||
p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file;
|
||||
}
|
||||
|
||||
static voidpf ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode));
|
||||
static uLong ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size));
|
||||
static uLong ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size));
|
||||
static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream));
|
||||
static long ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
|
||||
static int ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream));
|
||||
static int ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream));
|
||||
static voidpf ZCALLBACK fopen_file_func(voidpf opaque, const char *filename, int mode);
|
||||
static uint32_t ZCALLBACK fread_file_func(voidpf opaque, voidpf stream, void* buf, uint32_t size);
|
||||
static uint32_t ZCALLBACK fwrite_file_func(voidpf opaque, voidpf stream, const void *buf, uint32_t size);
|
||||
static uint64_t ZCALLBACK ftell64_file_func(voidpf opaque, voidpf stream);
|
||||
static long ZCALLBACK fseek64_file_func(voidpf opaque, voidpf stream, uint64_t offset, int origin);
|
||||
static int ZCALLBACK fclose_file_func(voidpf opaque, voidpf stream);
|
||||
static int ZCALLBACK ferror_file_func(voidpf opaque, voidpf stream);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -113,7 +94,6 @@ typedef struct
|
||||
void *filename;
|
||||
} FILE_IOPOSIX;
|
||||
|
||||
|
||||
static voidpf file_build_ioposix(FILE *file, const char *filename)
|
||||
{
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
@@ -121,23 +101,21 @@ static voidpf file_build_ioposix(FILE *file, const char *filename)
|
||||
return NULL;
|
||||
ioposix = (FILE_IOPOSIX*)malloc(sizeof(FILE_IOPOSIX));
|
||||
ioposix->file = file;
|
||||
ioposix->filenameLength = (int) (strlen(filename) + 1);
|
||||
ioposix->filenameLength = (int)strlen(filename) + 1;
|
||||
ioposix->filename = (char*)malloc(ioposix->filenameLength * sizeof(char));
|
||||
strncpy(ioposix->filename, filename, ioposix->filenameLength);
|
||||
strncpy((char*)ioposix->filename, filename, ioposix->filenameLength);
|
||||
return (voidpf)ioposix;
|
||||
}
|
||||
|
||||
static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode)
|
||||
static voidpf ZCALLBACK fopen_file_func(voidpf opaque, const char *filename, int mode)
|
||||
{
|
||||
FILE* file = NULL;
|
||||
const char* mode_fopen = NULL;
|
||||
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
|
||||
const char *mode_fopen = NULL;
|
||||
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ)
|
||||
mode_fopen = "rb";
|
||||
else
|
||||
if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
|
||||
else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
|
||||
mode_fopen = "r+b";
|
||||
else
|
||||
if (mode & ZLIB_FILEFUNC_MODE_CREATE)
|
||||
else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
|
||||
mode_fopen = "wb";
|
||||
|
||||
if ((filename != NULL) && (mode_fopen != NULL))
|
||||
@@ -148,28 +126,26 @@ static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, in
|
||||
return file;
|
||||
}
|
||||
|
||||
static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode)
|
||||
static voidpf ZCALLBACK fopen64_file_func(voidpf opaque, const void *filename, int mode)
|
||||
{
|
||||
FILE* file = NULL;
|
||||
const char* mode_fopen = NULL;
|
||||
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
|
||||
const char *mode_fopen = NULL;
|
||||
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ)
|
||||
mode_fopen = "rb";
|
||||
else
|
||||
if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
|
||||
else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
|
||||
mode_fopen = "r+b";
|
||||
else
|
||||
if (mode & ZLIB_FILEFUNC_MODE_CREATE)
|
||||
else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
|
||||
mode_fopen = "wb";
|
||||
|
||||
if ((filename != NULL) && (mode_fopen != NULL))
|
||||
{
|
||||
file = FOPEN_FUNC((const char*)filename, mode_fopen);
|
||||
file = fopen64((const char*)filename, mode_fopen);
|
||||
return file_build_ioposix(file, (const char*)filename);
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
static voidpf ZCALLBACK fopendisk64_file_func (voidpf opaque, voidpf stream, int number_disk, int mode)
|
||||
static voidpf ZCALLBACK fopendisk64_file_func(voidpf opaque, voidpf stream, uint32_t number_disk, int mode)
|
||||
{
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
char *diskFilename = NULL;
|
||||
@@ -180,12 +156,12 @@ static voidpf ZCALLBACK fopendisk64_file_func (voidpf opaque, voidpf stream, int
|
||||
return NULL;
|
||||
ioposix = (FILE_IOPOSIX*)stream;
|
||||
diskFilename = (char*)malloc(ioposix->filenameLength * sizeof(char));
|
||||
strncpy(diskFilename, ioposix->filename, ioposix->filenameLength);
|
||||
strncpy(diskFilename, (const char*)ioposix->filename, ioposix->filenameLength);
|
||||
for (i = ioposix->filenameLength - 1; i >= 0; i -= 1)
|
||||
{
|
||||
if (diskFilename[i] != '.')
|
||||
if (diskFilename[i] != '.')
|
||||
continue;
|
||||
snprintf(&diskFilename[i], ioposix->filenameLength - i, ".z%02d", number_disk + 1);
|
||||
snprintf(&diskFilename[i], ioposix->filenameLength - i, ".z%02u", number_disk + 1);
|
||||
break;
|
||||
}
|
||||
if (i >= 0)
|
||||
@@ -194,7 +170,7 @@ static voidpf ZCALLBACK fopendisk64_file_func (voidpf opaque, voidpf stream, int
|
||||
return ret;
|
||||
}
|
||||
|
||||
static voidpf ZCALLBACK fopendisk_file_func (voidpf opaque, voidpf stream, int number_disk, int mode)
|
||||
static voidpf ZCALLBACK fopendisk_file_func(voidpf opaque, voidpf stream, uint32_t number_disk, int mode)
|
||||
{
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
char *diskFilename = NULL;
|
||||
@@ -205,12 +181,12 @@ static voidpf ZCALLBACK fopendisk_file_func (voidpf opaque, voidpf stream, int n
|
||||
return NULL;
|
||||
ioposix = (FILE_IOPOSIX*)stream;
|
||||
diskFilename = (char*)malloc(ioposix->filenameLength * sizeof(char));
|
||||
strncpy(diskFilename, ioposix->filename, ioposix->filenameLength);
|
||||
strncpy(diskFilename, (const char*)ioposix->filename, ioposix->filenameLength);
|
||||
for (i = ioposix->filenameLength - 1; i >= 0; i -= 1)
|
||||
{
|
||||
if (diskFilename[i] != '.')
|
||||
if (diskFilename[i] != '.')
|
||||
continue;
|
||||
snprintf(&diskFilename[i], ioposix->filenameLength - i, ".z%02d", number_disk + 1);
|
||||
snprintf(&diskFilename[i], ioposix->filenameLength - i, ".z%02u", number_disk + 1);
|
||||
break;
|
||||
}
|
||||
if (i >= 0)
|
||||
@@ -219,29 +195,29 @@ static voidpf ZCALLBACK fopendisk_file_func (voidpf opaque, voidpf stream, int n
|
||||
return ret;
|
||||
}
|
||||
|
||||
static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size)
|
||||
static uint32_t ZCALLBACK fread_file_func(voidpf opaque, voidpf stream, void* buf, uint32_t size)
|
||||
{
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
uLong ret;
|
||||
uint32_t read = (uint32_t)-1;
|
||||
if (stream == NULL)
|
||||
return -1;
|
||||
return read;
|
||||
ioposix = (FILE_IOPOSIX*)stream;
|
||||
ret = (uLong)fread(buf, 1, (size_t)size, ioposix->file);
|
||||
return ret;
|
||||
read = (uint32_t)fread(buf, 1, (size_t)size, ioposix->file);
|
||||
return read;
|
||||
}
|
||||
|
||||
static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size)
|
||||
static uint32_t ZCALLBACK fwrite_file_func(voidpf opaque, voidpf stream, const void *buf, uint32_t size)
|
||||
{
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
uLong ret;
|
||||
uint32_t written = (uint32_t)-1;
|
||||
if (stream == NULL)
|
||||
return -1;
|
||||
return written;
|
||||
ioposix = (FILE_IOPOSIX*)stream;
|
||||
ret = (uLong)fwrite(buf, 1, (size_t)size, ioposix->file);
|
||||
return ret;
|
||||
written = (uint32_t)fwrite(buf, 1, (size_t)size, ioposix->file);
|
||||
return written;
|
||||
}
|
||||
|
||||
static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream)
|
||||
static long ZCALLBACK ftell_file_func(voidpf opaque, voidpf stream)
|
||||
{
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
long ret = -1;
|
||||
@@ -252,22 +228,22 @@ static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream)
|
||||
static uint64_t ZCALLBACK ftell64_file_func(voidpf opaque, voidpf stream)
|
||||
{
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
ZPOS64_T ret = -1;
|
||||
uint64_t ret = (uint64_t)-1;
|
||||
if (stream == NULL)
|
||||
return ret;
|
||||
ioposix = (FILE_IOPOSIX*)stream;
|
||||
ret = FTELLO_FUNC(ioposix->file);
|
||||
ret = ftello64(ioposix->file);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin)
|
||||
static long ZCALLBACK fseek_file_func(voidpf opaque, voidpf stream, uint32_t offset, int origin)
|
||||
{
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
int fseek_origin = 0;
|
||||
long ret;
|
||||
long ret = 0;
|
||||
|
||||
if (stream == NULL)
|
||||
return -1;
|
||||
@@ -275,28 +251,28 @@ static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offs
|
||||
|
||||
switch (origin)
|
||||
{
|
||||
case ZLIB_FILEFUNC_SEEK_CUR:
|
||||
fseek_origin = SEEK_CUR;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_END:
|
||||
fseek_origin = SEEK_END;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_SET:
|
||||
fseek_origin = SEEK_SET;
|
||||
break;
|
||||
default: return -1;
|
||||
case ZLIB_FILEFUNC_SEEK_CUR:
|
||||
fseek_origin = SEEK_CUR;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_END:
|
||||
fseek_origin = SEEK_END;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_SET:
|
||||
fseek_origin = SEEK_SET;
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
ret = 0;
|
||||
if (fseek(ioposix->file, offset, fseek_origin) != 0)
|
||||
ret = -1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)
|
||||
static long ZCALLBACK fseek64_file_func(voidpf opaque, voidpf stream, uint64_t offset, int origin)
|
||||
{
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
int fseek_origin = 0;
|
||||
long ret;
|
||||
long ret = 0;
|
||||
|
||||
if (stream == NULL)
|
||||
return -1;
|
||||
@@ -304,27 +280,26 @@ static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T
|
||||
|
||||
switch (origin)
|
||||
{
|
||||
case ZLIB_FILEFUNC_SEEK_CUR:
|
||||
fseek_origin = SEEK_CUR;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_END:
|
||||
fseek_origin = SEEK_END;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_SET:
|
||||
fseek_origin = SEEK_SET;
|
||||
break;
|
||||
default: return -1;
|
||||
case ZLIB_FILEFUNC_SEEK_CUR:
|
||||
fseek_origin = SEEK_CUR;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_END:
|
||||
fseek_origin = SEEK_END;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_SET:
|
||||
fseek_origin = SEEK_SET;
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
ret = 0;
|
||||
|
||||
if(FSEEKO_FUNC(ioposix->file, offset, fseek_origin) != 0)
|
||||
if (fseeko64(ioposix->file, offset, fseek_origin) != 0)
|
||||
ret = -1;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream)
|
||||
static int ZCALLBACK fclose_file_func(voidpf opaque, voidpf stream)
|
||||
{
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
int ret = -1;
|
||||
@@ -338,7 +313,7 @@ static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream)
|
||||
static int ZCALLBACK ferror_file_func(voidpf opaque, voidpf stream)
|
||||
{
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
int ret = -1;
|
||||
@@ -349,8 +324,7 @@ static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream)
|
||||
return ret;
|
||||
}
|
||||
|
||||
void fill_fopen_filefunc (pzlib_filefunc_def)
|
||||
zlib_filefunc_def* pzlib_filefunc_def;
|
||||
void fill_fopen_filefunc(zlib_filefunc_def *pzlib_filefunc_def)
|
||||
{
|
||||
pzlib_filefunc_def->zopen_file = fopen_file_func;
|
||||
pzlib_filefunc_def->zopendisk_file = fopendisk_file_func;
|
||||
@@ -363,7 +337,7 @@ void fill_fopen_filefunc (pzlib_filefunc_def)
|
||||
pzlib_filefunc_def->opaque = NULL;
|
||||
}
|
||||
|
||||
void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def)
|
||||
void fill_fopen64_filefunc(zlib_filefunc64_def *pzlib_filefunc_def)
|
||||
{
|
||||
pzlib_filefunc_def->zopen64_file = fopen64_file_func;
|
||||
pzlib_filefunc_def->zopendisk64_file = fopendisk64_file_func;
|
||||
|
||||
162
MiniZip/ioapi.h
162
MiniZip/ioapi.h
@@ -1,84 +1,45 @@
|
||||
/* ioapi.h -- IO base function header for compress/uncompress .zip
|
||||
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
||||
|
||||
Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
|
||||
part of the MiniZip project
|
||||
|
||||
Copyright (C) 1998-2010 Gilles Vollant
|
||||
http://www.winimage.com/zLibDll/minizip.html
|
||||
Modifications for Zip64 support
|
||||
Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
|
||||
|
||||
For more info read MiniZip_info.txt
|
||||
|
||||
Changes
|
||||
|
||||
Oct-2009 - Defined ZPOS64_T to fpos_t on windows and u_int64_t on linux. (might need to find a better why for this)
|
||||
Oct-2009 - Change to fseeko64, ftello64 and fopen64 so large files would work on linux.
|
||||
More if/def section may be needed to support other platforms
|
||||
Oct-2009 - Defined fxxxx64 calls to normal fopen/ftell/fseek so they would compile on windows.
|
||||
(but you should use iowin32.c for windows instead)
|
||||
Copyright (C) 2009-2010 Mathias Svensson
|
||||
http://result42.com
|
||||
|
||||
This program is distributed under the terms of the same license as zlib.
|
||||
See the accompanying LICENSE file for the full text of the license.
|
||||
*/
|
||||
|
||||
#ifndef _ZLIBIOAPI64_H
|
||||
#define _ZLIBIOAPI64_H
|
||||
|
||||
#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__))
|
||||
/* Linux needs this to support file operation on files larger then 4+GB
|
||||
But might need better if/def to select just the platforms that needs them. */
|
||||
#ifndef __USE_FILE_OFFSET64
|
||||
#define __USE_FILE_OFFSET64
|
||||
#endif
|
||||
#ifndef __USE_LARGEFILE64
|
||||
#define __USE_LARGEFILE64
|
||||
#endif
|
||||
#ifndef _LARGEFILE64_SOURCE
|
||||
#define _LARGEFILE64_SOURCE
|
||||
#endif
|
||||
#ifndef _FILE_OFFSET_BIT
|
||||
#define _FILE_OFFSET_BIT 64
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "zlib.h"
|
||||
|
||||
#if defined(USE_FILE32API)
|
||||
#define fopen64 fopen
|
||||
#define ftello64 ftell
|
||||
#define fseeko64 fseek
|
||||
# define fopen64 fopen
|
||||
# define ftello64 ftell
|
||||
# define fseeko64 fseek
|
||||
#else
|
||||
#ifdef __FreeBSD__
|
||||
#define fopen64 fopen
|
||||
#define ftello64 ftello
|
||||
#define fseeko64 fseeko
|
||||
#endif
|
||||
#ifdef _MSC_VER
|
||||
#define fopen64 fopen
|
||||
#if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC)))
|
||||
#define ftello64 _ftelli64
|
||||
#define fseeko64 _fseeki64
|
||||
#else // old MSC
|
||||
#define ftello64 ftell
|
||||
#define fseeko64 fseek
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* a type choosen by DEFINE */
|
||||
#ifdef HAVE_64BIT_INT_CUSTOM
|
||||
typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T;
|
||||
#else
|
||||
#ifdef HAS_STDINT_H
|
||||
#include "stdint.h"
|
||||
typedef uint64_t ZPOS64_T;
|
||||
#else
|
||||
|
||||
#if defined(_MSC_VER) || defined(__BORLANDC__)
|
||||
typedef unsigned __int64 ZPOS64_T;
|
||||
#else
|
||||
typedef unsigned long long int ZPOS64_T;
|
||||
#endif
|
||||
#endif
|
||||
# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__APPLE__)
|
||||
# define fopen64 fopen
|
||||
# define ftello64 ftello
|
||||
# define fseeko64 fseeko
|
||||
# endif
|
||||
# ifdef _MSC_VER
|
||||
# define fopen64 fopen
|
||||
# if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC)))
|
||||
# define ftello64 _ftelli64
|
||||
# define fseeko64 _fseeki64
|
||||
# else /* old MSC */
|
||||
# define ftello64 ftell
|
||||
# define fseeko64 fseek
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
@@ -89,31 +50,30 @@ extern "C" {
|
||||
#define ZLIB_FILEFUNC_SEEK_END (2)
|
||||
#define ZLIB_FILEFUNC_SEEK_SET (0)
|
||||
|
||||
#define ZLIB_FILEFUNC_MODE_READ (1)
|
||||
#define ZLIB_FILEFUNC_MODE_WRITE (2)
|
||||
#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
|
||||
|
||||
#define ZLIB_FILEFUNC_MODE_EXISTING (4)
|
||||
#define ZLIB_FILEFUNC_MODE_CREATE (8)
|
||||
#define ZLIB_FILEFUNC_MODE_READ (1)
|
||||
#define ZLIB_FILEFUNC_MODE_WRITE (2)
|
||||
#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
|
||||
#define ZLIB_FILEFUNC_MODE_EXISTING (4)
|
||||
#define ZLIB_FILEFUNC_MODE_CREATE (8)
|
||||
|
||||
#ifndef ZCALLBACK
|
||||
#if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || \
|
||||
defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
|
||||
#define ZCALLBACK CALLBACK
|
||||
#else
|
||||
#define ZCALLBACK
|
||||
#endif
|
||||
# if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || \
|
||||
defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
|
||||
# define ZCALLBACK CALLBACK
|
||||
# else
|
||||
# define ZCALLBACK
|
||||
# endif
|
||||
#endif
|
||||
|
||||
typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode));
|
||||
typedef voidpf (ZCALLBACK *opendisk_file_func) OF((voidpf opaque, voidpf stream, int number_disk, int mode));
|
||||
typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size));
|
||||
typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
|
||||
typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream));
|
||||
typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
|
||||
typedef voidpf (ZCALLBACK *open_file_func) (voidpf opaque, const char *filename, int mode);
|
||||
typedef voidpf (ZCALLBACK *opendisk_file_func) (voidpf opaque, voidpf stream, uint32_t number_disk, int mode);
|
||||
typedef uint32_t (ZCALLBACK *read_file_func) (voidpf opaque, voidpf stream, void* buf, uint32_t size);
|
||||
typedef uint32_t (ZCALLBACK *write_file_func) (voidpf opaque, voidpf stream, const void *buf, uint32_t size);
|
||||
typedef int (ZCALLBACK *close_file_func) (voidpf opaque, voidpf stream);
|
||||
typedef int (ZCALLBACK *error_file_func) (voidpf opaque, voidpf stream);
|
||||
|
||||
typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream));
|
||||
typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin));
|
||||
typedef long (ZCALLBACK *tell_file_func) (voidpf opaque, voidpf stream);
|
||||
typedef long (ZCALLBACK *seek_file_func) (voidpf opaque, voidpf stream, uint32_t offset, int origin);
|
||||
|
||||
/* here is the "old" 32 bits structure structure */
|
||||
typedef struct zlib_filefunc_def_s
|
||||
@@ -125,14 +85,14 @@ typedef struct zlib_filefunc_def_s
|
||||
tell_file_func ztell_file;
|
||||
seek_file_func zseek_file;
|
||||
close_file_func zclose_file;
|
||||
testerror_file_func zerror_file;
|
||||
error_file_func zerror_file;
|
||||
voidpf opaque;
|
||||
} zlib_filefunc_def;
|
||||
|
||||
typedef ZPOS64_T (ZCALLBACK *tell64_file_func) OF((voidpf opaque, voidpf stream));
|
||||
typedef long (ZCALLBACK *seek64_file_func) OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
|
||||
typedef voidpf (ZCALLBACK *open64_file_func) OF((voidpf opaque, const void* filename, int mode));
|
||||
typedef voidpf (ZCALLBACK *opendisk64_file_func)OF((voidpf opaque, voidpf stream, int number_disk, int mode));
|
||||
typedef uint64_t (ZCALLBACK *tell64_file_func) (voidpf opaque, voidpf stream);
|
||||
typedef long (ZCALLBACK *seek64_file_func) (voidpf opaque, voidpf stream, uint64_t offset, int origin);
|
||||
typedef voidpf (ZCALLBACK *open64_file_func) (voidpf opaque, const void *filename, int mode);
|
||||
typedef voidpf (ZCALLBACK *opendisk64_file_func)(voidpf opaque, voidpf stream, uint32_t number_disk, int mode);
|
||||
|
||||
typedef struct zlib_filefunc64_def_s
|
||||
{
|
||||
@@ -143,12 +103,12 @@ typedef struct zlib_filefunc64_def_s
|
||||
tell64_file_func ztell64_file;
|
||||
seek64_file_func zseek64_file;
|
||||
close_file_func zclose_file;
|
||||
testerror_file_func zerror_file;
|
||||
error_file_func zerror_file;
|
||||
voidpf opaque;
|
||||
} zlib_filefunc64_def;
|
||||
|
||||
void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
|
||||
void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def));
|
||||
void fill_fopen_filefunc(zlib_filefunc_def *pzlib_filefunc_def);
|
||||
void fill_fopen64_filefunc(zlib_filefunc64_def *pzlib_filefunc_def);
|
||||
|
||||
/* now internal definition, only for zip.c and unzip.h */
|
||||
typedef struct zlib_filefunc64_32_def_s
|
||||
@@ -162,17 +122,17 @@ typedef struct zlib_filefunc64_32_def_s
|
||||
|
||||
#define ZREAD64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zread_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size))
|
||||
#define ZWRITE64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zwrite_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size))
|
||||
//#define ZTELL64(filefunc,filestream) ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream))
|
||||
//#define ZSEEK64(filefunc,filestream,pos,mode) ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode))
|
||||
/*#define ZTELL64(filefunc,filestream) ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream))*/
|
||||
/*#define ZSEEK64(filefunc,filestream,pos,mode) ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode))*/
|
||||
#define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream))
|
||||
#define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream))
|
||||
|
||||
voidpf call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode));
|
||||
voidpf call_zopendisk64 OF((const zlib_filefunc64_32_def* pfilefunc, voidpf filestream, int number_disk, int mode));
|
||||
long call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin));
|
||||
ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream));
|
||||
voidpf call_zopen64(const zlib_filefunc64_32_def *pfilefunc,const void*filename, int mode);
|
||||
voidpf call_zopendisk64(const zlib_filefunc64_32_def *pfilefunc, voidpf filestream, uint32_t number_disk, int mode);
|
||||
long call_zseek64(const zlib_filefunc64_32_def *pfilefunc, voidpf filestream, uint64_t offset, int origin);
|
||||
uint64_t call_ztell64(const zlib_filefunc64_32_def *pfilefunc, voidpf filestream);
|
||||
|
||||
void fill_zlib_filefunc64_32_def_from_filefunc32 OF((zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32));
|
||||
void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def *p_filefunc64_32, const zlib_filefunc_def *p_filefunc32);
|
||||
|
||||
#define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode)))
|
||||
#define ZOPENDISK64(filefunc,filestream,diskn,mode) (call_zopendisk64((&(filefunc)),(filestream),(diskn),(mode)))
|
||||
|
||||
1652
MiniZip/unzip.c
Executable file → Normal file
1652
MiniZip/unzip.c
Executable file → Normal file
File diff suppressed because it is too large
Load Diff
237
MiniZip/unzip.h
Executable file → Normal file
237
MiniZip/unzip.h
Executable file → Normal file
@@ -1,42 +1,21 @@
|
||||
/* unzip.h -- IO for uncompress .zip files using zlib
|
||||
Version 1.1, February 14h, 2010
|
||||
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
||||
|
||||
Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
|
||||
part of the MiniZip project
|
||||
|
||||
Copyright (C) 1998-2010 Gilles Vollant
|
||||
http://www.winimage.com/zLibDll/minizip.html
|
||||
Modifications of Unzip for Zip64
|
||||
Copyright (C) 2007-2008 Even Rouault
|
||||
|
||||
Copyright (C) 2007-2008 Even Rouault
|
||||
Modifications for Zip64 support on both zip and unzip
|
||||
Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
|
||||
Copyright (C) 2009-2010 Mathias Svensson
|
||||
http://result42.com
|
||||
|
||||
For more info read MiniZip_info.txt
|
||||
|
||||
---------------------------------------------------------------------------------
|
||||
|
||||
Condition of use and distribution are the same than zlib :
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
|
||||
---------------------------------------------------------------------------------
|
||||
This program is distributed under the terms of the same license as zlib.
|
||||
See the accompanying LICENSE file for the full text of the license.
|
||||
*/
|
||||
|
||||
#ifndef _unz64_H
|
||||
#define _unz64_H
|
||||
#ifndef _UNZ_H
|
||||
#define _UNZ_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -46,7 +25,7 @@ extern "C" {
|
||||
#include "zlib.h"
|
||||
#endif
|
||||
|
||||
#ifndef _ZLIBIOAPI_H
|
||||
#ifndef _ZLIBIOAPI_H
|
||||
#include "ioapi.h"
|
||||
#endif
|
||||
|
||||
@@ -59,13 +38,12 @@ extern "C" {
|
||||
#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
|
||||
/* like the STRICT of WIN32, we define a pointer that cannot be converted
|
||||
from (void*) without cast */
|
||||
typedef struct TagunzFile__ { int unused; } unzFile__;
|
||||
typedef unzFile__ *unzFile;
|
||||
typedef struct TagunzFile__ { int unused; } unz_file__;
|
||||
typedef unz_file__ *unzFile;
|
||||
#else
|
||||
typedef voidp unzFile;
|
||||
#endif
|
||||
|
||||
|
||||
#define UNZ_OK (0)
|
||||
#define UNZ_END_OF_LIST_OF_FILE (-100)
|
||||
#define UNZ_ERRNO (Z_ERRNO)
|
||||
@@ -74,114 +52,103 @@ typedef voidp unzFile;
|
||||
#define UNZ_BADZIPFILE (-103)
|
||||
#define UNZ_INTERNALERROR (-104)
|
||||
#define UNZ_CRCERROR (-105)
|
||||
|
||||
/* tm_unz contain date/time info */
|
||||
typedef struct tm_unz_s
|
||||
{
|
||||
uInt tm_sec; /* seconds after the minute - [0,59] */
|
||||
uInt tm_min; /* minutes after the hour - [0,59] */
|
||||
uInt tm_hour; /* hours since midnight - [0,23] */
|
||||
uInt tm_mday; /* day of the month - [1,31] */
|
||||
uInt tm_mon; /* months since January - [0,11] */
|
||||
uInt tm_year; /* years - [1980..2044] */
|
||||
} tm_unz;
|
||||
#define UNZ_BADPASSWORD (-106)
|
||||
|
||||
/* unz_global_info structure contain global data about the ZIPfile
|
||||
These data comes from the end of central dir */
|
||||
typedef struct unz_global_info64_s
|
||||
{
|
||||
ZPOS64_T number_entry; /* total number of entries in the central dir on this disk */
|
||||
uLong number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP*/
|
||||
uLong size_comment; /* size of the global comment of the zipfile */
|
||||
uint64_t number_entry; /* total number of entries in the central dir on this disk */
|
||||
uint32_t number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP*/
|
||||
uint16_t size_comment; /* size of the global comment of the zipfile */
|
||||
} unz_global_info64;
|
||||
|
||||
typedef struct unz_global_info_s
|
||||
{
|
||||
uLong number_entry; /* total number of entries in the central dir on this disk */
|
||||
uLong number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP*/
|
||||
uLong size_comment; /* size of the global comment of the zipfile */
|
||||
uint32_t number_entry; /* total number of entries in the central dir on this disk */
|
||||
uint32_t number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP*/
|
||||
uint16_t size_comment; /* size of the global comment of the zipfile */
|
||||
} unz_global_info;
|
||||
|
||||
/* unz_file_info contain information about a file in the zipfile */
|
||||
typedef struct unz_file_info64_s
|
||||
{
|
||||
uLong version; /* version made by 2 bytes */
|
||||
uLong version_needed; /* version needed to extract 2 bytes */
|
||||
uLong flag; /* general purpose bit flag 2 bytes */
|
||||
uLong compression_method; /* compression method 2 bytes */
|
||||
uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
|
||||
uLong crc; /* crc-32 4 bytes */
|
||||
ZPOS64_T compressed_size; /* compressed size 8 bytes */
|
||||
ZPOS64_T uncompressed_size; /* uncompressed size 8 bytes */
|
||||
uLong size_filename; /* filename length 2 bytes */
|
||||
uLong size_file_extra; /* extra field length 2 bytes */
|
||||
uLong size_file_comment; /* file comment length 2 bytes */
|
||||
uint16_t version; /* version made by 2 bytes */
|
||||
uint16_t version_needed; /* version needed to extract 2 bytes */
|
||||
uint16_t flag; /* general purpose bit flag 2 bytes */
|
||||
uint16_t compression_method; /* compression method 2 bytes */
|
||||
uint32_t dos_date; /* last mod file date in Dos fmt 4 bytes */
|
||||
uint32_t crc; /* crc-32 4 bytes */
|
||||
uint64_t compressed_size; /* compressed size 8 bytes */
|
||||
uint64_t uncompressed_size; /* uncompressed size 8 bytes */
|
||||
uint16_t size_filename; /* filename length 2 bytes */
|
||||
uint16_t size_file_extra; /* extra field length 2 bytes */
|
||||
uint16_t size_file_comment; /* file comment length 2 bytes */
|
||||
|
||||
uLong disk_num_start; /* disk number start 2 bytes */
|
||||
uLong internal_fa; /* internal file attributes 2 bytes */
|
||||
uLong external_fa; /* external file attributes 4 bytes */
|
||||
uint32_t disk_num_start; /* disk number start 4 bytes */
|
||||
uint16_t internal_fa; /* internal file attributes 2 bytes */
|
||||
uint32_t external_fa; /* external file attributes 4 bytes */
|
||||
|
||||
tm_unz tmu_date;
|
||||
ZPOS64_T disk_offset;
|
||||
uLong size_file_extra_internal;
|
||||
uint64_t disk_offset;
|
||||
|
||||
uint16_t size_file_extra_internal;
|
||||
} unz_file_info64;
|
||||
|
||||
typedef struct unz_file_info_s
|
||||
{
|
||||
uLong version; /* version made by 2 bytes */
|
||||
uLong version_needed; /* version needed to extract 2 bytes */
|
||||
uLong flag; /* general purpose bit flag 2 bytes */
|
||||
uLong compression_method; /* compression method 2 bytes */
|
||||
uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
|
||||
uLong crc; /* crc-32 4 bytes */
|
||||
uLong compressed_size; /* compressed size 4 bytes */
|
||||
uLong uncompressed_size; /* uncompressed size 4 bytes */
|
||||
uLong size_filename; /* filename length 2 bytes */
|
||||
uLong size_file_extra; /* extra field length 2 bytes */
|
||||
uLong size_file_comment; /* file comment length 2 bytes */
|
||||
uint16_t version; /* version made by 2 bytes */
|
||||
uint16_t version_needed; /* version needed to extract 2 bytes */
|
||||
uint16_t flag; /* general purpose bit flag 2 bytes */
|
||||
uint16_t compression_method; /* compression method 2 bytes */
|
||||
uint32_t dos_date; /* last mod file date in Dos fmt 4 bytes */
|
||||
uint32_t crc; /* crc-32 4 bytes */
|
||||
uint32_t compressed_size; /* compressed size 4 bytes */
|
||||
uint32_t uncompressed_size; /* uncompressed size 4 bytes */
|
||||
uint16_t size_filename; /* filename length 2 bytes */
|
||||
uint16_t size_file_extra; /* extra field length 2 bytes */
|
||||
uint16_t size_file_comment; /* file comment length 2 bytes */
|
||||
|
||||
uLong disk_num_start; /* disk number start 2 bytes */
|
||||
uLong internal_fa; /* internal file attributes 2 bytes */
|
||||
uLong external_fa; /* external file attributes 4 bytes */
|
||||
uint16_t disk_num_start; /* disk number start 2 bytes */
|
||||
uint16_t internal_fa; /* internal file attributes 2 bytes */
|
||||
uint32_t external_fa; /* external file attributes 4 bytes */
|
||||
|
||||
tm_unz tmu_date;
|
||||
uLong disk_offset;
|
||||
uint64_t disk_offset;
|
||||
} unz_file_info;
|
||||
|
||||
/***************************************************************************/
|
||||
/* Opening and close a zip file */
|
||||
|
||||
extern unzFile ZEXPORT unzOpen OF((const char *path));
|
||||
extern unzFile ZEXPORT unzOpen64 OF((const void *path));
|
||||
extern unzFile ZEXPORT unzOpen(const char *path);
|
||||
extern unzFile ZEXPORT unzOpen64(const void *path);
|
||||
/* Open a Zip file.
|
||||
|
||||
path should contain the full pathname (by example, on a Windows XP computer
|
||||
path should contain the full path (by example, on a Windows XP computer
|
||||
"c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip".
|
||||
return NULL if zipfile cannot be opened or doesn't exist
|
||||
return unzFile handle if no error
|
||||
|
||||
NOTE: The "64" function take a const void* pointer, because the path is just the value passed to the
|
||||
NOTE: The "64" function take a const void *pointer, because the path is just the value passed to the
|
||||
open64_file_func callback. Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path
|
||||
is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char* does not describe the reality */
|
||||
is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char *does not describe the reality */
|
||||
|
||||
extern unzFile ZEXPORT unzOpen2 OF((const char *path, zlib_filefunc_def* pzlib_filefunc_def));
|
||||
extern unzFile ZEXPORT unzOpen2(const char *path, zlib_filefunc_def *pzlib_filefunc_def);
|
||||
/* Open a Zip file, like unzOpen, but provide a set of file low level API for read/write operations */
|
||||
extern unzFile ZEXPORT unzOpen2_64 OF((const void *path, zlib_filefunc64_def* pzlib_filefunc_def));
|
||||
extern unzFile ZEXPORT unzOpen2_64(const void *path, zlib_filefunc64_def *pzlib_filefunc_def);
|
||||
/* Open a Zip file, like unz64Open, but provide a set of file low level API for read/write 64-bit operations */
|
||||
|
||||
extern int ZEXPORT unzClose OF((unzFile file));
|
||||
/* Close a ZipFile opened with unzipOpen. If there is files inside the .Zip opened with unzOpenCurrentFile,
|
||||
extern int ZEXPORT unzClose(unzFile file);
|
||||
/* Close a ZipFile opened with unzOpen. If there is files inside the .Zip opened with unzOpenCurrentFile,
|
||||
these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
|
||||
|
||||
return UNZ_OK if there is no error */
|
||||
|
||||
extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, unz_global_info *pglobal_info));
|
||||
extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file, unz_global_info64 *pglobal_info));
|
||||
extern int ZEXPORT unzGetGlobalInfo(unzFile file, unz_global_info *pglobal_info);
|
||||
extern int ZEXPORT unzGetGlobalInfo64(unzFile file, unz_global_info64 *pglobal_info);
|
||||
/* Write info about the ZipFile in the *pglobal_info structure.
|
||||
|
||||
return UNZ_OK if no error */
|
||||
|
||||
extern int ZEXPORT unzGetGlobalComment OF((unzFile file, char *comment, uLong comment_size));
|
||||
extern int ZEXPORT unzGetGlobalComment(unzFile file, char *comment, uint16_t comment_size);
|
||||
/* Get the global comment string of the ZipFile, in the comment buffer.
|
||||
|
||||
uSizeBuf is the size of the szComment buffer.
|
||||
@@ -191,28 +158,28 @@ extern int ZEXPORT unzGetGlobalComment OF((unzFile file, char *comment, uLong co
|
||||
/* Reading the content of the current zipfile, you can open it, read data from it, and close it
|
||||
(you can close it before reading all the file) */
|
||||
|
||||
extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
|
||||
extern int ZEXPORT unzOpenCurrentFile(unzFile file);
|
||||
/* Open for reading data the current file in the zipfile.
|
||||
|
||||
return UNZ_OK if no error */
|
||||
|
||||
extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, const char* password));
|
||||
extern int ZEXPORT unzOpenCurrentFilePassword(unzFile file, const char *password);
|
||||
/* Open for reading data the current file in the zipfile.
|
||||
password is a crypting password
|
||||
|
||||
return UNZ_OK if no error */
|
||||
|
||||
extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, int* method, int* level, int raw));
|
||||
extern int ZEXPORT unzOpenCurrentFile2(unzFile file, int *method, int *level, int raw);
|
||||
/* Same as unzOpenCurrentFile, but open for read raw the file (not uncompress)
|
||||
if raw==1 *method will receive method of compression, *level will receive level of compression
|
||||
|
||||
NOTE: you can set level parameter as NULL (if you did not want known level,
|
||||
but you CANNOT set method parameter as NULL */
|
||||
|
||||
extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, int* method, int* level, int raw, const char* password));
|
||||
extern int ZEXPORT unzOpenCurrentFile3(unzFile file, int *method, int *level, int raw, const char *password);
|
||||
/* Same as unzOpenCurrentFile, but takes extra parameter password for encrypted files */
|
||||
|
||||
extern int ZEXPORT unzReadCurrentFile OF((unzFile file, voidp buf, unsigned len));
|
||||
extern int ZEXPORT unzReadCurrentFile(unzFile file, voidp buf, uint32_t len);
|
||||
/* Read bytes from the current file (opened by unzOpenCurrentFile)
|
||||
buf contain buffer where data must be copied
|
||||
len the size of buf.
|
||||
@@ -221,10 +188,10 @@ extern int ZEXPORT unzReadCurrentFile OF((unzFile file, voidp buf, unsigned len)
|
||||
return 0 if the end of file was reached
|
||||
return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */
|
||||
|
||||
extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, unz_file_info *pfile_info, char *filename,
|
||||
uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));
|
||||
extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, unz_file_info64 *pfile_info, char *filename,
|
||||
uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));
|
||||
extern int ZEXPORT unzGetCurrentFileInfo(unzFile file, unz_file_info *pfile_info, char *filename,
|
||||
uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size);
|
||||
extern int ZEXPORT unzGetCurrentFileInfo64(unzFile file, unz_file_info64 *pfile_info, char *filename,
|
||||
uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size);
|
||||
/* Get Info about the current file
|
||||
|
||||
pfile_info if != NULL, the *pfile_info structure will contain somes info about the current file
|
||||
@@ -235,9 +202,7 @@ extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, unz_file_info64 *pf
|
||||
comment if != NULL, the comment string of the file will be copied in to
|
||||
comment_size is the size of the comment buffer */
|
||||
|
||||
extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file));
|
||||
|
||||
extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, voidp buf, unsigned len));
|
||||
extern int ZEXPORT unzGetLocalExtrafield(unzFile file, voidp buf, uint32_t len);
|
||||
/* Read extra field from the current file (opened by unzOpenCurrentFile)
|
||||
This is the local-header version of the extra field (sometimes, there is
|
||||
more info in the local-header version than in the central-header)
|
||||
@@ -247,7 +212,7 @@ extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, voidp buf, unsigned l
|
||||
|
||||
return number of bytes copied in buf, or (if <0) the error code */
|
||||
|
||||
extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
|
||||
extern int ZEXPORT unzCloseCurrentFile(unzFile file);
|
||||
/* Close the file in zip opened with unzOpenCurrentFile
|
||||
|
||||
return UNZ_CRCERROR if all the file was read but the CRC is not good */
|
||||
@@ -258,35 +223,35 @@ extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
|
||||
typedef int (*unzFileNameComparer)(unzFile file, const char *filename1, const char *filename2);
|
||||
typedef int (*unzIteratorFunction)(unzFile file);
|
||||
typedef int (*unzIteratorFunction2)(unzFile file, unz_file_info64 *pfile_info, char *filename,
|
||||
uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size);
|
||||
uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size);
|
||||
|
||||
extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
|
||||
extern int ZEXPORT unzGoToFirstFile(unzFile file);
|
||||
/* Set the current file of the zipfile to the first file.
|
||||
|
||||
return UNZ_OK if no error */
|
||||
|
||||
extern int ZEXPORT unzGoToFirstFile2 OF((unzFile file, unz_file_info64 *pfile_info, char *filename,
|
||||
uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));
|
||||
extern int ZEXPORT unzGoToFirstFile2(unzFile file, unz_file_info64 *pfile_info, char *filename,
|
||||
uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size);
|
||||
/* Set the current file of the zipfile to the first file and retrieves the current info on success.
|
||||
Not as seek intensive as unzGoToFirstFile + unzGetCurrentFileInfo.
|
||||
|
||||
return UNZ_OK if no error */
|
||||
|
||||
extern int ZEXPORT unzGoToNextFile OF((unzFile file));
|
||||
extern int ZEXPORT unzGoToNextFile(unzFile file);
|
||||
/* Set the current file of the zipfile to the next file.
|
||||
|
||||
return UNZ_OK if no error
|
||||
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest */
|
||||
|
||||
extern int ZEXPORT unzGoToNextFile2 OF((unzFile file, unz_file_info64 *pfile_info, char *filename,
|
||||
uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));
|
||||
extern int ZEXPORT unzGoToNextFile2(unzFile file, unz_file_info64 *pfile_info, char *filename,
|
||||
uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size);
|
||||
/* Set the current file of the zipfile to the next file and retrieves the current
|
||||
info on success. Does less seeking around than unzGotoNextFile + unzGetCurrentFileInfo.
|
||||
|
||||
return UNZ_OK if no error
|
||||
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest */
|
||||
|
||||
extern int ZEXPORT unzLocateFile OF((unzFile file, const char *filename, unzFileNameComparer filename_compare_func));
|
||||
extern int ZEXPORT unzLocateFile(unzFile file, const char *filename, unzFileNameComparer filename_compare_func);
|
||||
/* Try locate the file szFileName in the zipfile. For custom filename comparison pass in comparison function.
|
||||
|
||||
return UNZ_OK if the file is found (it becomes the current file)
|
||||
@@ -297,35 +262,39 @@ extern int ZEXPORT unzLocateFile OF((unzFile file, const char *filename, unzFile
|
||||
|
||||
typedef struct unz_file_pos_s
|
||||
{
|
||||
uLong pos_in_zip_directory; /* offset in zip file directory */
|
||||
uLong num_of_file; /* # of file */
|
||||
uint32_t pos_in_zip_directory; /* offset in zip file directory */
|
||||
uint32_t num_of_file; /* # of file */
|
||||
} unz_file_pos;
|
||||
|
||||
extern int ZEXPORT unzGetFilePos OF((unzFile file, unz_file_pos* file_pos));
|
||||
extern int ZEXPORT unzGoToFilePos OF((unzFile file, unz_file_pos* file_pos));
|
||||
extern int ZEXPORT unzGetFilePos(unzFile file, unz_file_pos *file_pos);
|
||||
extern int ZEXPORT unzGoToFilePos(unzFile file, unz_file_pos *file_pos);
|
||||
|
||||
typedef struct unz64_file_pos_s
|
||||
{
|
||||
ZPOS64_T pos_in_zip_directory; /* offset in zip file directory */
|
||||
ZPOS64_T num_of_file; /* # of file */
|
||||
uint64_t pos_in_zip_directory; /* offset in zip file directory */
|
||||
uint64_t num_of_file; /* # of file */
|
||||
} unz64_file_pos;
|
||||
|
||||
extern int ZEXPORT unzGetFilePos64 OF((unzFile file, unz64_file_pos* file_pos));
|
||||
extern int ZEXPORT unzGoToFilePos64 OF((unzFile file, const unz64_file_pos* file_pos));
|
||||
extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos *file_pos);
|
||||
extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos *file_pos);
|
||||
|
||||
extern uLong ZEXPORT unzGetOffset OF((unzFile file));
|
||||
extern ZPOS64_T ZEXPORT unzGetOffset64 OF((unzFile file));
|
||||
extern int32_t ZEXPORT unzGetOffset(unzFile file);
|
||||
extern int64_t ZEXPORT unzGetOffset64(unzFile file);
|
||||
/* Get the current file offset */
|
||||
|
||||
extern int ZEXPORT unzSetOffset OF((unzFile file, uLong pos));
|
||||
extern int ZEXPORT unzSetOffset64 OF((unzFile file, ZPOS64_T pos));
|
||||
extern int ZEXPORT unzSetOffset(unzFile file, uint32_t pos);
|
||||
extern int ZEXPORT unzSetOffset64(unzFile file, uint64_t pos);
|
||||
/* Set the current file offset */
|
||||
|
||||
extern z_off_t ZEXPORT unztell OF((unzFile file));
|
||||
extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file));
|
||||
extern int32_t ZEXPORT unzTell(unzFile file);
|
||||
extern int64_t ZEXPORT unzTell64(unzFile file);
|
||||
/* return current position in uncompressed data */
|
||||
|
||||
extern int ZEXPORT unzeof OF((unzFile file));
|
||||
extern int ZEXPORT unzSeek(unzFile file, uint32_t offset, int origin);
|
||||
extern int ZEXPORT unzSeek64(unzFile file, uint64_t offset, int origin);
|
||||
/* Seek within the uncompressed data if compression method is storage */
|
||||
|
||||
extern int ZEXPORT unzEndOfFile(unzFile file);
|
||||
/* return 1 if the end of file was reached, 0 elsewhere */
|
||||
|
||||
/***************************************************************************/
|
||||
@@ -334,4 +303,4 @@ extern int ZEXPORT unzeof OF((unzFile file));
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _unz64_H */
|
||||
#endif /* _UNZ_H */
|
||||
|
||||
3992
MiniZip/zip.c
3992
MiniZip/zip.c
File diff suppressed because it is too large
Load Diff
170
MiniZip/zip.h
Executable file → Normal file
170
MiniZip/zip.h
Executable file → Normal file
@@ -1,54 +1,34 @@
|
||||
/* zip.h -- IO on .zip files using zlib
|
||||
Version 1.1, February 14h, 2010
|
||||
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
||||
|
||||
Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
|
||||
part of the MiniZip project
|
||||
|
||||
Copyright (C) 1998-2010 Gilles Vollant
|
||||
http://www.winimage.com/zLibDll/minizip.html
|
||||
Modifications for Zip64 support
|
||||
Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
|
||||
Copyright (C) 2009-2010 Mathias Svensson
|
||||
http://result42.com
|
||||
|
||||
For more info read MiniZip_info.txt
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Condition of use and distribution are the same than zlib :
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
This program is distributed under the terms of the same license as zlib.
|
||||
See the accompanying LICENSE file for the full text of the license.
|
||||
*/
|
||||
|
||||
#ifndef _zip12_H
|
||||
#define _zip12_H
|
||||
#ifndef _ZIP_H
|
||||
#define _ZIP_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef _ZLIB_H
|
||||
#include "zlib.h"
|
||||
# include "zlib.h"
|
||||
#endif
|
||||
|
||||
#ifndef _ZLIBIOAPI_H
|
||||
#include "ioapi.h"
|
||||
# include "ioapi.h"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_BZIP2
|
||||
#include "bzlib.h"
|
||||
# include "bzlib.h"
|
||||
#endif
|
||||
|
||||
#define Z_BZIP2ED 12
|
||||
@@ -56,8 +36,8 @@ extern "C" {
|
||||
#if defined(STRICTZIP) || defined(STRICTZIPUNZIP)
|
||||
/* like the STRICT of WIN32, we define a pointer that cannot be converted
|
||||
from (void*) without cast */
|
||||
typedef struct TagzipFile__ { int unused; } zipFile__;
|
||||
typedef zipFile__ *zipFile;
|
||||
typedef struct TagzipFile__ { int unused; } zip_file__;
|
||||
typedef zip_file__ *zipFile;
|
||||
#else
|
||||
typedef voidp zipFile;
|
||||
#endif
|
||||
@@ -76,29 +56,14 @@ typedef voidp zipFile;
|
||||
# define DEF_MEM_LEVEL MAX_MEM_LEVEL
|
||||
# endif
|
||||
#endif
|
||||
/* default memLevel */
|
||||
|
||||
/* tm_zip contain date/time info */
|
||||
typedef struct tm_zip_s
|
||||
{
|
||||
uInt tm_sec; /* seconds after the minute - [0,59] */
|
||||
uInt tm_min; /* minutes after the hour - [0,59] */
|
||||
uInt tm_hour; /* hours since midnight - [0,23] */
|
||||
uInt tm_mday; /* day of the month - [1,31] */
|
||||
uInt tm_mon; /* months since January - [0,11] */
|
||||
uInt tm_year; /* years - [1980..2044] */
|
||||
} tm_zip;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
tm_zip tmz_date; /* date in understandable format */
|
||||
uLong dosDate; /* if dos_date == 0, tmu_date is used */
|
||||
uLong internal_fa; /* internal file attributes 2 bytes */
|
||||
uLong external_fa; /* external file attributes 4 bytes */
|
||||
uint32_t dos_date;
|
||||
uint16_t internal_fa; /* internal file attributes 2 bytes */
|
||||
uint32_t external_fa; /* external file attributes 4 bytes */
|
||||
} zip_fileinfo;
|
||||
|
||||
typedef const char* zipcharpc;
|
||||
|
||||
#define APPEND_STATUS_CREATE (0)
|
||||
#define APPEND_STATUS_CREATEAFTER (1)
|
||||
#define APPEND_STATUS_ADDINZIP (2)
|
||||
@@ -106,41 +71,41 @@ typedef const char* zipcharpc;
|
||||
/***************************************************************************/
|
||||
/* Writing a zip file */
|
||||
|
||||
extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append));
|
||||
extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append));
|
||||
extern zipFile ZEXPORT zipOpen(const char *path, int append);
|
||||
extern zipFile ZEXPORT zipOpen64(const void *path, int append);
|
||||
/* Create a zipfile.
|
||||
|
||||
pathname should contain the full pathname (by example, on a Windows XP computer
|
||||
path should contain the full path (by example, on a Windows XP computer
|
||||
"c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip".
|
||||
|
||||
return NULL if zipfile cannot be opened
|
||||
return zipFile handle if no error
|
||||
|
||||
If the file pathname exist and append == APPEND_STATUS_CREATEAFTER, the zip
|
||||
If the file path exist and append == APPEND_STATUS_CREATEAFTER, the zip
|
||||
will be created at the end of the file. (useful if the file contain a self extractor code)
|
||||
If the file pathname exist and append == APPEND_STATUS_ADDINZIP, we will add files in existing
|
||||
If the file path exist and append == APPEND_STATUS_ADDINZIP, we will add files in existing
|
||||
zip (be sure you don't add file that doesn't exist)
|
||||
|
||||
NOTE: There is no delete function into a zipfile. If you want delete file into a zipfile,
|
||||
you must open a zipfile, and create another. Of course, you can use RAW reading and writing to copy
|
||||
the file you did not want delete. */
|
||||
|
||||
extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, int append, zipcharpc* globalcomment,
|
||||
zlib_filefunc_def* pzlib_filefunc_def));
|
||||
extern zipFile ZEXPORT zipOpen2(const char *path, int append, const char **globalcomment,
|
||||
zlib_filefunc_def *pzlib_filefunc_def);
|
||||
|
||||
extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname, int append, zipcharpc* globalcomment,
|
||||
zlib_filefunc64_def* pzlib_filefunc_def));
|
||||
extern zipFile ZEXPORT zipOpen2_64(const void *path, int append, const char **globalcomment,
|
||||
zlib_filefunc64_def *pzlib_filefunc_def);
|
||||
|
||||
extern zipFile ZEXPORT zipOpen3 OF((const char *pathname, int append, ZPOS64_T disk_size,
|
||||
zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc_def));
|
||||
extern zipFile ZEXPORT zipOpen3(const char *path, int append, uint64_t disk_size,
|
||||
const char **globalcomment, zlib_filefunc_def *pzlib_filefunc_def);
|
||||
/* Same as zipOpen2 but allows specification of spanned zip size */
|
||||
|
||||
extern zipFile ZEXPORT zipOpen3_64 OF((const void *pathname, int append, ZPOS64_T disk_size,
|
||||
zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def));
|
||||
extern zipFile ZEXPORT zipOpen3_64(const void *path, int append, uint64_t disk_size,
|
||||
const char **globalcomment, zlib_filefunc64_def *pzlib_filefunc_def);
|
||||
|
||||
extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
||||
const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global,
|
||||
uInt size_extrafield_global, const char* comment, int method, int level));
|
||||
extern int ZEXPORT zipOpenNewFileInZip(zipFile file, const char *filename, const zip_fileinfo *zipfi,
|
||||
const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
|
||||
uint16_t size_extrafield_global, const char *comment, uint16_t method, int level);
|
||||
/* Open a file in the ZIP for writing.
|
||||
|
||||
filename : the filename in zip (if NULL, '-' without quote will be used
|
||||
@@ -155,66 +120,71 @@ extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, const char* filename, c
|
||||
zip64 is set to 1 if a zip64 extended information block should be added to the local file header.
|
||||
this MUST be '1' if the uncompressed size is >= 0xffffffff. */
|
||||
|
||||
extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
||||
const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global,
|
||||
uInt size_extrafield_global, const char* comment, int method, int level, int zip64));
|
||||
extern int ZEXPORT zipOpenNewFileInZip64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
|
||||
const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
|
||||
uint16_t size_extrafield_global, const char *comment, uint16_t method, int level, int zip64);
|
||||
/* Same as zipOpenNewFileInZip with zip64 support */
|
||||
|
||||
extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
||||
const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global,
|
||||
uInt size_extrafield_global, const char* comment, int method, int level, int raw));
|
||||
extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char *filename, const zip_fileinfo *zipfi,
|
||||
const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
|
||||
uint16_t size_extrafield_global, const char *comment, uint16_t method, int level, int raw);
|
||||
/* Same as zipOpenNewFileInZip, except if raw=1, we write raw file */
|
||||
|
||||
extern int ZEXPORT zipOpenNewFileInZip2_64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
||||
const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global,
|
||||
uInt size_extrafield_global, const char* comment, int method, int level, int raw, int zip64));
|
||||
extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
|
||||
const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
|
||||
uint16_t size_extrafield_global, const char *comment, uint16_t method, int level, int raw, int zip64);
|
||||
/* Same as zipOpenNewFileInZip3 with zip64 support */
|
||||
|
||||
extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
||||
const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global,
|
||||
uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel,
|
||||
int strategy, const char* password, uLong crcForCrypting));
|
||||
extern int ZEXPORT zipOpenNewFileInZip3(zipFile file, const char *filename, const zip_fileinfo *zipfi,
|
||||
const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
|
||||
uint16_t size_extrafield_global, const char *comment, uint16_t method, int level, int raw, int windowBits, int memLevel,
|
||||
int strategy, const char *password, uint32_t crcForCrypting);
|
||||
/* Same as zipOpenNewFileInZip2, except
|
||||
windowBits, memLevel, strategy : see parameter strategy in deflateInit2
|
||||
password : crypting password (NULL for no crypting)
|
||||
crcForCrypting : crc of file to compress (needed for crypting) */
|
||||
|
||||
extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
||||
const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global,
|
||||
uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel,
|
||||
int strategy, const char* password, uLong crcForCrypting, int zip64));
|
||||
extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
|
||||
const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
|
||||
uint16_t size_extrafield_global, const char *comment, uint16_t method, int level, int raw, int windowBits, int memLevel,
|
||||
int strategy, const char *password, uint32_t crc_for_crypting, int zip64);
|
||||
/* Same as zipOpenNewFileInZip3 with zip64 support */
|
||||
|
||||
extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
||||
const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global,
|
||||
uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel,
|
||||
int strategy, const char* password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase));
|
||||
extern int ZEXPORT zipOpenNewFileInZip4(zipFile file, const char *filename, const zip_fileinfo *zipfi,
|
||||
const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
|
||||
uint16_t size_extrafield_global, const char *comment, uint16_t method, int level, int raw, int windowBits, int memLevel,
|
||||
int strategy, const char *password, uint32_t crc_for_crypting, uint16_t version_madeby, uint16_t flag_base);
|
||||
/* Same as zipOpenNewFileInZip3 except versionMadeBy & flag fields */
|
||||
|
||||
extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
||||
const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global,
|
||||
uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel,
|
||||
int strategy, const char* password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase, int zip64));
|
||||
extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
|
||||
const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
|
||||
uint16_t size_extrafield_global, const char *comment, uint16_t method, int level, int raw, int windowBits, int memLevel,
|
||||
int strategy, const char *password, uint32_t crc_for_crypting, uint16_t version_madeby, uint16_t flag_base, int zip64);
|
||||
/* Same as zipOpenNewFileInZip4 with zip64 support */
|
||||
|
||||
extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, const void* buf, unsigned len));
|
||||
extern int ZEXPORT zipWriteInFileInZip(zipFile file, const void *buf, uint32_t len);
|
||||
/* Write data in the zipfile */
|
||||
|
||||
extern int ZEXPORT zipCloseFileInZip OF((zipFile file));
|
||||
extern int ZEXPORT zipCloseFileInZip(zipFile file);
|
||||
/* Close the current file in the zipfile */
|
||||
|
||||
extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, uLong uncompressed_size, uLong crc32));
|
||||
extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file, ZPOS64_T uncompressed_size, uLong crc32));
|
||||
extern int ZEXPORT zipCloseFileInZipRaw(zipFile file, uint32_t uncompressed_size, uint32_t crc32);
|
||||
extern int ZEXPORT zipCloseFileInZipRaw64(zipFile file, uint64_t uncompressed_size, uint32_t crc32);
|
||||
/* Close the current file in the zipfile, for file opened with parameter raw=1 in zipOpenNewFileInZip2
|
||||
uncompressed_size and crc32 are value for the uncompressed size */
|
||||
where raw is compressed data. Parameters uncompressed_size and crc32 are value for the uncompressed data. */
|
||||
|
||||
extern int ZEXPORT zipClose OF((zipFile file, const char* global_comment));
|
||||
extern int ZEXPORT zipClose(zipFile file, const char *global_comment);
|
||||
/* Close the zipfile */
|
||||
|
||||
extern int ZEXPORT zipClose_64(zipFile file, const char *global_comment);
|
||||
|
||||
extern int ZEXPORT zipClose2_64(zipFile file, const char *global_comment, uint16_t version_madeby);
|
||||
/* Same as zipClose_64 except version_madeby field */
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _zip64_H */
|
||||
#endif /* _ZIP_H */
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// Objective-Zip_Swift_Tests.swift
|
||||
// Objective-Zip
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 20/09/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
@@ -49,38 +49,38 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
super.tearDown()
|
||||
}
|
||||
|
||||
func test01ZipAndUnzip() {
|
||||
let documentsUrl = NSURL(fileURLWithPath:NSHomeDirectory(), isDirectory:true).URLByAppendingPathComponent("Documents")
|
||||
let fileUrl = documentsUrl.URLByAppendingPathComponent("test.zip")
|
||||
let filePath = fileUrl.path!
|
||||
func test01_ZipAndUnzip() {
|
||||
let documentsUrl = URL(fileURLWithPath:NSHomeDirectory(), isDirectory:true).appendingPathComponent("Documents")
|
||||
let fileUrl = documentsUrl.appendingPathComponent("test.zip")
|
||||
let filePath = fileUrl.path
|
||||
|
||||
do {
|
||||
try NSFileManager.defaultManager().removeItemAtPath(filePath)
|
||||
try FileManager.default.removeItem(atPath: filePath)
|
||||
} catch {}
|
||||
|
||||
defer {
|
||||
do {
|
||||
try NSFileManager.defaultManager().removeItemAtPath(filePath)
|
||||
try FileManager.default.removeItem(atPath: filePath)
|
||||
} catch {}
|
||||
}
|
||||
|
||||
do {
|
||||
NSLog("Test 1: opening zip file for writing...")
|
||||
|
||||
let zipFile = try OZZipFile(fileName:filePath, mode:OZZipFileMode.Create)
|
||||
let zipFile = try OZZipFile(fileName:filePath, mode:OZZipFileMode.create)
|
||||
|
||||
XCTAssertNotNil(zipFile)
|
||||
|
||||
NSLog("Test 1: adding first file...")
|
||||
|
||||
let stream1 = try zipFile.writeFileInZipWithName("abc.txt", fileDate:NSDate(timeIntervalSinceNow:-86400.0), compressionLevel:OZZipCompressionLevel.Best)
|
||||
let stream1 = try zipFile.writeInZip(withName: "abc.txt", fileDate:Date(timeIntervalSinceNow:-86400.0), compressionLevel:OZZipCompressionLevel.best)
|
||||
|
||||
XCTAssertNotNil(stream1)
|
||||
|
||||
NSLog("Test 1: writing to first file's stream...")
|
||||
|
||||
let text = "abc"
|
||||
try stream1.writeData(text.dataUsingEncoding(NSUTF8StringEncoding)!)
|
||||
try stream1.write(text.data(using: String.Encoding.utf8)!)
|
||||
|
||||
NSLog("Test 1: closing first file's stream...")
|
||||
|
||||
@@ -89,14 +89,14 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
NSLog("Test 1: adding second file...")
|
||||
|
||||
let file2name = "x/y/z/xyz.txt"
|
||||
let stream2 = try zipFile.writeFileInZipWithName(file2name, compressionLevel:OZZipCompressionLevel.None)
|
||||
let stream2 = try zipFile.writeInZip(withName: file2name, compressionLevel:OZZipCompressionLevel.none)
|
||||
|
||||
XCTAssertNotNil(stream2)
|
||||
|
||||
NSLog("Test 1: writing to second file's stream...")
|
||||
|
||||
let text2 = "XYZ"
|
||||
try stream2.writeData(text2.dataUsingEncoding(NSUTF8StringEncoding)!)
|
||||
try stream2.write(text2.data(using: String.Encoding.utf8)!)
|
||||
|
||||
NSLog("Test 1: closing second file's stream...")
|
||||
|
||||
@@ -108,7 +108,7 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
|
||||
NSLog("Test 1: opening zip file for reading...")
|
||||
|
||||
let unzipFile = try OZZipFile(fileName:filePath, mode:OZZipFileMode.Unzip)
|
||||
let unzipFile = try OZZipFile(fileName:filePath, mode:OZZipFileMode.unzip)
|
||||
|
||||
XCTAssertNotNil(unzipFile)
|
||||
|
||||
@@ -120,13 +120,13 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
|
||||
let info1 = infos[0] as! OZFileInZipInfo
|
||||
|
||||
XCTAssertEqualWithAccuracy(NSDate().timeIntervalSinceReferenceDate, info1.date.timeIntervalSinceReferenceDate + 86400, accuracy:5.0)
|
||||
XCTAssertEqualWithAccuracy(Date().timeIntervalSinceReferenceDate, info1.date.timeIntervalSinceReferenceDate + 86400, accuracy:5.0)
|
||||
|
||||
NSLog("Test 1: - \(info1.name) \(info1.date) \(info1.size) (\(info1.level))")
|
||||
|
||||
let info2 = infos[1] as! OZFileInZipInfo
|
||||
|
||||
XCTAssertEqualWithAccuracy(NSDate().timeIntervalSinceReferenceDate, info2.date.timeIntervalSinceReferenceDate, accuracy:5.0)
|
||||
XCTAssertEqualWithAccuracy(Date().timeIntervalSinceReferenceDate, info2.date.timeIntervalSinceReferenceDate, accuracy:5.0)
|
||||
|
||||
NSLog("Test 1: - \(info2.name) \(info2.date) \(info2.size) (\(info2.level))")
|
||||
|
||||
@@ -140,16 +140,11 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
NSLog("Test 1: reading from first file's stream...")
|
||||
|
||||
let data1 = NSMutableData(length:256)!
|
||||
|
||||
var error : NSError?
|
||||
let bytesRead1 = read1.readDataWithBuffer(data1, error:&error)
|
||||
if error != nil {
|
||||
throw error!
|
||||
}
|
||||
let bytesRead1 = try read1.readData(withBuffer: data1)
|
||||
|
||||
XCTAssertEqual(3, bytesRead1)
|
||||
|
||||
let fileText1 = NSString(bytes:data1.bytes, length:Int(bytesRead1), encoding:NSUTF8StringEncoding)
|
||||
let fileText1 = NSString(bytes:data1.bytes, length:Int(bytesRead1), encoding:String.Encoding.utf8.rawValue)
|
||||
|
||||
XCTAssertEqual("abc", fileText1)
|
||||
|
||||
@@ -159,7 +154,7 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
|
||||
NSLog("Test 1: opening second file...")
|
||||
|
||||
try unzipFile.locateFileInZip(file2name)
|
||||
try unzipFile.locateFile(inZip: file2name)
|
||||
let read2 = try unzipFile.readCurrentFileInZip()
|
||||
|
||||
XCTAssertNotNil(read2)
|
||||
@@ -167,15 +162,11 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
NSLog("Test 1: reading from second file's stream...")
|
||||
|
||||
let data2 = NSMutableData(length:256)!
|
||||
|
||||
let bytesRead2 = read2.readDataWithBuffer(data2, error:&error)
|
||||
if error != nil {
|
||||
throw error!
|
||||
}
|
||||
let bytesRead2 = try read2.readData(withBuffer: data2)
|
||||
|
||||
XCTAssertEqual(3, bytesRead2)
|
||||
|
||||
let fileText2 = NSString(bytes:data2.bytes, length:Int(bytesRead2), encoding:NSUTF8StringEncoding)
|
||||
let fileText2 = NSString(bytes:data2.bytes, length:Int(bytesRead2), encoding:String.Encoding.utf8.rawValue)
|
||||
|
||||
XCTAssertEqual("XYZ", fileText2)
|
||||
|
||||
@@ -190,9 +181,9 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
NSLog("Test 1: test terminated succesfully")
|
||||
|
||||
} catch let error as NSError {
|
||||
NSLog("Test 1: error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey])")
|
||||
NSLog("Test 1: error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey]!)")
|
||||
|
||||
XCTFail("Error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey])")
|
||||
XCTFail("Error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey]!)")
|
||||
|
||||
} catch let error {
|
||||
NSLog("Test 1: generic error caught: \(error)")
|
||||
@@ -201,11 +192,11 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
}
|
||||
}
|
||||
|
||||
func test02ZipAndUnzip5GB() {
|
||||
/*
|
||||
* Uncomment to execute this test, but be careful: takes 5 minutes and consumes 5 GB of disk space
|
||||
*
|
||||
func test02_ZipAndUnzip5GB() {
|
||||
|
||||
// TODO Remove to enable this test, but be careful: takes 5 minutes and consumes 5 GB of disk space
|
||||
return
|
||||
|
||||
let documentsUrl = NSURL(fileURLWithPath:NSHomeDirectory(), isDirectory:true).URLByAppendingPathComponent("Documents")
|
||||
let fileUrl = documentsUrl.URLByAppendingPathComponent("huge_test.zip")
|
||||
let filePath = fileUrl.path!
|
||||
@@ -286,13 +277,9 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
NSLog("Test 2: reading from file's stream...")
|
||||
|
||||
for (var i = 0; i < HUGE_TEST_NUMBER_OF_BLOCKS; i++) {
|
||||
var error : NSError?
|
||||
let bytesRead = read.readDataWithBuffer(buffer, error:&error)
|
||||
if error != nil {
|
||||
throw error!
|
||||
}
|
||||
let bytesRead = try read.readDataWithBuffer(buffer)
|
||||
|
||||
XCTAssertEqual(UInt(data.length), bytesRead)
|
||||
XCTAssertEqual(data.length, bytesRead)
|
||||
|
||||
let range = buffer.rangeOfData(checkData, options:NSDataSearchOptions(), range:NSMakeRange(0, buffer.length))
|
||||
|
||||
@@ -319,29 +306,30 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
XCTFail("Error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey])")
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
func test03UnzipMacZipFile() -> () {
|
||||
let documentsUrl = NSURL(fileURLWithPath:NSHomeDirectory(), isDirectory:true).URLByAppendingPathComponent("Documents")
|
||||
let fileUrl = documentsUrl.URLByAppendingPathComponent("mac_test_file.zip")
|
||||
let filePath = fileUrl.path!
|
||||
func test03_UnzipMacZipFile() -> () {
|
||||
let documentsUrl = URL(fileURLWithPath:NSHomeDirectory(), isDirectory:true).appendingPathComponent("Documents")
|
||||
let fileUrl = documentsUrl.appendingPathComponent("mac_test_file.zip")
|
||||
let filePath = fileUrl.path
|
||||
|
||||
do {
|
||||
try NSFileManager.defaultManager().removeItemAtPath(filePath)
|
||||
try FileManager.default.removeItem(atPath: filePath)
|
||||
} catch {}
|
||||
|
||||
let macZipData = NSData(base64EncodedString:MAC_TEST_ZIP, options:NSDataBase64DecodingOptions())!
|
||||
macZipData.writeToFile(filePath, atomically:false)
|
||||
let macZipData = Data(base64Encoded:MAC_TEST_ZIP, options:NSData.Base64DecodingOptions())!
|
||||
try? macZipData.write(to: URL(fileURLWithPath: filePath), options: [])
|
||||
|
||||
defer {
|
||||
do {
|
||||
try NSFileManager.defaultManager().removeItemAtPath(filePath)
|
||||
try FileManager.default.removeItem(atPath: filePath)
|
||||
} catch {}
|
||||
}
|
||||
|
||||
do {
|
||||
NSLog("Test 3: opening zip file for reading...")
|
||||
|
||||
let unzipFile = try OZZipFile(fileName:filePath, mode:OZZipFileMode.Unzip)
|
||||
let unzipFile = try OZZipFile(fileName:filePath, mode:OZZipFileMode.unzip)
|
||||
|
||||
XCTAssertNotNil(unzipFile)
|
||||
|
||||
@@ -355,14 +343,9 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
NSLog("Test 3: reading from file's stream...")
|
||||
|
||||
let buffer = NSMutableData(length:1024)!
|
||||
let bytesRead = try read.readData(withBuffer: buffer)
|
||||
|
||||
var error : NSError?
|
||||
let bytesRead = read.readDataWithBuffer(buffer, error:&error)
|
||||
if error != nil {
|
||||
throw error!
|
||||
}
|
||||
|
||||
let fileText = NSString(bytes:buffer.bytes, length:Int(bytesRead), encoding:NSUTF8StringEncoding)
|
||||
let fileText = NSString(bytes:buffer.bytes, length:Int(bytesRead), encoding:String.Encoding.utf8.rawValue)
|
||||
|
||||
XCTAssertEqual("Objective-Zip Mac test file\n", fileText)
|
||||
|
||||
@@ -377,34 +360,34 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
NSLog("Test 3: test terminated succesfully")
|
||||
|
||||
} catch let error as NSError {
|
||||
NSLog("Test 3: error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey])")
|
||||
NSLog("Test 3: error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey]!)")
|
||||
|
||||
XCTFail("Error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey])")
|
||||
XCTFail("Error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey]!)")
|
||||
}
|
||||
}
|
||||
|
||||
func test04UnzipWinZipFile() {
|
||||
let documentsUrl = NSURL(fileURLWithPath:NSHomeDirectory(), isDirectory:true).URLByAppendingPathComponent("Documents")
|
||||
let fileUrl = documentsUrl.URLByAppendingPathComponent("win_test_file.zip")
|
||||
let filePath = fileUrl.path!
|
||||
func test04_UnzipWinZipFile() {
|
||||
let documentsUrl = URL(fileURLWithPath:NSHomeDirectory(), isDirectory:true).appendingPathComponent("Documents")
|
||||
let fileUrl = documentsUrl.appendingPathComponent("win_test_file.zip")
|
||||
let filePath = fileUrl.path
|
||||
|
||||
do {
|
||||
try NSFileManager.defaultManager().removeItemAtPath(filePath)
|
||||
try FileManager.default.removeItem(atPath: filePath)
|
||||
} catch {}
|
||||
|
||||
let winZipData = NSData(base64EncodedString:WIN_TEST_ZIP, options:NSDataBase64DecodingOptions())!
|
||||
winZipData.writeToFile(filePath, atomically:false)
|
||||
let winZipData = Data(base64Encoded:WIN_TEST_ZIP, options:NSData.Base64DecodingOptions())!
|
||||
try? winZipData.write(to: URL(fileURLWithPath: filePath), options: [])
|
||||
|
||||
defer {
|
||||
do {
|
||||
try NSFileManager.defaultManager().removeItemAtPath(filePath)
|
||||
try FileManager.default.removeItem(atPath: filePath)
|
||||
} catch {}
|
||||
}
|
||||
|
||||
do {
|
||||
NSLog("Test 4: opening zip file for reading...")
|
||||
|
||||
let unzipFile = try OZZipFile(fileName:filePath, mode:OZZipFileMode.Unzip)
|
||||
let unzipFile = try OZZipFile(fileName:filePath, mode:OZZipFileMode.unzip)
|
||||
|
||||
XCTAssertNotNil(unzipFile)
|
||||
|
||||
@@ -418,14 +401,9 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
NSLog("Test 4: reading from file's stream...")
|
||||
|
||||
let buffer = NSMutableData(length:1024)!
|
||||
let bytesRead = try read.readData(withBuffer: buffer)
|
||||
|
||||
var error : NSError?
|
||||
let bytesRead = read.readDataWithBuffer(buffer, error:&error)
|
||||
if error != nil {
|
||||
throw error!
|
||||
}
|
||||
|
||||
let fileText = NSString(bytes:buffer.bytes, length:Int(bytesRead), encoding:NSUTF8StringEncoding)
|
||||
let fileText = NSString(bytes:buffer.bytes, length:Int(bytesRead), encoding:String.Encoding.utf8.rawValue)
|
||||
|
||||
XCTAssertEqual("Objective-Zip Windows test file\r\n", fileText)
|
||||
|
||||
@@ -440,26 +418,26 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
NSLog("Test 4: test terminated succesfully")
|
||||
|
||||
} catch let error as NSError {
|
||||
NSLog("Test 4: error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey])")
|
||||
NSLog("Test 4: error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey]!)")
|
||||
|
||||
XCTFail("Error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey])")
|
||||
XCTFail("Error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey]!)")
|
||||
}
|
||||
}
|
||||
|
||||
func test05ErrorWrapping() {
|
||||
let fileUrl = NSURL(fileURLWithPath:"/root.zip", isDirectory:false)
|
||||
let filePath = fileUrl.path!
|
||||
func test05_ErrorWrapping() {
|
||||
let fileUrl = URL(fileURLWithPath:"/root.zip", isDirectory:false)
|
||||
let filePath = fileUrl.path
|
||||
|
||||
defer {
|
||||
do {
|
||||
try NSFileManager.defaultManager().removeItemAtPath(filePath)
|
||||
try FileManager.default.removeItem(atPath: filePath)
|
||||
} catch {}
|
||||
}
|
||||
|
||||
do {
|
||||
NSLog("Test 5: opening impossible zip file for writing...")
|
||||
|
||||
let zipFile = try OZZipFile(fileName:filePath, mode:OZZipFileMode.Create)
|
||||
let zipFile = try OZZipFile(fileName:filePath, mode:OZZipFileMode.create)
|
||||
|
||||
try zipFile.close()
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// ObjectiveZip_Tests.m
|
||||
// Objective-Zip
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 29/08/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
@@ -36,6 +36,7 @@
|
||||
#import "Objective-Zip.h"
|
||||
#import "Objective-Zip+NSError.h"
|
||||
|
||||
|
||||
#define HUGE_TEST_BLOCK_LENGTH (50000LL)
|
||||
#define HUGE_TEST_NUMBER_OF_BLOCKS (100000LL)
|
||||
|
||||
@@ -71,7 +72,37 @@
|
||||
#pragma mark -
|
||||
#pragma mark Tests
|
||||
|
||||
- (void) test01ZipAndUnzip {
|
||||
- (void) test00_DOSDate {
|
||||
|
||||
// NSDate to DOS date
|
||||
NSDateComponents *components= [[NSDateComponents alloc] init];
|
||||
[components setDay:25];
|
||||
[components setMonth:1];
|
||||
[components setYear:2016];
|
||||
[components setHour:17];
|
||||
[components setMinute:33];
|
||||
[components setSecond:4];
|
||||
|
||||
NSCalendar *calendar= [NSCalendar currentCalendar];
|
||||
NSDate *date= [calendar dateFromComponents:components];
|
||||
|
||||
uint32_t dosDate= [date dosDate];
|
||||
|
||||
XCTAssertEqual(1211730978, dosDate);
|
||||
|
||||
// DOS date to NSDate
|
||||
NSDate *date2= [NSDate fromDosDate:dosDate];
|
||||
NSDateComponents *components2= [calendar components:(NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear) fromDate:date2];
|
||||
|
||||
XCTAssertEqual(25, [components2 day]);
|
||||
XCTAssertEqual(1, [components2 month]);
|
||||
XCTAssertEqual(2016, [components2 year]);
|
||||
XCTAssertEqual(17, [components2 hour]);
|
||||
XCTAssertEqual(33, [components2 minute]);
|
||||
XCTAssertEqual(4, [components2 second]);
|
||||
}
|
||||
|
||||
- (void) test01_ZipAndUnzip {
|
||||
NSString *documentsDir= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
|
||||
NSString *filePath= [documentsDir stringByAppendingPathComponent:@"test.zip"];
|
||||
|
||||
@@ -208,11 +239,11 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (void) test02ZipAndUnzip5GB {
|
||||
|
||||
// TODO Remove to enable this test, but be careful: takes 5 minutes and consumes 5 GB of disk space
|
||||
return;
|
||||
|
||||
/*
|
||||
* Uncomment to execute this test, but be careful: takes 5 minutes and consumes 5 GB of disk space
|
||||
*
|
||||
- (void) test02_ZipAndUnzip5GB {
|
||||
|
||||
NSString *documentsDir= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
|
||||
NSString *filePath= [documentsDir stringByAppendingPathComponent:@"huge_test.zip"];
|
||||
|
||||
@@ -319,8 +350,9 @@
|
||||
[[NSFileManager defaultManager] removeItemAtPath:filePath error:NULL];
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
- (void) test03UnzipMacZipFile {
|
||||
- (void) test03_UnzipMacZipFile {
|
||||
NSString *documentsDir= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
|
||||
NSString *filePath= [documentsDir stringByAppendingPathComponent:@"mac_test_file.zip"];
|
||||
|
||||
@@ -376,7 +408,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (void) test04UnzipWinZipFile {
|
||||
- (void) test04_UnzipWinZipFile {
|
||||
NSString *documentsDir= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
|
||||
NSString *filePath= [documentsDir stringByAppendingPathComponent:@"win_test_file.zip"];
|
||||
|
||||
@@ -432,7 +464,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (void) test05ErrorWrapping {
|
||||
- (void) test05_ErrorWrapping {
|
||||
NSString *filePath= @"/root.zip";
|
||||
|
||||
@try {
|
||||
@@ -483,5 +515,583 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (void) test06_Zip32AndUnzip64 {
|
||||
NSString *documentsDir= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
|
||||
NSString *filePath= [documentsDir stringByAppendingPathComponent:@"test32_64.zip"];
|
||||
|
||||
@try {
|
||||
[[NSFileManager defaultManager] removeItemAtPath:filePath error:NULL];
|
||||
|
||||
NSLog(@"Test 6: opening zip file for writing in 32 bit mode...");
|
||||
|
||||
OZZipFile *zipFile32= [[OZZipFile alloc] initWithFileName:filePath mode:OZZipFileModeCreate legacy32BitMode:YES];
|
||||
|
||||
XCTAssertNotNil(zipFile32);
|
||||
|
||||
NSLog(@"Test 6: adding file...");
|
||||
|
||||
OZZipWriteStream *stream= [zipFile32 writeFileInZipWithName:@"abc.txt" fileDate:[NSDate dateWithTimeIntervalSinceNow:-86400.0] compressionLevel:OZZipCompressionLevelDefault];
|
||||
|
||||
XCTAssertNotNil(stream);
|
||||
|
||||
NSLog(@"Test 6: writing to file's stream...");
|
||||
|
||||
NSMutableData *writeData= [NSMutableData dataWithLength:4096];
|
||||
int result= SecRandomCopyBytes(kSecRandomDefault, [writeData length], [writeData mutableBytes]);
|
||||
|
||||
XCTAssertEqual(0, result);
|
||||
|
||||
[stream writeData:writeData];
|
||||
|
||||
NSLog(@"Test 6: closing file's stream...");
|
||||
|
||||
[stream finishedWriting];
|
||||
|
||||
NSLog(@"Test 6: closing zip file...");
|
||||
|
||||
[zipFile32 close];
|
||||
|
||||
NSLog(@"Test 6: opening zip file for reading in 64 bit mode...");
|
||||
|
||||
OZZipFile *unzipFile64= [[OZZipFile alloc] initWithFileName:filePath mode:OZZipFileModeUnzip legacy32BitMode:NO];
|
||||
|
||||
XCTAssertNotNil(unzipFile64);
|
||||
|
||||
NSLog(@"Test 6: reading file infos...");
|
||||
|
||||
NSArray *infos= [unzipFile64 listFileInZipInfos];
|
||||
|
||||
XCTAssertEqual(1, infos.count);
|
||||
|
||||
OZFileInZipInfo *info1= [infos objectAtIndex:0];
|
||||
|
||||
XCTAssertEqualWithAccuracy([[NSDate date] timeIntervalSinceReferenceDate], [info1.date timeIntervalSinceReferenceDate] + 86400, 5.0);
|
||||
|
||||
NSLog(@"Test 6: - %@ %@ %lu (%ld)", info1.name, info1.date, (unsigned long) info1.size, (long) info1.level);
|
||||
|
||||
NSLog(@"Test 6: opening file...");
|
||||
|
||||
[unzipFile64 goToFirstFileInZip];
|
||||
OZZipReadStream *read= [unzipFile64 readCurrentFileInZip];
|
||||
|
||||
XCTAssertNotNil(read);
|
||||
|
||||
NSLog(@"Test 6: reading from file's stream...");
|
||||
|
||||
NSMutableData *readData= [[NSMutableData alloc] initWithLength:10240];
|
||||
NSUInteger bytesRead= [read readDataWithBuffer:readData];
|
||||
[readData setLength:bytesRead];
|
||||
|
||||
XCTAssertEqual(4096, bytesRead);
|
||||
XCTAssertEqualObjects(writeData, readData);
|
||||
|
||||
NSLog(@"Test 6: closing file's stream...");
|
||||
|
||||
[read finishedReading];
|
||||
|
||||
NSLog(@"Test 6: closing zip file...");
|
||||
|
||||
[unzipFile64 close];
|
||||
|
||||
NSLog(@"Test 6: test terminated succesfully");
|
||||
|
||||
} @catch (OZZipException *ze) {
|
||||
NSLog(@"Test 6: zip exception caught: %ld - %@", (long) ze.error, [ze reason]);
|
||||
|
||||
XCTFail(@"Zip exception caught: %ld - %@", (long) ze.error, [ze reason]);
|
||||
|
||||
} @catch (NSException *e) {
|
||||
NSLog(@"Test 6: generic exception caught: %@ - %@", [[e class] description], [e description]);
|
||||
|
||||
XCTFail(@"Generic exception caught: %@ - %@", [[e class] description], [e description]);
|
||||
|
||||
} @finally {
|
||||
[[NSFileManager defaultManager] removeItemAtPath:filePath error:NULL];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) test07_Zip64AndUnzip32 {
|
||||
NSString *documentsDir= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
|
||||
NSString *filePath= [documentsDir stringByAppendingPathComponent:@"test64_32.zip"];
|
||||
|
||||
@try {
|
||||
[[NSFileManager defaultManager] removeItemAtPath:filePath error:NULL];
|
||||
|
||||
NSLog(@"Test 7: opening zip file for writing in 64 bit mode...");
|
||||
|
||||
OZZipFile *zipFile64= [[OZZipFile alloc] initWithFileName:filePath mode:OZZipFileModeCreate legacy32BitMode:NO];
|
||||
|
||||
XCTAssertNotNil(zipFile64);
|
||||
|
||||
NSLog(@"Test 7: adding file...");
|
||||
|
||||
OZZipWriteStream *stream= [zipFile64 writeFileInZipWithName:@"abc.txt" fileDate:[NSDate dateWithTimeIntervalSinceNow:-86400.0] compressionLevel:OZZipCompressionLevelDefault];
|
||||
|
||||
XCTAssertNotNil(stream);
|
||||
|
||||
NSLog(@"Test 7: writing to file's stream...");
|
||||
|
||||
NSMutableData *writeData= [NSMutableData dataWithLength:4096];
|
||||
int result= SecRandomCopyBytes(kSecRandomDefault, [writeData length], [writeData mutableBytes]);
|
||||
|
||||
XCTAssertEqual(0, result);
|
||||
|
||||
[stream writeData:writeData];
|
||||
|
||||
NSLog(@"Test 7: closing file's stream...");
|
||||
|
||||
[stream finishedWriting];
|
||||
|
||||
NSLog(@"Test 7: closing zip file...");
|
||||
|
||||
[zipFile64 close];
|
||||
|
||||
NSLog(@"Test 7: opening zip file for reading in 32 bit mode...");
|
||||
|
||||
OZZipFile *unzipFile32= [[OZZipFile alloc] initWithFileName:filePath mode:OZZipFileModeUnzip legacy32BitMode:YES];
|
||||
|
||||
XCTAssertNotNil(unzipFile32);
|
||||
|
||||
NSLog(@"Test 7: reading file infos...");
|
||||
|
||||
NSArray *infos= [unzipFile32 listFileInZipInfos];
|
||||
|
||||
XCTAssertEqual(1, infos.count);
|
||||
|
||||
OZFileInZipInfo *info1= [infos objectAtIndex:0];
|
||||
|
||||
XCTAssertEqualWithAccuracy([[NSDate date] timeIntervalSinceReferenceDate], [info1.date timeIntervalSinceReferenceDate] + 86400, 5.0);
|
||||
|
||||
NSLog(@"Test 7: - %@ %@ %lu (%ld)", info1.name, info1.date, (unsigned long) info1.size, (long) info1.level);
|
||||
|
||||
NSLog(@"Test 7: opening file...");
|
||||
|
||||
[unzipFile32 goToFirstFileInZip];
|
||||
OZZipReadStream *read= [unzipFile32 readCurrentFileInZip];
|
||||
|
||||
XCTAssertNotNil(read);
|
||||
|
||||
NSLog(@"Test 7: reading from file's stream...");
|
||||
|
||||
NSMutableData *readData= [[NSMutableData alloc] initWithLength:10240];
|
||||
NSUInteger bytesRead= [read readDataWithBuffer:readData];
|
||||
[readData setLength:bytesRead];
|
||||
|
||||
XCTAssertEqual(4096, bytesRead);
|
||||
XCTAssertEqualObjects(writeData, readData);
|
||||
|
||||
NSLog(@"Test 7: closing file's stream...");
|
||||
|
||||
[read finishedReading];
|
||||
|
||||
NSLog(@"Test 7: closing zip file...");
|
||||
|
||||
[unzipFile32 close];
|
||||
|
||||
NSLog(@"Test 7: test terminated succesfully");
|
||||
|
||||
} @catch (OZZipException *ze) {
|
||||
NSLog(@"Test 7: zip exception caught: %ld - %@", (long) ze.error, [ze reason]);
|
||||
|
||||
XCTFail(@"Zip exception caught: %ld - %@", (long) ze.error, [ze reason]);
|
||||
|
||||
} @catch (NSException *e) {
|
||||
NSLog(@"Test 7: generic exception caught: %@ - %@", [[e class] description], [e description]);
|
||||
|
||||
XCTFail(@"Generic exception caught: %@ - %@", [[e class] description], [e description]);
|
||||
|
||||
} @finally {
|
||||
[[NSFileManager defaultManager] removeItemAtPath:filePath error:NULL];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) test08_ZipAndUnzip32WithPassword {
|
||||
NSString *documentsDir= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
|
||||
NSString *filePath= [documentsDir stringByAppendingPathComponent:@"test32_password.zip"];
|
||||
|
||||
@try {
|
||||
[[NSFileManager defaultManager] removeItemAtPath:filePath error:NULL];
|
||||
|
||||
NSLog(@"Test 8: opening zip file for writing in 32 bit mode...");
|
||||
|
||||
OZZipFile *zipFile32= [[OZZipFile alloc] initWithFileName:filePath mode:OZZipFileModeCreate legacy32BitMode:YES];
|
||||
|
||||
XCTAssertNotNil(zipFile32);
|
||||
|
||||
NSLog(@"Test 8: adding file...");
|
||||
|
||||
NSMutableData *writeData= [NSMutableData dataWithLength:4096];
|
||||
int result= SecRandomCopyBytes(kSecRandomDefault, [writeData length], [writeData mutableBytes]);
|
||||
|
||||
XCTAssertEqual(0, result);
|
||||
|
||||
uint32_t crc= [writeData crc32];
|
||||
|
||||
OZZipWriteStream *stream= [zipFile32 writeFileInZipWithName:@"abc.txt" fileDate:[NSDate dateWithTimeIntervalSinceNow:-86400.0] compressionLevel:OZZipCompressionLevelDefault password:@"password" crc32:crc];
|
||||
|
||||
XCTAssertNotNil(stream);
|
||||
|
||||
NSLog(@"Test 8: writing to file's stream with password...");
|
||||
|
||||
[stream writeData:writeData];
|
||||
|
||||
NSLog(@"Test 8: closing file's stream...");
|
||||
|
||||
[stream finishedWriting];
|
||||
|
||||
NSLog(@"Test 8: closing zip file...");
|
||||
|
||||
[zipFile32 close];
|
||||
|
||||
NSLog(@"Test 8: opening zip file for reading in 32 bit mode...");
|
||||
|
||||
OZZipFile *unzipFile32= [[OZZipFile alloc] initWithFileName:filePath mode:OZZipFileModeUnzip legacy32BitMode:YES];
|
||||
|
||||
XCTAssertNotNil(unzipFile32);
|
||||
|
||||
NSLog(@"Test 8: reading file infos...");
|
||||
|
||||
NSArray *infos= [unzipFile32 listFileInZipInfos];
|
||||
|
||||
XCTAssertEqual(1, infos.count);
|
||||
|
||||
OZFileInZipInfo *info1= [infos objectAtIndex:0];
|
||||
|
||||
XCTAssertEqualWithAccuracy([[NSDate date] timeIntervalSinceReferenceDate], [info1.date timeIntervalSinceReferenceDate] + 86400, 5.0);
|
||||
|
||||
NSLog(@"Test 8: - %@ %@ %lu (%ld)", info1.name, info1.date, (unsigned long) info1.size, (long) info1.level);
|
||||
|
||||
NSLog(@"Test 8: opening file...");
|
||||
|
||||
[unzipFile32 goToFirstFileInZip];
|
||||
OZZipReadStream *read= [unzipFile32 readCurrentFileInZipWithPassword:@"password"];
|
||||
|
||||
XCTAssertNotNil(read);
|
||||
|
||||
NSLog(@"Test 8: reading from file's stream with password...");
|
||||
|
||||
NSMutableData *readData= [[NSMutableData alloc] initWithLength:10240];
|
||||
NSUInteger bytesRead= [read readDataWithBuffer:readData];
|
||||
[readData setLength:bytesRead];
|
||||
|
||||
XCTAssertEqual(4096, bytesRead);
|
||||
XCTAssertEqualObjects(writeData, readData);
|
||||
|
||||
NSLog(@"Test 8: closing file's stream...");
|
||||
|
||||
[read finishedReading];
|
||||
|
||||
NSLog(@"Test 8: closing zip file...");
|
||||
|
||||
[unzipFile32 close];
|
||||
|
||||
NSLog(@"Test 8: test terminated succesfully");
|
||||
|
||||
} @catch (OZZipException *ze) {
|
||||
NSLog(@"Test 8: zip exception caught: %ld - %@", (long) ze.error, [ze reason]);
|
||||
|
||||
XCTFail(@"Zip exception caught: %ld - %@", (long) ze.error, [ze reason]);
|
||||
|
||||
} @catch (NSException *e) {
|
||||
NSLog(@"Test 8: generic exception caught: %@ - %@", [[e class] description], [e description]);
|
||||
|
||||
XCTFail(@"Generic exception caught: %@ - %@", [[e class] description], [e description]);
|
||||
|
||||
} @finally {
|
||||
[[NSFileManager defaultManager] removeItemAtPath:filePath error:NULL];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) test09_ZipAndUnzip64WithPassword {
|
||||
NSString *documentsDir= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
|
||||
NSString *filePath= [documentsDir stringByAppendingPathComponent:@"test64_password.zip"];
|
||||
|
||||
@try {
|
||||
[[NSFileManager defaultManager] removeItemAtPath:filePath error:NULL];
|
||||
|
||||
NSLog(@"Test 9: opening zip file for writing in 64 bit mode...");
|
||||
|
||||
OZZipFile *zipFile64= [[OZZipFile alloc] initWithFileName:filePath mode:OZZipFileModeCreate legacy32BitMode:NO];
|
||||
|
||||
XCTAssertNotNil(zipFile64);
|
||||
|
||||
NSLog(@"Test 9: adding file...");
|
||||
|
||||
NSMutableData *writeData= [NSMutableData dataWithLength:4096];
|
||||
int result= SecRandomCopyBytes(kSecRandomDefault, [writeData length], [writeData mutableBytes]);
|
||||
|
||||
XCTAssertEqual(0, result);
|
||||
|
||||
uint32_t crc= [writeData crc32];
|
||||
|
||||
OZZipWriteStream *stream= [zipFile64 writeFileInZipWithName:@"abc.txt" fileDate:[NSDate dateWithTimeIntervalSinceNow:-86400.0] compressionLevel:OZZipCompressionLevelDefault password:@"password" crc32:crc];
|
||||
|
||||
XCTAssertNotNil(stream);
|
||||
|
||||
NSLog(@"Test 9: writing to file's stream with password...");
|
||||
|
||||
[stream writeData:writeData];
|
||||
|
||||
NSLog(@"Test 9: closing file's stream...");
|
||||
|
||||
[stream finishedWriting];
|
||||
|
||||
NSLog(@"Test 9: closing zip file...");
|
||||
|
||||
[zipFile64 close];
|
||||
|
||||
NSLog(@"Test 9: opening zip file for reading in 64 bit mode...");
|
||||
|
||||
OZZipFile *unzipFile64= [[OZZipFile alloc] initWithFileName:filePath mode:OZZipFileModeUnzip legacy32BitMode:NO];
|
||||
|
||||
XCTAssertNotNil(unzipFile64);
|
||||
|
||||
NSLog(@"Test 9: reading file infos...");
|
||||
|
||||
NSArray *infos= [unzipFile64 listFileInZipInfos];
|
||||
|
||||
XCTAssertEqual(1, infos.count);
|
||||
|
||||
OZFileInZipInfo *info1= [infos objectAtIndex:0];
|
||||
|
||||
XCTAssertEqualWithAccuracy([[NSDate date] timeIntervalSinceReferenceDate], [info1.date timeIntervalSinceReferenceDate] + 86400, 5.0);
|
||||
|
||||
NSLog(@"Test 9: - %@ %@ %lu (%ld)", info1.name, info1.date, (unsigned long) info1.size, (long) info1.level);
|
||||
|
||||
NSLog(@"Test 9: opening file...");
|
||||
|
||||
[unzipFile64 goToFirstFileInZip];
|
||||
OZZipReadStream *read= [unzipFile64 readCurrentFileInZipWithPassword:@"password"];
|
||||
|
||||
XCTAssertNotNil(read);
|
||||
|
||||
NSLog(@"Test 9: reading from file's stream with password...");
|
||||
|
||||
NSMutableData *readData= [[NSMutableData alloc] initWithLength:10240];
|
||||
NSUInteger bytesRead= [read readDataWithBuffer:readData];
|
||||
[readData setLength:bytesRead];
|
||||
|
||||
XCTAssertEqual(4096, bytesRead);
|
||||
XCTAssertEqualObjects(writeData, readData);
|
||||
|
||||
NSLog(@"Test 9: closing file's stream...");
|
||||
|
||||
[read finishedReading];
|
||||
|
||||
NSLog(@"Test 9: closing zip file...");
|
||||
|
||||
[unzipFile64 close];
|
||||
|
||||
NSLog(@"Test 9: test terminated succesfully");
|
||||
|
||||
} @catch (OZZipException *ze) {
|
||||
NSLog(@"Test 9: zip exception caught: %ld - %@", (long) ze.error, [ze reason]);
|
||||
|
||||
XCTFail(@"Zip exception caught: %ld - %@", (long) ze.error, [ze reason]);
|
||||
|
||||
} @catch (NSException *e) {
|
||||
NSLog(@"Test 9: generic exception caught: %@ - %@", [[e class] description], [e description]);
|
||||
|
||||
XCTFail(@"Generic exception caught: %@ - %@", [[e class] description], [e description]);
|
||||
|
||||
} @finally {
|
||||
[[NSFileManager defaultManager] removeItemAtPath:filePath error:NULL];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) test10_Zip32AndUnzip64WithPassword {
|
||||
NSString *documentsDir= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
|
||||
NSString *filePath= [documentsDir stringByAppendingPathComponent:@"test32_64_password.zip"];
|
||||
|
||||
@try {
|
||||
[[NSFileManager defaultManager] removeItemAtPath:filePath error:NULL];
|
||||
|
||||
NSLog(@"Test 10: opening zip file for writing in 32 bit mode...");
|
||||
|
||||
OZZipFile *zipFile32= [[OZZipFile alloc] initWithFileName:filePath mode:OZZipFileModeCreate legacy32BitMode:YES];
|
||||
|
||||
XCTAssertNotNil(zipFile32);
|
||||
|
||||
NSLog(@"Test 10: adding file...");
|
||||
|
||||
NSMutableData *writeData= [NSMutableData dataWithLength:4096];
|
||||
int result= SecRandomCopyBytes(kSecRandomDefault, [writeData length], [writeData mutableBytes]);
|
||||
|
||||
XCTAssertEqual(0, result);
|
||||
|
||||
uint32_t crc= [writeData crc32];
|
||||
|
||||
OZZipWriteStream *stream= [zipFile32 writeFileInZipWithName:@"abc.txt" fileDate:[NSDate dateWithTimeIntervalSinceNow:-86400.0] compressionLevel:OZZipCompressionLevelDefault password:@"password" crc32:crc];
|
||||
|
||||
XCTAssertNotNil(stream);
|
||||
|
||||
NSLog(@"Test 10: writing to file's stream with password...");
|
||||
|
||||
[stream writeData:writeData];
|
||||
|
||||
NSLog(@"Test 10: closing file's stream...");
|
||||
|
||||
[stream finishedWriting];
|
||||
|
||||
NSLog(@"Test 10: closing zip file...");
|
||||
|
||||
[zipFile32 close];
|
||||
|
||||
NSLog(@"Test 10: opening zip file for reading in 64 bit mode...");
|
||||
|
||||
OZZipFile *unzipFile64= [[OZZipFile alloc] initWithFileName:filePath mode:OZZipFileModeUnzip legacy32BitMode:NO];
|
||||
|
||||
XCTAssertNotNil(unzipFile64);
|
||||
|
||||
NSLog(@"Test 10: reading file infos...");
|
||||
|
||||
NSArray *infos= [unzipFile64 listFileInZipInfos];
|
||||
|
||||
XCTAssertEqual(1, infos.count);
|
||||
|
||||
OZFileInZipInfo *info1= [infos objectAtIndex:0];
|
||||
|
||||
XCTAssertEqualWithAccuracy([[NSDate date] timeIntervalSinceReferenceDate], [info1.date timeIntervalSinceReferenceDate] + 86400, 5.0);
|
||||
|
||||
NSLog(@"Test 10: - %@ %@ %lu (%ld)", info1.name, info1.date, (unsigned long) info1.size, (long) info1.level);
|
||||
|
||||
NSLog(@"Test 10: opening file...");
|
||||
|
||||
[unzipFile64 goToFirstFileInZip];
|
||||
OZZipReadStream *read= [unzipFile64 readCurrentFileInZipWithPassword:@"password"];
|
||||
|
||||
XCTAssertNotNil(read);
|
||||
|
||||
NSLog(@"Test 10: reading from file's stream with password...");
|
||||
|
||||
NSMutableData *readData= [[NSMutableData alloc] initWithLength:10240];
|
||||
NSUInteger bytesRead= [read readDataWithBuffer:readData];
|
||||
[readData setLength:bytesRead];
|
||||
|
||||
XCTAssertEqual(4096, bytesRead);
|
||||
XCTAssertEqualObjects(writeData, readData);
|
||||
|
||||
NSLog(@"Test 10: closing file's stream...");
|
||||
|
||||
[read finishedReading];
|
||||
|
||||
NSLog(@"Test 10: closing zip file...");
|
||||
|
||||
[unzipFile64 close];
|
||||
|
||||
NSLog(@"Test 10: test terminated succesfully");
|
||||
|
||||
} @catch (OZZipException *ze) {
|
||||
NSLog(@"Test 10: zip exception caught: %ld - %@", (long) ze.error, [ze reason]);
|
||||
|
||||
XCTFail(@"Zip exception caught: %ld - %@", (long) ze.error, [ze reason]);
|
||||
|
||||
} @catch (NSException *e) {
|
||||
NSLog(@"Test 10: generic exception caught: %@ - %@", [[e class] description], [e description]);
|
||||
|
||||
XCTFail(@"Generic exception caught: %@ - %@", [[e class] description], [e description]);
|
||||
|
||||
} @finally {
|
||||
[[NSFileManager defaultManager] removeItemAtPath:filePath error:NULL];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) test11_Zip64AndUnzip32WithPassword {
|
||||
NSString *documentsDir= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
|
||||
NSString *filePath= [documentsDir stringByAppendingPathComponent:@"test64_32_password.zip"];
|
||||
|
||||
@try {
|
||||
[[NSFileManager defaultManager] removeItemAtPath:filePath error:NULL];
|
||||
|
||||
NSLog(@"Test 11: opening zip file for writing in 64 bit mode...");
|
||||
|
||||
OZZipFile *zipFile64= [[OZZipFile alloc] initWithFileName:filePath mode:OZZipFileModeCreate legacy32BitMode:NO];
|
||||
|
||||
XCTAssertNotNil(zipFile64);
|
||||
|
||||
NSLog(@"Test 11: adding file...");
|
||||
|
||||
NSMutableData *writeData= [NSMutableData dataWithLength:4096];
|
||||
int result= SecRandomCopyBytes(kSecRandomDefault, [writeData length], [writeData mutableBytes]);
|
||||
|
||||
XCTAssertEqual(0, result);
|
||||
|
||||
uint32_t crc= [writeData crc32];
|
||||
|
||||
OZZipWriteStream *stream= [zipFile64 writeFileInZipWithName:@"abc.txt" fileDate:[NSDate dateWithTimeIntervalSinceNow:-86400.0] compressionLevel:OZZipCompressionLevelDefault password:@"password" crc32:crc];
|
||||
|
||||
XCTAssertNotNil(stream);
|
||||
|
||||
NSLog(@"Test 11: writing to file's stream with password...");
|
||||
|
||||
[stream writeData:writeData];
|
||||
|
||||
NSLog(@"Test 11: closing file's stream...");
|
||||
|
||||
[stream finishedWriting];
|
||||
|
||||
NSLog(@"Test 11: closing zip file...");
|
||||
|
||||
[zipFile64 close];
|
||||
|
||||
NSLog(@"Test 11: opening zip file for reading in 32 bit mode...");
|
||||
|
||||
OZZipFile *unzipFile32= [[OZZipFile alloc] initWithFileName:filePath mode:OZZipFileModeUnzip legacy32BitMode:YES];
|
||||
|
||||
XCTAssertNotNil(unzipFile32);
|
||||
|
||||
NSLog(@"Test 11: reading file infos...");
|
||||
|
||||
NSArray *infos= [unzipFile32 listFileInZipInfos];
|
||||
|
||||
XCTAssertEqual(1, infos.count);
|
||||
|
||||
OZFileInZipInfo *info1= [infos objectAtIndex:0];
|
||||
|
||||
XCTAssertEqualWithAccuracy([[NSDate date] timeIntervalSinceReferenceDate], [info1.date timeIntervalSinceReferenceDate] + 86400, 5.0);
|
||||
|
||||
NSLog(@"Test 11: - %@ %@ %lu (%ld)", info1.name, info1.date, (unsigned long) info1.size, (long) info1.level);
|
||||
|
||||
NSLog(@"Test 11: opening file...");
|
||||
|
||||
[unzipFile32 goToFirstFileInZip];
|
||||
OZZipReadStream *read= [unzipFile32 readCurrentFileInZipWithPassword:@"password"];
|
||||
|
||||
XCTAssertNotNil(read);
|
||||
|
||||
NSLog(@"Test 11: reading from file's stream with password...");
|
||||
|
||||
NSMutableData *readData= [[NSMutableData alloc] initWithLength:10240];
|
||||
NSUInteger bytesRead= [read readDataWithBuffer:readData];
|
||||
[readData setLength:bytesRead];
|
||||
|
||||
XCTAssertEqual(4096, bytesRead);
|
||||
XCTAssertEqualObjects(writeData, readData);
|
||||
|
||||
NSLog(@"Test 7: closing file's stream...");
|
||||
|
||||
[read finishedReading];
|
||||
|
||||
NSLog(@"Test 7: closing zip file...");
|
||||
|
||||
[unzipFile32 close];
|
||||
|
||||
NSLog(@"Test 7: test terminated succesfully");
|
||||
|
||||
} @catch (OZZipException *ze) {
|
||||
NSLog(@"Test 7: zip exception caught: %ld - %@", (long) ze.error, [ze reason]);
|
||||
|
||||
XCTFail(@"Zip exception caught: %ld - %@", (long) ze.error, [ze reason]);
|
||||
|
||||
} @catch (NSException *e) {
|
||||
NSLog(@"Test 7: generic exception caught: %@ - %@", [[e class] description], [e description]);
|
||||
|
||||
XCTFail(@"Generic exception caught: %@ - %@", [[e class] description], [e description]);
|
||||
|
||||
} @finally {
|
||||
[[NSFileManager defaultManager] removeItemAtPath:filePath error:NULL];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
||||
File diff suppressed because one or more lines are too long
48
Objective-Zip/NSData+CRC32.h
Normal file
48
Objective-Zip/NSData+CRC32.h
Normal file
@@ -0,0 +1,48 @@
|
||||
//
|
||||
// NSData+CRC32.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 13/05/2017.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
|
||||
@interface NSData (CRC32)
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Handy CRC32 computation
|
||||
|
||||
- (uint32_t) crc32;
|
||||
- (uint32_t) crc32withInitialCrc32:(uint32_t)initialCrc32;
|
||||
|
||||
|
||||
@end
|
||||
|
||||
58
Objective-Zip/NSData+CRC32.m
Normal file
58
Objective-Zip/NSData+CRC32.m
Normal file
@@ -0,0 +1,58 @@
|
||||
//
|
||||
// NSData+CRC32.m
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 13/05/2017.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "NSData+CRC32.h"
|
||||
|
||||
|
||||
// Part of ZLib, see crc32.c
|
||||
unsigned long crc32(unsigned long crc, const unsigned char *buf, unsigned int len);
|
||||
|
||||
|
||||
@implementation NSData (CRC32)
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Handy CRC32 computation
|
||||
|
||||
- (uint32_t) crc32 {
|
||||
return [self crc32withInitialCrc32:0];
|
||||
}
|
||||
|
||||
- (uint32_t) crc32withInitialCrc32:(uint32_t)initialCrc32 {
|
||||
return (uint32_t) crc32(initialCrc32, [self bytes], (unsigned int) [self length]);
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
48
Objective-Zip/NSDate+DOSDate.h
Normal file
48
Objective-Zip/NSDate+DOSDate.h
Normal file
@@ -0,0 +1,48 @@
|
||||
//
|
||||
// NSDate+DOSDate.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 13/05/2017.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
|
||||
@interface NSDate (DOSDate)
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Conversion to/from 32 bit DOS date format
|
||||
|
||||
- (uint32_t) dosDate;
|
||||
+ (NSDate *) fromDosDate:(uint32_t)dosDate;
|
||||
|
||||
|
||||
@end
|
||||
|
||||
69
Objective-Zip/NSDate+DOSDate.m
Normal file
69
Objective-Zip/NSDate+DOSDate.m
Normal file
@@ -0,0 +1,69 @@
|
||||
//
|
||||
// NSDate+DOSDate.m
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 13/05/2017.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "NSDate+DOSDate.h"
|
||||
|
||||
|
||||
@implementation NSDate (DOSDate)
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Conversion to/from 32 bit DOS date format
|
||||
|
||||
- (uint32_t) dosDate {
|
||||
NSCalendar *calendar= [NSCalendar currentCalendar];
|
||||
NSDateComponents *date= [calendar components:(NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear) fromDate:self];
|
||||
|
||||
return (((uint32_t)[date day] + (32 * (uint32_t)[date month]) + (512 * ((uint32_t)[date year] - 1980))) << 16) |
|
||||
(((uint32_t)[date second] / 2) + (32 * (uint32_t)[date minute]) + (2048 * (uint32_t)[date hour]));
|
||||
}
|
||||
|
||||
+ (NSDate *) fromDosDate:(uint32_t)dosDate {
|
||||
uint64_t date= (uint64_t)(dosDate >> 16);
|
||||
|
||||
NSDateComponents *components= [[NSDateComponents alloc] init];
|
||||
[components setDay:date & 0x1f];
|
||||
[components setMonth:(date & 0x1E0) / 0x20];
|
||||
[components setYear:((date & 0x0FE00) / 0x0200) + 1980];
|
||||
[components setHour:(dosDate & 0xF800) / 0x800];
|
||||
[components setMinute:(dosDate & 0x7E0) / 0x20];
|
||||
[components setSecond:2 * (dosDate & 0x1f)];
|
||||
|
||||
NSCalendar *calendar= [NSCalendar currentCalendar];
|
||||
return [calendar dateFromComponents:components];
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZFileInZipInfo+Internals.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZFileInZipInfo.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZFileInZipInfo.m
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZZipCompressionLevel.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZZipException+Internals.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZZipException.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZZipException.m
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZZipFile+NSError.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
@@ -34,6 +34,17 @@
|
||||
#import "OZZipFile.h"
|
||||
|
||||
|
||||
/**
|
||||
@brief Indicates the file could not be located in the zip file.
|
||||
*/
|
||||
static const NSInteger OZLocateFileResultNotFound= -1;
|
||||
|
||||
/**
|
||||
@brief Indicates the file has been successfully located in the zip file.
|
||||
*/
|
||||
static const NSInteger OZLocateFileResultFound= 1;
|
||||
|
||||
|
||||
@interface OZZipFile (NSError)
|
||||
|
||||
|
||||
@@ -172,7 +183,7 @@
|
||||
file content, or <code>nil</code> if an error occurs.
|
||||
@throws OZZipException If the zip file has been opened in unzip mode.
|
||||
*/
|
||||
- (nullable OZZipWriteStream *) writeFileInZipWithName:(nonnull NSString *)fileNameInZip fileDate:(nonnull NSDate *)fileDate compressionLevel:(OZZipCompressionLevel)compressionLevel password:(nonnull NSString *)password crc32:(NSUInteger)crc32 error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
- (nullable OZZipWriteStream *) writeFileInZipWithName:(nonnull NSString *)fileNameInZip fileDate:(nonnull NSDate *)fileDate compressionLevel:(OZZipCompressionLevel)compressionLevel password:(nonnull NSString *)password crc32:(uint32_t)crc32 error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
|
||||
#pragma mark -
|
||||
@@ -211,13 +222,16 @@
|
||||
<code>readCurrentFileInZip</code>.</p>
|
||||
@param error If passed, may be filled with an NSError is case the file can't
|
||||
be located.
|
||||
@return <code>YES</code> if the file has been located and selected,
|
||||
<code>NO</code> if the specified file name is not present in the zip file or
|
||||
the file could not be located due to an error.
|
||||
@return <code>OZLocateFileResultFound</code> if the file has been located
|
||||
and selected, <code>OZLocateFileResultNotFound</code> if the specified
|
||||
file name is not present in the zip file, or <code>0</code> if the file could
|
||||
not be located due to an error.
|
||||
<br/>NOTE: return value convention is different in the standard (non-NSError
|
||||
compliant) interface.
|
||||
@throws OZZipException If the zip file has been opened with a mode other than
|
||||
Unzip.
|
||||
*/
|
||||
- (BOOL) locateFileInZip:(nonnull NSString *)fileNameInZip error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
- (NSInteger) __attribute__((swift_error(nonnull_error))) locateFileInZip:(nonnull NSString *)fileNameInZip error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
/**
|
||||
@brief Returns the number of files contained in the zip file.
|
||||
@@ -228,7 +242,7 @@
|
||||
@throws OZZipException If the zip file has been opened with a mode other
|
||||
than Unzip.
|
||||
*/
|
||||
- (NSUInteger) numFilesInZipWithError:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
- (NSUInteger) __attribute__((swift_error(nonnull_error))) numFilesInZipWithError:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
/**
|
||||
@brief Returns a list of OZFileInZipInfo with the information on all the files
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZZipFile+Standard.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
@@ -167,7 +167,7 @@
|
||||
@throws OZZipException If the file stream can't be created due to an error or
|
||||
if the zip file has been opened in unzip mode.
|
||||
*/
|
||||
- (nonnull OZZipWriteStream *) writeFileInZipWithName:(nonnull NSString *)fileNameInZip fileDate:(nonnull NSDate *)fileDate compressionLevel:(OZZipCompressionLevel)compressionLevel password:(nonnull NSString *)password crc32:(NSUInteger)crc32;
|
||||
- (nonnull OZZipWriteStream *) writeFileInZipWithName:(nonnull NSString *)fileNameInZip fileDate:(nonnull NSDate *)fileDate compressionLevel:(OZZipCompressionLevel)compressionLevel password:(nonnull NSString *)password crc32:(uint32_t)crc32;
|
||||
|
||||
|
||||
#pragma mark -
|
||||
@@ -199,6 +199,8 @@
|
||||
<code>readCurrentFileInZip</code>.</p>
|
||||
@return <code>YES</code> if the file has been located and selected,
|
||||
<code>NO</code> if the specified file name is not present in the zip file.
|
||||
<br/>NOTE: return value convention is different in NSError compliant
|
||||
interface.
|
||||
@throws OZZipException If the file can't be located due to an error or if the
|
||||
zip file has been opened with a mode other than Unzip.
|
||||
*/
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZZipFile.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZZipFile.m
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
@@ -46,6 +46,7 @@
|
||||
#import "OZZipWriteStream+Internals.h"
|
||||
#import "OZFileInZipInfo.h"
|
||||
#import "OZFileInZipInfo+Internals.h"
|
||||
#import "NSDate+DOSDate.h"
|
||||
|
||||
#include "zip.h"
|
||||
#include "unzip.h"
|
||||
@@ -152,19 +153,10 @@
|
||||
if (_mode == OZZipFileModeUnzip)
|
||||
@throw [OZZipException zipExceptionWithReason:@"Operation not permitted in Unzip mode"];
|
||||
|
||||
NSDate *now= [NSDate date];
|
||||
NSCalendar *calendar= [NSCalendar currentCalendar];
|
||||
NSDateComponents *date= [calendar components:(NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear) fromDate:now];
|
||||
zip_fileinfo zi;
|
||||
zi.tmz_date.tm_sec= (uInt) [date second];
|
||||
zi.tmz_date.tm_min= (uInt) [date minute];
|
||||
zi.tmz_date.tm_hour= (uInt) [date hour];
|
||||
zi.tmz_date.tm_mday= (uInt) [date day];
|
||||
zi.tmz_date.tm_mon= (uInt) [date month] -1;
|
||||
zi.tmz_date.tm_year= (uInt) [date year];
|
||||
zi.internal_fa= 0;
|
||||
zi.external_fa= 0;
|
||||
zi.dosDate= 0;
|
||||
zi.dos_date= [[NSDate date] dosDate];
|
||||
|
||||
// Support for legacy 32 bit mode: here we use the common version,
|
||||
// passing a flag to tell if it is a 32 or 64 bit file
|
||||
@@ -188,18 +180,10 @@
|
||||
if (_mode == OZZipFileModeUnzip)
|
||||
@throw [OZZipException zipExceptionWithReason:@"Operation not permitted in Unzip mode"];
|
||||
|
||||
NSCalendar *calendar= [NSCalendar currentCalendar];
|
||||
NSDateComponents *date= [calendar components:(NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear) fromDate:fileDate];
|
||||
zip_fileinfo zi;
|
||||
zi.tmz_date.tm_sec= (uInt) [date second];
|
||||
zi.tmz_date.tm_min= (uInt) [date minute];
|
||||
zi.tmz_date.tm_hour= (uInt) [date hour];
|
||||
zi.tmz_date.tm_mday= (uInt) [date day];
|
||||
zi.tmz_date.tm_mon= (uInt) [date month] -1;
|
||||
zi.tmz_date.tm_year= (uInt) [date year];
|
||||
zi.internal_fa= 0;
|
||||
zi.external_fa= 0;
|
||||
zi.dosDate= 0;
|
||||
zi.dos_date= [fileDate dosDate];
|
||||
|
||||
// Support for legacy 32 bit mode: here we use the common version,
|
||||
// passing a flag to tell if it is a 32 or 64 bit file
|
||||
@@ -219,22 +203,14 @@
|
||||
return [[OZZipWriteStream alloc] initWithZipFileStruct:_zipFile fileNameInZip:fileNameInZip];
|
||||
}
|
||||
|
||||
- (OZZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip fileDate:(NSDate *)fileDate compressionLevel:(OZZipCompressionLevel)compressionLevel password:(NSString *)password crc32:(NSUInteger)crc32 {
|
||||
- (OZZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip fileDate:(NSDate *)fileDate compressionLevel:(OZZipCompressionLevel)compressionLevel password:(NSString *)password crc32:(uint32_t)crc32 {
|
||||
if (_mode == OZZipFileModeUnzip)
|
||||
@throw [OZZipException zipExceptionWithReason:@"Operation not permitted in Unzip mode"];
|
||||
|
||||
NSCalendar *calendar= [NSCalendar currentCalendar];
|
||||
NSDateComponents *date= [calendar components:(NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear) fromDate:fileDate];
|
||||
zip_fileinfo zi;
|
||||
zi.tmz_date.tm_sec= (uInt) [date second];
|
||||
zi.tmz_date.tm_min= (uInt) [date minute];
|
||||
zi.tmz_date.tm_hour= (uInt) [date hour];
|
||||
zi.tmz_date.tm_mday= (uInt) [date day];
|
||||
zi.tmz_date.tm_mon= (uInt) [date month] -1;
|
||||
zi.tmz_date.tm_year= (uInt) [date year];
|
||||
zi.internal_fa= 0;
|
||||
zi.external_fa= 0;
|
||||
zi.dosDate= 0;
|
||||
zi.dos_date= [fileDate dosDate];
|
||||
|
||||
// Support for legacy 32 bit mode: here we use the common version,
|
||||
// passing a flag to tell if it is a 32 or 64 bit file
|
||||
@@ -274,7 +250,7 @@
|
||||
} ERROR_WRAP_END_AND_RETURN(error, nil);
|
||||
}
|
||||
|
||||
- (OZZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip fileDate:(NSDate *)fileDate compressionLevel:(OZZipCompressionLevel)compressionLevel password:(NSString *)password crc32:(NSUInteger)crc32 error:(NSError * __autoreleasing *)error {
|
||||
- (OZZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip fileDate:(NSDate *)fileDate compressionLevel:(OZZipCompressionLevel)compressionLevel password:(NSString *)password crc32:(uint32_t)crc32 error:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
return [self writeFileInZipWithName:fileNameInZip fileDate:fileDate compressionLevel:compressionLevel password:password crc32:crc32];
|
||||
@@ -401,16 +377,7 @@
|
||||
}
|
||||
|
||||
BOOL crypted= ((file_info.flag & 1) != 0);
|
||||
|
||||
NSDateComponents *components= [[NSDateComponents alloc] init];
|
||||
[components setDay:file_info.tmu_date.tm_mday];
|
||||
[components setMonth:file_info.tmu_date.tm_mon +1];
|
||||
[components setYear:file_info.tmu_date.tm_year];
|
||||
[components setHour:file_info.tmu_date.tm_hour];
|
||||
[components setMinute:file_info.tmu_date.tm_min];
|
||||
[components setSecond:file_info.tmu_date.tm_sec];
|
||||
NSCalendar *calendar= [NSCalendar currentCalendar];
|
||||
NSDate *date= [calendar dateFromComponents:components];
|
||||
NSDate *date= [NSDate fromDosDate:file_info.dos_date];
|
||||
|
||||
OZFileInZipInfo *info= [[OZFileInZipInfo alloc] initWithName:name
|
||||
length:file_info.uncompressed_size
|
||||
@@ -444,12 +411,13 @@
|
||||
} ERROR_WRAP_END_AND_RETURN(error, NO);
|
||||
}
|
||||
|
||||
- (BOOL) locateFileInZip:(NSString *)fileNameInZip error:(NSError * __autoreleasing *)error {
|
||||
- (NSInteger) locateFileInZip:(NSString *)fileNameInZip error:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
return [self locateFileInZip:fileNameInZip];
|
||||
BOOL located= [self locateFileInZip:fileNameInZip];
|
||||
return (located ? OZLocateFileResultFound : OZLocateFileResultNotFound);
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, NO);
|
||||
} ERROR_WRAP_END_AND_RETURN(error, 0);
|
||||
}
|
||||
|
||||
- (NSUInteger) numFilesInZipWithError:(NSError * __autoreleasing *)error {
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZZipFileMode.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZZipReadStream+Internals.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZZipReadStream+NSError.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
@@ -34,6 +34,12 @@
|
||||
#import "OZZipReadStream.h"
|
||||
|
||||
|
||||
/**
|
||||
@brief Indicates the end of the file has been reached.
|
||||
*/
|
||||
static const NSInteger OZReadStreamResultEndOfFile= -1;
|
||||
|
||||
|
||||
@interface OZZipReadStream (NSError)
|
||||
|
||||
|
||||
@@ -46,10 +52,13 @@
|
||||
@param buffer The buffer where read and uncompressed data must be stored.
|
||||
@param error If passed, may be filled with an NSError is case data could
|
||||
not be read.
|
||||
@return The number of uncompressed bytes read, <code>0</code> if the end of
|
||||
the file has been reached or data could not be read due to an error.
|
||||
@return The number of uncompressed bytes read, <code>OZReadStreamResultEndOfFile</code>
|
||||
if the end of the file has been reached, or <code>0</code>
|
||||
if data could not be read due to an error.
|
||||
<br/>NOTE: return value convention is different in the standard (non-NSError
|
||||
compliant) interface.
|
||||
*/
|
||||
- (NSUInteger) readDataWithBuffer:(nonnull NSMutableData *)buffer error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
- (NSInteger) __attribute__((swift_error(nonnull_error))) readDataWithBuffer:(nonnull NSMutableData *)buffer error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
/**
|
||||
@brief Closes the read steam.
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZZipReadStream+Standard.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
@@ -46,6 +46,8 @@
|
||||
@param buffer The buffer where read and uncompressed data must be stored.
|
||||
@return The number of uncompressed bytes read, <code>0</code> if the end of
|
||||
the file has been reached.
|
||||
<br/>NOTE: return value convention is different in NSError compliant
|
||||
interface.
|
||||
@throws OZZipException If the data could not be read due to an error.
|
||||
*/
|
||||
- (NSUInteger) readDataWithBuffer:(nonnull NSMutableData *)buffer;
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZZipReadStream.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 28/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZZipReadStream.m
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 28/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
@@ -93,10 +93,11 @@
|
||||
#pragma mark -
|
||||
#pragma mark Reading data (NSError variants)
|
||||
|
||||
- (NSUInteger) readDataWithBuffer:(NSMutableData *)buffer error:(NSError * __autoreleasing *)error {
|
||||
- (NSInteger) readDataWithBuffer:(NSMutableData *)buffer error:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
return [self readDataWithBuffer:buffer];
|
||||
NSUInteger bytesRead= [self readDataWithBuffer:buffer];
|
||||
return (bytesRead == 0) ? OZReadStreamResultEndOfFile : bytesRead;
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, 0);
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZZipWriteStream+Internals.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZZipWriteStream+NSError.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
@@ -47,6 +47,8 @@
|
||||
@param data The data to be compressed and written.
|
||||
@param error If passed, may be filled with an NSError is case data could
|
||||
not be written.
|
||||
@return <code>YES</code> if data has been written, <code>NO</code> if
|
||||
data could not be written due to an error.
|
||||
*/
|
||||
- (BOOL) writeData:(nonnull NSData *)data error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZZipWriteStream+Standard.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZZipWriteStream.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// OZZipWriteStream.m
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
@@ -48,8 +48,11 @@
|
||||
@private
|
||||
zipFile _zipFile;
|
||||
}
|
||||
|
||||
|
||||
-(instancetype) initWithZipFileStruct:(zipFile)zipFile fileNameInZip:(NSString *)fileNameInZip;
|
||||
- (void) writeData:(NSData *)data;
|
||||
- (void) finishedWriting;
|
||||
- (BOOL) writeData:(NSData *)data error:(NSError * __autoreleasing *)error;
|
||||
- (BOOL) finishedWritingWithError:(NSError * __autoreleasing *)error;
|
||||
@end
|
||||
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// Objective-Zip+NSError.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
@@ -41,3 +41,5 @@
|
||||
#import "OZZipReadStream.h"
|
||||
#import "OZZipReadStream+NSError.h"
|
||||
#import "OZFileInZipInfo.h"
|
||||
#import "NSDate+DOSDate.h"
|
||||
#import "NSData+CRC32.h"
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// Objective-Zip.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
@@ -41,3 +41,5 @@
|
||||
#import "OZZipReadStream.h"
|
||||
#import "OZZipReadStream+Standard.h"
|
||||
#import "OZFileInZipInfo.h"
|
||||
#import "NSDate+DOSDate.h"
|
||||
#import "NSData+CRC32.h"
|
||||
|
||||
192
README.md
192
README.md
@@ -4,6 +4,11 @@ Objective-Zip
|
||||
=============
|
||||
|
||||
|
||||
## Deprecated
|
||||
|
||||
**This library is deprecated.** If you are still using it, you are encouraged to find alternatives.
|
||||
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
@@ -18,7 +23,7 @@ The source repository contains full sources for ZLib, MiniZip and
|
||||
Objective-Zip, together with some unit tests. The versions included are:
|
||||
|
||||
- 1.2.8 for [ZLib](http://zlib.net).
|
||||
- 1.1 for [MiniZip](https://github.com/nmoinvaz/minizip).
|
||||
- 1.1 (as of 13/5/2017) for [MiniZip](https://github.com/nmoinvaz/minizip).
|
||||
- latest version for Objective-Zip.
|
||||
|
||||
Please note that ZLib and MiniZip are included here only to provide a
|
||||
@@ -42,7 +47,7 @@ Adding Objective-Zip to your project
|
||||
The library is distributed via CocoaPods, you can add a dependency in you pod
|
||||
file with the following line:
|
||||
|
||||
pod 'Objective-Zip', '~> 1.0'
|
||||
pod 'objective-zip', '~> 1.0'
|
||||
|
||||
You can then access Objective-Zip classes with the following import
|
||||
statement if you plan to use exception handling:
|
||||
@@ -98,6 +103,55 @@ OZZipWriteStream *stream= [zipFile writeFileInZipWithName:@"abc.txt"
|
||||
```
|
||||
|
||||
|
||||
Adding a file to a zip file using encryption
|
||||
--------------------------------------------
|
||||
|
||||
Objective-Zip supports only traditional PKWare encryption, which is also the
|
||||
format most widely supported by common unzip utilities.
|
||||
|
||||
To add a file with encryption, it is necessary to precompute a CRC32 of
|
||||
the file being added. This is needed by traditional PKWare encryption
|
||||
to later verify that the password provided for decryption is correct.
|
||||
|
||||
The library includes a handy crc32 method as an NSData category
|
||||
(automatically imported under the umbrella header):
|
||||
|
||||
```objective-c
|
||||
NSData *fileData= // Your file data
|
||||
uint32_t crc= [fileData crc32];
|
||||
|
||||
OZZipWriteStream *stream= [zipFile writeFileInZipWithName:@"abc.txt"
|
||||
compressionLevel:OZZipCompressionLevelBest
|
||||
password:@"password"
|
||||
crc32:crc];
|
||||
|
||||
[stream writeData:fileData];
|
||||
[stream finishedWriting];
|
||||
```
|
||||
|
||||
Note that passing 0 (or any other non-CRC32 number) as the crc32 argument will make
|
||||
the decryption fail, even if the correct password is specified.
|
||||
|
||||
Note also that if your file is too large to be stored in a single NSData, you
|
||||
can still compute the CRC32 progressively by using a loop:
|
||||
|
||||
```objective-c
|
||||
NSFileHandle *fileHandle= // Your file handle
|
||||
|
||||
uint32_t crc= 0;
|
||||
do {
|
||||
|
||||
// Read a chunk of the file in data buffer
|
||||
NSData *data= [fileHandle readDataOfLength:BUFFER_SIZE];
|
||||
if ([data length] == 0)
|
||||
break;
|
||||
|
||||
crc= [data crc32withInitialCrc32:crc];
|
||||
|
||||
} while (YES);
|
||||
```
|
||||
|
||||
|
||||
Reading a file from a zip file
|
||||
------------------------------
|
||||
|
||||
@@ -105,7 +159,10 @@ The OZZipFile class, when used in unzip mode, must be treated like a
|
||||
cursor: you position the instance on a file at a time, either by
|
||||
step-forwarding or by locating the file by name. Once you are on the
|
||||
correct file, you can obtain an instance of a OZZipReadStream that will
|
||||
let you read the content (and then must be closed):
|
||||
let you read the content (and then must be closed).
|
||||
|
||||
Since the file may not fit into memory, you can read it block by block using
|
||||
a buffer:
|
||||
|
||||
```objective-c
|
||||
OZZipFile *unzipFile= [[OZZipFile alloc] initWithFileName:@"test.zip"
|
||||
@@ -114,14 +171,50 @@ OZZipFile *unzipFile= [[OZZipFile alloc] initWithFileName:@"test.zip"
|
||||
[unzipFile goToFirstFileInZip];
|
||||
|
||||
OZZipReadStream *read= [unzipFile readCurrentFileInZip];
|
||||
NSMutableData *data= [[NSMutableData alloc] initWithLength:256];
|
||||
int bytesRead= [read readDataWithBuffer:data];
|
||||
NSMutableData *data= [[NSMutableData alloc] initWithLength:BUFFER_SIZE];
|
||||
|
||||
do {
|
||||
|
||||
// Reset buffer length
|
||||
[data setLength:BUFFER_SIZE];
|
||||
|
||||
// Read bytes and check for end of file
|
||||
int bytesRead= [read readDataWithBuffer:data];
|
||||
if (bytesRead <= 0)
|
||||
break;
|
||||
|
||||
[data setLength:bytesRead];
|
||||
|
||||
// Do something with data
|
||||
|
||||
} while (YES);
|
||||
|
||||
[read finishedReading];
|
||||
```
|
||||
|
||||
Alternatively, if you know in advance the file will fit into memory, you may
|
||||
preallocate a buffer big enough and read the all file at once. In the example
|
||||
below the buffer is preallocated with precisely the uncompressed size of the
|
||||
file:
|
||||
|
||||
```objective-c
|
||||
OZZipFile *unzipFile= [[OZZipFile alloc] initWithFileName:@"test.zip"
|
||||
mode:OZZipFileModeUnzip];
|
||||
|
||||
[unzipFile goToFirstFileInZip];
|
||||
OZFileInZipInfo *info= [unzipFile getCurrentFileInZipInfo];
|
||||
|
||||
OZZipReadStream *read= [unzipFile readCurrentFileInZip];
|
||||
NSMutableData *data= [[NSMutableData alloc] initWithLength:info.length];
|
||||
[read readDataWithBuffer:data];
|
||||
|
||||
// Do something with data
|
||||
|
||||
[read finishedReading];
|
||||
```
|
||||
|
||||
Note that the NSMutableData instance that acts as the read buffer must
|
||||
have been set with a length greater than 0: the readDataWithBuffer API
|
||||
have been set with a length greater than 0: the `readDataWithBuffer` API
|
||||
will use that length to know how many bytes it can fetch from the zip
|
||||
file.
|
||||
|
||||
@@ -136,19 +229,18 @@ zip and expand it:
|
||||
|
||||
```objective-c
|
||||
OZZipFile *unzipFile= [[OZZipFile alloc] initWithFileName:@"test.zip"
|
||||
mode:ZipFileModeUnzip];
|
||||
mode:OZZipFileModeUnzip];
|
||||
|
||||
NSArray *infos= [unzipFile listFileInZipInfos];
|
||||
for (OZFileInZipInfo *info in infos) {
|
||||
NSLog(@"- %@ %@ %d (%d)", info.name, info.date, info.size,
|
||||
info.level);
|
||||
NSLog(@"- %@ %@ %llu (%d)", info.name, info.date, info.size, info.level);
|
||||
|
||||
// Locate the file in the zip
|
||||
[unzipFile locateFileInZip:info.name];
|
||||
|
||||
// Expand the file in memory
|
||||
OZZipReadStream *read= [unzipFile readCurrentFileInZip];
|
||||
NSMutableData *data= [[NSMutableData alloc] initWithLength:256];
|
||||
NSMutableData *data= [[NSMutableData alloc] initWithLength:info.length];
|
||||
int bytesRead= [read readDataWithBuffer:data];
|
||||
[read finishedReading];
|
||||
}
|
||||
@@ -182,45 +274,6 @@ rebuild it on the file system (and viceversa during creation). Common
|
||||
zippers/unzippers simply follow this rule.
|
||||
|
||||
|
||||
Memory management
|
||||
-----------------
|
||||
|
||||
If you need to extract huge files that cannot be contained in memory,
|
||||
you can do so using a read-then-write buffered loop like this:
|
||||
|
||||
```objective-c
|
||||
NSFileHandle *file= [NSFileHandle fileHandleForWritingAtPath:filePath];
|
||||
NSMutableData *buffer= [[NSMutableData alloc]
|
||||
initWithLength:BUFFER_SIZE];
|
||||
|
||||
OZZipReadStream *read= [unzipFile readCurrentFileInZip];
|
||||
|
||||
// Read-then-write buffered loop
|
||||
do {
|
||||
|
||||
// Reset buffer length
|
||||
[buffer setLength:BUFFER_SIZE];
|
||||
|
||||
// Expand next chunk of bytes
|
||||
int bytesRead= [read readDataWithBuffer:buffer];
|
||||
if (bytesRead > 0) {
|
||||
|
||||
// Write what we have read
|
||||
[buffer setLength:bytesRead];
|
||||
[file writeData:buffer];
|
||||
|
||||
} else
|
||||
break;
|
||||
|
||||
} while (YES);
|
||||
|
||||
// Clean up
|
||||
[file closeFile];
|
||||
[read finishedReading];
|
||||
[buffer release];
|
||||
```
|
||||
|
||||
|
||||
Error handling
|
||||
--------------
|
||||
|
||||
@@ -255,6 +308,21 @@ Apple's NSError pattern is of course mandatory with Swift programming
|
||||
language, since it does not support exception handling.
|
||||
|
||||
|
||||
Differences in the interface
|
||||
----------------------------
|
||||
|
||||
Note that a few minor differences exist in the standard interface vs. the
|
||||
NSError pattern interface. Specifically:
|
||||
|
||||
* `[OZZipFile locateFileInZip:error:]` returns a `NSInteger` in place of a
|
||||
`BOOL`. Here the special values `OZLocateFileResultNotFound` and
|
||||
`OZLocateFileResultNotFound`, respectively `1` and `-1`, are used in place of
|
||||
`YES` and `NO`, since `0` is reserved for the case where an error occurred.
|
||||
* `[OZZipReadStream readDataWithBuffer:error:]` similarly returns a
|
||||
`NSInteger` in place of a `NSUInteger`. Here the special value
|
||||
`OZReadStreamResultEndOfFile`, corresponding to `-1`, is used for the
|
||||
end-of-file case, since `0` is again reserved for error occurrence.
|
||||
|
||||
|
||||
License
|
||||
=======
|
||||
@@ -265,6 +333,28 @@ The library is distributed under the New BSD License.
|
||||
Version history
|
||||
===============
|
||||
|
||||
Version 1.0.5:
|
||||
|
||||
- Improved support for computation of CRC32
|
||||
|
||||
Version 1.0.4:
|
||||
|
||||
- Updated to latest version of MiniZip (as of 13/5/2017)
|
||||
- Added unit tests for 32/64 cross compatibility
|
||||
- Added unit tests for encryption/decryption with password
|
||||
|
||||
Version 1.0.3:
|
||||
|
||||
- Fixed some memory leaks in MiniZip (contributed by @SheffieldKevin)
|
||||
- Silenced a warning about shifting a negative value in ZLib (contributed by Martin Winter)
|
||||
- Fixed throwing of errors so that it is compatible with Swift 3 (contributed by @andyj-at-aspin)
|
||||
- Fixed typos and errors in README (contributed by @deni2s)
|
||||
|
||||
Version 1.0.2:
|
||||
|
||||
- Fixed interface for `locateFileInZip` and `readDataWithBuffer` in NSError
|
||||
version so that they correctly support Swift error handling.
|
||||
|
||||
Version 1.0.1:
|
||||
|
||||
- Fixed compatibility bugs with Swift
|
||||
@@ -331,7 +421,7 @@ Version 0.7.0:
|
||||
Compatibility
|
||||
=============
|
||||
|
||||
Version 1.0.1 has been tested with iOS up to 9.0 and OS X up to 10.10.5, but
|
||||
should be compatible with earlier versions too, down to iOS 5.1 and OS X 10.7.
|
||||
Version 1.0.5 has been tested with iOS up to 10.3 and OS X up to 10.12, but
|
||||
should be compatible with earlier versions too, down to iOS 8.0 and OS X 10.7.
|
||||
Le me know of any issues that should arise.
|
||||
|
||||
|
||||
@@ -1504,9 +1504,10 @@ z_streamp strm;
|
||||
{
|
||||
struct inflate_state FAR *state;
|
||||
|
||||
if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16;
|
||||
if (strm == Z_NULL || strm->state == Z_NULL)
|
||||
return (long)(((unsigned long)0 - 1) << 16);
|
||||
state = (struct inflate_state FAR *)strm->state;
|
||||
return ((long)(state->back) << 16) +
|
||||
return (long)(((unsigned long)((long)state->back)) << 16) +
|
||||
(state->mode == COPY ? state->length :
|
||||
(state->mode == MATCH ? state->was - state->length : 0));
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ Pod::Spec.new do |s|
|
||||
# ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
|
||||
|
||||
s.name = "objective-zip"
|
||||
s.version = "1.0.1"
|
||||
s.version = "1.0.5"
|
||||
s.summary = "An object-oriented friendly wrapper library for ZLib and MiniZip, in Objective-C for iOS and OS X"
|
||||
|
||||
s.description = <<-DESC
|
||||
@@ -33,7 +33,7 @@ Pod::Spec.new do |s|
|
||||
|
||||
# ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
|
||||
|
||||
s.ios.deployment_target = "5.1"
|
||||
s.ios.deployment_target = "8.0"
|
||||
s.osx.deployment_target = "10.7"
|
||||
|
||||
|
||||
@@ -48,9 +48,21 @@ Pod::Spec.new do |s|
|
||||
s.source_files = "Objective-Zip/**/*.{h,m}", "MiniZip/**/*.{h,c}", "ZLib/**/*.{h,c}"
|
||||
|
||||
|
||||
# ――― Publich Headers ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
|
||||
|
||||
s.public_header_files = ["Objective-Zip/OZZipFile.h", "Objective-Zip/OZZipFile+Standard.h", "Objective-Zip/OZZipFile+NSError.h",
|
||||
"Objective-Zip/OZZipFileMode.h", "Objective-Zip/OZZipCompressionLevel.h", "Objective-Zip/OZZipException.h",
|
||||
"Objective-Zip/OZZipWriteStream.h", "Objective-Zip/OZZipWriteStream+Standard.h",
|
||||
"Objective-Zip/OZZipWriteStream+NSError.h", "Objective-Zip/OZZipReadStream.h",
|
||||
"Objective-Zip/OZZipReadStream+Standard.h", "Objective-Zip/OZZipReadStream+NSError.h",
|
||||
"Objective-Zip/OZFileInZipInfo.h", "Objective-Zip/Objective-Zip.h", "Objective-Zip/Objective-Zip+NSError.h",
|
||||
"Objective-Zip/NSDate+DOSDate.h", "Objective-Zip/NSData+CRC32.h"]
|
||||
|
||||
|
||||
# ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
|
||||
|
||||
s.requires_arc = true
|
||||
s.xcconfig = { "OTHER_LDFLAGS" => "-ObjC" }
|
||||
s.xcconfig = { "OTHER_LDFLAGS" => "-ObjC",
|
||||
"GCC_WARN_UNUSED_FUNCTION" => "NO" }
|
||||
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user