[PATCH 2/2] Implement IXMLDOMNamedNodeMap::getQualifiedItem()

Nikolay Sivov nsivov at codeweavers.com
Fri Sep 3 03:13:29 CDT 2010


---
 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();
 }
-- 
1.5.6.5



--------------060602030503020907080806--



More information about the wine-patches mailing list