source: trunk/dll/autoview.c@ 1391

Last change on this file since 1391 was 1391, checked in by Gregg Young, 17 years ago

Move nontranslated strings to init.c and codepage.c; use those strings in place of GetPString calls. Move other strings to a StringTable; minor cleanup and code changes to codepage.c to use a string array instead of GetPString calls. Ticket 340

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 24.1 KB
RevLine 
[41]1
2/***********************************************************************
3
4 $Id: autoview.c 1391 2009-01-11 23:55:53Z gyoung $
5
6 Auto view
7
8 Copyright (c) 1993-98 M. Kimes
[907]9 Copyright (c) 2001, 2008 Steven H.Levine
[41]10
[130]11 12 Sep 02 SHL AutoObjProc: catch buff2 overflows
12 25 Oct 02 SHL CreateHexDump: catch buffer overflow
13 12 Feb 03 SHL AutoObjProc: standardize EA math
14 23 May 05 SHL Use QWL_USER
[291]15 29 May 06 SHL Sync with archiver.bb2 mods
[341]16 22 Jul 06 SHL Check more run time errors
[439]17 15 Aug 06 SHL Use Runtime_Error more
[531]18 03 Nov 06 SHL Renames
[689]19 30 Mar 07 GKY Remove GetPString for window class names
[793]20 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
[827]21 01 Sep 07 GKY Use xDosSetPathInfo to fix case where FS3 buffer crosses 64k boundry
[846]22 27 Sep 07 SHL Correct ULONGLONG size formatting
[872]23 22 Nov 07 GKY Use CopyPresParams to fix presparam inconsistencies in menus
[897]24 30 Dec 07 GKY Use CommaFmtULL
[985]25 29 Feb 08 GKY Use xfree where appropriate
[1335]26 10 Dec 08 SHL Integrate exception handler support
[1391]27 11 Jan 09 GKY Replace font names in the string file with global set at compile in init.c
[41]28
29***********************************************************************/
30
[907]31#include <stdlib.h>
32#include <string.h>
33#include <ctype.h>
[1335]34// #include <process.h> // _beginthread
[907]35
[2]36#define INCL_DOS
37#define INCL_WIN
38#define INCL_GPI
[841]39#define INCL_LONGLONG
[2]40
[1182]41#include "fm3dll.h"
[1220]42#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
[1204]43#include "killproc.h" // Data declaration(s)
44#include "notebook.h" // Data declaration(s)
45#include "avl.h" // Data declaration(s)
46#include "inis.h" // Data declaration(s)
47#include "init.h" // Data declaration(s)
48#include "mainwnd.h" // Data declaration(s)
[2]49#include "fm3dlg.h"
50#include "fm3str.h"
51#include "mle.h"
[907]52#include "pathutil.h" // BldFullPathName
53#include "errutil.h" // Dos_Error...
54#include "strutil.h" // GetPString
[1159]55#include "autoview.h"
56#include "defview.h" // DefaultView
57#include "valid.h" // IsBinary
[1182]58#include "misc.h" // CheckMenu
59#include "common.h" // CommonTextButton
60#include "presparm.h" // CopyPresParams
61#include "eas.h" // DisplayEAsProc
62#include "chklist.h" // PopupMenu
63#include "wrappers.h" // xDosSetPathInfo
64#include "commafmt.h" // CommaFmtULL
[1029]65#include "fortify.h"
[1335]66#include "excputil.h" // 06 May 08 SHL added
[1029]67
[1204]68static BOOL PutComments(HWND hwnd, CHAR * filename, CHAR * comments);
69static BOOL WriteEA(HWND hwnd, CHAR * filename, CHAR * eaname, USHORT type,
70 CHAR * data);
71
72// Data definitions
73#pragma data_seg(GLOBAL1)
74HWND hwndAutoMLE;
75
76#pragma data_seg(GLOBAL2)
77ULONG AutoviewHeight;
78
[2]79#pragma data_seg(DATA1)
[341]80static PSZ pszSrcFile = __FILE__;
81
[1204]82static HWND AutoMenu;
[341]83static HWND hwndAutoObj;
[2]84static CHAR stopflag;
85static CHAR currfile[CCHMAXPATH];
86
[551]87BOOL WriteEA(HWND hwnd, CHAR * filename, CHAR * eaname, USHORT type,
88 CHAR * data)
[341]89{
[2]90 /* save an ea to disk */
91
92 FEA2LIST *pfealist = NULL;
[551]93 EAOP2 eaop;
94 APIRET rc;
95 ULONG ealen;
96 USHORT len, *num, *plen, usCodepage;
97 CHAR *p, *eaval;
98 BOOL ret = FALSE;
[2]99
[551]100 if (!filename || !eaname)
[2]101 return ret;
[551]102 usCodepage = (USHORT) WinQueryCp(WinQueryWindowULong(hwnd, QWL_HMQ));
[2]103 len = (data) ? strlen(data) : 0;
[551]104 ealen = sizeof(FEA2LIST) + 24L + strlen(eaname) + 1L + (ULONG) len + 4L;
105 switch (type) {
106 case EAT_EA:
107 case EAT_ASCII:
108 break;
109 case EAT_MVST:
110 if (data) {
111 ealen += sizeof(USHORT) * 5;
112 p = data;
113 while (*p) {
114 if (*p == '\n' && *(p + 1))
115 ealen += sizeof(USHORT);
116 p++;
117 }
118 }
119 break;
120 case EAT_MVMT:
121 if (data) {
122 ealen += sizeof(USHORT) * 5;
123 p = data;
124 while (*p) {
125 if (*p == '\n' && *(p + 1))
126 ealen += (sizeof(USHORT) * 2);
127 p++;
128 }
129 }
130 break;
131 default:
132 return ret;
133 }
134
135 rc = DosAllocMem((PPVOID) & pfealist, ealen, PAG_COMMIT | PAG_READ |
136 PAG_WRITE | OBJ_TILE);
137 if (rc || !pfealist)
138 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__,
139 GetPString(IDS_OUTOFMEMORY));
140 else {
141 memset(pfealist, 0, ealen);
142 pfealist->list[0].cbName = strlen(eaname);
143 memcpy(pfealist->list[0].szName, eaname, pfealist->list[0].cbName + 1);
144 eaval = pfealist->list[0].szName + pfealist->list[0].cbName + 1;
145 switch (type) {
[2]146 case EAT_EA:
147 case EAT_ASCII:
[551]148 if (data) {
149 *(USHORT *) eaval = (USHORT) type;
150 eaval += sizeof(USHORT);
151 *(USHORT *) eaval = (USHORT) len;
152 eaval += sizeof(USHORT);
153 memcpy(eaval, data, len);
154 eaval += len;
155 }
[2]156 break;
157 case EAT_MVST:
[551]158 if (data) {
159 *(USHORT *) eaval = (USHORT) EAT_MVST;
160 eaval += sizeof(USHORT);
161 *(USHORT *) eaval = usCodepage;
162 eaval += sizeof(USHORT);
163 num = (USHORT *) eaval;
164 *num = 0;
165 eaval += sizeof(USHORT);
166 *(USHORT *) eaval = (USHORT) EAT_ASCII;
167 eaval += sizeof(USHORT);
168 plen = (USHORT *) eaval;
169 *plen = 0;
170 eaval += sizeof(USHORT);
171 p = data;
172 while (*p) {
173 while (*p) {
174 if (*p == '\n') {
175 p++;
176 break;
177 }
178 *eaval++ = *p++;
179 (*plen)++;
180 }
181 if (*p || *plen)
182 (*num)++;
183 if (*p) {
184 plen = (USHORT *) eaval;
185 *plen = 0;
186 eaval += sizeof(USHORT);
187 }
188 }
[2]189 }
190 break;
191 case EAT_MVMT:
[551]192 if (data) {
193 *(USHORT *) eaval = (USHORT) EAT_MVMT;
194 eaval += sizeof(USHORT);
195 *(USHORT *) eaval = usCodepage;
196 eaval += sizeof(USHORT);
197 num = (USHORT *) eaval;
198 *num = 0;
199 eaval += sizeof(USHORT);
200 *(USHORT *) eaval = (USHORT) EAT_ASCII;
201 eaval += sizeof(USHORT);
202 plen = (USHORT *) eaval;
203 *plen = 0;
204 eaval += sizeof(USHORT);
205 p = data;
206 while (*p) {
207 while (*p) {
208 if (*p == '\n') {
209 p++;
210 break;
211 }
212 *eaval++ = *p++;
213 (*plen)++;
214 }
215 if (*p || *plen)
216 (*num)++;
217 if (*p) {
218 *(USHORT *) eaval = (USHORT) EAT_ASCII;
219 eaval += sizeof(USHORT);
220 plen = (USHORT *) eaval;
221 *plen = 0;
222 eaval += sizeof(USHORT);
223 }
224 }
[2]225 }
226 break;
227 }
[1029]228 pfealist->list[0].cbValue = /*(ULONG)*/ (eaval -
[551]229 (pfealist->list[0].szName +
230 pfealist->list[0].cbName + 1));
231 memset(&eaop, 0, sizeof(eaop));
[2]232 eaop.fpFEA2List = pfealist;
[841]233 pfealist->cbList = 13 + (ULONG) pfealist->list[0].cbName +
[551]234 (ULONG) pfealist->list[0].cbValue;
[827]235 rc = xDosSetPathInfo(filename, FIL_QUERYEASIZE,
236 &eaop, sizeof(eaop), DSPI_WRTTHRU);
[2]237 DosFreeMem(pfealist);
[551]238 if (!rc)
[2]239 ret = TRUE;
240 }
241 return ret;
242}
243
[551]244BOOL PutComments(HWND hwnd, CHAR * filename, CHAR * comments)
[341]245{
[2]246 register CHAR *p;
247
[551]248 if (comments) { /* check -- is it empty? */
[2]249 p = comments;
[551]250 while (*p && isspace(*p))
[2]251 p++;
[551]252 if (!*p)
[2]253 comments = NULL;
254 }
[551]255 return WriteEA(hwnd, filename, ".COMMENTS", EAT_MVMT, comments);
[2]256}
257
[439]258static PSZ pszBufOvfMsg = "Buffer overflow";
[2]259
[551]260ULONG CreateHexDump(CHAR * pchInBuf, ULONG cbInBuf,
261 CHAR * pchOutBuf, ULONG cbOutBuf,
262 ULONG cOffset, BOOL fLongAddr)
[41]263{
[551]264 register CHAR *pchIn, *pchReset, *pchOut;
265 register ULONG ibIn = 0, ibIn2, ibInFill;
[41]266 ULONG cbOutLine = 6 + (fLongAddr ? 4 : 0) + 16 * 3 + 1 + 16 + 1;
[2]267
[551]268 if (pchInBuf && cbInBuf && pchOutBuf && cbOutBuf) {
[41]269 pchIn = pchInBuf;
270 pchOut = pchOutBuf;
[551]271 if (cOffset)
[41]272 *pchOut++ = '\n';
273 while (ibIn < cbInBuf) {
274 if (pchOut - pchOutBuf + cbOutLine >= cbOutBuf) {
[551]275 Runtime_Error(pszSrcFile, __LINE__, pszBufOvfMsg);
[41]276 break;
277 }
278 pchReset = pchIn;
279 ibIn2 = ibIn;
[551]280 if (fLongAddr)
281 sprintf(pchOut, "%08lx ", ibIn + cOffset);
[2]282 else
[551]283 sprintf(pchOut, "%04lx ", ibIn + cOffset);
[41]284 pchOut += 6 + (fLongAddr ? 4 : 0);
[2]285 do {
[870]286 sprintf(pchOut, "%02x ", (UCHAR)*pchIn);
[551]287 pchOut += 3;
288 pchIn++;
289 ibIn++;
290 } while (ibIn < cbInBuf && (ibIn % 16));
291 if (ibIn % 16) {
292 ibInFill = ibIn;
293 while (ibInFill % 16) {
294 *pchOut++ = ' ';
295 *pchOut++ = ' ';
296 *pchOut++ = ' ';
297 ibInFill++;
298 }
[2]299 }
[41]300 *pchOut++ = ' ';
301 pchIn = pchReset;
[2]302 do {
[551]303 if (*pchIn && *pchIn != '\n' && *pchIn != '\r' && *pchIn != '\t'
304 && *pchIn != '\x1a')
305 *pchOut++ = *pchIn++;
306 else {
307 *pchOut++ = '.';
308 pchIn++;
309 }
310 ibIn2++;
311 } while (ibIn2 < ibIn);
312 if (ibIn < cbInBuf)
313 *pchOut++ = '\n';
314 } // while ibIn
[41]315 *pchOut = 0;
[551]316 return (ULONG) (pchOut - pchOutBuf);
[2]317 }
318 return 0L;
319}
320
[551]321MRESULT EXPENTRY AutoObjProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[51]322{
[551]323 switch (msg) {
324 case UM_LOADFILE:
325 *currfile = 0;
326 stopflag--;
327 if (fAutoView) {
328 WinSetWindowText((fComments) ? hwndAutoMLE : hwndAutoview, "");
329 MLEsetreadonly(hwndAutoMLE, TRUE);
330 MLEsetchanged(hwndAutoMLE, FALSE);
331 }
332 if (mp1) {
333 if (fAutoView) {
[1009]334 strcpy(currfile, (CHAR *)mp1);
[551]335 if (!fComments) {
[1009]336 if (IsFile((CHAR *)mp1) == 1) {
[2]337
[551]338 HFILE handle;
[858]339 ULONG olen, ibufflen, action, obufflen, l;
[850]340 CHAR *ibuff, *obuff, *p;
341 CHAR buffer[4096];
[551]342 ARC_TYPE *info;
[2]343
[1009]344 if (!DosOpen((CHAR *)mp1,
[844]345 &handle,
346 &action,
347 0,
348 0,
349 OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS,
350 OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NOINHERIT |
351 OPEN_FLAGS_RANDOMSEQUENTIAL | OPEN_SHARE_DENYNONE |
352 OPEN_ACCESS_READONLY, 0)) {
[850]353 ibufflen = AutoviewHeight < 96 ? 512 : 3072;
354 // 06 Oct 07 SHL protect against NTFS driver small buffer defect
[858]355 ibuff = xmalloc(max(ibufflen + 2, 4096), pszSrcFile, __LINE__);
[551]356 if (ibuff) {
357 // Depends on CreateHexDump line width
358 obufflen = (ibufflen / 16) * (6 + 3 * 16 + 1 + 16 + 1) + 80;
359 obuff = xmalloc(obufflen + 1, pszSrcFile, __LINE__);
360 if (obuff) {
361 *obuff = 0;
[850]362 if (!DosRead(handle, ibuff, ibufflen, &ibufflen) &&
363 ibufflen)
364 {
[551]365 ibuff[ibufflen] = 0;
366 p = obuff;
367 if (IsBinary(ibuff, ibufflen)) {
368 olen = ibufflen;
369 // Check archive
370 if (!arcsigsloaded)
371 load_archivers();
372 info = arcsighead;
373 while (info) {
374 if (info->signature && *info->signature) {
375 l = strlen(info->signature);
376 l = min(l, 79);
377 if (!DosChgFilePtr(handle, abs(info->file_offset),
378 (info->file_offset >= 0L) ?
379 FILE_BEGIN :
380 FILE_END, &ibufflen)) {
381 if (!DosRead(handle,
382 buffer,
383 l, &ibufflen) && ibufflen == l) {
384 if (!memcmp(info->signature, buffer, l))
385 break;
386 }
387 }
388 }
389 info = info->next;
390 }
391 if (info) {
392 sprintf(p, "**%s%s%s\n",
[773]393 info->id ? info->id : "",
394 info->id ? " " : "",
[551]395 GetPString(IDS_ARCHIVETEXT));
396 p += strlen(p);
397 }
398 CreateHexDump(ibuff, // Input buffer
399 olen, // Input buffer size
400 p, // Output buffer
401 obufflen - (p - obuff), // Output buffer size
402 0, // Address offest
403 FALSE); // Short addresses
404 }
405 else {
406 // Text file
407 register CHAR *src, *dest;
408 CHAR *endsrc;
[2]409
[551]410 src = ibuff;
411 dest = obuff;
412 endsrc = ibuff + ibufflen;
413 while (src < endsrc) {
414 if (dest == obuff && (*src == '\t' || *src == ' ' ||
415 *src == '\r' || *src == '\n')) {
416 src++;
417 }
418 else if (*src == '\t' || !*src) {
419 *dest = ' ';
420 dest++;
421 src++;
422 }
423 else if (*src == '\r' || *src == '\n') {
424 *dest = *src;
425 while (*(src + 1) == '\r' || *(src + 1) == '\n' ||
426 *(src + 1) == ' ' || *(src + 1) == '\t')
427 src++;
428 dest++;
429 src++;
430 }
431 else {
432 *dest = *src;
433 src++;
434 dest++;
435 }
436 } // while
437 *dest = 0;
438 if (dest - obuff >= obufflen)
439 Runtime_Error(pszSrcFile, __LINE__, pszBufOvfMsg);
440 }
441 if (*obuff)
442 WinSetWindowText(hwndAutoview, obuff);
443 }
[1039]444 free(obuff);
[551]445 }
[1039]446 free(ibuff);
[551]447 }
448 DosClose(handle);
449 }
450 }
451 else if (!IsFile(currfile)) {
[2]452
[841]453 static FILEFINDBUF4L ffb[130];
[897]454 CHAR fullname[CCHMAXPATH + 4], szCmmaFmtFileSize[81];
[551]455 HDIR hdir = HDIR_CREATE;
456 ULONG x, nm, ml, mc, bufflen;
457 PBYTE fb;
[841]458 PFILEFINDBUF4L pffbFile;
[773]459 PSZ pszBuf;
460 PSZ p;
461 APIRET rc;
[2]462
[773]463 BldFullPathName(fullname, currfile, "*");
[763]464 //sprintf(fullname,
465 // "%s%s*",
466 // currfile,
467 // (currfile[strlen(currfile) - 1] == '\\') ? "" : "\\");
[551]468 DosError(FERR_DISABLEHARDERR);
[841]469 nm = sizeof(ffb) / sizeof(FILEFINDBUF4L);
[551]470 if (AutoviewHeight < 96)
471 nm /= 2;
[838]472 rc = xDosFindFirst(fullname,
[858]473 &hdir,
474 FILE_NORMAL | FILE_DIRECTORY |
475 FILE_READONLY | FILE_ARCHIVED |
476 FILE_SYSTEM | FILE_HIDDEN,
477 &ffb, sizeof(ffb), &nm, FIL_QUERYEASIZEL);
[551]478 if (!rc && nm) {
479 fb = (PBYTE) & ffb;
480 x = ml = 0;
481 while (x < nm) {
[841]482 pffbFile = (PFILEFINDBUF4L) fb;
[551]483 mc = (ULONG) pffbFile->cchName +
484 ((pffbFile->attrFile & FILE_DIRECTORY) != 0);
485 ml = max(ml, mc);
486 if (!pffbFile->oNextEntryOffset)
487 break;
488 fb += pffbFile->oNextEntryOffset;
489 x++;
490 }
491 bufflen = (CCHMAXPATHCOMP + 42) * nm;
[773]492 pszBuf = xmalloc(bufflen, pszSrcFile, __LINE__);
493 if (pszBuf) {
494 p = pszBuf;
[551]495 *p = 0;
496 fb = (PBYTE) & ffb;
497 x = 0;
498 while (x < nm) {
[841]499 pffbFile = (PFILEFINDBUF4L) fb;
[551]500 if (!(!*pffbFile->achName ||
501 (((pffbFile->attrFile & FILE_DIRECTORY) &&
502 pffbFile->achName[0] == '.') &&
503 (!pffbFile->achName[1] ||
504 (pffbFile->achName[1] == '.' &&
505 !pffbFile->achName[2]))))) {
[1078]506 CommaFmtULL(szCmmaFmtFileSize,
507 sizeof(szCmmaFmtFileSize),
508 pffbFile->cbFile + CBLIST_TO_EASIZE(pffbFile->cbList),
509 ' ');
[551]510 sprintf(p,
[897]511 "%s%-*.*s %-8s [%s%s%s%s] %04lu/%02lu/%02lu "
[846]512 "%02lu:%02lu:%02lu\r",
513 pffbFile->attrFile & FILE_DIRECTORY ? "\\" : " ",
[551]514 ml,
515 ml,
[1078]516 pffbFile->achName,
517 szCmmaFmtFileSize,
[846]518 pffbFile->attrFile & FILE_READONLY ? "R" : "-",
519 pffbFile->attrFile & FILE_ARCHIVED ? "A" : "-",
520 pffbFile->attrFile & FILE_HIDDEN ? "H" : "-",
521 pffbFile->attrFile & FILE_SYSTEM ? "S" : "-",
[551]522 pffbFile->fdateLastWrite.year + 1980,
523 pffbFile->fdateLastWrite.month,
524 pffbFile->fdateLastWrite.day,
525 pffbFile->ftimeLastWrite.hours,
526 pffbFile->ftimeLastWrite.minutes,
527 pffbFile->ftimeLastWrite.twosecs * 2);
528 p += strlen(p);
529 }
530 if (!pffbFile->oNextEntryOffset)
531 break;
532 fb += pffbFile->oNextEntryOffset;
533 x++;
534 } // while
[773]535 if (p - pszBuf >= bufflen)
[551]536 Runtime_Error(pszSrcFile, __LINE__, pszBufOvfMsg);
[773]537 if (*pszBuf)
538 WinSetWindowText(hwndAutoview, pszBuf);
[1039]539 free(pszBuf);
[551]540 }
541 }
542 if (!rc)
543 DosFindClose(hdir);
544 }
545 }
546 else {
[2]547
[551]548 APIRET rc;
549 EAOP2 eaop;
550 PGEA2LIST pgealist;
551 PFEA2LIST pfealist;
552 PGEA2 pgea;
553 PFEA2 pfea;
[773]554 CHAR *value, *pszBuf, *p, *data;
[551]555 USHORT len, type, plen, dlen;
556 BOOL readonly = FALSE;
[2]557
[551]558 pgealist = xmallocz(sizeof(GEA2LIST) + 64, pszSrcFile, __LINE__);
559 if (pgealist) {
560 pgea = &pgealist->list[0];
561 strcpy(pgea->szName, ".COMMENTS");
562 pgea->cbName = strlen(pgea->szName);
563 pgea->oNextEntryOffset = 0L;
564 pgealist->cbList = (sizeof(GEA2LIST) + pgea->cbName);
565 pfealist = xmallocz(65536, pszSrcFile, __LINE__);
566 if (pfealist) {
567 pfealist->cbList = 65536;
568 eaop.fpGEA2List = pgealist;
569 eaop.fpFEA2List = pfealist;
570 eaop.oError = 0L;
[1009]571 rc = DosQueryPathInfo((CHAR *)mp1, FIL_QUERYEASFROMLIST,
[551]572 (PVOID) & eaop, (ULONG) sizeof(EAOP2));
[1039]573 free(pgealist);
[551]574 if (!rc) {
575 pfea = &eaop.fpFEA2List->list[0];
576 if (pfea->cbName && pfea->cbValue) {
577 value = pfea->szName + pfea->cbName + 1;
578 value[pfea->cbValue] = 0;
579 if (*(USHORT *) value == EAT_MVMT) {
[773]580 pszBuf = xmalloc(65536, pszSrcFile, __LINE__);
581 if (pszBuf) {
582 p = pszBuf;
583 *pszBuf = 0;
[551]584 data = value + (sizeof(USHORT) * 3);
585 type = *(USHORT *) data;
586 data += sizeof(USHORT);
587 len = *(USHORT *) data;
588 data += sizeof(USHORT);
589 while ((data - value) - len < pfea->cbValue) {
590 if (type == EAT_ASCII) {
591 dlen = plen = 0;
592 while (dlen < len) {
593 if (data[dlen] == '\r') {
594 dlen++;
595 if (dlen < len && data[dlen] != '\n')
596 p[plen++] = '\n';
597 }
598 else
599 p[plen++] = data[dlen++];
600 }
601 if ((!len || !plen || p[plen - 1] != '\n') &&
602 (data - value) + len < pfea->cbValue)
603 p[plen++] = '\n';
604 p += plen;
605 *p = 0;
606 }
607 else
608 readonly = TRUE;
609 data += len;
610 if (data - value >= pfea->cbValue)
[41]611 break;
[551]612 type = *(USHORT *) data;
613 data += sizeof(USHORT);
614 len = *(USHORT *) data;
615 data += sizeof(USHORT);
616 } // while
[773]617 if (p - pszBuf >= 65536) {
[551]618 Runtime_Error(pszSrcFile, __LINE__, pszBufOvfMsg);
[773]619 pszBuf[65535] = 0; // Try to stay alive
[551]620 break;
621 }
[773]622 WinSetWindowText(hwndAutoMLE, pszBuf);
[1039]623 free(pszBuf);
[551]624 }
625 }
626 else
627 readonly = TRUE;
628 }
629 /* else EA not present */
630 MLEsetchanged(hwndAutoMLE, FALSE);
631 MLEsetreadonly(hwndAutoMLE, readonly);
632 }
633 else {
634 MLEsetchanged(hwndAutoMLE, FALSE);
635 MLEsetreadonly(hwndAutoMLE, FALSE);
636 }
[1039]637 free(pfealist);
[551]638 }
639 }
640 }
[2]641 }
[1039]642 free((CHAR *)mp1);
[1063]643# ifdef FORTIFY
644 Fortify_LeaveScope();
645# endif
[551]646 }
647 return 0;
[2]648
[551]649 case UM_CLOSE:
650 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
651 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
652 WinDestroyWindow(hwnd);
653 return 0;
[2]654 }
[551]655 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]656}
657
[551]658static VOID MakeAutoWinThread(VOID * args)
[341]659{
[551]660 HAB hab2;
661 HMQ hmq2;
662 HWND hwndParent = (HWND) args;
663 QMSG qmsg2;
[2]664
665 hab2 = WinInitialize(0);
[551]666 if (hab2) {
[1063]667# ifdef FORTIFY
668 Fortify_EnterScope();
[1078]669# endif
[551]670 hmq2 = WinCreateMsgQueue(hab2, 128);
671 if (hmq2) {
[2]672 DosError(FERR_DISABLEHARDERR);
673 WinRegisterClass(hab2,
[593]674 WC_OBJECTWINDOW,
[551]675 AutoObjProc, 0, sizeof(PVOID));
[2]676 hwndAutoObj = WinCreateWindow(HWND_OBJECT,
[593]677 WC_OBJECTWINDOW,
[551]678 (PSZ) NULL,
679 0,
680 0L,
681 0L,
682 0L,
683 0L, 0L, HWND_TOP, OBJ_FRAME, NULL, NULL);
[377]684 if (!hwndAutoObj) {
[551]685 Win_Error2(HWND_OBJECT, HWND_DESKTOP, pszSrcFile, __LINE__,
686 IDS_WINCREATEWINDOW);
687 if (!PostMsg(hwndParent, UM_CLOSE, MPVOID, MPVOID))
688 WinSendMsg(hwndParent, UM_CLOSE, MPVOID, MPVOID);
[377]689 }
690 else {
[551]691 WinSetWindowULong(hwndAutoObj, QWL_USER, hwndParent);
692 priority_normal();
693 while (WinGetMsg(hab2, &qmsg2, (HWND) 0, 0, 0))
694 WinDispatchMsg(hab2, &qmsg2);
695 WinDestroyWindow(hwndAutoObj);
696 hwndAutoObj = (HWND) 0;
[2]697 }
698 WinDestroyMsgQueue(hmq2);
699 }
[1032]700 // else
701 WinTerminate(hab2);
[1063]702# ifdef FORTIFY
[1038]703 Fortify_LeaveScope();
[1078]704# endif
[2]705 }
706}
707
[551]708MRESULT EXPENTRY AutoViewProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[341]709{
[551]710 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID);
[2]711
[551]712 switch (msg) {
713 case WM_CREATE:
714 {
715 MRESULT mr;
[2]716
[551]717 if (!hwndAutoObj) {
[1335]718 if (xbeginthread(MakeAutoWinThread,
719 65536,
720 (PVOID)hwnd,
721 pszSrcFile,
722 __LINE__) == -1) {
[551]723 PostMsg(hwnd, UM_CLOSE, MPVOID, MPVOID);
[341]724 }
[2]725 }
[551]726 mr = PFNWPStatic(hwnd, msg, mp1, mp2);
[1391]727 //fixme to allow user to change presparams 1-10-09 GKY
[551]728 SetPresParams(hwnd,
729 &RGBGREY,
[1391]730 &RGBBLACK, &RGBGREY, FNT_4SYSTEMVIO);
[551]731 stopflag = 0;
732 return mr;
733 }
[2]734
[551]735 case UM_SETUP:
736 MLEsetlimit(hwnd, 32768);
737 MLEsetformat(hwnd, MLFIE_NOTRANS);
738 MLEsetchanged(hwnd, FALSE);
739 return 0;
[2]740
[551]741 case WM_BUTTON1DOWN:
742 {
743 SWP swp;
[2]744
[551]745 WinQueryWindowPos(hwnd, &swp);
746 if (SHORT2FROMMP(mp1) > swp.cy - 4) {
[2]747
[551]748 HPS hps = WinGetPS(WinQueryWindow(hwnd, QW_PARENT));
749 SWP swpC;
750 TRACKINFO track;
[2]751
[551]752 if (hps) {
753 WinQueryWindowPos(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
754 FID_CLIENT), &swpC);
755 track.cxBorder = 4;
756 track.cyBorder = 4;
757 track.cxGrid = 1;
758 track.cyGrid = 8;
759 track.cxKeyboard = 8;
760 track.rclTrack.yBottom = swp.y;
761 track.rclTrack.yTop = swp.y + swp.cy;
762 track.rclTrack.xLeft = swp.x;
763 track.rclTrack.xRight = swp.x + swp.cx;
764 track.rclBoundary = track.rclTrack;
765 track.rclBoundary.yTop = (swpC.cy + swp.y + swp.cy) - 116;
766 track.ptlMinTrackSize.x = swp.x + swp.cx;
767 track.ptlMinTrackSize.y = 36;
768 track.ptlMaxTrackSize.x = swp.x + swp.cx;
769 track.ptlMaxTrackSize.y = (swpC.cy + swp.cy) - 116;
770 track.fs = TF_TOP;
771 if (WinTrackRect(hwnd, hps, &track)) {
772 AutoviewHeight = track.rclTrack.yTop - track.rclTrack.yBottom;
773 PrfWriteProfileData(fmprof,
774 FM3Str,
775 "AutoviewHeight",
776 &AutoviewHeight, sizeof(ULONG));
777 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
778 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
779 }
780 WinReleasePS(hps);
781 }
782 return (MRESULT) TRUE;
[2]783 }
[551]784 else if (id != MAIN_AUTOVIEWMLE)
785 return CommonTextButton(hwnd, msg, mp1, mp2);
786 }
787 break;
[2]788
[551]789 case WM_BUTTON3DOWN:
790 case WM_BUTTON1UP:
791 case WM_BUTTON3UP:
792 if (id != MAIN_AUTOVIEWMLE)
793 return CommonTextButton(hwnd, msg, mp1, mp2);
794 break;
[2]795
[551]796 case WM_MOUSEMOVE:
797 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
798 {
799 SWP swp;
[2]800
[551]801 WinQueryWindowPos(hwnd, &swp);
802 if (SHORT2FROMMP(mp1) > swp.cy - 4) {
803 WinSetPointer(HWND_DESKTOP, hptrNS);
804 return (MRESULT) TRUE;
[2]805 }
[551]806 }
807 break;
[2]808
[551]809 case WM_PAINT:
810 PostMsg(hwnd, UM_PAINT, MPVOID, MPVOID);
811 break;
[2]812
[551]813 case UM_PAINT:
814 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, TRUE);
815 return 0;
[2]816
[551]817 case WM_SETFOCUS:
818 switch (id) {
819 case MAIN_AUTOVIEWMLE:
820 if (!mp2 && !AutoMenu) {
821 if (*currfile) {
822 if (MLEgetchanged(hwnd)) {
823 CHAR *ea = xmalloc(32768, pszSrcFile, __LINE__);
824
825 if (ea) {
826 *ea = 0;
827 WinQueryWindowText(hwnd, 32767, ea);
828 PutComments(hwnd, currfile, ea);
829 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_RESCAN, 0), MPVOID);
[1039]830 free(ea);
[1063]831# ifdef FORTIFY
[1078]832 Fortify_LeaveScope();
[1063]833# endif
[551]834 }
835 }
836 }
[2]837 }
838 break;
[551]839 default:
840 if (mp2)
841 PostMsg(hwnd, UM_FOCUSME, mp1, mp2);
842 break;
843 }
844 break;
[2]845
[551]846 case UM_FOCUSME:
847 if (mp2) {
[2]848
[551]849 PID pid;
850 TID tid;
[2]851
[551]852 if (WinQueryWindowProcess((HWND) mp1, &pid, &tid) && pid == mypid)
853 WinSetFocus(HWND_DESKTOP, (HWND) mp1);
854 else
855 WinSetFocus(HWND_DESKTOP, hwndTree);
856 }
857 return 0;
[2]858
[551]859 case UM_CLICKED:
860 case UM_CLICKED3:
861 if (id != MAIN_AUTOVIEWMLE) {
[2]862 PostMsg(hwnd,
[551]863 WM_COMMAND,
864 MPFROM2SHORT(((msg == UM_CLICKED3) ?
865 IDM_EAS : IDM_VIEWORARC), 0), MPVOID);
866 }
867 return 0;
[2]868
[551]869 case WM_COMMAND:
870 PostMsg(hwnd, UM_COMMAND, mp1, mp2);
871 return 0;
[2]872
[551]873 case UM_COMMAND:
874 switch (SHORT1FROMMP(mp1)) {
875 case IDM_RESCAN:
876 if (*currfile) {
[2]877
[551]878 CHAR *cf = xstrdup(currfile, pszSrcFile, __LINE__);
[2]879
[551]880 if (cf) {
881 stopflag++;
882 if (!PostMsg(hwndAutoObj, UM_LOADFILE, MPFROMP(cf), MPVOID))
[1039]883 free(cf);
[1063]884# ifdef FORTIFY
[1078]885 Fortify_LeaveScope();
[1063]886# endif
[551]887 }
888 }
889 break;
[2]890
[551]891 case IDM_INFO:
892 DefaultView(hwnd, (HWND) 0, hwndMain, NULL, 16, currfile);
893 break;
[2]894
[551]895 case IDM_VIEW:
896 DefaultView(hwnd, (HWND) 0, hwndMain, NULL, 0, currfile);
897 break;
[2]898
[551]899 case IDM_EDIT:
900 DefaultView(hwnd, (HWND) 0, hwndMain, NULL, 8, currfile);
901 break;
[2]902
[551]903 case IDM_EAS:
904 {
905 char *list[2];
[2]906
[551]907 list[0] = currfile;
908 list[1] = NULL;
[2]909
[551]910 WinDlgBox(HWND_DESKTOP,
911 hwndMain,
912 DisplayEAsProc, FM3ModHandle, EA_FRAME, (PVOID) list);
[2]913 }
914 break;
915
[551]916 default:
917 PostMsg(hwndMain, msg, mp1, mp2);
918 }
919 return 0;
[2]920
[551]921 case WM_MENUEND:
922 if ((HWND) mp2 == AutoMenu) {
923 WinDestroyWindow(AutoMenu);
924 AutoMenu = (HWND) 0;
925 }
926 break;
[2]927
[551]928 case WM_CONTEXTMENU:
[872]929 CheckMenu(hwnd, &AutoMenu, (id == MAIN_AUTOVIEWMLE) ?
[551]930 IDM_AUTOVIEWMLE : IDM_AUTOVIEW);
931 WinCheckMenuItem(AutoMenu, IDM_AUTOVIEWFILE, !fComments);
932 WinCheckMenuItem(AutoMenu, IDM_AUTOVIEWCOMMENTS, fComments);
933 WinEnableMenuItem(AutoMenu, IDM_VIEW, (IsFile(currfile) == 1));
934 WinEnableMenuItem(AutoMenu, IDM_EDIT, (IsFile(currfile) == 1));
935 WinEnableMenuItem(AutoMenu, IDM_INFO, (*currfile != 0));
936 PopupMenu(hwnd, hwnd, AutoMenu);
937 break;
[2]938
[551]939 case UM_LOADFILE:
940 stopflag++;
941 if (!PostMsg(hwndAutoObj, msg, mp1, mp2)) {
[1009]942 xfree((CHAR *)mp1, pszSrcFile, __LINE__);
[1063]943# ifdef FORTIFY
944 Fortify_LeaveScope();
945# endif
[551]946 }
947 return 0;
[2]948
[551]949 case UM_CLOSE:
950 if (AutoMenu) {
951 WinDestroyWindow(AutoMenu);
952 AutoMenu = (HWND) 0;
953 }
954 WinDestroyWindow(hwnd);
955 return 0;
956
957 case WM_CLOSE:
958 WinSendMsg(hwnd, UM_CLOSE, MPVOID, MPVOID);
959 return 0;
960
961 case WM_DESTROY:
962 if (id != MAIN_AUTOVIEWMLE) {
963 if (hwndAutoObj)
964 if (!PostMsg(hwndAutoObj, WM_CLOSE, MPVOID, MPVOID))
965 WinSendMsg(hwndAutoObj, WM_CLOSE, MPVOID, MPVOID);
[2]966 break;
[551]967 }
968 break;
[2]969 }
970
[551]971 if (id == MAIN_AUTOVIEWMLE)
972 return PFNWPMLE(hwnd, msg, mp1, mp2);
973 return PFNWPStatic(hwnd, msg, mp1, mp2);
[2]974}
[793]975
976#pragma alloc_text(AUTOVIEW,AutoViewProc,CreateHexDump,AutoObjProc)
977#pragma alloc_text(AUTOVIEW2,MakeAutoWinThread,WriteEA,PutComments)
Note: See TracBrowser for help on using the repository browser.