Alexandre Julliard : server:
Pass the data for message callbacks as vararg from the client side.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Oct 4 14:33:25 CDT 2006
Module: wine
Branch: master
Commit: 3ad9798263e817d001a3fc8a866ac8b0e0b7e855
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3ad9798263e817d001a3fc8a866ac8b0e0b7e855
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Oct 4 20:25:42 2006 +0200
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 0b4da22..ccef67b 100644
--- a/dlls/user/message.c
+++ b/dlls/user/message.c
@@ -2169,6 +2169,7 @@ static void wait_message_reply( UINT fla
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
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
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 h
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 29aa6b3..1b7a920 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 6358efe..caddcc2 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -1596,10 +1596,8 @@ #define SNAP_MODULE 0x00000008
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 64c29fd..37cc250 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -180,6 +180,7 @@ static const struct object_ops thread_in
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_
{
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 *privat
/* 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_mess
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_mess
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_mess
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 03c6a3f..1ca9b61 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -2098,11 +2098,9 @@ static void dump_send_message_request( c
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 )
More information about the wine-cvs
mailing list