source: trunk/dll/avv.c@ 250

Last change on this file since 250 was 250, checked in by root, 20 years ago

rewrite_archiverbb2: avoid dereferencing null signature
ArcReviewDlgProc: ensure signature allocated

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