source: trunk/dll/avv.c@ 888

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

runemf2 now quotes executable strings if needed (Ticket 180); it also reports where it was called from on errors

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