source: trunk/dll/avv.c@ 574

Last change on this file since 574 was 574, checked in by Gregg Young, 18 years ago

Use QWL_USER; Replace doesn't move the command and Okay on cmd dialog removed error on unchanged command

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