source: trunk/dll/viewinf.c@ 1398

Last change on this file since 1398 was 1398, checked in by Gregg Young, 17 years ago

Move embeded strings to PCSZ variables or string table; Eliminate Error2 functions Runtime_Error with NULL format string returns "No data" error. Change declares from PSZ to PCSZ in functions where the variable isn't changed. Added btm as an executable file type in several additional places. Use fProtectOnly to prevent attempt to execute Dos and Win programs on "Protect only" installs in several additional places.

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