source: trunk/dll/avv.c@ 1220

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

Ticket 187: Moved typedef's and some #define's from fm3dll.h

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