Subversion Repositories autosfx

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 daniel-mar 1
//---------------------------------------------------------------------------
2
 
3
#ifndef UnzOpH
4
#define UnzOpH
5
/*
6
 
7
  Copyright (c) 1990-2007 Info-ZIP.  All rights reserved.
8
 
9
  See the accompanying file LICENSE, version 2007-Mar-4 or later
10
  (the contents of which are also included in zip.h) for terms of use.
11
  If, for some reason, all these files are missing, the Info-ZIP license
12
  also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
13
 
14
  parts Copyright (C) 1997 Mike White, Eric W. Engler
15
************************************************************************
16
 Copyright (C) 2009, 2010  by Russell J. Peters, Roger Aelbrecht
17
 
18
   This file is part of TZipMaster Version 1.9.
19
 
20
    TZipMaster is free software: you can redistribute it and/or modify
21
    it under the terms of the GNU Lesser General Public License as published by
22
    the Free Software Foundation, either version 3 of the License, or
23
    (at your option) any later version.
24
 
25
    TZipMaster is distributed in the hope that it will be useful,
26
    but WITHOUT ANY WARRANTY; without even the implied warranty of
27
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
28
    GNU Lesser General Public License for more details.
29
 
30
    You should have received a copy of the GNU Lesser General Public License
31
    along with TZipMaster.  If not, see <http://www.gnu.org/licenses/>.
32
 
33
    contact: problems@delphizip.org (include ZipMaster in the subject).
34
    updates: http://www.delphizip.org
35
    DelphiZip maillist subscribe at http://www.freelists.org/list/delphizip
36
************************************************************************/
37
 
38
// #include "unzerr.h"
39
#include "dzraw.h"
40
#include "dzoper.h"
41
#include "unzsup.h"
42
#include "unzinf.h"
43
 
44
#define SKIP              0     /* choice of activities for do_string() */
45
#define DISPLAY           1
46
#define DISPL_8           5     /* Display file comment (ext. ASCII)    */
47
#define DS_FN             2
48
#define EXTRA_FIELD       3
49
#define DS_EF             3
50
 
51
#define DOES_NOT_EXIST    -1    /* return values for check_for_newer() */
52
#define EXISTS_AND_OLDER  0
53
#define EXISTS_AND_NEWER  1
54
 
55
#define ROOT              0     /* checkdir() extract-to path:  called once */
56
#define INIT              1     /* allocate buildpath:  called once per member */
57
#define APPEND_DIR        2     /* append a dir comp.:  many times per member */
58
#define APPEND_NAME       3     /* append actual filename:  once per member */
59
#define GETPATH           4     /* retrieve the complete path and free it */
60
#define END               5     /* free root path prior to exiting program */
61
 
62
//----------------------------------------------------------
63
 
64
/* version_made_by codes (central dir):  make sure these */
65
 
66
/*  are not defined on their respective systems!! */
67
//----------------------------------------------------------
68
#define FS_FAT_           0     /* filesystem used by MS-DOS, OS/2, Win32 */
69
#define AMIGA_            1
70
#define VMS_              2
71
#define UNIX_             3
72
#define VM_CMS_           4
73
#define ATARI_            5     /* what if it's a minix filesystem? [cjh]     */
74
#define FS_HPFS_          6     /* filesystem used by OS/2, NT                */
75
#define MAC_              7
76
#define Z_SYSTEM_         8
77
#define CPM_              9
78
#define TOPS20_           10
79
#define FS_NTFS_          11    /* filesystem used by Windows NT              */
80
#define QDOS_MAYBE_       12    /* a bit premature, but somebody once started */
81
#define ACORN_            13    /* Archimedes Acorn RISC OS                   */
82
#define FS_VFAT_          14    /* filesystem used by Windows 95, NT          */
83
#define MVS_              15
84
#define BEBOX_            16
85
#define TANDEM_           17    /* Tandem/NSK                                 */
86
#define NUM_HOSTS         18    /* index of last system + 1                   */
87
 
88
#define STORED            0     /* compression methods                        */
89
#define SHRUNK            1
90
#define REDUCED1          2
91
#define REDUCED2          3
92
#define REDUCED3          4
93
#define REDUCED4          5
94
#define IMPLODED          6
95
#define TOKENIZED         7
96
#define DEFLATED          8
97
#define ENHDEFLATED       9
98
#define DCLIMPLODED      10
99
//#define NUM_METHODS       9     /* index of last method + 1 */
100
//#define PKRESMOD11       11
101
//#define BZIPPED          12
102
//#define NUM_METHODS      13    /* index of last method + 1 */
103
 
104
/* don't forget to update //list_files() appropriately if NUM_METHODS changes */
105
 
106
/* 9 and 10 not yet implemented */
107
 
108
/* extra-field ID values, little-endian: */
109
#define EF_AV        0x0007     /* PKWARE's authenticity verification */
110
#define EF_OS2       0x0009     /* OS/2 extended attributes */
111
#define EF_PKVMS     0x000c     /* PKWARE's VMS */
112
#define EF_PKUNIX    0x000d     /* PKWARE's Unix */
113
#define EF_IZVMS     0x4d49     /* Info-ZIP's VMS ("IM") */
114
#define EF_IZUNIX    0x5855     /* Info-ZIP's old Unix[1] ("UX") */
115
#define EF_IZUNIX2   0x7855     /* Info-ZIP's new Unix[2] ("Ux") */
116
#define EF_TIME      0x5455     /* universal timestamp ("UT") */
117
#define EF_JLMAC     0x07c8     /* Johnny Lee's old Macintosh (= 1992) */
118
#define EF_ZIPIT     0x2605     /* Thomas Brown's Macintosh (ZipIt) */
119
#define EF_VMCMS     0x4704     /* Info-ZIP's VM/CMS ("\004G") */
120
#define EF_MVS       0x470f     /* Info-ZIP's MVS ("\017G") */
121
#define EF_ACL       0x4c41     /* (OS/2) access control list ("AL") */
122
#define EF_NTSD      0x4453     /* NT security descriptor ("SD") */
123
#define EF_BEOS      0x6542     /* BeOS ("Be") */
124
#define EF_QDOS      0xfb4a     /* SMS/QDOS ("J\373") */
125
#define EF_AOSVS     0x5356     /* AOS/VS ("VS") */
126
#define EF_SPARK     0x4341     /* David Pilling's Acorn/SparkFS ("AC") */
127
#define EF_MD5       0x4b46     /* Fred Kantor's MD5 ("FK") */
128
#define EF_ASIUNIX   0x756e     /* ASi's U */
129
 
130
#define EB_HEADSIZE       4     /* length of extra field block header */
131
#define EB_ID             0     /* offset of block ID in header */
132
#define EB_LEN            2     /* offset of data length field in header */
133
#define EB_UCSIZE_P       0     /* offset of ucsize field in compr. data */
134
#define EB_CMPRHEADLEN    6     /* lenght of compression header */
135
 
136
#define EB_UX_MINLEN      8     /* minimal "UX" field contains atime, mtime */
137
#define EB_UX_FULLSIZE    12    /* full "UX" field (atime, mtime, uid, gid) */
138
#define EB_UX_ATIME       0     /* offset of atime in "UX" extra field data */
139
#define EB_UX_MTIME       4     /* offset of mtime in "UX" extra field data */
140
#define EB_UX_UID         8     /* byte offset of UID in "UX" field data */
141
#define EB_UX_GID         10    /* byte offset of GID in "UX" field data */
142
 
143
/*---------------------------------------------------------------------------
144
    True sizes of the various headers, as defined by PKWARE--so it is not
145
    likely that these will ever change.  But if they do, make sure both these
146
    defines AND the typedefs below get updated accordingly.
147
  ---------------------------------------------------------------------------*/
148
#define LREC_SIZE   26          /* lengths of local file headers, central */
149
#define CREC_SIZE   42          /*  directory headers, and the end-of-    */
150
#define ECREC_SIZE  18          /*  central-dir record, respectively      */
151
#define ECREC64_SIZE 56
152
 
153
// #define MAX_BITS    13          /* used in unshrink() */
154
// #define HSIZE       (1 << MAX_BITS)     /* size of global work area */
155
 
156
#define LF     10               /* '\n' on ASCII machines; must be 10 due to EBCDIC */
157
#define CR     13               /* '\r' on ASCII machines; must be 13 due to EBCDIC */
158
#define CTRLZ  26               /* DOS & OS/2 EOF marker (used in fileio.c, vms.c) */
159
 
160
#define ENV_UNZIP     "UNZIP"   /* the standard names */
161
#define ENV_ZIPINFO   "ZIPINFO"
162
 
163
#ifndef S_ISDIR
164
#ifdef CMS_MVS
165
#    define S_ISDIR(m)  (false)
166
#else
167
#    define S_ISDIR(m)  (((m) & S_IFMT) == S_IFDIR)
168
#endif
169
#endif
170
 
171
#ifndef IS_VOLID
172
#  define IS_VOLID(m)  ((m) & 0x08)
173
#endif
174
 
175
#define makeword(p) ((ush)*(ush *)(p))
176
#define makelong(p) ((ulg)*(ulg*)(p))
177
#define makeint64(p) ((ZInt64)*(ZInt64*)(p))
178
/**************/
179
 
180
/*  Typedefs  */
181
 
182
/**************/
183
 
184
typedef uch ec_byte_rec[ECREC_SIZE + 4];
185
 
186
/*     define SIGNATURE                         0   space-holder only */
187
#      define NUMBER_THIS_DISK                  4
188
#      define NUM_DISK_WITH_START_CENTRAL_DIR   6
189
#      define NUM_ENTRIES_CENTRL_DIR_THS_DISK   8
190
#      define TOTAL_ENTRIES_CENTRAL_DIR         10
191
#      define SIZE_CENTRAL_DIRECTORY            12
192
#      define OFFSET_START_CENTRAL_DIRECTORY    16
193
#      define ZIPFILE_COMMENT_LENGTH            20
194
 
195
#pragma pack(push, 4)
196
typedef struct end_central_dir_record
197
{
198
    /* END CENTRAL */
199
        ulg number_this_disk;
200
        ulg num_disk_start_cdir;
201
        ZInt64 num_entries_centrl_dir_ths_disk;
202
        ZInt64 total_entries_central_dir;
203
        ZInt64 size_central_directory;
204
    ZInt64 offset_start_central_directory;
205
    int is_zip64_archive;
206
    ush zipfile_comment_length;
207
}ecdir_rec;
208
#pragma pack(pop)
209
 
210
#pragma pack(push, 1)
211
typedef struct central_directory_file_header
212
{
213
        ush made_by;
214
    uch version_needed_to_extract[2];
215
    ush general_purpose_bit_flag;
216
    ush compression_method;
217
    ush last_mod_file_time;
218
    ush last_mod_file_date;
219
        ulg crc32;
220
    ush filename_length;
221
    ush extra_field_length;
222
    ush file_comment_length;
223
    ulg disk_number_start;
224
    ush internal_file_attributes;
225
        ulg external_file_attributes;
226
    ZInt64 csize;
227
    ZInt64 ucsize;
228
    ZInt64 relative_offset_local_header;
229
}
230
cdir_file_hdr;
231
#pragma pack(pop)
232
 
233
/*************/
234
 
235
class UnzOpr : public UnzInf
236
{
237
    protected:
238
        int fdflag;                    /* -d: all args are files/dirs to be extracted */
239
        int ffflag;                    /* -f: "freshen" (extract only newer files) */
240
        int fjflag;                    /* -j: junk pathnames (unzip) */
241
        int flflag;                    /* -12slmv: listing format (zipinfo)*/
242
        int foverwrite_all;            /* -o combined with -n: Ok to overwrite used as default */
243
        int fvolflag;                  /* -$: extract volume labels */
244
        int fT_flag;                   /* -T: timestamps (unzip) or dec. time fmt (zipinfo) */
245
        int fuflag;                    /* -u: "update" (extract only newer/brand-new files) */
246
        int fzflag;                    /* -z: display the zipfile comment (only, for unzip) */
247
 
248
        int ffilespecs;                /* number of real file specifications to be matched */
249
        UnzFileSpec *SrchSpecs;        // files to extract
250
        int fprocess_all_files;
251
        int fcreate_dirs;              /* used by main(), mapname(), checkdir() */
252
        int fextract_flag;
253
        ZInt64 freal_ecrec_offset;
254
        ZInt64 fexpect_ecrec_offset;
255
                ZInt64 fziplen;
256
        DZRawData extra_field;
257
        DZStrA file_name;
258
        uch *fhold;
259
        cdir_file_hdr fcrec;           /* used in unzip.c, extract.c, misc.c */
260
        ecdir_rec fecrec;              /* used in unzip.c, extract.c */
261
 
262
        struct stati64 fstatbuf;          /* used by main, mapname, check_for_newer */
263
        int fno_ecrec;                 /* process static */
264
#ifdef NOVELL_BUG_FAILSAFE
265
        int fdne;                      /* true if stat() says file doesn't exist */
266
#endif
267
        int fcreated_dir;
268
        int frenamed_fullpath;
269
        int ffnlen;
270
        unsigned fnLabelDrive;    
271
        DZStrW fendHPFS;
272
        DZStrW fendFAT;
273
        DZStrW fdirname;
274
        DZStrW fwildname;
275
        DZStrW fmatchname;
276
        int frootlen;
277
        int fhave_dirname;
278
        int fdirnamelen;
279
        int fnotfirstcall;
280
        void *fwild_dir;
281
 
282
        int ffiles_acted_on;
283
        DZStrW frootpath;
284
        DZStrW fTempPath;
285
//#ifdef CRYPT                    /* If no crypt don't use */
286
                char flpszPassword[PWLEN + 1]; /* Used in PassMsg.c                                                                                             */
287
                WORD fcchPassword;
288
                bool fpwork;
289
                int frcode;
290
//#endif
291
 
292
    public:
293
        UnzOpr(const DllCommands *C);
294
        ~UnzOpr(void);
295
        long Exec(const DllCommands *C);
296
        int FatalError(int c);
297
        int Init(void);
298
 
299
    protected:
300
        DZStrW UnzMsg;
301
        DZStrW PrevPath;      // avoid checking path again
302
        int mapattr(void);
303
        void close_outfile(void);
304
        DZStrW GetFullPath(const DZStrW& p);
305
        int mapname(int renamed);
306
        int open_input_file(void);
307
        int open_outfile(void);
308
        int check_for_newer(const DZStrW& filename);
309
        int AskOverwrite(const DZStrW& filename, int cond); // true = overwrite
310
        int do_string(unsigned int len, int option);
311
                void UnzErr(int c); // probably FatalError
312
                int __fastcall getZip64Data(const DZRawData& extra);//const uch *ef_buf, unsigned ef_len);
313
        void process_zipfiles(void);
314
        int extract_or_test_files(void);
315
        int process_cdir_file_hdr(void);
316
        int get_cdir_ent(void);
317
        int process_local_file_hdr(void);
318
        int uz_end_central(void);
319
                int SSExtract(void);
320
        bool FSetUpToProcessZipFile(const DllCommands *C);
321
        void TakeDownFromProcessZipFile(void);
322
        int UnzStreamStream(void);
323
 
324
    private:
325
        int getNTfiletime(FILETIME * ft);
326
        int do_seekable(int lastchance);
327
        int find_ecrec(ZInt64 searchlen);
328
        int rec_find(ZInt64, ulg, int);
329
        int check_ecrec_zip64(void);
330
        int find_ecrec64(ZInt64 searchlen);
331
        int StoreInfo(void);
332
        int extract_or_test_member(void);
333
        int SelectMembers(void);
334
                void CloseOut(void);
335
        int CD_Init(const DZStrW& pathcomp, bool renamed_fullpath, DZStrW build);
336
        int CD_AppendDir(const DZStrW& comp, DZStrW build);
337
        int CD_AppendName(const DZStrW& comp, DZStrW build);
338
 
339
        void GiveGlobals(void);
340
};
341
 
342
#endif
343
 
344