source: trunk/dll/avv.c@ 1220

Last change on this file since 1220 was 1220, checked in by John Small, 17 years ago

Ticket 187: Moved typedef's and some #define's from fm3dll.h

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