source: trunk/dll/viewinf.c@ 1400

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

Remainder of changes to rename commafmt.h/c (Ticket 28, 82); Additional strings moved to PCSZs in init.c (Ticket 6); Added WriteDetailsSwitches used it and LoadDetailsSwitches to consolidate inline code (Ticket 343, 344)

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