00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 #include "pent_include.h"
00040 #define NOUNCRYPT
00041 
00042 #include <stdio.h>
00043 #include <stdlib.h>
00044 #include <string.h>
00045 #include "zlib.h"
00046 #include "unzip.h"
00047 
00048 #ifdef STDC
00049 #  include <stddef.h>
00050 #  include <string.h>
00051 #  include <stdlib.h>
00052 #endif
00053 #ifdef NO_ERRNO_H
00054     extern int errno;
00055 #else
00056 #   include <errno.h>
00057 #endif
00058 
00059 
00060 
00061 #ifndef local
00062 #  define local static
00063 #endif
00064 
00065 
00066 
00067 #ifndef CASESENSITIVITYDEFAULT_NO
00068 #  if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
00069 #    define CASESENSITIVITYDEFAULT_NO
00070 #  endif
00071 #endif
00072 
00073 
00074 #ifndef UNZ_BUFSIZE
00075 #define UNZ_BUFSIZE (16384)
00076 #endif
00077 
00078 #ifndef UNZ_MAXFILENAMEINZIP
00079 #define UNZ_MAXFILENAMEINZIP (256)
00080 #endif
00081 
00082 #ifndef ALLOC
00083 # define ALLOC(size) (malloc(size))
00084 #endif
00085 #ifndef TRYFREE
00086 # define TRYFREE(p) {if (p) free(p);}
00087 #endif
00088 
00089 #define SIZECENTRALDIRITEM (0x2e)
00090 #define SIZEZIPLOCALHEADER (0x1e)
00091 
00092 namespace PentZip {
00093 
00094 
00095 const char unz_copyright[] =
00096    " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
00097 
00098 
00099 typedef struct unz_file_info_internal_s
00100 {
00101     uLong offset_curfile;
00102 } unz_file_info_internal;
00103 
00104 
00105 
00106 
00107 typedef struct
00108 {
00109     char  *read_buffer;         
00110     z_stream stream;            
00111 
00112     uLong pos_in_zipfile;       
00113     uLong stream_initialised;   
00114 
00115     uLong offset_local_extrafield;
00116     uInt  size_local_extrafield;
00117     uLong pos_local_extrafield;   
00118 
00119     uLong crc32;                
00120     uLong crc32_wait;           
00121     uLong rest_read_compressed; 
00122     uLong rest_read_uncompressed;
00123     zlib_filefunc_def z_filefunc;
00124     voidpf filestream;        
00125     uLong compression_method;   
00126     uLong byte_before_the_zipfile;
00127     int   raw;
00128 } file_in_zip_read_info_s;
00129 
00130 
00131 
00132 
00133 typedef struct
00134 {
00135     zlib_filefunc_def z_filefunc;
00136     voidpf filestream;        
00137     unz_global_info gi;       
00138     uLong byte_before_the_zipfile;
00139     uLong num_file;             
00140     uLong pos_in_central_dir;   
00141     uLong current_file_ok;      
00142     uLong central_pos;          
00143 
00144     uLong size_central_dir;     
00145     uLong offset_central_dir;   
00146 
00147 
00148     unz_file_info cur_file_info; 
00149     unz_file_info_internal cur_file_info_internal; 
00150     file_in_zip_read_info_s* pfile_in_zip_read; 
00151 
00152     int encrypted;
00153 #    ifndef NOUNCRYPT
00154     unsigned long keys[3];     
00155     const unsigned long* pcrc_32_tab;
00156 #    endif
00157 } unz_s;
00158 
00159 
00160 #ifndef NOUNCRYPT
00161 #include "crypt.h"
00162 #endif
00163 
00164 
00165 
00166 
00167 
00168 
00169 
00170 
00171 local int unzlocal_getByte OF((
00172     const zlib_filefunc_def* pzlib_filefunc_def,
00173     voidpf filestream,
00174     int *pi));
00175 
00176 local int unzlocal_getByte(const zlib_filefunc_def* pzlib_filefunc_def,
00177                                                    voidpf filestream, int *pi)
00178 {
00179     unsigned char c;
00180     int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1);
00181     if (err==1)
00182     {
00183         *pi = (int)c;
00184         return UNZ_OK;
00185     }
00186     else
00187     {
00188         if (ZERROR(*pzlib_filefunc_def,filestream))
00189             return UNZ_ERRNO;
00190         else
00191             return UNZ_EOF;
00192     }
00193 }
00194 
00195 
00196 
00197 
00198 
00199 local int unzlocal_getShort OF((
00200     const zlib_filefunc_def* pzlib_filefunc_def,
00201     voidpf filestream,
00202     uLong *pX));
00203 
00204 local int unzlocal_getShort (const zlib_filefunc_def* pzlib_filefunc_def,
00205                                                          voidpf filestream, uLong *pX)
00206 {
00207     uLong x ;
00208     int i;
00209     int err;
00210 
00211     err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
00212     x = (uLong)i;
00213 
00214     if (err==UNZ_OK)
00215         err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
00216     x += ((uLong)i)<<8;
00217 
00218     if (err==UNZ_OK)
00219         *pX = x;
00220     else
00221         *pX = 0;
00222     return err;
00223 }
00224 
00225 local int unzlocal_getLong OF((
00226     const zlib_filefunc_def* pzlib_filefunc_def,
00227     voidpf filestream,
00228     uLong *pX));
00229 
00230 local int unzlocal_getLong (const zlib_filefunc_def* pzlib_filefunc_def,
00231                                                         voidpf filestream, uLong *pX)
00232 {
00233     uLong x ;
00234     int i;
00235     int err;
00236 
00237     err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
00238     x = (uLong)i;
00239 
00240     if (err==UNZ_OK)
00241         err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
00242     x += ((uLong)i)<<8;
00243 
00244     if (err==UNZ_OK)
00245         err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
00246     x += ((uLong)i)<<16;
00247 
00248     if (err==UNZ_OK)
00249         err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
00250     x += ((uLong)i)<<24;
00251 
00252     if (err==UNZ_OK)
00253         *pX = x;
00254     else
00255         *pX = 0;
00256     return err;
00257 }
00258 
00259 
00260 
00261 local int strcmpcasenosensitive_internal (const char* fileName1,
00262                                                                                   const char* fileName2)
00263 {
00264     for (;;)
00265     {
00266         char c1=*(fileName1++);
00267         char c2=*(fileName2++);
00268         if ((c1>='a') && (c1<='z'))
00269             c1 -= 0x20;
00270         if ((c2>='a') && (c2<='z'))
00271             c2 -= 0x20;
00272         if (c1=='\0')
00273             return ((c2=='\0') ? 0 : -1);
00274         if (c2=='\0')
00275             return 1;
00276         if (c1<c2)
00277             return -1;
00278         if (c1>c2)
00279             return 1;
00280     }
00281 }
00282 
00283 
00284 #ifdef  CASESENSITIVITYDEFAULT_NO
00285 #define CASESENSITIVITYDEFAULTVALUE 2
00286 #else
00287 #define CASESENSITIVITYDEFAULTVALUE 1
00288 #endif
00289 
00290 #ifndef STRCMPCASENOSENTIVEFUNCTION
00291 #define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
00292 #endif
00293 
00294 
00295 
00296 
00297 
00298 
00299 
00300 
00301 
00302 
00303 extern int ZEXPORT unzStringFileNameCompare (const char* fileName1,
00304                                                                                          const char* fileName2,
00305                                                                                          int iCaseSensitivity)
00306 {
00307     if (iCaseSensitivity==0)
00308         iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
00309 
00310     if (iCaseSensitivity==1)
00311         return strcmp(fileName1,fileName2);
00312 
00313     return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
00314 }
00315 
00316 #ifndef BUFREADCOMMENT
00317 #define BUFREADCOMMENT (0x400)
00318 #endif
00319 
00320 
00321 
00322 
00323 
00324 local uLong unzlocal_SearchCentralDir OF((
00325     const zlib_filefunc_def* pzlib_filefunc_def,
00326     voidpf filestream));
00327 
00328 local uLong unzlocal_SearchCentralDir(const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream)
00329 {
00330     unsigned char* buf;
00331     uLong uSizeFile;
00332     uLong uBackRead;
00333     uLong uMaxBack=0xffff; 
00334     uLong uPosFound=0;
00335 
00336     if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
00337         return 0;
00338 
00339 
00340     uSizeFile = ZTELL(*pzlib_filefunc_def,filestream);
00341 
00342     if (uMaxBack>uSizeFile)
00343         uMaxBack = uSizeFile;
00344 
00345     buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
00346     if (buf==NULL)
00347         return 0;
00348 
00349     uBackRead = 4;
00350     while (uBackRead<uMaxBack)
00351     {
00352         uLong uReadSize,uReadPos ;
00353         int i;
00354         if (uBackRead+BUFREADCOMMENT>uMaxBack)
00355             uBackRead = uMaxBack;
00356         else
00357             uBackRead+=BUFREADCOMMENT;
00358         uReadPos = uSizeFile-uBackRead ;
00359 
00360         uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
00361                      (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);
00362         if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
00363             break;
00364 
00365         if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
00366             break;
00367 
00368         for (i=(int)uReadSize-3; (i--)>0;)
00369             if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
00370                 ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
00371             {
00372                 uPosFound = uReadPos+i;
00373                 break;
00374             }
00375 
00376         if (uPosFound!=0)
00377             break;
00378     }
00379     TRYFREE(buf);
00380     return uPosFound;
00381 }
00382 
00383 
00384 
00385 
00386 
00387 
00388 
00389 
00390 
00391 
00392 extern unzFile ZEXPORT unzOpen2 (const char *path,
00393                                                                  zlib_filefunc_def* pzlib_filefunc_def)
00394 {
00395     unz_s us;
00396     unz_s *s;
00397     uLong central_pos,uL;
00398 
00399     uLong number_disk;          
00400 
00401     uLong number_disk_with_CD;  
00402 
00403     uLong number_entry_CD;      
00404 
00405 
00406 
00407     int err=UNZ_OK;
00408 
00409     if (unz_copyright[0]!=' ')
00410         return NULL;
00411 
00412     if (pzlib_filefunc_def==NULL)
00413         fill_fopen_filefunc(&us.z_filefunc);
00414     else
00415         us.z_filefunc = *pzlib_filefunc_def;
00416 
00417     us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque,
00418                                                  path,
00419                                                  ZLIB_FILEFUNC_MODE_READ |
00420                                                  ZLIB_FILEFUNC_MODE_EXISTING);
00421     if (us.filestream==NULL)
00422         return NULL;
00423 
00424     central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream);
00425     if (central_pos==0)
00426         err=UNZ_ERRNO;
00427 
00428     if (ZSEEK(us.z_filefunc, us.filestream,
00429                                       central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
00430         err=UNZ_ERRNO;
00431 
00432     
00433     if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
00434         err=UNZ_ERRNO;
00435 
00436     
00437     if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
00438         err=UNZ_ERRNO;
00439 
00440     
00441     if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
00442         err=UNZ_ERRNO;
00443 
00444     
00445     if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK)
00446         err=UNZ_ERRNO;
00447 
00448     
00449     if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK)
00450         err=UNZ_ERRNO;
00451 
00452     if ((number_entry_CD!=us.gi.number_entry) ||
00453         (number_disk_with_CD!=0) ||
00454         (number_disk!=0))
00455         err=UNZ_BADZIPFILE;
00456 
00457     
00458     if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK)
00459         err=UNZ_ERRNO;
00460 
00461     
00462 
00463     if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK)
00464         err=UNZ_ERRNO;
00465 
00466     
00467     if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK)
00468         err=UNZ_ERRNO;
00469 
00470     if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
00471         (err==UNZ_OK))
00472         err=UNZ_BADZIPFILE;
00473 
00474     if (err!=UNZ_OK)
00475     {
00476         ZCLOSE(us.z_filefunc, us.filestream);
00477         return NULL;
00478     }
00479 
00480     us.byte_before_the_zipfile = central_pos -
00481                             (us.offset_central_dir+us.size_central_dir);
00482     us.central_pos = central_pos;
00483     us.pfile_in_zip_read = NULL;
00484     us.encrypted = 0;
00485 
00486 
00487     s=(unz_s*)ALLOC(sizeof(unz_s));
00488     *s=us;
00489     unzGoToFirstFile((unzFile)s);
00490     return (unzFile)s;
00491 }
00492 
00493 
00494 extern unzFile ZEXPORT unzOpen (const char *path)
00495 {
00496     return unzOpen2(path, NULL);
00497 }
00498 
00499 
00500 
00501 
00502 
00503 
00504 extern int ZEXPORT unzClose (unzFile file)
00505 {
00506     unz_s* s;
00507     if (file==NULL)
00508         return UNZ_PARAMERROR;
00509     s=(unz_s*)file;
00510 
00511     if (s->pfile_in_zip_read!=NULL)
00512         unzCloseCurrentFile(file);
00513 
00514     ZCLOSE(s->z_filefunc, s->filestream);
00515     TRYFREE(s);
00516     return UNZ_OK;
00517 }
00518 
00519 
00520 
00521 
00522 
00523 
00524 extern int ZEXPORT unzGetGlobalInfo (unzFile file,
00525                                                                          unz_global_info *pglobal_info)
00526 {
00527     unz_s* s;
00528     if (file==NULL)
00529         return UNZ_PARAMERROR;
00530     s=(unz_s*)file;
00531     *pglobal_info=s->gi;
00532     return UNZ_OK;
00533 }
00534 
00535 
00536 
00537 
00538 
00539 local void unzlocal_DosDateToTmuDate (uLong ulDosDate, tm_unz* ptm)
00540 {
00541     uLong uDate;
00542     uDate = (uLong)(ulDosDate>>16);
00543     ptm->tm_mday = (uInt)(uDate&0x1f) ;
00544     ptm->tm_mon =  (uInt)((((uDate)&0x1E0)/0x20)-1) ;
00545     ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;
00546 
00547     ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);
00548     ptm->tm_min =  (uInt) ((ulDosDate&0x7E0)/0x20) ;
00549     ptm->tm_sec =  (uInt) (2*(ulDosDate&0x1f)) ;
00550 }
00551 
00552 
00553 
00554 
00555 local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file,
00556                                                   unz_file_info *pfile_info,
00557                                                   unz_file_info_internal
00558                                                   *pfile_info_internal,
00559                                                   char *szFileName,
00560                                                   uLong fileNameBufferSize,
00561                                                   void *extraField,
00562                                                   uLong extraFieldBufferSize,
00563                                                   char *szComment,
00564                                                   uLong commentBufferSize));
00565 
00566 local int unzlocal_GetCurrentFileInfoInternal (unzFile file,
00567                                                                                            unz_file_info *pfile_info,
00568                                                                                            unz_file_info_internal *pfile_info_internal,
00569                                                                                            char *szFileName,
00570                                                                                            uLong fileNameBufferSize,
00571                                                                                            void *extraField,
00572                                                                                            uLong extraFieldBufferSize,
00573                                                                                            char *szComment,
00574                                                                                            uLong commentBufferSize)
00575 {
00576     unz_s* s;
00577     unz_file_info file_info;
00578     unz_file_info_internal file_info_internal;
00579     int err=UNZ_OK;
00580     uLong uMagic;
00581     long lSeek=0;
00582 
00583     if (file==NULL)
00584         return UNZ_PARAMERROR;
00585     s=(unz_s*)file;
00586     if (ZSEEK(s->z_filefunc, s->filestream,
00587               s->pos_in_central_dir+s->byte_before_the_zipfile,
00588               ZLIB_FILEFUNC_SEEK_SET)!=0)
00589         err=UNZ_ERRNO;
00590 
00591 
00592     
00593     if (err==UNZ_OK)
00594         if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
00595             err=UNZ_ERRNO;
00596         else if (uMagic!=0x02014b50)
00597             err=UNZ_BADZIPFILE;
00598 
00599     if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK)
00600         err=UNZ_ERRNO;
00601 
00602     if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK)
00603         err=UNZ_ERRNO;
00604 
00605     if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK)
00606         err=UNZ_ERRNO;
00607 
00608     if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK)
00609         err=UNZ_ERRNO;
00610 
00611     if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK)
00612         err=UNZ_ERRNO;
00613 
00614     unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
00615 
00616     if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK)
00617         err=UNZ_ERRNO;
00618 
00619     if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)
00620         err=UNZ_ERRNO;
00621 
00622     if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
00623         err=UNZ_ERRNO;
00624 
00625     if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK)
00626         err=UNZ_ERRNO;
00627 
00628     if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK)
00629         err=UNZ_ERRNO;
00630 
00631     if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK)
00632         err=UNZ_ERRNO;
00633 
00634     if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK)
00635         err=UNZ_ERRNO;
00636 
00637     if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK)
00638         err=UNZ_ERRNO;
00639 
00640     if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK)
00641         err=UNZ_ERRNO;
00642 
00643     if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)
00644         err=UNZ_ERRNO;
00645 
00646     lSeek+=file_info.size_filename;
00647     if ((err==UNZ_OK) && (szFileName!=NULL))
00648     {
00649         uLong uSizeRead ;
00650         if (file_info.size_filename<fileNameBufferSize)
00651         {
00652             *(szFileName+file_info.size_filename)='\0';
00653             uSizeRead = file_info.size_filename;
00654         }
00655         else
00656             uSizeRead = fileNameBufferSize;
00657 
00658         if ((file_info.size_filename>0) && (fileNameBufferSize>0))
00659             if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead)
00660                 err=UNZ_ERRNO;
00661         lSeek -= uSizeRead;
00662     }
00663 
00664 
00665     if ((err==UNZ_OK) && (extraField!=NULL))
00666     {
00667         uLong uSizeRead ;
00668         if (file_info.size_file_extra<extraFieldBufferSize)
00669             uSizeRead = file_info.size_file_extra;
00670         else
00671             uSizeRead = extraFieldBufferSize;
00672 
00673         if (lSeek!=0)
00674             if (ZSEEK(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
00675                 lSeek=0;
00676             else
00677                 err=UNZ_ERRNO;
00678         if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
00679             if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead)
00680                 err=UNZ_ERRNO;
00681         lSeek += file_info.size_file_extra - uSizeRead;
00682     }
00683     else
00684         lSeek+=file_info.size_file_extra;
00685 
00686 
00687     if ((err==UNZ_OK) && (szComment!=NULL))
00688     {
00689         uLong uSizeRead ;
00690         if (file_info.size_file_comment<commentBufferSize)
00691         {
00692             *(szComment+file_info.size_file_comment)='\0';
00693             uSizeRead = file_info.size_file_comment;
00694         }
00695         else
00696             uSizeRead = commentBufferSize;
00697 
00698         if (lSeek!=0)
00699             if (ZSEEK(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
00700                 lSeek=0;
00701             else
00702                 err=UNZ_ERRNO;
00703         if ((file_info.size_file_comment>0) && (commentBufferSize>0))
00704             if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead)
00705                 err=UNZ_ERRNO;
00706         lSeek+=file_info.size_file_comment - uSizeRead;
00707     }
00708     else
00709         lSeek+=file_info.size_file_comment;
00710 
00711     if ((err==UNZ_OK) && (pfile_info!=NULL))
00712         *pfile_info=file_info;
00713 
00714     if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
00715         *pfile_info_internal=file_info_internal;
00716 
00717     return err;
00718 }
00719 
00720 
00721 
00722 
00723 
00724 
00725 
00726 
00727 extern int ZEXPORT unzGetCurrentFileInfo (unzFile file,
00728                                                                                   unz_file_info *pfile_info,
00729                                                                                   char *szFileName,
00730                                                                                   uLong fileNameBufferSize,
00731                                                                                   void *extraField,
00732                                                                                   uLong extraFieldBufferSize,
00733                                                                                   char *szComment,
00734                                                                                   uLong commentBufferSize)
00735 {
00736     return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL,
00737                                                 szFileName,fileNameBufferSize,
00738                                                 extraField,extraFieldBufferSize,
00739                                                 szComment,commentBufferSize);
00740 }
00741 
00742 
00743 
00744 
00745 
00746 extern int ZEXPORT unzGoToFirstFile (unzFile file)
00747 {
00748     int err=UNZ_OK;
00749     unz_s* s;
00750     if (file==NULL)
00751         return UNZ_PARAMERROR;
00752     s=(unz_s*)file;
00753     s->pos_in_central_dir=s->offset_central_dir;
00754     s->num_file=0;
00755     err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
00756                                              &s->cur_file_info_internal,
00757                                              NULL,0,NULL,0,NULL,0);
00758     s->current_file_ok = (err == UNZ_OK);
00759     return err;
00760 }
00761 
00762 
00763 
00764 
00765 
00766 
00767 extern int ZEXPORT unzGoToNextFile (unzFile file)
00768 {
00769     unz_s* s;
00770     int err;
00771 
00772     if (file==NULL)
00773         return UNZ_PARAMERROR;
00774     s=(unz_s*)file;
00775     if (!s->current_file_ok)
00776         return UNZ_END_OF_LIST_OF_FILE;
00777     if (s->gi.number_entry != 0xffff)    
00778       if (s->num_file+1==s->gi.number_entry)
00779         return UNZ_END_OF_LIST_OF_FILE;
00780 
00781     s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
00782             s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ;
00783     s->num_file++;
00784     err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
00785                                                &s->cur_file_info_internal,
00786                                                NULL,0,NULL,0,NULL,0);
00787     s->current_file_ok = (err == UNZ_OK);
00788     return err;
00789 }
00790 
00791 
00792 
00793 
00794 
00795 
00796 
00797 
00798 
00799 
00800 extern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName,
00801                                                                   int iCaseSensitivity)
00802 {
00803     unz_s* s;
00804     int err;
00805 
00806     
00807 
00808 
00809     unz_file_info cur_file_infoSaved;
00810     unz_file_info_internal cur_file_info_internalSaved;
00811     uLong num_fileSaved;
00812     uLong pos_in_central_dirSaved;
00813 
00814 
00815     if (file==NULL)
00816         return UNZ_PARAMERROR;
00817 
00818     if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)
00819         return UNZ_PARAMERROR;
00820 
00821     s=(unz_s*)file;
00822     if (!s->current_file_ok)
00823         return UNZ_END_OF_LIST_OF_FILE;
00824 
00825     
00826     num_fileSaved = s->num_file;
00827     pos_in_central_dirSaved = s->pos_in_central_dir;
00828     cur_file_infoSaved = s->cur_file_info;
00829     cur_file_info_internalSaved = s->cur_file_info_internal;
00830 
00831     err = unzGoToFirstFile(file);
00832 
00833     while (err == UNZ_OK)
00834     {
00835         char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
00836         err = unzGetCurrentFileInfo(file,NULL,
00837                                     szCurrentFileName,sizeof(szCurrentFileName)-1,
00838                                     NULL,0,NULL,0);
00839         if (err == UNZ_OK)
00840         {
00841             if (unzStringFileNameCompare(szCurrentFileName,
00842                                             szFileName,iCaseSensitivity)==0)
00843                 return UNZ_OK;
00844             err = unzGoToNextFile(file);
00845         }
00846     }
00847 
00848     
00849 
00850 
00851     s->num_file = num_fileSaved ;
00852     s->pos_in_central_dir = pos_in_central_dirSaved ;
00853     s->cur_file_info = cur_file_infoSaved;
00854     s->cur_file_info_internal = cur_file_info_internalSaved;
00855     return err;
00856 }
00857 
00858 
00859 
00861 
00862 
00863 
00864 
00865 
00866 
00867 
00868 
00869 
00870 
00871 
00872 
00873 
00874 
00875 
00876 
00877 extern int ZEXPORT unzGetFilePos(unzFile file, unz_file_pos* file_pos)
00878 {
00879     unz_s* s;
00880 
00881     if (file==NULL || file_pos==NULL)
00882         return UNZ_PARAMERROR;
00883     s=(unz_s*)file;
00884     if (!s->current_file_ok)
00885         return UNZ_END_OF_LIST_OF_FILE;
00886 
00887     file_pos->pos_in_zip_directory  = s->pos_in_central_dir;
00888     file_pos->num_of_file           = s->num_file;
00889 
00890     return UNZ_OK;
00891 }
00892 
00893 extern int ZEXPORT unzGoToFilePos(unzFile file, unz_file_pos* file_pos)
00894 {
00895     unz_s* s;
00896     int err;
00897 
00898     if (file==NULL || file_pos==NULL)
00899         return UNZ_PARAMERROR;
00900     s=(unz_s*)file;
00901 
00902     
00903     s->pos_in_central_dir = file_pos->pos_in_zip_directory;
00904     s->num_file           = file_pos->num_of_file;
00905 
00906     
00907     err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
00908                                                &s->cur_file_info_internal,
00909                                                NULL,0,NULL,0,NULL,0);
00910     
00911     s->current_file_ok = (err == UNZ_OK);
00912     return err;
00913 }
00914 
00915 
00916 
00918 
00919 
00920 
00921 
00922 
00923 
00924 
00925 
00926 
00927 local int unzlocal_CheckCurrentFileCoherencyHeader (unz_s* s,
00928                                                                                                         uInt* piSizeVar,
00929                                                                                                         uLong *poffset_local_extrafield,
00930                                                                                                         uInt  *psize_local_extrafield)
00931 {
00932     uLong uMagic,uData,uFlags;
00933     uLong size_filename;
00934     uLong size_extra_field;
00935     int err=UNZ_OK;
00936 
00937     *piSizeVar = 0;
00938     *poffset_local_extrafield = 0;
00939     *psize_local_extrafield = 0;
00940 
00941     if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile +
00942                                 s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
00943         return UNZ_ERRNO;
00944 
00945 
00946     if (err==UNZ_OK)
00947         if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
00948             err=UNZ_ERRNO;
00949         else if (uMagic!=0x04034b50)
00950             err=UNZ_BADZIPFILE;
00951 
00952     if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
00953         err=UNZ_ERRNO;
00954 
00955 
00956 
00957 
00958     if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK)
00959         err=UNZ_ERRNO;
00960 
00961     if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
00962         err=UNZ_ERRNO;
00963     else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))
00964         err=UNZ_BADZIPFILE;
00965 
00966     if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) &&
00967                          (s->cur_file_info.compression_method!=Z_DEFLATED))
00968         err=UNZ_BADZIPFILE;
00969 
00970     if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) 
00971         err=UNZ_ERRNO;
00972 
00973     if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) 
00974         err=UNZ_ERRNO;
00975     else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) &&
00976                               ((uFlags & 8)==0))
00977         err=UNZ_BADZIPFILE;
00978 
00979     if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) 
00980         err=UNZ_ERRNO;
00981     else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) &&
00982                               ((uFlags & 8)==0))
00983         err=UNZ_BADZIPFILE;
00984 
00985     if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) 
00986         err=UNZ_ERRNO;
00987     else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) &&
00988                               ((uFlags & 8)==0))
00989         err=UNZ_BADZIPFILE;
00990 
00991 
00992     if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK)
00993         err=UNZ_ERRNO;
00994     else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))
00995         err=UNZ_BADZIPFILE;
00996 
00997     *piSizeVar += (uInt)size_filename;
00998 
00999     if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK)
01000         err=UNZ_ERRNO;
01001     *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +
01002                                     SIZEZIPLOCALHEADER + size_filename;
01003     *psize_local_extrafield = (uInt)size_extra_field;
01004 
01005     *piSizeVar += (uInt)size_extra_field;
01006 
01007     return err;
01008 }
01009 
01010 
01011 
01012 
01013 
01014 extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, int* level,
01015                                                                                 int raw, const char* password)
01016 {
01017     int err=UNZ_OK;
01018     uInt iSizeVar;
01019     unz_s* s;
01020     file_in_zip_read_info_s* pfile_in_zip_read_info;
01021     uLong offset_local_extrafield;  
01022     uInt  size_local_extrafield;    
01023 #    ifndef NOUNCRYPT
01024     char source[12];
01025 #    else
01026     if (password != NULL)
01027         return UNZ_PARAMERROR;
01028 #    endif
01029 
01030     if (file==NULL)
01031         return UNZ_PARAMERROR;
01032     s=(unz_s*)file;
01033     if (!s->current_file_ok)
01034         return UNZ_PARAMERROR;
01035 
01036     if (s->pfile_in_zip_read != NULL)
01037         unzCloseCurrentFile(file);
01038 
01039     if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar,
01040                 &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)
01041         return UNZ_BADZIPFILE;
01042 
01043     pfile_in_zip_read_info = (file_in_zip_read_info_s*)
01044                                         ALLOC(sizeof(file_in_zip_read_info_s));
01045     if (pfile_in_zip_read_info==NULL)
01046         return UNZ_INTERNALERROR;
01047 
01048     pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);
01049     pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
01050     pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
01051     pfile_in_zip_read_info->pos_local_extrafield=0;
01052     pfile_in_zip_read_info->raw=raw;
01053 
01054     if (pfile_in_zip_read_info->read_buffer==NULL)
01055     {
01056         TRYFREE(pfile_in_zip_read_info);
01057         return UNZ_INTERNALERROR;
01058     }
01059 
01060     pfile_in_zip_read_info->stream_initialised=0;
01061 
01062     if (method!=NULL)
01063         *method = (int)s->cur_file_info.compression_method;
01064 
01065     if (level!=NULL)
01066     {
01067         *level = 6;
01068         switch (s->cur_file_info.flag & 0x06)
01069         {
01070           case 6 : *level = 1; break;
01071           case 4 : *level = 2; break;
01072           case 2 : *level = 9; break;
01073         }
01074     }
01075 
01076     if ((s->cur_file_info.compression_method!=0) &&
01077         (s->cur_file_info.compression_method!=Z_DEFLATED))
01078         err=UNZ_BADZIPFILE;
01079 
01080     pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;
01081     pfile_in_zip_read_info->crc32=0;
01082     pfile_in_zip_read_info->compression_method =
01083             s->cur_file_info.compression_method;
01084     pfile_in_zip_read_info->filestream=s->filestream;
01085     pfile_in_zip_read_info->z_filefunc=s->z_filefunc;
01086     pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
01087 
01088     pfile_in_zip_read_info->stream.total_out = 0;
01089 
01090     if ((s->cur_file_info.compression_method==Z_DEFLATED) &&
01091         (!raw))
01092     {
01093       pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
01094       pfile_in_zip_read_info->stream.zfree = (free_func)0;
01095       pfile_in_zip_read_info->stream.opaque = (voidpf)0;
01096       pfile_in_zip_read_info->stream.next_in = (Bytef*)0;
01097       pfile_in_zip_read_info->stream.avail_in = 0;
01098 
01099       err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
01100       if (err == Z_OK)
01101         pfile_in_zip_read_info->stream_initialised=1;
01102       else
01103         return err;
01104         
01105 
01106 
01107 
01108 
01109 
01110 
01111     }
01112     pfile_in_zip_read_info->rest_read_compressed =
01113             s->cur_file_info.compressed_size ;
01114     pfile_in_zip_read_info->rest_read_uncompressed =
01115             s->cur_file_info.uncompressed_size ;
01116 
01117 
01118     pfile_in_zip_read_info->pos_in_zipfile =
01119             s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +
01120               iSizeVar;
01121 
01122     pfile_in_zip_read_info->stream.avail_in = (uInt)0;
01123 
01124     s->pfile_in_zip_read = pfile_in_zip_read_info;
01125 
01126 #    ifndef NOUNCRYPT
01127     if (password != NULL)
01128     {
01129         int i;
01130         s->pcrc_32_tab = get_crc_table();
01131         init_keys(password,s->keys,s->pcrc_32_tab);
01132         if (ZSEEK(s->z_filefunc, s->filestream,
01133                   s->pfile_in_zip_read->pos_in_zipfile +
01134                      s->pfile_in_zip_read->byte_before_the_zipfile,
01135                   SEEK_SET)!=0)
01136             return UNZ_INTERNALERROR;
01137         if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12)
01138             return UNZ_INTERNALERROR;
01139 
01140         for (i = 0; i<12; i++)
01141             zdecode(s->keys,s->pcrc_32_tab,source[i]);
01142 
01143         s->pfile_in_zip_read->pos_in_zipfile+=12;
01144         s->encrypted=1;
01145     }
01146 #    endif
01147 
01148 
01149     return UNZ_OK;
01150 }
01151 
01152 extern int ZEXPORT unzOpenCurrentFile (unzFile file)
01153 {
01154     return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
01155 }
01156 
01157 extern int ZEXPORT unzOpenCurrentFilePassword (unzFile file,
01158                                                                                            const char* password)
01159 {
01160     return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
01161 }
01162 
01163 extern int ZEXPORT unzOpenCurrentFile2 (unzFile file, int* method,
01164                                                                                 int* level, int raw)
01165 {
01166     return unzOpenCurrentFile3(file, method, level, raw, NULL);
01167 }
01168 
01169 
01170 
01171 
01172 
01173 
01174 
01175 
01176 
01177 
01178 
01179 extern int ZEXPORT unzReadCurrentFile  (unzFile file, voidp buf, unsigned len)
01180 {
01181     int err=UNZ_OK;
01182     uInt iRead = 0;
01183     unz_s* s;
01184     file_in_zip_read_info_s* pfile_in_zip_read_info;
01185     if (file==NULL)
01186         return UNZ_PARAMERROR;
01187     s=(unz_s*)file;
01188     pfile_in_zip_read_info=s->pfile_in_zip_read;
01189 
01190     if (pfile_in_zip_read_info==NULL)
01191         return UNZ_PARAMERROR;
01192 
01193 
01194     if ((pfile_in_zip_read_info->read_buffer == NULL))
01195         return UNZ_END_OF_LIST_OF_FILE;
01196     if (len==0)
01197         return 0;
01198 
01199     pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;
01200 
01201     pfile_in_zip_read_info->stream.avail_out = (uInt)len;
01202 
01203     if ((len>pfile_in_zip_read_info->rest_read_uncompressed) &&
01204         (!(pfile_in_zip_read_info->raw)))
01205         pfile_in_zip_read_info->stream.avail_out =
01206             (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
01207 
01208     if ((len>pfile_in_zip_read_info->rest_read_compressed+
01209            pfile_in_zip_read_info->stream.avail_in) &&
01210          (pfile_in_zip_read_info->raw))
01211         pfile_in_zip_read_info->stream.avail_out =
01212             (uInt)pfile_in_zip_read_info->rest_read_compressed+
01213             pfile_in_zip_read_info->stream.avail_in;
01214 
01215     while (pfile_in_zip_read_info->stream.avail_out>0)
01216     {
01217         if ((pfile_in_zip_read_info->stream.avail_in==0) &&
01218             (pfile_in_zip_read_info->rest_read_compressed>0))
01219         {
01220             uInt uReadThis = UNZ_BUFSIZE;
01221             if (pfile_in_zip_read_info->rest_read_compressed<uReadThis)
01222                 uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;
01223             if (uReadThis == 0)
01224                 return UNZ_EOF;
01225             if (ZSEEK(pfile_in_zip_read_info->z_filefunc,
01226                       pfile_in_zip_read_info->filestream,
01227                       pfile_in_zip_read_info->pos_in_zipfile +
01228                          pfile_in_zip_read_info->byte_before_the_zipfile,
01229                          ZLIB_FILEFUNC_SEEK_SET)!=0)
01230                 return UNZ_ERRNO;
01231             if (ZREAD(pfile_in_zip_read_info->z_filefunc,
01232                       pfile_in_zip_read_info->filestream,
01233                       pfile_in_zip_read_info->read_buffer,
01234                       uReadThis)!=uReadThis)
01235                 return UNZ_ERRNO;
01236 
01237 
01238 #            ifndef NOUNCRYPT
01239             if(s->encrypted)
01240             {
01241                 uInt i;
01242                 for(i=0;i<uReadThis;i++)
01243                   pfile_in_zip_read_info->read_buffer[i] =
01244                       zdecode(s->keys,s->pcrc_32_tab,
01245                               pfile_in_zip_read_info->read_buffer[i]);
01246             }
01247 #            endif
01248 
01249 
01250             pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
01251 
01252             pfile_in_zip_read_info->rest_read_compressed-=uReadThis;
01253 
01254             pfile_in_zip_read_info->stream.next_in =
01255                 (Bytef*)pfile_in_zip_read_info->read_buffer;
01256             pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
01257         }
01258 
01259         if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw))
01260         {
01261             uInt uDoCopy,i ;
01262 
01263             if ((pfile_in_zip_read_info->stream.avail_in == 0) &&
01264                 (pfile_in_zip_read_info->rest_read_compressed == 0))
01265                 return (iRead==0) ? UNZ_EOF : iRead;
01266 
01267             if (pfile_in_zip_read_info->stream.avail_out <
01268                             pfile_in_zip_read_info->stream.avail_in)
01269                 uDoCopy = pfile_in_zip_read_info->stream.avail_out ;
01270             else
01271                 uDoCopy = pfile_in_zip_read_info->stream.avail_in ;
01272 
01273             for (i=0;i<uDoCopy;i++)
01274                 *(pfile_in_zip_read_info->stream.next_out+i) =
01275                         *(pfile_in_zip_read_info->stream.next_in+i);
01276 
01277             pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
01278                                 pfile_in_zip_read_info->stream.next_out,
01279                                 uDoCopy);
01280             pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;
01281             pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
01282             pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
01283             pfile_in_zip_read_info->stream.next_out += uDoCopy;
01284             pfile_in_zip_read_info->stream.next_in += uDoCopy;
01285             pfile_in_zip_read_info->stream.total_out += uDoCopy;
01286             iRead += uDoCopy;
01287         }
01288         else
01289         {
01290             uLong uTotalOutBefore,uTotalOutAfter;
01291             const Bytef *bufBefore;
01292             uLong uOutThis;
01293             int flush=Z_SYNC_FLUSH;
01294 
01295             uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
01296             bufBefore = pfile_in_zip_read_info->stream.next_out;
01297 
01298             
01299 
01300 
01301 
01302 
01303 
01304             err=inflate(&pfile_in_zip_read_info->stream,flush);
01305 
01306             if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL))
01307               err = Z_DATA_ERROR;
01308 
01309             uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
01310             uOutThis = uTotalOutAfter-uTotalOutBefore;
01311 
01312             pfile_in_zip_read_info->crc32 =
01313                 crc32(pfile_in_zip_read_info->crc32,bufBefore,
01314                         (uInt)(uOutThis));
01315 
01316             pfile_in_zip_read_info->rest_read_uncompressed -=
01317                 uOutThis;
01318 
01319             iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
01320 
01321             if (err==Z_STREAM_END)
01322                 return (iRead==0) ? UNZ_EOF : iRead;
01323             if (err!=Z_OK)
01324                 break;
01325         }
01326     }
01327 
01328     if (err==Z_OK)
01329         return iRead;
01330     return err;
01331 }
01332 
01333 
01334 
01335 
01336 
01337 extern z_off_t ZEXPORT unztell (unzFile file)
01338 {
01339     unz_s* s;
01340     file_in_zip_read_info_s* pfile_in_zip_read_info;
01341     if (file==NULL)
01342         return UNZ_PARAMERROR;
01343     s=(unz_s*)file;
01344     pfile_in_zip_read_info=s->pfile_in_zip_read;
01345 
01346     if (pfile_in_zip_read_info==NULL)
01347         return UNZ_PARAMERROR;
01348 
01349     return (z_off_t)pfile_in_zip_read_info->stream.total_out;
01350 }
01351 
01352 
01353 
01354 
01355 
01356 extern int ZEXPORT unzeof (unzFile file)
01357 {
01358     unz_s* s;
01359     file_in_zip_read_info_s* pfile_in_zip_read_info;
01360     if (file==NULL)
01361         return UNZ_PARAMERROR;
01362     s=(unz_s*)file;
01363     pfile_in_zip_read_info=s->pfile_in_zip_read;
01364 
01365     if (pfile_in_zip_read_info==NULL)
01366         return UNZ_PARAMERROR;
01367 
01368     if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
01369         return 1;
01370     else
01371         return 0;
01372 }
01373 
01374 
01375 
01376 
01377 
01378 
01379 
01380 
01381 
01382 
01383 
01384 
01385 
01386 
01387 
01388 extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf,
01389                                                                                   unsigned len)
01390 {
01391     unz_s* s;
01392     file_in_zip_read_info_s* pfile_in_zip_read_info;
01393     uInt read_now;
01394     uLong size_to_read;
01395 
01396     if (file==NULL)
01397         return UNZ_PARAMERROR;
01398     s=(unz_s*)file;
01399     pfile_in_zip_read_info=s->pfile_in_zip_read;
01400 
01401     if (pfile_in_zip_read_info==NULL)
01402         return UNZ_PARAMERROR;
01403 
01404     size_to_read = (pfile_in_zip_read_info->size_local_extrafield -
01405                 pfile_in_zip_read_info->pos_local_extrafield);
01406 
01407     if (buf==NULL)
01408         return (int)size_to_read;
01409 
01410     if (len>size_to_read)
01411         read_now = (uInt)size_to_read;
01412     else
01413         read_now = (uInt)len ;
01414 
01415     if (read_now==0)
01416         return 0;
01417 
01418     if (ZSEEK(pfile_in_zip_read_info->z_filefunc,
01419               pfile_in_zip_read_info->filestream,
01420               pfile_in_zip_read_info->offset_local_extrafield +
01421               pfile_in_zip_read_info->pos_local_extrafield,
01422               ZLIB_FILEFUNC_SEEK_SET)!=0)
01423         return UNZ_ERRNO;
01424 
01425     if (ZREAD(pfile_in_zip_read_info->z_filefunc,
01426               pfile_in_zip_read_info->filestream,
01427               buf,read_now)!=read_now)
01428         return UNZ_ERRNO;
01429 
01430     return (int)read_now;
01431 }
01432 
01433 
01434 
01435 
01436 
01437 extern int ZEXPORT unzCloseCurrentFile (unzFile file)
01438 {
01439     int err=UNZ_OK;
01440 
01441     unz_s* s;
01442     file_in_zip_read_info_s* pfile_in_zip_read_info;
01443     if (file==NULL)
01444         return UNZ_PARAMERROR;
01445     s=(unz_s*)file;
01446     pfile_in_zip_read_info=s->pfile_in_zip_read;
01447 
01448     if (pfile_in_zip_read_info==NULL)
01449         return UNZ_PARAMERROR;
01450 
01451 
01452     if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&
01453         (!pfile_in_zip_read_info->raw))
01454     {
01455         if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
01456             err=UNZ_CRCERROR;
01457     }
01458 
01459 
01460     TRYFREE(pfile_in_zip_read_info->read_buffer);
01461     pfile_in_zip_read_info->read_buffer = NULL;
01462     if (pfile_in_zip_read_info->stream_initialised)
01463         inflateEnd(&pfile_in_zip_read_info->stream);
01464 
01465     pfile_in_zip_read_info->stream_initialised = 0;
01466     TRYFREE(pfile_in_zip_read_info);
01467 
01468     s->pfile_in_zip_read=NULL;
01469 
01470     return err;
01471 }
01472 
01473 
01474 
01475 
01476 
01477 
01478 
01479 extern int ZEXPORT unzGetGlobalComment (unzFile file, char *szComment,
01480                                                                                 uLong uSizeBuf)
01481 {
01482     
01483     unz_s* s;
01484     uLong uReadThis ;
01485     if (file==NULL)
01486         return UNZ_PARAMERROR;
01487     s=(unz_s*)file;
01488 
01489     uReadThis = uSizeBuf;
01490     if (uReadThis>s->gi.size_comment)
01491         uReadThis = s->gi.size_comment;
01492 
01493     if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0)
01494         return UNZ_ERRNO;
01495 
01496     if (uReadThis>0)
01497     {
01498       *szComment='\0';
01499       if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis)
01500         return UNZ_ERRNO;
01501     }
01502 
01503     if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))
01504         *(szComment+s->gi.size_comment)='\0';
01505     return (int)uReadThis;
01506 }
01507 
01508 
01509 extern uLong ZEXPORT unzGetOffset (unzFile file)
01510 {
01511     unz_s* s;
01512 
01513     if (file==NULL)
01514           return (uLong)UNZ_PARAMERROR;
01515     s=(unz_s*)file;
01516     if (!s->current_file_ok)
01517       return 0;
01518     if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff)
01519       if (s->num_file==s->gi.number_entry)
01520          return 0;
01521     return s->pos_in_central_dir;
01522 }
01523 
01524 extern int ZEXPORT unzSetOffset (unzFile file, uLong pos)
01525 {
01526     unz_s* s;
01527     int err;
01528 
01529     if (file==NULL)
01530         return UNZ_PARAMERROR;
01531     s=(unz_s*)file;
01532 
01533     s->pos_in_central_dir = pos;
01534     s->num_file = s->gi.number_entry;      
01535     err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
01536                                               &s->cur_file_info_internal,
01537                                               NULL,0,NULL,0,NULL,0);
01538     s->current_file_ok = (err == UNZ_OK);
01539     return err;
01540 }
01541 
01542 
01543 }