From f57bf10024169d0944fccd6a06942b4c031e11c9 Mon Sep 17 00:00:00 2001 From: Colin Pitrat Date: Thu, 28 Dec 2006 16:22:31 +0100 Subject: [PATCH] msxml: nextNode and reset functions. --- dlls/msxml3/nodemap.c | 37 +++++++++++++++++++++++++++++++++---- dlls/msxml3/tests/domdoc.c | 17 +++++++++++++++++ 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/dlls/msxml3/nodemap.c b/dlls/msxml3/nodemap.c index 07974361f89..fa17787315e 100644 --- a/dlls/msxml3/nodemap.c +++ b/dlls/msxml3/nodemap.c @@ -44,6 +44,7 @@ typedef struct _xmlnodemap const struct ISupportErrorInfoVtbl *lpSEIVtbl; LONG ref; IXMLDOMNode *node; + long iterator; } xmlnodemap; static inline xmlnodemap *impl_from_IXMLDOMNamedNodeMap( IXMLDOMNamedNodeMap *iface ) @@ -297,15 +298,42 @@ static HRESULT WINAPI xmlnodemap_nextNode( IXMLDOMNamedNodeMap *iface, IXMLDOMNode** nextItem) { - FIXME("\n"); - return E_NOTIMPL; + xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface ); + xmlNodePtr node; + xmlAttrPtr curr; + long attrIndex; + + TRACE("%p %ld\n", This, This->iterator); + + *nextItem = NULL; + + node = xmlNodePtr_from_domnode( This->node, 0 ); + curr = node->properties; + + for (attrIndex = 0; attrIndex < This->iterator; attrIndex++) { + if (curr->next == NULL) + return S_FALSE; + else + curr = curr->next; + } + + This->iterator++; + + *nextItem = create_node( (xmlNodePtr) curr ); + + return S_OK; } static HRESULT WINAPI xmlnodemap_reset( IXMLDOMNamedNodeMap *iface ) { - FIXME("\n"); - return E_NOTIMPL; + xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface ); + + TRACE("%p %ld\n", This, This->iterator); + + This->iterator = 0; + + return S_OK; } static HRESULT WINAPI xmlnodemap__newEnum( @@ -389,6 +417,7 @@ IXMLDOMNamedNodeMap *create_nodemap( IXMLDOMNode *node ) nodemap->lpSEIVtbl = &support_error_vtbl; nodemap->node = node; nodemap->ref = 1; + nodemap->iterator = 0; IXMLDOMNode_AddRef( node ); /* Since we AddRef a node here, we don't need to call xmldoc_add_ref() */ diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 4fc139df140..ef660ee2a38 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -442,6 +442,23 @@ todo_wine ok ( str != NULL, "str is null\n"); ok( !lstrcmpW( str, szdl ), "incorrect node name\n"); SysFreeString( str ); + + /* test sequential access of attributes */ + node = NULL; + r = IXMLDOMNamedNodeMap_nextNode( map, &node ); + ok ( r == S_OK, "nextNode (first time) wrong code\n"); + ok ( node != NULL, "nextNode, should be attribute\n"); + + r = IXMLDOMNamedNodeMap_nextNode( map, &node ); + ok ( r != S_OK, "nextNode (second time) wrong code\n"); + ok ( node == NULL, "nextNode, there is no attribute\n"); + + r = IXMLDOMNamedNodeMap_reset( map ); + ok ( r == S_OK, "reset should return S_OK\n"); + + r = IXMLDOMNamedNodeMap_nextNode( map, &node ); + ok ( r == S_OK, "nextNode (third time) wrong code\n"); + ok ( node != NULL, "nextNode, should be attribute\n"); } else ok( FALSE, "no map\n");