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
RevLine 
[107]1
2/***********************************************************************
3
4 $Id: avv.c 347 2006-07-26 05:43:28Z 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
[347]19 14 Jul 06 SHL Use Runtime_Error
[107]20
21***********************************************************************/
22
[2]23#define INCL_DOS
24#define INCL_WIN
[250]25#include <os2.h>
[2]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>
[250]33
[2]34#include "fm3dll.h"
35#include "fm3dlg.h"
36#include "version.h"
37#include "fm3str.h"
38
39#pragma data_seg(DATA1)
[347]40
41static PSZ pszSrcFile = __FILE__;
42
43#pragma alloc_text(AVV,EditArchiverData,free_and_strdup_from_window)
[2]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
[122]48static PSZ checkfile(PSZ file,INT *error);
[304]49static BOOL check_archiver (HWND hwnd,ARC_TYPE *info);
[122]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);
[347]53static PSZ free_and_strdup_from_window(HWND hwnd,USHORT id,PSZ pszDest);
[2]54
[304]55//=== EditArchiverData() Select archiver to edit ===
56
57VOID EditArchiverData(HWND hwnd)
[122]58{
[2]59 ARCDUMP ad;
60 FILE *fp;
[304]61 ARC_TYPE *pat;
[2]62
[304]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
[2]75 }
[304]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
[2]86}
87
[347]88static PSZ free_and_strdup_from_window(HWND hwnd,USHORT id,PSZ pszDest)
[122]89{
90 char sz[257] = "";
[2]91
[347]92 if (pszDest)
93 free(pszDest);
94
[2]95 WinQueryDlgItemText(hwnd,
96 id,
97 255,
[122]98 sz);
[347]99 if (*sz)
100 pszDest = xstrdup(sz, pszSrcFile, __LINE__);
101 else
102 pszDest = NULL;
[122]103 return pszDest;
[2]104}
105
[122]106static INT get_int_from_window(HWND hwnd,USHORT id)
107{
[2]108 char s[257] = "";
109
110 WinQueryDlgItemText(hwnd,id,255,s);
111 return atoi(s);
112}
113
[122]114static INT get_int2_from_window(HWND hwnd,USHORT id)
115{
[2]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
[122]125INT get_int3_from_window (HWND hwnd,USHORT id)
126{
[2]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
[122]140INT get_int4_from_window (HWND hwnd,USHORT id)
141{
[2]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
[122]159LONG get_long_from_window (HWND hwnd,USHORT id)
160{
[2]161 char s[257] = "";
162
163 WinQueryDlgItemText(hwnd,id,255,s);
164 return atol(s);
165}
166
[199]167#pragma alloc_text (AVV2,nonull,rewrite_archiverbb2,checkfile)
[2]168
[122]169// nonull - convert NULL pointer to empty string
[2]170
[122]171static PSZ nonull(PSZ psz)
172{
173 if(!psz)
174 psz = NullStr;
175 return psz;
[2]176}
177
[313]178//=== rewrite_archiverbb2() rewrite archiver.bb2, prompt if arg NULL, merge comments ===
[2]179
[122]180VOID rewrite_archiverbb2 (PSZ archiverbb2)
181{
[313]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;
[2]194
[304]195 arcsigsmodified = FALSE;
196
197 if (!arcsighead) {
[2]198 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
199 HWND_DESKTOP,
200 GetPString(IDS_SAYWHATTEXT),
201 GetPString(IDS_NOINFOTOSAVETEXT));
202 return;
203 }
[304]204 // Alert unless file name passed
205 if (!archiverbb2 || !*archiverbb2) {
[2]206 saymsg(MB_ENTER | MB_ICONASTERISK,
207 HWND_DESKTOP,
208 GetPString(IDS_NOTETEXT),
209 GetPString(IDS_SAVEARCBB2TEXT));
210 archiverbb2 = GetPString(IDS_ARCHIVERBB2);
211 }
[313]212
213 /* save a backup */
214 psz = strrchr(archiverbb2,'.');
215 if (psz && !stricmp(psz,".BB2")) {
216 strcpy(psz,".BAK");
[2]217 DosDelete(archiverbb2);
[313]218 strcpy(sz,archiverbb2);
219 strcpy(psz,".BB2");
220 DosMove(archiverbb2,sz);
221 fpOld = fopen(sz,"r"); // OK for file not to exist
[2]222 }
[313]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",
[2]234 GetPString(IDS_ARCHIVERBB2),
[313]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,
[2]302 "%s\n%s\n%ld\n%s\n",
[313]303 nonull(pat->id),
304 nonull(pat->ext),
305 pat->file_offset,
306 nonull(pat->list));
307 fprintf(fpNew,
[2]308 "%s\n%s\n%s\n%s\n%s\n%s\n",
[313]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,
[2]316 "%s\n%s\n%s\n",
[313]317 nonull(pat->move),
318 nonull(pat->movewdirs),
319 nonull(pat->delete));
320 fprintf(fpNew,
[2]321 "%s\n%s\n%s\n%d\n%d\n%d,%d\n%d\n%d,%lu,%lu,%lu\n",
[313]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 }
[2]351 }
[313]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
[2]362}
363
[122]364static PSZ checkfile(PSZ file,INT *error)
365{
[2]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
[199]403#pragma alloc_text (AVV3,check_archiver,ArcReviewDlgProc)
[2]404
[304]405static BOOL check_archiver(HWND hwnd,ARC_TYPE *info)
[122]406{
[304]407 BOOL noStart = FALSE,noEnd = FALSE,badPos = FALSE;
408 INT badList = 0,badCreate = 0,badExtract = 0;
[122]409 static PSZ aerrors[3];
[2]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)
[304]415 noStart = TRUE;
[2]416 if(!info->endlist || !*info->endlist)
[304]417 noEnd = TRUE;
[2]418 if(info->fnpos > 50 || info->fnpos < -1)
[304]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
[2]425 saymsg(MB_ENTER | MB_ICONASTERISK,
426 hwnd,
427 GetPString(IDS_WARNINGSTEXT),
428 GetPString(IDS_AVVCHK1TEXT),
[304]429 noStart ? aerrors[0] : NullStr,
430 noEnd ? aerrors[1] : NullStr,
431 badPos ? aerrors[2] : NullStr,
432 badList == 1 ?
[2]433 GetPString(IDS_AVVCHK2TEXT) :
[304]434 badList == -1 ?
[2]435 GetPString(IDS_AVVCHK3TEXT) :
[304]436 badList == 2 ?
[2]437 GetPString(IDS_AVVCHK4TEXT) :
[304]438 badList == 3 ?
[2]439 GetPString(IDS_AVVCHK5TEXT) :
440 NullStr,
[304]441 badCreate == 1 ?
[2]442 GetPString(IDS_AVVCHK6TEXT) :
[304]443 badCreate == -1 ?
[2]444 GetPString(IDS_AVVCHK7TEXT) :
[304]445 badCreate == 2 ?
[2]446 GetPString(IDS_AVVCHK8TEXT) :
[304]447 badCreate == 3 ?
[2]448 GetPString(IDS_AVVCHK9TEXT) :
449 NullStr,
[304]450 badExtract == 1 ?
[2]451 GetPString(IDS_AVVCHK10TEXT) :
[304]452 badExtract == -1 ?
[2]453 GetPString(IDS_AVVCHK11TEXT) :
[304]454 badExtract == 2 ?
[2]455 GetPString(IDS_AVVCHK12TEXT) :
[304]456 badExtract == 3 ?
[2]457 GetPString(IDS_AVVCHK13TEXT) :
458 NullStr);
[304]459 if(badList || badExtract)
460 return FALSE; // Problems
461 return TRUE; // OK
[2]462}
463
[304]464//=== ArcReviewDlgProc() View/edit single archiver.bb2 setup ===
[2]465
[250]466MRESULT EXPENTRY ArcReviewDlgProc(HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
[122]467{
468 ARCDUMP *admp;
[313]469 CHAR s[256];
[122]470 SHORT sSelect;
[2]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 }
[122]482
[304]483 WinSetWindowPtr(hwnd,QWL_USER,mp2);
[122]484
485 WinSendDlgItemMsg(hwnd,
486 AD_LISTBOX,
487 LM_DELETEALL,
488 MPVOID,
489 MPVOID);
490 for(sSelect = AD_ID;sSelect < AD_ADDWPATHS + 1;sSelect++)
[2]491 {
[122]492 WinSendDlgItemMsg(hwnd,
493 sSelect,
494 EM_SETTEXTLIMIT,
495 MPFROM2SHORT(sizeof(s) - 1,0),
[2]496 MPVOID);
[122]497 }
498 if (admp->info->id) {
[2]499 WinSetDlgItemText(hwnd,
[122]500 AD_ID,
501 admp->info->id);
[2]502 }
[122]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);
[304]514 if (admp->info->siglen) {
[122]515 WinSetDlgItemText(hwnd,
516 AD_SIG,
517 fixup(admp->info->signature,
518 s,
519 sizeof(s),
[304]520 admp->info->siglen));
[122]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
[2]571 PostMsg(hwnd,
572 UM_SETUP,
573 MPVOID,
574 MPVOID);
[122]575 break; // WM_INITDLG
[2]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)) {
[122]592 if(!fgets(s,sizeof(s),fp)) break;
[2]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);
[347]634 if (!admp->listname)
635 Runtime_Error(pszSrcFile, __LINE__, "no listname");
636 else {
[2]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));
[347]647 if(!*s)
648 Runtime_Error(pszSrcFile, __LINE__, "no text");
649 else {
[122]650 PSZ p;
651 PSZ pp;
[2]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
[122]882 PSZ p;
[2]883
[122]884 lstrip(tempargs);
[2]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:
[304]913 // fixme to avoid creating empty strings for startlist and endlist
[347]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,
[250]928 AD_SIG,
929 admp->info->signature);
[304]930 admp->info->siglen = literal(admp->info->signature);
[347]931 admp->info->list = free_and_strdup_from_window(hwnd,
[2]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);
[107]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;
[2]944 {
[304]945 INT ok = check_archiver(hwnd,admp->info);
[2]946 if(saymsg(MB_YESNO,
947 hwnd,
948 GetPString(IDS_ADCHANGESINMEMTEXT),
949 GetPString(IDS_ADREWRITETEXT),
[304]950 !ok ? GetPString(IDS_NOTRECOMMENDTEXT) : NullStr) ==
[2]951 MBID_YES) {
952
[122]953 PSZ ab2;
[2]954
[304]955 ab2 = searchpath(GetPString(IDS_ARCHIVERBB2)); // Rewrite without alerting
[2]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:
[347]975 if(!admp->listname)
976 Runtime_Error(pszSrcFile, __LINE__, "no listname");
977 else {
[2]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:
[347]1002 if(!admp->listname)
1003 Runtime_Error(pszSrcFile, __LINE__, "no listname");
1004 else {
[2]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.