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
RevLine 
[107]1
2/***********************************************************************
3
4 $Id: avv.c 420 2006-07-31 17:55:32Z 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
[420]17 29 May 06 SHL EditArchiverDefinition: 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
[420]21 30 Jul 06 SHL Avoid warnings when editing new definition
[107]22
23***********************************************************************/
24
[2]25#define INCL_DOS
26#define INCL_WIN
[250]27#include <os2.h>
[2]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>
[250]35
[2]36#include "fm3dll.h"
37#include "fm3dlg.h"
38#include "version.h"
39#include "fm3str.h"
40
41#pragma data_seg(DATA1)
[347]42
43static PSZ pszSrcFile = __FILE__;
44
[420]45#pragma alloc_text(AVV,EditArchiverDefinition,free_and_strdup_from_window)
[2]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
[122]50static PSZ checkfile(PSZ file,INT *error);
[304]51static BOOL check_archiver (HWND hwnd,ARC_TYPE *info);
[122]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);
[347]55static PSZ free_and_strdup_from_window(HWND hwnd,USHORT id,PSZ pszDest);
[2]56
[420]57//=== EditArchiverDefinition() Select archiver to edit definition ===
[304]58
[420]59VOID EditArchiverDefinition(HWND hwnd)
[122]60{
[2]61 ARCDUMP ad;
62 FILE *fp;
[304]63 ARC_TYPE *pat;
[2]64
[304]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
[2]77 }
[304]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
[2]88}
89
[347]90static PSZ free_and_strdup_from_window(HWND hwnd,USHORT id,PSZ pszDest)
[122]91{
[420]92 CHAR sz[256];
[2]93
[420]94 xfree(pszDest);
95 WinQueryDlgItemText(hwnd,id,sizeof(sz),sz);
[347]96 if (*sz)
97 pszDest = xstrdup(sz, pszSrcFile, __LINE__);
98 else
99 pszDest = NULL;
[122]100 return pszDest;
[2]101}
102
[122]103static INT get_int_from_window(HWND hwnd,USHORT id)
104{
[420]105 CHAR s[256];
[2]106
[420]107 WinQueryDlgItemText(hwnd,id,sizeof(s),s);
[2]108 return atoi(s);
109}
110
[122]111static INT get_int2_from_window(HWND hwnd,USHORT id)
112{
[420]113 CHAR s[256];
114 PSZ p;
[2]115
[420]116 WinQueryDlgItemText(hwnd,id,sizeof(s),s);
[2]117 p = strchr(s,',');
118 if(p)
119 p++;
[420]120 return p ? atoi(p) : 0;
[2]121}
122
[122]123INT get_int3_from_window (HWND hwnd,USHORT id)
124{
[420]125 CHAR s[256];
126 PSZ p;
[2]127
[420]128 WinQueryDlgItemText(hwnd,id,sizeof(s),s);
[2]129 p = strchr(s,',');
130 if(p) {
131 p++;
132 p = strchr(p,',');
133 if(p)
134 p++;
135 }
[420]136 return p ? atoi(p) : 0;
[2]137}
138
[122]139INT get_int4_from_window (HWND hwnd,USHORT id)
140{
[420]141 CHAR s[256];
142 PSZ p;
[2]143
[420]144 WinQueryDlgItemText(hwnd,id,sizeof(s),s);
[2]145 p = strchr(s,',');
[420]146 if (p) {
[2]147 p++;
148 p = strchr(p,',');
[420]149 if (p) {
[2]150 p++;
151 p = strchr(p,',');
[420]152 if (p)
[2]153 p++;
154 }
155 }
[420]156 return p ? atoi(p) : 0;
[2]157}
158
[122]159LONG get_long_from_window (HWND hwnd,USHORT id)
160{
[420]161 CHAR s[256];
[2]162
[420]163 WinQueryDlgItemText(hwnd,id,sizeof(s),s);
[2]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) {
[404]242 psz = xfgets(sz, sizeof(sz), fpOld, pszSrcFile, __LINE__);
[313]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) {
[404]267 psz = xfgets(sz, sizeof(sz), fpOld, pszSrcFile, __LINE__);
[313]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 (;;) {
[404]343 psz = xfgets(sz, sizeof(sz), fpOld, pszSrcFile, __LINE__);
[313]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
[420]425 if (!info->id)
426 return FALSE; // Assume new if no id
[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
[420]487 WinSendDlgItemMsg(hwnd,AD_LISTBOX,LM_DELETEALL,MPVOID,MPVOID);
[122]488 for(sSelect = AD_ID;sSelect < AD_ADDWPATHS + 1;sSelect++)
[2]489 {
[122]490 WinSendDlgItemMsg(hwnd,
491 sSelect,
492 EM_SETTEXTLIMIT,
493 MPFROM2SHORT(sizeof(s) - 1,0),
[2]494 MPVOID);
[122]495 }
[420]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);
[304]502 if (admp->info->siglen) {
[122]503 WinSetDlgItemText(hwnd,
504 AD_SIG,
505 fixup(admp->info->signature,
506 s,
507 sizeof(s),
[304]508 admp->info->siglen));
[122]509 }
[420]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);
[122]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
[420]550 PostMsg(hwnd,UM_SETUP,MPVOID,MPVOID);
[122]551 break; // WM_INITDLG
[2]552
553 case UM_SETUP:
554 if(admp->listname && *admp->listname) {
555
[420]556 FILE *fp = fopen(admp->listname,"r");
[2]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 {
[420]565 while (!feof(fp)) {
[404]566 if (!xfgets(s, sizeof(s), fp, pszSrcFile, __LINE__))
567 break;
[2]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:
[420]589 PostMsg(hwnd,UM_SETDIR,MPVOID,MPVOID);
[2]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);
[347]606 if (!admp->listname)
607 Runtime_Error(pszSrcFile, __LINE__, "no listname");
608 else {
[2]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));
[347]619 if(!*s)
620 Runtime_Error(pszSrcFile, __LINE__, "no text");
621 else {
[122]622 PSZ p;
623 PSZ pp;
[2]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:
[420]645 WinSetDlgItemText(hwnd,AD_HELP,NullStr);
[2]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
[122]852 PSZ p;
[2]853
[122]854 lstrip(tempargs);
[2]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:
[304]883 // fixme to avoid creating empty strings for startlist and endlist
[347]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,
[250]898 AD_SIG,
899 admp->info->signature);
[304]900 admp->info->siglen = literal(admp->info->signature);
[347]901 admp->info->list = free_and_strdup_from_window(hwnd,
[2]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);
[107]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;
[2]914 {
[304]915 INT ok = check_archiver(hwnd,admp->info);
[420]916 if (saymsg(MB_YESNO,
917 hwnd,
918 GetPString(IDS_ADCHANGESINMEMTEXT),
919 GetPString(IDS_ADREWRITETEXT),
[304]920 !ok ? GetPString(IDS_NOTRECOMMENDTEXT) : NullStr) ==
[2]921 MBID_YES) {
922
[122]923 PSZ ab2;
[2]924
[304]925 ab2 = searchpath(GetPString(IDS_ARCHIVERBB2)); // Rewrite without alerting
[2]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:
[347]945 if(!admp->listname)
946 Runtime_Error(pszSrcFile, __LINE__, "no listname");
947 else {
[2]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:
[347]972 if(!admp->listname)
973 Runtime_Error(pszSrcFile, __LINE__, "no listname");
974 else {
[2]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.