source: trunk/dll/avv.c@ 1036

Last change on this file since 1036 was 1009, checked in by Steven Levine, 17 years ago

Add xfree xstrdup Fortify support
Add MT capable Fortify scope logic

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