source: trunk/dll/viewinf.c@ 689

Last change on this file since 689 was 689, checked in by Steven Levine, 18 years ago

Commit OpenWatcom compatibility updates

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