source: trunk/dll/viewinf.c@ 1063

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

Fortify ifdef reformat

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