Module: wine Branch: master Commit: 88adaa06179703c567427f6bc744a658df60cd29 URL: http://source.winehq.org/git/wine.git/?a=commit;h=88adaa06179703c567427f6bc7...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Thu Oct 21 02:07:20 2010 +0400
msxml3: Partially implement ::setAttributeNode().
---
dlls/msxml3/element.c | 57 +++++++++++++++++++++++++++++++++++++++---- dlls/msxml3/tests/domdoc.c | 19 ++++++++++---- 2 files changed, 65 insertions(+), 11 deletions(-)
diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c index a3834ff..8e33dd2 100644 --- a/dlls/msxml3/element.c +++ b/dlls/msxml3/element.c @@ -50,7 +50,7 @@ static inline domelem *impl_from_IXMLDOMElement( IXMLDOMElement *iface ) return (domelem *)((char*)iface - FIELD_OFFSET(domelem, lpVtbl)); }
-static inline xmlNodePtr get_element( domelem *This ) +static inline xmlNodePtr get_element( const domelem *This ) { return This->node.node; } @@ -705,16 +705,61 @@ static HRESULT WINAPI domelem_getAttributeNode(
static HRESULT WINAPI domelem_setAttributeNode( IXMLDOMElement *iface, - IXMLDOMAttribute* domAttribute, - IXMLDOMAttribute** attributeNode) + IXMLDOMAttribute* attribute, + IXMLDOMAttribute** old) { domelem *This = impl_from_IXMLDOMElement( iface ); + xmlChar *name, *value; + BSTR nameW, prefix; + xmlAttrPtr attr; + VARIANT valueW; + HRESULT hr;
- FIXME("(%p)->(%p %p)\n", This, domAttribute, attributeNode); + FIXME("(%p)->(%p %p): semi-stub\n", This, attribute, old);
- if(!domAttribute) return E_INVALIDARG; + if (!attribute) return E_INVALIDARG;
- return E_NOTIMPL; + if (old) *old = NULL; + + hr = IXMLDOMAttribute_get_nodeName(attribute, &nameW); + if (hr != S_OK) return hr; + + hr = IXMLDOMAttribute_get_nodeValue(attribute, &valueW); + if (hr != S_OK) + { + SysFreeString(nameW); + return hr; + } + + TRACE("attribute: %s=%s\n", debugstr_w(nameW), debugstr_w(V_BSTR(&valueW))); + + hr = IXMLDOMAttribute_get_prefix(attribute, &prefix); + if (hr == S_OK) + { + FIXME("namespaces not supported: %s\n", debugstr_w(prefix)); + SysFreeString(prefix); + } + + name = xmlChar_from_wchar(nameW); + value = xmlChar_from_wchar(V_BSTR(&valueW)); + + if (!name || !value) + { + SysFreeString(nameW); + VariantClear(&valueW); + heap_free(name); + heap_free(value); + return E_OUTOFMEMORY; + } + + attr = xmlSetNsProp(get_element(This), NULL, name, value); + + SysFreeString(nameW); + VariantClear(&valueW); + heap_free(name); + heap_free(value); + + return attr ? S_OK : E_FAIL; }
static HRESULT WINAPI domelem_removeAttributeNode( diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index fd56c61..d7d94e6 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -6853,20 +6853,29 @@ static void test_setAttributeNode(void)
ret_attr = (void*)0xdeadbeef; hr = IXMLDOMElement_setAttributeNode(elem, attr, &ret_attr); - todo_wine ok( hr == S_OK, "got 0x%08x\n", hr); - todo_wine ok( ret_attr == NULL, "got %p\n", ret_attr); + ok( hr == S_OK, "got 0x%08x\n", hr); + ok( ret_attr == NULL, "got %p\n", ret_attr);
attr2 = NULL; hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("attr"), &attr2); - todo_wine ok( hr == S_OK, "got 0x%08x\n", hr); - if (attr2) IXMLDOMAttribute_Release(attr2); + ok( hr == S_OK, "got 0x%08x\n", hr); + IXMLDOMAttribute_Release(attr2);
/* try to add it another time */ ret_attr = (void*)0xdeadbeef; hr = IXMLDOMElement_setAttributeNode(elem, attr, &ret_attr); todo_wine ok( hr == E_FAIL, "got 0x%08x\n", hr); - ok( ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr); + todo_wine ok( ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr); + + IXMLDOMElement_Release(elem);
+ /* initialy used element is released, attribute still 'has' a container */ + hr = IXMLDOMDocument_get_documentElement(doc, &elem); + ok( hr == S_OK, "got 0x%08x\n", hr); + ret_attr = (void*)0xdeadbeef; + hr = IXMLDOMElement_setAttributeNode(elem, attr, &ret_attr); + todo_wine ok( hr == E_FAIL, "got 0x%08x\n", hr); + todo_wine ok( ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr); IXMLDOMElement_Release(elem);
/* add attribute already attached to another document */