source: trunk/dll/autoview.c@ 433

Last change on this file since 433 was 377, checked in by root, 19 years ago

Validate WinCreateWindow

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