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