source: trunk/dll/avv.c@ 404

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

Use xfgets

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