source: trunk/dll/viewinf.c@ 1159

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

Ticket 187: Draft 1: Functions only

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