source: trunk/dll/avv.c@ 1120

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

Comments for CS 1118 (Tickets 154 (not 152), 270)

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