[PATCH] Implement IXMLDOMAttribute get/put value

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Fri Nov 21 04:36:30 CST 2008


---
 dlls/msxml3/attribute.c    |    8 ++++----
 dlls/msxml3/node.c         |   21 +++++++++++++++------
 dlls/msxml3/tests/domdoc.c |   30 ++++++++++++++++++++++++++++++
 3 files changed, 49 insertions(+), 10 deletions(-)

diff --git a/dlls/msxml3/attribute.c b/dlls/msxml3/attribute.c
index 2681a76..92cafad 100644
--- a/dlls/msxml3/attribute.c
+++ b/dlls/msxml3/attribute.c
@@ -482,16 +482,16 @@ static HRESULT WINAPI domattr_get_value(
     IXMLDOMAttribute *iface,
     VARIANT *var1)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    domattr *This = impl_from_IXMLDOMAttribute( iface );
+    return IXMLDOMNode_get_nodeValue( This->node, var1 );
 }
 
 static HRESULT WINAPI domattr_put_value(
     IXMLDOMAttribute *iface,
     VARIANT var1)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    domattr *This = impl_from_IXMLDOMAttribute( iface );
+    return IXMLDOMNode_put_nodeValue( This->node, var1 );
 }
 
 static const struct IXMLDOMAttributeVtbl domattr_vtbl =
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 19cee8f..6693803 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -339,13 +339,22 @@ static HRESULT WINAPI xmlnode_put_nodeValue(
 
     TRACE("%p type(%d)\n", This, This->node->type);
 
-    VariantInit(&string_value);
-    hr = VariantChangeType(&string_value, &value, 0, VT_BSTR);
-    if(FAILED(hr))
+    /* Attribute nodes treat NULL Variants as empty strings. */
+    if(V_VT(&value) == VT_NULL && This->node->type == XML_ATTRIBUTE_NODE)
     {
-        VariantClear(&string_value);
-        WARN("Couldn't convert to VT_BSTR\n");
-        return hr;
+        V_VT(&string_value) = VT_BSTR;
+        V_BSTR(&string_value) = SysAllocStringLen(NULL, 0);
+    }
+    else
+    {
+        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;
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index e27c506..c975d73 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -2796,12 +2796,18 @@ static void test_xmlTypes(void)
                 ok( V_VT(&v) == VT_NULL, "incorrect dataType type\n");
                 VariantClear(&v);
 
+                V_VT(&v) = VT_NULL;
+                V_I4(&v) = 0;
+                hr = IXMLDOMElement_put_nodeValue(pElement, v);
+                ok(hr == DISP_E_TYPEMISMATCH, "ret %08x\n", hr );
+
                  /* Attribute */
                 hr = IXMLDOMDocument_createAttribute(doc, szAttribute, &pAttrubute);
                 ok(hr == S_OK, "ret %08x\n", hr );
                 if(hr == S_OK)
                 {
                     IXMLDOMNode *pNewChild = (IXMLDOMNode *)0x1;
+                    IXMLDOMNode *pAttrNode = NULL;
 
                     hr = IXMLDOMAttribute_get_nextSibling(pAttrubute, NULL);
                     ok(hr == E_INVALIDARG, "ret %08x\n", hr );
@@ -2876,6 +2882,30 @@ static void test_xmlTypes(void)
                     ok( V_VT(&v) == VT_NULL, "incorrect dataType type\n");
                     VariantClear(&v);
 
+                    /* test value */
+                    V_VT(&v) = VT_NULL;
+                    VariantClear(&v);
+                    hr = IXMLDOMAttribute_put_value(pAttrubute, v);
+                    ok(hr == S_OK, "ret %08x\n", hr );
+                    VariantClear(&v);
+
+                    hr = IXMLDOMAttribute_get_value(pAttrubute, &v);
+                    ok(hr == S_OK, "ret %08x\n", hr );
+                    ok( !lstrcmpW( V_BSTR(&v), _bstr_("") ), "incorrect get_value string\n");
+                    VariantClear(&v);
+                    
+                    IXMLDOMAttribute_QueryInterface(pAttrubute, &IID_IXMLDOMNode, (LPVOID*)&pAttrNode);
+                    if(hr == S_OK)
+                    {
+                        V_VT(&v) = VT_NULL;
+                        VariantClear(&v);
+                        hr = IXMLDOMNode_put_nodeValue(pAttrNode, v);
+                        ok(hr == S_OK, "ret %08x\n", hr );
+                        VariantClear(&v);
+
+                        IXMLDOMNode_Release(pAttrNode);
+                    }
+
                     IXMLDOMAttribute_Release(pAttrubute);
 
                     /* Check Element again with the Add Attribute*/
-- 
1.5.4.3


--------------090401060702090707020203--



More information about the wine-patches mailing list