source: trunk/dll/avv.c@ 1346

Last change on this file since 1346 was 1346, checked in by Gregg Young, 17 years ago

Code cleanup; removal of dead 07 code copywrite updates etc

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