[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r23205 - Extractor/src/common
From: |
gnunet |
Subject: |
[GNUnet-SVN] r23205 - Extractor/src/common |
Date: |
Mon, 13 Aug 2012 00:29:02 +0200 |
Author: grothoff
Date: 2012-08-13 00:29:02 +0200 (Mon, 13 Aug 2012)
New Revision: 23205
Modified:
Extractor/src/common/unzip.c
Extractor/src/common/unzip.h
Log:
towards cleaner unzip API for new LE extract context
Modified: Extractor/src/common/unzip.c
===================================================================
--- Extractor/src/common/unzip.c 2012-08-12 12:50:46 UTC (rev 23204)
+++ Extractor/src/common/unzip.c 2012-08-12 22:29:02 UTC (rev 23205)
@@ -17,13 +17,15 @@
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
-
-/* This code is based in part on
- unzip 1.00 Copyright 1998-2003 Gilles Vollant
- http://www.winimage.com/zLibDll"
-*/
-
-
+/**
+ * @file common/unzip.c
+ * @brief API to access ZIP archives
+ * @author Christian Grothoff
+ *
+ * This code is based in part on
+ * unzip 1.00 Copyright 1998-2003 Gilles Vollant
+ * http://www.winimage.com/zLibDll"
+ */
#include "platform.h"
#include <ctype.h>
#include "extractor.h"
@@ -32,8 +34,47 @@
#define CASESENSITIVITY (0)
#define MAXFILENAME (256)
-/* *********************** IOAPI ***************** */
+#ifndef UNZ_BUFSIZE
+#define UNZ_BUFSIZE (16384)
+#endif
+
+#ifndef UNZ_MAXFILENAMEINZIP
+#define UNZ_MAXFILENAMEINZIP (256)
+#endif
+
+
+#define SIZECENTRALDIRITEM (0x2e)
+#define SIZEZIPLOCALHEADER (0x1e)
+
+
+/**
+ * IO callbacks for access to the ZIP data.
+ */
+struct EXTRACTOR_UnzipFileFuncDefs
+{
+ /**
+ * Callback for reading 'size' bytes from the ZIP archive into buf.
+ */
+ uLong ( *zread_file) (voidpf opaque, void* buf, uLong size);
+
+ /**
+ * Callback to obtain the current read offset in the ZIP archive.
+ */
+ long ( *ztell_file) (voidpf opaque);
+
+ /**
+ * Callback for seeking to a different position in the ZIP archive.
+ */
+ long ( *zseek_file) (voidpf opaque, uLong offset, int origin);
+
+ /**
+ * Opaque argument to pass to all IO functions.
+ */
+ voidpf opaque;
+};
+
+
#define ZLIB_FILEFUNC_SEEK_CUR (1)
#define ZLIB_FILEFUNC_SEEK_END (2)
#define ZLIB_FILEFUNC_SEEK_SET (0)
@@ -44,347 +85,408 @@
#define ZLIB_FILEFUNC_MODE_EXISTING (4)
#define ZLIB_FILEFUNC_MODE_CREATE (8)
+/**
+ * Macro to read using filefunc API.
+ *
+ * @param filefunc filefunc struct
+ * @param buf where to write data
+ * @param size number of bytes to read
+ * @return number of bytes copied to buf
+ */
+#define ZREAD(filefunc,buf,size) ((*((filefunc).zread_file))
((filefunc).opaque, buf, size))
-#define ZREAD(filefunc,filestream,buf,size)
((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size))
-#define ZWRITE(filefunc,filestream,buf,size)
((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size))
-#define ZTELL(filefunc,filestream)
((*((filefunc).ztell_file))((filefunc).opaque,filestream))
-#define ZSEEK(filefunc,filestream,pos,mode)
((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode))
-#define ZCLOSE(filefunc,filestream)
((*((filefunc).zclose_file))((filefunc).opaque,filestream))
-#define ZERROR(filefunc,filestream)
((*((filefunc).zerror_file))((filefunc).opaque,filestream))
+/**
+ * Macro to obtain current offset in file using filefunc API.
+ *
+ * @param filefunc filefunc struct
+ * @return current offset in file
+ */
+#define ZTELL(filefunc) ((*((filefunc).ztell_file)) ((filefunc).opaque))
+/**
+ * Macro to seek using filefunc API.
+ *
+ * @param filefunc filefunc struct
+ * @param pos position to seek
+ * @param mode seek mode
+ * @return 0 on success
+ */
+#define ZSEEK(filefunc,pos,mode) ((*((filefunc).zseek_file))
((filefunc).opaque, pos, mode))
-/* ******************* former crypt.h ********************* */
-/* unz_global_info structure contain global data about the ZIPfile
- These data comes from the end of central dir */
-typedef struct unz_global_info_s
+/**
+ * Global data about the ZIPfile
+ * These data comes from the end of central dir
+ */
+struct GlobalInfo
{
- uLong number_entry; /* total number of entries in
- the central dir on this disk */
- uLong size_comment; /* size of the global comment of the zipfile */
-} unz_global_info;
-/*
- 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)
+ /**
+ * total number of entries in
+ * the central dir on this disk
+ */
+ uLong number_entry;
+
+ /**
+ * size of the global comment of the zipfile
+ */
+ uLong size_comment;
+};
- if buf==NULL, it return the size of the local extra field
- if buf!=NULL, len is the size of the buffer, the extra header is copied in
- buf.
- the return value is the number of bytes copied in buf, or (if <0)
- the error code
-*/
+/**
+ * internal info about a file in zipfile
+ */
+struct UnzipFileInfoInternal
+{
-#ifndef CASESENSITIVITYDEFAULT_NO
-# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
-# define CASESENSITIVITYDEFAULT_NO
-# endif
-#endif
+ /**
+ * relative offset of local header 4 bytes
+ */
+ uLong offset_curfile;
+};
-#ifndef UNZ_BUFSIZE
-#define UNZ_BUFSIZE (16384)
-#endif
-#ifndef UNZ_MAXFILENAMEINZIP
-#define UNZ_MAXFILENAMEINZIP (256)
-#endif
+/**
+ * Information about a file in zipfile, when reading and
+ * decompressing it
+ */
+struct FileInZipReadInfo
+{
+ /**
+ * internal buffer for compressed data
+ */
+ char *read_buffer;
-#ifndef ALLOC
-# define ALLOC(size) (malloc(size))
-#endif
+ /**
+ * zLib stream structure for inflate
+ */
+ z_stream stream;
+
+ /**
+ * position in byte on the zipfile, for fseek
+ */
+ uLong pos_in_zipfile;
-#define SIZECENTRALDIRITEM (0x2e)
-#define SIZEZIPLOCALHEADER (0x1e)
+ /**
+ * flag set if stream structure is initialised
+ */
+ uLong stream_initialised;
+
+ /**
+ * offset of the local extra field
+ */
+ uLong offset_local_extrafield;
+ /**
+ * size of the local extra field
+ */
+ uInt size_local_extrafield;
+ /**
+ * position in the local extra field in read
+ */
+ uLong pos_local_extrafield;
+
+ /**
+ * crc32 of all data uncompressed so far
+ */
+ uLong crc32;
-/* EXTRACTOR_unzip_file_info_interntal contain internal info about a file in
zipfile*/
-typedef struct unz_file_info_internal_s
-{
- uLong offset_curfile;/* relative offset of local header 4 bytes */
-} unz_file_info_internal;
+ /**
+ * crc32 we must obtain after decompress all
+ */
+ uLong crc32_wait;
+ /**
+ * number of bytes to be decompressed
+ */
+ uLong rest_read_compressed;
+
+ /**
+ * number of bytes to be obtained after decomp
+ */
+ uLong rest_read_uncompressed;
+
+ /**
+ * IO functions. (FIXME: where is this assigned?)
+ */
+ struct EXTRACTOR_UnzipFileFuncDefs z_filefunc;
-/* file_in_zip_read_info_s contain internal information about a file in
zipfile,
- when reading and decompress it */
-typedef struct
-{
- char *read_buffer; /* internal buffer for compressed data */
- z_stream stream; /* zLib stream structure for inflate */
+ /**
+ * compression method (0==store)
+ */
+ uLong compression_method;
- uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/
- uLong stream_initialised; /* flag set if stream structure is
initialised*/
+ /**
+ * byte before the zipfile, (>0 for sfx)
+ */
+ uLong byte_before_the_zipfile;
+};
- uLong offset_local_extrafield;/* offset of the local extra field */
- uInt size_local_extrafield;/* size of the local extra field */
- uLong pos_local_extrafield; /* position in the local extra field in
read*/
- uLong crc32; /* crc32 of all data uncompressed */
- uLong crc32_wait; /* crc32 we must obtain after decompress all */
- uLong rest_read_compressed; /* number of byte to be decompressed */
- uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/
- EXTRACTOR_unzip_filefunc_def z_filefunc;
- voidpf filestream; /* io structore of the zipfile */
- uLong compression_method; /* compression method (0==store) */
- uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
- int raw;
-} file_in_zip_read_info_s;
+/**
+ * Handle for a ZIP archive.
+ * contains internal information about the zipfile
+ */
+struct EXTRACTOR_UnzipFile
+{
+ /**
+ * io structore of the zipfile
+ */
+ struct EXTRACTOR_UnzipFileFuncDefs z_filefunc;
+ /**
+ * public global information
+ */
+ struct GlobalInfo gi;
+
+ /**
+ * byte before the zipfile, (>0 for sfx)
+ */
+ uLong byte_before_the_zipfile;
+
+ /**
+ * number of the current file in the zipfile
+ */
+ uLong num_file;
-/* unz_s contain internal information about the zipfile
-*/
-typedef struct
-{
- EXTRACTOR_unzip_filefunc_def z_filefunc;
- voidpf filestream; /* io structore of the zipfile */
- unz_global_info gi; /* public global information */
- uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
- uLong num_file; /* number of the current file in the zipfile*/
- uLong pos_in_central_dir; /* pos of the current file in the central dir*/
- uLong current_file_ok; /* flag about the usability of the current
file*/
- uLong central_pos; /* position of the beginning of the central
dir*/
+ /**
+ * pos of the current file in the central dir
+ */
+ uLong pos_in_central_dir;
+
+ /**
+ * flag about the usability of the current file
+ */
+ uLong current_file_ok;
- uLong size_central_dir; /* size of the central directory */
- uLong offset_central_dir; /* offset of start of central directory with
- respect to the starting disk number */
+ /**
+ * position of the beginning of the central dir
+ */
+ uLong central_pos;
+
+ /**
+ * size of the central directory
+ */
+ uLong size_central_dir;
- EXTRACTOR_unzip_file_info cur_file_info; /* public info about the current
file in zip*/
- unz_file_info_internal cur_file_info_internal; /* private info about it*/
- file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current
- file if we are decompressing it */
- int encrypted;
-} unz_s;
+ /**
+ * offset of start of central directory with respect to the starting
+ * disk number
+ */
+ uLong offset_central_dir;
+ /**
+ * public info about the current file in zip
+ */
+ struct EXTRACTOR_UnzipFileInfo cur_file_info;
+
+ /**
+ * private info about it
+ */
+ struct UnzipFileInfoInternal cur_file_info_internal;
+ /**
+ * structure about the current file if we are decompressing it
+ */
+ struct FileInZipReadInfo* pfile_in_zip_read;
-/* ===========================================================================
- Read a byte from a gz_stream; update next_in and avail_in. Return EOF
- for end of file.
- IN assertion: the stream s has been sucessfully opened for reading.
-*/
+ /**
+ * Is the file encrypted?
+ */
+ int encrypted;
+};
+/**
+ * Read a byte from a gz_stream; update next_in and avail_in. Return EOF
+ * for end of file.
+ * IN assertion: the stream s has been sucessfully opened for reading.
+ */
static int
-unzlocal_getByte(const EXTRACTOR_unzip_filefunc_def* pzlib_filefunc_def,
- voidpf filestream,
- int *pi)
+unzlocal_getByte (const struct EXTRACTOR_UnzipFileFuncDefs* pzlib_filefunc_def,
+ int *pi)
{
- unsigned char c;
- int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1);
- if (err==1)
- {
- *pi = (int)c;
- return EXTRACTOR_UNZIP_OK;
- }
- else
- {
- if (ZERROR(*pzlib_filefunc_def,filestream))
- return EXTRACTOR_UNZIP_ERRNO;
- else
- return EXTRACTOR_UNZIP_EOF;
- }
+ unsigned char c;
+
+ if (1 != ZREAD (*pzlib_filefunc_def, &c, 1))
+ return EXTRACTOR_UNZIP_EOF;
+ *pi = (int)c;
+ return EXTRACTOR_UNZIP_OK;
}
static int
-unzlocal_getShort (const EXTRACTOR_unzip_filefunc_def* pzlib_filefunc_def,
- voidpf filestream,
+unzlocal_getShort (const struct EXTRACTOR_UnzipFileFuncDefs*
pzlib_filefunc_def,
uLong *pX)
{
uLong x;
int i;
int err;
- err = unzlocal_getByte(pzlib_filefunc_def, filestream, &i);
*pX = 0;
- if (err != EXTRACTOR_UNZIP_OK)
+ if (EXTRACTOR_UNZIP_OK != (err = unzlocal_getByte (pzlib_filefunc_def, &i)))
return err;
- x = (uLong)i;
- err = unzlocal_getByte(pzlib_filefunc_def, filestream, &i);
- if (err != EXTRACTOR_UNZIP_OK)
+ x = (uLong) i;
+ if (EXTRACTOR_UNZIP_OK != (err = unzlocal_getByte (pzlib_filefunc_def, &i)))
return err;
- x += ((uLong)i)<<8;
+ x += ((uLong) i) << 8;
*pX = x;
return err;
}
+
static int
-unzlocal_getLong (const EXTRACTOR_unzip_filefunc_def* pzlib_filefunc_def,
- voidpf filestream,
+unzlocal_getLong (const struct EXTRACTOR_UnzipFileFuncDefs* pzlib_filefunc_def,
uLong *pX)
{
- uLong x ;
+ uLong x;
int i;
int err;
*pX = 0;
- err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
- if (err != EXTRACTOR_UNZIP_OK)
+ if (EXTRACTOR_UNZIP_OK != (err = unzlocal_getByte (pzlib_filefunc_def, &i)))
return err;
x = (uLong)i;
- err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
- if (err != EXTRACTOR_UNZIP_OK)
+ if (EXTRACTOR_UNZIP_OK != (err = unzlocal_getByte (pzlib_filefunc_def, &i)))
return err;
- x += ((uLong)i)<<8;
- err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
- if (err != EXTRACTOR_UNZIP_OK)
+ x += ((uLong) i) << 8;
+ if (EXTRACTOR_UNZIP_OK != (err = unzlocal_getByte (pzlib_filefunc_def, &i)))
return err;
- x += ((uLong)i)<<16;
- err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
- if (err != EXTRACTOR_UNZIP_OK)
+ x += ((uLong) i) << 16;
+ if (EXTRACTOR_UNZIP_OK != (err = unzlocal_getByte (pzlib_filefunc_def, &i)))
return err;
- x += ((uLong)i)<<24;
+ x += ((uLong) i) << 24;
*pX = x;
return err;
}
-/* My own strcmpi / strcasecmp */
-static int
-strcmpcasenosensitive_internal (const char* fileName1,
- const char* fileName2)
-{
- while (1)
- {
- char c1=*(fileName1++);
- char c2=*(fileName2++);
- if ((c1>='a') && (c1<='z'))
- c1 -= 0x20;
- if ((c2>='a') && (c2<='z'))
- c2 -= 0x20;
- if (c1=='\0')
- return ((c2=='\0') ? 0 : -1);
- if (c2=='\0')
- return 1;
- if (c1<c2)
- return -1;
- if (c1>c2)
- return 1;
- }
-}
+#ifndef CASESENSITIVITYDEFAULT_NO
+#if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
+#define CASESENSITIVITYDEFAULT_NO
+#endif
+#endif
-
#ifdef CASESENSITIVITYDEFAULT_NO
#define CASESENSITIVITYDEFAULTVALUE 2
#else
#define CASESENSITIVITYDEFAULTVALUE 1
#endif
-#ifndef STRCMPCASENOSENTIVEFUNCTION
-#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
-#endif
-/*
- Compare two filename (fileName1,fileName2).
- If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
- If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
- or strcasecmp)
- If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
- (like 1 on Unix, 2 on Windows)
-
-*/
-int
+/**
+ * Compare two filename (fileName1,fileName2).
+ *
+ * @param filename1 name of first file
+ * @param filename2 name of second file
+ * @param iCaseSensitivity, use 1 for case sensitivity (like strcmp);
+ * 2 for no case sensitivity (like strcmpi or strcasecmp); or
+ * 0 for defaut of your operating system (like 1 on Unix, 2 on Windows)
+ * @return 0 if names are equal
+ */
+static int
EXTRACTOR_common_unzip_string_file_name_compare (const char* fileName1,
const char* fileName2,
int iCaseSensitivity)
{
- if (iCaseSensitivity==0)
- iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
-
- if (iCaseSensitivity==1)
- return strcmp(fileName1,fileName2);
-
- return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
+ if (0 == iCaseSensitivity)
+ iCaseSensitivity = CASESENSITIVITYDEFAULTVALUE;
+ if (1 == iCaseSensitivity)
+ return strcmp(fileName1, fileName2);
+ return strcasecmp (fileName1, fileName2);
}
+
#ifndef BUFREADCOMMENT
#define BUFREADCOMMENT (0x400)
#endif
+/**
+ *
+ */
static uLong
-unzlocal_SearchCentralDir(const EXTRACTOR_unzip_filefunc_def*
pzlib_filefunc_def,
- voidpf filestream)
+unzlocal_SearchCentralDir (const struct EXTRACTOR_UnzipFileFuncDefs*
pzlib_filefunc_def)
{
- unsigned char* buf;
- uLong uSizeFile;
- uLong uBackRead;
- uLong uMaxBack=0xffff; /* maximum size of global comment */
- uLong uPosFound=0;
+ unsigned char* buf;
+ uLong uSizeFile;
+ uLong uBackRead;
+ uLong uMaxBack=0xffff; /* maximum size of global comment */
+ uLong uPosFound=0;
+
+ if (0 != ZSEEK (*pzlib_filefunc_def, 0, ZLIB_FILEFUNC_SEEK_END))
+ return 0;
+ uSizeFile = ZTELL (*pzlib_filefunc_def);
- if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
- return 0;
+ if (uMaxBack > uSizeFile)
+ uMaxBack = uSizeFile;
+ if (NULL == (buf = malloc(BUFREADCOMMENT+4)))
+ return 0;
- uSizeFile = ZTELL(*pzlib_filefunc_def,filestream);
-
- if (uMaxBack>uSizeFile)
- uMaxBack = uSizeFile;
-
- buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
- if (buf==NULL)
- return 0;
-
- uBackRead = 4;
- while (uBackRead<uMaxBack)
+ uBackRead = 4;
+ while (uBackRead<uMaxBack)
{
- uLong uReadSize,uReadPos ;
- int i;
- if (uBackRead+BUFREADCOMMENT>uMaxBack)
- uBackRead = uMaxBack;
- else
- uBackRead+=BUFREADCOMMENT;
- uReadPos = uSizeFile-uBackRead ;
+ uLong uReadSize;
+ uLong uReadPos;
+ int i;
- uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
- (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);
- if
(ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
- break;
-
- if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
- break;
-
- for (i=(int)uReadSize-3; (i--)>0;)
- if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
- ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
- {
- uPosFound = uReadPos+i;
- break;
- }
-
- if (uPosFound!=0)
- break;
+ if (uBackRead+BUFREADCOMMENT>uMaxBack)
+ uBackRead = uMaxBack;
+ else
+ uBackRead+=BUFREADCOMMENT;
+ uReadPos = uSizeFile-uBackRead ;
+
+ uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+ (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);
+ if (0 != ZSEEK (*pzlib_filefunc_def, uReadPos, ZLIB_FILEFUNC_SEEK_SET))
+ break;
+
+ if (ZREAD (*pzlib_filefunc_def, buf, uReadSize)!=uReadSize)
+ break;
+
+ for (i=(int)uReadSize-3; (i--)>0;)
+ if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
+ ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
+ {
+ uPosFound = uReadPos+i;
+ break;
+ }
+
+ if (0 != uPosFound)
+ break;
}
- free(buf);
- return uPosFound;
+ free(buf);
+ return uPosFound;
}
-/*
- Translate date/time from Dos format to EXTRACTOR_unzip_tm_unz (readable
more easilty)
-*/
+/**
+ * Translate date/time from Dos format to struct
+ * EXTRACTOR_UnzipDateTimeInfo (readable more easilty)
+ */
static void
unzlocal_DosDateToTmuDate (uLong ulDosDate,
- EXTRACTOR_unzip_tm_unz* ptm)
+ struct EXTRACTOR_UnzipDateTimeInfo* ptm)
{
- uLong uDate;
- uDate = (uLong)(ulDosDate>>16);
- ptm->tm_mday = (uInt)(uDate&0x1f) ;
- ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ;
- ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;
+ uLong uDate;
- ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);
- ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ;
- ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ;
+ uDate = (uLong)(ulDosDate>>16);
+ ptm->tm_mday = (uInt)(uDate&0x1f);
+ ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1);
+ ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980);
+ ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);
+ ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20);
+ ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f));
}
static int
-unzlocal_GetCurrentFileInfoInternal (EXTRACTOR_unzip_file file,
- EXTRACTOR_unzip_file_info *pfile_info,
- unz_file_info_internal
*pfile_info_internal,
+unzlocal_GetCurrentFileInfoInternal (struct EXTRACTOR_UnzipFile *s,
+ struct EXTRACTOR_UnzipFileInfo *pfile_info,
+ struct UnzipFileInfoInternal
*pfile_info_internal,
char *szFileName,
uLong fileNameBufferSize,
void *extraField,
@@ -392,307 +494,294 @@
char *szComment,
uLong commentBufferSize)
{
- unz_s* s;
- EXTRACTOR_unzip_file_info file_info;
- unz_file_info_internal file_info_internal;
- int err=EXTRACTOR_UNZIP_OK;
- uLong uMagic;
- long lSeek=0;
+ struct EXTRACTOR_UnzipFileInfo file_info;
+ struct UnzipFileInfoInternal file_info_internal;
+ int err=EXTRACTOR_UNZIP_OK;
+ uLong uMagic;
+ long lSeek = 0;
+
+ if (NULL == s)
+ return EXTRACTOR_UNZIP_PARAMERROR;
+ if (0 != ZSEEK (s->z_filefunc,
+ s->pos_in_central_dir + s->byte_before_the_zipfile,
+ ZLIB_FILEFUNC_SEEK_SET))
+ err = EXTRACTOR_UNZIP_ERRNO;
- if (file==NULL)
- return EXTRACTOR_UNZIP_PARAMERROR;
- s=(unz_s*)file;
- if (ZSEEK(s->z_filefunc, s->filestream,
- s->pos_in_central_dir+s->byte_before_the_zipfile,
- ZLIB_FILEFUNC_SEEK_SET)!=0)
- err=EXTRACTOR_UNZIP_ERRNO;
-
-
- /* we check the magic */
- if (err==EXTRACTOR_UNZIP_OK) {
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) !=
EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
- else if (uMagic!=0x02014b50)
- err=EXTRACTOR_UNZIP_BADZIPFILE;
+ /* we check the magic */
+ if (err==EXTRACTOR_UNZIP_OK)
+ {
+ if (unzlocal_getLong(&s->z_filefunc, &uMagic) != EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
+ else if (uMagic!=0x02014b50)
+ err=EXTRACTOR_UNZIP_BADZIPFILE;
}
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) !=
EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
+ if (unzlocal_getShort (&s->z_filefunc, &file_info.version) !=
EXTRACTOR_UNZIP_OK)
+ err = EXTRACTOR_UNZIP_ERRNO;
- if (unzlocal_getShort(&s->z_filefunc,
s->filestream,&file_info.version_needed) != EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
+ if (unzlocal_getShort(&s->z_filefunc, &file_info.version_needed) !=
EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, &file_info.flag) != EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, &file_info.compression_method) !=
EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, &file_info.dosDate) !=
EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
+
+ unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
+
+ if (unzlocal_getLong(&s->z_filefunc, &file_info.crc) != EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, &file_info.compressed_size) !=
EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) !=
EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
+ if (unzlocal_getLong(&s->z_filefunc, &file_info.uncompressed_size) !=
EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, &file_info.size_filename) !=
EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, &file_info.size_file_extra) !=
EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, &file_info.size_file_comment) !=
EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
- if (unzlocal_getShort(&s->z_filefunc,
s->filestream,&file_info.compression_method) != EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
+ if (unzlocal_getShort(&s->z_filefunc, &file_info.disk_num_start) !=
EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) !=
EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
+ if (unzlocal_getShort(&s->z_filefunc, &file_info.internal_fa) !=
EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, &file_info.external_fa) !=
EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
- unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
+ if (unzlocal_getLong(&s->z_filefunc, &file_info_internal.offset_curfile) !=
EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) !=
EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- if (unzlocal_getLong(&s->z_filefunc,
s->filestream,&file_info.compressed_size) != EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- if (unzlocal_getLong(&s->z_filefunc,
s->filestream,&file_info.uncompressed_size) != EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- if (unzlocal_getShort(&s->z_filefunc,
s->filestream,&file_info.size_filename) != EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- if (unzlocal_getShort(&s->z_filefunc,
s->filestream,&file_info.size_file_extra) != EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- if (unzlocal_getShort(&s->z_filefunc,
s->filestream,&file_info.size_file_comment) != EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- if (unzlocal_getShort(&s->z_filefunc,
s->filestream,&file_info.disk_num_start) != EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- if (unzlocal_getShort(&s->z_filefunc,
s->filestream,&file_info.internal_fa) != EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa)
!= EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- if (unzlocal_getLong(&s->z_filefunc,
s->filestream,&file_info_internal.offset_curfile) != EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- lSeek+=file_info.size_filename;
- if ((err==EXTRACTOR_UNZIP_OK) && (szFileName!=NULL))
+ lSeek+=file_info.size_filename;
+ if ((err==EXTRACTOR_UNZIP_OK) && (szFileName!=NULL))
{
- uLong uSizeRead ;
- if (file_info.size_filename<fileNameBufferSize)
+ uLong uSizeRead;
+ if (file_info.size_filename<fileNameBufferSize)
{
- *(szFileName+file_info.size_filename)='\0';
- uSizeRead = file_info.size_filename;
+ *(szFileName+file_info.size_filename)='\0';
+ uSizeRead = file_info.size_filename;
}
- else
- uSizeRead = fileNameBufferSize;
-
- if ((file_info.size_filename>0) && (fileNameBufferSize>0))
- if (ZREAD(s->z_filefunc,
s->filestream,szFileName,uSizeRead)!=uSizeRead)
- err=EXTRACTOR_UNZIP_ERRNO;
- lSeek -= uSizeRead;
+ else
+ uSizeRead = fileNameBufferSize;
+
+ if ((file_info.size_filename>0) && (fileNameBufferSize>0))
+ if (ZREAD(s->z_filefunc, szFileName, uSizeRead)!=uSizeRead)
+ err=EXTRACTOR_UNZIP_ERRNO;
+ lSeek -= uSizeRead;
}
-
-
- if ((err==EXTRACTOR_UNZIP_OK) && (extraField!=NULL))
+
+
+ if ((err==EXTRACTOR_UNZIP_OK) && (extraField!=NULL))
{
- uLong uSizeRead ;
- if (file_info.size_file_extra<extraFieldBufferSize)
- uSizeRead = file_info.size_file_extra;
- else
- uSizeRead = extraFieldBufferSize;
-
- if (lSeek!=0) {
- if (ZSEEK(s->z_filefunc,
s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
- lSeek=0;
- else
- err=EXTRACTOR_UNZIP_ERRNO;
+ uLong uSizeRead ;
+ if (file_info.size_file_extra<extraFieldBufferSize)
+ uSizeRead = file_info.size_file_extra;
+ else
+ uSizeRead = extraFieldBufferSize;
+
+ if (lSeek!=0)
+ {
+ if (ZSEEK(s->z_filefunc, lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
+ lSeek=0;
+ else
+ err=EXTRACTOR_UNZIP_ERRNO;
}
- if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
- if (ZREAD(s->z_filefunc,
s->filestream,extraField,uSizeRead)!=uSizeRead)
- err=EXTRACTOR_UNZIP_ERRNO;
- lSeek += file_info.size_file_extra - uSizeRead;
+ if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
+ if (ZREAD(s->z_filefunc, extraField,uSizeRead)!=uSizeRead)
+ err=EXTRACTOR_UNZIP_ERRNO;
+ lSeek += file_info.size_file_extra - uSizeRead;
}
- else
- lSeek+=file_info.size_file_extra;
-
-
- if ((err==EXTRACTOR_UNZIP_OK) && (szComment!=NULL))
+ else
+ lSeek+=file_info.size_file_extra;
+
+
+ if ((err==EXTRACTOR_UNZIP_OK) && (szComment!=NULL))
{
- uLong uSizeRead ;
- if (file_info.size_file_comment<commentBufferSize)
+ uLong uSizeRead ;
+ if (file_info.size_file_comment<commentBufferSize)
{
- *(szComment+file_info.size_file_comment)='\0';
- uSizeRead = file_info.size_file_comment;
+ *(szComment+file_info.size_file_comment)='\0';
+ uSizeRead = file_info.size_file_comment;
}
- else
- uSizeRead = commentBufferSize;
+ else
+ uSizeRead = commentBufferSize;
- if (lSeek!=0) {
- if (ZSEEK(s->z_filefunc,
s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
- lSeek=0;
- else
- err=EXTRACTOR_UNZIP_ERRNO;
+ if (lSeek!=0)
+ {
+ if (ZSEEK(s->z_filefunc, lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
+ lSeek=0;
+ else
+ err=EXTRACTOR_UNZIP_ERRNO;
}
- if ((file_info.size_file_comment>0) && (commentBufferSize>0))
- if (ZREAD(s->z_filefunc,
s->filestream,szComment,uSizeRead)!=uSizeRead)
- err=EXTRACTOR_UNZIP_ERRNO;
- lSeek+=file_info.size_file_comment - uSizeRead;
+ if ((file_info.size_file_comment>0) && (commentBufferSize>0))
+ if (ZREAD(s->z_filefunc, szComment,uSizeRead)!=uSizeRead)
+ err=EXTRACTOR_UNZIP_ERRNO;
+ lSeek+=file_info.size_file_comment - uSizeRead;
}
- else
- lSeek+=file_info.size_file_comment;
+ else
+ lSeek+=file_info.size_file_comment;
+
+ if ((err==EXTRACTOR_UNZIP_OK) && (pfile_info!=NULL))
+ *pfile_info=file_info;
+
+ if ((err==EXTRACTOR_UNZIP_OK) && (pfile_info_internal!=NULL))
+ *pfile_info_internal=file_info_internal;
+
+ return err;
+}
- if ((err==EXTRACTOR_UNZIP_OK) && (pfile_info!=NULL))
- *pfile_info=file_info;
- if ((err==EXTRACTOR_UNZIP_OK) && (pfile_info_internal!=NULL))
- *pfile_info_internal=file_info_internal;
-
- return err;
-}
-
-/*
- Set the current file of the zipfile to the first file.
- return UNZ_OK if there is no problem
-*/
+/**
+ * Set the current file of the zipfile to the first file.
+ *
+ * @param file zipfile to manipulate
+ * @return UNZ_OK if there is no problem
+ */
int
-EXTRACTOR_common_unzip_go_to_first_file (EXTRACTOR_unzip_file file)
+EXTRACTOR_common_unzip_go_to_first_file (struct EXTRACTOR_UnzipFile *file)
{
- int err=EXTRACTOR_UNZIP_OK;
- unz_s* s;
- if (file==NULL)
- return EXTRACTOR_UNZIP_PARAMERROR;
- s=(unz_s*)file;
- s->pos_in_central_dir=s->offset_central_dir;
- s->num_file=0;
- err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
- &s->cur_file_info_internal,
- NULL,0,NULL,0,NULL,0);
- s->current_file_ok = (err == EXTRACTOR_UNZIP_OK);
- return err;
+ int err;
+
+ if (NULL == file)
+ return EXTRACTOR_UNZIP_PARAMERROR;
+ file->pos_in_central_dir = file->offset_central_dir;
+ file->num_file = 0;
+ err = unzlocal_GetCurrentFileInfoInternal (file,
+ &file->cur_file_info,
+ &file->cur_file_info_internal,
+ NULL, 0, NULL, 0, NULL, 0);
+ file->current_file_ok = (err == EXTRACTOR_UNZIP_OK);
+ return err;
}
-/*
- Open a Zip file. path contain the full pathname (by example,
- on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer
- "zlib/zlib114.zip".
- If the zipfile cannot be opened (file doesn't exist or in not valid), the
- return value is NULL.
- Else, the return value is a EXTRACTOR_unzip_file Handle, usable with
other function
- of this unzip package.
-*/
-EXTRACTOR_unzip_file
-EXTRACTOR_common_unzip_open2 (const char *path,
- EXTRACTOR_unzip_filefunc_def* pzlib_filefunc_def)
+/**
+ * Open a Zip file.
+ *
+ * @param pzlib_filefunc_def IO functions
+ * @return NULL on error
+ */
+static struct EXTRACTOR_UnzipFile *
+EXTRACTOR_common_unzip_open2 (struct EXTRACTOR_UnzipFileFuncDefs
*pzlib_filefunc_def)
{
- unz_s us;
- unz_s *s;
- uLong central_pos,uL;
+ struct EXTRACTOR_UnzipFile us;
+ struct EXTRACTOR_UnzipFile *s;
+ uLong central_pos;
+ uLong uL;
+ uLong number_disk; /* number of the current dist, used for
+ spaning ZIP, unsupported, always 0*/
+ uLong number_disk_with_CD; /* number the the disk with central dir, used
+ for spaning ZIP, unsupported, always 0*/
+ uLong number_entry_CD; /* total number of entries in
+ the central dir
+ (same than number_entry on nospan) */
+
+ int err = EXTRACTOR_UNZIP_OK;
- uLong number_disk; /* number of the current dist, used for
- spaning ZIP, unsupported, always 0*/
- uLong number_disk_with_CD; /* number the the disk with central dir, used
- for spaning ZIP, unsupported, always 0*/
- uLong number_entry_CD; /* total number of entries in
- the central dir
- (same than number_entry on nospan) */
-
- int err=EXTRACTOR_UNZIP_OK;
-
- memset (&us, 0, sizeof(us));
- us.z_filefunc = *pzlib_filefunc_def;
-
- us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque,
- path,
- ZLIB_FILEFUNC_MODE_READ |
- ZLIB_FILEFUNC_MODE_EXISTING);
- if (us.filestream==NULL)
- return NULL;
-
- central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream);
- if (central_pos==0)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- if (ZSEEK(us.z_filefunc, us.filestream,
- central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- /* the signature, already checked */
- if (unzlocal_getLong(&us.z_filefunc,
us.filestream,&uL)!=EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- /* number of this disk */
- if (unzlocal_getShort(&us.z_filefunc,
us.filestream,&number_disk)!=EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- /* number of the disk with the start of the central directory */
- if (unzlocal_getShort(&us.z_filefunc,
us.filestream,&number_disk_with_CD)!=EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- /* total number of entries in the central dir on this disk */
- if (unzlocal_getShort(&us.z_filefunc,
us.filestream,&us.gi.number_entry)!=EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- /* total number of entries in the central dir */
- if (unzlocal_getShort(&us.z_filefunc,
us.filestream,&number_entry_CD)!=EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- if ((number_entry_CD!=us.gi.number_entry) ||
- (number_disk_with_CD!=0) ||
- (number_disk!=0))
- err=EXTRACTOR_UNZIP_BADZIPFILE;
-
- /* size of the central directory */
- if (unzlocal_getLong(&us.z_filefunc,
us.filestream,&us.size_central_dir)!=EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- /* offset of start of central directory with respect to the
- starting disk number */
- if (unzlocal_getLong(&us.z_filefunc,
us.filestream,&us.offset_central_dir)!=EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- /* zipfile comment length */
- if (unzlocal_getShort(&us.z_filefunc,
us.filestream,&us.gi.size_comment)!=EXTRACTOR_UNZIP_OK)
- err=EXTRACTOR_UNZIP_ERRNO;
-
- if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
- (err==EXTRACTOR_UNZIP_OK))
- err=EXTRACTOR_UNZIP_BADZIPFILE;
-
- if (err!=EXTRACTOR_UNZIP_OK)
+ memset (&us, 0, sizeof(us));
+ us.z_filefunc = *pzlib_filefunc_def;
+
+ central_pos = unzlocal_SearchCentralDir (&us.z_filefunc);
+ if (central_pos==0)
+ err=EXTRACTOR_UNZIP_ERRNO;
+
+ if (ZSEEK(us.z_filefunc,
+ central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err=EXTRACTOR_UNZIP_ERRNO;
+
+ /* the signature, already checked */
+ if (unzlocal_getLong(&us.z_filefunc, &uL)!=EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
+
+ /* number of this disk */
+ if (unzlocal_getShort(&us.z_filefunc, &number_disk)!=EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
+
+ /* number of the disk with the start of the central directory */
+ if (unzlocal_getShort(&us.z_filefunc,
&number_disk_with_CD)!=EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
+
+ /* total number of entries in the central dir on this disk */
+ if (unzlocal_getShort(&us.z_filefunc,
&us.gi.number_entry)!=EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
+
+ /* total number of entries in the central dir */
+ if (unzlocal_getShort(&us.z_filefunc, &number_entry_CD)!=EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
+
+ if ((number_entry_CD!=us.gi.number_entry) ||
+ (number_disk_with_CD!=0) ||
+ (number_disk!=0))
+ err=EXTRACTOR_UNZIP_BADZIPFILE;
+
+ /* size of the central directory */
+ if (unzlocal_getLong(&us.z_filefunc,
&us.size_central_dir)!=EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
+
+ /* offset of start of central directory with respect to the
+ starting disk number */
+ if (unzlocal_getLong(&us.z_filefunc,
&us.offset_central_dir)!=EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
+
+ /* zipfile comment length */
+ if (unzlocal_getShort(&us.z_filefunc,
&us.gi.size_comment)!=EXTRACTOR_UNZIP_OK)
+ err=EXTRACTOR_UNZIP_ERRNO;
+
+ if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
+ (err==EXTRACTOR_UNZIP_OK))
+ err=EXTRACTOR_UNZIP_BADZIPFILE;
+
+ if (err!=EXTRACTOR_UNZIP_OK)
{
- ZCLOSE(us.z_filefunc, us.filestream);
- return NULL;
+ return NULL;
}
- us.byte_before_the_zipfile = central_pos -
- (us.offset_central_dir+us.size_central_dir);
- us.central_pos = central_pos;
- us.pfile_in_zip_read = NULL;
- us.encrypted = 0;
+ us.byte_before_the_zipfile = central_pos -
+ (us.offset_central_dir+us.size_central_dir);
+ us.central_pos = central_pos;
+ us.pfile_in_zip_read = NULL;
+ us.encrypted = 0;
+
+ if (NULL == (s = malloc (sizeof(struct EXTRACTOR_UnzipFile))))
+ return NULL;
+ *s=us;
+ EXTRACTOR_common_unzip_go_to_first_file(s);
+ return s;
+}
- s=(unz_s*)ALLOC(sizeof(unz_s));
- if (s == NULL)
- {
- ZCLOSE(us.z_filefunc, us.filestream);
- return NULL;
- }
- *s=us;
- EXTRACTOR_common_unzip_go_to_first_file((EXTRACTOR_unzip_file)s);
- return (EXTRACTOR_unzip_file)s;
-}
-
-/*
- Close the file in zip opened with unzipOpenCurrentFile
- Return EXTRACTOR_UNZIP_CRCERROR if all the file was read but the CRC is not
good
-*/
+/**
+ * Close the file in zip opened with EXTRACTOR_common_unzip_open_current_file.
+ *
+ * @return EXTRACTOR_UNZIP_CRCERROR if all the file was read but the CRC is
not good
+ */
int
-EXTRACTOR_common_unzip_close_current_file (EXTRACTOR_unzip_file file)
+EXTRACTOR_common_unzip_close_current_file (struct EXTRACTOR_UnzipFile * file)
{
int err=EXTRACTOR_UNZIP_OK;
- unz_s* s;
- file_in_zip_read_info_s* pfile_in_zip_read_info;
+ struct EXTRACTOR_UnzipFile* s;
+ struct FileInZipReadInfo* pfile_in_zip_read_info;
if (file==NULL)
return EXTRACTOR_UNZIP_PARAMERROR;
- s=(unz_s*)file;
+ s=(struct EXTRACTOR_UnzipFile*)file;
pfile_in_zip_read_info=s->pfile_in_zip_read;
if (pfile_in_zip_read_info==NULL)
return EXTRACTOR_UNZIP_PARAMERROR;
- if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&
- (!pfile_in_zip_read_info->raw))
+ if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
{
if (pfile_in_zip_read_info->crc32 !=
pfile_in_zip_read_info->crc32_wait)
err=EXTRACTOR_UNZIP_CRCERROR;
@@ -713,60 +802,79 @@
return err;
}
-/*
- Close a ZipFile opened with unzipOpen.
- If there is files inside the .Zip opened with unzipOpenCurrentFile (see
later),
- these files MUST be closed with unzipCloseCurrentFile before call
unzipClose.
- return EXTRACTOR_UNZIP_OK if there is no problem. */
-int EXTRACTOR_common_unzip_close (EXTRACTOR_unzip_file file)
+
+/**
+ * Close a ZipFile. If there is files inside the .Zip opened with
+ * EXTRACTOR_common_unzip_open_current_file, these files MUST be
+ * closed with EXTRACTOR_common_unzip_close_current_file before
+ * calling EXTRACTOR_common_unzip_close.
+ *
+ * @param file zip file to close
+ * @return EXTRACTOR_UNZIP_OK if there is no problem.
+ */
+int
+EXTRACTOR_common_unzip_close (struct EXTRACTOR_UnzipFile *file)
{
- unz_s* s;
- if (file==NULL)
- return EXTRACTOR_UNZIP_PARAMERROR;
- s=(unz_s*)file;
-
+ struct EXTRACTOR_UnzipFile* s;
+
+ if (file==NULL)
+ return EXTRACTOR_UNZIP_PARAMERROR;
+ s=(struct EXTRACTOR_UnzipFile*)file;
+
if (s->pfile_in_zip_read!=NULL)
EXTRACTOR_common_unzip_close_current_file(file);
- ZCLOSE(s->z_filefunc, s->filestream);
free(s);
return EXTRACTOR_UNZIP_OK;
}
-/*
- Write info about the ZipFile in the *pglobal_info structure.
- No preparation of the structure is needed
- return EXTRACTOR_UNZIP_OK if there is no problem.
-*/
-int EXTRACTOR_common_unzip_get_current_file_info (EXTRACTOR_unzip_file file,
- EXTRACTOR_unzip_file_info
*pfile_info,
- char *szFileName,
- uLong fileNameBufferSize,
- void *extraField,
- uLong extraFieldBufferSize,
- char *szComment,
- uLong commentBufferSize)
+/**
+ * Write info about the ZipFile in the *pglobal_info structure.
+ * No preparation of the structure is needed.
+ *
+ * @param file zipfile to manipulate
+ * @param szFileName where to write the name of the current file
+ * @param fileNameBufferSize number of bytes available in szFileName
+ * @param extraField where to write extra data
+ * @param extraFieldBufferSize number of bytes available in extraField
+ * @param szComment where to write the comment on the current file
+ * @param commentBufferSize number of bytes available in szComment
+ * @return EXTRACTOR_UNZIP_OK if there is no problem.
+ */
+int
+EXTRACTOR_common_unzip_get_current_file_info (struct EXTRACTOR_UnzipFile *
file,
+ struct EXTRACTOR_UnzipFileInfo
*pfile_info,
+ char *szFileName,
+ uLong fileNameBufferSize,
+ void *extraField,
+ uLong extraFieldBufferSize,
+ char *szComment,
+ uLong commentBufferSize)
{
- return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL,
- szFileName,fileNameBufferSize,
-
extraField,extraFieldBufferSize,
- szComment,commentBufferSize);
+ return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL,
+ szFileName,fileNameBufferSize,
+ extraField,extraFieldBufferSize,
+ szComment,commentBufferSize);
}
-/*
- Set the current file of the zipfile to the next file.
- return EXTRACTOR_UNZIP_OK if there is no problem
- return EXTRACTOR_UNZIP_END_OF_LIST_OF_FILE if the actual file was the latest.
-*/
-int EXTRACTOR_common_unzip_go_to_next_file (EXTRACTOR_unzip_file file)
+
+/**
+ * Set the current file of the zipfile to the next file.
+ *
+ * @param file zipfile to manipulate
+ * @return EXTRACTOR_UNZIP_OK if there is no problem,
+ * EXTRACTOR_UNZIP_END_OF_LIST_OF_FILE if the actual file was the
latest.
+ */
+int
+EXTRACTOR_common_unzip_go_to_next_file (struct EXTRACTOR_UnzipFile * file)
{
- unz_s* s;
+ struct EXTRACTOR_UnzipFile* s;
int err;
if (file==NULL)
return EXTRACTOR_UNZIP_PARAMERROR;
- s=(unz_s*)file;
+ s=(struct EXTRACTOR_UnzipFile*)file;
if (!s->current_file_ok)
return EXTRACTOR_UNZIP_END_OF_LIST_OF_FILE;
if (s->num_file+1==s->gi.number_entry)
@@ -783,29 +891,30 @@
}
-
-
-/*
- Try locate the file szFileName in the zipfile.
- For the iCaseSensitivity signification, see unzipStringFileNameCompare
-
- return value :
- EXTRACTOR_UNZIP_OK if the file is found. It becomes the current file.
- EXTRACTOR_UNZIP_END_OF_LIST_OF_FILE if the file is not found
-*/
-int EXTRACTOR_common_unzip_local_file (file, szFileName, iCaseSensitivity)
- EXTRACTOR_unzip_file file;
- const char *szFileName;
- int iCaseSensitivity;
+/**
+ * Try locate the file szFileName in the zipfile.
+ *
+ * @param file zipfile to manipulate
+ * @param szFileName name to find
+ * @param iCaseSensitivity, use 1 for case sensitivity (like strcmp);
+ * 2 for no case sensitivity (like strcmpi or strcasecmp); or
+ * 0 for defaut of your operating system (like 1 on Unix, 2 on Windows)
+ * @return EXTRACTOR_UNZIP_OK if the file is found. It becomes the current
file.
+ * EXTRACTOR_UNZIP_END_OF_LIST_OF_FILE if the file is not found
+ */
+int
+EXTRACTOR_common_unzip_go_find_local_file (struct EXTRACTOR_UnzipFile *file,
+ const char *szFileName,
+ int iCaseSensitivity)
{
- unz_s* s;
+ struct EXTRACTOR_UnzipFile* s;
int err;
/* We remember the 'current' position in the file so that we can jump
* back there if we fail.
*/
- EXTRACTOR_unzip_file_info cur_file_infoSaved;
- unz_file_info_internal cur_file_info_internalSaved;
+ struct EXTRACTOR_UnzipFileInfo cur_file_infoSaved;
+ struct UnzipFileInfoInternal cur_file_info_internalSaved;
uLong num_fileSaved;
uLong pos_in_central_dirSaved;
@@ -816,7 +925,7 @@
if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)
return EXTRACTOR_UNZIP_PARAMERROR;
- s=(unz_s*)file;
+ s=(struct EXTRACTOR_UnzipFile*)file;
if (!s->current_file_ok)
return EXTRACTOR_UNZIP_END_OF_LIST_OF_FILE;
@@ -837,7 +946,7 @@
if (err == EXTRACTOR_UNZIP_OK)
{
if
(EXTRACTOR_common_unzip_string_file_name_compare(szCurrentFileName,
- szFileName,iCaseSensitivity)==0)
+
szFileName,iCaseSensitivity)==0)
return EXTRACTOR_UNZIP_OK;
err = EXTRACTOR_common_unzip_go_to_next_file(file);
}
@@ -854,28 +963,28 @@
}
-/*
- Read bytes from the current file.
- buf contain buffer where data must be copied
- len the size of buf.
-
- return the number of byte copied if somes bytes are copied
- return 0 if the end of file was reached
- return <0 with error code if there is an error
- (EXTRACTOR_UNZIP_ERRNO for IO error, or zLib error for uncompress error)
-*/
-int
-EXTRACTOR_common_unzip_read_current_file (EXTRACTOR_unzip_file file,
- voidp buf,
- unsigned len)
+/**
+ * Read bytes from the current file (must have been opened).
+ *
+ * @param buf contain buffer where data must be copied
+ * @param len the size of buf.
+ * @return the number of byte copied if somes bytes are copied
+ * 0 if the end of file was reached
+ * <0 with error code if there is an error
+ * (EXTRACTOR_UNZIP_ERRNO for IO error, or zLib error for uncompress
error)
+ */
+ssize_t
+EXTRACTOR_common_unzip_read_current_file (struct EXTRACTOR_UnzipFile *file,
+ void *buf,
+ size_t len)
{
int err=EXTRACTOR_UNZIP_OK;
uInt iRead = 0;
- unz_s* s;
- file_in_zip_read_info_s* pfile_in_zip_read_info;
+ struct EXTRACTOR_UnzipFile* s;
+ struct FileInZipReadInfo* pfile_in_zip_read_info;
if (file==NULL)
return EXTRACTOR_UNZIP_PARAMERROR;
- s=(unz_s*)file;
+ s=(struct EXTRACTOR_UnzipFile*)file;
pfile_in_zip_read_info=s->pfile_in_zip_read;
if (pfile_in_zip_read_info==NULL)
@@ -906,13 +1015,11 @@
if (uReadThis == 0)
return EXTRACTOR_UNZIP_EOF;
if (ZSEEK(pfile_in_zip_read_info->z_filefunc,
- pfile_in_zip_read_info->filestream,
pfile_in_zip_read_info->pos_in_zipfile +
pfile_in_zip_read_info->byte_before_the_zipfile,
ZLIB_FILEFUNC_SEEK_SET)!=0)
return EXTRACTOR_UNZIP_ERRNO;
if (ZREAD(pfile_in_zip_read_info->z_filefunc,
- pfile_in_zip_read_info->filestream,
pfile_in_zip_read_info->read_buffer,
uReadThis)!=uReadThis)
return EXTRACTOR_UNZIP_ERRNO;
@@ -927,7 +1034,7 @@
pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
}
- if ((pfile_in_zip_read_info->compression_method==0) ||
(pfile_in_zip_read_info->raw))
+ if (pfile_in_zip_read_info->compression_method==0)
{
uInt uDoCopy,i ;
@@ -1006,7 +1113,7 @@
(filename and size of extra field data)
*/
static int
-unzlocal_CheckCurrentFileCoherencyHeader (unz_s* s,
+unzlocal_CheckCurrentFileCoherencyHeader (struct EXTRACTOR_UnzipFile* s,
uInt* piSizeVar,
uLong *poffset_local_extrafield,
uInt *psize_local_extrafield)
@@ -1020,19 +1127,19 @@
*poffset_local_extrafield = 0;
*psize_local_extrafield = 0;
- if (ZSEEK(s->z_filefunc,
s->filestream,s->cur_file_info_internal.offset_curfile +
+ if (ZSEEK(s->z_filefunc, s->cur_file_info_internal.offset_curfile +
s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
return EXTRACTOR_UNZIP_ERRNO;
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) !=
EXTRACTOR_UNZIP_OK)
+ if (unzlocal_getLong(&s->z_filefunc,&uMagic) != EXTRACTOR_UNZIP_OK)
err=EXTRACTOR_UNZIP_ERRNO;
else if (uMagic!=0x04034b50)
err=EXTRACTOR_UNZIP_BADZIPFILE;
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) !=
EXTRACTOR_UNZIP_OK)
+ if (unzlocal_getShort(&s->z_filefunc,&uData) != EXTRACTOR_UNZIP_OK)
err=EXTRACTOR_UNZIP_ERRNO;
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) !=
EXTRACTOR_UNZIP_OK)
+ if (unzlocal_getShort(&s->z_filefunc,&uFlags) != EXTRACTOR_UNZIP_OK)
err=EXTRACTOR_UNZIP_ERRNO;
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) !=
EXTRACTOR_UNZIP_OK)
+ if (unzlocal_getShort(&s->z_filefunc,&uData) != EXTRACTOR_UNZIP_OK)
err=EXTRACTOR_UNZIP_ERRNO;
else if ((err==EXTRACTOR_UNZIP_OK) &&
(uData!=s->cur_file_info.compression_method))
err=EXTRACTOR_UNZIP_BADZIPFILE;
@@ -1041,36 +1148,36 @@
(s->cur_file_info.compression_method!=Z_DEFLATED))
err=EXTRACTOR_UNZIP_BADZIPFILE;
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) !=
EXTRACTOR_UNZIP_OK) /* date/time */
+ if (unzlocal_getLong(&s->z_filefunc,&uData) != EXTRACTOR_UNZIP_OK) /*
date/time */
err=EXTRACTOR_UNZIP_ERRNO;
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) !=
EXTRACTOR_UNZIP_OK) /* crc */
+ if (unzlocal_getLong(&s->z_filefunc,&uData) != EXTRACTOR_UNZIP_OK) /* crc
*/
err=EXTRACTOR_UNZIP_ERRNO;
else if ((err==EXTRACTOR_UNZIP_OK) && (uData!=s->cur_file_info.crc) &&
((uFlags & 8)==0))
err=EXTRACTOR_UNZIP_BADZIPFILE;
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) !=
EXTRACTOR_UNZIP_OK) /* size compr */
+ if (unzlocal_getLong(&s->z_filefunc,&uData) != EXTRACTOR_UNZIP_OK) /* size
compr */
err=EXTRACTOR_UNZIP_ERRNO;
else if ((err==EXTRACTOR_UNZIP_OK) &&
(uData!=s->cur_file_info.compressed_size) &&
((uFlags & 8)==0))
err=EXTRACTOR_UNZIP_BADZIPFILE;
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) !=
EXTRACTOR_UNZIP_OK) /* size uncompr */
+ if (unzlocal_getLong(&s->z_filefunc,&uData) != EXTRACTOR_UNZIP_OK) /* size
uncompr */
err=EXTRACTOR_UNZIP_ERRNO;
else if ((err==EXTRACTOR_UNZIP_OK) &&
(uData!=s->cur_file_info.uncompressed_size) &&
((uFlags & 8)==0))
err=EXTRACTOR_UNZIP_BADZIPFILE;
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) !=
EXTRACTOR_UNZIP_OK)
+ if (unzlocal_getShort(&s->z_filefunc,&size_filename) != EXTRACTOR_UNZIP_OK)
err=EXTRACTOR_UNZIP_ERRNO;
else if ((err==EXTRACTOR_UNZIP_OK) &&
(size_filename!=s->cur_file_info.size_filename))
err=EXTRACTOR_UNZIP_BADZIPFILE;
*piSizeVar += (uInt)size_filename;
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) !=
EXTRACTOR_UNZIP_OK)
+ if (unzlocal_getShort(&s->z_filefunc,&size_extra_field) !=
EXTRACTOR_UNZIP_OK)
err=EXTRACTOR_UNZIP_ERRNO;
*poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +
SIZEZIPLOCALHEADER + size_filename;
@@ -1082,27 +1189,25 @@
}
-
-/*
- Open for reading data the current file in the zipfile.
- If there is no error and the file is opened, the return value is
EXTRACTOR_UNZIP_OK.
-*/
+/**
+ * Open for reading data the current file in the zipfile.
+ *
+ * @param file zipfile to manipulate
+ * @return EXTRACTOR_UNZIP_OK on success
+ */
int
-EXTRACTOR_common_unzip_open_current_file3 (EXTRACTOR_unzip_file file,
- int* method,
- int* level,
- int raw)
+EXTRACTOR_common_unzip_open_current_file (struct EXTRACTOR_UnzipFile *file)
{
int err=EXTRACTOR_UNZIP_OK;
uInt iSizeVar;
- unz_s* s;
- file_in_zip_read_info_s* pfile_in_zip_read_info;
+ struct EXTRACTOR_UnzipFile* s;
+ struct FileInZipReadInfo* pfile_in_zip_read_info;
uLong offset_local_extrafield; /* offset of the local extra field */
uInt size_local_extrafield; /* size of the local extra field */
if (file==NULL)
return EXTRACTOR_UNZIP_PARAMERROR;
- s=(unz_s*)file;
+ s=(struct EXTRACTOR_UnzipFile*)file;
if (!s->current_file_ok)
return EXTRACTOR_UNZIP_PARAMERROR;
@@ -1112,16 +1217,15 @@
&offset_local_extrafield,&size_local_extrafield)!=EXTRACTOR_UNZIP_OK)
return EXTRACTOR_UNZIP_BADZIPFILE;
- pfile_in_zip_read_info = (file_in_zip_read_info_s*)
- ALLOC(sizeof(file_in_zip_read_info_s));
+ pfile_in_zip_read_info = (struct FileInZipReadInfo*)
+ malloc(sizeof(struct
FileInZipReadInfo));
if (pfile_in_zip_read_info==NULL)
return EXTRACTOR_UNZIP_INTERNALERROR;
- pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);
+ pfile_in_zip_read_info->read_buffer=(char*)malloc(UNZ_BUFSIZE);
pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
pfile_in_zip_read_info->pos_local_extrafield=0;
- pfile_in_zip_read_info->raw=raw;
if (pfile_in_zip_read_info->read_buffer==NULL)
{
@@ -1131,20 +1235,6 @@
pfile_in_zip_read_info->stream_initialised=0;
- if (method!=NULL)
- *method = (int)s->cur_file_info.compression_method;
-
- if (level!=NULL)
- {
- *level = 6;
- switch (s->cur_file_info.flag & 0x06)
- {
- case 6 : *level = 1; break;
- case 4 : *level = 2; break;
- case 2 : *level = 9; break;
- }
- }
-
if ((s->cur_file_info.compression_method!=0) &&
(s->cur_file_info.compression_method!=Z_DEFLATED))
err=EXTRACTOR_UNZIP_BADZIPFILE;
@@ -1153,14 +1243,12 @@
pfile_in_zip_read_info->crc32=0;
pfile_in_zip_read_info->compression_method =
s->cur_file_info.compression_method;
- pfile_in_zip_read_info->filestream=s->filestream;
pfile_in_zip_read_info->z_filefunc=s->z_filefunc;
pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
pfile_in_zip_read_info->stream.total_out = 0;
- if ((s->cur_file_info.compression_method==Z_DEFLATED) &&
- (!raw))
+ if (s->cur_file_info.compression_method==Z_DEFLATED)
{
pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
pfile_in_zip_read_info->stream.zfree = (free_func)0;
@@ -1204,80 +1292,56 @@
return EXTRACTOR_UNZIP_OK;
}
-typedef struct Ecls {
- char * data;
- size_t size;
- size_t pos;
-} Ecls;
-voidpf EXTRACTOR_common_unzip_zlib_open_file_func (voidpf opaque,
- const char* filename,
- int mode) {
- if (0 == strcmp(filename,
- "ERROR"))
- return opaque;
- else
- return NULL;
+static uLong
+EXTRACTOR_common_unzip_zlib_read_file_func (voidpf opaque,
+ void* buf,
+ uLong size)
+{
+ struct EXTRACTOR_ExtractContext *ec = opaque;
+
+ return -1;
}
-uLong EXTRACTOR_common_unzip_zlib_read_file_func(voidpf opaque,
- voidpf stream,
- void* buf,
- uLong size) {
- Ecls * e = opaque;
- uLong ret;
- ret = e->size - e->pos;
- if (ret > size)
- ret = size;
- memcpy(buf,
- &e->data[e->pos],
- ret);
- e->pos += ret;
- return ret;
-}
+static long
+EXTRACTOR_common_unzip_zlib_tell_file_func (voidpf opaque)
+{
+ struct EXTRACTOR_ExtractContext *ec = opaque;
-long EXTRACTOR_common_unzip_zlib_tell_file_func(voidpf opaque,
- voidpf stream) {
- Ecls * e = opaque;
- return e->pos;
+ return -1;
}
-long EXTRACTOR_common_unzip_zlib_seek_file_func(voidpf opaque,
- voidpf stream,
- uLong offset,
- int origin) {
- Ecls * e = opaque;
- switch (origin) {
- case ZLIB_FILEFUNC_SEEK_SET:
- if (offset > e->size)
- return -1;
- e->pos = offset;
- break;
- case ZLIB_FILEFUNC_SEEK_END:
- if (offset > e->size)
- return -1;
- e->pos = e->size - offset;
- break;
- case ZLIB_FILEFUNC_SEEK_CUR:
- if ( (offset < - e->pos) ||
- (offset > e->size - e->pos) )
- return -1;
- e->pos += offset;
- break;
- default:
- return -1;
- }
- return 0;
+static long
+EXTRACTOR_common_unzip_zlib_seek_file_func (voidpf opaque,
+ uLong offset,
+ int origin)
+{
+ struct EXTRACTOR_ExtractContext *ec = opaque;
+
+ return -1;
}
-int EXTRACTOR_common_unzip_zlib_close_file_func(voidpf opaque,
- voidpf stream) {
- return 0;
+
+/**
+ * Open a zip file for processing using the data access
+ * functions from the extract context.
+ *
+ * @param ec extract context to use
+ * @return handle to zip data, NULL on error
+ */
+struct EXTRACTOR_UnzipFile *
+EXTRACTOR_common_unzip_open (struct EXTRACTOR_ExtractContext *ec)
+{
+ struct EXTRACTOR_UnzipFileFuncDefs io;
+
+ io.zread_file = &EXTRACTOR_common_unzip_zlib_read_file_func;
+ io.ztell_file = &EXTRACTOR_common_unzip_zlib_tell_file_func;
+ io.zseek_file = &EXTRACTOR_common_unzip_zlib_seek_file_func;
+ io.opaque = ec;
+
+ return EXTRACTOR_common_unzip_open2 (&io);
}
-int EXTRACTOR_common_unzip_zlib_testerror_file_func(voidpf opaque,
- voidpf stream) {
- return 0;
-}
+/* end of unzip.c */
Modified: Extractor/src/common/unzip.h
===================================================================
--- Extractor/src/common/unzip.h 2012-08-12 12:50:46 UTC (rev 23204)
+++ Extractor/src/common/unzip.h 2012-08-12 22:29:02 UTC (rev 23205)
@@ -1,6 +1,6 @@
-]/*
+/*
This file is part of libextractor.
- (C) 2008 Christian Grothoff (and other contributing authors)
+ (C) 2008, 2012 Christian Grothoff (and other contributing authors)
libextractor is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
@@ -17,161 +17,305 @@
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
+/**
+ * @file common/unzip.h
+ * @brief API to access ZIP archives
+ * @author Christian Grothoff
+ *
+ * This code is based in part on
+ * unzip 1.00 Copyright 1998-2003 Gilles Vollant
+ * http://www.winimage.com/zLibDll"
+ */
+#ifndef LE_COMMON_UNZIP_H
+#define LE_COMMON_UNZIP_H
-#ifndef UNZIP_H_
-#define UNZIP_H_
-
#include <zlib.h>
+/**
+ * Operation was successful.
+ */
#define EXTRACTOR_UNZIP_OK (0)
+
+/**
+ * Cannot move to next file, we are at the end
+ */
#define EXTRACTOR_UNZIP_END_OF_LIST_OF_FILE (-100)
+
+/**
+ * IO error, see errno.
+ */
#define EXTRACTOR_UNZIP_ERRNO (Z_ERRNO)
+
+/**
+ * Reached end of the file (NOTE: same as OK!)
+ */
#define EXTRACTOR_UNZIP_EOF (0)
+
+/**
+ * Invalid arguments to call.
+ */
#define EXTRACTOR_UNZIP_PARAMERROR (-102)
+
+/**
+ * Not a zip file (or malformed)
+ */
#define EXTRACTOR_UNZIP_BADZIPFILE (-103)
+
+/**
+ * Internal error.
+ */
#define EXTRACTOR_UNZIP_INTERNALERROR (-104)
+
+/**
+ * Checksum failure.
+ */
#define EXTRACTOR_UNZIP_CRCERROR (-105)
-typedef voidp EXTRACTOR_unzip_file;
+/**
+ * Handle for a ZIP archive.
+ */
+struct EXTRACTOR_UnzipFile;
-typedef struct EXTRACTOR_unzip_filefunc_def_s
+/**
+ * date/time information
+ */
+struct EXTRACTOR_UnzipDateTimeInfo
{
- voidpf ( *zopen_file) (voidpf opaque, const char* filename, int mode);
- uLong ( *zread_file) (voidpf opaque, voidpf stream, void* buf, uLong size);
- uLong ( *zwrite_file) (voidpf opaque, voidpf stream, const void* buf, uLong
size);
- long ( *ztell_file) (voidpf opaque, voidpf stream);
- long ( *zseek_file) (voidpf opaque, voidpf stream, uLong offset, int
origin);
- int ( *zclose_file) (voidpf opaque, voidpf stream);
- int ( *zerror_file) (voidpf opaque, voidpf stream);
- voidpf opaque;
-} EXTRACTOR_unzip_filefunc_def;
+ /**
+ * seconds after the minute - [0,59]
+ */
+ uInt tm_sec;
+ /**
+ * minutes after the hour - [0,59]
+ */
+ uInt tm_min;
+
+ /**
+ * hours since midnight - [0,23]
+ */
+ uInt tm_hour;
-/* tm_unz contain date/time info */
-typedef struct EXTRACTOR_unzip_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] */
-} EXTRACTOR_unzip_tm_unz;
+ /**
+ * day of the month - [1,31]
+ */
+ uInt tm_mday;
+
+ /**
+ * months since January - [0,11]
+ */
+ uInt tm_mon;
+ /**
+ * years - [1980..2044]
+ */
+ uInt tm_year;
+};
-/* unz_file_info contain information about a file in the zipfile */
-typedef struct EXTRACTOR_unzip_file_info_s
+
+/**
+ * Information about a file in the zipfile
+ */
+struct EXTRACTOR_UnzipFileInfo
{
- 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 */
+ /**
+ * version made by 2 bytes
+ */
+ uLong version;
- 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 */
+ /**
+ * version needed to extract 2 bytes
+ */
+ uLong version_needed;
- EXTRACTOR_unzip_tm_unz tmu_date;
-} EXTRACTOR_unzip_file_info;
+ /**
+ * general purpose bit flag 2 bytes
+ */
+ uLong flag;
+ /**
+ * compression method 2 bytes
+ */
+ uLong compression_method;
-int
-EXTRACTOR_common_unzip_string_file_name_compare (const char* fileName1,
- const char* fileName2,
- int iCaseSensitivity);
+ /**
+ * last mod file date in Dos fmt 4 bytes
+ */
+ uLong dosDate;
+ /**
+ * crc-32 4 bytes
+ */
+ uLong crc;
-int
-EXTRACTOR_common_unzip_go_to_first_file (EXTRACTOR_unzip_file file);
+ /**
+ * compressed size 4 bytes
+ */
+ uLong compressed_size;
+ /**
+ * uncompressed size 4 bytes
+ */
+ uLong uncompressed_size;
-EXTRACTOR_unzip_file
-EXTRACTOR_common_unzip_open2 (const char *path,
- EXTRACTOR_unzip_filefunc_def* pzlib_filefunc_def);
+ /**
+ * filename length 2 bytes
+ */
+ uLong size_filename;
+ /**
+ * extra field length 2 bytes
+ */
+ uLong size_file_extra;
-int
-EXTRACTOR_common_unzip_close_current_file (EXTRACTOR_unzip_file file);
+ /**
+ * file comment length 2 bytes
+ */
+ uLong size_file_comment;
+
+ /**
+ * disk number start 2 bytes
+ */
+ uLong disk_num_start;
+ /**
+ * internal file attributes 2 bytes
+ */
+ uLong internal_fa;
-int
-EXTRACTOR_common_unzip_close (EXTRACTOR_unzip_file file);
+ /**
+ * external file attributes 4 bytes
+ */
+ uLong external_fa;
+
+ /**
+ * Time and date of last modification.
+ */
+ struct EXTRACTOR_UnzipDateTimeInfo tmu_date;
+};
-int
-EXTRACTOR_common_unzip_get_current_file_info (EXTRACTOR_unzip_file file,
- EXTRACTOR_unzip_file_info
*pfile_info,
- char *szFileName,
- uLong fileNameBufferSize,
- void *extraField,
- uLong extraFieldBufferSize,
- char *szComment,
- uLong commentBufferSize);
+/**
+ * Open a zip file for processing using the data access
+ * functions from the extract context.
+ *
+ * @param ec extract context to use
+ * @return handle to zip data, NULL on error
+ */
+struct EXTRACTOR_UnzipFile *
+EXTRACTOR_common_unzip_open (struct EXTRACTOR_ExtractContext *ec);
+/**
+ * Close a ZipFile. If there is files inside the .Zip opened with
+ * EXTRACTOR_common_unzip_open_current_file, these files MUST be
+ * closed with EXTRACTOR_common_unzip_close_current_file before
+ * calling EXTRACTOR_common_unzip_close.
+ *
+ * @param file zip file to close
+ * @return EXTRACTOR_UNZIP_OK if there is no problem.
+ */
int
-EXTRACTOR_common_unzip_go_to_next_file (EXTRACTOR_unzip_file file);
+EXTRACTOR_common_unzip_close (struct EXTRACTOR_UnzipFile *file);
-int
-EXTRACTOR_common_unzip_local_file (EXTRACTOR_unzip_file file,
- const char *szFileName,
- int iCaseSensitivity);
-
-
+/**
+ * Set the current file of the zipfile to the first file.
+ *
+ * @param file zipfile to manipulate
+ * @return UNZ_OK if there is no problem
+ */
int
-EXTRACTOR_common_unzip_read_current_file (EXTRACTOR_unzip_file file,
- voidp buf,
- unsigned len);
+EXTRACTOR_common_unzip_go_to_first_file (struct EXTRACTOR_UnzipFile *file);
+/**
+ * Set the current file of the zipfile to the next file.
+ *
+ * @param file zipfile to manipulate
+ * @return EXTRACTOR_UNZIP_OK if there is no problem,
+ * EXTRACTOR_UNZIP_END_OF_LIST_OF_FILE if the actual file was the
latest.
+ */
int
-EXTRACTOR_common_unzip_open_current_file3 (EXTRACTOR_unzip_file file,
- int* method,
- int* level,
- int raw);
+EXTRACTOR_common_unzip_go_to_next_file (struct EXTRACTOR_UnzipFile *file);
-voidpf
-EXTRACTOR_common_unzip_zlib_open_file_func (voidpf opaque,
- const char* filename,
- int mode);
+/**
+ * Try locate the file szFileName in the zipfile.
+ *
+ * @param file zipfile to manipulate
+ * @param szFileName name to find
+ * @param iCaseSensitivity, use 1 for case sensitivity (like strcmp);
+ * 2 for no case sensitivity (like strcmpi or strcasecmp); or
+ * 0 for defaut of your operating system (like 1 on Unix, 2 on Windows)
+ * @return EXTRACTOR_UNZIP_OK if the file is found. It becomes the current
file.
+ * EXTRACTOR_UNZIP_END_OF_LIST_OF_FILE if the file is not found
+ */
+int
+EXTRACTOR_common_unzip_go_find_local_file (struct EXTRACTOR_UnzipFile *file,
+ const char *szFileName,
+ int iCaseSensitivity);
-uLong
-EXTRACTOR_common_unzip_zlib_read_file_func (voidpf opaque,
- voidpf stream,
- void* buf,
- uLong size);
+/**
+ * Write info about the ZipFile in the *pglobal_info structure.
+ * No preparation of the structure is needed.
+ *
+ * @param file zipfile to manipulate
+ * @param szFileName where to write the name of the current file
+ * @param fileNameBufferSize number of bytes available in szFileName
+ * @param extraField where to write extra data
+ * @param extraFieldBufferSize number of bytes available in extraField
+ * @param szComment where to write the comment on the current file
+ * @param commentBufferSize number of bytes available in szComment
+ * @return EXTRACTOR_UNZIP_OK if there is no problem.
+ */
+int
+EXTRACTOR_common_unzip_get_current_file_info (struct EXTRACTOR_UnzipFile *file,
+ struct EXTRACTOR_UnzipFileInfo
*pfile_info,
+ char *szFileName,
+ uLong fileNameBufferSize,
+ void *extraField,
+ uLong extraFieldBufferSize,
+ char *szComment,
+ uLong commentBufferSize);
-long
-EXTRACTOR_common_unzip_zlib_tell_file_func (voidpf opaque,
- voidpf stream);
+/**
+ * Open for reading data the current file in the zipfile.
+ *
+ * @param file zipfile to manipulate
+ * @return EXTRACTOR_UNZIP_OK on success
+ */
+int
+EXTRACTOR_common_unzip_open_current_file (struct EXTRACTOR_UnzipFile *file);
-long
-EXTRACTOR_common_unzip_zlib_seek_file_func (voidpf opaque,
- voidpf stream,
- uLong offset,
- int origin);
+/**
+ * Read bytes from the current file (must have been opened).
+ *
+ * @param buf contain buffer where data must be copied
+ * @param len the size of buf.
+ * @return the number of byte copied if somes bytes are copied
+ * 0 if the end of file was reached
+ * <0 with error code if there is an error
+ * (EXTRACTOR_UNZIP_ERRNO for IO error, or zLib error for uncompress
error)
+ */
+ssize_t
+EXTRACTOR_common_unzip_read_current_file (struct EXTRACTOR_UnzipFile *file,
+ void *buf,
+ size_t len);
-int
-EXTRACTOR_common_unzip_zlib_close_file_func (voidpf opaque,
- voidpf stream);
+/**
+ * Close the file in zip opened with EXTRACTOR_common_unzip_open_current_file.
+ *
+ * @return EXTRACTOR_UNZIP_CRCERROR if all the file was read but the CRC is
not good
+ */
+int
+EXTRACTOR_common_unzip_close_current_file (struct EXTRACTOR_UnzipFile *file);
-int
-EXTRACTOR_common_unzip_zlib_testerror_file_func (voidpf opaque,
- voidpf stream);
-
-#endif /* UNZIP_H_ */
+#endif
+/* LE_COMMON_UNZIP_H */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r23205 - Extractor/src/common,
gnunet <=