source: trunk/dll/viewinf.c@ 551

Last change on this file since 551 was 551, checked in by Gregg Young, 18 years ago

Indentation cleanup

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