source: trunk/dll/viewinf.c@ 377

Last change on this file since 377 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: 21.6 KB
RevLine 
[123]1
2/***********************************************************************
3
4 $Id: viewinf.c 377 2006-07-27 06:28:31Z root $
5
[328]6 Launch inf viewer
7
[123]8 Copyright (c) 1993-98 M. Kimes
[328]9 Copyright (c) 2004, 2006 Steven H.Levine
[123]10
[328]11 01 Aug 04 SHL Rework lstrip/rstrip usage
12 17 Jul 06 SHL Use Runtime_Error
[123]13
14***********************************************************************/
15
[2]16/* offset 107: title of INF file */
17
18#define INCL_DOS
19#define INCL_WIN
[328]20#include <os2.h>
[2]21
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25#include <ctype.h>
26#include <share.h>
[328]27
[2]28#include "fm3dll.h"
29#include "fm3dlg.h"
30#include "fm3str.h"
31
32#pragma data_seg(DATA1)
[328]33
34static PSZ pszSrcFile = __FILE__;
35
[2]36#pragma alloc_text(VIEWINFS,FillListbox,ViewInfProc)
37
38typedef struct {
39 USHORT size;
40 USHORT help;
41 HWND hwnd;
42} DUMMY;
43
44
[328]45static VOID FillListbox (VOID *args)
46{
[2]47 HWND hwnd;
48 DUMMY *dummy = (DUMMY *)args;
49 HAB hab2;
50 HMQ hmq2;
51 BOOL repeating = FALSE;
52
53 if(!dummy)
54 return;
55 hwnd = dummy->hwnd;
56 hab2 = WinInitialize(0);
57 if(hab2) {
58 hmq2 = WinCreateMsgQueue(hab2,0);
59 if(hmq2) {
60
61 CHAR *env,*p,*holdenv;
62
63 WinCancelShutdown(hmq2,TRUE);
64 priority_normal();
65 if(!dummy->help)
66 env = getenv("BOOKSHELF");
67 else
68 env = getenv("HELP");
69 if(!env) {
70 saymsg(MB_CANCEL,
71 hwnd,
72 GetPString(IDS_SYSERRORTEXT),
73 GetPString(IDS_ENVPATHERRORTEXT),
74 (dummy->help) ? "HELP" : "BOOKSHELF",
75 (dummy->help) ? ".HLP" : ".INF");
76 goto NoEnv;
77 }
78 else {
[328]79 holdenv = xmalloc(strlen(env) + 2L,pszSrcFile,__LINE__);
80 if (holdenv) {
[2]81 strcpy(holdenv,env);
82Repeat:
83 if(holdenv[strlen(holdenv) - 1] != ';')
84 strcat(holdenv,";");
85 p = strtok(holdenv,";");
86 while(p) {
[123]87 bstrip(p);
[2]88 if(*p) {
89
90 CHAR mask[CCHMAXPATH],*enddir,text[CCHMAXPATH * 2];
91 FILEFINDBUF3 ffb;
92 HDIR hdir;
93 ULONG nm;
94
95 strcpy(mask,p);
96 if(mask[strlen(mask) - 1] != '\\')
97 strcat(mask,"\\");
98 enddir = mask + strlen(mask);
99 if(dummy->help)
100 strcat(mask,"*.HLP");
101 else
102 strcat(mask,"*.INF");
103 hdir = HDIR_CREATE;
104 nm = 1L;
105 DosError(FERR_DISABLEHARDERR);
106 if(!DosFindFirst(mask,&hdir,FILE_NORMAL | FILE_ARCHIVED,
107 &ffb,sizeof(ffb),&nm,FIL_STANDARD)) {
108 do {
109 priority_normal();
110 strcpy(enddir,ffb.achName);
111 {
112 FILE *fp;
113 CHAR title[CCHMAXPATH];
114
115 *title = 0;
116 fp = _fsopen(mask,"rb",SH_DENYNO);
117 if(fp) {
118 fread(title,1,3,fp);
119 if(*title != 'H' || title[1] != 'S' || title[2] != 'P') {
120 fclose(fp);
121 goto Continue;
122 }
123 *title = 0;
124 fseek(fp,107L,SEEK_SET);
125 fread(title,1,CCHMAXPATH - 2,fp);
126 title[CCHMAXPATH - 3] = 0;
[123]127 bstrip(title);
[2]128 fclose(fp);
129 }
130 p = strchr(ffb.achName,'.');
131 if(p)
132 *p = 0;
133 sprintf(text,
134 "%-10.10s %-42.42s > %s",
135 ffb.achName,
136 title,
137 mask);
138 }
139 if(!WinIsWindow(hab2,hwnd))
140 break;
141 WinSendDlgItemMsg(hwnd,
142 VINF_LISTBOX,
143 LM_INSERTITEM,
144 MPFROM2SHORT(LIT_SORTASCENDING,0),
145 MPFROMP(text));
146Continue:
147 nm = 1L;
148 } while(!DosFindNext(hdir,&ffb,sizeof(ffb),&nm));
149 DosFindClose(hdir);
150 priority_normal();
151 }
152 }
153 if(!WinIsWindow(hab2,hwnd))
154 break;
155 p = strtok(NULL,";");
156 }
157 free(holdenv);
158NoEnv:
159 if(WinIsWindow(hab2,hwnd) && !repeating) {
160
161 ULONG size;
162 CHAR *key = "INFPaths";
163
164 if(dummy->help)
165 key = "HLPPaths";
166 repeating = TRUE;
167 if(PrfQueryProfileSize(fmprof,
168 FM3Str,
169 key,
170 &size) &&
171 size) {
[328]172 holdenv = xmalloc(size + 2L,pszSrcFile,__LINE__);
173 if (holdenv) {
174 if (!PrfQueryProfileData(fmprof,FM3Str,key,holdenv,&size)) {
175 Win_Error(hwnd,hwnd,pszSrcFile,__LINE__,"PrfQueryProfileData");
176 free(holdenv);
177 }
178 else
[2]179 goto Repeat;
180 }
181 }
182 }
183 }
184 }
185 WinDestroyMsgQueue(hmq2);
186 }
187 WinTerminate(hab2);
188 }
189 PostMsg(hwnd,UM_CONTAINER_FILLED,MPVOID,MPVOID);
190 free(dummy);
191}
192
193
[328]194MRESULT EXPENTRY ViewInfProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
195{
[2]196 static HWND hwndMe = (HWND)0;
197 static BOOL help = FALSE;
198 static BOOL threaddone = TRUE;
199 static LONG ypos = 0;
200 static HPOINTER hptrIcon = (HPOINTER)0;
201
202 switch(msg) {
203 case WM_INITDLG:
204 WinSendDlgItemMsg(hwnd,VINF_ENTRY,EM_SETTEXTLIMIT,
205 MPFROM2SHORT(1000,0),MPVOID);
206 WinSendDlgItemMsg(hwnd,VINF_TOPIC,EM_SETTEXTLIMIT,
207 MPFROM2SHORT(CCHMAXPATH * 2,0),MPVOID);
208 if(hwndMe) {
209 WinSetWindowPos(hwndMe,HWND_TOP,0,0,0,0,SWP_RESTORE | SWP_ZORDER |
210 SWP_ACTIVATE);
211 WinDismissDlg(hwnd,0);
212 break;
213 }
214 help = (mp2 != (MPARAM)0);
[328]215 if (help) {
[2]216
217 SWP swp;
218
219 WinQueryWindowPos(WinWindowFromID(hwnd,
220 VINF_LISTBOX),
221 &swp);
222 WinDestroyWindow(WinWindowFromID(hwnd,
223 VINF_LISTBOX));
[377]224 if (!WinCreateWindow(hwnd,
[2]225 WC_LISTBOX,
226 (PSZ)NULL,
227 WS_VISIBLE | LS_HORZSCROLL,
228 swp.x,
229 swp.y,
230 swp.cx,
231 swp.cy,
232 hwnd,
233 HWND_TOP,
234 VINF_LISTBOX,
235 NULL,
[377]236 NULL))
237 {
238 Win_Error2(hwnd,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
239 }
240 else {
241 WinSetPresParam(WinWindowFromID(hwnd,VINF_LISTBOX),
242 PP_FONTNAMESIZE,
243 strlen(GetPString(IDS_10SYSTEMMONOTEXT)) + 1,
244 (PVOID)GetPString(IDS_10SYSTEMMONOTEXT));
245 }
[2]246 WinSetWindowText(hwnd,
247 GetPString(IDS_VIEWHELPFILESTEXT));
[377]248 WinShowWindow(WinWindowFromID(hwnd,VINF_SRCH),
[2]249 FALSE);
[377]250 WinShowWindow(WinWindowFromID(hwnd,VINF_FILTER),
[2]251 FALSE);
[377]252 WinShowWindow(WinWindowFromID(hwnd,VINF_TOPIC),
[2]253 FALSE);
[377]254 WinShowWindow(WinWindowFromID(hwnd,VINF_TOPICHDR),
[2]255 FALSE);
256 }
[377]257 hptrIcon = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,VINF_FRAME);
258 WinDefDlgProc(hwnd,WM_SETICON,MPFROMLONG(hptrIcon),MPVOID);
[2]259 hwndMe = hwnd;
[377]260 PostMsg(hwnd,UM_STRETCH,MPVOID,MPVOID);
261 PostMsg(hwnd,UM_RESCAN,MPVOID,MPVOID);
[2]262 break;
263
264 case UM_RESCAN:
265 WinSendDlgItemMsg(hwnd,
266 VINF_LISTBOX,
267 LM_DELETEALL,
268 MPVOID,
269 MPVOID);
270 {
271 DUMMY *d;
272
[328]273 d = xmallocz(sizeof(DUMMY),pszSrcFile,__LINE__);
274 if (!d) {
275 WinDismissDlg(hwnd,0);
276 return 0;
277 }
278 else {
[2]279 d->size = sizeof(DUMMY);
280 d->hwnd = hwnd;
[328]281 if (help)
[2]282 d->help = 1;
283 if(_beginthread(FillListbox,NULL,65536,(PVOID)d) == -1) {
[328]284 Runtime_Error(pszSrcFile, __LINE__, GetPString(IDS_COULDNTSTARTTHREADTEXT));
[2]285 free(d);
286 WinDismissDlg(hwnd,0);
287 return 0;
288 }
289 WinEnableWindow(WinWindowFromID(hwnd,DID_CANCEL),FALSE);
290 threaddone = FALSE;
291 }
292 }
293 return 0;
294
295 case UM_CONTAINER_FILLED:
296 if(!(SHORT)WinSendDlgItemMsg(hwnd,
297 VINF_LISTBOX,
298 LM_QUERYITEMCOUNT,
299 MPVOID,
300 MPVOID)) {
301 saymsg(MB_CANCEL,
302 hwnd,
303 GetPString(IDS_ERRORTEXT),
304 GetPString(IDS_NOFILESFOUNDTEXT));
305 hwndMe = (HWND)0;
306 WinDismissDlg(hwnd,0);
307 }
308 WinEnableWindow(WinWindowFromID(hwnd,DID_CANCEL),TRUE);
309 threaddone = TRUE;
310 return 0;
311
312 case WM_CONTROL:
313 switch(SHORT1FROMMP(mp1)) {
314 case VINF_LISTBOX:
315 switch(SHORT2FROMMP(mp1)) {
316 case LN_ENTER:
317 PostMsg(hwnd,
318 WM_COMMAND,
319 MPFROM2SHORT(DID_OK,0),
320 MPVOID);
321 break;
322 }
323 break;
324 case VINF_ENTRY:
325 switch(SHORT2FROMMP(mp1)) {
326 case EN_CHANGE:
327 {
328 SHORT sSelect;
329 CHAR szBuffer[CCHMAXPATH];
330
331 WinQueryDlgItemText(hwnd,
332 VINF_ENTRY,
333 CCHMAXPATH,
334 szBuffer);
[123]335 bstrip(szBuffer);
[2]336 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
337 VINF_LISTBOX,
338 LM_SEARCHSTRING,
339 MPFROM2SHORT(LSS_SUBSTRING,
340 LIT_FIRST),
341 MPFROMP(szBuffer));
342 if(sSelect >= 0)
343 WinSendDlgItemMsg(hwnd,
344 VINF_LISTBOX,
345 LM_SETTOPINDEX,
346 MPFROM2SHORT(sSelect,0),
347 MPVOID);
348 }
349 break;
350 }
351 break;
352 }
353 return 0;
354
355 case WM_ADJUSTWINDOWPOS:
356 PostMsg(hwnd,UM_STRETCH,MPVOID,MPVOID);
357 break;
358
359 case UM_STRETCH:
360 {
361 SWP swpC,swp;
362
363 WinQueryWindowPos(hwnd,&swp);
364 if(!(swp.fl & (SWP_HIDE | SWP_MINIMIZE))) {
365 WinQueryWindowPos(WinWindowFromID(hwnd,VINF_LISTBOX),&swpC);
366 if(!ypos)
367 ypos = swpC.y;
368 WinSetWindowPos(WinWindowFromID(hwnd,VINF_LISTBOX),HWND_TOP,
369 SysVal(SV_CXSIZEBORDER),
370 ypos,
371 swp.cx - (SysVal(SV_CXSIZEBORDER) * 2),
372 (swp.cy - ypos) - (SysVal(SV_CYTITLEBAR) +
373 SysVal(SV_CYSIZEBORDER)),
374 SWP_MOVE | SWP_SIZE);
375 }
376 }
377 return 0;
378
379 case WM_COMMAND:
380 switch(SHORT1FROMMP(mp1)) {
381 case VINF_RESCAN:
382 PostMsg(hwnd,UM_RESCAN,MPVOID,MPVOID);
383 break;
384
385 case VINF_SRCH:
386 {
387 SHORT sSelect,sLast = LIT_FIRST;
388 CHAR szBuffer[CCHMAXPATH];
389
390 *szBuffer = 0;
391 WinQueryDlgItemText(hwnd,
392 VINF_ENTRY,
393 CCHMAXPATH,
394 szBuffer);
395 rstrip(szBuffer);
396 if(!*szBuffer) {
397 sLast = (SHORT)WinSendDlgItemMsg(hwnd,
398 VINF_LISTBOX,
399 LM_QUERYITEMCOUNT,
400 MPVOID,
401 MPVOID);
402 for(sSelect = 0;sSelect < sLast;sSelect++)
403 WinSendDlgItemMsg(hwnd,
404 VINF_LISTBOX,
405 LM_SELECTITEM,
406 MPFROM2SHORT(sSelect,0),
407 MPFROM2SHORT(FALSE,0));
408 break;
409 }
410 for(;;) {
411 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,VINF_LISTBOX,
412 LM_SEARCHSTRING,
413 MPFROM2SHORT(LSS_SUBSTRING,
414 sLast),
415 MPFROMP(szBuffer));
416 if(sSelect <= sLast)
417 break;
418 if(sSelect >= 0)
419 WinSendDlgItemMsg(hwnd,
420 VINF_LISTBOX,
421 LM_SELECTITEM,
422 MPFROM2SHORT(sSelect,0),
423 MPFROM2SHORT(TRUE,0));
424 else
425 break;
426 sLast = sSelect;
427 }
428 }
429 break;
430
431 case VINF_FILTER:
432 {
433 SHORT sSelect,sTotal;
434
435 sTotal = (SHORT)WinSendDlgItemMsg(hwnd,
436 VINF_LISTBOX,
437 LM_QUERYITEMCOUNT,
438 MPVOID,
439 MPVOID);
440 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
441 VINF_LISTBOX,
442 LM_QUERYSELECTION,
443 MPFROM2SHORT(LIT_FIRST,0),
444 MPVOID);
445 if(sSelect == LIT_NONE) {
446 DosBeep(50,100);
447 break;
448 }
449#ifdef BUGFIXED
450 sSelect = 0;
451 while(sSelect < sTotal) {
452 if(!WinSendDlgItemMsg(hwnd,
453 VINF_LISTBOX,
454 LM_SELECTITEM,
455 MPFROM2SHORT(sSelect,0),
456 MPFROM2SHORT(FALSE,0))) {
457 WinSendDlgItemMsg(hwnd,
458 VINF_LISTBOX,
459 LM_DELETEITEM,
460 MPFROM2SHORT(sSelect,0),
461 MPVOID);
462 sTotal--;
463 }
464 else
465 sSelect++;
466 }
[328]467#else // !BUGIFIXED
[2]468 for(sSelect = 0;sSelect < sTotal;sSelect++)
469 WinSendDlgItemMsg(hwnd,
470 VINF_LISTBOX,
471 LM_SETITEMHANDLE,
472 MPFROM2SHORT(sSelect,0),
473 MPVOID);
474 sSelect = LIT_FIRST;
475 for(;;) {
476 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
477 VINF_LISTBOX,
478 LM_QUERYSELECTION,
479 MPFROM2SHORT(sSelect,0),
480 MPVOID);
481 if(sSelect >= 0)
482 WinSendDlgItemMsg(hwnd,
483 VINF_LISTBOX,
484 LM_SETITEMHANDLE,
485 MPFROM2SHORT(sSelect,0),
486 MPFROMLONG(1L));
487 else
488 break;
489 }
490 for(sSelect = 0;sSelect < sTotal;sSelect++)
491 WinSendDlgItemMsg(hwnd,
492 VINF_LISTBOX,
493 LM_SELECTITEM,
494 MPFROM2SHORT(sSelect,0),
495 MPFROM2SHORT(FALSE,0));
496 sSelect = 0;
497 while(sSelect < sTotal) {
498 if(!WinSendDlgItemMsg(hwnd,
499 VINF_LISTBOX,
500 LM_QUERYITEMHANDLE,
501 MPFROM2SHORT(sSelect,0),
502 MPVOID)) {
503 WinSendDlgItemMsg(hwnd,
504 VINF_LISTBOX,
505 LM_DELETEITEM,
506 MPFROM2SHORT(sSelect,0),
507 MPVOID);
508 sTotal--;
509 }
510 else
511 sSelect++;
512 }
[328]513#endif // BUGFIXED
[2]514 }
515 break;
516
517 case VINF_DIRS:
518 {
519 CHAR szBuffer[1001],*key = "INFPaths";
520
[328]521 if (help)
[2]522 key = "HLPPaths";
523 *szBuffer = 0;
524 WinQueryDlgItemText(hwnd,
525 VINF_ENTRY,
526 1000,
527 szBuffer);
[123]528 bstrip(szBuffer);
[2]529 PrfWriteProfileData(fmprof,
530 FM3Str,
531 key,
532 (*szBuffer) ? szBuffer : NULL,
533 strlen(szBuffer));
534 PostMsg(hwnd,
535 UM_RESCAN,
536 MPVOID,
537 MPVOID);
538 }
539 break;
540
541 case DID_CANCEL:
542 hwndMe = (HWND)0;
543 WinDismissDlg(hwnd,0);
544 break;
545
546 case DID_OK:
547 {
548 SHORT sSelect;
549 CHAR text[CCHMAXPATH * 2],filename[CCHMAXPATH],*p;
550 FILE *fp;
551 BOOL notfirst = FALSE;
552
553 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
554 VINF_LISTBOX,
555 LM_QUERYSELECTION,
556 MPFROM2SHORT(LIT_FIRST,0),
557 MPVOID);
[328]558 if (sSelect < 0) {
559 DosBeep(50,100);
560 }
561 else {
562 if (help) {
[2]563 *text = 0;
564 WinSendDlgItemMsg(hwnd,
565 VINF_LISTBOX,
566 LM_QUERYITEMTEXT,
567 MPFROM2SHORT(sSelect,CCHMAXPATH),
568 MPFROMP(text));
569 p = strchr(text,'>');
[328]570 if(!p) {
571 DosBeep(50,100);
[2]572 break;
[328]573 }
[2]574 p++;
[123]575 bstrip(p);
[328]576 if (!*p)
577 DosBeep(50,100);
578 else
[2]579 ViewHelp(p);
580 break;
581 }
582 save_dir2(filename);
583 if(filename[strlen(filename) - 1] != '\\')
584 strcat(filename,"\\");
585 strcat(filename,"FM2VINF.CMD");
[328]586 fp = xfopen(filename,"w",pszSrcFile,__LINE__);
587 if (fp) {
[2]588 fprintf(fp,"@ECHO OFF\nSET FM2REF=");
589 while(sSelect >= 0) {
590 *text = 0;
591 WinSendDlgItemMsg(hwnd,
592 VINF_LISTBOX,
593 LM_QUERYITEMTEXT,
594 MPFROM2SHORT(sSelect,
595 CCHMAXPATH),
596 MPFROMP(text));
597 p = strchr(text,'>');
598 if(p) {
599 p++;
[123]600 bstrip(p);
[2]601 if(*p) {
602 if(notfirst)
603 fprintf(fp,"+");
604 notfirst = TRUE;
605 fprintf(fp,"%s",p);
606 }
607 }
608 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
609 VINF_LISTBOX,
610 LM_QUERYSELECTION,
611 MPFROM2SHORT(sSelect,0),
612 MPVOID);
[328]613 } // while
[2]614 *text = 0;
615 WinQueryDlgItemText(hwnd,
616 VINF_TOPIC,
617 CCHMAXPATH * 2,
618 text);
[123]619 bstrip(text);
[2]620 fprintf(fp,
621 "\nVIEW FM2REF%s%s\nDEL %s\n",
622 (*text) ? " " : NullStr,
623 text,
624 filename);
625 fclose(fp);
626 runemf2(SEPARATE | WINDOWED | MINIMIZED |
627 BACKGROUND | INVISIBLE,
628 hwnd,
629 NULL,
630 NULL,
631 "%s /C %s",
632 GetCmdSpec(FALSE),
633 filename);
634 }
635 }
636 }
637 break;
638
639 case IDM_HELP:
640 if(hwndHelp) {
641 if(help)
642 WinSendMsg(hwndHelp,
643 HM_DISPLAY_HELP,
644 MPFROM2SHORT(HELP_VIEWHELPS,0),
645 MPFROMSHORT(HM_RESOURCEID));
646 else
647 WinSendMsg(hwndHelp,
648 HM_DISPLAY_HELP,
649 MPFROM2SHORT(HELP_VIEWINF,0),
650 MPFROMSHORT(HM_RESOURCEID));
651 }
652 break;
653 }
654 return 0;
655
656 case WM_CLOSE:
657 if(!threaddone)
658 return 0;
659 break;
660
661 case WM_DESTROY:
662 if(hwndMe == hwnd) {
663 hwndMe = (HWND)0;
664 if(hptrIcon)
665 WinDestroyPointer(hptrIcon);
666 hptrIcon = (HPOINTER)0;
667 }
668 break;
669 }
670 return WinDefDlgProc(hwnd,msg,mp1,mp2);
671}
Note: See TracBrowser for help on using the repository browser.