Hans Leidekker : webservices: Implement WsReadStartElement.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Oct 9 09:55:20 CDT 2015


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Fri Oct  9 10:19:29 2015 +0200

webservices: Implement WsReadStartElement.

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

---

 dlls/webservices/reader.c         | 67 +++++++++++++++++++++++++++
 dlls/webservices/tests/reader.c   | 97 +++++++++++++++++++++++++++++++++++++++
 dlls/webservices/webservices.spec |  2 +-
 3 files changed, 165 insertions(+), 1 deletion(-)

diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c
index 0f2bc00..e4a377b 100644
--- a/dlls/webservices/reader.c
+++ b/dlls/webservices/reader.c
@@ -557,6 +557,20 @@ static WS_XML_STRING *alloc_xml_string( const char *data, ULONG len )
     return ret;
 }
 
+static WS_XML_UTF8_TEXT *alloc_utf8_text( const char *data, ULONG len )
+{
+    WS_XML_UTF8_TEXT *ret;
+
+    if (!(ret = heap_alloc( sizeof(*ret) + len ))) return NULL;
+    ret->text.textType    = WS_XML_TEXT_TYPE_UTF8;
+    ret->value.length     = len;
+    ret->value.bytes      = (BYTE *)(ret + 1);
+    ret->value.dictionary = NULL;
+    ret->value.id         = 0;
+    if (data) memcpy( ret->value.bytes, data, len );
+    return ret;
+}
+
 static inline BOOL read_end_of_data( struct reader *reader )
 {
     return reader->read_pos >= reader->read_size;
@@ -749,6 +763,45 @@ error:
     return hr;
 }
 
+static HRESULT read_text( struct reader *reader )
+{
+    unsigned int len = 0, ch, skip;
+    const char *start;
+    struct node *node;
+    WS_XML_TEXT_NODE *text;
+    WS_XML_UTF8_TEXT *utf8;
+
+    start = read_current_ptr( reader );
+    for (;;)
+    {
+        if (read_end_of_data( reader )) break;
+        if (!(ch = read_utf8_char( reader, &skip ))) return WS_E_INVALID_FORMAT;
+        if (ch == '<') break;
+        read_skip( reader, skip );
+        len += skip;
+    }
+
+    if (!(node = alloc_node( WS_XML_NODE_TYPE_TEXT ))) return E_OUTOFMEMORY;
+    text = (WS_XML_TEXT_NODE *)node;
+    if (!(utf8 = alloc_utf8_text( start, len )))
+    {
+        heap_free( node );
+        return E_OUTOFMEMORY;
+    }
+    text->text = (WS_XML_TEXT *)utf8;
+
+    list_add_after( &reader->current->entry, &node->entry );
+    reader->current = node;
+    reader->state   = READER_STATE_TEXT;
+    return S_OK;
+}
+
+static HRESULT read_startelement( struct reader *reader )
+{
+    if (!read_cmp( reader, "<", 1 )) return read_element( reader );
+    return read_text( reader );
+}
+
 static HRESULT read_to_startelement( struct reader *reader, BOOL *found )
 {
     HRESULT hr;
@@ -781,6 +834,20 @@ static HRESULT read_to_startelement( struct reader *reader, BOOL *found )
 }
 
 /**************************************************************************
+ *          WsReadStartElement		[webservices.@]
+ */
+HRESULT WINAPI WsReadStartElement( WS_XML_READER *handle, WS_ERROR *error )
+{
+    struct reader *reader = (struct reader *)handle;
+
+    TRACE( "%p %p\n", handle, error );
+    if (error) FIXME( "ignoring error parameter\n" );
+
+    if (!reader) return E_INVALIDARG;
+    return read_startelement( reader );
+}
+
+/**************************************************************************
  *          WsReadToStartElement		[webservices.@]
  */
 HRESULT WINAPI WsReadToStartElement( WS_XML_READER *handle, const WS_XML_STRING *localname,
diff --git a/dlls/webservices/tests/reader.c b/dlls/webservices/tests/reader.c
index d31a182..6baee49 100644
--- a/dlls/webservices/tests/reader.c
+++ b/dlls/webservices/tests/reader.c
@@ -45,6 +45,9 @@ static const char data4[] =
     "</o:services>\r\n"
     "</o:OfficeConfig>\r\n";
 
+static const char data8[] =
+    "<node1><node2>test</node2></node1>";
+
 static void test_WsCreateError(void)
 {
     HRESULT hr;
@@ -598,6 +601,99 @@ static void test_WsReadToStartElement(void)
     WsFreeReader( reader );
 }
 
+static void test_WsReadStartElement(void)
+{
+    HRESULT hr;
+    WS_XML_READER *reader;
+    const WS_XML_NODE *node, *node2;
+    int found;
+
+    hr = WsCreateReader( NULL, 0, &reader, NULL ) ;
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = set_input( reader, data2, sizeof(data2) - 1 );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = WsFillReader( reader, sizeof(data2) - 1, NULL, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    found = -1;
+    hr = WsReadToStartElement( reader, NULL, NULL, &found, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( found == TRUE, "got %d\n", found );
+
+    hr = WsReadStartElement( NULL, NULL );
+    ok( hr == E_INVALIDARG, "got %08x\n", hr );
+
+    hr = WsGetReaderNode( reader, &node, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    if (node) ok( node->nodeType == WS_XML_NODE_TYPE_ELEMENT, "got %u\n", node->nodeType );
+
+    hr = WsReadStartElement( reader, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = WsGetReaderNode( reader, &node, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    if (node)
+    {
+        WS_XML_TEXT_NODE *text = (WS_XML_TEXT_NODE *)node;
+        ok( text->node.nodeType == WS_XML_NODE_TYPE_TEXT, "got %u\n", text->node.nodeType );
+        ok( text->text != NULL, "text not set\n" );
+        if (text->text)
+        {
+            WS_XML_UTF8_TEXT *utf8 = (WS_XML_UTF8_TEXT *)text->text;
+            ok( text->text->textType == WS_XML_TEXT_TYPE_UTF8, "got %u\n", text->text->textType );
+            ok( utf8->value.length == 4, "got %u\n", utf8->value.length );
+            ok( !memcmp( utf8->value.bytes, "test", 4 ), "wrong data\n" );
+        }
+    }
+
+    hr = WsReadStartElement( reader, NULL );
+    ok( hr == WS_E_INVALID_FORMAT, "got %08x\n", hr );
+
+    node2 = NULL;
+    hr = WsGetReaderNode( reader, &node2, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( node2 == node, "different node\n" );
+
+    hr = set_input( reader, data8, sizeof(data8) - 1 );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = WsFillReader( reader, sizeof(data8) - 1, NULL, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    found = -1;
+    hr = WsReadToStartElement( reader, NULL, NULL, &found, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( found == TRUE, "got %d\n", found );
+
+    hr = WsGetReaderNode( reader, &node, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    if (node) ok( node->nodeType == WS_XML_NODE_TYPE_ELEMENT, "got %u\n", node->nodeType );
+
+    hr = WsGetReaderNode( reader, &node, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    if (node)
+    {
+        WS_XML_ELEMENT_NODE *elem = (WS_XML_ELEMENT_NODE *)node;
+        ok( node->nodeType == WS_XML_NODE_TYPE_ELEMENT, "got %u\n", node->nodeType );
+        ok( !memcmp( elem->localName->bytes, "node1", 5), "wrong name\n" );
+    }
+
+    hr = WsReadStartElement( reader, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = WsGetReaderNode( reader, &node, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    if (node)
+    {
+        WS_XML_ELEMENT_NODE *elem = (WS_XML_ELEMENT_NODE *)node;
+        ok( node->nodeType == WS_XML_NODE_TYPE_ELEMENT, "got %u\n", node->nodeType );
+        ok( !memcmp( elem->localName->bytes, "node2", 5), "wrong name\n" );
+    }
+    WsFreeReader( reader );
+}
+
 START_TEST(reader)
 {
     test_WsCreateError();
@@ -606,4 +702,5 @@ START_TEST(reader)
     test_WsSetInput();
     test_WsFillReader();
     test_WsReadToStartElement();
+    test_WsReadStartElement();
 }
diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec
index 791d4be..4dce639 100644
--- a/dlls/webservices/webservices.spec
+++ b/dlls/webservices/webservices.spec
@@ -119,7 +119,7 @@
 @ stub WsReadNode
 @ stub WsReadQualifiedName
 @ stub WsReadStartAttribute
-@ stub WsReadStartElement
+@ stdcall WsReadStartElement(ptr ptr)
 @ stdcall WsReadToStartElement(ptr ptr ptr ptr ptr)
 @ stub WsReadType
 @ stub WsReadValue




More information about the wine-cvs mailing list