source: trunk/dll/autoview.c@ 1391

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

Move nontranslated strings to init.c and codepage.c; use those strings in place of GetPString calls. Move other strings to a StringTable; minor cleanup and code changes to codepage.c to use a string array instead of GetPString calls. Ticket 340

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