Nikolay Sivov : msxml3: Implement IXMLDOMNamedNodeMap::getQualifiedItem().
Alexandre Julliard
julliard at winehq.org
Fri Sep 3 10:07:09 CDT 2010
Module: wine
Branch: master
Commit: 0330332aefb4f9a89c6ec2d4054f9421b5800591
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0330332aefb4f9a89c6ec2d4054f9421b5800591
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Sep 3 12:13:29 2010 +0400
msxml3: Implement IXMLDOMNamedNodeMap::getQualifiedItem().
---
dlls/msxml3/nodemap.c | 83 ++++++++++++++++++++++++-------------------
dlls/msxml3/tests/domdoc.c | 66 ++++++++++++++++++++++++++++++++++-
2 files changed, 111 insertions(+), 38 deletions(-)
diff --git a/dlls/msxml3/nodemap.c b/dlls/msxml3/nodemap.c
index 3f2ee47..791a771 100644
--- a/dlls/msxml3/nodemap.c
+++ b/dlls/msxml3/nodemap.c
@@ -127,13 +127,8 @@ static HRESULT WINAPI xmlnodemap_GetTypeInfo(
ITypeInfo** ppTInfo )
{
xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface );
- HRESULT hr;
-
TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
-
- hr = get_typeinfo(IXMLDOMNamedNodeMap_tid, ppTInfo);
-
- return hr;
+ return get_typeinfo(IXMLDOMNamedNodeMap_tid, ppTInfo);
}
static HRESULT WINAPI xmlnodemap_GetIDsOfNames(
@@ -203,32 +198,8 @@ static HRESULT WINAPI xmlnodemap_getNamedItem(
IXMLDOMNode** namedItem)
{
xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface );
- xmlChar *element_name;
- xmlAttrPtr attr;
- xmlNodePtr node;
-
TRACE("(%p)->(%s %p)\n", This, debugstr_w(name), namedItem );
-
- if ( !namedItem )
- return E_INVALIDARG;
-
- node = xmlNodePtr_from_domnode( This->node, 0 );
- if ( !node )
- return E_FAIL;
-
- element_name = xmlChar_from_wchar( name );
- attr = xmlHasNsProp( node, element_name, NULL );
- heap_free( element_name );
-
- if ( !attr )
- {
- *namedItem = NULL;
- return S_FALSE;
- }
-
- *namedItem = create_node( (xmlNodePtr) attr );
-
- return S_OK;
+ return IXMLDOMNamedNodeMap_getQualifiedItem(iface, name, NULL, namedItem);
}
static HRESULT WINAPI xmlnodemap_setNamedItem(
@@ -237,7 +208,6 @@ static HRESULT WINAPI xmlnodemap_setNamedItem(
IXMLDOMNode** namedItem)
{
xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface );
- xmlnode *ThisNew = NULL;
xmlNodePtr nodeNew;
IXMLDOMNode *pAttr = NULL;
xmlNodePtr node;
@@ -254,10 +224,10 @@ static HRESULT WINAPI xmlnodemap_setNamedItem(
return E_FAIL;
/* Must be an Attribute */
- IUnknown_QueryInterface(newItem, &IID_IXMLDOMNode, (LPVOID*)&pAttr);
+ IUnknown_QueryInterface(newItem, &IID_IXMLDOMNode, (void**)&pAttr);
if(pAttr)
{
- ThisNew = impl_from_IXMLDOMNode( pAttr );
+ xmlnode *ThisNew = impl_from_IXMLDOMNode( pAttr );
if(ThisNew->node->type != XML_ATTRIBUTE_NODE)
{
@@ -387,7 +357,7 @@ static HRESULT WINAPI xmlnodemap_get_length(
curr = first;
attrCount = 1;
- while (curr->next != NULL) {
+ while (curr->next) {
attrCount++;
curr = curr->next;
}
@@ -403,8 +373,47 @@ static HRESULT WINAPI xmlnodemap_getQualifiedItem(
IXMLDOMNode** qualifiedItem)
{
xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface );
- FIXME("(%p)->(%s %s %p)\n", This, debugstr_w(baseName), debugstr_w(namespaceURI), qualifiedItem);
- return E_NOTIMPL;
+ xmlAttrPtr attr;
+ xmlNodePtr node;
+ xmlChar *href;
+ xmlChar *name;
+
+ TRACE("(%p)->(%s %s %p)\n", This, debugstr_w(baseName), debugstr_w(namespaceURI), qualifiedItem);
+
+ if (!baseName || !qualifiedItem) return E_INVALIDARG;
+
+ node = xmlNodePtr_from_domnode(This->node, XML_ELEMENT_NODE);
+ if ( !node )
+ return E_FAIL;
+
+ if (namespaceURI && *namespaceURI)
+ {
+ href = xmlChar_from_wchar(namespaceURI);
+ if (!href) return E_OUTOFMEMORY;
+ }
+ else
+ href = NULL;
+
+ name = xmlChar_from_wchar(baseName);
+ if (!name)
+ {
+ heap_free(href);
+ return E_OUTOFMEMORY;
+ }
+
+ attr = xmlHasNsProp(node, name, href);
+ if (!attr)
+ {
+ *qualifiedItem = NULL;
+ return S_FALSE;
+ }
+
+ *qualifiedItem = create_node((xmlNodePtr)attr);
+
+ heap_free(name);
+ heap_free(href);
+
+ return S_OK;
}
static HRESULT WINAPI xmlnodemap_removeQualifiedItem(
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index a9c5c3c..a1d27bb 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -1321,7 +1321,7 @@ static void test_domnode( void )
type = NODE_INVALID;
r = IXMLDOMNode_get_nodeType( element, &type);
- ok( r == S_OK, "getNamedItem returned wrong code\n");
+ ok( r == S_OK, "got %08x\n", r);
ok( type == NODE_ELEMENT, "node not an element\n");
str = NULL;
@@ -5796,6 +5796,69 @@ static void test_splitText(void)
free_bstrs();
}
+static void test_getQualifiedItem(void)
+{
+ IXMLDOMDocument *doc;
+ IXMLDOMElement *element;
+ IXMLDOMNode *pr_node, *node;
+ IXMLDOMNodeList *root_list;
+ IXMLDOMNamedNodeMap *map;
+ VARIANT_BOOL b;
+ BSTR str;
+ LONG len;
+ HRESULT hr;
+
+ hr = CoCreateInstance( &CLSID_DOMDocument, NULL,
+ CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&doc );
+ ok( hr == S_OK, "ret 0x%08x\n", hr);
+ if( hr != S_OK )
+ return;
+
+ str = SysAllocString( szComplete4 );
+ hr = IXMLDOMDocument_loadXML( doc, str, &b );
+ ok( hr == S_OK, "loadXML failed\n");
+ ok( b == VARIANT_TRUE, "failed to load XML string\n");
+ SysFreeString( str );
+
+ hr = IXMLDOMDocument_get_documentElement(doc, &element);
+ ok( hr == S_OK, "ret %08x\n", hr);
+
+ hr = IXMLDOMElement_get_childNodes(element, &root_list);
+ ok( hr == S_OK, "ret %08x\n", hr);
+
+ hr = IXMLDOMNodeList_get_item(root_list, 1, &pr_node);
+ ok( hr == S_OK, "ret %08x\n", hr);
+ IXMLDOMNodeList_Release(root_list);
+
+ hr = IXMLDOMNode_get_attributes(pr_node, &map);
+ ok( hr == S_OK, "ret %08x\n", hr);
+ IXMLDOMNode_Release(pr_node);
+
+ hr = IXMLDOMNamedNodeMap_get_length(map, &len);
+ ok( hr == S_OK, "ret %08x\n", hr);
+ ok( len == 3, "length %d\n", len);
+
+ hr = IXMLDOMNamedNodeMap_getQualifiedItem(map, NULL, NULL, NULL);
+ ok( hr == E_INVALIDARG, "ret %08x\n", hr);
+
+ node = (void*)0xdeadbeef;
+ hr = IXMLDOMNamedNodeMap_getQualifiedItem(map, NULL, NULL, &node);
+ ok( hr == E_INVALIDARG, "ret %08x\n", hr);
+ ok( node == (void*)0xdeadbeef, "got %p\n", node);
+
+ hr = IXMLDOMNamedNodeMap_getQualifiedItem(map, _bstr_("id"), NULL, NULL);
+ ok( hr == E_INVALIDARG, "ret %08x\n", hr);
+
+ hr = IXMLDOMNamedNodeMap_getQualifiedItem(map, _bstr_("id"), NULL, &node);
+ ok( hr == S_OK, "ret %08x\n", hr);
+ IXMLDOMNode_Release(node);
+
+ IXMLDOMNamedNodeMap_Release( map );
+ IXMLDOMElement_Release( element );
+ IXMLDOMDocument_Release( doc );
+ free_bstrs();
+}
+
START_TEST(domdoc)
{
IXMLDOMDocument *doc;
@@ -5846,6 +5909,7 @@ START_TEST(domdoc)
test_put_nodeValue();
test_document_IObjectSafety();
test_splitText();
+ test_getQualifiedItem();
CoUninitialize();
}
More information about the wine-cvs
mailing list