source: trunk/dll/avv.c@ 1640

Last change on this file since 1640 was 1616, checked in by Gregg Young, 14 years ago

Updated a*.c files to Doxygen commenting style. (Ticket 55)

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