source: trunk/dll/avv.c@ 911

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

Commenting, help file, history update for recent changes; Minor clean up.

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