source: trunk/dll/autoview.c@ 959

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

Use xfree where appropriate. Check that buffer exists following all xmallocs. Stopped at eas.c with xfree checking. One remaining xmalloc without test in dirsize.c

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