[PATCH 3/4] Implement a trivial case of ::put_nodeTypedValue()

Nikolay Sivov nsivov at codeweavers.com
Sat Oct 16 10:49:27 CDT 2010


---
 dlls/msxml3/attribute.c     |    4 ++--
 dlls/msxml3/cdata.c         |    4 ++--
 dlls/msxml3/comment.c       |    4 ++--
 dlls/msxml3/docfrag.c       |    4 ++--
 dlls/msxml3/domdoc.c        |    4 ++--
 dlls/msxml3/element.c       |    4 ++--
 dlls/msxml3/entityref.c     |    4 ++--
 dlls/msxml3/msxml_private.h |    1 +
 dlls/msxml3/node.c          |   34 ++++++++++++++++++++++++++++++++--
 dlls/msxml3/pi.c            |    4 ++--
 dlls/msxml3/tests/domdoc.c  |   43 +++++++++++++++++++++++++++++++++++++++++++
 dlls/msxml3/text.c          |    4 ++--
 12 files changed, 94 insertions(+), 20 deletions(-)

diff --git a/dlls/msxml3/attribute.c b/dlls/msxml3/attribute.c
index da3f78d..ec761e5 100644
--- a/dlls/msxml3/attribute.c
+++ b/dlls/msxml3/attribute.c
@@ -414,10 +414,10 @@ static HRESULT WINAPI domattr_get_nodeTypedValue(
 
 static HRESULT WINAPI domattr_put_nodeTypedValue(
     IXMLDOMAttribute *iface,
-    VARIANT var1)
+    VARIANT value)
 {
     domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
+    return node_put_typedvalue( &This->node, value );
 }
 
 static HRESULT WINAPI domattr_get_dataType(
diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c
index 193fc8a..fdb3b45 100644
--- a/dlls/msxml3/cdata.c
+++ b/dlls/msxml3/cdata.c
@@ -425,10 +425,10 @@ static HRESULT WINAPI domcdata_get_nodeTypedValue(
 
 static HRESULT WINAPI domcdata_put_nodeTypedValue(
     IXMLDOMCDATASection *iface,
-    VARIANT var1)
+    VARIANT value)
 {
     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
+    return node_put_typedvalue( &This->node, value );
 }
 
 static HRESULT WINAPI domcdata_get_dataType(
diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c
index 2d669bc..e98eb66 100644
--- a/dlls/msxml3/comment.c
+++ b/dlls/msxml3/comment.c
@@ -418,10 +418,10 @@ static HRESULT WINAPI domcomment_get_nodeTypedValue(
 
 static HRESULT WINAPI domcomment_put_nodeTypedValue(
     IXMLDOMComment *iface,
-    VARIANT var1)
+    VARIANT value)
 {
     domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
+    return node_put_typedvalue( &This->node, value );
 }
 
 static HRESULT WINAPI domcomment_get_dataType(
diff --git a/dlls/msxml3/docfrag.c b/dlls/msxml3/docfrag.c
index e91486e..c8ccb02 100644
--- a/dlls/msxml3/docfrag.c
+++ b/dlls/msxml3/docfrag.c
@@ -422,10 +422,10 @@ static HRESULT WINAPI domfrag_get_nodeTypedValue(
 
 static HRESULT WINAPI domfrag_put_nodeTypedValue(
     IXMLDOMDocumentFragment *iface,
-    VARIANT var1)
+    VARIANT value)
 {
     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
+    return node_put_typedvalue( &This->node, value );
 }
 
 static HRESULT WINAPI domfrag_get_dataType(
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index 0329fac..77cd8a4 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -1140,10 +1140,10 @@ static HRESULT WINAPI domdoc_get_nodeTypedValue(
 
 static HRESULT WINAPI domdoc_put_nodeTypedValue(
     IXMLDOMDocument3 *iface,
-    VARIANT typedValue )
+    VARIANT value )
 {
     domdoc *This = impl_from_IXMLDOMDocument3( iface );
-    return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), typedValue );
+    return node_put_typedvalue( &This->node, value );
 }
 
 
diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c
index ed4e273..c4fd389 100644
--- a/dlls/msxml3/element.c
+++ b/dlls/msxml3/element.c
@@ -430,10 +430,10 @@ static HRESULT WINAPI domelem_get_nodeTypedValue(
 
 static HRESULT WINAPI domelem_put_nodeTypedValue(
     IXMLDOMElement *iface,
-    VARIANT var1)
+    VARIANT value)
 {
     domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
+    return node_put_typedvalue( &This->node, value );
 }
 
 static HRESULT WINAPI domelem_get_dataType(
diff --git a/dlls/msxml3/entityref.c b/dlls/msxml3/entityref.c
index 0b23363..2ad37ea 100644
--- a/dlls/msxml3/entityref.c
+++ b/dlls/msxml3/entityref.c
@@ -416,10 +416,10 @@ static HRESULT WINAPI entityref_get_nodeTypedValue(
 
 static HRESULT WINAPI entityref_put_nodeTypedValue(
     IXMLDOMEntityReference *iface,
-    VARIANT var1)
+    VARIANT value)
 {
     entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
+    return node_put_typedvalue( &This->node, value );
 }
 
 static HRESULT WINAPI entityref_get_dataType(
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index 10e8376..8e331fd 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -172,6 +172,7 @@ extern HRESULT node_insert_before(xmlnode*,IXMLDOMNode*,const VARIANT*,IXMLDOMNo
 extern HRESULT node_replace_child(xmlnode*,IXMLDOMNode*,IXMLDOMNode*,IXMLDOMNode**);
 extern HRESULT node_get_datatype(xmlnode*,VARIANT*);
 extern HRESULT node_put_text(xmlnode*,BSTR);
+extern HRESULT node_put_typedvalue(xmlnode*,VARIANT);
 
 extern HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument3 **document);
 
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 375b9ef..76f84e6 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -1008,11 +1008,41 @@ static HRESULT WINAPI xmlnode_put_nodeTypedValue(
     IXMLDOMNode *iface,
     VARIANT typedValue)
 {
-    xmlnode *This = impl_from_IXMLDOMNode( iface );
-    FIXME("%p\n", This);
+    ERR("Should not be called\n");
     return E_NOTIMPL;
 }
 
+HRESULT node_put_typedvalue(xmlnode *This, VARIANT value)
+{
+    VARIANT type;
+    HRESULT hr;
+
+    TRACE("(%p)", This);
+
+    /* for untyped nodes coerce to BSTR and set */
+    if (node_get_datatype(This, &type) == S_FALSE)
+    {
+        if (V_VT(&value) != VT_BSTR)
+        {
+            hr = VariantChangeType(&value, &value, 0, VT_BSTR);
+            if (hr == S_OK)
+            {
+                hr = node_put_text(This, V_BSTR(&value));
+                VariantClear(&value);
+            }
+        }
+        else
+            hr = node_put_text(This, V_BSTR(&value));
+    }
+    else
+    {
+        FIXME("not implemented for typed nodes\n");
+        return E_NOTIMPL;
+    }
+
+    return hr;
+}
+
 HRESULT node_get_datatype(xmlnode *This, VARIANT *typename)
 {
     TRACE("(%p)->(%p)\n", This, typename);
diff --git a/dlls/msxml3/pi.c b/dlls/msxml3/pi.c
index 671370b..fc0c0e6 100644
--- a/dlls/msxml3/pi.c
+++ b/dlls/msxml3/pi.c
@@ -432,10 +432,10 @@ static HRESULT WINAPI dom_pi_get_nodeTypedValue(
 
 static HRESULT WINAPI dom_pi_put_nodeTypedValue(
     IXMLDOMProcessingInstruction *iface,
-    VARIANT var1)
+    VARIANT value)
 {
     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
+    return node_put_typedvalue( &This->node, value );
 }
 
 static HRESULT WINAPI dom_pi_get_dataType(
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index fd56c61..a4db4d9 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -7088,6 +7088,48 @@ static void test_selectSingleNode(void)
     free_bstrs();
 }
 
+static void test_put_nodeTypedValue(void)
+{
+    IXMLDOMDocument *doc;
+    IXMLDOMElement *elem;
+    VARIANT type;
+    HRESULT hr;
+
+    doc = create_document(&IID_IXMLDOMDocument);
+    if (!doc) return;
+
+    hr = IXMLDOMDocument_createElement(doc, _bstr_("Element"), &elem);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    V_VT(&type) = VT_EMPTY;
+    hr = IXMLDOMElement_get_dataType(elem, &type);
+    ok(hr == S_FALSE, "got 0x%08x\n", hr);
+    ok(V_VT(&type) == VT_NULL, "got %d, expected VT_NULL\n", V_VT(&type));
+
+    /* set typed value for untyped node */
+    V_VT(&type) = VT_I1;
+    V_I1(&type) = 1;
+    hr = IXMLDOMElement_put_nodeTypedValue(elem, type);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    V_VT(&type) = VT_EMPTY;
+    hr = IXMLDOMElement_get_dataType(elem, &type);
+    ok(hr == S_FALSE, "got 0x%08x\n", hr);
+    ok(V_VT(&type) == VT_NULL, "got %d, expected VT_NULL\n", V_VT(&type));
+
+    /* no type info stored */
+    V_VT(&type) = VT_EMPTY;
+    hr = IXMLDOMElement_get_nodeTypedValue(elem, &type);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(V_VT(&type) == VT_BSTR, "got %d, expected VT_BSTR\n", V_VT(&type));
+    ok(memcmp(V_BSTR(&type), _bstr_("1"), 2*sizeof(WCHAR)) == 0,
+       "got %s, expected \"1\"\n", wine_dbgstr_w(V_BSTR(&type)));
+    VariantClear(&type);
+
+    IXMLDOMDocument_Release(doc);
+    free_bstrs();
+}
+
 START_TEST(domdoc)
 {
     IXMLDOMDocument *doc;
@@ -7148,6 +7190,7 @@ START_TEST(domdoc)
     test_get_prefix();
     test_default_properties();
     test_selectSingleNode();
+    test_put_nodeTypedValue();
 
     CoUninitialize();
 }
diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c
index 5929172..78c2696 100644
--- a/dlls/msxml3/text.c
+++ b/dlls/msxml3/text.c
@@ -431,10 +431,10 @@ static HRESULT WINAPI domtext_get_nodeTypedValue(
 
 static HRESULT WINAPI domtext_put_nodeTypedValue(
     IXMLDOMText *iface,
-    VARIANT var1)
+    VARIANT value)
 {
     domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
+    return node_put_typedvalue( &This->node, value );
 }
 
 static HRESULT WINAPI domtext_get_dataType(
-- 
1.5.6.5



--------------040803070800080101070809--



More information about the wine-patches mailing list