webservices: Implement WsReadEnvelopeStart.

Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Hans Leidekker 2016-08-31 14:35:32 +02:00 committed by Alexandre Julliard
parent b9d751d542
commit a8c343552b
4 changed files with 113 additions and 1 deletions

View file

@ -75,6 +75,7 @@ struct msg
WS_XML_BUFFER *buf;
WS_XML_WRITER *writer;
WS_XML_WRITER *writer_body;
WS_XML_READER *reader_body;
ULONG header_count;
ULONG header_size;
struct header **header;
@ -536,6 +537,57 @@ HRESULT WINAPI WsWriteBody( WS_MESSAGE *handle, const WS_ELEMENT_DESCRIPTION *de
return hr;
}
static BOOL match_current_element( WS_XML_READER *reader, const WS_XML_STRING *localname )
{
const WS_XML_NODE *node;
const WS_XML_ELEMENT_NODE *elem;
if (WsGetReaderNode( reader, &node, NULL ) != S_OK) return FALSE;
if (node->nodeType != WS_XML_NODE_TYPE_ELEMENT) return FALSE;
elem = (const WS_XML_ELEMENT_NODE *)node;
return WsXmlStringEquals( elem->localName, localname, NULL ) == S_OK;
}
static HRESULT read_envelope_start( WS_XML_READER *reader )
{
static const WS_XML_STRING envelope = {8, (BYTE *)"Envelope"}, body = {4, (BYTE *)"Body"};
HRESULT hr;
if ((hr = WsReadNode( reader, NULL )) != S_OK) return hr;
if (!match_current_element( reader, &envelope )) return WS_E_INVALID_FORMAT;
/* FIXME: read headers */
if ((hr = WsReadNode( reader, NULL )) != S_OK) return hr;
if (!match_current_element( reader, &body )) return WS_E_INVALID_FORMAT;
return WsReadNode( reader, NULL );
}
/**************************************************************************
* WsReadEnvelopeStart [webservices.@]
*/
HRESULT WINAPI WsReadEnvelopeStart( WS_MESSAGE *handle, WS_XML_READER *reader, WS_MESSAGE_DONE_CALLBACK cb,
void *state, WS_ERROR *error )
{
struct msg *msg = (struct msg *)handle;
HRESULT hr;
TRACE( "%p %p %p %p %p\n", handle, reader, cb, state, error );
if (error) FIXME( "ignoring error parameter\n" );
if (cb)
{
FIXME( "callback not supported\n" );
return E_NOTIMPL;
}
if (!handle || !reader) return E_INVALIDARG;
if (msg->state != WS_MESSAGE_STATE_EMPTY) return WS_E_INVALID_OPERATION;
if ((hr = read_envelope_start( reader )) != S_OK) return hr;
msg->reader_body = reader;
msg->state = WS_MESSAGE_STATE_READING;
return S_OK;
}
/**************************************************************************
* WsInitializeMessage [webservices.@]
*/

View file

@ -859,6 +859,63 @@ static void test_WsRemoveCustomHeader(void)
WsFreeMessage( msg );
}
static HRESULT set_input( WS_XML_READER *reader, const char *data, ULONG size )
{
WS_XML_READER_TEXT_ENCODING text = {{WS_XML_READER_ENCODING_TYPE_TEXT}, WS_CHARSET_AUTO};
WS_XML_READER_BUFFER_INPUT buf;
buf.input.inputType = WS_XML_READER_INPUT_TYPE_BUFFER;
buf.encodedData = (void *)data;
buf.encodedDataSize = size;
return WsSetInput( reader, &text.encoding, &buf.input, NULL, 0, NULL );
}
static void test_WsReadEnvelopeStart(void)
{
static const char xml[] =
"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body/></s:Envelope>";
WS_MESSAGE *msg, *msg2;
WS_XML_READER *reader;
WS_MESSAGE_STATE state;
HRESULT hr;
hr = WsReadEnvelopeStart( NULL, NULL, NULL, NULL, NULL );
ok( hr == E_INVALIDARG, "got %08x\n", hr );
hr = WsCreateMessage( WS_ADDRESSING_VERSION_0_9, WS_ENVELOPE_VERSION_SOAP_1_1, NULL, 0, &msg, NULL );
ok( hr == S_OK, "got %08x\n", hr );
hr = WsReadEnvelopeStart( msg, NULL, NULL, NULL, NULL );
ok( hr == E_INVALIDARG, "got %08x\n", hr );
hr = WsCreateReader( NULL, 0, &reader, NULL );
ok( hr == S_OK, "got %08x\n", hr );
hr = WsInitializeMessage( msg, WS_REQUEST_MESSAGE, NULL, NULL );
ok( hr == S_OK, "got %08x\n", hr );
hr = WsReadEnvelopeStart( msg, reader, NULL, NULL, NULL );
ok( hr == WS_E_INVALID_OPERATION, "got %08x\n", hr );
hr = WsCreateMessage( WS_ADDRESSING_VERSION_0_9, WS_ENVELOPE_VERSION_SOAP_1_1, NULL, 0, &msg2, NULL );
ok( hr == S_OK, "got %08x\n", hr );
hr = set_input( reader, xml, strlen(xml) );
ok( hr == S_OK, "got %08x\n", hr );
hr = WsReadEnvelopeStart( msg2, reader, NULL, NULL, NULL );
ok( hr == S_OK, "got %08x\n", hr );
state = 0xdeadbeef;
hr = WsGetMessageProperty( msg2, WS_MESSAGE_PROPERTY_STATE, &state, sizeof(state), NULL );
ok( hr == S_OK, "got %08x\n", hr );
ok( state == WS_MESSAGE_STATE_READING, "got %u\n", state );
WsFreeMessage( msg );
WsFreeMessage( msg2 );
WsFreeReader( reader );
}
START_TEST(msg)
{
test_WsCreateMessage();
@ -874,4 +931,5 @@ START_TEST(msg)
test_WsRemoveMappedHeader();
test_WsAddCustomHeader();
test_WsRemoveCustomHeader();
test_WsReadEnvelopeStart();
}

View file

@ -112,7 +112,7 @@
@ stdcall WsReadEndElement(ptr ptr)
@ stub WsReadEndpointAddressExtension
@ stub WsReadEnvelopeEnd
@ stub WsReadEnvelopeStart
@ stdcall WsReadEnvelopeStart(ptr ptr ptr ptr ptr)
@ stub WsReadMessageEnd
@ stub WsReadMessageStart
@ stub WsReadMetadata

View file

@ -1444,6 +1444,8 @@ HRESULT WINAPI WsReadElement(WS_XML_READER*, const WS_ELEMENT_DESCRIPTION*, WS_R
WS_HEAP*, void*, ULONG, WS_ERROR*);
HRESULT WINAPI WsReadEndAttribute(WS_XML_READER*, WS_ERROR*);
HRESULT WINAPI WsReadEndElement(WS_XML_READER*, WS_ERROR*);
HRESULT WINAPI WsReadEnvelopeStart(WS_MESSAGE*, WS_XML_READER*, WS_MESSAGE_DONE_CALLBACK, void*,
WS_ERROR*);
HRESULT WINAPI WsReadNode(WS_XML_READER*, WS_ERROR*);
HRESULT WINAPI WsReadStartAttribute(WS_XML_READER*, ULONG, WS_ERROR*);
HRESULT WINAPI WsReadStartElement(WS_XML_READER*, WS_ERROR*);