Fix return value for IXMLDOMNode_put_nodeValue() for unsupported types

Nikolay Sivov bunglehead at gmail.com
Fri Feb 12 17:25:08 CST 2010


---
 dlls/msxml3/node.c         |   35 +++++++++++-----------
 dlls/msxml3/tests/domdoc.c |   68 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 86 insertions(+), 17 deletions(-)

diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 5691c52..54782f9 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -327,23 +327,11 @@ static HRESULT WINAPI xmlnode_put_nodeValue(
 {
     xmlnode *This = impl_from_IXMLDOMNode( iface );
     HRESULT hr;
-    xmlChar *str = NULL;
-    VARIANT string_value;
 
     TRACE("%p type(%d)\n", This, This->node->type);
 
-    VariantInit(&string_value);
-    hr = VariantChangeType(&string_value, &value, 0, VT_BSTR);
-    if(FAILED(hr))
-    {
-        VariantClear(&string_value);
-        WARN("Couldn't convert to VT_BSTR\n");
-        return hr;
-    }
-
-    hr = S_FALSE;
     /* Document, Document Fragment, Document Type, Element,
-        Entity, Entity Reference, Notation aren't supported. */
+       Entity, Entity Reference, Notation aren't supported. */
     switch ( This->node->type )
     {
     case XML_ATTRIBUTE_NODE:
@@ -351,20 +339,33 @@ static HRESULT WINAPI xmlnode_put_nodeValue(
     case XML_COMMENT_NODE:
     case XML_PI_NODE:
     case XML_TEXT_NODE:
-      {
+    {
+        VARIANT string_value;
+        xmlChar *str;
+
+        VariantInit(&string_value);
+        hr = VariantChangeType(&string_value, &value, 0, VT_BSTR);
+        if(FAILED(hr))
+        {
+            VariantClear(&string_value);
+            WARN("Couldn't convert to VT_BSTR\n");
+            return hr;
+        }
+
         str = xmlChar_from_wchar(V_BSTR(&string_value));
+        VariantClear(&string_value);
+
         xmlNodeSetContent(This->node, str);
         heap_free(str);
         hr = S_OK;
         break;
-      }
+    }
     default:
         /* Do nothing for unsupported types. */
+        hr = E_FAIL;
         break;
     }
 
-    VariantClear(&string_value);
-
     return hr;
 }
 
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index c6937e6..a4a3351 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -5000,6 +5000,73 @@ static void test_TransformWithLoadingLocalFile(void)
     free_bstrs();
 }
 
+static void test_put_nodeValue(void)
+{
+    IXMLDOMDocument *doc;
+    IXMLDOMEntityReference *entityref;
+    IXMLDOMNode *node;
+    HRESULT hr;
+    VARIANT data, type;
+
+    hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
+    if( hr != S_OK )
+        return;
+
+    /* test for unsupported types */
+    /* NODE_DOCUMENT */
+    hr = IXMLDOMDocument_QueryInterface(doc, &IID_IXMLDOMNode, (void**)&node);
+    ok(hr == S_OK, "ret %08x\n", hr );
+    V_VT(&data) = VT_BSTR;
+    V_BSTR(&data) = _bstr_("one two three");
+    hr = IXMLDOMNode_put_nodeValue(node, data);
+    ok(hr == E_FAIL, "ret %08x\n", hr );
+    IXMLDOMNode_Release(node);
+
+    /* NODE_DOCUMENT_FRAGMENT */
+    V_VT(&type) = VT_I1;
+    V_I1(&type) = NODE_DOCUMENT_FRAGMENT;
+    hr = IXMLDOMDocument_createNode(doc, type, _bstr_("test"), NULL, &node);
+    ok(hr == S_OK, "ret %08x\n", hr );
+    V_VT(&data) = VT_BSTR;
+    V_BSTR(&data) = _bstr_("one two three");
+    hr = IXMLDOMNode_put_nodeValue(node, data);
+    ok(hr == E_FAIL, "ret %08x\n", hr );
+    IXMLDOMNode_Release(node);
+
+    /* NODE_ELEMENT */
+    V_VT(&type) = VT_I1;
+    V_I1(&type) = NODE_ELEMENT;
+    hr = IXMLDOMDocument_createNode(doc, type, _bstr_("test"), NULL, &node);
+    ok(hr == S_OK, "ret %08x\n", hr );
+    V_VT(&data) = VT_BSTR;
+    V_BSTR(&data) = _bstr_("one two three");
+    hr = IXMLDOMNode_put_nodeValue(node, data);
+    ok(hr == E_FAIL, "ret %08x\n", hr );
+    IXMLDOMNode_Release(node);
+
+    /* NODE_ENTITY_REFERENCE */
+    hr = IXMLDOMDocument_createEntityReference(doc, _bstr_("ref"), &entityref);
+    ok(hr == S_OK, "ret %08x\n", hr );
+
+    V_VT(&data) = VT_BSTR;
+    V_BSTR(&data) = _bstr_("one two three");
+    hr = IXMLDOMEntityReference_put_nodeValue(node, data);
+    ok(hr == E_FAIL, "ret %08x\n", hr );
+
+    hr = IXMLDOMEntityReference_QueryInterface(entityref, &IID_IXMLDOMNode, (void**)&node);
+    ok(hr == S_OK, "ret %08x\n", hr );
+    V_VT(&data) = VT_BSTR;
+    V_BSTR(&data) = _bstr_("one two three");
+    hr = IXMLDOMNode_put_nodeValue(node, data);
+    ok(hr == E_FAIL, "ret %08x\n", hr );
+    IXMLDOMNode_Release(node);
+    IXMLDOMEntityReference_Release(entityref);    
+
+    free_bstrs();
+
+    IXMLDOMDocument_Release(doc);
+}
+
 START_TEST(domdoc)
 {
     HRESULT r;
@@ -5030,6 +5097,7 @@ START_TEST(domdoc)
     test_FormattingXML();
     test_NodeTypeValue();
     test_TransformWithLoadingLocalFile();
+    test_put_nodeValue();
 
     CoUninitialize();
 }
-- 
1.5.6.5


--=-a2AXagpPDeXTVxMMmXHe--




More information about the wine-patches mailing list