source: trunk/dll/avv.c@ 1844

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

Removed commented-out code missed in previous commmit

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