Erich Hoover : hhctrl.ocx: Fix parsing of some TOC topics that reference other files.

Alexandre Julliard julliard at winehq.org
Wed Feb 15 13:14:05 CST 2012


Module: wine
Branch: master
Commit: 98f0be8dc3d70cde04cf6e93c5338775a66c24aa
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=98f0be8dc3d70cde04cf6e93c5338775a66c24aa

Author: Erich Hoover <ehoover at 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);




More information about the wine-cvs mailing list