source: trunk/dll/avv.c@ 1120

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

Comments for CS 1118 (Tickets 154 (not 152), 270)

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