Module: wine Branch: master Commit: 3414d0ea0e8fe8cbd5f4ee090e0673620ffd36ab URL: http://source.winehq.org/git/wine.git/?a=commit;h=3414d0ea0e8fe8cbd5f4ee090e...
Author: Aric Stewart aric@codeweavers.com Date: Wed Jun 29 10:51:05 2011 -0500
hhctrl.ocx: Improve parsing of incoming file specs to HtmlHelp.
---
dlls/hhctrl.ocx/chm.c | 2 +- dlls/hhctrl.ocx/hhctrl.c | 55 +++++++++++++++++++++++++++++++++------------ dlls/hhctrl.ocx/hhctrl.h | 2 + 3 files changed, 43 insertions(+), 16 deletions(-)
diff --git a/dlls/hhctrl.ocx/chm.c b/dlls/hhctrl.ocx/chm.c index f0452fa..51d1685 100644 --- a/dlls/hhctrl.ocx/chm.c +++ b/dlls/hhctrl.ocx/chm.c @@ -282,7 +282,7 @@ done: return SUCCEEDED(hr); }
-static LPCWSTR skip_schema(LPCWSTR url) +LPCWSTR skip_schema(LPCWSTR url) { static const WCHAR its_schema[] = {'i','t','s',':'}; static const WCHAR msits_schema[] = {'m','s','-','i','t','s',':'}; diff --git a/dlls/hhctrl.ocx/hhctrl.c b/dlls/hhctrl.ocx/hhctrl.c index 08dfc4e..33cc1f1 100644 --- a/dlls/hhctrl.ocx/hhctrl.c +++ b/dlls/hhctrl.ocx/hhctrl.c @@ -98,9 +98,41 @@ static const char *command_to_string(UINT command) #undef X }
-static BOOL resolve_filename(const WCHAR *filename, WCHAR *fullname, DWORD buflen) +static BOOL resolve_filename(const WCHAR *filename, WCHAR *fullname, DWORD buflen, const WCHAR **index, const WCHAR **window) { + const WCHAR *extra; + WCHAR chm_file[MAX_PATH]; + static const WCHAR helpW[] = {'\','h','e','l','p','\',0}; + static const WCHAR delimW[] = {':',':',0}; + static const WCHAR delim2W[] = {'>',0}; + + filename = skip_schema(filename); + + /* the format is "helpFile[::/index][>window]" */ + if (index) *index = NULL; + if (window) *window = NULL; + + extra = strstrW(filename, delim2W); + if (extra) + { + memcpy(chm_file, filename, (extra-filename)*sizeof(WCHAR)); + chm_file[extra-filename] = 0; + filename = chm_file; + if (window) + *window = strdupW(extra+1); + } + + extra = strstrW(filename, delimW); + if (extra) + { + if (filename != chm_file); + memcpy(chm_file, filename, (extra-filename)*sizeof(WCHAR)); + chm_file[extra-filename] = 0; + filename = chm_file; + if (index) + *index = strdupW(extra+2); + }
GetFullPathNameW(filename, buflen, fullname, NULL); if (GetFileAttributesW(fullname) == INVALID_FILE_ATTRIBUTES) @@ -128,27 +160,16 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD_PTR dat case HH_DISPLAY_TOPIC: case HH_DISPLAY_TOC: case HH_DISPLAY_SEARCH:{ - static const WCHAR delimW[] = {':',':',0}; HHInfo *info; BOOL res; - WCHAR chm_file[MAX_PATH]; - const WCHAR *index; + const WCHAR *index = NULL;
FIXME("Not all HH cases handled correctly\n");
if (!filename) return NULL;
- index = strstrW(filename, delimW); - if (index) - { - memcpy(chm_file, filename, (index-filename)*sizeof(WCHAR)); - chm_file[index-filename] = 0; - filename = chm_file; - index += 2; /* advance beyond "::" for calling NavigateToChm() later */ - } - - if (!resolve_filename(filename, fullname, MAX_PATH)) + if (!resolve_filename(filename, fullname, MAX_PATH, &index, NULL)) { WARN("can't find %s\n", debugstr_w(filename)); return 0; @@ -162,6 +183,10 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD_PTR dat index = info->WinType.pszFile;
res = NavigateToChm(info, info->pCHMInfo->szFile, index); + + if (index != info->WinType.pszFile) + heap_free((WCHAR*)index); + if(!res) { ReleaseHelpViewer(info); @@ -176,7 +201,7 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD_PTR dat if (!filename) return NULL;
- if (!resolve_filename(filename, fullname, MAX_PATH)) + if (!resolve_filename(filename, fullname, MAX_PATH, NULL, NULL)) { WARN("can't find %s\n", debugstr_w(filename)); return 0; diff --git a/dlls/hhctrl.ocx/hhctrl.h b/dlls/hhctrl.ocx/hhctrl.h index 1d45201..8e63545 100644 --- a/dlls/hhctrl.ocx/hhctrl.h +++ b/dlls/hhctrl.ocx/hhctrl.h @@ -189,6 +189,8 @@ BOOL NavigateToChm(HHInfo*,LPCWSTR,LPCWSTR) DECLSPEC_HIDDEN; void InitSearch(HHInfo *info, const char *needle) DECLSPEC_HIDDEN; void ReleaseSearch(HHInfo *info) DECLSPEC_HIDDEN;
+LPCWSTR skip_schema(LPCWSTR url) DECLSPEC_HIDDEN; + /* memory allocation functions */
static inline void * __WINE_ALLOC_SIZE(1) heap_alloc(size_t len)