Erich Hoover : hhctrl.ocx: Fix searching for Index and TOC file.

Alexandre Julliard julliard at winehq.org
Thu Feb 9 15:21:49 CST 2012


Module: wine
Branch: master
Commit: 4c908dd8dae7092734be67514d3aec1c79096f9a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4c908dd8dae7092734be67514d3aec1c79096f9a

Author: Erich Hoover <ehoover at mines.edu>
Date:   Fri Feb  3 14:28:47 2012 -0700

hhctrl.ocx: Fix searching for Index and TOC file.

---

 dlls/hhctrl.ocx/chm.c    |   59 ++++++++++++++++++++++++++++++++++++++-------
 dlls/hhctrl.ocx/hhctrl.h |    1 +
 2 files changed, 50 insertions(+), 10 deletions(-)

diff --git a/dlls/hhctrl.ocx/chm.c b/dlls/hhctrl.ocx/chm.c
index 51d1685..e6f955d 100644
--- a/dlls/hhctrl.ocx/chm.c
+++ b/dlls/hhctrl.ocx/chm.c
@@ -138,6 +138,8 @@ static BOOL ReadChmSystem(CHMInfo *chm)
             break;
         case 0x6:
             TRACE("Compiled file is %s\n", debugstr_an(buf, entry.len));
+            heap_free(chm->compiledFile);
+            chm->compiledFile = strdupnAtoW(buf, entry.len);
             break;
         case 0x9:
             TRACE("Version is %s\n", debugstr_an(buf, entry.len));
@@ -209,6 +211,32 @@ LPWSTR FindContextAlias(CHMInfo *chm, DWORD index)
     return strdupAtoW(ret);
 }
 
+/*
+ * Tests if the file <chmfile>.<ext> exists, used for loading Indicies, Table of Contents, etc.
+ * when these files are not available from the HH_WINTYPE structure.
+ */
+static WCHAR *FindHTMLHelpSetting(HHInfo *info, const WCHAR *extW)
+{
+    static const WCHAR periodW[] = {'.',0};
+    IStorage *pStorage = info->pCHMInfo->pStorage;
+    IStream *pStream;
+    WCHAR *filename;
+    HRESULT hr;
+
+    filename = heap_alloc(strlenW(info->pCHMInfo->compiledFile)+strlenW(periodW)+strlenW(extW)+1);
+    strcpyW(filename, info->pCHMInfo->compiledFile);
+    strcatW(filename, periodW);
+    strcatW(filename, extW);
+    hr = IStorage_OpenStream(pStorage, filename, NULL, STGM_READ, 0, &pStream);
+    if (FAILED(hr))
+    {
+        heap_free(filename);
+        return strdupAtoW("");
+    }
+    IStream_Release(pStream);
+    return filename;
+}
+
 /* Loads the HH_WINTYPE data from the CHM file
  *
  * FIXME: There may be more than one window type in the file, so
@@ -222,6 +250,8 @@ BOOL LoadWinTypeFromCHM(HHInfo *info)
     HRESULT hr;
     DWORD cbRead;
 
+    static const WCHAR toc_extW[] = {'h','h','c',0};
+    static const WCHAR index_extW[] = {'h','h','k',0};
     static const WCHAR windowsW[] = {'#','W','I','N','D','O','W','S',0};
 
     hr = IStorage_OpenStream(pStorage, windowsW, NULL, STGM_READ, 0, &pStream);
@@ -258,16 +288,24 @@ BOOL LoadWinTypeFromCHM(HHInfo *info)
     if (FAILED(hr)) goto done;
 
     /* convert the #STRINGS offsets to actual strings */
-    info->WinType.pszType     = info->pszType     = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszType));
-    info->WinType.pszCaption  = info->pszCaption  = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszCaption));
-    info->WinType.pszToc      = info->pszToc      = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszToc));
-    info->WinType.pszIndex    = info->pszIndex    = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszIndex));
-    info->WinType.pszFile     = info->pszFile     = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszFile));
-    info->WinType.pszHome     = info->pszHome     = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszHome));
-    info->WinType.pszJump1    = info->pszJump1    = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszJump1));
-    info->WinType.pszJump2    = info->pszJump2    = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszJump2));
-    info->WinType.pszUrlJump1 = info->pszUrlJump1 = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszUrlJump1));
-    info->WinType.pszUrlJump2 = info->pszUrlJump2 = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszUrlJump2));
+
+    info->WinType.pszType      = info->pszType     = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszType));
+    info->WinType.pszCaption   = info->pszCaption  = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszCaption));
+    info->WinType.pszFile      = info->pszFile     = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszFile));
+    info->WinType.pszHome      = info->pszHome     = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszHome));
+    info->WinType.pszJump1     = info->pszJump1    = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszJump1));
+    info->WinType.pszJump2     = info->pszJump2    = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszJump2));
+    info->WinType.pszUrlJump1  = info->pszUrlJump1 = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszUrlJump1));
+    info->WinType.pszUrlJump2  = info->pszUrlJump2 = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszUrlJump2));
+
+    if (info->WinType.pszToc)
+        info->WinType.pszToc   = info->pszToc      = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszToc));
+    else
+        info->WinType.pszToc   = info->pszToc      = FindHTMLHelpSetting(info, toc_extW);
+    if (info->WinType.pszIndex)
+        info->WinType.pszIndex = info->pszIndex    = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszIndex));
+    else
+        info->WinType.pszIndex = info->pszIndex    = FindHTMLHelpSetting(info, index_extW);
 
     /* FIXME: pszCustomTabs is a list of multiple zero-terminated strings so ReadString won't
      * work in this case
@@ -431,6 +469,7 @@ CHMInfo *CloseCHM(CHMInfo *chm)
     heap_free(chm->defTopic);
     heap_free(chm->defToc);
     heap_free(chm->szFile);
+    heap_free(chm->compiledFile);
     heap_free(chm);
 
     return NULL;
diff --git a/dlls/hhctrl.ocx/hhctrl.h b/dlls/hhctrl.ocx/hhctrl.h
index 3e496f9..cbbcb70 100644
--- a/dlls/hhctrl.ocx/hhctrl.h
+++ b/dlls/hhctrl.ocx/hhctrl.h
@@ -102,6 +102,7 @@ typedef struct CHMInfo
     char **strings;
     DWORD strings_size;
 
+    WCHAR *compiledFile;
     WCHAR *defTopic;
     WCHAR *defTitle;
     WCHAR *defToc;




More information about the wine-cvs mailing list