source: trunk/dll/autoview.c@ 763

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

Replaced sprintf path building with BldFullPathName at functions for quoting path and file names

  • 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 763 2007-08-05 00:16:17Z 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
21***********************************************************************/
22
23#define INCL_DOS
24#define INCL_WIN
25#define INCL_GPI
26#include <os2.h>
27
28#include <stdlib.h>
29#include <stdio.h>
30#include <string.h>
31#include <ctype.h>
32#include <process.h> // _beginthread
33
34#include "fm3dll.h"
35#include "fm3dlg.h"
36#include "fm3str.h"
37#include "mle.h"
38
39#pragma data_seg(DATA1)
40
41static PSZ pszSrcFile = __FILE__;
42
43#pragma alloc_text(AUTOVIEW,AutoViewProc,CreateHexDump,AutoObjProc)
44#pragma alloc_text(AUTOVIEW2,MakeAutoWinThread,WriteEA,PutComments)
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 = 13L + (ULONG) pfealist->list[0].cbName +
197 (ULONG) pfealist->list[0].cbValue;
198 rc = DosSetPathInfo(filename, FIL_QUERYEASIZE, (PVOID) & eaop,
199 (ULONG) sizeof(EAOP2), 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 action, olen, ibufflen, obufflen, l;
303 CHAR *ibuff, *obuff, *p, buffer[80];
304 ARC_TYPE *info;
305
306 if (!DosOpen((CHAR *) mp1,
307 &handle,
308 &action,
309 0L,
310 0L,
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, 0L)) {
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 FILEFINDBUF4 ffb[130];
414 CHAR fullname[CCHMAXPATH + 4];
415 PSZ pszFullName = fullname, pszCurrFile = currfile, psz;
416 HDIR hdir = HDIR_CREATE;
417 ULONG x, nm, ml, mc, bufflen;
418 PBYTE fb;
419 PFILEFINDBUF4 pffbFile;
420 CHAR *buff, *p = "*";
421 APIRET rc;
422
423 psz = p;
424 BldFullPathName(pszFullName, pszCurrFile, psz);
425 *p = 0;
426 //sprintf(fullname,
427 // "%s%s*",
428 // currfile,
429 // (currfile[strlen(currfile) - 1] == '\\') ? "" : "\\");
430 DosError(FERR_DISABLEHARDERR);
431 nm = sizeof(ffb) / sizeof(FILEFINDBUF4);
432 if (AutoviewHeight < 96)
433 nm /= 2;
434 rc = DosFindFirst(fullname,
435 &hdir,
436 FILE_NORMAL | FILE_DIRECTORY |
437 FILE_READONLY | FILE_ARCHIVED |
438 FILE_SYSTEM | FILE_HIDDEN,
439 &ffb, sizeof(ffb), &nm, FIL_QUERYEASIZE);
440 if (!rc && nm) {
441 fb = (PBYTE) & ffb;
442 x = ml = 0;
443 while (x < nm) {
444 pffbFile = (PFILEFINDBUF4) fb;
445 mc = (ULONG) pffbFile->cchName +
446 ((pffbFile->attrFile & FILE_DIRECTORY) != 0);
447 ml = max(ml, mc);
448 if (!pffbFile->oNextEntryOffset)
449 break;
450 fb += pffbFile->oNextEntryOffset;
451 x++;
452 }
453 bufflen = (CCHMAXPATHCOMP + 42) * nm;
454 buff = xmalloc(bufflen, pszSrcFile, __LINE__);
455 if (buff) {
456 p = buff;
457 *p = 0;
458 fb = (PBYTE) & ffb;
459 x = 0;
460 while (x < nm) {
461 pffbFile = (PFILEFINDBUF4) fb;
462 if (!(!*pffbFile->achName ||
463 (((pffbFile->attrFile & FILE_DIRECTORY) &&
464 pffbFile->achName[0] == '.') &&
465 (!pffbFile->achName[1] ||
466 (pffbFile->achName[1] == '.' &&
467 !pffbFile->achName[2]))))) {
468 sprintf(p,
469 "%s%-*.*s %-8lu [%s%s%s%s] %04lu/%02lu/%02lu "
470 "%02lu:%02lu:%02lu\r",
471 ((pffbFile->attrFile & FILE_DIRECTORY) != 0) ?
472 "\\" : " ",
473 ml,
474 ml,
475 pffbFile->achName,
476 pffbFile->cbFile +
477 CBLIST_TO_EASIZE(pffbFile->cbList),
478 ((pffbFile->attrFile & FILE_READONLY) != 0) ?
479 "R" : "-",
480 ((pffbFile->attrFile & FILE_ARCHIVED) != 0) ?
481 "A" : "-",
482 ((pffbFile->attrFile & FILE_HIDDEN) != 0) ?
483 "H" : "-",
484 ((pffbFile->attrFile & FILE_SYSTEM) != 0) ?
485 "S" : "-",
486 pffbFile->fdateLastWrite.year + 1980,
487 pffbFile->fdateLastWrite.month,
488 pffbFile->fdateLastWrite.day,
489 pffbFile->ftimeLastWrite.hours,
490 pffbFile->ftimeLastWrite.minutes,
491 pffbFile->ftimeLastWrite.twosecs * 2);
492 p += strlen(p);
493 }
494 if (!pffbFile->oNextEntryOffset)
495 break;
496 fb += pffbFile->oNextEntryOffset;
497 x++;
498 } // while
499 if (p - buff >= bufflen)
500 Runtime_Error(pszSrcFile, __LINE__, pszBufOvfMsg);
501 if (*buff)
502 WinSetWindowText(hwndAutoview, buff);
503 free(buff);
504 }
505 }
506 if (!rc)
507 DosFindClose(hdir);
508 }
509 }
510 else {
511
512 APIRET rc;
513 EAOP2 eaop;
514 PGEA2LIST pgealist;
515 PFEA2LIST pfealist;
516 PGEA2 pgea;
517 PFEA2 pfea;
518 CHAR *value, *buff, *p, *data;
519 USHORT len, type, plen, dlen;
520 BOOL readonly = FALSE;
521
522 pgealist = xmallocz(sizeof(GEA2LIST) + 64, pszSrcFile, __LINE__);
523 if (pgealist) {
524 pgea = &pgealist->list[0];
525 strcpy(pgea->szName, ".COMMENTS");
526 pgea->cbName = strlen(pgea->szName);
527 pgea->oNextEntryOffset = 0L;
528 pgealist->cbList = (sizeof(GEA2LIST) + pgea->cbName);
529 pfealist = xmallocz(65536, pszSrcFile, __LINE__);
530 if (pfealist) {
531 pfealist->cbList = 65536;
532 eaop.fpGEA2List = pgealist;
533 eaop.fpFEA2List = pfealist;
534 eaop.oError = 0L;
535 rc = DosQueryPathInfo((CHAR *) mp1, FIL_QUERYEASFROMLIST,
536 (PVOID) & eaop, (ULONG) sizeof(EAOP2));
537 free(pgealist);
538 if (!rc) {
539 pfea = &eaop.fpFEA2List->list[0];
540 if (pfea->cbName && pfea->cbValue) {
541 value = pfea->szName + pfea->cbName + 1;
542 value[pfea->cbValue] = 0;
543 if (*(USHORT *) value == EAT_MVMT) {
544 buff = xmalloc(65536, pszSrcFile, __LINE__);
545 if (buff) {
546 p = buff;
547 *buff = 0;
548 data = value + (sizeof(USHORT) * 3);
549 type = *(USHORT *) data;
550 data += sizeof(USHORT);
551 len = *(USHORT *) data;
552 data += sizeof(USHORT);
553 while ((data - value) - len < pfea->cbValue) {
554 if (type == EAT_ASCII) {
555 dlen = plen = 0;
556 while (dlen < len) {
557 if (data[dlen] == '\r') {
558 dlen++;
559 if (dlen < len && data[dlen] != '\n')
560 p[plen++] = '\n';
561 }
562 else
563 p[plen++] = data[dlen++];
564 }
565 if ((!len || !plen || p[plen - 1] != '\n') &&
566 (data - value) + len < pfea->cbValue)
567 p[plen++] = '\n';
568 p += plen;
569 *p = 0;
570 }
571 else
572 readonly = TRUE;
573 data += len;
574 if (data - value >= pfea->cbValue)
575 break;
576 type = *(USHORT *) data;
577 data += sizeof(USHORT);
578 len = *(USHORT *) data;
579 data += sizeof(USHORT);
580 } // while
581 if (p - buff >= 65536) {
582 Runtime_Error(pszSrcFile, __LINE__, pszBufOvfMsg);
583 buff[65535] = 0; // Try to stay alive
584 break;
585 }
586 WinSetWindowText(hwndAutoMLE, buff);
587 free(buff);
588 }
589 }
590 else
591 readonly = TRUE;
592 }
593 /* else EA not present */
594 MLEsetchanged(hwndAutoMLE, FALSE);
595 MLEsetreadonly(hwndAutoMLE, readonly);
596 }
597 else {
598 MLEsetchanged(hwndAutoMLE, FALSE);
599 MLEsetreadonly(hwndAutoMLE, FALSE);
600 }
601 free(pfealist);
602 }
603 }
604 }
605 }
606 free((CHAR *) mp1);
607 }
608 return 0;
609
610 case UM_CLOSE:
611 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
612 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
613 WinDestroyWindow(hwnd);
614 return 0;
615 }
616 return WinDefWindowProc(hwnd, msg, mp1, mp2);
617}
618
619static VOID MakeAutoWinThread(VOID * args)
620{
621 HAB hab2;
622 HMQ hmq2;
623 HWND hwndParent = (HWND) args;
624 QMSG qmsg2;
625
626 hab2 = WinInitialize(0);
627 if (hab2) {
628 hmq2 = WinCreateMsgQueue(hab2, 128);
629 if (hmq2) {
630 DosError(FERR_DISABLEHARDERR);
631 WinRegisterClass(hab2,
632 WC_OBJECTWINDOW,
633 AutoObjProc, 0, sizeof(PVOID));
634 hwndAutoObj = WinCreateWindow(HWND_OBJECT,
635 WC_OBJECTWINDOW,
636 (PSZ) NULL,
637 0,
638 0L,
639 0L,
640 0L,
641 0L, 0L, HWND_TOP, OBJ_FRAME, NULL, NULL);
642 if (!hwndAutoObj) {
643 Win_Error2(HWND_OBJECT, HWND_DESKTOP, pszSrcFile, __LINE__,
644 IDS_WINCREATEWINDOW);
645 if (!PostMsg(hwndParent, UM_CLOSE, MPVOID, MPVOID))
646 WinSendMsg(hwndParent, UM_CLOSE, MPVOID, MPVOID);
647 }
648 else {
649 WinSetWindowULong(hwndAutoObj, QWL_USER, hwndParent);
650 priority_normal();
651 while (WinGetMsg(hab2, &qmsg2, (HWND) 0, 0, 0))
652 WinDispatchMsg(hab2, &qmsg2);
653 WinDestroyWindow(hwndAutoObj);
654 hwndAutoObj = (HWND) 0;
655 }
656 WinDestroyMsgQueue(hmq2);
657 }
658 else
659 WinTerminate(hab2);
660 }
661}
662
663MRESULT EXPENTRY AutoViewProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
664{
665 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID);
666
667 switch (msg) {
668 case WM_CREATE:
669 {
670 MRESULT mr;
671
672 if (!hwndAutoObj) {
673 if (_beginthread(MakeAutoWinThread, NULL, 65536, (PVOID) hwnd) == -1) {
674 Runtime_Error(pszSrcFile, __LINE__,
675 GetPString(IDS_COULDNTSTARTTHREADTEXT));
676 PostMsg(hwnd, UM_CLOSE, MPVOID, MPVOID);
677 }
678 }
679 mr = PFNWPStatic(hwnd, msg, mp1, mp2);
680 SetPresParams(hwnd,
681 &RGBGREY,
682 &RGBBLACK, &RGBGREY, GetPString(IDS_4SYSTEMVIOTEXT));
683 stopflag = 0;
684 return mr;
685 }
686
687 case UM_SETUP:
688 MLEsetlimit(hwnd, 32768);
689 MLEsetformat(hwnd, MLFIE_NOTRANS);
690 MLEsetchanged(hwnd, FALSE);
691 return 0;
692
693 case WM_BUTTON1DOWN:
694 {
695 SWP swp;
696
697 WinQueryWindowPos(hwnd, &swp);
698 if (SHORT2FROMMP(mp1) > swp.cy - 4) {
699
700 HPS hps = WinGetPS(WinQueryWindow(hwnd, QW_PARENT));
701 SWP swpC;
702 TRACKINFO track;
703
704 if (hps) {
705 WinQueryWindowPos(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
706 FID_CLIENT), &swpC);
707 track.cxBorder = 4;
708 track.cyBorder = 4;
709 track.cxGrid = 1;
710 track.cyGrid = 8;
711 track.cxKeyboard = 8;
712 track.rclTrack.yBottom = swp.y;
713 track.rclTrack.yTop = swp.y + swp.cy;
714 track.rclTrack.xLeft = swp.x;
715 track.rclTrack.xRight = swp.x + swp.cx;
716 track.rclBoundary = track.rclTrack;
717 track.rclBoundary.yTop = (swpC.cy + swp.y + swp.cy) - 116;
718 track.ptlMinTrackSize.x = swp.x + swp.cx;
719 track.ptlMinTrackSize.y = 36;
720 track.ptlMaxTrackSize.x = swp.x + swp.cx;
721 track.ptlMaxTrackSize.y = (swpC.cy + swp.cy) - 116;
722 track.fs = TF_TOP;
723 if (WinTrackRect(hwnd, hps, &track)) {
724 AutoviewHeight = track.rclTrack.yTop - track.rclTrack.yBottom;
725 PrfWriteProfileData(fmprof,
726 FM3Str,
727 "AutoviewHeight",
728 &AutoviewHeight, sizeof(ULONG));
729 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
730 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
731 }
732 WinReleasePS(hps);
733 }
734 return (MRESULT) TRUE;
735 }
736 else if (id != MAIN_AUTOVIEWMLE)
737 return CommonTextButton(hwnd, msg, mp1, mp2);
738 }
739 break;
740
741 case WM_BUTTON3DOWN:
742 case WM_BUTTON1UP:
743 case WM_BUTTON3UP:
744 if (id != MAIN_AUTOVIEWMLE)
745 return CommonTextButton(hwnd, msg, mp1, mp2);
746 break;
747
748 case WM_MOUSEMOVE:
749 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
750 {
751 SWP swp;
752
753 WinQueryWindowPos(hwnd, &swp);
754 if (SHORT2FROMMP(mp1) > swp.cy - 4) {
755 WinSetPointer(HWND_DESKTOP, hptrNS);
756 return (MRESULT) TRUE;
757 }
758 }
759 break;
760
761 case WM_PAINT:
762 PostMsg(hwnd, UM_PAINT, MPVOID, MPVOID);
763 break;
764
765 case UM_PAINT:
766 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, TRUE);
767 return 0;
768
769 case WM_SETFOCUS:
770 switch (id) {
771 case MAIN_AUTOVIEWMLE:
772 if (!mp2 && !AutoMenu) {
773 if (*currfile) {
774 if (MLEgetchanged(hwnd)) {
775 CHAR *ea = xmalloc(32768, pszSrcFile, __LINE__);
776
777 if (ea) {
778 *ea = 0;
779 WinQueryWindowText(hwnd, 32767, ea);
780 PutComments(hwnd, currfile, ea);
781 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_RESCAN, 0), MPVOID);
782 free(ea);
783 }
784 }
785 }
786 }
787 break;
788 default:
789 if (mp2)
790 PostMsg(hwnd, UM_FOCUSME, mp1, mp2);
791 break;
792 }
793 break;
794
795 case UM_FOCUSME:
796 if (mp2) {
797
798 PID pid;
799 TID tid;
800
801 if (WinQueryWindowProcess((HWND) mp1, &pid, &tid) && pid == mypid)
802 WinSetFocus(HWND_DESKTOP, (HWND) mp1);
803 else
804 WinSetFocus(HWND_DESKTOP, hwndTree);
805 }
806 return 0;
807
808 case UM_CLICKED:
809 case UM_CLICKED3:
810 if (id != MAIN_AUTOVIEWMLE) {
811 PostMsg(hwnd,
812 WM_COMMAND,
813 MPFROM2SHORT(((msg == UM_CLICKED3) ?
814 IDM_EAS : IDM_VIEWORARC), 0), MPVOID);
815 }
816 return 0;
817
818 case WM_COMMAND:
819 PostMsg(hwnd, UM_COMMAND, mp1, mp2);
820 return 0;
821
822 case UM_COMMAND:
823 switch (SHORT1FROMMP(mp1)) {
824 case IDM_RESCAN:
825 if (*currfile) {
826
827 CHAR *cf = xstrdup(currfile, pszSrcFile, __LINE__);
828
829 if (cf) {
830 stopflag++;
831 if (!PostMsg(hwndAutoObj, UM_LOADFILE, MPFROMP(cf), MPVOID))
832 free(cf);
833 }
834 }
835 break;
836
837 case IDM_INFO:
838 DefaultView(hwnd, (HWND) 0, hwndMain, NULL, 16, currfile);
839 break;
840
841 case IDM_VIEW:
842 DefaultView(hwnd, (HWND) 0, hwndMain, NULL, 0, currfile);
843 break;
844
845 case IDM_EDIT:
846 DefaultView(hwnd, (HWND) 0, hwndMain, NULL, 8, currfile);
847 break;
848
849 case IDM_EAS:
850 {
851 char *list[2];
852
853 list[0] = currfile;
854 list[1] = NULL;
855
856 WinDlgBox(HWND_DESKTOP,
857 hwndMain,
858 DisplayEAsProc, FM3ModHandle, EA_FRAME, (PVOID) list);
859 }
860 break;
861
862 default:
863 PostMsg(hwndMain, msg, mp1, mp2);
864 }
865 return 0;
866
867 case WM_MENUEND:
868 if ((HWND) mp2 == AutoMenu) {
869 WinDestroyWindow(AutoMenu);
870 AutoMenu = (HWND) 0;
871 }
872 break;
873
874 case WM_CONTEXTMENU:
875 CheckMenu(&AutoMenu, (id == MAIN_AUTOVIEWMLE) ?
876 IDM_AUTOVIEWMLE : IDM_AUTOVIEW);
877 WinCheckMenuItem(AutoMenu, IDM_AUTOVIEWFILE, !fComments);
878 WinCheckMenuItem(AutoMenu, IDM_AUTOVIEWCOMMENTS, fComments);
879 WinEnableMenuItem(AutoMenu, IDM_VIEW, (IsFile(currfile) == 1));
880 WinEnableMenuItem(AutoMenu, IDM_EDIT, (IsFile(currfile) == 1));
881 WinEnableMenuItem(AutoMenu, IDM_INFO, (*currfile != 0));
882 PopupMenu(hwnd, hwnd, AutoMenu);
883 break;
884
885 case UM_LOADFILE:
886 stopflag++;
887 if (!PostMsg(hwndAutoObj, msg, mp1, mp2)) {
888 if (mp1)
889 free((CHAR *) mp1);
890 }
891 return 0;
892
893 case UM_CLOSE:
894 if (AutoMenu) {
895 WinDestroyWindow(AutoMenu);
896 AutoMenu = (HWND) 0;
897 }
898 WinDestroyWindow(hwnd);
899 return 0;
900
901 case WM_CLOSE:
902 WinSendMsg(hwnd, UM_CLOSE, MPVOID, MPVOID);
903 return 0;
904
905 case WM_DESTROY:
906 if (id != MAIN_AUTOVIEWMLE) {
907 if (hwndAutoObj)
908 if (!PostMsg(hwndAutoObj, WM_CLOSE, MPVOID, MPVOID))
909 WinSendMsg(hwndAutoObj, WM_CLOSE, MPVOID, MPVOID);
910 break;
911 }
912 break;
913 }
914
915 if (id == MAIN_AUTOVIEWMLE)
916 return PFNWPMLE(hwnd, msg, mp1, mp2);
917 return PFNWPStatic(hwnd, msg, mp1, mp2);
918}
Note: See TracBrowser for help on using the repository browser.