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
RevLine 
[107]1
2/***********************************************************************
3
4 $Id: avv.c 313 2006-06-28 21:36:18Z root $
5
[122]6 archiver.bb2 editor
7
[107]8 Copyright (c) 1993-98 M. Kimes
[304]9 Copyright (c) 2004, 2006 Steven H.Levine
[107]10
[199]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
[250]15 14 Aug 05 SHL rewrite_archiverbb2: avoid dereferencing null signature
16 14 Aug 05 SHL ArcReviewDlgProc: ensure signature allocated
[304]17 29 May 06 SHL EditArchiverData: rework
[313]18 26 Jun 06 SHL rewrite_archiverbb2: include user comments
[107]19
20***********************************************************************/
21
[2]22#define INCL_DOS
23#define INCL_WIN
[250]24#include <os2.h>
[2]25
26#include <stdlib.h>
27#include <stdio.h>
28#include <stdarg.h>
29#include <string.h>
30#include <ctype.h>
31#include <time.h>
[250]32
[2]33#include "fm3dll.h"
34#include "fm3dlg.h"
35#include "version.h"
36#include "fm3str.h"
37
38#pragma data_seg(DATA1)
[122]39#pragma alloc_text(AVV,EditArchiverData,xstrdup,xstrdup_from_window)
[2]40#pragma alloc_text(AVV,get_int_from_window,get_int2_from_window)
41#pragma alloc_text(AVV,get_long_from_window,get_int3_from_window)
42#pragma alloc_text(AVV,get_int4_from_window)
43
[122]44static PSZ checkfile(PSZ file,INT *error);
[304]45static BOOL check_archiver (HWND hwnd,ARC_TYPE *info);
[122]46static INT get_int_from_window (HWND hwnd,USHORT id);
47static LONG get_long_from_window (HWND hwnd,USHORT id);
48static PSZ nonull(PSZ a);
49static PSZ xstrdup(PSZ pszDest,PSZ pszSrc);
50static PSZ xstrdup_from_window(HWND hwnd,USHORT id,PSZ pszDest);
[2]51
[304]52//=== EditArchiverData() Select archiver to edit ===
53
54VOID EditArchiverData(HWND hwnd)
[122]55{
[2]56 ARCDUMP ad;
57 FILE *fp;
[304]58 ARC_TYPE *pat;
[2]59
[304]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
[2]72 }
[304]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
[2]83}
84
[122]85static PSZ xstrdup(PSZ a,PSZ b)
86{
[304]87 if (a)
[2]88 free(a);
[304]89 if (b && *b)
[2]90 a = strdup(b);
91 else
92 a = NULL;
93 return a;
94}
95
[122]96static PSZ xstrdup_from_window(HWND hwnd,USHORT id,PSZ pszDest)
97{
98 char sz[257] = "";
[2]99
100 WinQueryDlgItemText(hwnd,
101 id,
102 255,
[122]103 sz);
104 pszDest = xstrdup(pszDest,sz);
105 return pszDest;
[2]106}
107
[122]108static INT get_int_from_window(HWND hwnd,USHORT id)
109{
[2]110 char s[257] = "";
111
112 WinQueryDlgItemText(hwnd,id,255,s);
113 return atoi(s);
114}
115
[122]116static INT get_int2_from_window(HWND hwnd,USHORT id)
117{
[2]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
[122]127INT get_int3_from_window (HWND hwnd,USHORT id)
128{
[2]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
[122]142INT get_int4_from_window (HWND hwnd,USHORT id)
143{
[2]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
[122]161LONG get_long_from_window (HWND hwnd,USHORT id)
162{
[2]163 char s[257] = "";
164
165 WinQueryDlgItemText(hwnd,id,255,s);
166 return atol(s);
167}
168
[199]169#pragma alloc_text (AVV2,nonull,rewrite_archiverbb2,checkfile)
[2]170
[122]171// nonull - convert NULL pointer to empty string
[2]172
[122]173static PSZ nonull(PSZ psz)
174{
175 if(!psz)
176 psz = NullStr;
177 return psz;
[2]178}
179
[313]180//=== rewrite_archiverbb2() rewrite archiver.bb2, prompt if arg NULL, merge comments ===
[2]181
[122]182VOID rewrite_archiverbb2 (PSZ archiverbb2)
183{
[313]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;
[2]196
[304]197 arcsigsmodified = FALSE;
198
199 if (!arcsighead) {
[2]200 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
201 HWND_DESKTOP,
202 GetPString(IDS_SAYWHATTEXT),
203 GetPString(IDS_NOINFOTOSAVETEXT));
204 return;
205 }
[304]206 // Alert unless file name passed
207 if (!archiverbb2 || !*archiverbb2) {
[2]208 saymsg(MB_ENTER | MB_ICONASTERISK,
209 HWND_DESKTOP,
210 GetPString(IDS_NOTETEXT),
211 GetPString(IDS_SAVEARCBB2TEXT));
212 archiverbb2 = GetPString(IDS_ARCHIVERBB2);
213 }
[313]214
215 /* save a backup */
216 psz = strrchr(archiverbb2,'.');
217 if (psz && !stricmp(psz,".BB2")) {
218 strcpy(psz,".BAK");
[2]219 DosDelete(archiverbb2);
[313]220 strcpy(sz,archiverbb2);
221 strcpy(psz,".BB2");
222 DosMove(archiverbb2,sz);
223 fpOld = fopen(sz,"r"); // OK for file not to exist
[2]224 }
[313]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",
[2]236 GetPString(IDS_ARCHIVERBB2),
[313]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,
[2]304 "%s\n%s\n%ld\n%s\n",
[313]305 nonull(pat->id),
306 nonull(pat->ext),
307 pat->file_offset,
308 nonull(pat->list));
309 fprintf(fpNew,
[2]310 "%s\n%s\n%s\n%s\n%s\n%s\n",
[313]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,
[2]318 "%s\n%s\n%s\n",
[313]319 nonull(pat->move),
320 nonull(pat->movewdirs),
321 nonull(pat->delete));
322 fprintf(fpNew,
[2]323 "%s\n%s\n%s\n%d\n%d\n%d,%d\n%d\n%d,%lu,%lu,%lu\n",
[313]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 }
[2]353 }
[313]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
[2]364}
365
[122]366static PSZ checkfile(PSZ file,INT *error)
367{
[2]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
[199]405#pragma alloc_text (AVV3,check_archiver,ArcReviewDlgProc)
[2]406
[304]407static BOOL check_archiver(HWND hwnd,ARC_TYPE *info)
[122]408{
[304]409 BOOL noStart = FALSE,noEnd = FALSE,badPos = FALSE;
410 INT badList = 0,badCreate = 0,badExtract = 0;
[122]411 static PSZ aerrors[3];
[2]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)
[304]417 noStart = TRUE;
[2]418 if(!info->endlist || !*info->endlist)
[304]419 noEnd = TRUE;
[2]420 if(info->fnpos > 50 || info->fnpos < -1)
[304]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
[2]427 saymsg(MB_ENTER | MB_ICONASTERISK,
428 hwnd,
429 GetPString(IDS_WARNINGSTEXT),
430 GetPString(IDS_AVVCHK1TEXT),
[304]431 noStart ? aerrors[0] : NullStr,
432 noEnd ? aerrors[1] : NullStr,
433 badPos ? aerrors[2] : NullStr,
434 badList == 1 ?
[2]435 GetPString(IDS_AVVCHK2TEXT) :
[304]436 badList == -1 ?
[2]437 GetPString(IDS_AVVCHK3TEXT) :
[304]438 badList == 2 ?
[2]439 GetPString(IDS_AVVCHK4TEXT) :
[304]440 badList == 3 ?
[2]441 GetPString(IDS_AVVCHK5TEXT) :
442 NullStr,
[304]443 badCreate == 1 ?
[2]444 GetPString(IDS_AVVCHK6TEXT) :
[304]445 badCreate == -1 ?
[2]446 GetPString(IDS_AVVCHK7TEXT) :
[304]447 badCreate == 2 ?
[2]448 GetPString(IDS_AVVCHK8TEXT) :
[304]449 badCreate == 3 ?
[2]450 GetPString(IDS_AVVCHK9TEXT) :
451 NullStr,
[304]452 badExtract == 1 ?
[2]453 GetPString(IDS_AVVCHK10TEXT) :
[304]454 badExtract == -1 ?
[2]455 GetPString(IDS_AVVCHK11TEXT) :
[304]456 badExtract == 2 ?
[2]457 GetPString(IDS_AVVCHK12TEXT) :
[304]458 badExtract == 3 ?
[2]459 GetPString(IDS_AVVCHK13TEXT) :
460 NullStr);
[304]461 if(badList || badExtract)
462 return FALSE; // Problems
463 return TRUE; // OK
[2]464}
465
[304]466//=== ArcReviewDlgProc() View/edit single archiver.bb2 setup ===
[2]467
[250]468MRESULT EXPENTRY ArcReviewDlgProc(HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
[122]469{
470 ARCDUMP *admp;
[313]471 CHAR s[256];
[122]472 SHORT sSelect;
[2]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 }
[122]484
[304]485 WinSetWindowPtr(hwnd,QWL_USER,mp2);
[122]486
487 WinSendDlgItemMsg(hwnd,
488 AD_LISTBOX,
489 LM_DELETEALL,
490 MPVOID,
491 MPVOID);
492 for(sSelect = AD_ID;sSelect < AD_ADDWPATHS + 1;sSelect++)
[2]493 {
[122]494 WinSendDlgItemMsg(hwnd,
495 sSelect,
496 EM_SETTEXTLIMIT,
497 MPFROM2SHORT(sizeof(s) - 1,0),
[2]498 MPVOID);
[122]499 }
500 if (admp->info->id) {
[2]501 WinSetDlgItemText(hwnd,
[122]502 AD_ID,
503 admp->info->id);
[2]504 }
[122]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);
[304]516 if (admp->info->siglen) {
[122]517 WinSetDlgItemText(hwnd,
518 AD_SIG,
519 fixup(admp->info->signature,
520 s,
521 sizeof(s),
[304]522 admp->info->siglen));
[122]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
[2]573 PostMsg(hwnd,
574 UM_SETUP,
575 MPVOID,
576 MPVOID);
[122]577 break; // WM_INITDLG
[2]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)) {
[122]594 if(!fgets(s,sizeof(s),fp)) break;
[2]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
[122]649 PSZ p;
650 PSZ pp;
[2]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
[122]886 PSZ p;
[2]887
[122]888 lstrip(tempargs);
[2]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:
[304]917 // fixme to avoid creating empty strings for startlist and endlist
[122]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);
[250]931 admp->info->signature = xstrdup_from_window(hwnd,
932 AD_SIG,
933 admp->info->signature);
[304]934 admp->info->siglen = literal(admp->info->signature);
[122]935 admp->info->list = xstrdup_from_window(hwnd,
[2]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);
[107]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;
[2]948 {
[304]949 INT ok = check_archiver(hwnd,admp->info);
[2]950 if(saymsg(MB_YESNO,
951 hwnd,
952 GetPString(IDS_ADCHANGESINMEMTEXT),
953 GetPString(IDS_ADREWRITETEXT),
[304]954 !ok ? GetPString(IDS_NOTRECOMMENDTEXT) : NullStr) ==
[2]955 MBID_YES) {
956
[122]957 PSZ ab2;
[2]958
[304]959 ab2 = searchpath(GetPString(IDS_ARCHIVERBB2)); // Rewrite without alerting
[2]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.