msxml: implement setAttribute

Huw D M Davies h.davies1 at physics.ox.ac.uk
Mon Jan 16 11:01:03 CST 2006


Sorry, use this one instead.

        Huw Davies <huw at codeweavers.com>
        msxml: implement setAttribute
-- 
Huw Davies
huw at codeweavers.com
diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c
index 38c3591..bfb9d0f 100644
--- a/dlls/msxml3/element.c
+++ b/dlls/msxml3/element.c
@@ -484,10 +484,39 @@ static HRESULT WINAPI domelem_getAttribu
 
 static HRESULT WINAPI domelem_setAttribute(
     IXMLDOMElement *iface,
-    BSTR p, VARIANT var)
+    BSTR name, VARIANT value)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    domelem *This = impl_from_IXMLDOMElement( iface );
+    xmlNodePtr element;
+    xmlChar *xml_name, *xml_value;
+    HRESULT hr;
+    VARIANT var;
+
+    TRACE("(%p)->(%s, var)\n", This, debugstr_w(name));
+
+    element = get_element( This );
+    if ( !element )
+        return E_FAIL;
+
+    VariantInit(&var);
+    hr = VariantChangeType(&var, &value, 0, VT_BSTR);
+    if(hr != S_OK)
+    {
+        FIXME("VariantChangeType failed\n");
+        return hr;
+    }
+
+    xml_name = xmlChar_from_wchar( name );
+    xml_value = xmlChar_from_wchar( V_BSTR(&var) );
+
+    if(!xmlSetNsProp(element, NULL,  xml_name, xml_value))
+        hr = E_FAIL;
+
+    HeapFree(GetProcessHeap(), 0, xml_value);
+    HeapFree(GetProcessHeap(), 0, xml_name);
+    VariantClear(&var);
+
+    return hr;
 }
 
 static HRESULT WINAPI domelem_removeAttribute(
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 098b428..6bf26cb 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -72,6 +72,7 @@ static const WCHAR szdl[] = { 'd','l',0 
 static const WCHAR szlc[] = { 'l','c',0 };
 static const WCHAR szbs[] = { 'b','s',0 };
 static const WCHAR szstr1[] = { 's','t','r','1',0 };
+static const WCHAR szstr2[] = { 's','t','r','2',0 };
 
 void test_domdoc( void )
 {
@@ -622,11 +623,13 @@ static void test_create(void)
 {
     HRESULT r;
     VARIANT var;
-    BSTR str;
+    BSTR str, name;
     IXMLDOMDocument *doc;
+    IXMLDOMElement *element;
     IXMLDOMNode *root, *node, *child;
+    IXMLDOMNamedNodeMap *attr_map;
     IUnknown *unk;
-    LONG ref;
+    LONG ref, num;
 
     r = CoCreateInstance( &CLSID_DOMDocument, NULL, 
         CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
@@ -682,6 +685,75 @@ static void test_create(void)
     ok( node == child, "%p %p\n", node, child );
     IXMLDOMNode_Release( child );
     IXMLDOMNode_Release( node );
+
+
+    r = IXMLDOMNode_QueryInterface( root, &IID_IXMLDOMElement, (LPVOID*)&element );
+    ok( r == S_OK, "returns %08lx\n", r );
+
+    r = IXMLDOMElement_get_attributes( element, &attr_map );
+    ok( r == S_OK, "returns %08lx\n", r );
+    r = IXMLDOMNamedNodeMap_get_length( attr_map, &num );
+    ok( r == S_OK, "returns %08lx\n", r );
+    ok( num == 0, "num %ld\n", num );
+    IXMLDOMNamedNodeMap_Release( attr_map );
+
+    V_VT(&var) = VT_BSTR;
+    V_BSTR(&var) = SysAllocString( szstr1 );
+    name = SysAllocString( szdl );
+    r = IXMLDOMElement_setAttribute( element, name, var );
+    ok( r == S_OK, "returns %08lx\n", r );
+    r = IXMLDOMElement_get_attributes( element, &attr_map );
+    ok( r == S_OK, "returns %08lx\n", r );
+    r = IXMLDOMNamedNodeMap_get_length( attr_map, &num );
+    ok( r == S_OK, "returns %08lx\n", r );
+    ok( num == 1, "num %ld\n", num );
+    IXMLDOMNamedNodeMap_Release( attr_map );
+    VariantClear(&var);
+
+    V_VT(&var) = VT_BSTR;
+    V_BSTR(&var) = SysAllocString( szstr2 );
+    r = IXMLDOMElement_setAttribute( element, name, var );
+    ok( r == S_OK, "returns %08lx\n", r );
+    r = IXMLDOMElement_get_attributes( element, &attr_map );
+    ok( r == S_OK, "returns %08lx\n", r );
+    r = IXMLDOMNamedNodeMap_get_length( attr_map, &num );
+    ok( r == S_OK, "returns %08lx\n", r );
+    ok( num == 1, "num %ld\n", num );
+    IXMLDOMNamedNodeMap_Release( attr_map );
+    VariantClear(&var);
+    r = IXMLDOMElement_getAttribute( element, name, &var );
+    ok( r == S_OK, "returns %08lx\n", r );
+    ok( !lstrcmpW(V_BSTR(&var), szstr2), "wrong attr value\n");
+    VariantClear(&var);
+    SysFreeString(name);
+
+    V_VT(&var) = VT_BSTR;
+    V_BSTR(&var) = SysAllocString( szstr1 );
+    name = SysAllocString( szlc );
+    r = IXMLDOMElement_setAttribute( element, name, var );
+    ok( r == S_OK, "returns %08lx\n", r );
+    r = IXMLDOMElement_get_attributes( element, &attr_map );
+    ok( r == S_OK, "returns %08lx\n", r );
+    r = IXMLDOMNamedNodeMap_get_length( attr_map, &num );
+    ok( r == S_OK, "returns %08lx\n", r );
+    ok( num == 2, "num %ld\n", num );
+    IXMLDOMNamedNodeMap_Release( attr_map );
+    VariantClear(&var);
+    SysFreeString(name);
+
+    V_VT(&var) = VT_I4;
+    V_I4(&var) = 10;
+    name = SysAllocString( szbs );
+    r = IXMLDOMElement_setAttribute( element, name, var );
+    ok( r == S_OK, "returns %08lx\n", r );
+    VariantClear(&var);
+    r = IXMLDOMElement_getAttribute( element, name, &var );
+    ok( r == S_OK, "returns %08lx\n", r );
+    ok( V_VT(&var) == VT_BSTR, "variant type %x\n", V_VT(&var));
+    VariantClear(&var);
+    SysFreeString(name);
+
+    IXMLDOMElement_Release( element );
     IXMLDOMNode_Release( root );
     IXMLDOMDocument_Release( doc );
 }



More information about the wine-patches mailing list