From 3ad9798263e817d001a3fc8a866ac8b0e0b7e855 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 4 Oct 2006 20:25:42 +0200 Subject: [PATCH] server: Pass the data for message callbacks as vararg from the client side. --- dlls/user/message.c | 17 ++++++----- include/wine/server_protocol.h | 6 ++-- server/protocol.def | 4 +-- server/queue.c | 54 ++++++++++++---------------------- server/trace.c | 4 +-- 5 files changed, 32 insertions(+), 53 deletions(-) diff --git a/dlls/user/message.c b/dlls/user/message.c index 0b4da22c960..ccef67b6452 100644 --- a/dlls/user/message.c +++ b/dlls/user/message.c @@ -2169,6 +2169,7 @@ static void wait_message_reply( UINT flags ) static BOOL put_message_in_queue( const struct send_message_info *info, size_t *reply_size ) { struct packed_message data; + message_data_t msg_data; unsigned int res; int i, timeout = 0; @@ -2191,6 +2192,15 @@ static BOOL put_message_in_queue( const struct send_message_info *info, size_t * return FALSE; } } + else if (info->type == MSG_CALLBACK) + { + msg_data.callback.callback = info->callback; + msg_data.callback.data = info->data; + msg_data.callback.result = 0; + data.data[0] = &msg_data; + data.size[0] = sizeof(msg_data.callback); + data.count = 1; + } else if (info->type == MSG_POSTED && info->msg >= WM_DDE_FIRST && info->msg <= WM_DDE_LAST) { return post_dde_message( &data, info ); @@ -2207,12 +2217,6 @@ static BOOL put_message_in_queue( const struct send_message_info *info, size_t * req->lparam = info->lparam; req->timeout = timeout; - if (info->type == MSG_CALLBACK) - { - req->callback = info->callback; - req->info = info->data; - } - if (info->flags & SMTO_ABORTIFHUNG) req->flags |= SEND_MSG_ABORT_IF_HUNG; for (i = 0; i < data.count; i++) wine_server_add_data( req, data.data[i], data.size[i] ); if ((res = wine_server_call( req ))) @@ -2569,7 +2573,6 @@ BOOL WINAPI SendMessageCallbackW( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa call_sendmsg_callback( callback, hwnd, msg, data, result ); return TRUE; } - FIXME( "callback will not be called\n" ); return send_inter_thread_message( &info, &result ); } diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 29aa6b37bfe..1b7a92086e6 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -2224,10 +2224,8 @@ struct send_message_request unsigned int msg; unsigned long wparam; unsigned long lparam; - unsigned long info; int timeout; - void* callback; - /* VARARG(data,bytes); */ + /* VARARG(data,message_data); */ }; struct send_message_reply { @@ -4428,6 +4426,6 @@ union generic_reply struct query_symlink_reply query_symlink_reply; }; -#define SERVER_PROTOCOL_VERSION 249 +#define SERVER_PROTOCOL_VERSION 250 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/protocol.def b/server/protocol.def index 6358efea205..caddcc265d8 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1596,10 +1596,8 @@ enum char_info_mode unsigned int msg; /* message code */ unsigned long wparam; /* parameters */ unsigned long lparam; /* parameters */ - unsigned long info; /* extra info */ int timeout; /* timeout for reply */ - void* callback; /* callback address */ - VARARG(data,bytes); /* message data for sent messages */ + VARARG(data,message_data); /* message data for sent messages */ @END @REQ(post_quit_message) diff --git a/server/queue.c b/server/queue.c index 64c29fd0098..37cc250d8e4 100644 --- a/server/queue.c +++ b/server/queue.c @@ -180,6 +180,7 @@ static const struct object_ops thread_input_ops = static struct thread_input *foreground_input; static unsigned int last_input_time; +static void free_message( struct message *msg ); /* set the caret window in a given thread input */ static void set_caret_window( struct thread_input *input, user_handle_t win ) @@ -404,11 +405,7 @@ static void free_result( struct message_result *result ) { if (result->timeout) remove_timeout_user( result->timeout ); if (result->data) free( result->data ); - if (result->callback_msg) - { - free( result->callback_msg->data ); - free( result->callback_msg ); - } + if (result->callback_msg) free_message( result->callback_msg ); free( result ); } @@ -522,8 +519,7 @@ static void result_timeout( void *private ) /* allocate and fill a message result structure */ static struct message_result *alloc_message_result( struct msg_queue *send_queue, struct msg_queue *recv_queue, - struct message *msg, int timeout, - void *callback, unsigned long callback_data ) + struct message *msg, int timeout ) { struct message_result *result = mem_alloc( sizeof(*result) ); if (result) @@ -538,7 +534,6 @@ static struct message_result *alloc_message_result( struct msg_queue *send_queue if (msg->type == MSG_CALLBACK) { - struct callback_msg_data *data; struct message *callback_msg = mem_alloc( sizeof(*callback_msg) ); if (!callback_msg) @@ -546,12 +541,6 @@ static struct message_result *alloc_message_result( struct msg_queue *send_queue free( result ); return NULL; } - if (!(data = mem_alloc( sizeof(*data )))) - { - free( callback_msg ); - free( result ); - return NULL; - } callback_msg->type = MSG_CALLBACK_RESULT; callback_msg->win = msg->win; callback_msg->msg = msg->msg; @@ -562,10 +551,11 @@ static struct message_result *alloc_message_result( struct msg_queue *send_queue callback_msg->y = 0; callback_msg->info = 0; callback_msg->result = NULL; - callback_msg->data = data; - callback_msg->data_size = sizeof(*data); - data->callback = callback; - data->data = callback_data; + /* steal the data from the original message */ + callback_msg->data = msg->data; + callback_msg->data_size = msg->data_size; + msg->data = NULL; + msg->data_size = 0; result->callback_msg = callback_msg; list_add_head( &send_queue->callback_result, &result->sender_entry ); @@ -1600,26 +1590,25 @@ DECL_HANDLER(send_message) msg->time = get_tick_count(); msg->x = 0; msg->y = 0; - msg->info = req->info; + msg->info = 0; msg->result = NULL; msg->data = NULL; - msg->data_size = 0; + msg->data_size = get_req_data_size(); + + if (msg->data_size && !(msg->data = memdup( get_req_data(), msg->data_size ))) + { + free( msg ); + release_object( thread ); + return; + } switch(msg->type) { case MSG_OTHER_PROCESS: - msg->data_size = get_req_data_size(); - if (msg->data_size && !(msg->data = memdup( get_req_data(), msg->data_size ))) - { - free( msg ); - break; - } - /* fall through */ case MSG_ASCII: case MSG_UNICODE: case MSG_CALLBACK: - if (!(msg->result = alloc_message_result( send_queue, recv_queue, msg, - req->timeout, req->callback, req->info ))) + if (!(msg->result = alloc_message_result( send_queue, recv_queue, msg, req->timeout ))) { free_message( msg ); break; @@ -1630,13 +1619,6 @@ DECL_HANDLER(send_message) set_queue_bits( recv_queue, QS_SENDMESSAGE ); break; case MSG_POSTED: - /* needed for posted DDE messages */ - msg->data_size = get_req_data_size(); - if (msg->data_size && !(msg->data = memdup( get_req_data(), msg->data_size ))) - { - free( msg ); - break; - } list_add_tail( &recv_queue->msg_list[POST_MESSAGE], &msg->entry ); set_queue_bits( recv_queue, QS_POSTMESSAGE|QS_ALLPOSTMESSAGE ); break; diff --git a/server/trace.c b/server/trace.c index 03c6a3fedec..1ca9b61eb95 100644 --- a/server/trace.c +++ b/server/trace.c @@ -2098,11 +2098,9 @@ static void dump_send_message_request( const struct send_message_request *req ) fprintf( stderr, " msg=%08x,", req->msg ); fprintf( stderr, " wparam=%lx,", req->wparam ); fprintf( stderr, " lparam=%lx,", req->lparam ); - fprintf( stderr, " info=%lx,", req->info ); fprintf( stderr, " timeout=%d,", req->timeout ); - fprintf( stderr, " callback=%p,", req->callback ); fprintf( stderr, " data=" ); - dump_varargs_bytes( cur_size ); + dump_varargs_message_data( cur_size ); } static void dump_post_quit_message_request( const struct post_quit_message_request *req )