source: trunk/dll/viewinf.c@ 1082

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

Changes so FM2 will use TMP/TEMP directory for all temp files; Replaced save_dir2 with global variable so BldFullPathName could easily replace code that performed the same function; Added #ifdef FORTIFY to free_ function that are only used when fortified.

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