source: trunk/dll/avv.c@ 1744

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

Ticket #517: Replaced a call to DosQueryAppType to a call to the wrapped xDosQueryApptType

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