source: trunk/dll/avv.c@ 959

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

Use xfree where appropriate. Check that buffer exists following all xmallocs. Stopped at eas.c with xfree checking. One remaining xmalloc without test in dirsize.c

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