From 182bd9dac4b8f4a96a64d2d00915083daaff3527 Mon Sep 17 00:00:00 2001 From: Erich Hoover Date: Thu, 30 Aug 2012 12:16:54 -0600 Subject: [PATCH] hhctrl.ocx: Implement HH_SET_WIN_TYPE. --- dlls/hhctrl.ocx/help.c | 17 ++++-- dlls/hhctrl.ocx/hhctrl.c | 108 +++++++++++++++++++++++++++++++-------- dlls/hhctrl.ocx/hhctrl.h | 3 +- 3 files changed, 102 insertions(+), 26 deletions(-) diff --git a/dlls/hhctrl.ocx/help.c b/dlls/hhctrl.ocx/help.c index 29751ea796c..6671f704ef7 100644 --- a/dlls/hhctrl.ocx/help.c +++ b/dlls/hhctrl.ocx/help.c @@ -1739,6 +1739,7 @@ static BOOL CreateViewer(HHInfo *pHHInfo) InitContent(pHHInfo); InitIndex(pHHInfo); + pHHInfo->viewer_initialized = TRUE; return TRUE; } @@ -1784,11 +1785,17 @@ void ReleaseHelpViewer(HHInfo *info) OleUninitialize(); } -HHInfo *CreateHelpViewer(LPCWSTR filename, HWND caller) +HHInfo *CreateHelpViewer(HHInfo *info, LPCWSTR filename, HWND caller) { - HHInfo *info = heap_alloc_zero(sizeof(HHInfo)); + BOOL add_to_window_list = FALSE; int i; + if(!info) + { + info = heap_alloc_zero(sizeof(HHInfo)); + add_to_window_list = TRUE; + } + /* Set the invalid tab ID (-1) as the default value for all * of the tabs, this matches a failed TCM_INSERTITEM call. */ @@ -1809,12 +1816,14 @@ HHInfo *CreateHelpViewer(LPCWSTR filename, HWND caller) } info->WinType.hwndCaller = caller; - if(!CreateViewer(info)) { + if(!info->viewer_initialized && !CreateViewer(info)) { ReleaseHelpViewer(info); return NULL; } - list_add_tail(&window_list, &info->entry); + if(add_to_window_list) + list_add_tail(&window_list, &info->entry); + return info; } diff --git a/dlls/hhctrl.ocx/hhctrl.c b/dlls/hhctrl.ocx/hhctrl.c index 5244e103e90..4ed9afc247d 100644 --- a/dlls/hhctrl.ocx/hhctrl.c +++ b/dlls/hhctrl.ocx/hhctrl.c @@ -146,6 +146,18 @@ static BOOL resolve_filename(const WCHAR *filename, WCHAR *fullname, DWORD bufle return (GetFileAttributesW(fullname) != INVALID_FILE_ATTRIBUTES); } +static inline HHInfo *find_window(const WCHAR *window) +{ + HHInfo *info; + + LIST_FOR_EACH_ENTRY(info, &window_list, HHInfo, entry) + { + if (strcmpW(info->WinType.pszType, window) == 0) + return info; + } + return NULL; +} + /****************************************************************** * HtmlHelpW (HHCTRL.OCX.15) */ @@ -163,9 +175,9 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD_PTR dat case HH_DISPLAY_TOC: case HH_DISPLAY_INDEX: case HH_DISPLAY_SEARCH:{ - HHInfo *info; BOOL res; NMHDR nmhdr; + HHInfo *info = NULL; WCHAR *window = NULL; const WCHAR *index = NULL; WCHAR *default_index = NULL; @@ -181,7 +193,10 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD_PTR dat } index = default_index; - info = CreateHelpViewer(fullname, caller); + if (window) + info = find_window(window); + + info = CreateHelpViewer(info, fullname, caller); if(!info) { heap_free(default_index); @@ -253,7 +268,7 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD_PTR dat return 0; } - info = CreateHelpViewer(fullname, caller); + info = CreateHelpViewer(NULL, fullname, caller); if(!info) return NULL; @@ -288,6 +303,33 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD_PTR dat } return 0; } + case HH_SET_WIN_TYPE: { + HH_WINTYPEW *wintype = (HH_WINTYPEW *)data; + WCHAR *window = NULL; + HHInfo *info = NULL; + + if (!filename && wintype->pszType) + window = strdupW(wintype->pszType); + else if (!filename || !resolve_filename(filename, fullname, MAX_PATH, NULL, &window) || !window) + { + WARN("can't find window name: %s\n", debugstr_w(filename)); + return 0; + } + info = find_window(window); + if (!info) + { + info = heap_alloc_zero(sizeof(HHInfo)); + info->WinType.pszType = info->stringsW.pszType = window; + list_add_tail(&window_list, &info->entry); + } + else + heap_free(window); + + TRACE("Changing WINTYPE, fsValidMembers=0x%x\n", wintype->fsValidMembers); + + MergeChmProperties(wintype, info); + return 0; + } default: FIXME("HH case %s not handled.\n", command_to_string( command )); } @@ -295,21 +337,35 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD_PTR dat return 0; } +static HH_WINTYPEW *wintypeAtoW(HH_WINTYPEA *data, struct wintype_stringsW *stringsW) +{ + HH_WINTYPEW *wdata; + + wdata = heap_alloc(sizeof(*wdata)); + memcpy(wdata, data, sizeof(*data)); + /* convert all of the ANSI strings to Unicode */ + wdata->pszType = stringsW->pszType = strdupAtoW(data->pszType); + wdata->pszCaption = stringsW->pszCaption = strdupAtoW(data->pszCaption); + wdata->pszToc = stringsW->pszToc = strdupAtoW(data->pszToc); + wdata->pszIndex = stringsW->pszIndex = strdupAtoW(data->pszIndex); + wdata->pszFile = stringsW->pszFile = strdupAtoW(data->pszFile); + wdata->pszHome = stringsW->pszHome = strdupAtoW(data->pszHome); + wdata->pszJump1 = stringsW->pszJump1 = strdupAtoW(data->pszJump1); + wdata->pszJump2 = stringsW->pszJump2 = strdupAtoW(data->pszJump2); + wdata->pszUrlJump1 = stringsW->pszUrlJump1 = strdupAtoW(data->pszUrlJump1); + wdata->pszUrlJump2 = stringsW->pszUrlJump2 = strdupAtoW(data->pszUrlJump2); + wdata->pszCustomTabs = stringsW->pszCustomTabs = strdupAtoW(data->pszCustomTabs); + + return wdata; +} + /****************************************************************** * HtmlHelpA (HHCTRL.OCX.14) */ HWND WINAPI HtmlHelpA(HWND caller, LPCSTR filename, UINT command, DWORD_PTR data) { - WCHAR *wfile = NULL, *wdata = NULL; - DWORD len; - HWND result; - - if (filename) - { - len = MultiByteToWideChar( CP_ACP, 0, filename, -1, NULL, 0 ); - wfile = heap_alloc(len*sizeof(WCHAR)); - MultiByteToWideChar( CP_ACP, 0, filename, -1, wfile, len ); - } + WCHAR *wfile = strdupAtoW( filename ); + HWND result = 0; if (data) { @@ -321,20 +377,31 @@ HWND WINAPI HtmlHelpA(HWND caller, LPCSTR filename, UINT command, DWORD_PTR data case HH_GET_LAST_ERROR: case HH_GET_WIN_TYPE: case HH_KEYWORD_LOOKUP: - case HH_SET_WIN_TYPE: case HH_SYNC: FIXME("structures not handled yet\n"); break; + case HH_SET_WIN_TYPE: + { + struct wintype_stringsW stringsW; + HH_WINTYPEW *wdata = wintypeAtoW((HH_WINTYPEA *)data, &stringsW); + result = HtmlHelpW( caller, wfile, command, (DWORD_PTR)wdata ); + wintype_stringsW_free(&stringsW); + heap_free( wdata ); + goto done; + } + case HH_DISPLAY_INDEX: case HH_DISPLAY_TOPIC: case HH_DISPLAY_TOC: case HH_GET_WIN_HANDLE: case HH_SAFE_DISPLAY_TOPIC: - len = MultiByteToWideChar( CP_ACP, 0, (const char*)data, -1, NULL, 0 ); - wdata = heap_alloc(len*sizeof(WCHAR)); - MultiByteToWideChar( CP_ACP, 0, (const char*)data, -1, wdata, len ); - break; + { + WCHAR *wdata = strdupAtoW( (const char *)data ); + result = HtmlHelpW( caller, wfile, command, (DWORD_PTR)wdata ); + heap_free(wdata); + goto done; + } case HH_CLOSE_ALL: case HH_HELP_CONTEXT: @@ -352,10 +419,9 @@ HWND WINAPI HtmlHelpA(HWND caller, LPCSTR filename, UINT command, DWORD_PTR data } } - result = HtmlHelpW( caller, wfile, command, wdata ? (DWORD_PTR)wdata : data ); - + result = HtmlHelpW( caller, wfile, command, data ); +done: heap_free(wfile); - heap_free(wdata); return result; } diff --git a/dlls/hhctrl.ocx/hhctrl.h b/dlls/hhctrl.ocx/hhctrl.h index 4cacbb301ce..900bbb4e1c5 100644 --- a/dlls/hhctrl.ocx/hhctrl.h +++ b/dlls/hhctrl.ocx/hhctrl.h @@ -175,6 +175,7 @@ typedef struct { HFONT hFont; HHTab tabs[TAB_FAVORITES+1]; + int viewer_initialized; DWORD current_tab; } HHInfo; @@ -198,7 +199,7 @@ IStream *GetChmStream(CHMInfo*,LPCWSTR,ChmPath*) DECLSPEC_HIDDEN; LPWSTR FindContextAlias(CHMInfo*,DWORD) DECLSPEC_HIDDEN; WCHAR *GetDocumentTitle(CHMInfo*,LPCWSTR) DECLSPEC_HIDDEN; -HHInfo *CreateHelpViewer(LPCWSTR,HWND) DECLSPEC_HIDDEN; +HHInfo *CreateHelpViewer(HHInfo*,LPCWSTR,HWND) DECLSPEC_HIDDEN; void ReleaseHelpViewer(HHInfo*) DECLSPEC_HIDDEN; BOOL NavigateToUrl(HHInfo*,LPCWSTR) DECLSPEC_HIDDEN; BOOL NavigateToChm(HHInfo*,LPCWSTR,LPCWSTR) DECLSPEC_HIDDEN;