source: trunk/dll/avv.c@ 920

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

Cleanup of NormalizeCmdLine moved to pathutil.c

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