Add indexed access to attributes (nodemap) and childNodes

(nodelist), with some testcases.
This commit is contained in:
Stefan Huehner 2005-11-03 12:04:52 +00:00 committed by Alexandre Julliard
parent 92032e6e35
commit 5834740231
3 changed files with 130 additions and 8 deletions

View File

@ -251,16 +251,56 @@ static HRESULT WINAPI xmlnodelist_get_item(
long index, long index,
IXMLDOMNode** listItem) IXMLDOMNode** listItem)
{ {
FIXME("\n"); xmlnodelist *This = impl_from_IXMLDOMNodeList( iface );
return E_NOTIMPL; xmlNodePtr curr;
long nodeIndex = 0;
TRACE("%p %ld\n", This, index);
*listItem = NULL;
if (index < 0)
return S_FALSE;
curr = This->node;
for (nodeIndex = 0; nodeIndex < index; nodeIndex++) {
if (curr->next == NULL)
return S_FALSE;
else
curr = curr->next;
}
*listItem = create_node( curr );
return S_OK;
} }
static HRESULT WINAPI xmlnodelist_get_length( static HRESULT WINAPI xmlnodelist_get_length(
IXMLDOMNodeList* iface, IXMLDOMNodeList* iface,
long* listLength) long* listLength)
{ {
FIXME("\n");
return E_NOTIMPL; xmlNodePtr curr;
long nodeCount = 0;
xmlnodelist *This = impl_from_IXMLDOMNodeList( iface );
TRACE("%p\n", This);
if (This->node == NULL) {
*listLength = 0;
return S_OK;
}
curr = This->node;
nodeCount = 1;
while (curr->next != NULL) {
nodeCount++;
curr = curr->next;
}
*listLength = nodeCount;
return S_OK;
} }
static HRESULT WINAPI xmlnodelist_nextNode( static HRESULT WINAPI xmlnodelist_nextNode(

View File

@ -196,16 +196,65 @@ static HRESULT WINAPI xmlnodemap_get_item(
long index, long index,
IXMLDOMNode** listItem) IXMLDOMNode** listItem)
{ {
FIXME("\n"); xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface );
return E_NOTIMPL; xmlNodePtr node;
xmlAttrPtr curr;
long attrIndex;
TRACE("%p %ld\n", This, index);
*listItem = NULL;
if (index < 0)
return S_FALSE;
node = xmlNodePtr_from_domnode( This->node, 0 );
curr = node->properties;
for (attrIndex = 0; attrIndex < index; attrIndex++) {
if (curr->next == NULL)
return S_FALSE;
else
curr = curr->next;
}
*listItem = create_node( (xmlNodePtr) curr );
return S_OK;
} }
static HRESULT WINAPI xmlnodemap_get_length( static HRESULT WINAPI xmlnodemap_get_length(
IXMLDOMNamedNodeMap *iface, IXMLDOMNamedNodeMap *iface,
long* listLength) long* listLength)
{ {
FIXME("\n"); xmlNodePtr node;
return E_NOTIMPL; xmlAttrPtr first;
xmlAttrPtr curr;
long attrCount;
xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface );
TRACE("%p\n", This);
node = xmlNodePtr_from_domnode( This->node, 0 );
if ( !node )
return E_FAIL;
first = node->properties;
if (first == NULL) {
*listLength = 0;
return S_OK;
}
curr = first;
attrCount = 1;
while (curr->next != NULL) {
attrCount++;
curr = curr->next;
}
*listLength = attrCount;
return S_OK;
} }
static HRESULT WINAPI xmlnodemap_getQualifiedItem( static HRESULT WINAPI xmlnodemap_getQualifiedItem(

View File

@ -242,6 +242,7 @@ void test_domnode( void )
VARIANT_BOOL b; VARIANT_BOOL b;
BSTR str; BSTR str;
VARIANT var; VARIANT var;
long count;
r = CoCreateInstance( &CLSID_DOMDocument, NULL, r = CoCreateInstance( &CLSID_DOMDocument, NULL,
CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
@ -325,6 +326,38 @@ void test_domnode( void )
r = IXMLDOMNamedNodeMap_getNamedItem( map, str, &node ); r = IXMLDOMNamedNodeMap_getNamedItem( map, str, &node );
ok( r == S_OK, "getNamedItem returned wrong code\n"); ok( r == S_OK, "getNamedItem returned wrong code\n");
ok( node != NULL, "should be attributes\n"); ok( node != NULL, "should be attributes\n");
SysFreeString( str );
/* test indexed access of attributes */
r = IXMLDOMNamedNodeMap_get_length( map, &count );
ok ( r == S_OK, "get_length wrong code\n");
ok ( count == 1, "get_length != 1\n");
node = NULL;
r = IXMLDOMNamedNodeMap_get_item( map, -1, &node);
ok ( r == S_FALSE, "get_item (-1) wrong code\n");
ok ( node == NULL, "there is no node\n");
node = NULL;
r = IXMLDOMNamedNodeMap_get_item( map, 1, &node);
ok ( r == S_FALSE, "get_item (1) wrong code\n");
ok ( node == NULL, "there is no attribute\n");
node = NULL;
r = IXMLDOMNamedNodeMap_get_item( map, 0, &node);
ok ( r == S_OK, "get_item (0) wrong code\n");
ok ( node != NULL, "should be attribute\n");
r = IXMLDOMNode_get_nodeName( node, NULL );
ok ( r == E_INVALIDARG, "get_nodeName (NULL) wrong code");
/* content doesn't matter here */
str = SysAllocString( szNonExistentFile );
r = IXMLDOMNode_get_nodeName( node, &str );
ok ( r == S_OK, "get_nodeName wrong code\n");
ok ( str != NULL, "str is null\n");
ok( !lstrcmpW( str, szdl ), "incorrect node name\n");
SysFreeString( str );
} }
else else
ok( FALSE, "no map\n"); ok( FALSE, "no map\n");