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
RevLine 
[41]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
[291]9 Copyright (c) 2001, 2006 Steven H.Levine
[41]10
[130]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
[291]15 29 May 06 SHL Sync with archiver.bb2 mods
[341]16 22 Jul 06 SHL Check more run time errors
[439]17 15 Aug 06 SHL Use Runtime_Error more
[531]18 03 Nov 06 SHL Renames
[689]19 30 Mar 07 GKY Remove GetPString for window class names
[793]20 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
[827]21 01 Sep 07 GKY Use xDosSetPathInfo to fix case where FS3 buffer crosses 64k boundry
[846]22 27 Sep 07 SHL Correct ULONGLONG size formatting
[872]23 22 Nov 07 GKY Use CopyPresParams to fix presparam inconsistencies in menus
[897]24 30 Dec 07 GKY Use CommaFmtULL
[41]25
26***********************************************************************/
27
[2]28#define INCL_DOS
29#define INCL_WIN
30#define INCL_GPI
[841]31#define INCL_LONGLONG
[341]32#include <os2.h>
[2]33
34#include <stdlib.h>
35#include <stdio.h>
36#include <string.h>
37#include <ctype.h>
[689]38#include <process.h> // _beginthread
[341]39
[2]40#include "fm3dll.h"
41#include "fm3dlg.h"
42#include "fm3str.h"
43#include "mle.h"
44
45#pragma data_seg(DATA1)
[341]46
47static PSZ pszSrcFile = __FILE__;
48
49static HWND hwndAutoObj;
[2]50static CHAR stopflag;
51static CHAR currfile[CCHMAXPATH];
52
[551]53BOOL WriteEA(HWND hwnd, CHAR * filename, CHAR * eaname, USHORT type,
54 CHAR * data)
[341]55{
[2]56 /* save an ea to disk */
57
58 FEA2LIST *pfealist = NULL;
[551]59 EAOP2 eaop;
60 APIRET rc;
61 ULONG ealen;
62 USHORT len, *num, *plen, usCodepage;
63 CHAR *p, *eaval;
64 BOOL ret = FALSE;
[2]65
[551]66 if (!filename || !eaname)
[2]67 return ret;
[551]68 usCodepage = (USHORT) WinQueryCp(WinQueryWindowULong(hwnd, QWL_HMQ));
[2]69 len = (data) ? strlen(data) : 0;
[551]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) {
[2]112 case EAT_EA:
113 case EAT_ASCII:
[551]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 }
[2]122 break;
123 case EAT_MVST:
[551]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 }
[2]155 }
156 break;
157 case EAT_MVMT:
[551]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 }
[2]191 }
192 break;
193 }
[551]194 pfealist->list[0].cbValue = (ULONG) (eaval -
195 (pfealist->list[0].szName +
196 pfealist->list[0].cbName + 1));
197 memset(&eaop, 0, sizeof(eaop));
[2]198 eaop.fpFEA2List = pfealist;
[841]199 pfealist->cbList = 13 + (ULONG) pfealist->list[0].cbName +
[551]200 (ULONG) pfealist->list[0].cbValue;
[827]201 rc = xDosSetPathInfo(filename, FIL_QUERYEASIZE,
202 &eaop, sizeof(eaop), DSPI_WRTTHRU);
[2]203 DosFreeMem(pfealist);
[551]204 if (!rc)
[2]205 ret = TRUE;
206 }
207 return ret;
208}
209
[551]210BOOL PutComments(HWND hwnd, CHAR * filename, CHAR * comments)
[341]211{
[2]212 register CHAR *p;
213
[551]214 if (comments) { /* check -- is it empty? */
[2]215 p = comments;
[551]216 while (*p && isspace(*p))
[2]217 p++;
[551]218 if (!*p)
[2]219 comments = NULL;
220 }
[551]221 return WriteEA(hwnd, filename, ".COMMENTS", EAT_MVMT, comments);
[2]222}
223
[439]224static PSZ pszBufOvfMsg = "Buffer overflow";
[2]225
[551]226ULONG CreateHexDump(CHAR * pchInBuf, ULONG cbInBuf,
227 CHAR * pchOutBuf, ULONG cbOutBuf,
228 ULONG cOffset, BOOL fLongAddr)
[41]229{
[551]230 register CHAR *pchIn, *pchReset, *pchOut;
231 register ULONG ibIn = 0, ibIn2, ibInFill;
[41]232 ULONG cbOutLine = 6 + (fLongAddr ? 4 : 0) + 16 * 3 + 1 + 16 + 1;
[2]233
[551]234 if (pchInBuf && cbInBuf && pchOutBuf && cbOutBuf) {
[41]235 pchIn = pchInBuf;
236 pchOut = pchOutBuf;
[551]237 if (cOffset)
[41]238 *pchOut++ = '\n';
239 while (ibIn < cbInBuf) {
240 if (pchOut - pchOutBuf + cbOutLine >= cbOutBuf) {
[551]241 Runtime_Error(pszSrcFile, __LINE__, pszBufOvfMsg);
[41]242 break;
243 }
244 pchReset = pchIn;
245 ibIn2 = ibIn;
[551]246 if (fLongAddr)
247 sprintf(pchOut, "%08lx ", ibIn + cOffset);
[2]248 else
[551]249 sprintf(pchOut, "%04lx ", ibIn + cOffset);
[41]250 pchOut += 6 + (fLongAddr ? 4 : 0);
[2]251 do {
[870]252 sprintf(pchOut, "%02x ", (UCHAR)*pchIn);
[551]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 }
[2]265 }
[41]266 *pchOut++ = ' ';
267 pchIn = pchReset;
[2]268 do {
[551]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
[41]281 *pchOut = 0;
[551]282 return (ULONG) (pchOut - pchOutBuf);
[2]283 }
284 return 0L;
285}
286
[551]287MRESULT EXPENTRY AutoObjProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[51]288{
[551]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) {
[2]303
[551]304 HFILE handle;
[858]305 ULONG olen, ibufflen, action, obufflen, l;
[850]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];
[551]310 ARC_TYPE *info;
[2]311
[844]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)) {
[850]321 ibufflen = AutoviewHeight < 96 ? 512 : 3072;
322 // 06 Oct 07 SHL protect against NTFS driver small buffer defect
[858]323 // ibuff = xmalloc(ibufflen + 2, pszSrcFile, __LINE__); // 05 Nov 07 SHL
324 ibuff = xmalloc(max(ibufflen + 2, 4096), pszSrcFile, __LINE__);
[551]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;
[850]331 if (!DosRead(handle, ibuff, ibufflen, &ibufflen) &&
332 ibufflen)
333 {
[551]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",
[773]362 info->id ? info->id : "",
363 info->id ? " " : "",
[551]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;
[2]378
[551]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)) {
[2]421
[841]422 static FILEFINDBUF4L ffb[130];
[897]423 CHAR fullname[CCHMAXPATH + 4], szCmmaFmtFileSize[81];
[551]424 HDIR hdir = HDIR_CREATE;
425 ULONG x, nm, ml, mc, bufflen;
426 PBYTE fb;
[841]427 PFILEFINDBUF4L pffbFile;
[773]428 PSZ pszBuf;
429 PSZ p;
430 APIRET rc;
[2]431
[773]432 BldFullPathName(fullname, currfile, "*");
[763]433 //sprintf(fullname,
434 // "%s%s*",
435 // currfile,
436 // (currfile[strlen(currfile) - 1] == '\\') ? "" : "\\");
[551]437 DosError(FERR_DISABLEHARDERR);
[841]438 nm = sizeof(ffb) / sizeof(FILEFINDBUF4L);
[551]439 if (AutoviewHeight < 96)
440 nm /= 2;
[838]441 rc = xDosFindFirst(fullname,
[858]442 &hdir,
443 FILE_NORMAL | FILE_DIRECTORY |
444 FILE_READONLY | FILE_ARCHIVED |
445 FILE_SYSTEM | FILE_HIDDEN,
446 &ffb, sizeof(ffb), &nm, FIL_QUERYEASIZEL);
[551]447 if (!rc && nm) {
448 fb = (PBYTE) & ffb;
449 x = ml = 0;
450 while (x < nm) {
[841]451 pffbFile = (PFILEFINDBUF4L) fb;
[551]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;
[773]461 pszBuf = xmalloc(bufflen, pszSrcFile, __LINE__);
462 if (pszBuf) {
463 p = pszBuf;
[551]464 *p = 0;
465 fb = (PBYTE) & ffb;
466 x = 0;
467 while (x < nm) {
[841]468 pffbFile = (PFILEFINDBUF4L) fb;
[551]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]))))) {
[897]475 CommaFmtULL(szCmmaFmtFileSize,
476 sizeof(szCmmaFmtFileSize),
477 pffbFile->cbFile + CBLIST_TO_EASIZE(pffbFile->cbList),
478 ' ');
[551]479 sprintf(p,
[897]480 "%s%-*.*s %-8s [%s%s%s%s] %04lu/%02lu/%02lu "
[846]481 "%02lu:%02lu:%02lu\r",
482 pffbFile->attrFile & FILE_DIRECTORY ? "\\" : " ",
[551]483 ml,
484 ml,
[897]485 pffbFile->achName,
486 szCmmaFmtFileSize,
[846]487 pffbFile->attrFile & FILE_READONLY ? "R" : "-",
488 pffbFile->attrFile & FILE_ARCHIVED ? "A" : "-",
489 pffbFile->attrFile & FILE_HIDDEN ? "H" : "-",
490 pffbFile->attrFile & FILE_SYSTEM ? "S" : "-",
[551]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
[773]504 if (p - pszBuf >= bufflen)
[551]505 Runtime_Error(pszSrcFile, __LINE__, pszBufOvfMsg);
[773]506 if (*pszBuf)
507 WinSetWindowText(hwndAutoview, pszBuf);
508 free(pszBuf);
[551]509 }
510 }
511 if (!rc)
512 DosFindClose(hdir);
513 }
514 }
515 else {
[2]516
[551]517 APIRET rc;
518 EAOP2 eaop;
519 PGEA2LIST pgealist;
520 PFEA2LIST pfealist;
521 PGEA2 pgea;
522 PFEA2 pfea;
[773]523 CHAR *value, *pszBuf, *p, *data;
[551]524 USHORT len, type, plen, dlen;
525 BOOL readonly = FALSE;
[2]526
[551]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) {
[773]549 pszBuf = xmalloc(65536, pszSrcFile, __LINE__);
550 if (pszBuf) {
551 p = pszBuf;
552 *pszBuf = 0;
[551]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)
[41]580 break;
[551]581 type = *(USHORT *) data;
582 data += sizeof(USHORT);
583 len = *(USHORT *) data;
584 data += sizeof(USHORT);
585 } // while
[773]586 if (p - pszBuf >= 65536) {
[551]587 Runtime_Error(pszSrcFile, __LINE__, pszBufOvfMsg);
[773]588 pszBuf[65535] = 0; // Try to stay alive
[551]589 break;
590 }
[773]591 WinSetWindowText(hwndAutoMLE, pszBuf);
592 free(pszBuf);
[551]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 }
[2]610 }
[551]611 free((CHAR *) mp1);
612 }
613 return 0;
[2]614
[551]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;
[2]620 }
[551]621 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]622}
623
[551]624static VOID MakeAutoWinThread(VOID * args)
[341]625{
[551]626 HAB hab2;
627 HMQ hmq2;
628 HWND hwndParent = (HWND) args;
629 QMSG qmsg2;
[2]630
631 hab2 = WinInitialize(0);
[551]632 if (hab2) {
633 hmq2 = WinCreateMsgQueue(hab2, 128);
634 if (hmq2) {
[2]635 DosError(FERR_DISABLEHARDERR);
636 WinRegisterClass(hab2,
[593]637 WC_OBJECTWINDOW,
[551]638 AutoObjProc, 0, sizeof(PVOID));
[2]639 hwndAutoObj = WinCreateWindow(HWND_OBJECT,
[593]640 WC_OBJECTWINDOW,
[551]641 (PSZ) NULL,
642 0,
643 0L,
644 0L,
645 0L,
646 0L, 0L, HWND_TOP, OBJ_FRAME, NULL, NULL);
[377]647 if (!hwndAutoObj) {
[551]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);
[377]652 }
653 else {
[551]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;
[2]660 }
661 WinDestroyMsgQueue(hmq2);
662 }
663 else
664 WinTerminate(hab2);
665 }
666}
667
[551]668MRESULT EXPENTRY AutoViewProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[341]669{
[551]670 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID);
[2]671
[551]672 switch (msg) {
673 case WM_CREATE:
674 {
675 MRESULT mr;
[2]676
[551]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);
[341]682 }
[2]683 }
[551]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 }
[2]691
[551]692 case UM_SETUP:
693 MLEsetlimit(hwnd, 32768);
694 MLEsetformat(hwnd, MLFIE_NOTRANS);
695 MLEsetchanged(hwnd, FALSE);
696 return 0;
[2]697
[551]698 case WM_BUTTON1DOWN:
699 {
700 SWP swp;
[2]701
[551]702 WinQueryWindowPos(hwnd, &swp);
703 if (SHORT2FROMMP(mp1) > swp.cy - 4) {
[2]704
[551]705 HPS hps = WinGetPS(WinQueryWindow(hwnd, QW_PARENT));
706 SWP swpC;
707 TRACKINFO track;
[2]708
[551]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;
[2]740 }
[551]741 else if (id != MAIN_AUTOVIEWMLE)
742 return CommonTextButton(hwnd, msg, mp1, mp2);
743 }
744 break;
[2]745
[551]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;
[2]752
[551]753 case WM_MOUSEMOVE:
754 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
755 {
756 SWP swp;
[2]757
[551]758 WinQueryWindowPos(hwnd, &swp);
759 if (SHORT2FROMMP(mp1) > swp.cy - 4) {
760 WinSetPointer(HWND_DESKTOP, hptrNS);
761 return (MRESULT) TRUE;
[2]762 }
[551]763 }
764 break;
[2]765
[551]766 case WM_PAINT:
767 PostMsg(hwnd, UM_PAINT, MPVOID, MPVOID);
768 break;
[2]769
[551]770 case UM_PAINT:
771 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, TRUE);
772 return 0;
[2]773
[551]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 }
[2]791 }
792 break;
[551]793 default:
794 if (mp2)
795 PostMsg(hwnd, UM_FOCUSME, mp1, mp2);
796 break;
797 }
798 break;
[2]799
[551]800 case UM_FOCUSME:
801 if (mp2) {
[2]802
[551]803 PID pid;
804 TID tid;
[2]805
[551]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;
[2]812
[551]813 case UM_CLICKED:
814 case UM_CLICKED3:
815 if (id != MAIN_AUTOVIEWMLE) {
[2]816 PostMsg(hwnd,
[551]817 WM_COMMAND,
818 MPFROM2SHORT(((msg == UM_CLICKED3) ?
819 IDM_EAS : IDM_VIEWORARC), 0), MPVOID);
820 }
821 return 0;
[2]822
[551]823 case WM_COMMAND:
824 PostMsg(hwnd, UM_COMMAND, mp1, mp2);
825 return 0;
[2]826
[551]827 case UM_COMMAND:
828 switch (SHORT1FROMMP(mp1)) {
829 case IDM_RESCAN:
830 if (*currfile) {
[2]831
[551]832 CHAR *cf = xstrdup(currfile, pszSrcFile, __LINE__);
[2]833
[551]834 if (cf) {
835 stopflag++;
836 if (!PostMsg(hwndAutoObj, UM_LOADFILE, MPFROMP(cf), MPVOID))
837 free(cf);
838 }
839 }
840 break;
[2]841
[551]842 case IDM_INFO:
843 DefaultView(hwnd, (HWND) 0, hwndMain, NULL, 16, currfile);
844 break;
[2]845
[551]846 case IDM_VIEW:
847 DefaultView(hwnd, (HWND) 0, hwndMain, NULL, 0, currfile);
848 break;
[2]849
[551]850 case IDM_EDIT:
851 DefaultView(hwnd, (HWND) 0, hwndMain, NULL, 8, currfile);
852 break;
[2]853
[551]854 case IDM_EAS:
855 {
856 char *list[2];
[2]857
[551]858 list[0] = currfile;
859 list[1] = NULL;
[2]860
[551]861 WinDlgBox(HWND_DESKTOP,
862 hwndMain,
863 DisplayEAsProc, FM3ModHandle, EA_FRAME, (PVOID) list);
[2]864 }
865 break;
866
[551]867 default:
868 PostMsg(hwndMain, msg, mp1, mp2);
869 }
870 return 0;
[2]871
[551]872 case WM_MENUEND:
873 if ((HWND) mp2 == AutoMenu) {
874 WinDestroyWindow(AutoMenu);
875 AutoMenu = (HWND) 0;
876 }
877 break;
[2]878
[551]879 case WM_CONTEXTMENU:
[872]880 CheckMenu(hwnd, &AutoMenu, (id == MAIN_AUTOVIEWMLE) ?
[551]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;
[2]889
[551]890 case UM_LOADFILE:
891 stopflag++;
892 if (!PostMsg(hwndAutoObj, msg, mp1, mp2)) {
893 if (mp1)
894 free((CHAR *) mp1);
895 }
896 return 0;
[2]897
[551]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);
[2]915 break;
[551]916 }
917 break;
[2]918 }
919
[551]920 if (id == MAIN_AUTOVIEWMLE)
921 return PFNWPMLE(hwnd, msg, mp1, mp2);
922 return PFNWPStatic(hwnd, msg, mp1, mp2);
[2]923}
[793]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.