Alexandre Julliard : server: Add request to retrieve the next pending ioctl call for a device manager.

Alexandre Julliard julliard at wine.codeweavers.com
Wed May 9 07:43:06 CDT 2007


Module: wine
Branch: master
Commit: 78b75108cdb57b58746498542f8e29715f4caf15
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=78b75108cdb57b58746498542f8e29715f4caf15

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue May  8 20:40:26 2007 +0200

server: Add request to retrieve the next pending ioctl call for a device manager.

---

 include/wine/server_protocol.h |   26 +++++++++++++++++++++-
 server/device.c                |   46 ++++++++++++++++++++++++++++++++++++++++
 server/protocol.def            |   16 ++++++++++++++
 server/request.h               |    2 +
 server/trace.c                 |   26 ++++++++++++++++++++++
 5 files changed, 115 insertions(+), 1 deletions(-)

diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 8239e36..e9bb098 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -4014,6 +4014,27 @@ struct delete_device_reply
 };
 
 
+
+struct get_next_device_request_request
+{
+    struct request_header __header;
+    obj_handle_t manager;
+    obj_handle_t prev;
+    unsigned int status;
+    /* VARARG(prev_data,bytes); */
+};
+struct get_next_device_request_reply
+{
+    struct reply_header __header;
+    obj_handle_t next;
+    ioctl_code_t code;
+    void*        user_ptr;
+    data_size_t  in_size;
+    data_size_t  out_size;
+    /* VARARG(next_data,bytes); */
+};
+
+
 enum request
 {
     REQ_new_process,
@@ -4233,6 +4254,7 @@ enum request
     REQ_create_device_manager,
     REQ_create_device,
     REQ_delete_device,
+    REQ_get_next_device_request,
     REQ_NB_REQUESTS
 };
 
@@ -4457,6 +4479,7 @@ union generic_request
     struct create_device_manager_request create_device_manager_request;
     struct create_device_request create_device_request;
     struct delete_device_request delete_device_request;
+    struct get_next_device_request_request get_next_device_request_request;
 };
 union generic_reply
 {
@@ -4679,8 +4702,9 @@ union generic_reply
     struct create_device_manager_reply create_device_manager_reply;
     struct create_device_reply create_device_reply;
     struct delete_device_reply delete_device_reply;
+    struct get_next_device_request_reply get_next_device_request_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 301
+#define SERVER_PROTOCOL_VERSION 302
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/device.c b/server/device.c
index 803282d..b811ff1 100644
--- a/server/device.c
+++ b/server/device.c
@@ -442,3 +442,49 @@ DECL_HANDLER(delete_device)
         release_object( device );
     }
 }
+
+
+/* retrieve the next pending device ioctl request */
+DECL_HANDLER(get_next_device_request)
+{
+    struct ioctl_call *ioctl;
+    struct device_manager *manager;
+    struct list *ptr;
+
+    if (!(manager = (struct device_manager *)get_handle_obj( current->process, req->manager,
+                                                             0, &device_manager_ops )))
+        return;
+
+    if (req->prev)
+    {
+        if ((ioctl = (struct ioctl_call *)get_handle_obj( current->process, req->prev,
+                                                          0, &ioctl_call_ops )))
+        {
+            set_ioctl_result( ioctl, req->status, get_req_data(), get_req_data_size() );
+            close_handle( current->process, req->prev );  /* avoid an extra round-trip for close */
+            release_object( ioctl );
+        }
+        clear_error();
+    }
+
+    if ((ptr = list_head( &manager->requests )))
+    {
+        ioctl = LIST_ENTRY( ptr, struct ioctl_call, mgr_entry );
+        reply->code = ioctl->code;
+        reply->user_ptr = ioctl->device->user_ptr;
+        reply->in_size = ioctl->in_size;
+        reply->out_size = ioctl->out_size;
+        if (ioctl->in_size > get_reply_max_size()) set_error( STATUS_BUFFER_OVERFLOW );
+        else if ((reply->next = alloc_handle( current->process, ioctl, 0, 0 )))
+        {
+            set_reply_data_ptr( ioctl->in_data, ioctl->in_size );
+            ioctl->in_data = NULL;
+            ioctl->in_size = 0;
+            list_remove( &ioctl->mgr_entry );
+            list_init( &ioctl->mgr_entry );
+        }
+    }
+    else set_error( STATUS_PENDING );
+
+    release_object( manager );
+}
diff --git a/server/protocol.def b/server/protocol.def
index a7b4dfd..55055a4 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -2882,3 +2882,19 @@ enum message_type
 @REQ(delete_device)
     obj_handle_t handle;          /* handle to the device */
 @END
+
+
+/* Retrieve the next pending device ioctl request */
+ at REQ(get_next_device_request)
+    obj_handle_t manager;         /* handle to the device manager */
+    obj_handle_t prev;            /* handle to the previous ioctl */
+    unsigned int status;          /* status of the previous ioctl */
+    VARARG(prev_data,bytes);      /* output data of the previous ioctl */
+ at REPLY
+    obj_handle_t next;            /* handle to the next ioctl */
+    ioctl_code_t code;            /* ioctl code */
+    void*        user_ptr;        /* opaque ptr for the device */
+    data_size_t  in_size;         /* total needed input size */
+    data_size_t  out_size;        /* needed output size */
+    VARARG(next_data,bytes);      /* input data of the next ioctl */
+ at END
diff --git a/server/request.h b/server/request.h
index 6d769c1..4f175a6 100644
--- a/server/request.h
+++ b/server/request.h
@@ -327,6 +327,7 @@ DECL_HANDLER(allocate_locally_unique_id);
 DECL_HANDLER(create_device_manager);
 DECL_HANDLER(create_device);
 DECL_HANDLER(delete_device);
+DECL_HANDLER(get_next_device_request);
 
 #ifdef WANT_REQUEST_HANDLERS
 
@@ -550,6 +551,7 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
     (req_handler)req_create_device_manager,
     (req_handler)req_create_device,
     (req_handler)req_delete_device,
+    (req_handler)req_get_next_device_request,
 };
 #endif  /* WANT_REQUEST_HANDLERS */
 
diff --git a/server/trace.c b/server/trace.c
index 5762331..7b8b7e4 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -3492,6 +3492,28 @@ static void dump_delete_device_request( const struct delete_device_request *req
     fprintf( stderr, " handle=%p", req->handle );
 }
 
+static void dump_get_next_device_request_request( const struct get_next_device_request_request *req )
+{
+    fprintf( stderr, " manager=%p,", req->manager );
+    fprintf( stderr, " prev=%p,", req->prev );
+    fprintf( stderr, " status=%08x,", req->status );
+    fprintf( stderr, " prev_data=" );
+    dump_varargs_bytes( cur_size );
+}
+
+static void dump_get_next_device_request_reply( const struct get_next_device_request_reply *req )
+{
+    fprintf( stderr, " next=%p,", req->next );
+    fprintf( stderr, " code=" );
+    dump_ioctl_code( &req->code );
+    fprintf( stderr, "," );
+    fprintf( stderr, " user_ptr=%p,", req->user_ptr );
+    fprintf( stderr, " in_size=%u,", req->in_size );
+    fprintf( stderr, " out_size=%u,", req->out_size );
+    fprintf( stderr, " next_data=" );
+    dump_varargs_bytes( cur_size );
+}
+
 static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_new_process_request,
     (dump_func)dump_get_new_process_info_request,
@@ -3710,6 +3732,7 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_create_device_manager_request,
     (dump_func)dump_create_device_request,
     (dump_func)dump_delete_device_request,
+    (dump_func)dump_get_next_device_request_request,
 };
 
 static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
@@ -3930,6 +3953,7 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_create_device_manager_reply,
     (dump_func)dump_create_device_reply,
     (dump_func)0,
+    (dump_func)dump_get_next_device_request_reply,
 };
 
 static const char * const req_names[REQ_NB_REQUESTS] = {
@@ -4150,6 +4174,7 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
     "create_device_manager",
     "create_device",
     "delete_device",
+    "get_next_device_request",
 };
 
 static const struct
@@ -4181,6 +4206,7 @@ static const struct
     { "ERROR_CLIPBOARD_NOT_OPEN",    0xc0010000 | ERROR_CLIPBOARD_NOT_OPEN },
     { "ERROR_INVALID_INDEX",         0xc0010000 | ERROR_INVALID_INDEX },
     { "ERROR_INVALID_WINDOW_HANDLE", 0xc0010000 | ERROR_INVALID_WINDOW_HANDLE },
+    { "FILE_DELETED",                STATUS_FILE_DELETED },
     { "FILE_IS_A_DIRECTORY",         STATUS_FILE_IS_A_DIRECTORY },
     { "FILE_LOCK_CONFLICT",          STATUS_FILE_LOCK_CONFLICT },
     { "GENERIC_NOT_MAPPED",          STATUS_GENERIC_NOT_MAPPED },




More information about the wine-cvs mailing list