[Spice-devel] [PATCH 07/11] Move InputsChannelClient to a separate file
Frediano Ziglio
fziglio at redhat.com
Fri May 13 14:57:57 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 5a5c7e8..cca3b9b 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;
> +}
For most of inputs-channel.c there are conversion from RedChannelClient* to
InputsChannelClient* which are much less type unsafe, why a function for
such conversion?
This could be eliminated if inputs_channel_client_create returned
a RedChannelClient*.
Also in inputs-channel-client.c there is the RedChannel* -> InputsChannel*
conversion.
> 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 584204f..2ae1d06 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;
> }
> @@ -239,21 +228,6 @@ static RedPipeItem *red_inputs_key_modifiers_item_new(
> 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)
> {
> @@ -289,7 +263,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);
> @@ -337,11 +311,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);
> @@ -355,11 +325,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;
> }
> @@ -541,18 +507,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)
> @@ -593,7 +554,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;
> @@ -608,12 +569,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;
> }
>
> @@ -721,3 +677,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,
> +};
>
This enumeration can be moved to the client header.
> #endif
Frediano
More information about the Spice-devel
mailing list