source: trunk/dll/autoview.c@ 41

Last change on this file since 41 was 41, checked in by root, 23 years ago

AutoObjProc: catch buff2 overflows
CreateHexDump: catch buffer overflow

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