Module: wine Branch: master Commit: 736ef403a92ae4d0598d571efdb25bbad9958391 URL: http://source.winehq.org/git/wine.git/?a=commit;h=736ef403a92ae4d0598d571efd...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Feb 28 03:55:39 2007 +0100
hhctrl.ocx: Added HH_HELP_CONTEXT implementation.
---
dlls/hhctrl.ocx/chm.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++ dlls/hhctrl.ocx/help.c | 29 +++++++++++++++++++++------ dlls/hhctrl.ocx/hhctrl.c | 30 +++++++++++++++++++++++++--- dlls/hhctrl.ocx/hhctrl.h | 2 + 4 files changed, 97 insertions(+), 11 deletions(-)
diff --git a/dlls/hhctrl.ocx/chm.c b/dlls/hhctrl.ocx/chm.c index 8e9fcf8..7c3384e 100644 --- a/dlls/hhctrl.ocx/chm.c +++ b/dlls/hhctrl.ocx/chm.c @@ -146,6 +146,53 @@ static BOOL ReadChmSystem(CHMInfo *chm) return SUCCEEDED(hres); }
+LPWSTR FindContextAlias(CHMInfo *chm, DWORD index) +{ + IStream *ivb_stream; + DWORD size, read, i; + DWORD *buf; + LPCSTR ret = NULL; + HRESULT hres; + + static const WCHAR wszIVB[] = {'#','I','V','B',0}; + + hres = IStorage_OpenStream(chm->pStorage, wszIVB, NULL, STGM_READ, 0, &ivb_stream); + if(FAILED(hres)) { + WARN("Could not open #IVB stream: %08x\n", hres); + return NULL; + } + + hres = IStream_Read(ivb_stream, &size, sizeof(size), &read); + if(FAILED(hres)) { + WARN("Read failed: %08x\n", hres); + IStream_Release(ivb_stream); + return NULL; + } + + buf = hhctrl_alloc(size); + hres = IStream_Read(ivb_stream, buf, size, &read); + IStream_Release(ivb_stream); + if(FAILED(hres)) { + WARN("Read failed: %08x\n", hres); + hhctrl_free(buf); + return NULL; + } + + size /= 2*sizeof(DWORD); + + for(i=0; i<size; i++) { + if(buf[2*i] == index) { + ret = GetChmString(chm, buf[2*i+1]); + break; + } + } + + hhctrl_free(buf); + + TRACE("returning %s\n", debugstr_a(ret)); + return strdupAtoW(ret); +} + /* Loads the HH_WINTYPE data from the CHM file * * FIXME: There may be more than one window type in the file, so diff --git a/dlls/hhctrl.ocx/help.c b/dlls/hhctrl.ocx/help.c index abbc0c5..baedf88 100644 --- a/dlls/hhctrl.ocx/help.c +++ b/dlls/hhctrl.ocx/help.c @@ -57,15 +57,32 @@ static LPWSTR HH_LoadString(DWORD dwID) return string; }
+BOOL NavigateToUrl(HHInfo *info, LPCWSTR surl) +{ + VARIANT url; + HRESULT hres; + + V_VT(&url) = VT_BSTR; + V_BSTR(&url) = SysAllocString(surl); + + hres = IWebBrowser2_Navigate2(info->web_browser, &url, 0, 0, 0, 0); + + VariantClear(&url); + + return SUCCEEDED(hres); +} + BOOL NavigateToChm(HHInfo *info, LPCWSTR file, LPCWSTR index) { WCHAR buf[INTERNET_MAX_URL_LENGTH]; WCHAR full_path[MAX_PATH]; - VARIANT url; + LPWSTR ptr;
static const WCHAR url_format[] = {'m','k',':','@','M','S','I','T','S','t','o','r','e',':','%','s',':',':','/','%','s',0};
+ TRACE("%p %s %s\n", info, debugstr_w(file), debugstr_w(index)); + if (!info->web_browser) return FALSE;
@@ -76,13 +93,11 @@ BOOL NavigateToChm(HHInfo *info, LPCWSTR file, LPCWSTR index)
wsprintfW(buf, url_format, full_path, index);
- V_VT(&url) = VT_BSTR; - V_BSTR(&url) = SysAllocString(buf); - - IWebBrowser2_Navigate2(info->web_browser, &url, 0, 0, 0, 0); - VariantClear(&url); + /* FIXME: HACK */ + if((ptr = strchrW(buf, '#'))) + *ptr = 0;
- return TRUE; + return NavigateToUrl(info, buf); }
/* Size Bar */ diff --git a/dlls/hhctrl.ocx/hhctrl.c b/dlls/hhctrl.ocx/hhctrl.c index ec3cf74..de66a8a 100644 --- a/dlls/hhctrl.ocx/hhctrl.c +++ b/dlls/hhctrl.ocx/hhctrl.c @@ -2,6 +2,7 @@ * hhctrl implementation * * Copyright 2004 Krzysztof Foltman + * Copyright 2007 Jacek Caban for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -26,7 +27,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(htmlhelp);
HINSTANCE hhctrl_hinstance; -BOOL hh_process; +BOOL hh_process = FALSE;
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, LPVOID lpvReserved) { @@ -84,9 +85,11 @@ static const char *command_to_string(UINT command) #undef X }
+/****************************************************************** + * HtmlHelpW (hhctrl.ocx.15) + */ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD data) { - TRACE("(%p, %s, command=%s, data=%d)\n", caller, debugstr_w( filename ), command_to_string( command ), data); @@ -95,8 +98,7 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD data) { case HH_DISPLAY_TOPIC: case HH_DISPLAY_TOC: - case HH_DISPLAY_SEARCH: - case HH_HELP_CONTEXT: { + case HH_DISPLAY_SEARCH:{ HHInfo *info; BOOL res;
@@ -110,6 +112,23 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD data)
return NULL; /* FIXME */ } + case HH_HELP_CONTEXT: { + HHInfo *info; + LPWSTR url; + + info = CreateHelpViewer(filename); + if(!info) + return NULL; + + url = FindContextAlias(info->pCHMInfo, data); + if(!url) + return NULL; + + NavigateToUrl(info, url); + hhctrl_free(url); + + return NULL; /* FIXME */ + } default: FIXME("HH case %s not handled.\n", command_to_string( command )); } @@ -117,6 +136,9 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD data) return 0; }
+/****************************************************************** + * HtmlHelpA (hhctrl.ocx.14) + */ HWND WINAPI HtmlHelpA(HWND caller, LPCSTR filename, UINT command, DWORD data) { WCHAR *wfile = NULL; diff --git a/dlls/hhctrl.ocx/hhctrl.h b/dlls/hhctrl.ocx/hhctrl.h index 0de19e2..f9d21f4 100644 --- a/dlls/hhctrl.ocx/hhctrl.h +++ b/dlls/hhctrl.ocx/hhctrl.h @@ -79,9 +79,11 @@ void DoPageAction(HHInfo*,DWORD); CHMInfo *OpenCHM(LPCWSTR szFile); BOOL LoadWinTypeFromCHM(CHMInfo *pCHMInfo, HH_WINTYPEW *pHHWinType); CHMInfo *CloseCHM(CHMInfo *pCHMInfo); +LPWSTR FindContextAlias(CHMInfo*,DWORD);
HHInfo *CreateHelpViewer(LPCWSTR); void ReleaseHelpViewer(HHInfo*); +BOOL NavigateToUrl(HHInfo*,LPCWSTR); BOOL NavigateToChm(HHInfo*,LPCWSTR,LPCWSTR);
/* memory allocation functions */