source: trunk/dll/avv.c@ 906

Last change on this file since 906 was 906, checked in by Gregg Young, 18 years ago

The basic program quoting code and some mailto cleanup.

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