source: trunk/dll/viewinf.c@ 328

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

Use Runtime_Error

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 21.9 KB
Line 
1
2/***********************************************************************
3
4 $Id: viewinf.c 328 2006-07-25 18:37:24Z 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
14***********************************************************************/
15
16/* offset 107: title of INF file */
17
18#define INCL_DOS
19#define INCL_WIN
20#include <os2.h>
21
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25#include <ctype.h>
26#include <share.h>
27
28#include "fm3dll.h"
29#include "fm3dlg.h"
30#include "fm3str.h"
31
32#pragma data_seg(DATA1)
33
34static PSZ pszSrcFile = __FILE__;
35
36#pragma alloc_text(VIEWINFS,FillListbox,ViewInfProc)
37
38typedef struct {
39 USHORT size;
40 USHORT help;
41 HWND hwnd;
42} DUMMY;
43
44
45static VOID FillListbox (VOID *args)
46{
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 {
79 holdenv = xmalloc(strlen(env) + 2L,pszSrcFile,__LINE__);
80 if (holdenv) {
81 strcpy(holdenv,env);
82Repeat:
83 if(holdenv[strlen(holdenv) - 1] != ';')
84 strcat(holdenv,";");
85 p = strtok(holdenv,";");
86 while(p) {
87 bstrip(p);
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;
127 bstrip(title);
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) {
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
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
194MRESULT EXPENTRY ViewInfProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
195{
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);
215 if (help) {
216
217 SWP swp;
218
219 WinQueryWindowPos(WinWindowFromID(hwnd,
220 VINF_LISTBOX),
221 &swp);
222 WinDestroyWindow(WinWindowFromID(hwnd,
223 VINF_LISTBOX));
224 WinCreateWindow(hwnd,
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,
236 NULL);
237 WinSetPresParam(WinWindowFromID(hwnd,
238 VINF_LISTBOX),
239 PP_FONTNAMESIZE,
240 strlen(GetPString(IDS_10SYSTEMMONOTEXT)) + 1,
241 (PVOID)GetPString(IDS_10SYSTEMMONOTEXT));
242 WinSetWindowText(hwnd,
243 GetPString(IDS_VIEWHELPFILESTEXT));
244 WinShowWindow(WinWindowFromID(hwnd,
245 VINF_SRCH),
246 FALSE);
247 WinShowWindow(WinWindowFromID(hwnd,
248 VINF_FILTER),
249 FALSE);
250 WinShowWindow(WinWindowFromID(hwnd,
251 VINF_TOPIC),
252 FALSE);
253 WinShowWindow(WinWindowFromID(hwnd,
254 VINF_TOPICHDR),
255 FALSE);
256 }
257 hptrIcon = WinLoadPointer(HWND_DESKTOP,
258 FM3ModHandle,
259 VINF_FRAME);
260 WinDefDlgProc(hwnd,
261 WM_SETICON,
262 MPFROMLONG(hptrIcon),
263 MPVOID);
264 hwndMe = hwnd;
265 PostMsg(hwnd,
266 UM_STRETCH,
267 MPVOID,
268 MPVOID);
269 PostMsg(hwnd,
270 UM_RESCAN,
271 MPVOID,
272 MPVOID);
273 break;
274
275 case UM_RESCAN:
276 WinSendDlgItemMsg(hwnd,
277 VINF_LISTBOX,
278 LM_DELETEALL,
279 MPVOID,
280 MPVOID);
281 {
282 DUMMY *d;
283
284 d = xmallocz(sizeof(DUMMY),pszSrcFile,__LINE__);
285 if (!d) {
286 WinDismissDlg(hwnd,0);
287 return 0;
288 }
289 else {
290 d->size = sizeof(DUMMY);
291 d->hwnd = hwnd;
292 if (help)
293 d->help = 1;
294 if(_beginthread(FillListbox,NULL,65536,(PVOID)d) == -1) {
295 Runtime_Error(pszSrcFile, __LINE__, GetPString(IDS_COULDNTSTARTTHREADTEXT));
296 free(d);
297 WinDismissDlg(hwnd,0);
298 return 0;
299 }
300 WinEnableWindow(WinWindowFromID(hwnd,DID_CANCEL),FALSE);
301 threaddone = FALSE;
302 }
303 }
304 return 0;
305
306 case UM_CONTAINER_FILLED:
307 if(!(SHORT)WinSendDlgItemMsg(hwnd,
308 VINF_LISTBOX,
309 LM_QUERYITEMCOUNT,
310 MPVOID,
311 MPVOID)) {
312 saymsg(MB_CANCEL,
313 hwnd,
314 GetPString(IDS_ERRORTEXT),
315 GetPString(IDS_NOFILESFOUNDTEXT));
316 hwndMe = (HWND)0;
317 WinDismissDlg(hwnd,0);
318 }
319 WinEnableWindow(WinWindowFromID(hwnd,DID_CANCEL),TRUE);
320 threaddone = TRUE;
321 return 0;
322
323 case WM_CONTROL:
324 switch(SHORT1FROMMP(mp1)) {
325 case VINF_LISTBOX:
326 switch(SHORT2FROMMP(mp1)) {
327 case LN_ENTER:
328 PostMsg(hwnd,
329 WM_COMMAND,
330 MPFROM2SHORT(DID_OK,0),
331 MPVOID);
332 break;
333 }
334 break;
335 case VINF_ENTRY:
336 switch(SHORT2FROMMP(mp1)) {
337 case EN_CHANGE:
338 {
339 SHORT sSelect;
340 CHAR szBuffer[CCHMAXPATH];
341
342 WinQueryDlgItemText(hwnd,
343 VINF_ENTRY,
344 CCHMAXPATH,
345 szBuffer);
346 bstrip(szBuffer);
347 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
348 VINF_LISTBOX,
349 LM_SEARCHSTRING,
350 MPFROM2SHORT(LSS_SUBSTRING,
351 LIT_FIRST),
352 MPFROMP(szBuffer));
353 if(sSelect >= 0)
354 WinSendDlgItemMsg(hwnd,
355 VINF_LISTBOX,
356 LM_SETTOPINDEX,
357 MPFROM2SHORT(sSelect,0),
358 MPVOID);
359 }
360 break;
361 }
362 break;
363 }
364 return 0;
365
366 case WM_ADJUSTWINDOWPOS:
367 PostMsg(hwnd,UM_STRETCH,MPVOID,MPVOID);
368 break;
369
370 case UM_STRETCH:
371 {
372 SWP swpC,swp;
373
374 WinQueryWindowPos(hwnd,&swp);
375 if(!(swp.fl & (SWP_HIDE | SWP_MINIMIZE))) {
376 WinQueryWindowPos(WinWindowFromID(hwnd,VINF_LISTBOX),&swpC);
377 if(!ypos)
378 ypos = swpC.y;
379 WinSetWindowPos(WinWindowFromID(hwnd,VINF_LISTBOX),HWND_TOP,
380 SysVal(SV_CXSIZEBORDER),
381 ypos,
382 swp.cx - (SysVal(SV_CXSIZEBORDER) * 2),
383 (swp.cy - ypos) - (SysVal(SV_CYTITLEBAR) +
384 SysVal(SV_CYSIZEBORDER)),
385 SWP_MOVE | SWP_SIZE);
386 }
387 }
388 return 0;
389
390 case WM_COMMAND:
391 switch(SHORT1FROMMP(mp1)) {
392 case VINF_RESCAN:
393 PostMsg(hwnd,UM_RESCAN,MPVOID,MPVOID);
394 break;
395
396 case VINF_SRCH:
397 {
398 SHORT sSelect,sLast = LIT_FIRST;
399 CHAR szBuffer[CCHMAXPATH];
400
401 *szBuffer = 0;
402 WinQueryDlgItemText(hwnd,
403 VINF_ENTRY,
404 CCHMAXPATH,
405 szBuffer);
406 rstrip(szBuffer);
407 if(!*szBuffer) {
408 sLast = (SHORT)WinSendDlgItemMsg(hwnd,
409 VINF_LISTBOX,
410 LM_QUERYITEMCOUNT,
411 MPVOID,
412 MPVOID);
413 for(sSelect = 0;sSelect < sLast;sSelect++)
414 WinSendDlgItemMsg(hwnd,
415 VINF_LISTBOX,
416 LM_SELECTITEM,
417 MPFROM2SHORT(sSelect,0),
418 MPFROM2SHORT(FALSE,0));
419 break;
420 }
421 for(;;) {
422 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,VINF_LISTBOX,
423 LM_SEARCHSTRING,
424 MPFROM2SHORT(LSS_SUBSTRING,
425 sLast),
426 MPFROMP(szBuffer));
427 if(sSelect <= sLast)
428 break;
429 if(sSelect >= 0)
430 WinSendDlgItemMsg(hwnd,
431 VINF_LISTBOX,
432 LM_SELECTITEM,
433 MPFROM2SHORT(sSelect,0),
434 MPFROM2SHORT(TRUE,0));
435 else
436 break;
437 sLast = sSelect;
438 }
439 }
440 break;
441
442 case VINF_FILTER:
443 {
444 SHORT sSelect,sTotal;
445
446 sTotal = (SHORT)WinSendDlgItemMsg(hwnd,
447 VINF_LISTBOX,
448 LM_QUERYITEMCOUNT,
449 MPVOID,
450 MPVOID);
451 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
452 VINF_LISTBOX,
453 LM_QUERYSELECTION,
454 MPFROM2SHORT(LIT_FIRST,0),
455 MPVOID);
456 if(sSelect == LIT_NONE) {
457 DosBeep(50,100);
458 break;
459 }
460#ifdef BUGFIXED
461 sSelect = 0;
462 while(sSelect < sTotal) {
463 if(!WinSendDlgItemMsg(hwnd,
464 VINF_LISTBOX,
465 LM_SELECTITEM,
466 MPFROM2SHORT(sSelect,0),
467 MPFROM2SHORT(FALSE,0))) {
468 WinSendDlgItemMsg(hwnd,
469 VINF_LISTBOX,
470 LM_DELETEITEM,
471 MPFROM2SHORT(sSelect,0),
472 MPVOID);
473 sTotal--;
474 }
475 else
476 sSelect++;
477 }
478#else // !BUGIFIXED
479 for(sSelect = 0;sSelect < sTotal;sSelect++)
480 WinSendDlgItemMsg(hwnd,
481 VINF_LISTBOX,
482 LM_SETITEMHANDLE,
483 MPFROM2SHORT(sSelect,0),
484 MPVOID);
485 sSelect = LIT_FIRST;
486 for(;;) {
487 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
488 VINF_LISTBOX,
489 LM_QUERYSELECTION,
490 MPFROM2SHORT(sSelect,0),
491 MPVOID);
492 if(sSelect >= 0)
493 WinSendDlgItemMsg(hwnd,
494 VINF_LISTBOX,
495 LM_SETITEMHANDLE,
496 MPFROM2SHORT(sSelect,0),
497 MPFROMLONG(1L));
498 else
499 break;
500 }
501 for(sSelect = 0;sSelect < sTotal;sSelect++)
502 WinSendDlgItemMsg(hwnd,
503 VINF_LISTBOX,
504 LM_SELECTITEM,
505 MPFROM2SHORT(sSelect,0),
506 MPFROM2SHORT(FALSE,0));
507 sSelect = 0;
508 while(sSelect < sTotal) {
509 if(!WinSendDlgItemMsg(hwnd,
510 VINF_LISTBOX,
511 LM_QUERYITEMHANDLE,
512 MPFROM2SHORT(sSelect,0),
513 MPVOID)) {
514 WinSendDlgItemMsg(hwnd,
515 VINF_LISTBOX,
516 LM_DELETEITEM,
517 MPFROM2SHORT(sSelect,0),
518 MPVOID);
519 sTotal--;
520 }
521 else
522 sSelect++;
523 }
524#endif // BUGFIXED
525 }
526 break;
527
528 case VINF_DIRS:
529 {
530 CHAR szBuffer[1001],*key = "INFPaths";
531
532 if (help)
533 key = "HLPPaths";
534 *szBuffer = 0;
535 WinQueryDlgItemText(hwnd,
536 VINF_ENTRY,
537 1000,
538 szBuffer);
539 bstrip(szBuffer);
540 PrfWriteProfileData(fmprof,
541 FM3Str,
542 key,
543 (*szBuffer) ? szBuffer : NULL,
544 strlen(szBuffer));
545 PostMsg(hwnd,
546 UM_RESCAN,
547 MPVOID,
548 MPVOID);
549 }
550 break;
551
552 case DID_CANCEL:
553 hwndMe = (HWND)0;
554 WinDismissDlg(hwnd,0);
555 break;
556
557 case DID_OK:
558 {
559 SHORT sSelect;
560 CHAR text[CCHMAXPATH * 2],filename[CCHMAXPATH],*p;
561 FILE *fp;
562 BOOL notfirst = FALSE;
563
564 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
565 VINF_LISTBOX,
566 LM_QUERYSELECTION,
567 MPFROM2SHORT(LIT_FIRST,0),
568 MPVOID);
569 if (sSelect < 0) {
570 DosBeep(50,100);
571 }
572 else {
573 if (help) {
574 *text = 0;
575 WinSendDlgItemMsg(hwnd,
576 VINF_LISTBOX,
577 LM_QUERYITEMTEXT,
578 MPFROM2SHORT(sSelect,CCHMAXPATH),
579 MPFROMP(text));
580 p = strchr(text,'>');
581 if(!p) {
582 DosBeep(50,100);
583 break;
584 }
585 p++;
586 bstrip(p);
587 if (!*p)
588 DosBeep(50,100);
589 else
590 ViewHelp(p);
591 break;
592 }
593 save_dir2(filename);
594 if(filename[strlen(filename) - 1] != '\\')
595 strcat(filename,"\\");
596 strcat(filename,"FM2VINF.CMD");
597 fp = xfopen(filename,"w",pszSrcFile,__LINE__);
598 if (fp) {
599 fprintf(fp,"@ECHO OFF\nSET FM2REF=");
600 while(sSelect >= 0) {
601 *text = 0;
602 WinSendDlgItemMsg(hwnd,
603 VINF_LISTBOX,
604 LM_QUERYITEMTEXT,
605 MPFROM2SHORT(sSelect,
606 CCHMAXPATH),
607 MPFROMP(text));
608 p = strchr(text,'>');
609 if(p) {
610 p++;
611 bstrip(p);
612 if(*p) {
613 if(notfirst)
614 fprintf(fp,"+");
615 notfirst = TRUE;
616 fprintf(fp,"%s",p);
617 }
618 }
619 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
620 VINF_LISTBOX,
621 LM_QUERYSELECTION,
622 MPFROM2SHORT(sSelect,0),
623 MPVOID);
624 } // while
625 *text = 0;
626 WinQueryDlgItemText(hwnd,
627 VINF_TOPIC,
628 CCHMAXPATH * 2,
629 text);
630 bstrip(text);
631 fprintf(fp,
632 "\nVIEW FM2REF%s%s\nDEL %s\n",
633 (*text) ? " " : NullStr,
634 text,
635 filename);
636 fclose(fp);
637 runemf2(SEPARATE | WINDOWED | MINIMIZED |
638 BACKGROUND | INVISIBLE,
639 hwnd,
640 NULL,
641 NULL,
642 "%s /C %s",
643 GetCmdSpec(FALSE),
644 filename);
645 }
646 }
647 }
648 break;
649
650 case IDM_HELP:
651 if(hwndHelp) {
652 if(help)
653 WinSendMsg(hwndHelp,
654 HM_DISPLAY_HELP,
655 MPFROM2SHORT(HELP_VIEWHELPS,0),
656 MPFROMSHORT(HM_RESOURCEID));
657 else
658 WinSendMsg(hwndHelp,
659 HM_DISPLAY_HELP,
660 MPFROM2SHORT(HELP_VIEWINF,0),
661 MPFROMSHORT(HM_RESOURCEID));
662 }
663 break;
664 }
665 return 0;
666
667 case WM_CLOSE:
668 if(!threaddone)
669 return 0;
670 break;
671
672 case WM_DESTROY:
673 if(hwndMe == hwnd) {
674 hwndMe = (HWND)0;
675 if(hptrIcon)
676 WinDestroyPointer(hptrIcon);
677 hptrIcon = (HPOINTER)0;
678 }
679 break;
680 }
681 return WinDefDlgProc(hwnd,msg,mp1,mp2);
682}
Note: See TracBrowser for help on using the repository browser.