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