[Spice-devel] [RFC PATCH spice-server v2 01/19] char-device: Allows to handle port events from any char device
Jonathon Jongsma
jjongsma at redhat.com
Wed Aug 23 14:56:19 UTC 2017
Acked-by: Jonathon Jongsma <jjongsma at redhat.com>
On Wed, 2017-06-14 at 16:39 +0100, Frediano Ziglio wrote:
> From spice_server_port_event API you can send port events to
> any char device. Although currently this is used only for "port"
> devices implemented in spicevmc.c this will allow to support
> such events using different objects.
>
> This will be used for instance for a streaming device which
> will be a specific SpicePort implementation.
>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> server/char-device.c | 23 +++++++++++++++++++++++
> server/char-device.h | 3 +++
> server/spicevmc.c | 10 +++-------
> 3 files changed, 29 insertions(+), 7 deletions(-)
>
> diff --git a/server/char-device.c b/server/char-device.c
> index ab0707f..762ebac 100644
> --- a/server/char-device.c
> +++ b/server/char-device.c
> @@ -1110,6 +1110,11 @@ red_char_device_finalize(GObject *object)
> }
>
> static void
> +port_event_none(RedCharDevice *self G_GNUC_UNUSED, uint8_t event
> G_GNUC_UNUSED)
> +{
> +}
> +
> +static void
> red_char_device_class_init(RedCharDeviceClass *klass)
> {
> GObjectClass *object_class = G_OBJECT_CLASS(klass);
> @@ -1152,6 +1157,24 @@ red_char_device_class_init(RedCharDeviceClass
> *klass)
> 0,
> G_MAXUINT64, 0,
> G_PARAM_STAT
> IC_STRINGS |
> G_PARAM_READ
> WRITE));
> +
> + klass->port_event = port_event_none;
> +}
> +
> +SPICE_GNUC_VISIBLE void
> spice_server_port_event(SpiceCharDeviceInstance *sin, uint8_t event)
> +{
> + if (sin->st == NULL) {
> + spice_warning("no SpiceCharDeviceState attached to instance
> %p", sin);
> + return;
> + }
> +
> + RedCharDeviceClass *klass = RED_CHAR_DEVICE_GET_CLASS(sin->st);
> + if (!klass) {
> + // wrong object, a warning is already produced by
> RED_CHAR_DEVICE_GET_CLASS
> + return;
> + }
> +
> + return klass->port_event(sin->st, event);
> }
>
> static void
> diff --git a/server/char-device.h b/server/char-device.h
> index f66e2a1..dccd576 100644
> --- a/server/char-device.h
> +++ b/server/char-device.h
> @@ -78,6 +78,9 @@ struct RedCharDeviceClass
> * due to slow flow or due to some other error.
> * The called instance should disconnect the client, or at least
> the corresponding channel */
> void (*remove_client)(RedCharDevice *self, RedClient *client);
> +
> + /* This cb is called when device receives an event */
> + void (*port_event)(RedCharDevice *self, uint8_t event);
> };
>
> GType red_char_device_get_type(void) G_GNUC_CONST;
> diff --git a/server/spicevmc.c b/server/spicevmc.c
> index 34d5c6e..a6ca59f 100644
> --- a/server/spicevmc.c
> +++ b/server/spicevmc.c
> @@ -866,15 +866,10 @@ void spicevmc_device_disconnect(RedsState
> *reds, SpiceCharDeviceInstance *sin)
> sin->st = NULL;
> }
>
> -SPICE_GNUC_VISIBLE void
> spice_server_port_event(SpiceCharDeviceInstance *sin, uint8_t event)
> +static void spicevmc_port_event(RedCharDevice *char_dev, uint8_t
> event)
> {
> RedVmcChannel *channel;
> - RedCharDeviceSpiceVmc *device = RED_CHAR_DEVICE_SPICEVMC(sin-
> >st);
> -
> - if (sin->st == NULL) {
> - spice_warning("no SpiceCharDeviceState attached to instance
> %p", sin);
> - return;
> - }
> + RedCharDeviceSpiceVmc *device =
> RED_CHAR_DEVICE_SPICEVMC(char_dev);
>
> channel = RED_VMC_CHANNEL(device->channel);
>
> @@ -953,6 +948,7 @@
> red_char_device_spicevmc_class_init(RedCharDeviceSpiceVmcClass
> *klass)
> char_dev_class->send_msg_to_client =
> spicevmc_chardev_send_msg_to_client;
> char_dev_class->send_tokens_to_client =
> spicevmc_char_dev_send_tokens_to_client;
> char_dev_class->remove_client = spicevmc_char_dev_remove_client;
> + char_dev_class->port_event = spicevmc_port_event;
>
> g_object_class_install_property(object_class,
> PROP_CHANNEL,
More information about the Spice-devel
mailing list