source: trunk/dll/autoview.c@ 844

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

Reversion of some large file funtions where file sizes is not used

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