static HRESULT receive_message( WS_CHANNEL *channel, WS_MESSAGE *msg, WS_MESSAGE_DESCRIPTION *desc, WS_PARAMETER_DESCRIPTION *params, ULONG count, WS_HEAP *heap, const void **args ) { WS_XML_READER *reader; HRESULT hr; if ((hr = message_set_action( msg, desc->action )) != S_OK) return hr; if ((hr = channel_receive_message( channel )) != S_OK) return hr; if ((hr = channel_get_reader( channel, &reader )) != S_OK) return hr; return read_message( msg, reader, heap, desc->bodyElementDescription, params, count, args ); }
/************************************************************************** * WsReceiveMessage [webservices.@] */ HRESULT WINAPI WsReceiveMessage( WS_CHANNEL *handle, WS_MESSAGE *msg, const WS_MESSAGE_DESCRIPTION **desc, ULONG count, WS_RECEIVE_OPTION option, WS_READ_OPTION read_option, WS_HEAP *heap, void *value, ULONG size, ULONG *index, const WS_ASYNC_CONTEXT *ctx, WS_ERROR *error ) { struct channel *channel = (struct channel *)handle; char *buf = NULL; ULONG len; HRESULT hr; TRACE( "%p %p %p %u %08x %08x %p %p %u %p %p %p\n", handle, msg, desc, count, option, read_option, heap, value, size, index, ctx, error ); if (error) FIXME( "ignoring error parameter\n" ); if (ctx) FIXME( "ignoring ctx parameter\n" ); if (index) { FIXME( "index parameter not supported\n" ); return E_NOTIMPL; } if (count != 1) { FIXME( "no support for multiple descriptions\n" ); return E_NOTIMPL; } if (option != WS_RECEIVE_REQUIRED_MESSAGE) { FIXME( "receive option %08x not supported\n", option ); return E_NOTIMPL; } if (!handle || !msg || !desc || !count) return E_INVALIDARG; if ((hr = channel_receive_message( handle, &buf, &len )) != S_OK) return hr; if (!channel->reader && (hr = WsCreateReader( NULL, 0, &channel->reader, NULL )) != S_OK) goto done; if ((hr = set_input( channel->reader, buf, len )) != S_OK) goto done; hr = read_message( msg, channel->reader, desc[0]->bodyElementDescription, read_option, heap, value, size ); done: heap_free( buf ); return hr; }