[Spice-devel] [PATCH 10/18] Move InputsChannelClient to a separate file

Jonathon Jongsma jjongsma at redhat.com
Wed Apr 27 16:50:33 UTC 2016


Preparation for converting to GObject
---
 server/Makefile.am             |  2 +
 server/inputs-channel-client.c | 92 ++++++++++++++++++++++++++++++++++++++++++
 server/inputs-channel-client.h | 44 ++++++++++++++++++++
 server/inputs-channel.c        | 76 ++++++++++------------------------
 server/inputs-channel.h        | 11 ++++-
 5 files changed, 169 insertions(+), 56 deletions(-)
 create mode 100644 server/inputs-channel-client.c
 create mode 100644 server/inputs-channel-client.h

diff --git a/server/Makefile.am b/server/Makefile.am
index 786cd42..66b7f73 100644
--- a/server/Makefile.am
+++ b/server/Makefile.am
@@ -80,6 +80,8 @@ libserver_la_SOURCES =				\
 	glz-encoder-priv.h	\
 	inputs-channel.c			\
 	inputs-channel.h			\
+	inputs-channel-client.c		\
+	inputs-channel-client.h		\
 	jpeg-encoder.c				\
 	jpeg-encoder.h				\
 	lz4-encoder.c				\
diff --git a/server/inputs-channel-client.c b/server/inputs-channel-client.c
new file mode 100644
index 0000000..adcc5c6
--- /dev/null
+++ b/server/inputs-channel-client.c
@@ -0,0 +1,92 @@
+/*
+   Copyright (C) 2009-2015 Red Hat, Inc.
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "inputs-channel-client.h"
+#include "inputs-channel.h"
+#include "migration-protocol.h"
+
+struct InputsChannelClient {
+    RedChannelClient base;
+    uint16_t motion_count;
+};
+
+InputsChannelClient* inputs_channel_client_create(RedChannel *channel,
+                                                  RedClient *client,
+                                                  RedsStream *stream,
+                                                  int monitor_latency,
+                                                  int num_common_caps,
+                                                  uint32_t *common_caps,
+                                                  int num_caps,
+                                                  uint32_t *caps)
+{
+    InputsChannelClient* icc =
+        (InputsChannelClient*)red_channel_client_create(sizeof(InputsChannelClient),
+                                                        channel, client,
+                                                        stream,
+                                                        monitor_latency,
+                                                        num_common_caps,
+                                                        common_caps, num_caps,
+                                                        caps);
+    if (icc)
+        icc->motion_count = 0;
+    return icc;
+}
+
+void inputs_channel_client_send_migrate_data(RedChannelClient *rcc,
+                                             SpiceMarshaller *m,
+                                             RedPipeItem *item)
+{
+    InputsChannelClient *icc = SPICE_CONTAINEROF(rcc, InputsChannelClient, base);
+    InputsChannel *inputs = (InputsChannel*)rcc->channel;
+
+    inputs_channel_set_src_during_migrate(inputs, FALSE);
+    red_channel_client_init_send_data(rcc, SPICE_MSG_MIGRATE_DATA, item);
+
+    spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_INPUTS_MAGIC);
+    spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_INPUTS_VERSION);
+    spice_marshaller_add_uint16(m, icc->motion_count);
+}
+
+void inputs_channel_client_handle_migrate_data(InputsChannelClient *icc,
+                                               uint16_t motion_count)
+{
+    icc->motion_count = motion_count;
+
+    for (; icc->motion_count >= SPICE_INPUT_MOTION_ACK_BUNCH;
+           icc->motion_count -= SPICE_INPUT_MOTION_ACK_BUNCH) {
+        red_channel_client_pipe_add_type(&icc->base, RED_PIPE_ITEM_MOUSE_MOTION_ACK);
+    }
+}
+
+void inputs_channel_client_on_mouse_motion(InputsChannelClient *icc)
+{
+    InputsChannel *inputs_channel = (InputsChannel *)icc->base.channel;
+
+    if (++icc->motion_count % SPICE_INPUT_MOTION_ACK_BUNCH == 0 &&
+        !inputs_channel_is_src_during_migrate(inputs_channel)) {
+        red_channel_client_pipe_add_type(&icc->base, RED_PIPE_ITEM_MOUSE_MOTION_ACK);
+        icc->motion_count = 0;
+    }
+}
+
+RedChannelClient* inputs_channel_client_get_base(InputsChannelClient* icc)
+{
+    return &icc->base;
+}
diff --git a/server/inputs-channel-client.h b/server/inputs-channel-client.h
new file mode 100644
index 0000000..e655d9f
--- /dev/null
+++ b/server/inputs-channel-client.h
@@ -0,0 +1,44 @@
+/*
+   Copyright (C) 2009-2015 Red Hat, Inc.
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _INPUTS_CHANNEL_CLIENT_H_
+#define _INPUTS_CHANNEL_CLIENT_H_
+
+#include "red-channel.h"
+
+typedef struct InputsChannelClient InputsChannelClient;
+
+InputsChannelClient* inputs_channel_client_create(RedChannel *channel,
+                                                  RedClient *client,
+                                                  RedsStream *stream,
+                                                  int monitor_latency,
+                                                  int num_common_caps,
+                                                  uint32_t *common_caps,
+                                                  int num_caps,
+                                                  uint32_t *caps);
+
+void inputs_channel_client_send_migrate_data(RedChannelClient *rcc,
+                                             SpiceMarshaller *m,
+                                             RedPipeItem *item);
+void inputs_channel_client_handle_migrate_data(InputsChannelClient *icc,
+                                               uint16_t motion_count);
+void inputs_channel_client_on_mouse_motion(InputsChannelClient *icc);
+
+/* FIXME: temporary until GObjectification */
+RedChannelClient* inputs_channel_client_get_base(InputsChannelClient* icc);
+
+#endif /* _INPUTS_CHANNEL_CLIENT_H_ */
diff --git a/server/inputs-channel.c b/server/inputs-channel.c
index 221203d..72d1bca 100644
--- a/server/inputs-channel.c
+++ b/server/inputs-channel.c
@@ -39,6 +39,7 @@
 #include "reds.h"
 #include "reds-stream.h"
 #include "red-channel.h"
+#include "inputs-channel-client.h"
 #include "main-channel-client.h"
 #include "inputs-channel.h"
 #include "migration-protocol.h"
@@ -99,11 +100,6 @@ RedsState* spice_tablet_state_get_server(SpiceTabletState *st)
     return st->reds;
 }
 
-typedef struct InputsChannelClient {
-    RedChannelClient base;
-    uint16_t motion_count;
-} InputsChannelClient;
-
 struct InputsChannel {
     RedChannel base;
     uint8_t recv_buf[RECEIVE_BUF_SIZE];
@@ -115,13 +111,6 @@ struct InputsChannel {
     SpiceTabletInstance *tablet;
 };
 
-enum {
-    RED_PIPE_ITEM_INPUTS_INIT = RED_PIPE_ITEM_TYPE_CHANNEL_BASE,
-    RED_PIPE_ITEM_MOUSE_MOTION_ACK,
-    RED_PIPE_ITEM_KEY_MODIFIERS,
-    RED_PIPE_ITEM_MIGRATE_DATA,
-};
-
 typedef struct RedInputsPipeItem {
     RedPipeItem base;
 } RedInputsPipeItem;
@@ -153,7 +142,7 @@ void inputs_channel_set_tablet_logical_size(InputsChannel *inputs, int x_res, in
     sif->set_logical_size(inputs->tablet, x_res, y_res);
 }
 
-const VDAgentMouseState *inputs_channel_get_mouse_state(InputsChannel *inputs)
+VDAgentMouseState *inputs_channel_get_mouse_state(InputsChannel *inputs)
 {
     return &inputs->mouse_state;
 }
@@ -238,21 +227,6 @@ static RedPipeItem *red_inputs_key_modifiers_item_new(void *data, int num)
     return &item->base;
 }
 
-static void inputs_channel_send_migrate_data(RedChannelClient *rcc,
-                                             SpiceMarshaller *m,
-                                             RedPipeItem *item)
-{
-    InputsChannelClient *icc = SPICE_CONTAINEROF(rcc, InputsChannelClient, base);
-    InputsChannel *inputs = SPICE_CONTAINEROF(rcc->channel, InputsChannel, base);
-
-    inputs->src_during_migrate = FALSE;
-    red_channel_client_init_send_data(rcc, SPICE_MSG_MIGRATE_DATA, item);
-
-    spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_INPUTS_MAGIC);
-    spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_INPUTS_VERSION);
-    spice_marshaller_add_uint16(m, icc->motion_count);
-}
-
 static void inputs_channel_release_pipe_item(RedChannelClient *rcc,
     RedPipeItem *base, int item_pushed)
 {
@@ -288,7 +262,7 @@ static void inputs_channel_send_item(RedChannelClient *rcc, RedPipeItem *base)
             red_channel_client_init_send_data(rcc, SPICE_MSG_INPUTS_MOUSE_MOTION_ACK, base);
             break;
         case RED_PIPE_ITEM_MIGRATE_DATA:
-            inputs_channel_send_migrate_data(rcc, m, base);
+            inputs_channel_client_send_migrate_data(rcc, m, base);
             break;
         default:
             spice_warning("invalid pipe iten %d", base->type);
@@ -336,11 +310,7 @@ static int inputs_channel_handle_parsed(RedChannelClient *rcc, uint32_t size, ui
         SpiceMouseInstance *mouse = inputs_channel_get_mouse(inputs_channel);
         SpiceMsgcMouseMotion *mouse_motion = message;
 
-        if (++icc->motion_count % SPICE_INPUT_MOTION_ACK_BUNCH == 0 &&
-            !inputs_channel->src_during_migrate) {
-            red_channel_client_pipe_add_type(rcc, RED_PIPE_ITEM_MOUSE_MOTION_ACK);
-            icc->motion_count = 0;
-        }
+        inputs_channel_client_on_mouse_motion(icc);
         if (mouse && reds_get_mouse_mode(reds) == SPICE_MOUSE_MODE_SERVER) {
             SpiceMouseInterface *sif;
             sif = SPICE_CONTAINEROF(mouse->base.sif, SpiceMouseInterface, base);
@@ -354,11 +324,7 @@ static int inputs_channel_handle_parsed(RedChannelClient *rcc, uint32_t size, ui
         SpiceMsgcMousePosition *pos = message;
         SpiceTabletInstance *tablet = inputs_channel_get_tablet(inputs_channel);
 
-        if (++icc->motion_count % SPICE_INPUT_MOTION_ACK_BUNCH == 0 &&
-            !inputs_channel->src_during_migrate) {
-            red_channel_client_pipe_add_type(rcc, RED_PIPE_ITEM_MOUSE_MOTION_ACK);
-            icc->motion_count = 0;
-        }
+        inputs_channel_client_on_mouse_motion(icc);
         if (reds_get_mouse_mode(reds) != SPICE_MOUSE_MODE_CLIENT) {
             break;
         }
@@ -540,18 +506,13 @@ static void inputs_connect(RedChannel *channel, RedClient *client,
     }
 
     spice_printerr("inputs channel client create");
-    icc = (InputsChannelClient*)red_channel_client_create(sizeof(InputsChannelClient),
-                                                          channel,
-                                                          client,
-                                                          stream,
-                                                          FALSE,
-                                                          num_common_caps, common_caps,
-                                                          num_caps, caps);
+    icc = inputs_channel_client_create(channel, client, stream, FALSE,
+                                       num_common_caps, common_caps,
+                                       num_caps, caps);
     if (!icc) {
         return;
     }
-    icc->motion_count = 0;
-    inputs_pipe_add_init(&icc->base);
+    inputs_pipe_add_init(inputs_channel_client_get_base(icc));
 }
 
 static void inputs_migrate(RedChannelClient *rcc)
@@ -592,7 +553,7 @@ static int inputs_channel_handle_migrate_data(RedChannelClient *rcc,
                                               uint32_t size,
                                               void *message)
 {
-    InputsChannelClient *icc = SPICE_CONTAINEROF(rcc, InputsChannelClient, base);
+    InputsChannelClient *icc = (InputsChannelClient*)rcc;
     InputsChannel *inputs = SPICE_CONTAINEROF(rcc->channel, InputsChannel, base);
     SpiceMigrateDataHeader *header;
     SpiceMigrateDataInputs *mig_data;
@@ -607,12 +568,7 @@ static int inputs_channel_handle_migrate_data(RedChannelClient *rcc,
         return FALSE;
     }
     key_modifiers_sender(inputs);
-    icc->motion_count = mig_data->motion_count;
-
-    for (; icc->motion_count >= SPICE_INPUT_MOTION_ACK_BUNCH;
-           icc->motion_count -= SPICE_INPUT_MOTION_ACK_BUNCH) {
-        red_channel_client_pipe_add_type(rcc, RED_PIPE_ITEM_MOUSE_MOTION_ACK);
-    }
+    inputs_channel_client_handle_migrate_data(icc, mig_data->motion_count);
     return TRUE;
 }
 
@@ -720,3 +676,13 @@ void inputs_channel_detach_tablet(InputsChannel *inputs, SpiceTabletInstance *ta
     inputs->tablet = NULL;
 }
 
+gboolean inputs_channel_is_src_during_migrate(InputsChannel *inputs)
+{
+    return inputs->src_during_migrate;
+}
+
+void inputs_channel_set_src_during_migrate(InputsChannel *inputs,
+                                           gboolean value)
+{
+    inputs->src_during_migrate = value;
+}
diff --git a/server/inputs-channel.h b/server/inputs-channel.h
index fce757f..ce25ac7 100644
--- a/server/inputs-channel.h
+++ b/server/inputs-channel.h
@@ -27,7 +27,7 @@
 typedef struct InputsChannel InputsChannel;
 
 InputsChannel* inputs_channel_new(RedsState *reds);
-const VDAgentMouseState *inputs_channel_get_mouse_state(InputsChannel *inputs);
+VDAgentMouseState *inputs_channel_get_mouse_state(InputsChannel *inputs);
 void inputs_channel_on_keyboard_leds_change(InputsChannel *inputs, uint8_t leds);
 void inputs_channel_set_tablet_logical_size(InputsChannel *inputs, int x_res, int y_res);
 
@@ -41,5 +41,14 @@ int inputs_channel_has_tablet(InputsChannel *inputs);
 void inputs_channel_detach_tablet(InputsChannel *inputs, SpiceTabletInstance *tablet);
 RedsState* spice_tablet_state_get_server(SpiceTabletState *dev);
 RedsState* spice_kbd_state_get_server(SpiceKbdState *dev);
+gboolean inputs_channel_is_src_during_migrate(InputsChannel *inputs);
+void inputs_channel_set_src_during_migrate(InputsChannel *inputs, gboolean value);
+
+enum {
+    RED_PIPE_ITEM_INPUTS_INIT = RED_PIPE_ITEM_TYPE_CHANNEL_BASE,
+    RED_PIPE_ITEM_MOUSE_MOTION_ACK,
+    RED_PIPE_ITEM_KEY_MODIFIERS,
+    RED_PIPE_ITEM_MIGRATE_DATA,
+};
 
 #endif
-- 
2.4.11



More information about the Spice-devel mailing list