Module: wine Branch: master Commit: 98f0be8dc3d70cde04cf6e93c5338775a66c24aa URL: http://source.winehq.org/git/wine.git/?a=commit;h=98f0be8dc3d70cde04cf6e93c5...
Author: Erich Hoover ehoover@mines.edu Date: Mon Feb 13 11:45:29 2012 -0700
hhctrl.ocx: Fix parsing of some TOC topics that reference other files.
---
dlls/hhctrl.ocx/content.c | 31 ++++++++++++++++++++++++++----- 1 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/dlls/hhctrl.ocx/content.c b/dlls/hhctrl.ocx/content.c index 2dad7c8..9f468a2 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);