source: trunk/dll/avv.c@ 1572

Last change on this file since 1572 was 1544, checked in by Gregg Young, 15 years ago

Changes to fopen and _fsopen to allow FM2 to be loaded in high memory

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