source: trunk/dll/avv.c@ 347

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

Use Runtime_Error

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