Commit 0330332a authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

msxml3: Implement IXMLDOMNamedNodeMap::getQualifiedItem().

parent c9b8f5d2
...@@ -127,13 +127,8 @@ static HRESULT WINAPI xmlnodemap_GetTypeInfo( ...@@ -127,13 +127,8 @@ static HRESULT WINAPI xmlnodemap_GetTypeInfo(
ITypeInfo** ppTInfo ) ITypeInfo** ppTInfo )
{ {
xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface ); xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface );
HRESULT hr;
TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo); TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
return get_typeinfo(IXMLDOMNamedNodeMap_tid, ppTInfo);
hr = get_typeinfo(IXMLDOMNamedNodeMap_tid, ppTInfo);
return hr;
} }
static HRESULT WINAPI xmlnodemap_GetIDsOfNames( static HRESULT WINAPI xmlnodemap_GetIDsOfNames(
...@@ -203,32 +198,8 @@ static HRESULT WINAPI xmlnodemap_getNamedItem( ...@@ -203,32 +198,8 @@ static HRESULT WINAPI xmlnodemap_getNamedItem(
IXMLDOMNode** namedItem) IXMLDOMNode** namedItem)
{ {
xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface ); xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface );
xmlChar *element_name;
xmlAttrPtr attr;
xmlNodePtr node;
TRACE("(%p)->(%s %p)\n", This, debugstr_w(name), namedItem ); TRACE("(%p)->(%s %p)\n", This, debugstr_w(name), namedItem );
return IXMLDOMNamedNodeMap_getQualifiedItem(iface, name, NULL, 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;
} }
static HRESULT WINAPI xmlnodemap_setNamedItem( static HRESULT WINAPI xmlnodemap_setNamedItem(
...@@ -237,7 +208,6 @@ static HRESULT WINAPI xmlnodemap_setNamedItem( ...@@ -237,7 +208,6 @@ static HRESULT WINAPI xmlnodemap_setNamedItem(
IXMLDOMNode** namedItem) IXMLDOMNode** namedItem)
{ {
xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface ); xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface );
xmlnode *ThisNew = NULL;
xmlNodePtr nodeNew; xmlNodePtr nodeNew;
IXMLDOMNode *pAttr = NULL; IXMLDOMNode *pAttr = NULL;
xmlNodePtr node; xmlNodePtr node;
...@@ -254,10 +224,10 @@ static HRESULT WINAPI xmlnodemap_setNamedItem( ...@@ -254,10 +224,10 @@ static HRESULT WINAPI xmlnodemap_setNamedItem(
return E_FAIL; return E_FAIL;
/* Must be an Attribute */ /* Must be an Attribute */
IUnknown_QueryInterface(newItem, &IID_IXMLDOMNode, (LPVOID*)&pAttr); IUnknown_QueryInterface(newItem, &IID_IXMLDOMNode, (void**)&pAttr);
if(pAttr) if(pAttr)
{ {
ThisNew = impl_from_IXMLDOMNode( pAttr ); xmlnode *ThisNew = impl_from_IXMLDOMNode( pAttr );
if(ThisNew->node->type != XML_ATTRIBUTE_NODE) if(ThisNew->node->type != XML_ATTRIBUTE_NODE)
{ {
...@@ -387,7 +357,7 @@ static HRESULT WINAPI xmlnodemap_get_length( ...@@ -387,7 +357,7 @@ static HRESULT WINAPI xmlnodemap_get_length(
curr = first; curr = first;
attrCount = 1; attrCount = 1;
while (curr->next != NULL) { while (curr->next) {
attrCount++; attrCount++;
curr = curr->next; curr = curr->next;
} }
...@@ -403,8 +373,47 @@ static HRESULT WINAPI xmlnodemap_getQualifiedItem( ...@@ -403,8 +373,47 @@ static HRESULT WINAPI xmlnodemap_getQualifiedItem(
IXMLDOMNode** qualifiedItem) IXMLDOMNode** qualifiedItem)
{ {
xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface ); xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface );
FIXME("(%p)->(%s %s %p)\n", This, debugstr_w(baseName), debugstr_w(namespaceURI), qualifiedItem); xmlAttrPtr attr;
return E_NOTIMPL; 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( static HRESULT WINAPI xmlnodemap_removeQualifiedItem(
......
...@@ -1321,7 +1321,7 @@ static void test_domnode( void ) ...@@ -1321,7 +1321,7 @@ static void test_domnode( void )
type = NODE_INVALID; type = NODE_INVALID;
r = IXMLDOMNode_get_nodeType( element, &type); 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"); ok( type == NODE_ELEMENT, "node not an element\n");
str = NULL; str = NULL;
...@@ -5796,6 +5796,69 @@ static void test_splitText(void) ...@@ -5796,6 +5796,69 @@ static void test_splitText(void)
free_bstrs(); 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) START_TEST(domdoc)
{ {
IXMLDOMDocument *doc; IXMLDOMDocument *doc;
...@@ -5846,6 +5909,7 @@ START_TEST(domdoc) ...@@ -5846,6 +5909,7 @@ START_TEST(domdoc)
test_put_nodeValue(); test_put_nodeValue();
test_document_IObjectSafety(); test_document_IObjectSafety();
test_splitText(); test_splitText();
test_getQualifiedItem();
CoUninitialize(); CoUninitialize();
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment