source: trunk/dll/avv.c

Last change on this file was 1917, checked in by Gregg Young, 3 days ago

Partially fixed Ticket #536. (Reduced the error noise)

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