source: trunk/dll/avv.c@ 985

Last change on this file since 985 was 985, checked in by Gregg Young, 18 years ago

Update sizes dialog (ticket 44); Make max command line length user settable (ticket 199); use xfree for free in most cases (ticket 212); initial code to check for valid ini file (ticket 102); Some additional refactoring and structure rework; Some documentation updates;

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