diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c index b8dfed4f34b..b326bd81904 100644 --- a/dlls/webservices/reader.c +++ b/dlls/webservices/reader.c @@ -432,6 +432,7 @@ struct reader ULONG nb_prefixes; ULONG nb_prefixes_allocated; WS_XML_READER_INPUT_TYPE input_type; + struct xmlbuf *input_buf; const unsigned char *input_data; ULONG input_size; ULONG prop_count; @@ -570,6 +571,7 @@ static HRESULT read_init_state( struct reader *reader ) destroy_nodes( reader->root ); reader->root = NULL; + reader->input_buf = NULL; clear_prefixes( reader->prefixes, reader->nb_prefixes ); reader->nb_prefixes = 1; if (!(node = alloc_node( WS_XML_NODE_TYPE_EOF ))) return E_OUTOFMEMORY; @@ -3823,9 +3825,10 @@ static WS_CHARSET detect_charset( const unsigned char *data, ULONG size, ULONG * return ret; } -static void set_input_buffer( struct reader *reader, const unsigned char *data, ULONG size ) +static void set_input_buffer( struct reader *reader, struct xmlbuf *buf, const unsigned char *data, ULONG size ) { reader->input_type = WS_XML_READER_INPUT_TYPE_BUFFER; + reader->input_buf = buf; reader->input_data = data; reader->input_size = size; @@ -3891,7 +3894,8 @@ HRESULT WINAPI WsSetInput( WS_XML_READER *handle, const WS_XML_READER_ENCODING * case WS_XML_READER_INPUT_TYPE_BUFFER: { WS_XML_READER_BUFFER_INPUT *buf = (WS_XML_READER_BUFFER_INPUT *)input; - set_input_buffer( reader, (const unsigned char *)buf->encodedData + offset, buf->encodedDataSize - offset ); + set_input_buffer( reader, NULL, (const unsigned char *)buf->encodedData + offset, + buf->encodedDataSize - offset ); break; } default: @@ -3937,7 +3941,7 @@ HRESULT WINAPI WsSetInputToBuffer( WS_XML_READER *handle, WS_XML_BUFFER *buffer, &charset, sizeof(charset) ); if (hr != S_OK) return hr; - set_input_buffer( reader, (const unsigned char *)xmlbuf->ptr + offset, xmlbuf->size - offset ); + set_input_buffer( reader, xmlbuf, (const unsigned char *)xmlbuf->ptr + offset, xmlbuf->size - offset ); if (!(node = alloc_node( WS_XML_NODE_TYPE_BOF ))) return E_OUTOFMEMORY; read_insert_bof( reader, node ); return S_OK; @@ -3957,3 +3961,21 @@ HRESULT WINAPI WsXmlStringEquals( const WS_XML_STRING *str1, const WS_XML_STRING if (!memcmp( str1->bytes, str2->bytes, str1->length )) return S_OK; return S_FALSE; } + +/************************************************************************** + * WsGetReaderPosition [webservices.@] + */ +HRESULT WINAPI WsGetReaderPosition( WS_XML_READER *handle, WS_XML_NODE_POSITION *pos, WS_ERROR *error ) +{ + struct reader *reader = (struct reader *)handle; + + TRACE( "%p %p %p\n", handle, pos, error ); + if (error) FIXME( "ignoring error parameter\n" ); + + if (!reader || !pos) return E_INVALIDARG; + if (!reader->input_buf) return WS_E_INVALID_OPERATION; + + pos->buffer = (WS_XML_BUFFER *)reader->input_buf; + pos->node = reader->current; + return S_OK; +} diff --git a/dlls/webservices/tests/reader.c b/dlls/webservices/tests/reader.c index 4997f7a01b2..a613fa20443 100644 --- a/dlls/webservices/tests/reader.c +++ b/dlls/webservices/tests/reader.c @@ -3449,6 +3449,52 @@ static void test_WsResetError(void) WsFreeError( error ); } +static void test_WsGetReaderPosition(void) +{ + WS_HEAP *heap; + WS_XML_READER *reader; + WS_XML_BUFFER *buffer; + WS_XML_NODE_POSITION pos; + HRESULT hr; + + hr = WsGetReaderPosition( NULL, NULL, NULL ); + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + + hr = WsCreateHeap( 1 << 16, 0, NULL, 0, &heap, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = WsCreateReader( NULL, 0, &reader, NULL ) ; + ok( hr == S_OK, "got %08x\n", hr ); + + /* reader must be set to an XML buffer */ + hr = WsGetReaderPosition( reader, &pos, NULL ); + ok( hr == WS_E_INVALID_OPERATION, "got %08x\n", hr ); + + hr = set_input( reader, "", sizeof("") - 1 ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = WsGetReaderPosition( reader, &pos, NULL ); + ok( hr == WS_E_INVALID_OPERATION, "got %08x\n", hr ); + + hr = WsCreateXmlBuffer( heap, NULL, 0, &buffer, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = WsSetInputToBuffer( reader, buffer, NULL, 0, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = WsGetReaderPosition( reader, NULL, NULL ); + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + + pos.buffer = pos.node = NULL; + hr = WsGetReaderPosition( reader, &pos, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( pos.buffer != NULL, "buffer not set\n" ); + ok( pos.node != NULL, "node not set\n" ); + + WsFreeReader( reader ); + WsFreeHeap( heap ); +} + START_TEST(reader) { test_WsCreateError(); @@ -3481,4 +3527,5 @@ START_TEST(reader) test_WsReadElement(); test_WsReadValue(); test_WsResetError(); + test_WsGetReaderPosition(); } diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec index 3a69302f1fa..814788f83c4 100644 --- a/dlls/webservices/webservices.spec +++ b/dlls/webservices/webservices.spec @@ -81,7 +81,7 @@ @ stub WsGetPolicyProperty @ stdcall WsGetPrefixFromNamespace(ptr ptr long ptr ptr) @ stdcall WsGetReaderNode(ptr ptr ptr) -@ stub WsGetReaderPosition +@ stdcall WsGetReaderPosition(ptr ptr ptr) @ stdcall WsGetReaderProperty(ptr long ptr long ptr) @ stub WsGetSecurityContextProperty @ stub WsGetSecurityTokenProperty