From 98f0be8dc3d70cde04cf6e93c5338775a66c24aa Mon Sep 17 00:00:00 2001 From: Erich Hoover Date: Mon, 13 Feb 2012 11:45:29 -0700 Subject: [PATCH] hhctrl.ocx: Fix parsing of some TOC topics that reference other files. --- dlls/hhctrl.ocx/content.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/dlls/hhctrl.ocx/content.c b/dlls/hhctrl.ocx/content.c index 2dad7c848be..9f468a28ce6 100644 --- a/dlls/hhctrl.ocx/content.c +++ b/dlls/hhctrl.ocx/content.c @@ -50,11 +50,21 @@ static void free_content_item(ContentItem *item) } } +static void store_param(LPWSTR *param, const char *value, int len) +{ + int wlen; + + wlen = MultiByteToWideChar(CP_ACP, 0, value, len, NULL, 0); + *param = heap_alloc((wlen+1)*sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, value, len, *param, wlen); + (*param)[wlen] = 0; +} + static void parse_obj_node_param(ContentItem *item, ContentItem *hhc_root, const char *text) { const char *ptr; LPWSTR *param, merge; - int len, wlen; + int len; ptr = get_attr(text, "name", &len); if(!ptr) { @@ -79,10 +89,21 @@ static void parse_obj_node_param(ContentItem *item, ContentItem *hhc_root, const return; } - wlen = MultiByteToWideChar(CP_ACP, 0, ptr, len, NULL, 0); - *param = heap_alloc((wlen+1)*sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP, 0, ptr, len, *param, wlen); - (*param)[wlen] = 0; + /* + * "merge" parameter data (referencing another CHM file) can be incorporated into the "local" parameter + * by specifying the filename in the format: + * MS-ITS:file.chm::/local_path.htm + */ + if(param == &item->local && strstr(ptr, "::")) + { + const char *local = strstr(ptr, "::")+2; + int local_len = len-(local-ptr); + + store_param(&item->local, local, local_len); + param = &merge; + } + + store_param(param, ptr, len); if(param == &merge) { SetChmPath(&item->merge, hhc_root->merge.chm_file, merge);