source: trunk/dll/avv.c@ 918

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

Fix CheckApp_QuoteAddExe to return a pointer on the stack instead of a string. Use MAXCOMLINESTRG for command line length.

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