source: trunk/dll/autoview.c@ 439

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

Use Runtime_Error more

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