Signed-off-by: Hans Leidekker hans@codeweavers.com --- dlls/webservices/channel.c | 54 +++++++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 6 deletions(-)
diff --git a/dlls/webservices/channel.c b/dlls/webservices/channel.c index 430453443d0..4df761cd5ea 100644 --- a/dlls/webservices/channel.c +++ b/dlls/webservices/channel.c @@ -2500,18 +2500,58 @@ HRESULT WINAPI WsRequestReply( WS_CHANNEL *handle, WS_MESSAGE *request, const WS return hr; }
+static HRESULT read_message_start( struct channel *channel, WS_MESSAGE *msg ) +{ + HRESULT hr; + if ((hr = receive_message_bytes( channel, msg )) == S_OK && (hr = init_reader( channel )) == S_OK) + hr = WsReadEnvelopeStart( msg, channel->reader, NULL, NULL, NULL ); + return hr; +} + +struct read_message_start +{ + struct task task; + struct channel *channel; + WS_MESSAGE *msg; + WS_ASYNC_CONTEXT ctx; +}; + +static void read_message_start_proc( struct task *task ) +{ + struct read_message_start *r = (struct read_message_start *)task; + HRESULT hr; + + hr = read_message_start( r->channel, r->msg ); + + TRACE( "calling %p(%08x)\n", r->ctx.callback, hr ); + r->ctx.callback( hr, WS_LONG_CALLBACK, r->ctx.callbackState ); + TRACE( "%p returned\n", r->ctx.callback ); +} + +static HRESULT queue_read_message_start( struct channel *channel, WS_MESSAGE *msg, const WS_ASYNC_CONTEXT *ctx ) +{ + struct read_message_start *r; + + if (!(r = heap_alloc( sizeof(*r) ))) return E_OUTOFMEMORY; + r->task.proc = read_message_start_proc; + r->channel = channel; + r->msg = msg; + r->ctx = *ctx; + return queue_task( &channel->recv_q, &r->task ); +} + /************************************************************************** * WsReadMessageStart [webservices.@] */ -HRESULT WINAPI WsReadMessageStart( WS_CHANNEL *handle, WS_MESSAGE *msg, const WS_ASYNC_CONTEXT *ctx, - WS_ERROR *error ) +HRESULT WINAPI WsReadMessageStart( WS_CHANNEL *handle, WS_MESSAGE *msg, const WS_ASYNC_CONTEXT *ctx, WS_ERROR *error ) { struct channel *channel = (struct channel *)handle; + WS_ASYNC_CONTEXT ctx_local; + struct async async; HRESULT hr;
TRACE( "%p %p %p %p\n", handle, msg, ctx, error ); if (error) FIXME( "ignoring error parameter\n" ); - if (ctx) FIXME( "ignoring ctx parameter\n" );
if (!channel || !msg) return E_INVALIDARG;
@@ -2528,10 +2568,12 @@ HRESULT WINAPI WsReadMessageStart( WS_CHANNEL *handle, WS_MESSAGE *msg, const WS return WS_E_INVALID_OPERATION; }
- if ((hr = receive_message_bytes( channel, msg )) == S_OK) + if (!ctx) async_init( &async, &ctx_local ); + hr = queue_read_message_start( channel, msg, ctx ? ctx : &ctx_local ); + if (!ctx) { - if ((hr = init_reader( channel )) == S_OK) - hr = WsReadEnvelopeStart( msg, channel->reader, NULL, NULL, NULL ); + if (hr == WS_S_ASYNC) hr = async_wait( &async ); + CloseHandle( async.done ); }
LeaveCriticalSection( &channel->cs );