Hans Leidekker : webservices: Add async support in WsReadMessageStart.
Alexandre Julliard
julliard at winehq.org
Wed May 19 14:55:13 CDT 2021
Module: wine
Branch: master
Commit: 48f2cabb6cfbd23f26956b6398a2ee1253d636b8
URL: https://source.winehq.org/git/wine.git/?a=commit;h=48f2cabb6cfbd23f26956b6398a2ee1253d636b8
Author: Hans Leidekker <hans at codeweavers.com>
Date: Wed May 19 09:32:10 2021 +0200
webservices: Add async support in WsReadMessageStart.
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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 );
More information about the wine-cvs
mailing list