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