source: trunk/dll/avv.c

Last change on this file was 1751, checked in by John Small, 11 years ago

Removed commented-out code missed in previous commmit

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