source: trunk/dll/avv.c@ 1194

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

Ticket 187: Draft 2: Move remaining function declarations

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