[03/13] msxml3: IXMLDOMNode_put_nodeValue: Use variant coercion

Michael Karcher wine at mkarcher.dialup.fu-berlin.de
Sat Oct 11 16:58:11 CDT 2008


Tests pass on Wine and XP SP3.
---
 dlls/msxml3/node.c         |   18 +++++++++++++++---
 dlls/msxml3/tests/domdoc.c |   24 ++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 7056ca3..d7eb675 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -344,11 +344,22 @@ static HRESULT WINAPI xmlnode_put_nodeValue(
     VARIANT value)
 {
     xmlnode *This = impl_from_IXMLDOMNode( iface );
-    HRESULT hr = S_FALSE;
+    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. */
     switch ( This->node->type )
@@ -359,8 +370,7 @@ static HRESULT WINAPI xmlnode_put_nodeValue(
     case XML_PI_NODE:
     case XML_TEXT_NODE:
       {
-        str = xmlChar_from_wchar((WCHAR*)V_BSTR(&value));
-
+        str = xmlChar_from_wchar((WCHAR*)V_BSTR(&string_value));
         xmlNodeSetContent(This->node, str);
         hr = S_OK;
         break;
@@ -370,6 +380,8 @@ static HRESULT WINAPI xmlnode_put_nodeValue(
         break;
     }
 
+    VariantClear(&string_value);
+
     return hr;
 }
 
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index dda9fbb..fa82a8a 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -724,6 +724,30 @@ static void test_domdoc( void )
         ok( !lstrcmpW( str, _bstr_("Begin This &is a Middle; test <>\\Append End") ), "incorrect get_text string\n");
         SysFreeString(str);
 
+        /* test put_data */
+        V_VT(&var) = VT_BSTR;
+        V_BSTR(&var) = SysAllocString(szstr1);
+        r = IXMLDOMText_put_nodeValue(nodetext, var);
+        ok(r == S_OK, "ret %08x\n", r );
+        VariantClear(&var);
+
+        r = IXMLDOMText_get_text(nodetext, &str);
+        ok(r == S_OK, "ret %08x\n", r );
+        ok( !lstrcmpW( str, szstr1 ), "incorrect get_text string\n");
+        SysFreeString(str);
+
+        /* test put_data */
+        V_VT(&var) = VT_I4;
+        V_I4(&var) = 99;
+        r = IXMLDOMText_put_nodeValue(nodetext, var);
+        ok(r == S_OK, "ret %08x\n", r );
+        VariantClear(&var);
+
+        r = IXMLDOMText_get_text(nodetext, &str);
+        ok(r == S_OK, "ret %08x\n", r );
+        ok( !lstrcmpW( str, _bstr_("99") ), "incorrect get_text string\n");
+        SysFreeString(str);
+
         IXMLDOMText_Release( nodetext );
     }
 
-- 
1.5.6.5




More information about the wine-patches mailing list