source: trunk/dll/avv.c@ 1162

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

Ticket 187: Draft 1: Functions only

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