source: trunk/dll/viewinf.c @ 689

Last change on this file since 689 was 689, checked in by Steven Levine, 13 years ago

Commit OpenWatcom? compatibility updates

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