source: trunk/dll/avv.c@ 433

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

Avoid warnings when editing new definition

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 31.3 KB
Line 
1
2/***********************************************************************
3
4 $Id: avv.c 420 2006-07-31 17:55:32Z 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 EditArchiverDefinition: 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 30 Jul 06 SHL Avoid warnings when editing new definition
22
23***********************************************************************/
24
25#define INCL_DOS
26#define INCL_WIN
27#include <os2.h>
28
29#include <stdlib.h>
30#include <stdio.h>
31#include <stdarg.h>
32#include <string.h>
33#include <ctype.h>
34#include <time.h>
35
36#include "fm3dll.h"
37#include "fm3dlg.h"
38#include "version.h"
39#include "fm3str.h"
40
41#pragma data_seg(DATA1)
42
43static PSZ pszSrcFile = __FILE__;
44
45#pragma alloc_text(AVV,EditArchiverDefinition,free_and_strdup_from_window)
46#pragma alloc_text(AVV,get_int_from_window,get_int2_from_window)
47#pragma alloc_text(AVV,get_long_from_window,get_int3_from_window)
48#pragma alloc_text(AVV,get_int4_from_window)
49
50static PSZ checkfile(PSZ file,INT *error);
51static BOOL check_archiver (HWND hwnd,ARC_TYPE *info);
52static INT get_int_from_window (HWND hwnd,USHORT id);
53static LONG get_long_from_window (HWND hwnd,USHORT id);
54static PSZ nonull(PSZ a);
55static PSZ free_and_strdup_from_window(HWND hwnd,USHORT id,PSZ pszDest);
56
57//=== EditArchiverDefinition() Select archiver to edit definition ===
58
59VOID EditArchiverDefinition(HWND hwnd)
60{
61 ARCDUMP ad;
62 FILE *fp;
63 ARC_TYPE *pat;
64
65 // Allow multiple edits
66 for (;;) {
67 pat = NULL; // Do not hide dups
68 if (!WinDlgBox(HWND_DESKTOP,
69 hwnd,
70 SBoxDlgProc,
71 FM3ModHandle,
72 ASEL_EDIT_FRAME,
73 (PVOID)&pat) ||
74 !pat)
75 {
76 break; // we are done
77 }
78
79 memset(&ad,0,sizeof(ARCDUMP));
80 ad.info = pat;
81 WinDlgBox(HWND_DESKTOP,
82 hwnd,
83 ArcReviewDlgProc,
84 FM3ModHandle,
85 AD_FRAME,
86 MPFROMP(&ad));
87 } // for
88}
89
90static PSZ free_and_strdup_from_window(HWND hwnd,USHORT id,PSZ pszDest)
91{
92 CHAR sz[256];
93
94 xfree(pszDest);
95 WinQueryDlgItemText(hwnd,id,sizeof(sz),sz);
96 if (*sz)
97 pszDest = xstrdup(sz, pszSrcFile, __LINE__);
98 else
99 pszDest = NULL;
100 return pszDest;
101}
102
103static INT get_int_from_window(HWND hwnd,USHORT id)
104{
105 CHAR s[256];
106
107 WinQueryDlgItemText(hwnd,id,sizeof(s),s);
108 return atoi(s);
109}
110
111static INT get_int2_from_window(HWND hwnd,USHORT id)
112{
113 CHAR s[256];
114 PSZ p;
115
116 WinQueryDlgItemText(hwnd,id,sizeof(s),s);
117 p = strchr(s,',');
118 if(p)
119 p++;
120 return p ? atoi(p) : 0;
121}
122
123INT get_int3_from_window (HWND hwnd,USHORT id)
124{
125 CHAR s[256];
126 PSZ p;
127
128 WinQueryDlgItemText(hwnd,id,sizeof(s),s);
129 p = strchr(s,',');
130 if(p) {
131 p++;
132 p = strchr(p,',');
133 if(p)
134 p++;
135 }
136 return p ? atoi(p) : 0;
137}
138
139INT get_int4_from_window (HWND hwnd,USHORT id)
140{
141 CHAR s[256];
142 PSZ p;
143
144 WinQueryDlgItemText(hwnd,id,sizeof(s),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[256];
162
163 WinQueryDlgItemText(hwnd,id,sizeof(s),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 = xfgets(sz, sizeof(sz), fpOld, pszSrcFile, __LINE__);
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 = xfgets(sz, sizeof(sz), fpOld, pszSrcFile, __LINE__);
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 = xfgets(sz, sizeof(sz), fpOld, pszSrcFile, __LINE__);
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 if (!info->id)
426 return FALSE; // Assume new if no id
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,AD_LISTBOX,LM_DELETEALL,MPVOID,MPVOID);
488 for(sSelect = AD_ID;sSelect < AD_ADDWPATHS + 1;sSelect++)
489 {
490 WinSendDlgItemMsg(hwnd,
491 sSelect,
492 EM_SETTEXTLIMIT,
493 MPFROM2SHORT(sizeof(s) - 1,0),
494 MPVOID);
495 }
496 if (admp->info->id)
497 WinSetDlgItemText(hwnd,AD_ID,admp->info->id);
498 if (admp->info->ext)
499 WinSetDlgItemText(hwnd,AD_EXT,admp->info->ext);
500 sprintf(s,"%ld",admp->info->file_offset);
501 WinSetDlgItemText(hwnd,AD_SIGPOS,s);
502 if (admp->info->siglen) {
503 WinSetDlgItemText(hwnd,
504 AD_SIG,
505 fixup(admp->info->signature,
506 s,
507 sizeof(s),
508 admp->info->siglen));
509 }
510 if (admp->info->startlist)
511 WinSetDlgItemText(hwnd,AD_STARTLIST,admp->info->startlist);
512 if (admp->info->endlist)
513 WinSetDlgItemText(hwnd,AD_ENDLIST,admp->info->endlist);
514 if (admp->info->list)
515 WinSetDlgItemText(hwnd,AD_LIST,admp->info->list);
516 sprintf(s,
517 "%d,%d,%d,%d",
518 admp->info->fnpos,
519 admp->info->nameislast,
520 admp->info->nameisnext,
521 admp->info->nameisfirst);
522 WinSetDlgItemText(hwnd,AD_FNAMEPOS,s);
523 sprintf(s,"%d",admp->info->osizepos);
524 WinSetDlgItemText(hwnd,AD_OLDSZ,s);
525 sprintf(s,"%d",admp->info->nsizepos);
526 WinSetDlgItemText(hwnd,AD_NEWSZ,s);
527 sprintf(s,"%d,%d",admp->info->fdpos,admp->info->datetype);
528 WinSetDlgItemText(hwnd,AD_DATEPOS,s);
529 sprintf(s,"%d",admp->info->fdflds);
530 WinSetDlgItemText(hwnd,AD_NUMDATEFLDS,s);
531 if(admp->info->extract)
532 WinSetDlgItemText(hwnd,AD_EXTRACT,admp->info->extract);
533 if(admp->info->exwdirs)
534 WinSetDlgItemText(hwnd,AD_WDIRS,admp->info->exwdirs);
535 if(admp->info->test)
536 WinSetDlgItemText(hwnd,AD_TEST,admp->info->test);
537 if(admp->info->create)
538 WinSetDlgItemText(hwnd,AD_ADD,admp->info->create);
539 if(admp->info->move)
540 WinSetDlgItemText(hwnd,AD_MOVE,admp->info->move);
541 if(admp->info->delete)
542 WinSetDlgItemText(hwnd,AD_DELETE,admp->info->delete);
543 if(admp->info->createrecurse)
544 WinSetDlgItemText(hwnd,AD_ADDRECURSE,admp->info->createrecurse);
545 if(admp->info->createwdirs)
546 WinSetDlgItemText(hwnd,AD_ADDWPATHS,admp->info->createwdirs);
547 if(admp->info->movewdirs)
548 WinSetDlgItemText(hwnd,AD_MOVEWPATHS,admp->info->movewdirs);
549
550 PostMsg(hwnd,UM_SETUP,MPVOID,MPVOID);
551 break; // WM_INITDLG
552
553 case UM_SETUP:
554 if(admp->listname && *admp->listname) {
555
556 FILE *fp = fopen(admp->listname,"r");
557 if(!fp) {
558 WinSendDlgItemMsg(hwnd,
559 AD_LISTBOX,
560 LM_INSERTITEM,
561 MPFROM2SHORT(LIT_END,0),
562 MPFROMP(GetPString(IDS_CANTOPENFILETEXT)));
563 }
564 else {
565 while (!feof(fp)) {
566 if (!xfgets(s, sizeof(s), fp, pszSrcFile, __LINE__))
567 break;
568 stripcr(s);
569 WinSendDlgItemMsg(hwnd,
570 AD_LISTBOX,
571 LM_INSERTITEM,
572 MPFROM2SHORT(LIT_END,0),
573 MPFROMP(s));
574 }
575 fclose(fp);
576 }
577 }
578 else {
579 WinSendDlgItemMsg(hwnd,
580 AD_LISTBOX,
581 LM_INSERTITEM,
582 MPFROM2SHORT(LIT_END,0),
583 MPFROMP(GetPString(IDS_NOTAPPLICABLETEXT)));
584 }
585 check_archiver(hwnd,admp->info);
586 return 0;
587
588 case WM_ADJUSTWINDOWPOS:
589 PostMsg(hwnd,UM_SETDIR,MPVOID,MPVOID);
590 break;
591
592 case UM_SETDIR:
593 PaintRecessedWindow(WinWindowFromID(hwnd,AD_HELP),
594 (HPS)0,
595 FALSE,
596 TRUE);
597 return 0;
598
599 case WM_CONTROL:
600 switch(SHORT1FROMMP(mp1)) {
601 case AD_LISTBOX:
602 switch(SHORT2FROMMP(mp1)) {
603 case LN_ENTER:
604 for(sSelect = 0;sSelect < 10;sSelect++)
605 WinSetDlgItemText(hwnd,AD_FLD1 + sSelect,NullStr);
606 if (!admp->listname)
607 Runtime_Error(pszSrcFile, __LINE__, "no listname");
608 else {
609 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
610 AD_LISTBOX,
611 LM_QUERYSELECTION,
612 MPVOID,
613 MPVOID);
614 WinSendDlgItemMsg(hwnd,
615 AD_LISTBOX,
616 LM_QUERYITEMTEXT,
617 MPFROM2SHORT(sSelect,255),
618 MPFROMP(s));
619 if(!*s)
620 Runtime_Error(pszSrcFile, __LINE__, "no text");
621 else {
622 PSZ p;
623 PSZ pp;
624 p = s;
625 for(sSelect = 0;sSelect < 10;sSelect++) {
626 pp = p;
627 while(*pp == ' ' || *pp == '\t')
628 pp++;
629 if(!*pp)
630 break;
631 p = pp;
632 while(*p && (*p != ' ' && *p != '\t'))
633 p++;
634 if(*p)
635 *p++ = 0;
636 WinSetDlgItemText(hwnd,
637 AD_FLD1 + sSelect,
638 pp);
639 }
640 }
641 }
642 break;
643
644 case LN_KILLFOCUS:
645 WinSetDlgItemText(hwnd,AD_HELP,NullStr);
646 break;
647
648 case LN_SETFOCUS:
649 WinSetDlgItemText(hwnd,
650 AD_HELP,
651 GetPString(IDS_TEXTARCPRODUCEDTEXT));
652 break;
653 }
654 break;
655
656 case AD_ID:
657 if(SHORT2FROMMP(mp1) == EN_KILLFOCUS)
658 WinSetDlgItemText(hwnd,AD_HELP,NullStr);
659 if(SHORT2FROMMP(mp1) == EN_SETFOCUS)
660 WinSetDlgItemText(hwnd,AD_HELP,
661 GetPString(IDS_ADIDTEXT));
662 break;
663
664 case AD_ADD:
665 if(SHORT2FROMMP(mp1) == EN_KILLFOCUS)
666 WinSetDlgItemText(hwnd,AD_HELP,NullStr);
667 if(SHORT2FROMMP(mp1) == EN_SETFOCUS)
668 WinSetDlgItemText(hwnd,AD_HELP,
669 GetPString(IDS_ADADDTEXT));
670 break;
671
672 case AD_MOVE:
673 if(SHORT2FROMMP(mp1) == EN_KILLFOCUS)
674 WinSetDlgItemText(hwnd,AD_HELP,NullStr);
675 if(SHORT2FROMMP(mp1) == EN_SETFOCUS)
676 WinSetDlgItemText(hwnd,AD_HELP,
677 GetPString(IDS_ADMOVETEXT));
678 break;
679
680 case AD_EXT:
681 if(SHORT2FROMMP(mp1) == EN_KILLFOCUS)
682 WinSetDlgItemText(hwnd,AD_HELP,NullStr);
683 if(SHORT2FROMMP(mp1) == EN_SETFOCUS)
684 WinSetDlgItemText(hwnd,AD_HELP,
685 GetPString(IDS_ADEXTTEXT));
686 break;
687
688 case AD_EXTRACT:
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_ADEXTRACTTEXT));
694 break;
695
696 case AD_WDIRS:
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_ADWDIRSTEXT));
702 break;
703
704 case AD_SIG:
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_ADSIGTEXT));
710 break;
711
712 case AD_LIST:
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_ADLISTTEXT));
718 break;
719
720 case AD_TEST:
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_ADTESTTEXT));
726 break;
727
728 case AD_ADDWPATHS:
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_ADADDWPATHSTEXT));
734 break;
735
736 case AD_MOVEWPATHS:
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_ADMOVEWPATHSTEXT));
742 break;
743
744 case AD_ADDRECURSE:
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_ADADDRECURSETEXT));
750 break;
751
752 case AD_DELETE:
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_ADDELETETEXT));
758 break;
759
760 case AD_SIGPOS:
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_ADSIGPOSTEXT));
766 break;
767
768 case AD_FNAMEPOS:
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_ADFNAMEPOSTEXT));
774 break;
775
776 case AD_OLDSZ:
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_ADOLDSZTEXT));
782 break;
783
784 case AD_NUMDATEFLDS:
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_ADNUMDATEFLDSTEXT));
790 break;
791
792 case AD_DATEPOS:
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_ADDATEPOSTEXT));
798 break;
799
800 case AD_NEWSZ:
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_ADNEWSZTEXT));
806 break;
807
808 case AD_STARTLIST:
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_ADSTARTLISTTEXT));
814 break;
815
816 case AD_ENDLIST:
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_ADENDLISTTEXT));
822 break;
823
824 }
825 return 0;
826
827 case WM_COMMAND:
828 switch(SHORT1FROMMP(mp1)) {
829 case AD_SEEEXTRACTOR:
830 case AD_SEEADDER:
831 {
832 static CHAR tempargs[1026];
833
834 *tempargs = 0;
835 if(SHORT1FROMMP(mp1) == AD_SEEADDER)
836 WinQueryDlgItemText(hwnd,
837 AD_ADD,
838 255,
839 tempargs);
840 else
841 WinQueryDlgItemText(hwnd,
842 AD_EXTRACT,
843 255,
844 tempargs);
845 if(!*tempargs)
846 saymsg(MB_CANCEL,
847 hwnd,
848 GetPString(IDS_BZZZTTEXT),
849 GetPString(IDS_NEEDENTRYTEXT));
850 else {
851
852 PSZ p;
853
854 lstrip(tempargs);
855 p = strchr(tempargs,' ');
856 if(p)
857 *p = 0;
858 {
859 EXECARGS ex;
860
861 ex.flags = SEPARATEKEEP | WINDOWED | MAXIMIZED;
862 ex.commandline = tempargs;
863 *ex.path = 0;
864 *ex.environment = 0;
865 if(WinDlgBox(HWND_DESKTOP,
866 hwnd,
867 CmdLineDlgProc,
868 FM3ModHandle,
869 EXEC_FRAME,
870 &ex) == 1)
871 runemf2(ex.flags,
872 hwnd,
873 NULL,
874 (*ex.environment) ? ex.environment : NULL,
875 "%s",
876 tempargs);
877 }
878 }
879 }
880 return 0;
881
882 case DID_OK:
883 // fixme to avoid creating empty strings for startlist and endlist
884 admp->info->startlist = free_and_strdup_from_window(hwnd,AD_STARTLIST,admp->info->startlist);
885 admp->info->endlist = free_and_strdup_from_window(hwnd,AD_ENDLIST,admp->info->endlist);
886 admp->info->id = free_and_strdup_from_window(hwnd,AD_ID,admp->info->id);
887 admp->info->create = free_and_strdup_from_window(hwnd,AD_ADD,admp->info->create);
888 admp->info->createwdirs = free_and_strdup_from_window(hwnd,AD_ADDWPATHS,admp->info->createwdirs);
889 admp->info->createrecurse = free_and_strdup_from_window(hwnd,AD_ADDRECURSE,admp->info->createrecurse);
890 admp->info->movewdirs = free_and_strdup_from_window(hwnd,AD_MOVEWPATHS,admp->info->movewdirs);
891 admp->info->move = free_and_strdup_from_window(hwnd,AD_MOVE,admp->info->move);
892 admp->info->delete = free_and_strdup_from_window(hwnd,AD_DELETE,admp->info->delete);
893 admp->info->test = free_and_strdup_from_window(hwnd,AD_TEST,admp->info->test);
894 admp->info->extract = free_and_strdup_from_window(hwnd,AD_EXTRACT,admp->info->extract);
895 admp->info->exwdirs = free_and_strdup_from_window(hwnd,AD_WDIRS,admp->info->exwdirs);
896 admp->info->ext = free_and_strdup_from_window(hwnd,AD_EXT,admp->info->ext);
897 admp->info->signature = free_and_strdup_from_window(hwnd,
898 AD_SIG,
899 admp->info->signature);
900 admp->info->siglen = literal(admp->info->signature);
901 admp->info->list = free_and_strdup_from_window(hwnd,
902 AD_LIST,
903 admp->info->list);
904 admp->info->file_offset = get_long_from_window(hwnd,AD_SIGPOS);
905 admp->info->osizepos = get_int_from_window(hwnd,AD_OLDSZ);
906 admp->info->nsizepos = get_int_from_window(hwnd,AD_NEWSZ);
907 admp->info->fdpos = get_int_from_window(hwnd,AD_DATEPOS);
908 admp->info->datetype = get_int2_from_window(hwnd,AD_DATEPOS);
909 admp->info->fdflds = get_int_from_window(hwnd,AD_NUMDATEFLDS);
910 admp->info->fnpos = get_int_from_window(hwnd,AD_FNAMEPOS);
911 admp->info->nameislast = (get_int2_from_window(hwnd,AD_FNAMEPOS)) ? TRUE : FALSE;
912 admp->info->nameisnext = (get_int3_from_window(hwnd,AD_FNAMEPOS)) ? TRUE : FALSE;
913 admp->info->nameisfirst = (get_int4_from_window(hwnd,AD_FNAMEPOS)) ? TRUE : FALSE;
914 {
915 INT ok = check_archiver(hwnd,admp->info);
916 if (saymsg(MB_YESNO,
917 hwnd,
918 GetPString(IDS_ADCHANGESINMEMTEXT),
919 GetPString(IDS_ADREWRITETEXT),
920 !ok ? GetPString(IDS_NOTRECOMMENDTEXT) : NullStr) ==
921 MBID_YES) {
922
923 PSZ ab2;
924
925 ab2 = searchpath(GetPString(IDS_ARCHIVERBB2)); // Rewrite without alerting
926 rewrite_archiverbb2(ab2);
927 }
928 }
929 WinDismissDlg(hwnd,TRUE);
930 return 0;
931
932 case IDM_HELP:
933 if(hwndHelp)
934 WinSendMsg(hwndHelp,
935 HM_DISPLAY_HELP,
936 MPFROM2SHORT(HELP_EDITARC,0),
937 MPFROMSHORT(HM_RESOURCEID));
938 break;
939
940 case DID_CANCEL:
941 WinDismissDlg(hwnd,FALSE);
942 return 0;
943
944 case AD_TOSTART:
945 if(!admp->listname)
946 Runtime_Error(pszSrcFile, __LINE__, "no listname");
947 else {
948 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
949 AD_LISTBOX,
950 LM_QUERYSELECTION,
951 MPVOID,
952 MPVOID);
953 WinSendDlgItemMsg(hwnd,
954 AD_LISTBOX,
955 LM_QUERYITEMTEXT,
956 MPFROM2SHORT(sSelect,255),
957 MPFROMP(s));
958 if(*s)
959 WinSetDlgItemText(hwnd,
960 AD_STARTLIST,
961 s);
962 else
963BooBoo:
964 saymsg(MB_ENTER,
965 hwnd,
966 GetPString(IDS_OOPSTEXT),
967 GetPString(IDS_SELECTFROMLISTTEXT));
968 }
969 return 0;
970
971 case AD_TOEND:
972 if(!admp->listname)
973 Runtime_Error(pszSrcFile, __LINE__, "no listname");
974 else {
975 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
976 AD_LISTBOX,
977 LM_QUERYSELECTION,
978 MPVOID,
979 MPVOID);
980 WinSendDlgItemMsg(hwnd,
981 AD_LISTBOX,
982 LM_QUERYITEMTEXT,
983 MPFROM2SHORT(sSelect,255),
984 MPFROMP(s));
985 if(*s)
986 WinSetDlgItemText(hwnd,
987 AD_ENDLIST,
988 s);
989 else
990 goto BooBoo;
991 }
992 return 0;
993 }
994 return 0;
995 }
996 return WinDefDlgProc(hwnd,msg,mp1,mp2);
997}
998
Note: See TracBrowser for help on using the repository browser.