source: trunk/dll/viewinf.c@ 1183

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

Ticket 187: Draft 2: Move remaining function declarations

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