Colin Pitrat : msxml: nextNode and reset functions.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Dec 29 06:47:13 CST 2006


Module: wine
Branch: master
Commit: f57bf10024169d0944fccd6a06942b4c031e11c9
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f57bf10024169d0944fccd6a06942b4c031e11c9

Author: Colin Pitrat <colin.pitrat at bull.net>
Date:   Thu Dec 28 16:22:31 2006 +0100

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 0797436..fa17787 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_nextNod
     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( IXM
     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 4fc139d..ef660ee 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");




More information about the wine-cvs mailing list