source: trunk/dll/viewinf.c@ 1391

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

Move nontranslated strings to init.c and codepage.c; use those strings in place of GetPString calls. Move other strings to a StringTable; minor cleanup and code changes to codepage.c to use a string array instead of GetPString calls. Ticket 340

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