source: trunk/dll/viewinf.c@ 1505

Last change on this file since 1505 was 1505, checked in by Gregg Young, 15 years ago

Remove unnecessary type casts; minor formating cleanup.

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