Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6725 siemargl 1
/*
2
  Copyright (c) 1990-2009 Info-ZIP.  All rights reserved.
3
 
4
  See the accompanying file LICENSE, version 2009-Jan-02 or later
5
  (the contents of which are also included in unzip.h) for terms of use.
6
  If, for some reason, all these files are missing, the Info-ZIP license
7
  also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
8
*/
9
 
10
/* Tell Microsoft Visual C++ 2005 (and newer) to leave us alone
11
 * and let us use standard C functions the way we're supposed to.
12
 * (These preprocessor symbols must appear before the first system
13
 *  header include.)
14
 */
15
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
16
#  ifndef _CRT_SECURE_NO_WARNINGS
17
#    define _CRT_SECURE_NO_WARNINGS
18
#  endif
19
#endif
20
 
21
#include 
22
#include 
23
#ifdef WIN32
24
#  if defined(__LCC__)
25
#    include 
26
#    include 
27
#    include 
28
#  endif
29
   #include 
30
#else
31
   #include 
32
   #include 
33
   #include 
34
   #include 
35
   #include 
36
   #include 
37
   #include 
38
#endif
39
#include "dialog.h"
40
#ifndef UzpMatch
41
#define UzpMatch match
42
#endif
43
#include "../structs.h"
44
#include "../decs.h"
45
 
46
LPUSERFUNCTIONS lpUserFunctions;
47
HANDLE hUF       = (HANDLE)NULL;
48
LPDCL lpDCL      = NULL;
49
HANDLE hZUF      = (HANDLE)NULL;
50
HANDLE hDCL      = (HANDLE)NULL;
51
 
52
BOOL fDoAll = FALSE;
53
 
54
char ** argv;
55
 
56
HINSTANCE hInst;
57
HWND hWnd;
58
 
59
#ifndef TCHAR
60
#define TCHAR char
61
#endif
62
 
63
#ifndef _MAX_PATH
64
#define _MAX_PATH 260
65
#endif
66
 
67
int WINAPI password(LPSTR p, int n, LPCSTR m, LPCSTR name);
68
int WINAPI DisplayBuf(TCHAR far *buf, unsigned long size);
69
int WINAPI GetReplaceDlgRetVal(LPSTR filename, unsigned fnbufsiz);
70
#ifdef Z_UINT8_DEFINED
71
void WINAPI ReceiveDllMessage(z_uint8 ucsize, z_uint8 csiz,
72
    unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh,
73
    unsigned mm, TCHAR c, LPCSTR filename, LPCSTR methbuf, unsigned long crc,
74
    TCHAR fCrypt);
75
#else
76
void WINAPI ReceiveDllMessage(unsigned long ucsize, unsigned long csiz,
77
    unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh,
78
    unsigned mm, TCHAR c, LPCSTR filename, LPCSTR methbuf, unsigned long crc,
79
    TCHAR fCrypt);
80
#endif
81
void WINAPI ReceiveDllMessage_NO_INT64(unsigned long ucsize_low,
82
    unsigned long ucsize_high, unsigned long csiz_low, unsigned long csiz_high,
83
    unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh,
84
    unsigned mm, TCHAR c, LPCSTR filename, LPCSTR methbuf, unsigned long crc,
85
    TCHAR fCrypt);
86
 
87
char szAppName[_MAX_PATH];
88
char szTarget[_MAX_PATH];
89
char szThisApp[_MAX_PATH];
90
int iReturn;
91
 
92
DLGPROC fpProc;
93
 
94
#ifndef MAX_PATH
95
   #define MAX_PATH    _MAX_PATH            // maximum path =length
96
#endif
97
#define TRUE        1                       // true value
98
#define FALSE       0                       // false value
99
 
100
TCHAR   zfn[MAX_PATH],                      // zip filename and path
101
        szHomeDir[MAX_PATH];                // Original directory
102
 
103
/****************************************************************************
104
 
105
    FUNCTION: Replace(HWND, WORD, WPARAM, LPARAM)
106
 
107
    PURPOSE:  Processes messages for "Replace" dialog box
108
 
109
    MESSAGES:
110
 
111
    WM_INITDIALOG - initialize dialog box
112
    WM_COMMAND    - Input received
113
 
114
****************************************************************************/
115
 
116
BOOL WINAPI ReplaceProc(HWND hReplaceDlg, WORD wMessage,
117
                        WPARAM wParam, LPARAM lParam)
118
{
119
    static char __far *lpsz;
120
    TCHAR szTemp[MAX_PATH];
121
 
122
    switch (wMessage)
123
    {
124
    case WM_INITDIALOG:
125
        lpsz = (char __far *)lParam;
126
        wsprintf(szTemp, "Replace %s ?", (LPSTR)lpsz);
127
        SetDlgItemText(hReplaceDlg, IDM_REPLACE_TEXT, szTemp);
128
        return TRUE;
129
 
130
    case WM_COMMAND:
131
        switch (LOWORD(wParam))
132
        {
133
        case IDCANCEL:              /* ESC key      */
134
        case IDOK:                  /* Enter key    */
135
            EndDialog(hReplaceDlg, IDM_REPLACE_NO);
136
            break;
137
        case IDM_REPLACE_ALL:
138
            fDoAll = TRUE;
139
        case IDM_REPLACE_NONE:
140
        case IDM_REPLACE_YES:
141
        case IDM_REPLACE_NO:
142
            EndDialog(hReplaceDlg, wParam);
143
            break;
144
        }
145
        return TRUE;
146
    }
147
    return FALSE;
148
}
149
 
150
/****************************************************************************
151
 
152
    FUNCTION: GetDirProc(HWND, unsigned, WPARAM, LPARAM)
153
 
154
    PURPOSE:  Processes messages for "Set Reference Dir Procedure for
155
              Update Archive" dialog box
156
 
157
    MESSAGES:
158
 
159
    WM_INITDIALOG - initialize dialog box
160
    WM_COMMAND    - Input received
161
 
162
****************************************************************************/
163
#ifdef WIN32
164
BOOL WINAPI
165
GetDirProc(HWND hDlg, WORD wMessage, WPARAM wParam, LPARAM lParam)
166
{
167
   switch (wMessage) {
168
   case WM_INITDIALOG:
169
/*
170
Common control identifiers for GetOpenFileName and GetSaveFileName
171
Control identifier   Control Description
172
cmb2                 Drop-down combo box that displays the current drive
173
                     or folder, and that allows the user to select a
174
                     drive or folder to open
175
stc4                 Label for the cmb2 combo box
176
lst1                 List box that displays the contents of the current drive or folder
177
stc1                 Label for the lst1 list box
178
edt1                 Edit control that displays the name of the current file, or in which the user can type the name of the file to open
179
stc3                 Label for the edt1 edit control
180
cmb1                 Drop-down combo box that displays the list of file type filters
181
stc2                 Label for the cmb1 combo box
182
chx1                 The read-only check box
183
IDOK                 The OK command button (push button)
184
IDCANCEL             The Cancel command button (push button)
185
pshHelp              The Help command button (push button)
186
 
187
*/
188
      CommDlg_OpenSave_HideControl(GetParent(hDlg), cmb1);
189
      CommDlg_OpenSave_HideControl(GetParent(hDlg), stc2);
190
      CommDlg_OpenSave_HideControl(GetParent(hDlg), edt1);
191
      CommDlg_OpenSave_HideControl(GetParent(hDlg), stc3);
192
      CommDlg_OpenSave_SetControlText(GetParent(hDlg),
193
            IDOK, "Set");
194
      break;
195
   default:
196
         break;
197
   }
198
return DefWindowProc(hDlg, wMessage, wParam, lParam);
199
}
200
#else
201
 
202
#ifdef __BORLANDC__
203
#pragma argsused
204
#endif
205
 
206
BOOL WINAPI
207
GetDirProc(HWND hwndDlg, WORD wMessage, WPARAM wParam, LPARAM lParam)
208
{
209
HWND hTemp;
210
 
211
   switch (wMessage) {
212
   case WM_INITDIALOG:
213
      hTemp = GetDlgItem(hwndDlg, lst1);
214
      EnableWindow(hTemp, FALSE);
215
      ShowWindow(hTemp, SW_HIDE);
216
      hTemp = GetDlgItem(hwndDlg, edt1);
217
      EnableWindow(hTemp, FALSE);
218
      ShowWindow(hTemp, SW_HIDE);
219
      hTemp = GetDlgItem(hwndDlg, stc2);
220
      EnableWindow(hTemp, FALSE);
221
      ShowWindow(hTemp, SW_HIDE);
222
      hTemp = GetDlgItem(hwndDlg, stc3);
223
      EnableWindow(hTemp, FALSE);
224
      ShowWindow(hTemp, SW_HIDE);
225
      hTemp = GetDlgItem(hwndDlg, cmb1);
226
      EnableWindow(hTemp, FALSE);
227
      ShowWindow(hTemp, SW_HIDE);
228
 
229
      break;
230
   case WM_COMMAND:
231
      switch (LOWORD(wParam)) {
232
         case IDCANCEL:
233
            EndDialog(hwndDlg, FALSE);
234
            break;
235
         case IDOK:
236
            getcwd(szTarget, MAX_PATH);
237
            EndDialog(hwndDlg, TRUE);
238
            break;
239
         }
240
      default:
241
         break;
242
   }
243
   return FALSE;
244
}
245
#endif /* !WIN32 */
246
 
247
#ifdef __BORLANDC__
248
#pragma argsused
249
#endif
250
 
251
BOOL FAR PASCAL InitDialogProc (HWND hDlg, WORD wMsg, WORD wParam, LONG lParam) {
252
   BOOL fProcessed = TRUE;
253
   TCHAR szMessage[256];
254
 
255
   RECT rc;
256
 
257
   switch (wMsg) {
258
      case WM_INITDIALOG:
259
 
260
         hWnd = hDlg;
261
         SetWindowText(hDlg,(LPSTR) szAppName);
262
         SetDlgItemText(hDlg,ID_TARGET,(LPSTR)szTarget);
263
 
264
#ifdef WIN32
265
         GetCurrentDirectory(MAX_PATH, szHomeDir);
266
         SetCurrentDirectory(szTarget);
267
#else
268
         getcwd(szHomeDir, MAX_PATH);
269
         chdir(szTarget);
270
         setdisk(toupper(szTarget[0]) - 'A');
271
#endif
272
         GetWindowRect(hDlg, &rc);
273
         SetWindowPos(hDlg, NULL,
274
            (GetSystemMetrics(SM_CXSCREEN) - (rc.right - rc.left)) / 2,
275
            (GetSystemMetrics(SM_CYSCREEN) - (rc.bottom - rc.top)) / 3,
276
            0, 0, SWP_NOSIZE | SWP_NOZORDER);
277
 
278
         break;
279
 
280
      case WM_COMMAND:
281
         switch (wParam) {
282
 
283
            case ID_BROWSE :
284
                {
285
#ifndef WIN32
286
                FARPROC lpGetDirProc;
287
#endif
288
                char szTemp[MAX_PATH]="mike_~@~*";
289
                OPENFILENAME ofn;
290
 
291
                memset(&ofn, '\0', sizeof(OPENFILENAME)); /* init struct */
292
                ofn.lStructSize = sizeof(OPENFILENAME);
293
                ofn.hwndOwner = hWnd;
294
                ofn.hInstance = hInst;
295
                ofn.lpstrFilter = NULL;
296
                ofn.nFilterIndex = 1;
297
 
298
                ofn.lpstrFile = szTemp;
299
                ofn.nMaxFile = MAX_PATH;
300
                ofn.lpstrFileTitle = NULL;
301
                ofn.nMaxFileTitle = MAX_PATH; /* ignored ! */
302
                ofn.lpstrTitle = (LPSTR)"Set Extraction Directory";
303
                ofn.lpstrInitialDir = NULL;
304
                ofn.Flags = OFN_ENABLEHOOK |
305
#ifdef WIN32
306
                            OFN_EXPLORER|
307
#endif
308
                            OFN_HIDEREADONLY|OFN_NOVALIDATE;
309
#ifndef WIN32
310
                lpGetDirProc = MakeProcInstance((FARPROC)GetDirProc, hInst);
311
   #ifndef MSC
312
                (UINT CALLBACK *)ofn.lpfnHook = (UINT CALLBACK *)lpGetDirProc;
313
   #else
314
                ofn.lpfnHook = lpGetDirProc;
315
   #endif
316
#else
317
                ofn.lpfnHook = (LPOFNHOOKPROC)GetDirProc;
318
#endif
319
                ofn.lpTemplateName = "GETDIR";   /* see getfiles.dlg   */
320
                if (!GetOpenFileName(&ofn))
321
                   {
322
                   break;
323
                   }
324
 
325
                ofn.lpstrFile[ofn.nFileOffset-1] = '\0';
326
#ifdef WIN32
327
                SetCurrentDirectory(ofn.lpstrFile);
328
#else
329
                getcwd(szTemp, MAX_PATH);
330
                chdir(ofn.lpstrFile);
331
                setdisk(toupper(ofn.lpstrFile[0]) - 'A');
332
#endif
333
                lstrcpy(szTarget,ofn.lpstrFile);
334
                SetDlgItemText(hDlg,ID_TARGET,(LPSTR)szTarget);
335
                }
336
               break;
337
 
338
            case IDOK:
339
#ifdef WIN32
340
               GetCurrentDirectory(_MAX_PATH,szTarget);
341
#else
342
               getcwd(szTarget, _MAX_PATH);
343
#endif
344
 
345
               lpDCL->ncflag = 0;
346
               lpDCL->fQuiet = 0; // If not zero, no status messages will come through
347
               lpDCL->ntflag = 0;
348
               lpDCL->nvflag = 0;
349
               lpDCL->nzflag = 0;
350
               lpDCL->ndflag = 1;
351
               lpDCL->naflag = 0;
352
               lpDCL->nfflag = 0;
353
               lpDCL->noflag = 0;
354
               lpDCL->PromptToOverwrite = 1;
355
               lpDCL->ExtractOnlyNewer = 0;
356
               lpDCL->lpszZipFN = zfn;
357
               lpDCL->lpszExtractDir = NULL;
358
               iReturn = Wiz_SingleEntryUnzip(0, NULL, 0, NULL, lpDCL, lpUserFunctions);
359
 
360
/* external return codes for unzip library */
361
//#define PK_OK              0   /* no error */
362
//#define PK_COOL            0   /* no error */
363
//#define PK_WARN            1   /* warning error */
364
//#define PK_ERR             2   /* error in zipfile */
365
//#define PK_BADERR          3   /* severe error in zipfile */
366
//#define PK_MEM             4   /* insufficient memory (during initialization) */
367
//#define PK_MEM2            5   /* insufficient memory (password failure) */
368
//#define PK_MEM3            6   /* insufficient memory (file decompression) */
369
//#define PK_MEM4            7   /* insufficient memory (memory decompression) */
370
//#define PK_MEM5            8   /* insufficient memory (not yet used) */
371
//#define PK_NOZIP           9   /* zipfile not found */
372
//#define PK_PARAM          10   /* bad or illegal parameters specified */
373
//#define PK_FIND           11   /* no files found */
374
//#define PK_DISK           50   /* disk full */
375
//#define PK_EOF            51   /* unexpected EOF */
376
 
377
//#define IZ_CTRLC          80   /* user hit ^C to terminate */
378
//#define IZ_UNSUP          81   /* no files found: all unsup. compr/encrypt. */
379
//#define IZ_BADPWD         82   /* no files found: all had bad password */
380
 
381
/* return codes of password fetches (negative = user abort; positive = error) */
382
//#define IZ_PW_ENTERED      0   /* got some password string; use/try it */
383
//#define IZ_PW_CANCEL      -1   /* no password available (for this entry) */
384
//#define IZ_PW_CANCELALL   -2   /* no password, skip any further pwd. request */
385
//#define IZ_PW_ERROR        5   /* = PK_MEM2 : failure (no mem, no tty, ...) */
386
               switch (iReturn) {
387
                case PK_OK:
388
                     wsprintf(szMessage, "%s", "All files extracted OK");
389
                     break;
390
                case PK_ERR:
391
                     wsprintf(szMessage, "%s", "Warning occurred on one or more files");
392
                     break;
393
                case PK_BADERR:
394
                     wsprintf(szMessage, "%s", "Error in archive");
395
                     break;
396
                case PK_MEM:
397
                case PK_MEM2:
398
                case PK_MEM3:
399
                case PK_MEM4:
400
                case PK_MEM5:
401
                     wsprintf(szMessage, "%s", "Insufficient memory");
402
                     break;
403
                case PK_NOZIP:
404
                     wsprintf(szMessage, "%s", "Archive not found");
405
                     break;
406
                case PK_FIND:
407
                     wsprintf(szMessage, "%s", "No files found");
408
                     break;
409
                case PK_DISK:
410
                     wsprintf(szMessage, "%s", "Disk full");
411
                     break;
412
                case PK_EOF:
413
                     wsprintf(szMessage, "%s", "Unexpected end of file");
414
                     break;
415
                case IZ_UNSUP:
416
                     wsprintf(szMessage, "%s", "No files found: All unsupported");
417
                     break;
418
                case IZ_BADPWD:
419
                     wsprintf(szMessage, "%s", "No files found: Bad password");
420
                     break;
421
                default:
422
                     wsprintf(szMessage, "%s", "Unknown error");
423
                     break;
424
                }
425
               MessageBox(hDlg, szMessage, szAppName, MB_OK);
426
/* Uncomment line below to have SFXWix terminate automatically
427
   when done.
428
 */
429
//              EndDialog(hDlg, wParam);
430
 
431
               break;
432
               case IDCANCEL:
433
                    EndDialog(hDlg, wParam);
434
                    PostQuitMessage(0);
435
                    exit(0); // ..and then quit
436
                    break;
437
         }
438
         break;
439
 
440
      default:
441
         fProcessed = FALSE;
442
         break;
443
   }
444
   return(fProcessed);
445
}
446
 
447
 
448
#define WasCancelled(hDlg) (!IsWindowEnabled(GetDlgItem(hDlg,IDCANCEL)))
449
 
450
#ifdef __BORLANDC__
451
#pragma argsused
452
#endif
453
int WINAPI password(LPSTR p, int n, LPCSTR m, LPCSTR name)
454
{
455
TCHAR sz[MAX_PATH];
456
sprintf(sz, "%s is encrypted", name);
457
MessageBox(hWnd, sz, "Encryption not supported", MB_OK);
458
return IZ_PW_CANCELALL;
459
}
460
 
461
int WINAPI DisplayBuf(TCHAR far *buf, unsigned long size)
462
{
463
if ((buf[0] != '\n') && (buf[0] != '\r'))
464
   SetDlgItemText(hWnd, ID_STATUS, buf);
465
return (unsigned int) size;
466
}
467
 
468
#ifdef __BORLANDC__
469
#pragma argsused
470
#endif
471
int WINAPI GetReplaceDlgRetVal(LPSTR filename, unsigned fnbufsiz)
472
{
473
#ifndef WIN32
474
FARPROC lpfnprocReplace;
475
#endif
476
int ReplaceDlgRetVal;   /* replace dialog return value */
477
 
478
#ifdef WIN32
479
ReplaceDlgRetVal = DialogBoxParam(hInst, "Replace",
480
   hWnd, (DLGPROC)ReplaceProc, (DWORD)filename);
481
#else
482
lpfnprocReplace = MakeProcInstance(ReplaceProc, hInst);
483
ReplaceDlgRetVal = DialogBoxParam(hInst, "Replace",
484
   hWnd, lpfnprocReplace, (DWORD)filename);
485
FreeProcInstance(lpfnprocReplace);
486
#endif
487
return ReplaceDlgRetVal;
488
}
489
 
490
#ifdef __BORLANDC__
491
#pragma argsused
492
#endif
493
#ifdef Z_UINT8_DEFINED
494
void WINAPI ReceiveDllMessage(z_uint8 ucsize, z_uint8 csiz,
495
    unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh,
496
    unsigned mm, TCHAR c, LPCSTR filename, LPCSTR methbuf, unsigned long crc,
497
    TCHAR fCrypt)
498
{
499
}
500
#else
501
void WINAPI ReceiveDllMessage(unsigned long ucsize, unsigned long csiz,
502
    unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh,
503
    unsigned mm, TCHAR c, LPCSTR filename, LPCSTR methbuf, unsigned long crc,
504
    TCHAR fCrypt)
505
{
506
}
507
#endif
508
void WINAPI ReceiveDllMessage_NO_INT64(unsigned long ucsize_low,
509
   unsigned long ucsize_high, unsigned long csiz_low, unsigned long csiz_high,
510
   unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh,
511
   unsigned mm, TCHAR c, LPCSTR filename, LPCSTR methbuf, unsigned long crc,
512
   TCHAR fCrypt)
513
{
514
}
515
 
516
#ifdef __BORLANDC__
517
#pragma argsused
518
#endif
519
 
520
int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
521
                    LPSTR lpszCmdLine, int nCmdShow)
522
{
523
TCHAR *ptr = NULL;
524
hInst = hInstance;
525
 
526
hDCL = GlobalAlloc( GPTR, (DWORD)sizeof(DCL));
527
if (!hDCL)
528
   {
529
   return 0;
530
   }
531
lpDCL = (LPDCL)GlobalLock(hDCL);
532
if (!lpDCL)
533
   {
534
   return 0;
535
   }
536
 
537
hUF = GlobalAlloc( GPTR, (DWORD)sizeof(USERFUNCTIONS));
538
if (!hUF)
539
   {
540
   return 0;
541
   }
542
lpUserFunctions = (LPUSERFUNCTIONS)GlobalLock(hUF);
543
 
544
if (!lpUserFunctions)
545
   {
546
   return 0;
547
   }
548
 
549
lpUserFunctions->password = password;
550
lpUserFunctions->print = DisplayBuf;
551
lpUserFunctions->sound = NULL;
552
lpUserFunctions->replace = GetReplaceDlgRetVal;
553
lpUserFunctions->SendApplicationMessage = ReceiveDllMessage;
554
lpUserFunctions->SendApplicationMessage_i32 = ReceiveDllMessage_NO_INT64;
555
lpUserFunctions->ServCallBk = NULL;
556
 
557
 
558
 
559
GetModuleFileName(hInstance,(LPSTR)szThisApp,sizeof(szThisApp));
560
lstrcpy(zfn, szThisApp);
561
 
562
ptr = strrchr(szThisApp, '\\');
563
if (ptr != NULL)
564
   {
565
   lstrcpy(szAppName, ptr);
566
   ptr[0] = '\0';
567
   lstrcpy(szTarget, szThisApp);
568
 
569
   iReturn = DialogBox(hInstance, MAKEINTRESOURCE(INITDIALOG),
570
         (HWND)NULL, (DLGPROC)InitDialogProc);
571
   DestroyWindow((HWND) INITDIALOG);
572
 
573
#ifdef WIN32
574
   SetCurrentDirectory(szHomeDir);
575
#else
576
   getcwd(szTarget, MAX_PATH);
577
   chdir(szHomeDir);
578
   setdisk(toupper(szHomeDir[0]) - 'A');
579
#endif
580
   }
581
PostQuitMessage(0);
582
return (0);
583
}