source: trunk/dll/avv.c@ 1639

Last change on this file since 1639 was 1616, checked in by Gregg Young, 14 years ago

Updated a*.c files to Doxygen commenting style. (Ticket 55)

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