Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6725 siemargl 1
There are now several entry points to the dll.
2
 
3
There is a single "unzipping" entry point of:
4
 
5
int WINAPI Wiz_SingleEntryUnzip(int ifnc, char **ifnv, int xfnc, char **xfnv,
6
                                LPDCL lpDCL, LPUSERFUNCTIONS lpUserFunc)
7
 
8
where the arguments are:
9
 
10
ifnc       = number of file names being passed. If all files are to be
11
             extracted, then this can be zero.
12
ifnv       = file names to be unarchived. Wildcard patterns are recognized
13
             and expanded. If all files are to be extracted, then this can
14
             be NULL.
15
xfnc       = number of "file names to be excluded from processing" being
16
             passed. If all files are to be extracted, set this to zero.
17
xfnv       = file names to be excluded from the unarchiving process. Wildcard
18
             characters are allowed and expanded. If all files are to be
19
             extracted, set this argument to NULL.
20
lpDCL      = pointer to a structure with the flags for setting the
21
             various options, as well as the zip file name.
22
lpUserFunc = pointer to a structure that contains pointers to functions
23
             in the calling application, as well as sizes passed back to
24
             the calling application etc. See below for a detailed description
25
             of all the parameters.
26
 
27
This calling wrapper for Wiz_SingleEntryUnzip() provides a method to pass
28
file lists as plain strings instead of the usual string arrays.
29
For VB Users only...:
30
 
31
int WINAPI Wiz_SingleEntryUnzpList(unsigned int ifnc, LPCSTR ExtList,
32
                                   unsigned int xfnc, LPCSTR ExcList,
33
                                   LPDCL lpDCL, LPUSERFUNCTIONS lpUserFunc)
34
 
35
ifnc       = number of file names being passed. If all files are to be
36
             extracted, then this can be zero.
37
ExtList    = Pointer to a list of file names to be extracted, separated by
38
             white space. If all files are to be extracted, then this should
39
             be NULL. Parameter ifnc should have an accurate count of the
40
             number of filenames being passed in.
41
xfnc       = number of "file names to be excluded from processing" being
42
             passed. If all files are to be extracted, set this to zero.
43
ExcList    = Pointer to a list of file names to be excluded from processing.
44
             Parameter xfnc should have an accurate count of the number of
45
             the number of filenames being passed in.
46
lpDCL      = pointer to a structure with the flags for setting the
47
             various options, as well as the zip file name.
48
lpUserFunc = pointer to a structure that contains pointers to functions
49
             in the calling application, as well as sizes passed back to
50
             the calling application etc.
51
 
52
 
53
The DCL structure collects the set of option flags supported by the WinDLL
54
interface to control the operation of the main function calls.
55
The first member of this structure is now a version identifier that should
56
be used to check structural compatibility of a passed option struct with
57
the expected structure layout. The C header file containing the reference
58
definition of the DCL structure also provides a symbol denoting the currently
59
valid StructVersID:
60
 
61
#define UZ_DCL_STRUCTVER        0x600
62
 
63
The layout of the DCL structure is shown below:
64
 
65
typedef struct {
66
 unsigned StructVersID  = struct version id (= UZ_DCL_STRUCTVER)
67
 int ExtractOnlyNewer   = TRUE for "update" without interaction
68
                          (extract only newer/new files, without queries)
69
 int SpaceToUnderscore  = TRUE if convert space to underscore
70
 int PromptToOverwrite  = TRUE if prompt to overwrite is wanted
71
 int fQuiet             = quiet flag:
72
 
73
 int ncflag             = write to stdout if TRUE
74
 int ntflag             = test zip file
75
 int nvflag             = verbose listing
76
 int nfflag             = "freshen" (replace existing files by newer versions)
77
 int nzflag             = display zip file comment
78
 int ndflag             = controls (sub)directory recreation during extraction
79
 
80
                          1 = "safe" usage of paths in filenames (skip "../")
81
                          2 = allow also unsafe path components (dir traversal)
82
 int noflag             = always overwriting existing files if TRUE
83
 int naflag             = do end-of-line translation
84
 int nZIflag            = get ZipInfo if TRUE
85
 int B_flag             = backup existing files if TRUE
86
 int C_flag             = be case insensitive if TRUE
87
 int D_flag             = controls restoration of timestamps
88
 
89
                          1 = skip restoration of timestamps for folders
90
                              created on behalf of directory entries in the
91
                              Zip archive
92
                          2 = do not restore any timestamps; extracted files
93
                              and directories get stamped with the current time
94
 int U_flag             = controls UTF-8 filename coding support
95
 
96
                          1 = recognize UTF-8 coded names, but all non-ASCII
97
                              characters are "escaped" into "#Uxxxx"
98
                          2 = UTF-8 support is disabled, filename handling
99
                              works exactly as in previous UnZip versions
100
 int fPrivilege         = 1 => restore ACLs in user mode,
101
                          2 => try to use privileges for restoring ACLs
102
 LPSTR lpszZipFN        = zip file name
103
 LPSTR lpszExtractDir   = directory to extract to. This should be NULL if you
104
                          are extracting to the current directory.
105
} DCL, far * LPDCL;
106
 
107
REMARKS:
108
The four extract-mode flags ExtractOnlyNewer, nfflag, PromptToOverwrite, and
109
noflag control which of the selected archive entries are actually processed.
110
They are mapped to UnZip's command line qualifiers "-u", "-f", "-o", "-n"
111
according to the following decision matrix:
112
 _____________________________________________________________________
113
 | UnZip 1)|| Extract-  | nfflag | noflag | PrompTo-  | lpUserFunc   |
114
 | options || OnlyNewer |        |        | Overwrite | ->replape()  |
115
 =====================================================================
116
 | none 2) ||   false   |  false |  false |   true    |queryfunc() 5)|
117
 | -o      ||   false   |  false |  true  |   false   |     N/A      |
118
 | -n      ||   false   |  false |  false |   false   |     N/A      |
119
 |---------||-----------|--------|--------|-----------|--------------|
120
 | -u      ||   true    |  false |  false |   true    |queryfunc() 5)|
121
 | -uo     ||   true    |  false |  true  |   false   |     N/A      |
122
 | -un  3) ||   true    |  false |  false |   false   |     N/A      |
123
 |---------||-----------|--------|--------|-----------|--------------|
124
 | -f      ||    N/A    |  true  |  false |   true    |queryfunc() 5)|
125
 | -fo     ||    N/A    |  true  |  true  |   false   |     N/A      |
126
 | -fn  4) ||    N/A    |  true  |  false |   false   |     N/A      |
127
 ---------------------------------------------------------------------
128
 Legend: true:  integer number <> 0
129
         false: integer number 0
130
         N/A:   not applicable, could be set to any value
131
 NOTES:
132
 1) The UnZip options are explained in the generic UnZip manual, see
133
    "unzip.txt" or "man/unzip.1".
134
 2) no options from the set "ufno" are specified.
135
 3) -un is functionally equivalent to -n
136
 4) -fn is functionally equivalent to "do nothing", so this combination
137
    does not make sense.
138
 5) queryfunc() is a callback function provided by the caller of the
139
    unzip dll that may return one of the following result keys:
140
     IDM_REPLACE_NO, IDM_REPLACE_YES,
141
     IDM_REPLACE_ALL, IDM_REPLACE_NONE,
142
     IDM_REPLACE_RENAME
143
     (IDM_REPLACE_TEXT, IDM_REPLACE_HELP are defined but not used)
144
    UnZip's internal code treats a "NULL" lpUserFunc->replace() function
145
    pointer as "{return IDM_REPLACE_NONE}". However, currently, the windll
146
    interface checks for this function pointer to be not NULL and signals
147
    a fatal error if this condition is not fulfilled.
148
 
149
 
150
The typedef's for the function pointers in the structure USERFUNCTIONS
151
are shown immediately below.
152
 
153
typedef unsigned short ush;
154
typedef int (WINAPI DLLPRNT) (LPSTR, unsigned long);
155
typedef int (WINAPI DLLPASSWORD) (LPSTR pwbuf, int bufsiz,
156
    LPCSTR promptmsg, LPCSTR entryname);
157
typedef int (WINAPI DLLSERVICE) (LPCSTR entryname, z_uint8 uncomprsiz);
158
typedef int (WINAPI DLLSERVICE_I32) (LPCSTR entryname,
159
    unsigned long ucsz_lo, unsigned long ucsz_hi);
160
typedef void (WINAPI DLLSND) (void);
161
typedef int (WINAPI DLLREPLACE) (LPSTR efnam, unsigned efbufsiz);
162
typedef void (WINAPI DLLMESSAGE) (z_uint8 ucsize, z_uint8 csize,
163
    unsigned cfactor,
164
    unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm,
165
    char c, LPCSTR filename, LPCSTR methbuf, unsigned long crc, char fCrypt);
166
typedef void (WINAPI DLLMESSAGE_I32) (unsigned long ucsiz_l,
167
    unsigned long ucsiz_h, unsigned long csiz_l, unsigned long csiz_h,
168
    unsigned cfactor,
169
    unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm,
170
    char c, LPCSTR filename, LPCSTR methbuf, unsigned long crc, char fCrypt);
171
 
172
Structure USERFUNCTIONS
173
 
174
typedef struct {
175
 DLLPRNT *print;        = a pointer to the application's print routine.
176
 DLLSND *sound;         = a pointer to the application's sound routine. This
177
                          can be NULL if your application doesn't use
178
                          sound.
179
 DLLREPLACE *replace    = a pointer to the application's replace routine. The
180
                          replace routine may modify the content of the efnam
181
                          string buffer, but must not write beyond its fixed
182
                          size of efbufsiz bytes! (This is a potential security
183
                          leak of the windll interface.) When modifying the
184
                          efnam buffer, the replace routine should return
185
                          the status IDM_REPLACE_RENAME.
186
 DLLPASSWORD *password  = a pointer to the application's password routine.
187
                          This function should return one of the status values
188
                          IZ_PW_ENTERED (0), IZ_PW_CANCEL (-1),
189
                          IZ_PW_CANCEL_ALL (-2), IZ_PW_ERROR (5).
190
 DLLMESSAGE *SendApplicationMessage = a pointer to the application's routine
191
                          for displaying information about specific files
192
                          in the archive. Used for listing the contents of
193
                          an archive.
194
 DLLSERVICE *ServCallBk  = Callback function designed to be used for
195
                          allowing the application to process Windows messages,
196
                          or canceling the operation, as well as giving the
197
                          option of a progress indicator. If this function
198
                          returns a non-zero value, then it will terminate
199
                          what it is doing. It provides the application with
200
                          the name of the archive member it has just processed,
201
                          as well as it's original size.
202
 DLLMESSAGE_I32 *SendApplicationMessage_i32 = variant of SendApplicationMessage
203
                          callback, for environments that do not support the
204
                          64-bit integer types required to transfer "large"
205
                          ZIP64-compatible sizes.
206
 DLLSERVICE_I32 *ServCallBk_i32  = variant of the ServCallBk callback function,
207
                          for environments that do not support 64-bit integers.
208
 [NOTE: The _i32 variants of the SendApplicationMessage and ServCallBk callback
209
        functions are only called when the corresponding "regular" callback
210
        function pointers are set to NULL.  For the i386 architecture, the
211
        "..._i32" calling interfaces are binary identical with the
212
        corresponding regular __int64-aware interfaces.]
213
 [NOTE: The values below are filled in only when listing the contents of an
214
        archive.]
215
 z_uint8 TotalSizeComp  = value to be filled in by the dll for the
216
                          compressed total size of the archive. Note this
217
                          value does not include the size of the archive
218
                          header and central directory list.
219
 z_uint8 TotalSize      = value to be filled in by the dll for the total
220
                          size of all files in the archive.
221
 z_uint8 NumMembers     = total number of files in the archive.
222
 unsigned CompFactor    = value to be filled in by the dll for the overall
223
                          compression factor. This could actually be computed
224
                          from the other values, but it is available.
225
 WORD cchComment        = flag to be set if archive has a comment
226
} USERFUNCTIONS, far * LPUSERFUNCTIONS;
227
 
228
Wiz_SingleEntryUnzip() returns a PKWARE compatible error code (0 if no
229
error or warning). For an explanation of the supported error codes see
230
the UnZip user documentation (the UnZip man page).
231
 
232
For examples of how the actual calls to the dll are set up in WiZ, look in
233
the files action.c and wizmain.c in the WiZ source directory. For a trival
234
example of how to load and call the dll, look in uzexampl.c and uzexampl.h.
235
 
236
For examples of how the actual loading and unloading of the dll's themselves
237
was done, look in wizmain.c in the WiZ source directory. Note that WiZ looks
238
specifically for a particular version number of the dll, and also expects to
239
find the company name to be Info-ZIP. This is to protect from getting
240
different versions of the dll loaded, with resulting unknown behavior.
241
 
242
Additional entry points:
243
 
244
    const UzpVer * WINAPI UzpVersion(void);
245
 
246
where UzpVer is defined as:
247
 
248
typedef struct _UzpVer {
249
    ulg structlen;            /* length of the struct being passed */
250
    ulg flag;                 /* bit 0: is_beta   bit 1: uses_zlib */
251
    LPCSTR betalevel;         /* e.g. "g BETA" or "" */
252
    LPCSTR date;              /* e.g. "9 Oct 08" (beta) or "9 October 2008" */
253
    LPCSTR zlib_version;      /* e.g. "1.2.3" or NULL */
254
    _version_type unzip;      /* current UnZip version */
255
    _version_type zipinfo;    /* current ZipInfo version */
256
    _version_type os2dll;     /* OS2DLL version (retained for compatibility) */
257
    _version_type windll;     /* WinDLL version (retained for compatibility) */
258
    _version_type dllapimin;  /* last incompatible change of library API */
259
} UzpVer;
260
 
261
and _version_type is defined as:
262
 
263
typedef struct _ver {
264
    uch major;              /* e.g., integer 5 */
265
    uch minor;              /* e.g., 2 */
266
    uch patchlevel;         /* e.g., 0 */
267
    uch not_used;
268
} _version_type;
269
 
270
    See api.c for exactly what UzpVersion does, but the short description is
271
    "UzpVersion() returns a pointer to a dll-internal static structure
272
    containing the unzip32.dll version information".
273
 
274
For usage with languages that do not support function which return pointers
275
to structures, the variant UzpVersion2() allows to retrieve the version info
276
into a memory area supplied by the caller:
277
 
278
    unsigned WINAPI UzpVersion2(UzpVer2 far *);
279
 
280
where UzpVer2 is defined as:
281
 
282
typedef struct _UzpVer2 {
283
    ulg structlen;            /* length of the struct being passed */
284
    ulg flag;                 /* bit 0: is_beta   bit 1: uses_zlib */
285
    char betalevel[10];       /* e.g. "g BETA" or "" */
286
    char date[20];            /* e.g. "9 Oct 08" (beta) or "9 October 2008" */
287
    char zlib_version[10];    /* e.g. "1.2.3" or NULL */
288
    _version_type unzip;      /* current UnZip version */
289
    _version_type zipinfo;    /* current ZipInfo version */
290
    _version_type os2dll;     /* OS2DLL version (retained for compatibility) */
291
    _version_type windll;     /* WinDLL version (retained for compatibility) */
292
    _version_type dllapimin;  /* last incompatible change of library API */
293
} UzpVer2;
294
 
295
   See api.c for the exact function of UzpVersion2, but the short description
296
   is "fill in the version information in the UzpVer2 structure".
297
 
298
void WINAPI Wiz_NoPrinting(int flag)
299
 
300
   This entry point simply turns off all messages to the calling application if
301
   flag is true, and turns them on if flag is false.
302
 
303
int WINAPI Wiz_Validate(LPSTR archive, int AllCodes)
304
 
305
   If AllCodes is FALSE, then Unz_Validate returns TRUE if archive points to a
306
   valid archive, and FALSE otherwise. If AllCodes is TRUE, then Unz_Validate
307
   returns whatever error code process_zipfiles returns, without evaluating it.
308
 
309
int WINAPI Wiz_UnzipToMemory(LPSTR zip, LPSTR file, LPUSERFUNCTIONS lpUserFunc,
310
                             UzpBuffer *retstr)
311
 
312
   Where UzpBuffer is defined as:
313
 
314
   typedef struct _UzpBuffer {
315
      ulg strlength; /* length of string */
316
      char * strptr; /* pointer to string */
317
   } UzpBuffer
318
 
319
   Pass the name of the zip file in zip and the name of the file you wish to
320
   extract in file. UzpUnzipToMemory will create a buffer and return it in
321
   *retstr. 0 on return indicates failure.
322
 
323
void WINAPI UzpFreeMemBuffer(UzpBuffer *retstr)
324
   Use this routine to release the return data space allocated by the function
325
   Wiz_UnzipToMemory().
326
 
327
int WINAPI Wiz_Grep(LPSTR archive, LPSTR file, LPSTR pattern, int cmd,
328
                    int SkipBin, LPUSERFUNCTIONS lpUserFunc)
329
 
330
   Pass the name of the zip file in "zip", the name of the zip entry you wish
331
   to perform the "grep" on in "file", and the string you wish to look for in
332
   "pattern". There are four possible options for cmd:
333
 
334
 
335
   1 => case sensitive search
336
   2 => case insensitive search, whole words only
337
   3 => case sensitive search, whole words only
338
 
339
   If SkipBin is TRUE, then any binary (loosely interpreted) files will be
340
   ignored.
341
 
342
   lpUserFunc is a pointer to a USERFUNCTION structure as shown above.
343
 
344
   UzpGrep returns:
345
 
346
   -1 => error such as unable to allocate memory, unable to find file, etc.
347
 
348
    1 => match found, based on the search criteria
349
 
350
There is an additional function call that does not specifically deal with
351
"unzipping", but is a quite useful function that is currently used in Wiz
352
itself in several places. This call is currently only available in the
353
static library, not in the DLL.
354
 
355
Match the pattern (wildcard) against the string (fixed):
356
 
357
  match(const char *string, const char *pattern, int ignore_case);
358
 
359
or, when UnZips WILD_SEP_AT_DIR compile-time option was set:
360
 
361
  match(const char *string, const char *pattern, int ignore_case, int sepc);
362
 
363
  returns TRUE if string matches pattern, FALSE otherwise.  In the pattern:
364
 
365
     `*' matches any sequence of characters (zero or more)
366
     `?' matches any single character
367
     [SET] matches any character in the specified set,
368
     [!SET] or [^SET] matches any character not in the specified set.
369
 
370
  In case the code was compiled with WILD_STOP_AT_DIR enabled, the pattern
371
  wildcard functionality is modified as follows:
372
     `*' matches any sequence of characters (zero or more) until the first
373
         occurence of the separating character denoted by `sepc'
374
     `**' matches any sequence of characters (zero or more)
375
 
376
  A set is composed of characters or ranges; a range looks like ``character
377
  hyphen character'' (as in 0-9 or A-Z).  [0-9a-zA-Z_] is the minimal set of
378
  characters allowed in the [..] pattern construct.  Other characters are
379
  allowed (i.e., 8-bit characters) if your system will support them.
380
 
381
  To suppress the special syntactic significance of any of ``[]*?!^-\'', in-
382
  side or outside a [..] construct, and match the character exactly, precede
383
  it with a ``\'' (backslash).
384
 
385
The remaining functions are linked together. Their use would be as
386
follows (explanations for each function are shown further below):
387
 
388
    #include "windll.h"
389
    #include "structs.h"
390
    MyApiCallingRoutine()
391
    {
392
        CREATEGLOBALS();
393
        .
394
        .
395
        .
396
        Wiz_Init(pG, lpUserFunctions); /* Set up user functions */
397
        /* zvoid *pG, LPUSERFUNCTIONS lpUserFunctions */
398
        .
399
        .
400
        do {
401
          .
402
          .
403
          Wiz_SetOpts(pG, lpDCL); /* Set up unzipping options */
404
          /* zvoid *pG, LPDCL lpDCL */
405
          .
406
          .
407
          Wiz_Unzip(pG, ifnc, ifnv, xfnc, xfnv); /* Unzip files */
408
          .
409
          .
410
        } while (!finished_condition)
411
        .
412
        .
413
        DESTROYGLOBALS();
414
    }
415
 
416
Each entry point is as defined below:
417
 
418
    BOOL WINAPI Wiz_Init(zvoid *, LPUSERFUNCTIONS);
419
 
420
    BOOL WINAPI Wiz_SetOpts(zvoid *, LPDCL);
421
 
422
    int WINAPI Wiz_Unzip(zvoid *, int, char **, int, char **);
423
 
424
Note that you should use either Wiz_SingleEntryUnzip OR the series of calls
425
described above. Using both, depending on how you do it, could cause
426
problems. The series of "lower level" gives you more freedom to add additional
427
functionalities, whereas the single-entry api is easier to use. When using
428
the "series" of calls, make sure that Wiz_SetOpts and Wiz_Unzip are always
429
used together! When successfully called, Wiz_SetOpts has allocated some
430
internal structures which are in turn free'd by Wiz_Unzip.
431
 
432
Last revised January 18, 2009.
433
 
434
Mike White, Christian Spieler