Hans Leidekker : webservices: Implement WsSkipNode.

Alexandre Julliard julliard at winehq.org
Tue May 23 18:01:26 CDT 2017


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Tue May 23 12:03:50 2017 +0200

webservices: Implement WsSkipNode.

Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/webservices/reader.c         | 46 ++++++++++++++++++++++++++++++
 dlls/webservices/tests/reader.c   | 60 +++++++++++++++++++++++++++++++++++++++
 dlls/webservices/webservices.spec |  2 +-
 3 files changed, 107 insertions(+), 1 deletion(-)

diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c
index 1d85f00..befe8db 100644
--- a/dlls/webservices/reader.c
+++ b/dlls/webservices/reader.c
@@ -1739,6 +1739,52 @@ HRESULT WINAPI WsReadNode( WS_XML_READER *handle, WS_ERROR *error )
     return hr;
 }
 
+static HRESULT skip_node( struct reader *reader )
+{
+    const struct node *parent;
+    HRESULT hr;
+
+    if (node_type( reader->current ) == WS_XML_NODE_TYPE_EOF) return WS_E_INVALID_OPERATION;
+    if (node_type( reader->current ) == WS_XML_NODE_TYPE_ELEMENT) parent = reader->current;
+    else parent = NULL;
+
+    for (;;)
+    {
+        if ((hr = read_node( reader ) != S_OK) || !parent) break;
+        if (node_type( reader->current ) != WS_XML_NODE_TYPE_END_ELEMENT) continue;
+        if (reader->current->parent == parent) return read_node( reader );
+    }
+
+    return hr;
+}
+
+/**************************************************************************
+ *          WsSkipNode		[webservices.@]
+ */
+HRESULT WINAPI WsSkipNode( WS_XML_READER *handle, WS_ERROR *error )
+{
+    struct reader *reader = (struct reader *)handle;
+    HRESULT hr;
+
+    TRACE( "%p %p\n", handle, error );
+    if (error) FIXME( "ignoring error parameter\n" );
+
+    if (!reader) return E_INVALIDARG;
+
+    EnterCriticalSection( &reader->cs );
+
+    if (reader->magic != READER_MAGIC)
+    {
+        LeaveCriticalSection( &reader->cs );
+        return E_INVALIDARG;
+    }
+
+    hr = skip_node( reader );
+
+    LeaveCriticalSection( &reader->cs );
+    return hr;
+}
+
 /**************************************************************************
  *          WsReadStartElement		[webservices.@]
  */
diff --git a/dlls/webservices/tests/reader.c b/dlls/webservices/tests/reader.c
index 1598cb2..93b7ed5 100644
--- a/dlls/webservices/tests/reader.c
+++ b/dlls/webservices/tests/reader.c
@@ -4403,6 +4403,65 @@ static void test_WsReadAttribute(void)
     WsFreeReader( reader );
 }
 
+static void test_WsSkipNode(void)
+{
+    const WS_XML_NODE *node;
+    WS_XML_READER *reader;
+    HRESULT hr;
+
+    hr = WsSkipNode( NULL, NULL );
+    ok( hr == E_INVALIDARG, "got %08x\n", hr );
+
+    hr = WsCreateReader( NULL, 0, &reader, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = WsSkipNode( reader, NULL );
+    ok( hr == WS_E_INVALID_OPERATION, "got %08x\n", hr );
+
+    hr = set_input( reader, "<t><u></u></t>", sizeof("<t><u></u></t>") - 1 );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = WsGetReaderNode( reader, &node, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( node->nodeType == WS_XML_NODE_TYPE_BOF, "got %u\n", node->nodeType );
+
+    /* BOF */
+    hr = WsSkipNode( reader, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    hr = WsGetReaderNode( reader, &node, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( node->nodeType == WS_XML_NODE_TYPE_ELEMENT, "got %u\n", node->nodeType );
+
+    /* element */
+    hr = WsSkipNode( reader, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    hr = WsGetReaderNode( reader, &node, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( node->nodeType == WS_XML_NODE_TYPE_EOF, "got %u\n", node->nodeType );
+
+    /* EOF */
+    hr = WsSkipNode( reader, NULL );
+    ok( hr == WS_E_INVALID_OPERATION, "got %08x\n", hr );
+
+    hr = set_input( reader, "<!--comment--><t></t>", sizeof("<!--comment--><t></t>") - 1 );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    /* non-element */
+    hr = WsSkipNode( reader, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    hr = WsGetReaderNode( reader, &node, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( node->nodeType == WS_XML_NODE_TYPE_COMMENT, "got %u\n", node->nodeType );
+
+    hr = WsSkipNode( reader, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    hr = WsGetReaderNode( reader, &node, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( node->nodeType == WS_XML_NODE_TYPE_ELEMENT, "got %u\n", node->nodeType );
+
+    WsFreeReader( reader );
+}
+
 START_TEST(reader)
 {
     test_WsCreateError();
@@ -4444,4 +4503,5 @@ START_TEST(reader)
     test_WsReadCharsUtf8();
     test_WsReadQualifiedName();
     test_WsReadAttribute();
+    test_WsSkipNode();
 }
diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec
index a6b8452..1f98aa3 100644
--- a/dlls/webservices/webservices.spec
+++ b/dlls/webservices/webservices.spec
@@ -159,7 +159,7 @@
 @ stdcall WsSetReaderPosition(ptr ptr ptr)
 @ stdcall WsSetWriterPosition(ptr ptr ptr)
 @ stub WsShutdownSessionChannel
-@ stub WsSkipNode
+@ stdcall WsSkipNode(ptr ptr)
 @ stub WsStartReaderCanonicalization
 @ stub WsStartWriterCanonicalization
 @ stub WsTrimXmlWhitespace




More information about the wine-cvs mailing list