source: trunk/dll/avv.c@ 404

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

Use xfgets

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