source: trunk/dll/avv.c@ 1204

Last change on this file since 1204 was 1204, checked in by John Small, 17 years ago

Ticket 187: Move datadevlarations/definitions out of fm3dll.h

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