Nikolay Sivov : msxml3: Encode special characters while setting attribute content.

Alexandre Julliard julliard at winehq.org
Fri Nov 5 13:47:16 CDT 2010


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Nov  4 18:35:58 2010 +0300

msxml3: Encode special characters while setting attribute content.

---

 dlls/msxml3/attribute.c     |    2 +-
 dlls/msxml3/msxml_private.h |    1 +
 dlls/msxml3/node.c          |   41 +++++++++++++++++++++++++++++++++++++++++
 dlls/msxml3/tests/domdoc.c  |   25 +++++++++++++++++++++++++
 4 files changed, 68 insertions(+), 1 deletions(-)

diff --git a/dlls/msxml3/attribute.c b/dlls/msxml3/attribute.c
index 34cc007..e7e8f48 100644
--- a/dlls/msxml3/attribute.c
+++ b/dlls/msxml3/attribute.c
@@ -207,7 +207,7 @@ static HRESULT WINAPI domattr_put_nodeValue(
 
     TRACE("(%p)->(v%d)\n", This, V_VT(&value));
 
-    return node_put_value(&This->node, &value);
+    return node_put_value_escaped(&This->node, &value);
 }
 
 static HRESULT WINAPI domattr_get_nodeType(
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index 4be8c1d..4af9bca 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -184,6 +184,7 @@ extern HRESULT node_get_nodeName(xmlnode*,BSTR*);
 extern HRESULT node_get_content(xmlnode*,VARIANT*);
 extern HRESULT node_set_content(xmlnode*,LPCWSTR);
 extern HRESULT node_put_value(xmlnode*,VARIANT*);
+extern HRESULT node_put_value_escaped(xmlnode*,VARIANT*);
 extern HRESULT node_get_parent(xmlnode*,IXMLDOMNode**);
 extern HRESULT node_get_child_nodes(xmlnode*,IXMLDOMNodeList**);
 extern HRESULT node_get_first_child(xmlnode*,IXMLDOMNode**);
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 3220800..9aafa83 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -151,6 +151,29 @@ HRESULT node_set_content(xmlnode *This, LPCWSTR value)
     return S_OK;
 }
 
+static HRESULT node_set_content_escaped(xmlnode *This, LPCWSTR value)
+{
+    xmlChar *str, *escaped;
+
+    str = xmlChar_from_wchar(value);
+    if(!str)
+        return E_OUTOFMEMORY;
+
+    escaped = xmlEncodeSpecialChars(NULL, str);
+    if(!escaped)
+    {
+        heap_free(str);
+        return E_OUTOFMEMORY;
+    }
+
+    xmlNodeSetContent(This->node, escaped);
+
+    heap_free(str);
+    xmlFree(escaped);
+
+    return S_OK;
+}
+
 HRESULT node_put_value(xmlnode *This, VARIANT *value)
 {
     VARIANT string_value;
@@ -169,6 +192,24 @@ HRESULT node_put_value(xmlnode *This, VARIANT *value)
     return S_OK;
 }
 
+HRESULT node_put_value_escaped(xmlnode *This, VARIANT *value)
+{
+    VARIANT string_value;
+    HRESULT hr;
+
+    VariantInit(&string_value);
+    hr = VariantChangeType(&string_value, value, 0, VT_BSTR);
+    if(FAILED(hr)) {
+        WARN("Couldn't convert to VT_BSTR\n");
+        return hr;
+    }
+
+    hr = node_set_content_escaped(This, V_BSTR(&string_value));
+    VariantClear(&string_value);
+
+    return S_OK;
+}
+
 static HRESULT get_node(
     xmlnode *This,
     const char *name,
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 9a6d202..e8f0102 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -6056,8 +6056,11 @@ static void test_TransformWithLoadingLocalFile(void)
 
 static void test_put_nodeValue(void)
 {
+    static const WCHAR jeevesW[] = {'J','e','e','v','e','s',' ','&',' ','W','o','o','s','t','e','r',0};
     IXMLDOMDocument *doc;
+    IXMLDOMText *text;
     IXMLDOMEntityReference *entityref;
+    IXMLDOMAttribute *attr;
     IXMLDOMNode *node;
     HRESULT hr;
     VARIANT data, type;
@@ -6115,6 +6118,28 @@ static void test_put_nodeValue(void)
     IXMLDOMNode_Release(node);
     IXMLDOMEntityReference_Release(entityref);
 
+    /* supported types */
+    hr = IXMLDOMDocument_createTextNode(doc, _bstr_(""), &text);
+    ok(hr == S_OK, "ret %08x\n", hr );
+    V_VT(&data) = VT_BSTR;
+    V_BSTR(&data) = _bstr_("Jeeves & Wooster");
+    hr = IXMLDOMText_put_nodeValue(text, data);
+    ok(hr == S_OK, "ret %08x\n", hr );
+    IXMLDOMText_Release(text);
+
+    hr = IXMLDOMDocument_createAttribute(doc, _bstr_("attr"), &attr);
+    ok(hr == S_OK, "ret %08x\n", hr );
+    V_VT(&data) = VT_BSTR;
+    V_BSTR(&data) = _bstr_("Jeeves & Wooster");
+    hr = IXMLDOMAttribute_put_nodeValue(attr, data);
+    ok(hr == S_OK, "ret %08x\n", hr );
+    hr = IXMLDOMAttribute_get_nodeValue(attr, &data);
+    ok(hr == S_OK, "ret %08x\n", hr );
+    ok(memcmp(V_BSTR(&data), jeevesW, sizeof(jeevesW)) == 0, "got %s\n",
+        wine_dbgstr_w(V_BSTR(&data)));
+    VariantClear(&data);
+    IXMLDOMAttribute_Release(attr);
+
     free_bstrs();
 
     IXMLDOMDocument_Release(doc);




More information about the wine-cvs mailing list