source: trunk/dll/avv.c@ 1194

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

Ticket 187: Draft 2: Move remaining function declarations

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