source: trunk/dll/avv.c@ 1570

Last change on this file since 1570 was 1544, checked in by Gregg Young, 15 years ago

Changes to fopen and _fsopen to allow FM2 to be loaded in high memory

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