source: trunk/dll/avv.c@ 927

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

Free pszWorkBuf memory for NormalizeCmdLine calls. Add comments for ticket 161 fix.

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