source: trunk/dll/avv.c@ 1036

Last change on this file since 1036 was 1009, checked in by Steven Levine, 17 years ago

Add xfree xstrdup Fortify support
Add MT capable Fortify scope logic

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