source: trunk/dll/avv.c@ 1115

Last change on this file since 1115 was 1115, checked in by Gregg Young, 17 years ago

Fixed truncation of archiver cmdline to 3 characters it is now MaxComLineStrg (Ticket 270) Also checks disk space before writing Archiver.bb2 to disk

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