source: trunk/dll/autoview.c@ 1346

Last change on this file since 1346 was 1346, checked in by Gregg Young, 17 years ago

Code cleanup; removal of dead 07 code copywrite updates etc

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