source: trunk/dll/avv.c@ 1162

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

Ticket 187: Draft 1: Functions only

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