source: trunk/dll/autoview.c@ 826

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

Add xDosSetPathInfo to work around FILESTATUSx buffer crossing 64k boundry

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