source: trunk/dll/avv.c@ 1480

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

Fix failure to correctly check for large file support in FindSwapperDat fall back code minor streamling. Add LVM.EXE to partition submenu. Stop using xDosQueryAppType where the file name it is passed is already a local stack variable. Correct a typo in several file header comments.

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