source: trunk/dll/avv.c@ 1204

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

Ticket 187: Move datadevlarations/definitions out of fm3dll.h

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