Alexandre Julliard : server: Add support for allocating purely client-side user handles.
Alexandre Julliard
julliard at winehq.org
Mon Oct 12 11:19:47 CDT 2009
Module: wine
Branch: master
Commit: 9018e13c5e727e6f66d8bb0be969a6638ce5b695
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9018e13c5e727e6f66d8bb0be969a6638ce5b695
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Oct 12 14:25:01 2009 +0200
server: Add support for allocating purely client-side user handles.
---
include/wine/server_protocol.h | 35 +++++++++++++++++++++++++++++++++--
server/protocol.def | 13 +++++++++++++
server/request.h | 8 ++++++++
server/trace.c | 20 ++++++++++++++++++++
server/user.c | 19 +++++++++++++++++++
server/user.h | 3 ++-
6 files changed, 95 insertions(+), 3 deletions(-)
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 7683e8a..d2b159a 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -115,8 +115,8 @@ typedef union
struct
{
int code;
- client_ptr_t string;
data_size_t length;
+ client_ptr_t string;
} output_string;
struct
{
@@ -4614,6 +4614,31 @@ struct set_window_layered_info_reply
};
+
+struct alloc_user_handle_request
+{
+ struct request_header __header;
+};
+struct alloc_user_handle_reply
+{
+ struct reply_header __header;
+ user_handle_t handle;
+ char __pad_12[4];
+};
+
+
+
+struct free_user_handle_request
+{
+ struct request_header __header;
+ user_handle_t handle;
+};
+struct free_user_handle_reply
+{
+ struct reply_header __header;
+};
+
+
enum request
{
REQ_new_process,
@@ -4854,6 +4879,8 @@ enum request
REQ_add_fd_completion,
REQ_get_window_layered_info,
REQ_set_window_layered_info,
+ REQ_alloc_user_handle,
+ REQ_free_user_handle,
REQ_NB_REQUESTS
};
@@ -5099,6 +5126,8 @@ union generic_request
struct add_fd_completion_request add_fd_completion_request;
struct get_window_layered_info_request get_window_layered_info_request;
struct set_window_layered_info_request set_window_layered_info_request;
+ struct alloc_user_handle_request alloc_user_handle_request;
+ struct free_user_handle_request free_user_handle_request;
};
union generic_reply
{
@@ -5342,8 +5371,10 @@ union generic_reply
struct add_fd_completion_reply add_fd_completion_reply;
struct get_window_layered_info_reply get_window_layered_info_reply;
struct set_window_layered_info_reply set_window_layered_info_reply;
+ struct alloc_user_handle_reply alloc_user_handle_reply;
+ struct free_user_handle_reply free_user_handle_reply;
};
-#define SERVER_PROTOCOL_VERSION 391
+#define SERVER_PROTOCOL_VERSION 392
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/protocol.def b/server/protocol.def
index d7b31f4..a0e1702 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -3224,3 +3224,16 @@ enum message_type
unsigned int alpha; /* alpha (0..255) */
unsigned int flags; /* LWA_* flags */
@END
+
+
+/* Allocate an arbitrary user handle */
+ at REQ(alloc_user_handle)
+ at REPLY
+ user_handle_t handle; /* allocated handle */
+ at END
+
+
+/* Free an arbitrary user handle */
+ at REQ(free_user_handle)
+ user_handle_t handle; /* handle to free*/
+ at END
diff --git a/server/request.h b/server/request.h
index 02c7984..87b6a75 100644
--- a/server/request.h
+++ b/server/request.h
@@ -349,6 +349,8 @@ DECL_HANDLER(set_completion_info);
DECL_HANDLER(add_fd_completion);
DECL_HANDLER(get_window_layered_info);
DECL_HANDLER(set_window_layered_info);
+DECL_HANDLER(alloc_user_handle);
+DECL_HANDLER(free_user_handle);
#ifdef WANT_REQUEST_HANDLERS
@@ -593,6 +595,8 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
(req_handler)req_add_fd_completion,
(req_handler)req_get_window_layered_info,
(req_handler)req_set_window_layered_info,
+ (req_handler)req_alloc_user_handle,
+ (req_handler)req_free_user_handle,
};
C_ASSERT( sizeof(affinity_t) == 8 );
@@ -1892,6 +1896,10 @@ C_ASSERT( FIELD_OFFSET(struct set_window_layered_info_request, color_key) == 16
C_ASSERT( FIELD_OFFSET(struct set_window_layered_info_request, alpha) == 20 );
C_ASSERT( FIELD_OFFSET(struct set_window_layered_info_request, flags) == 24 );
C_ASSERT( sizeof(struct set_window_layered_info_request) == 32 );
+C_ASSERT( FIELD_OFFSET(struct alloc_user_handle_reply, handle) == 8 );
+C_ASSERT( sizeof(struct alloc_user_handle_reply) == 16 );
+C_ASSERT( FIELD_OFFSET(struct free_user_handle_request, handle) == 12 );
+C_ASSERT( sizeof(struct free_user_handle_request) == 16 );
#endif /* WANT_REQUEST_HANDLERS */
diff --git a/server/trace.c b/server/trace.c
index 10c731c..b7dec85 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -3780,6 +3780,20 @@ static void dump_set_window_layered_info_request( const struct set_window_layere
fprintf( stderr, ", flags=%08x", req->flags );
}
+static void dump_alloc_user_handle_request( const struct alloc_user_handle_request *req )
+{
+}
+
+static void dump_alloc_user_handle_reply( const struct alloc_user_handle_reply *req )
+{
+ fprintf( stderr, " handle=%08x", req->handle );
+}
+
+static void dump_free_user_handle_request( const struct free_user_handle_request *req )
+{
+ fprintf( stderr, " handle=%08x", req->handle );
+}
+
static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
(dump_func)dump_new_process_request,
(dump_func)dump_get_new_process_info_request,
@@ -4019,6 +4033,8 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
(dump_func)dump_add_fd_completion_request,
(dump_func)dump_get_window_layered_info_request,
(dump_func)dump_set_window_layered_info_request,
+ (dump_func)dump_alloc_user_handle_request,
+ (dump_func)dump_free_user_handle_request,
};
static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
@@ -4260,6 +4276,8 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
NULL,
(dump_func)dump_get_window_layered_info_reply,
NULL,
+ (dump_func)dump_alloc_user_handle_reply,
+ NULL,
};
static const char * const req_names[REQ_NB_REQUESTS] = {
@@ -4501,6 +4519,8 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
"add_fd_completion",
"get_window_layered_info",
"set_window_layered_info",
+ "alloc_user_handle",
+ "free_user_handle",
};
static const struct
diff --git a/server/user.c b/server/user.c
index 6be1c8f..2515799 100644
--- a/server/user.c
+++ b/server/user.c
@@ -20,6 +20,7 @@
#include "thread.h"
#include "user.h"
+#include "request.h"
struct user_handle
{
@@ -164,3 +165,21 @@ void *next_user_handle( user_handle_t *handle, enum user_object type )
}
return NULL;
}
+
+/* allocate an arbitrary user handle */
+DECL_HANDLER(alloc_user_handle)
+{
+ reply->handle = alloc_user_handle( NULL, USER_CLIENT );
+}
+
+
+/* free an arbitrary user handle */
+DECL_HANDLER(free_user_handle)
+{
+ struct user_handle *entry;
+
+ if ((entry = handle_to_entry( req->handle )) && entry->type == USER_CLIENT)
+ free_user_entry( entry );
+ else
+ set_error( STATUS_INVALID_HANDLE );
+}
diff --git a/server/user.h b/server/user.h
index 166d20b..bf1e23c 100644
--- a/server/user.h
+++ b/server/user.h
@@ -35,7 +35,8 @@ struct clipboard;
enum user_object
{
USER_WINDOW = 1,
- USER_HOOK
+ USER_HOOK,
+ USER_CLIENT /* arbitrary client handle */
};
#define DESKTOP_ATOM ((atom_t)32769)
More information about the wine-cvs
mailing list