source: trunk/dll/avv.c@ 1746

Last change on this file since 1746 was 1746, checked in by John Small, 12 years ago

Ticket #523: Stop considering missing "list", "create" or "extract" commands as errors

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