source: trunk/dll/viewinf.c@ 533

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

Renames
Count thread usage

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