source: trunk/dll/avv.c@ 906

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

The basic program quoting code and some mailto cleanup.

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