source: trunk/dll/avv.c@ 1744

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

Ticket #517: Replaced a call to DosQueryAppType to a call to the wrapped xDosQueryApptType

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