source: trunk/dll/avv.c@ 1505

Last change on this file since 1505 was 1498, checked in by Gregg Young, 16 years ago

Changes to get FM2 to compile with the latest watcom 1.9 beta (mostly type casts of CHAR CONSTANT * to CHAR *). Changes to get the environment settings working everywhere again (broken by the change that moved commands to the INI); Added an environment size variable (set to 2048 which was the largest I found hard coded). Still need to find everywhere the environment size is set and use this variable.

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