webservices: Implement WsReadEnvelopeStart.
Signed-off-by: Hans Leidekker <hans@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
b9d751d542
commit
a8c343552b
|
@ -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.@]
|
||||
*/
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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*);
|
||||
|
|
Loading…
Reference in New Issue