source: trunk/dll/avv.c@ 1118

Last change on this file since 1118 was 1118, checked in by Gregg Young, 17 years ago

Clean up of fix for trap caused by FM/2 being on a full disk. It now preserves the data files. (Ticket 152, 271)

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