source: trunk/dll/viewinf.c@ 1228

Last change on this file since 1228 was 1228, checked in by John Small, 17 years ago

Ticket 187: Moved typedef's and some #define's from fm3dll.h

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