source: trunk/dll/viewinf.c@ 1214

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

Ticket 187: Move data declarations/definitions out of fm3dll.h

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