source: trunk/dll/autoview.c@ 897

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

Use CommaFmtULL for additional file, EA etc sizes display; Modify/Create TestFDates & TestCDates for comparing/sorting files or CNRITEMS by date/time.

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