[Spice-commits] server/char-device.c server/char-device.h server/spicevmc.c

Frediano Ziglio fziglio at kemper.freedesktop.org
Wed Aug 23 15:12:27 UTC 2017


 server/char-device.c |   23 +++++++++++++++++++++++
 server/char-device.h |    3 +++
 server/spicevmc.c    |   10 +++-------
 3 files changed, 29 insertions(+), 7 deletions(-)

New commits:
commit 930a1196e31aaa8485889b4ed94ea8d8ffb6ba60
Author: Frediano Ziglio <fziglio at redhat.com>
Date:   Tue May 16 08:48:04 2017 +0100

    char-device: Allows to handle port events from any char device
    
    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>
    Acked-by: Jonathon Jongsma <jjongsma at redhat.com>

diff --git a/server/char-device.c b/server/char-device.c
index 94c4f7fb..658f9f36 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_STATIC_STRINGS |
                                                         G_PARAM_READWRITE));
+
+    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 f66e2a15..dccd576d 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 34d5c6e4..a6ca59fb 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-commits mailing list