source: trunk/dll/avv.c@ 304

Last change on this file since 304 was 304, checked in by root, 19 years ago

EditArchiverData: rework

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