source: trunk/dll/avv.c@ 1717

Last change on this file since 1717 was 1717, checked in by Gregg Young, 12 years ago

Assure the title is blank on the execute dialog call with the "see" button Ticket 504

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