webservices: Implement WsGetReaderPosition.
Signed-off-by: Hans Leidekker <hans@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
13faf34b07
commit
5ad0066068
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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, "<t/>", sizeof("<t/>") - 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();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue