source: trunk/dll/avv.c@ 985

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

Update sizes dialog (ticket 44); Make max command line length user settable (ticket 199); use xfree for free in most cases (ticket 212); initial code to check for valid ini file (ticket 102); Some additional refactoring and structure rework; Some documentation updates;

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