source: trunk/dll/avv.c@ 927

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

Free pszWorkBuf memory for NormalizeCmdLine calls. Add comments for ticket 161 fix.

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