source: trunk/dll/avv.c@ 1330

Last change on this file since 1330 was 1297, checked in by John Small, 17 years ago

AVV.C: Fix support for non-EXE's in archiver definitions.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 27.5 KB
Line 
1
2/***********************************************************************
3
4 $Id: avv.c 1297 2008-11-23 20:47:07Z jbs $
5
6 archiver.bb2 editor
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2004, 2007 Steven H.Levine
10
11 31 Jul 04 SHL ArcReviewDlgProc: correct nameis... decodes
12 01 Aug 04 SHL Localize functions
13 01 Aug 04 SHL Rework fixup usage
14 06 Jun 05 SHL Drop unused
15 14 Aug 05 SHL rewrite_archiverbb2: avoid dereferencing null signature
16 14 Aug 05 SHL ArcReviewDlgProc: ensure signature allocated
17 29 May 06 SHL EditArchiverDefinition: rework
18 26 Jun 06 SHL rewrite_archiverbb2: include user comments
19 14 Jul 06 SHL Use Runtime_Error
20 29 Jul 06 SHL Use xfgets
21 30 Jul 06 SHL Avoid warnings when editing new definition
22 22 Mar 07 GKY Use QWL_USER
23 16 Jun 07 SHL Update for OpenWatcom
24 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
25 06 Jan 08 GKY Use NormalizeCmdLine to check program strings on entry
26 29 Feb 08 GKY Changes to enable user settable command line length
27 24 Aug 08 GKY Fix truncation of cmdline length to 3 characters is now MaxComLineStrg
28 24 Aug 08 GKY Warn full drive on save of .BB2 file; prevent loss of existing file
29 23 Nov 08 JBS Support use of CMD files in archiver definitions
30
31***********************************************************************/
32
33#include <stdlib.h>
34#include <string.h>
35#include <time.h>
36
37#define INCL_DOS
38#define INCL_WIN
39#define INCL_LONGLONG // dircnrs.h
40
41#include "fm3dll.h"
42#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
43#include "arccnrs.h" // Data declaration(s)
44#include "notebook.h" // Data declaration(s)
45#include "init.h" // Data declaration(s)
46#include "mainwnd.h" // Data declaration(s)
47#include "fm3dlg.h"
48#include "version.h"
49#include "fm3str.h"
50#include "strutil.h" // GetPString
51#include "errutil.h" // Runtime_Error
52#include "cmdline.h" // CmdLineDlgProc
53#include "avv.h"
54#include "literal.h" // fixup
55#include "avl.h" // SBoxDlgProc
56#include "wrappers.h" // xfgets
57#include "pathutil.h" // NormalizeCmdLine
58#include "strips.h" // bstrip
59#include "misc.h" // CheckDriveSpaceAvail
60#include "srchpath.h" // searchpath
61#include "systemf.h" // runemf2
62#include "fortify.h"
63
64// Data definitions
65#pragma data_seg(DATA1)
66
67static PSZ pszSrcFile = __FILE__;
68
69static PSZ checkfile(PSZ file, INT * error);
70static BOOL check_archiver(HWND hwnd, ARC_TYPE * info);
71static INT get_int_from_window(HWND hwnd, USHORT id);
72static LONG get_long_from_window(HWND hwnd, USHORT id);
73static PSZ nonull(PSZ a);
74static PSZ free_and_strdup_from_window(HWND hwnd, USHORT id, PSZ pszDest);
75static PSZ free_and_strdup_quoted_from_window(HWND hwnd, USHORT id, PSZ pszDest);
76
77#pragma data_seg(GLOBAL2)
78CHAR archiverbb2[CCHMAXPATH];
79
80//=== EditArchiverDefinition() Select archiver to edit definition ===
81VOID EditArchiverDefinition(HWND hwnd)
82{
83 ARCDUMP ad;
84 ARC_TYPE *pat;
85
86 // Allow multiple edits
87 for (;;) {
88 pat = NULL; // Do not hide dups
89 if (!WinDlgBox(HWND_DESKTOP,
90 hwnd,
91 SBoxDlgProc,
92 FM3ModHandle, ASEL_EDIT_FRAME, (PVOID) & pat) || !pat) {
93 break; // we are done
94 }
95
96 memset(&ad, 0, sizeof(ARCDUMP));
97 ad.info = pat;
98 WinDlgBox(HWND_DESKTOP,
99 hwnd, ArcReviewDlgProc, FM3ModHandle, AD_FRAME, MPFROMP(&ad));
100 } // for
101}
102
103static PSZ free_and_strdup_from_window(HWND hwnd, USHORT id, PSZ pszDest)
104{
105 CHAR sz[256];
106
107 xfree(pszDest, pszSrcFile, __LINE__);
108 WinQueryDlgItemText(hwnd, id, sizeof(sz), sz);
109 if (*sz)
110 pszDest = xstrdup(sz, pszSrcFile, __LINE__);
111 else
112 pszDest = NULL;
113 return pszDest;
114}
115
116static PSZ free_and_strdup_quoted_from_window(HWND hwnd, USHORT id, PSZ pszDest)
117{ // fixme for command line limit
118 CHAR *szCmdLine;
119 PSZ pszWorkBuf;
120
121 szCmdLine = xmalloc(MaxComLineStrg, pszSrcFile, __LINE__);
122 if (szCmdLine) {
123 xfree(pszDest, pszSrcFile, __LINE__);
124 WinQueryDlgItemText(hwnd, id, MaxComLineStrg, szCmdLine);
125 pszWorkBuf = xmalloc(MaxComLineStrg, pszSrcFile, __LINE__);
126 if (pszWorkBuf) {
127 NormalizeCmdLine(pszWorkBuf, szCmdLine);
128 pszDest = xstrdup(pszWorkBuf, pszSrcFile, __LINE__);
129 free(pszWorkBuf);
130 }
131 else
132 pszDest = xstrdup(szCmdLine, pszSrcFile, __LINE__); // return the unexamined input on failure
133 free(szCmdLine);
134 }
135 else
136 pszDest = NULL;
137 return pszDest;
138}
139
140static INT get_int_from_window(HWND hwnd, USHORT id)
141{
142 CHAR s[256];
143
144 WinQueryDlgItemText(hwnd, id, sizeof(s), s);
145 return atoi(s);
146}
147
148static INT get_int2_from_window(HWND hwnd, USHORT id)
149{
150 CHAR s[256];
151 PSZ p;
152
153 WinQueryDlgItemText(hwnd, id, sizeof(s), s);
154 p = strchr(s, ',');
155 if (p)
156 p++;
157 return p ? atoi(p) : 0;
158}
159
160INT get_int3_from_window(HWND hwnd, USHORT id)
161{
162 CHAR s[256];
163 PSZ p;
164
165 WinQueryDlgItemText(hwnd, id, sizeof(s), s);
166 p = strchr(s, ',');
167 if (p) {
168 p++;
169 p = strchr(p, ',');
170 if (p)
171 p++;
172 }
173 return p ? atoi(p) : 0;
174}
175
176INT get_int4_from_window(HWND hwnd, USHORT id)
177{
178 CHAR s[256];
179 PSZ p;
180
181 WinQueryDlgItemText(hwnd, id, sizeof(s), s);
182 p = strchr(s, ',');
183 if (p) {
184 p++;
185 p = strchr(p, ',');
186 if (p) {
187 p++;
188 p = strchr(p, ',');
189 if (p)
190 p++;
191 }
192 }
193 return p ? atoi(p) : 0;
194}
195
196LONG get_long_from_window(HWND hwnd, USHORT id)
197{
198 CHAR s[256];
199
200 WinQueryDlgItemText(hwnd, id, sizeof(s), s);
201 return atol(s);
202}
203
204
205// nonull - convert NULL pointer to empty string
206
207static PSZ nonull(PSZ psz)
208{
209 if (!psz)
210 psz = NullStr;
211 return psz;
212}
213
214//=== rewrite_archiverbb2() rewrite archiver.bb2, prompt if arg NULL, merge comments ===
215
216VOID rewrite_archiverbb2(PSZ archiverbb2)
217{
218 FILE *fpNew;
219 FILE *fpOld = NULL;
220 UINT entry_num = 0; // Definition counter
221 UINT input_line_num = 0; // Input file line counter
222 ARC_TYPE *pat;
223 CHAR sz[258];
224 CHAR *psz;
225 BOOL needEntryNumber;
226 BOOL needReload = FALSE; // Because line numbers changed
227 time_t t;
228 struct tm *tm;
229 CHAR ch;
230
231 arcsigsmodified = FALSE;
232
233 if (!arcsighead) {
234 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
235 HWND_DESKTOP,
236 GetPString(IDS_SAYWHATTEXT), GetPString(IDS_NOINFOTOSAVETEXT));
237 return;
238 }
239 // Alert unless file name passed
240 if (!archiverbb2 || !*archiverbb2) {
241 saymsg(MB_ENTER | MB_ICONASTERISK,
242 HWND_DESKTOP,
243 GetPString(IDS_NOTETEXT), GetPString(IDS_SAVEARCBB2TEXT));
244 archiverbb2 = GetPString(IDS_ARCHIVERBB2);
245 }
246 /* Check space on drive*/
247 if (CheckDriveSpaceAvail(archiverbb2, ullDATFileSpaceNeeded * 4, 1) == 2) //* 4 is because this file is larger than other .dat files
248 return; //already gave error msg
249
250 /* save a backup */
251 psz = strrchr(archiverbb2, '.');
252 if (psz && !stricmp(psz, ".BB2")) {
253 strcpy(psz, ".BAK");
254 DosDelete(archiverbb2);
255 strcpy(sz, archiverbb2);
256 strcpy(psz, ".BB2");
257 DosMove(archiverbb2, sz);
258 fpOld = fopen(sz, "r"); // OK for file not to exist
259 }
260
261 fpNew = fopen(archiverbb2, "w");
262
263 if (fpNew) {
264
265 fprintf(fpNew, "%u\n", LINES_PER_ARCSIG);
266 t = time(NULL);
267 tm = localtime(&t);
268
269 fprintf(fpNew,
270 ";\n; %s file written by FM/2 v%d.%02d on %u/%u/%u %u:%02u:%02u\n;\n",
271 GetPString(IDS_ARCHIVERBB2),
272 VERMAJOR, VERMINOR,
273 tm->tm_mon + 1, tm->tm_mday, tm->tm_year + 1900,
274 tm->tm_hour, tm->tm_min, tm->tm_sec);
275 // Rewrite header if known
276 if (fpOld && arcsigs_header_lines) {
277 needReload = TRUE;
278 while (input_line_num < arcsigs_header_lines) {
279 psz = xfgets(sz, sizeof(sz), fpOld, pszSrcFile, __LINE__);
280 if (!psz)
281 break;
282 input_line_num++;
283 if (input_line_num == 1)
284 continue; // Bypass sig count
285 fputs(sz, fpNew);
286 }
287 }
288 else {
289 // Write default header
290 fputs(GetPString(IDS_ARCHIVERBB2TEXT), fpNew);
291 }
292 pat = arcsighead;
293 while (pat) {
294 needEntryNumber = TRUE;
295 // Rewrite per sig header comments if any exist
296 if (fpOld && pat->comment_line_num) {
297 needReload = TRUE; // fixme to optimize
298 // Definitions reordered - need to rewind
299 if (input_line_num > pat->comment_line_num) {
300 fseek(fpOld, 0, SEEK_SET);
301 input_line_num = 0;
302 }
303 while (input_line_num + 1 < pat->defn_line_num) {
304 psz = xfgets(sz, sizeof(sz), fpOld, pszSrcFile, __LINE__);
305 if (!psz)
306 break; // Unexpected EOF
307 input_line_num++;
308 if (input_line_num < pat->comment_line_num)
309 continue;
310 if (needEntryNumber && strnicmp(sz, "; Entry #", 9) == 0) {
311 // Rewrite entry count comment
312 needEntryNumber = FALSE;
313 for (psz = sz + 9; *psz == ' '; psz++) ; // Find non-blank
314 for (; (ch = *psz) >= '0' && ch <= '9'; psz++) ; // Find end of entry#
315 fprintf(fpNew, GetPString(IDS_ENTRYCNTRTEXT), ++entry_num);
316 fputs(psz, fpNew);
317 }
318 else {
319 fputs(sz, fpNew);
320 }
321 }
322 }
323
324 if (needEntryNumber) {
325 fputs(";\n", fpNew);
326 fprintf(fpNew, GetPString(IDS_ENTRYCNTRTEXT), ++entry_num);
327 if (pat->id)
328 fprintf(fpNew, " (%s)", pat->id);
329 fputs("\n;\n", fpNew);
330 }
331
332 fprintf(fpNew,
333 "%s\n%s\n%ld\n%s\n",
334 nonull(pat->id),
335 nonull(pat->ext), pat->file_offset, nonull(pat->list));
336 fprintf(fpNew,
337 "%s\n%s\n%s\n%s\n%s\n%s\n",
338 nonull(pat->extract),
339 nonull(pat->exwdirs),
340 nonull(pat->test),
341 nonull(pat->create),
342 nonull(pat->createwdirs), nonull(pat->createrecurse));
343 fprintf(fpNew,
344 "%s\n%s\n%s\n",
345 nonull(pat->move), nonull(pat->movewdirs), nonull(pat->delete));
346 fprintf(fpNew,
347 "%s\n%s\n%s\n%d\n%d\n%d,%d\n%d\n%d,%lu,%lu,%lu\n",
348 fixup(pat->signature,
349 sz,
350 sizeof(sz),
351 pat->siglen),
352 nonull(pat->startlist),
353 nonull(pat->endlist),
354 pat->osizepos,
355 pat->nsizepos,
356 pat->fdpos,
357 pat->datetype,
358 pat->fdflds,
359 pat->fnpos, pat->nameislast, pat->nameisnext, pat->nameisfirst);
360 pat = pat->next;
361 } // while more sigs
362
363 // Rewrite trailer comments if known
364 if (fpOld && arcsigs_trailer_line_num) {
365 for (;;) {
366 psz = xfgets(sz, sizeof(sz), fpOld, pszSrcFile, __LINE__);
367 if (!psz)
368 break;
369 input_line_num++;
370 if (input_line_num < arcsigs_trailer_line_num)
371 continue; // Bypass sig count
372 fputs(sz, fpNew);
373 }
374 }
375
376 fclose(fpNew);
377
378 } // if fpNew open OK
379
380 if (fpOld)
381 fclose(fpOld);
382
383 if (needReload)
384 load_archivers(); // Resync commend line numbers
385}
386
387static PSZ checkfile(PSZ file, INT * error)
388{
389 CHAR *p, *pp = NULL;
390 INT ret;
391 ULONG apptype;
392
393 if (!file || !*file) {
394 *error = 3;
395 return NULL;
396 }
397 pp = strchr(file, ' ');
398 if (pp)
399 *pp = 0;
400 p = searchpath(file);
401 if (!p || !*p)
402 *error = 1;
403 else {
404 ret = (INT) DosQueryAppType(p, &apptype);
405 apptype &= (~FAPPTYP_32BIT);
406 if (!apptype ||
407 (apptype == FAPPTYP_NOTWINDOWCOMPAT) ||
408 (apptype == FAPPTYP_WINDOWCOMPAT) ||
409 (apptype & FAPPTYP_BOUND) ||
410 (apptype & FAPPTYP_WINDOWAPI) || (apptype & FAPPTYP_DOS)) {
411 *error = 0;
412 }
413 else
414 *error = 2;
415 }
416 if (pp)
417 *pp = ' ';
418 return p;
419}
420
421
422static BOOL check_archiver(HWND hwnd, ARC_TYPE * info)
423{
424 BOOL noStart = FALSE, noEnd = FALSE, badPos = FALSE;
425 INT badList = 0, badCreate = 0, badExtract = 0;
426 static PSZ aerrors[3];
427
428 aerrors[0] = GetPString(IDS_STARTLISTEMPTYTEXT);
429 aerrors[1] = GetPString(IDS_ENDLISTEMPTYTEXT);
430 aerrors[2] = GetPString(IDS_BOGUSNAMETEXT);
431 if (!info->startlist || !*info->startlist)
432 noStart = TRUE;
433 if (!info->endlist || !*info->endlist)
434 noEnd = TRUE;
435 if (info->fnpos > 50 || info->fnpos < -1)
436 badPos = TRUE;
437 checkfile(info->list, &badList);
438 checkfile(info->create, &badCreate);
439 checkfile(info->extract, &badExtract);
440 if (!noStart && !noEnd && !badPos && !badList && !badCreate && !badExtract)
441 return TRUE; // OK
442 if (!info->id)
443 return FALSE; // Assume new if no id
444 saymsg(MB_ENTER | MB_ICONASTERISK,
445 hwnd,
446 GetPString(IDS_WARNINGSTEXT),
447 GetPString(IDS_AVVCHK1TEXT),
448 noStart ? aerrors[0] : NullStr,
449 noEnd ? aerrors[1] : NullStr,
450 badPos ? aerrors[2] : NullStr,
451 badList == 1 ?
452 GetPString(IDS_AVVCHK2TEXT) :
453 badList == -1 ?
454 GetPString(IDS_AVVCHK3TEXT) :
455 badList == 2 ?
456 GetPString(IDS_AVVCHK4TEXT) :
457 badList == 3 ?
458 GetPString(IDS_AVVCHK5TEXT) :
459 NullStr,
460 badCreate == 1 ?
461 GetPString(IDS_AVVCHK6TEXT) :
462 badCreate == -1 ?
463 GetPString(IDS_AVVCHK7TEXT) :
464 badCreate == 2 ?
465 GetPString(IDS_AVVCHK8TEXT) :
466 badCreate == 3 ?
467 GetPString(IDS_AVVCHK9TEXT) :
468 NullStr,
469 badExtract == 1 ?
470 GetPString(IDS_AVVCHK10TEXT) :
471 badExtract == -1 ?
472 GetPString(IDS_AVVCHK11TEXT) :
473 badExtract == 2 ?
474 GetPString(IDS_AVVCHK12TEXT) :
475 badExtract == 3 ? GetPString(IDS_AVVCHK13TEXT) : NullStr);
476 if (badList || badExtract)
477 return FALSE; // Problems
478 return TRUE; // OK
479}
480
481//=== ArcReviewDlgProc() View/edit single archiver.bb2 setup ===
482
483MRESULT EXPENTRY ArcReviewDlgProc(HWND hwnd, ULONG msg, MPARAM mp1,
484 MPARAM mp2)
485{
486 ARCDUMP *admp;
487 CHAR s[256];
488 SHORT sSelect;
489
490 if (msg != WM_INITDLG)
491 admp = (ARCDUMP *) WinQueryWindowPtr(hwnd, QWL_USER);
492
493 switch (msg) {
494 case WM_INITDLG:
495 admp = (ARCDUMP *) mp2;
496 if (!admp || !admp->info) {
497 WinDismissDlg(hwnd, 0);
498 return 0;
499 }
500
501 WinSetWindowPtr(hwnd, QWL_USER, mp2);
502
503 WinSendDlgItemMsg(hwnd, AD_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
504 for (sSelect = AD_ID; sSelect < AD_ADDWPATHS + 1; sSelect++) {
505 WinSendDlgItemMsg(hwnd,
506 sSelect,
507 EM_SETTEXTLIMIT,
508 MPFROM2SHORT(sizeof(s) - 1, 0), MPVOID);
509 }
510 if (admp->info->id)
511 WinSetDlgItemText(hwnd, AD_ID, admp->info->id);
512 if (admp->info->ext)
513 WinSetDlgItemText(hwnd, AD_EXT, admp->info->ext);
514 sprintf(s, "%ld", admp->info->file_offset);
515 WinSetDlgItemText(hwnd, AD_SIGPOS, s);
516 if (admp->info->siglen) {
517 WinSetDlgItemText(hwnd,
518 AD_SIG,
519 fixup(admp->info->signature,
520 s, sizeof(s), admp->info->siglen));
521 }
522 if (admp->info->startlist)
523 WinSetDlgItemText(hwnd, AD_STARTLIST, admp->info->startlist);
524 if (admp->info->endlist)
525 WinSetDlgItemText(hwnd, AD_ENDLIST, admp->info->endlist);
526 if (admp->info->list)
527 WinSetDlgItemText(hwnd, AD_LIST, admp->info->list);
528 sprintf(s,
529 "%d,%d,%d,%d",
530 admp->info->fnpos,
531 admp->info->nameislast,
532 admp->info->nameisnext, admp->info->nameisfirst);
533 WinSetDlgItemText(hwnd, AD_FNAMEPOS, s);
534 sprintf(s, "%d", admp->info->osizepos);
535 WinSetDlgItemText(hwnd, AD_OLDSZ, s);
536 sprintf(s, "%d", admp->info->nsizepos);
537 WinSetDlgItemText(hwnd, AD_NEWSZ, s);
538 sprintf(s, "%d,%d", admp->info->fdpos, admp->info->datetype);
539 WinSetDlgItemText(hwnd, AD_DATEPOS, s);
540 sprintf(s, "%d", admp->info->fdflds);
541 WinSetDlgItemText(hwnd, AD_NUMDATEFLDS, s);
542 if (admp->info->extract)
543 WinSetDlgItemText(hwnd, AD_EXTRACT, admp->info->extract);
544 if (admp->info->exwdirs)
545 WinSetDlgItemText(hwnd, AD_WDIRS, admp->info->exwdirs);
546 if (admp->info->test)
547 WinSetDlgItemText(hwnd, AD_TEST, admp->info->test);
548 if (admp->info->create)
549 WinSetDlgItemText(hwnd, AD_ADD, admp->info->create);
550 if (admp->info->move)
551 WinSetDlgItemText(hwnd, AD_MOVE, admp->info->move);
552 if (admp->info->delete)
553 WinSetDlgItemText(hwnd, AD_DELETE, admp->info->delete);
554 if (admp->info->createrecurse)
555 WinSetDlgItemText(hwnd, AD_ADDRECURSE, admp->info->createrecurse);
556 if (admp->info->createwdirs)
557 WinSetDlgItemText(hwnd, AD_ADDWPATHS, admp->info->createwdirs);
558 if (admp->info->movewdirs)
559 WinSetDlgItemText(hwnd, AD_MOVEWPATHS, admp->info->movewdirs);
560
561 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
562 break; // WM_INITDLG
563
564 case UM_SETUP:
565 if (admp->listname && *admp->listname) {
566
567 FILE *fp = fopen(admp->listname, "r");
568
569 if (!fp) {
570 WinSendDlgItemMsg(hwnd,
571 AD_LISTBOX,
572 LM_INSERTITEM,
573 MPFROM2SHORT(LIT_END, 0),
574 MPFROMP(GetPString(IDS_CANTOPENFILETEXT)));
575 }
576 else {
577 while (!feof(fp)) {
578 if (!xfgets(s, sizeof(s), fp, pszSrcFile, __LINE__))
579 break;
580 stripcr(s);
581 WinSendDlgItemMsg(hwnd,
582 AD_LISTBOX,
583 LM_INSERTITEM,
584 MPFROM2SHORT(LIT_END, 0), MPFROMP(s));
585 }
586 fclose(fp);
587 }
588 }
589 else {
590 WinSendDlgItemMsg(hwnd,
591 AD_LISTBOX,
592 LM_INSERTITEM,
593 MPFROM2SHORT(LIT_END, 0),
594 MPFROMP(GetPString(IDS_NOTAPPLICABLETEXT)));
595 }
596 check_archiver(hwnd, admp->info);
597 return 0;
598
599 case WM_ADJUSTWINDOWPOS:
600 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
601 break;
602
603 case UM_SETDIR:
604 PaintRecessedWindow(WinWindowFromID(hwnd, AD_HELP), (HPS) 0, FALSE, TRUE);
605 return 0;
606
607 case WM_CONTROL:
608 switch (SHORT1FROMMP(mp1)) {
609 case AD_LISTBOX:
610 switch (SHORT2FROMMP(mp1)) {
611 case LN_ENTER:
612 for (sSelect = 0; sSelect < 10; sSelect++)
613 WinSetDlgItemText(hwnd, AD_FLD1 + sSelect, NullStr);
614 if (!admp->listname)
615 Runtime_Error(pszSrcFile, __LINE__, "no listname");
616 else {
617 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
618 AD_LISTBOX,
619 LM_QUERYSELECTION,
620 MPVOID, MPVOID);
621 WinSendDlgItemMsg(hwnd,
622 AD_LISTBOX,
623 LM_QUERYITEMTEXT,
624 MPFROM2SHORT(sSelect, 255), MPFROMP(s));
625 if (!*s)
626 Runtime_Error(pszSrcFile, __LINE__, "no text");
627 else {
628 PSZ p;
629 PSZ pp;
630
631 p = s;
632 for (sSelect = 0; sSelect < 10; sSelect++) {
633 pp = p;
634 while (*pp == ' ' || *pp == '\t')
635 pp++;
636 if (!*pp)
637 break;
638 p = pp;
639 while (*p && (*p != ' ' && *p != '\t'))
640 p++;
641 if (*p)
642 *p++ = 0;
643 WinSetDlgItemText(hwnd, AD_FLD1 + sSelect, pp);
644 }
645 }
646 }
647 break;
648
649 case LN_KILLFOCUS:
650 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
651 break;
652
653 case LN_SETFOCUS:
654 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_TEXTARCPRODUCEDTEXT));
655 break;
656 }
657 break;
658
659 case AD_ID:
660 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
661 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
662 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
663 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADIDTEXT));
664 break;
665
666 case AD_ADD:
667 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
668 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
669 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
670 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADADDTEXT));
671 break;
672
673 case AD_MOVE:
674 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
675 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
676 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
677 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADMOVETEXT));
678 break;
679
680 case AD_EXT:
681 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
682 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
683 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
684 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADEXTTEXT));
685 break;
686
687 case AD_EXTRACT:
688 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
689 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
690 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
691 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADEXTRACTTEXT));
692 break;
693
694 case AD_WDIRS:
695 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
696 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
697 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
698 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADWDIRSTEXT));
699 break;
700
701 case AD_SIG:
702 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
703 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
704 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
705 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADSIGTEXT));
706 break;
707
708 case AD_LIST:
709 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
710 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
711 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
712 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADLISTTEXT));
713 break;
714
715 case AD_TEST:
716 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
717 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
718 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
719 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADTESTTEXT));
720 break;
721
722 case AD_ADDWPATHS:
723 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
724 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
725 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
726 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADADDWPATHSTEXT));
727 break;
728
729 case AD_MOVEWPATHS:
730 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
731 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
732 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
733 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADMOVEWPATHSTEXT));
734 break;
735
736 case AD_ADDRECURSE:
737 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
738 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
739 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
740 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADADDRECURSETEXT));
741 break;
742
743 case AD_DELETE:
744 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
745 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
746 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
747 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADDELETETEXT));
748 break;
749
750 case AD_SIGPOS:
751 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
752 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
753 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
754 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADSIGPOSTEXT));
755 break;
756
757 case AD_FNAMEPOS:
758 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
759 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
760 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
761 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADFNAMEPOSTEXT));
762 break;
763
764 case AD_OLDSZ:
765 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
766 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
767 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
768 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADOLDSZTEXT));
769 break;
770
771 case AD_NUMDATEFLDS:
772 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
773 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
774 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
775 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADNUMDATEFLDSTEXT));
776 break;
777
778 case AD_DATEPOS:
779 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
780 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
781 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
782 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADDATEPOSTEXT));
783 break;
784
785 case AD_NEWSZ:
786 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
787 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
788 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
789 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADNEWSZTEXT));
790 break;
791
792 case AD_STARTLIST:
793 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
794 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
795 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
796 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADSTARTLISTTEXT));
797 break;
798
799 case AD_ENDLIST:
800 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
801 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
802 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
803 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADENDLISTTEXT));
804 break;
805
806 }
807 return 0;
808
809 case WM_COMMAND:
810 switch (SHORT1FROMMP(mp1)) {
811 case AD_SEEEXTRACTOR:
812 case AD_SEEADDER:
813 {
814 static CHAR tempargs[1026];
815
816 *tempargs = 0;
817 if (SHORT1FROMMP(mp1) == AD_SEEADDER)
818 WinQueryDlgItemText(hwnd, AD_ADD, 255, tempargs);
819 else
820 WinQueryDlgItemText(hwnd, AD_EXTRACT, 255, tempargs);
821 if (!*tempargs)
822 saymsg(MB_CANCEL,
823 hwnd,
824 GetPString(IDS_BZZZTTEXT), GetPString(IDS_NEEDENTRYTEXT));
825 else {
826
827 PSZ p;
828
829 lstrip(tempargs);
830 p = strchr(tempargs, ' ');
831 if (p)
832 *p = 0;
833 {
834 EXECARGS ex;
835
836 ex.flags = SEPARATEKEEP | WINDOWED | MAXIMIZED;
837 ex.commandline = tempargs;
838 *ex.path = 0;
839 *ex.environment = 0;
840 if (WinDlgBox(HWND_DESKTOP,
841 hwnd,
842 CmdLineDlgProc, FM3ModHandle, EXEC_FRAME, &ex) == 1)
843 runemf2(ex.flags,
844 hwnd, pszSrcFile, __LINE__,
845 NULL,
846 (*ex.environment) ? ex.environment : NULL,
847 "%s", tempargs);
848 }
849 }
850 }
851 return 0;
852
853 case DID_OK:
854 // fixme to avoid creating empty strings for startlist and endlist
855 admp->info->startlist =
856 free_and_strdup_from_window(hwnd, AD_STARTLIST,
857 admp->info->startlist);
858 admp->info->endlist =
859 free_and_strdup_from_window(hwnd, AD_ENDLIST, admp->info->endlist);
860 admp->info->id =
861 free_and_strdup_from_window(hwnd, AD_ID, admp->info->id);
862 admp->info->create =
863 free_and_strdup_quoted_from_window(hwnd, AD_ADD, admp->info->create);
864 admp->info->createwdirs =
865 free_and_strdup_quoted_from_window(hwnd, AD_ADDWPATHS,
866 admp->info->createwdirs);
867 admp->info->createrecurse =
868 free_and_strdup_quoted_from_window(hwnd, AD_ADDRECURSE,
869 admp->info->createrecurse);
870 admp->info->movewdirs =
871 free_and_strdup_quoted_from_window(hwnd, AD_MOVEWPATHS,
872 admp->info->movewdirs);
873 admp->info->move =
874 free_and_strdup_quoted_from_window(hwnd, AD_MOVE, admp->info->move);
875 admp->info->delete =
876 free_and_strdup_quoted_from_window(hwnd, AD_DELETE, admp->info->delete);
877 admp->info->test =
878 free_and_strdup_quoted_from_window(hwnd, AD_TEST, admp->info->test);
879 admp->info->extract =
880 free_and_strdup_quoted_from_window(hwnd, AD_EXTRACT, admp->info->extract);
881 admp->info->exwdirs =
882 free_and_strdup_quoted_from_window(hwnd, AD_WDIRS, admp->info->exwdirs);
883 admp->info->ext =
884 free_and_strdup_from_window(hwnd, AD_EXT, admp->info->ext);
885 admp->info->signature =
886 free_and_strdup_from_window(hwnd, AD_SIG, admp->info->signature);
887 admp->info->siglen = literal(admp->info->signature);
888 admp->info->list = free_and_strdup_quoted_from_window(hwnd,
889 AD_LIST,
890 admp->info->list);
891 admp->info->file_offset = get_long_from_window(hwnd, AD_SIGPOS);
892 admp->info->osizepos = get_int_from_window(hwnd, AD_OLDSZ);
893 admp->info->nsizepos = get_int_from_window(hwnd, AD_NEWSZ);
894 admp->info->fdpos = get_int_from_window(hwnd, AD_DATEPOS);
895 admp->info->datetype = get_int2_from_window(hwnd, AD_DATEPOS);
896 admp->info->fdflds = get_int_from_window(hwnd, AD_NUMDATEFLDS);
897 admp->info->fnpos = get_int_from_window(hwnd, AD_FNAMEPOS);
898 admp->info->nameislast =
899 (get_int2_from_window(hwnd, AD_FNAMEPOS)) ? TRUE : FALSE;
900 admp->info->nameisnext =
901 (get_int3_from_window(hwnd, AD_FNAMEPOS)) ? TRUE : FALSE;
902 admp->info->nameisfirst =
903 (get_int4_from_window(hwnd, AD_FNAMEPOS)) ? TRUE : FALSE;
904 {
905 INT ok = check_archiver(hwnd, admp->info);
906
907 if (saymsg(MB_YESNO,
908 hwnd,
909 GetPString(IDS_ADCHANGESINMEMTEXT),
910 GetPString(IDS_ADREWRITETEXT),
911 !ok ? GetPString(IDS_NOTRECOMMENDTEXT) : NullStr) ==
912 MBID_YES) {
913
914 PSZ ab2;
915
916 ab2 = searchpath(GetPString(IDS_ARCHIVERBB2)); // Rewrite without alerting
917 rewrite_archiverbb2(ab2);
918 }
919 }
920 WinDismissDlg(hwnd, TRUE);
921 return 0;
922
923 case IDM_HELP:
924 if (hwndHelp)
925 WinSendMsg(hwndHelp,
926 HM_DISPLAY_HELP,
927 MPFROM2SHORT(HELP_ARCFIELDS, 0), MPFROMSHORT(HM_RESOURCEID));
928 break;
929
930 case DID_CANCEL:
931 WinDismissDlg(hwnd, FALSE);
932 return 0;
933
934 case AD_TOSTART:
935 if (!admp->listname)
936 Runtime_Error(pszSrcFile, __LINE__, "no listname");
937 else {
938 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
939 AD_LISTBOX,
940 LM_QUERYSELECTION,
941 MPVOID, MPVOID);
942 WinSendDlgItemMsg(hwnd,
943 AD_LISTBOX,
944 LM_QUERYITEMTEXT,
945 MPFROM2SHORT(sSelect, 255), MPFROMP(s));
946 if (*s)
947 WinSetDlgItemText(hwnd, AD_STARTLIST, s);
948 else
949 BooBoo:
950 saymsg(MB_ENTER,
951 hwnd,
952 GetPString(IDS_OOPSTEXT),
953 GetPString(IDS_SELECTFROMLISTTEXT));
954 }
955 return 0;
956
957 case AD_TOEND:
958 if (!admp->listname)
959 Runtime_Error(pszSrcFile, __LINE__, "no listname");
960 else {
961 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
962 AD_LISTBOX,
963 LM_QUERYSELECTION,
964 MPVOID, MPVOID);
965 WinSendDlgItemMsg(hwnd,
966 AD_LISTBOX,
967 LM_QUERYITEMTEXT,
968 MPFROM2SHORT(sSelect, 255), MPFROMP(s));
969 if (*s)
970 WinSetDlgItemText(hwnd, AD_ENDLIST, s);
971 else
972 goto BooBoo;
973 }
974 return 0;
975 }
976 return 0;
977 }
978 return WinDefDlgProc(hwnd, msg, mp1, mp2);
979}
980
981#pragma alloc_text(AVV,EditArchiverDefinition,free_and_strdup_from_window)
982#pragma alloc_text(AVV,get_int_from_window,get_int2_from_window)
983#pragma alloc_text(AVV,get_long_from_window,get_int3_from_window)
984#pragma alloc_text(AVV,get_int4_from_window,free_and_strdup_quoted_from_window)
985#pragma alloc_text (AVV2,nonull,rewrite_archiverbb2,checkfile)
986#pragma alloc_text (AVV3,check_archiver,ArcReviewDlgProc)
Note: See TracBrowser for help on using the repository browser.