Module: wine Branch: master Commit: d5255f51b2e0fe5e7e7fb0c4c520ccd5ee65b0af URL: http://source.winehq.org/git/wine.git/?a=commit;h=d5255f51b2e0fe5e7e7fb0c4c5...
Author: Hans Leidekker hans@codeweavers.com Date: Wed Mar 2 14:06:26 2016 +0100
webservices: Move the reader to EOF at end of data in WsReadEndElement.
Signed-off-by: Hans Leidekker hans@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/webservices/reader.c | 10 +++++ dlls/webservices/tests/reader.c | 84 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 89 insertions(+), 5 deletions(-)
diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c index db68733..7abbf3c 100644 --- a/dlls/webservices/reader.c +++ b/dlls/webservices/reader.c @@ -1194,6 +1194,16 @@ static HRESULT read_endelement( struct reader *reader ) WS_XML_STRING *prefix, *localname; HRESULT hr;
+ if (reader->state == READER_STATE_EOF) return WS_E_INVALID_FORMAT; + + if (read_end_of_data( reader )) + { + struct list *eof = list_tail( &reader->root->children ); + reader->current = LIST_ENTRY( eof, struct node, entry ); + reader->state = READER_STATE_EOF; + return S_OK; + } + if (read_cmp( reader, "</", 2 )) return WS_E_INVALID_FORMAT; read_skip( reader, 2 );
diff --git a/dlls/webservices/tests/reader.c b/dlls/webservices/tests/reader.c index 62a8846..6054690 100644 --- a/dlls/webservices/tests/reader.c +++ b/dlls/webservices/tests/reader.c @@ -887,11 +887,11 @@ static void test_WsReadStartElement(void)
/* WsReadEndElement advances reader to EOF */ hr = WsReadEndElement( reader, NULL ); - todo_wine ok( hr == S_OK, "got %08x\n", hr ); + ok( hr == S_OK, "got %08x\n", hr );
hr = WsGetReaderNode( reader, &node, NULL ); ok( hr == S_OK, "got %08x\n", hr ); - todo_wine if (node) ok( node->nodeType == WS_XML_NODE_TYPE_EOF, "got %u\n", node->nodeType ); + if (node) ok( node->nodeType == WS_XML_NODE_TYPE_EOF, "got %u\n", node->nodeType );
hr = WsReadEndElement( reader, NULL ); ok( hr == WS_E_INVALID_FORMAT, "got %08x\n", hr ); @@ -904,6 +904,7 @@ static void test_WsReadEndElement(void) HRESULT hr; WS_XML_READER *reader; const WS_XML_NODE *node; + int found;
hr = WsCreateReader( NULL, 0, &reader, NULL ) ; ok( hr == S_OK, "got %08x\n", hr ); @@ -976,11 +977,11 @@ static void test_WsReadEndElement(void)
/* WsReadEndElement advances reader to EOF */ hr = WsReadEndElement( reader, NULL ); - todo_wine ok( hr == S_OK, "got %08x\n", hr ); + ok( hr == S_OK, "got %08x\n", hr );
hr = WsGetReaderNode( reader, &node, NULL ); ok( hr == S_OK, "got %08x\n", hr ); - todo_wine if (node) ok( node->nodeType == WS_XML_NODE_TYPE_EOF, "got %u\n", node->nodeType ); + if (node) ok( node->nodeType == WS_XML_NODE_TYPE_EOF, "got %u\n", node->nodeType );
hr = WsReadEndElement( reader, NULL ); ok( hr == WS_E_INVALID_FORMAT, "got %08x\n", hr ); @@ -1009,6 +1010,79 @@ static void test_WsReadEndElement(void)
hr = WsReadEndElement( reader, NULL ); ok( hr == WS_E_INVALID_FORMAT, "got %08x\n", hr ); + + hr = set_input( reader, "<a></a>", sizeof("<a></a>") - 1 ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = WsFillReader( reader, sizeof("<a></a>") - 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 = WsReadEndElement( reader, NULL ); + ok( hr == WS_E_INVALID_FORMAT, "got %08x\n", hr ); + + hr = set_input( reader, "<a></a>", sizeof("<a></a>") - 1 ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = WsFillReader( reader, sizeof("<a></a>") - 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 = 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) ok( node->nodeType == WS_XML_NODE_TYPE_END_ELEMENT, "got %u\n", node->nodeType ); + + hr = WsReadEndElement( 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) ok( node->nodeType == WS_XML_NODE_TYPE_EOF, "got %u\n", node->nodeType ); + + hr = set_input( reader, "<a/>", sizeof("<a/>") - 1 ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = WsFillReader( reader, sizeof("<a/>") - 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 = 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) ok( node->nodeType == WS_XML_NODE_TYPE_END_ELEMENT, "got %u\n", node->nodeType ); + + hr = WsReadEndElement( reader, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + WsFreeReader( reader ); }
@@ -2134,7 +2208,7 @@ static void test_WsGetNamespaceFromPrefix(void) hr = WsReadStartElement( reader, NULL ); ok( hr == S_OK, "got %08x\n", hr ); hr = WsReadEndElement( reader, NULL ); - todo_wine ok( hr == S_OK, "got %08x\n", hr ); + ok( hr == S_OK, "got %08x\n", hr ); hr = WsGetNamespaceFromPrefix( reader, &prefix, TRUE, &ns, NULL ); todo_wine ok( hr == WS_E_INVALID_FORMAT, "got %08x\n", hr );