source: trunk/dll/avv.c@ 908

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

Avoid out of memory traps in Compare Directories
Rework Compare Directories progress display for 2 second update rate
Start refactoring to reduce dependence on fm3dll.h
Add timer services (IsITimerExpired etc.)

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