source: trunk/dll/avv.c@ 911

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

Commenting, help file, history update for recent changes; Minor clean up.

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