source: trunk/dll/autoview.c@ 870

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

Fixed Hex formating problem (ticket 174) caused by open watcom same as Ticket 143 at different locations. Added 3.08 release comment to version.h

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