source: trunk/dll/avv.c@ 689

Last change on this file since 689 was 689, checked in by Steven Levine, 18 years ago

Commit OpenWatcom compatibility updates

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