source: trunk/dll/viewinf.c@ 907

Last change on this file since 907 was 907, checked in by Steven Levine, 18 years ago

Avoid out of memory traps in Compare Directories
Rework Compare Directories progress display for 2 second update rate
Start refactoring to reduce dependence on fm3dll.h
Add timer services (IsITimerExpired etc.)

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