source: trunk/dll/viewinf.c@ 1438

Last change on this file since 1438 was 1438, checked in by Gregg Young, 16 years ago

Improved drivebar changes; Added AddBackslashToPath() to remove repeatative code. replaced "
" with PCSZ variable; ANY_OBJ added the DosAlloc... (experimental)

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