source: trunk/dll/avv.c@ 1115

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

Fixed truncation of archiver cmdline to 3 characters it is now MaxComLineStrg (Ticket 270) Also checks disk space before writing Archiver.bb2 to disk

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