source: trunk/dll/avv.c@ 1917

Last change on this file since 1917 was 1917, checked in by Gregg Young, 6 days ago

Partially fixed Ticket #536. (Reduced the error noise)

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