source: trunk/dll/avv.c@ 1746

Last change on this file since 1746 was 1746, checked in by John Small, 12 years ago

Ticket #523: Stop considering missing "list", "create" or "extract" commands as errors

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