source: trunk/dll/viewinf.c@ 123

Last change on this file since 123 was 123, checked in by root, 21 years ago

Rework lstrip/rstrip usage

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