|
From: | Sebastien Metrot <address@hidden> |
Subject: | [ngl-commits] added nglIZip & nglZipFS classes. |
Date: | Mon, 17 Nov 2003 11:18:00 -0500 |
Commit from meeloo | 2003-11-17 11:17 EST |
added nglIZip & nglZipFS classes.
Module | File name | Revision | |||
---|---|---|---|---|---|
ngl | ChangeLog | 1.349 | >>> | 1.350 | |
ngl | examples.sln | 1.3 | >>> | 1.4 | |
ngl | libngl.sln | 1.8 | >>> | 1.9 | |
ngl | libngl.vcproj | 1.53 | >>> | 1.54 | |
ngl | examples/path/path.cpp | 1.12 | >>> | 1.13 | |
+ | ngl | examples/zip/Makefile.am | 1.1 | ||
+ | ngl | examples/zip/test.zip | 1.1 | ||
+ | ngl | examples/zip/zip.cpp | 1.1 | ||
+ | ngl | examples/zip/zip.dsp | 1.1 | ||
+ | ngl | examples/zip/zip.dsw | 1.1 | ||
+ | ngl | examples/zip/zip.vcproj | 1.1 | ||
+ | ngl | include/nglIZip.h | 1.1 | ||
ngl | include/nglPath.h | 1.31 | >>> | 1.32 | |
+ | ngl | include/nglZipFS.h | 1.1 | ||
+ | ngl | src/stream/nglIZip.cpp | 1.1 | ||
+ | ngl | src/stream/nglZipFS.cpp | 1.1 | ||
+ | ngl | src/zip/crypt.h | 1.1 | ||
+ | ngl | src/zip/ioapi.c | 1.1 | ||
+ | ngl | src/zip/ioapi.h | 1.1 | ||
+ | ngl | src/zip/unzip.c | 1.1 | ||
+ | ngl | src/zip/unzip.h | 1.1 | ||
+ | ngl | src/zip/zip.c | 1.1 | ||
+ | ngl | src/zip/zip.h | 1.1 |
ngl/ChangeLog 1.349 >>> 1.350 |
---|
Line 1 |
+ 2003/11/17 16:50 meeloo + - Added nglZipFS and nglIZip classes that permits to use zip archives as a stream source. + |
2003/11/9 05:32 meeloo - changed ngl.h so that font rendering macros of Windows.h are disabled! |
ngl/include/nglIZip.h 1.1 |
---|
Line 0 |
+ /* + NGL - C++ cross-platform framework for OpenGL based applications + Copyright (C) 2000-2003 NGL Team + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + /*! + \Zip nglIZip.h + \brief Zip as input Zip stream + */ + + #ifndef __nglIZip_h__ + #define __nglIZip_h__ + + #include "ngl.h" + #include "nglIStream.h" + + class nglZipFS; + + + //! Input Zip stream + /*! + This input stream is based on the nglZip API, and can be used by all objects + based on generic input streams. + */ + class NGL_API nglIZip : public nglIStream + { + public: + /** @name Destructor */ + //@{ + virtual ~nglIZip(); + //@} + + /** @name State/error methods */ + //@{ + nglStreamState GetState() const; + uint GetError() const; + const nglChar* GetErrorStr() const; + const nglChar* GetErrorStr(uint Error) const; + //@} + + /** @name Stream navigation */ + //@{ + nglSize GetPos() const; + nglSize SetPos (nglSize Where, nglStreamWhence Whence = eStreamFromStart); + nglSize Available (uint WordSize = 1); + //@} + + /** @name Input methods */ + //@{ + virtual nglSize Read (void* pData, nglSize WordCount, uint WordSize = 1); + //@} + + private: + + friend class nglZipFS; + + nglIZip(nglZipFS* pZip, void* pUnzip, nglSize size, int NumOfFile,int PosInZipDirectory); + void SetRef(void* pUnzip); + + nglZipFS* mpZip; + void* mpUnzip; + nglSize mSize; + int mNumOfFile; + int mPosInZipDirectory; + }; + + #endif // __nglIZip_h__ |
ngl/include/nglPath.h 1.31 >>> 1.32 |
---|
Line 159 |
/** @name Node operations */ //@{ |
- bool Delete(bool Recurse = false); |
+ virtual bool Delete(bool Recurse = false); |
/*!< Delete the current node, and optionally its children if any \param Recurse if the node is a folder, delete all its content (files and folders) recursively \return True if the operation completed successfully. A false return in recursive mode |
Line 167 |
Can raise errors NGL_PATH_EACCESS, NGL_PATH_EBADPATH or NGL_PATH_ETOOLONG. */ |
- bool Create(bool Recurse = true); |
+ virtual bool Create(bool Recurse = true); |
/*!< Interpret current path as a directory and create it \param Recurse create intermediate folders if necessary \return True if the operation completed successfully. A false return in recursive mode |
Line 186 |
nglString GetExtension() const; ///< Returns the file extension (without the dot), or an empty string if the path is a folder or a file without extension nglString GetParentName() const; ///< Returns the parent path as a string (remove the last node) nglPath GetParent() const; ///< Returns the parent path (remove the last node) |
- int GetChildren(std::list<nglPath>* pChildren) const; |
+ virtual int GetChildren(std::list<nglPath>* pChildren) const; |
/*!< Get node's children \param pChildren if non-null, children will be appended to this list \return Number of children. Zero usually means the node was a leaf, check errors with GetError() |
Line 203 |
/** @name Node information */ //@{ |
- bool GetInfo (nglPathInfo& rInfo) const; ///< Returns node info, see nglPathInfo - bool Exists() const; ///< Check existence of the current node - bool CanRead() const; ///< Check read/traverse access on current node - bool CanWrite() const; ///< Check write access on current node |
+ virtual bool GetInfo (nglPathInfo& rInfo) const; ///< Returns node info, see nglPathInfo + virtual bool Exists() const; ///< Check existence of the current node + virtual bool CanRead() const; ///< Check read/traverse access on current node + virtual bool CanWrite() const; ///< Check write access on current node |
bool IsLeaf() const; ///< Test wether the node is a leaf (file and assimilated) or not (folder). Calls GetInfo() internally. nglTime GetLastAccess() const; ///< Returns last (read) access time stamp. Calls GetInfo() internally. nglTime GetLastMod() const; ///< Returns last modification (write) time stamp. Calls GetInfo() internally. |
ngl/include/nglZipFS.h 1.1 |
---|
Line 0 |
+ /* + NGL - C++ cross-platform framework for OpenGL based applications + Copyright (C) 2000-2003 NGL Team + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + /*! + \Zip nglZipFS.h + \brief Zip as a virtual file system. + */ + + #include "nglStream.h" + #include "nglIStream.h" + #include "nglPath.h" + #include "nglString.h" + + class nglIZip; + class nglZipFS; + class nglZipPath; + class nglZipPrivate; + + class NGL_API nglZipPath : public nglPath + { + public: + nglZipPath(const nglZipFS* pZipFS, const nglString& rPathInZip = ""); + nglZipPath(const nglZipPath& rPath); + + virtual bool Delete(bool Recurse = false); + virtual bool Create(bool Recurse = true); + virtual int GetChildren(std::list<nglPath>* pChildren) const; + virtual int GetChildren(std::list<nglZipPath>* pChildren) const; + virtual bool GetInfo (nglPathInfo& rInfo) const; ///< Returns node info, see nglPathInfo + virtual bool Exists() const; ///< Check existence of the current node + virtual bool CanRead() const; ///< Check read/traverse access on current node + virtual bool CanWrite() const; ///< Check write access on current node + + static bool Decompose(const nglPath& rPath, std::list<nglPath>& rList); ///< Create a list of recursive node path from the given complete path: If you give /truc/machin/prout.zip you will get a list with three elements: truc, machin and prout.zip. + + private: + const nglZipFS* mpZipFS; + }; + + class NGL_API nglZipFS + { + public: + nglZipFS(nglIStream* pStream, bool Own = true); ///< Create a Zip FS from a stream. + nglZipFS(const nglPath& rPath); ///< Create a Zip FS from a file. + + virtual ~nglZipFS(); + + bool Open(); + + bool CanWrite() const; + bool CanRead() const; + + bool GetInfo (const nglZipPath& rPath, nglPathInfo& rInfo) const; ///< Returns node info, see nglPathInfo + int GetChildren(const nglZipPath& rPath, std::list<nglZipPath>& rList) const; ///< Populate the list with the children of the given path node in the zip. + + nglIZip* GetStream(const nglZipPath& rPath); ///< Return a stream that can read the file pointed to by rPath in the Zip FS. + private: + // Direct File Operations: + bool Close(void* pUnzip); + nglStreamState GetState(void* pUnzip) const; + uint GetError(void* pUnzip) const; + + nglSize GetPos(void* pUnzip) const; + nglSize SetPos (void* pUnzip, nglSize Where, nglIZip* pFile); ///< Set the pos in the zip file from start + nglSize Available (void* pUnzip, uint WordSize = 1); + + nglSize Read (void* pUnzip, void* pData, nglSize WordCount, uint WordSize, nglEndian Endian); + + // Data: + + nglIStream* mpStream; + bool mOwnStream; + + friend class nglZipPath; + friend class nglIZip; + + nglZipPrivate* mpPrivate; + + // Needed to build an index of the zip: + class Node + { + public: + Node(const nglString& rPath, uint Size, uint Pos, uint Num, bool IsLeaf); + virtual ~Node(); + Node* Find(const nglPath& rPath) const; ///< Find the child node that correspond to the given path. + Node* Find(const nglString& rNodeName) const; ///< Find the child node that have the given node name + bool AddChild(Node* pPath); + private: + std::list<Node*> mpChildren; + uint mSize; + uint mPosInZipDirectory; /* offset in zip file directory */ + uint mNumOfFile; /* # of file */ + bool mIsLeaf; + nglString mName; + + friend class nglZipFS; + }; + + Node mRoot; ///< The zip file's root directory... + + bool BuildIndex(); ///< Build the internal ZIP directory + }; + |
ngl/src/zip/crypt.h 1.1 |
---|
Line 0 |
+ /* crypt.h -- IO for compress .zip files using zlib + Version 0.22, May 19th, 2003 + + Copyright (C) 1998-2003 Gilles Vollant + + This unzip package allow creates .ZIP file, compatible with PKZip 2.04g + WinZip, InfoZip tools and compatible. + Encryption and multi volume ZipFile (span) are not supported. + Old compressions used by old PKZip 1.x are not supported + + For uncompress .zip file, look at unzip.h + + + I WAIT FEEDBACK at mail address@hidden + Visit also http://www.winimage.com/zLibDll/unzip.html for evolution + + 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. + + + */ + + /* for more info about .ZIP format, see + http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip + http://www.info-zip.org/pub/infozip/doc/ + PkWare has also a specification at : + ftp://ftp.pkware.com/probdesc.zip + */ + + + #define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) + + /*********************************************************************** + * 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 + + #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(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting) + 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; + + /* 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++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); + buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); + return n; + } + + #endif |
ngl/src/zip/ioapi.h 1.1 |
---|
Line 0 |
+ /* ioapi.h -- IO base function header for compress/uncompress .zip + files using zlib + zip or unzip API + + Version 0.22, May 19th, 2003 + + Copyright (C) 1998-2003 Gilles Vollant + + This unzip package allow creates .ZIP file, compatible with PKZip 2.04g + WinZip, InfoZip tools and compatible. + Encryption and multi volume ZipFile (span) are not supported. + Old compressions used by old PKZip 1.x are not supported + + For uncompress .zip file, look at unzip.h + + + I WAIT FEEDBACK at mail address@hidden + Visit also http://www.winimage.com/zLibDll/unzip.html for evolution + + 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. + + + */ + + + #ifndef _ZLIBIOAPI_H + #define _ZLIBIOAPI_H + + + #define ZLIB_FILEFUNC_SEEK_CUR (1) + #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) + + + #ifndef ZCALLBACK + + #if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) + #define ZCALLBACK CALLBACK + #else + #define ZCALLBACK + #endif + #endif + + #ifdef __cplusplus + extern "C" { + #endif + + typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, 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 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 int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); + typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); + + typedef struct zlib_filefunc_def_s + { + open_file_func zopen_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell_file_func ztell_file; + seek_file_func zseek_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; + } zlib_filefunc_def; + + + + void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); + + #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)) + + + #ifdef __cplusplus + } + #endif + + #endif + |
ngl/src/zip/unzip.h 1.1 |
---|
Line 0 |
+ /* unzip.h -- IO for uncompress .zip files using zlib + Version 0.22, May 19th, 2003 + + Copyright (C) 1998-2003 Gilles Vollant + + This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g + WinZip, InfoZip tools and compatible. + Encryption and multi volume ZipFile (span) are not supported. + Old compressions used by old PKZip 1.x are not supported + + + I WAIT FEEDBACK at mail address@hidden + Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution + + 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. + + + */ + + /* for more info about .ZIP format, see + http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip + http://www.info-zip.org/pub/infozip/doc/ + PkWare has also a specification at : + ftp://ftp.pkware.com/probdesc.zip + */ + + #ifndef _unz_H + #define _unz_H + + #ifdef __cplusplus + extern "C" { + #endif + + #ifndef _ZLIB_H + #include "zlib.h" + #endif + + #ifndef _ZLIBIOAPI_H + #include "ioapi.h" + #endif + + #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; + #else + typedef voidp unzFile; + #endif + + + #define UNZ_OK (0) + #define UNZ_END_OF_LIST_OF_FILE (-100) + #define UNZ_ERRNO (Z_ERRNO) + #define UNZ_EOF (0) + #define UNZ_PARAMERROR (-102) + #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; + + /* 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 + { + 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; + + + /* unz_file_info contain information about a file in the zipfile */ + 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 */ + + 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 */ + + tm_unz tmu_date; + } unz_file_info; + + extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, + const char* fileName2, + int iCaseSensitivity)); + /* + 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) + */ + + + extern unzFile ZEXPORT unzOpen OF((const char *path)); + /* + Open a Zip file. path contain the full pathname (by example, + on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer + "zlib/zlib113.zip". + If the zipfile cannot be opened (file don't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. + */ + + extern unzFile ZEXPORT unzOpen2 OF((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 the zip file (see ioapi.h) + */ + + extern int ZEXPORT unzClose OF((unzFile file)); + /* + Close a ZipFile opened with unzipOpen. + If there is files inside the .Zip opened with unzOpenCurrentFile (see later), + these files MUST be closed with unzipCloseCurrentFile before call unzipClose. + return UNZ_OK if there is no problem. */ + + extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, + unz_global_info *pglobal_info)); + /* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ + + + extern int ZEXPORT unzGetGlobalComment OF((unzFile file, + char *szComment, + uLong uSizeBuf)); + /* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 + */ + + + /***************************************************************************/ + /* Unzip package allow you browse the directory of the zipfile */ + + extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); + /* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem + */ + + extern int ZEXPORT unzGoToNextFile OF((unzFile file)); + /* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. + */ + + extern int ZEXPORT unzLocateFile OF((unzFile file, + const char *szFileName, + int iCaseSensitivity)); + /* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found + */ + + + /* ****************************************** */ + /* Ryan supplied functions */ + /* unz_file_info contain information about a file in the zipfile */ + typedef struct unz_file_pos_s + { + uLong pos_in_zip_directory; /* offset in zip file directory */ + uLong num_of_file; /* # of file */ + } unz_file_pos; + + extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos); + + extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos); + + /* ****************************************** */ + + extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + /* + Get Info about the current file + if pfile_info!=NULL, the *pfile_info structure will contain somes info about + the current file + if szFileName!=NULL, the filemane string will be copied in szFileName + (fileNameBufferSize is the size of the buffer) + if extraField!=NULL, the extra field information will be copied in extraField + (extraFieldBufferSize is the size of the buffer). + This is the Central-header version of the extra field + if szComment!=NULL, the comment string of the file will be copied in szComment + (commentBufferSize is the size of the buffer) + */ + + /***************************************************************************/ + /* for 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)); + /* + Open for reading data the current file in the zipfile. + If there is no error, the return value is UNZ_OK. + */ + + extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, + const char* password)); + /* + Open for reading data the current file in the zipfile. + password is a crypting password + If there is no error, the return value is UNZ_OK. + */ + + extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, + int* method, + int* level, + int raw)); + /* + Same than 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)); + /* + Same than 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 unzCloseCurrentFile OF((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 + */ + + extern int ZEXPORT unzReadCurrentFile OF((unzFile file, + voidp buf, + unsigned len)); + /* + Read bytes from the current file (opened by unzOpenCurrentFile) + 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 + (UNZ_ERRNO for IO error, or zLib error for uncompress error) + */ + + extern z_off_t ZEXPORT unztell OF((unzFile file)); + /* + Give the current position in uncompressed data + */ + + extern int ZEXPORT unzeof OF((unzFile file)); + /* + return 1 if the end of file was reached, 0 elsewhere + */ + + extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, + voidp buf, + unsigned 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) + + 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 + */ + + /* + Get a reference to the current file we are operating on in the zip + */ + extern voidp ZEXPORT unzGetCurrentFile (unzFile file); + + /* + Set the current file we are operating on in the zip + */ + extern int ZEXPORT unzSetCurrentFile (unzFile file, + voidp _file); + + + #ifdef __cplusplus + } + #endif + + #endif /* _unz_H */ |
ngl/src/zip/zip.h 1.1 |
---|
Line 0 |
+ /* zip.h -- IO for compress .zip files using zlib + Version 0.22, May 19th, 2003 + + Copyright (C) 1998-2003 Gilles Vollant + + This unzip package allow creates .ZIP file, compatible with PKZip 2.04g + WinZip, InfoZip tools and compatible. + Encryption and multi volume ZipFile (span) are not supported. + Old compressions used by old PKZip 1.x are not supported + + For uncompress .zip file, look at unzip.h + + + I WAIT FEEDBACK at mail address@hidden + Visit also http://www.winimage.com/zLibDll/unzip.html for evolution + + 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. + + + */ + + /* for more info about .ZIP format, see + http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip + http://www.info-zip.org/pub/infozip/doc/ + PkWare has also a specification at : + ftp://ftp.pkware.com/probdesc.zip + */ + + #ifndef _zip_H + #define _zip_H + + #ifdef __cplusplus + extern "C" { + #endif + + #ifndef _ZLIB_H + #include "zlib.h" + #endif + + #ifndef _ZLIBIOAPI_H + #include "ioapi.h" + #endif + + #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; + #else + typedef voidp zipFile; + #endif + + #define ZIP_OK (0) + #define ZIP_EOF (0) + #define ZIP_ERRNO (Z_ERRNO) + #define ZIP_PARAMERROR (-102) + #define ZIP_BADZIPFILE (-103) + #define ZIP_INTERNALERROR (-104) + + #ifndef DEF_MEM_LEVEL + # if MAX_MEM_LEVEL >= 8 + # define DEF_MEM_LEVEL 8 + # else + # 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 flag; */ /* general purpose bit flag 2 bytes */ + + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong 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) + + extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); + /* + Create a zipfile. + pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on + an Unix computer "zlib/zlib113.zip". + if the file pathname 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 zip (be sure you don't add file that doesn't exist) + If the zipfile cannot be opened, the return value is NULL. + Else, the return value is a zipFile Handle, usable with other function + of this zip package. + */ + + /* 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 couse, you can use RAW reading and writing to copy the file you did not want delte + */ + + extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc_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)); + /* + Open a file in the ZIP for writing. + filename : the filename in zip (if NULL, '-' without quote will be used + *zipfi contain supplemental information + if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local + contains the extrafield data the the local header + if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global + contains the extrafield data the the local header + if comment != NULL, comment contain the comment string + method contain the compression method (0 for store, Z_DEFLATED for deflate) + level contain the level of compression (can be Z_DEFAULT_COMPRESSION) + */ + + + 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)); + + /* + Same than zipOpenNewFileInZip, except if raw=1, we write raw file + */ + + 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 crcForCtypting)); + + /* + Same than zipOpenNewFileInZip2, except + windowBits,memLevel,,strategy : see parameter strategy in deflateInit2 + password : crypting password (NULL for no crypting) + crcForCtypting : crc of file to compress (needed for crypting) + */ + + + extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, + const void* buf, + unsigned len)); + /* + Write data in the zipfile + */ + + extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); + /* + Close the current file in the zipfile + */ + + + extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, + uLong uncompressed_size, + uLong crc32)); + /* + Close the current file in the zipfile, for fiel opened with + parameter raw=1 in zipOpenNewFileInZip2 + uncompressed_size and crc32 are value for the uncompressed size + */ + + extern int ZEXPORT zipClose OF((zipFile file, + const char* global_comment)); + /* + Close the zipfile + */ + + #ifdef __cplusplus + } + #endif + + #endif /* _zip_H */ |
[Prev in Thread] | Current Thread | [Next in Thread] |