source: trunk/dll/avv.c@ 313

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

rewrite_archiverbb2: include user comments

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