summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2016-04-01 13:37:49 +0100
committerJonathon Jongsma <jjongsma@redhat.com>2016-04-07 11:42:37 -0500
commit0c6e51011bb0f6336a5dfaafb2ba02428ed220a9 (patch)
tree3741722fef11f29fc2c8234ca05b29debfd3988b
parent87b6b9273d61293c1468044f1e1a2c738ce5089b (diff)
Move RedCharDeviceCallbacks into RedCharDeviceClass
This structure holding virtual function pointers was kept until now as a RedCharDevice member in order to make the GObject conversion easier. Now that all RedCharDevice children are converted to GObject, it can be moved into RedCharDeviceClass.
-rw-r--r--server/char-device.c45
-rw-r--r--server/char-device.h71
-rw-r--r--server/reds.c35
-rw-r--r--server/smartcard.c20
-rw-r--r--server/spicevmc.c36
5 files changed, 94 insertions, 113 deletions
diff --git a/server/char-device.c b/server/char-device.c
index 693e8bb4..e17e3be1 100644
--- a/server/char-device.c
+++ b/server/char-device.c
@@ -69,7 +69,6 @@ struct RedCharDevicePrivate {
int during_read_from_device;
int during_write_to_device;
- RedCharDeviceCallbacks cbs;
void *opaque;
SpiceServer *reds;
};
@@ -106,21 +105,27 @@ typedef struct RedCharDeviceMsgToClientItem {
static RedCharDeviceMsgToClient *
red_char_device_read_one_msg_from_device(RedCharDevice *dev)
{
- return dev->priv->cbs.read_one_msg_from_device(dev->priv->sin, dev->priv->opaque);
+ RedCharDeviceClass *klass = RED_CHAR_DEVICE_GET_CLASS(dev);
+
+ return klass->read_one_msg_from_device(dev->priv->sin, dev->priv->opaque);
}
static RedCharDeviceMsgToClient *
red_char_device_ref_msg_to_client(RedCharDevice *dev,
RedCharDeviceMsgToClient *msg)
{
- return dev->priv->cbs.ref_msg_to_client(msg, dev->priv->opaque);
+ RedCharDeviceClass *klass = RED_CHAR_DEVICE_GET_CLASS(dev);
+
+ return klass->ref_msg_to_client(msg, dev->priv->opaque);
}
static void
red_char_device_unref_msg_to_client(RedCharDevice *dev,
RedCharDeviceMsgToClient *msg)
{
- dev->priv->cbs.unref_msg_to_client(msg, dev->priv->opaque);
+ RedCharDeviceClass *klass = RED_CHAR_DEVICE_GET_CLASS(dev);
+
+ klass->unref_msg_to_client(msg, dev->priv->opaque);
}
static void
@@ -128,7 +133,9 @@ red_char_device_send_msg_to_client(RedCharDevice *dev,
RedCharDeviceMsgToClient *msg,
RedClient *client)
{
- dev->priv->cbs.send_msg_to_client(msg, client, dev->priv->opaque);
+ RedCharDeviceClass *klass = RED_CHAR_DEVICE_GET_CLASS(dev);
+
+ klass->send_msg_to_client(msg, client, dev->priv->opaque);
}
static void
@@ -136,21 +143,27 @@ red_char_device_send_tokens_to_client(RedCharDevice *dev,
RedClient *client,
uint32_t tokens)
{
- dev->priv->cbs.send_tokens_to_client(client, tokens, dev->priv->opaque);
+ RedCharDeviceClass *klass = RED_CHAR_DEVICE_GET_CLASS(dev);
+
+ klass->send_tokens_to_client(client, tokens, dev->priv->opaque);
}
static void
red_char_device_on_free_self_token(RedCharDevice *dev)
{
- if (dev->priv->cbs.on_free_self_token != NULL) {
- dev->priv->cbs.on_free_self_token(dev->priv->opaque);
+ RedCharDeviceClass *klass = RED_CHAR_DEVICE_GET_CLASS(dev);
+
+ if (klass->on_free_self_token != NULL) {
+ klass->on_free_self_token(dev->priv->opaque);
}
}
static void
red_char_device_remove_client(RedCharDevice *dev, RedClient *client)
{
- dev->priv->cbs.remove_client(client, dev->priv->opaque);
+ RedCharDeviceClass *klass = RED_CHAR_DEVICE_GET_CLASS(dev);
+
+ klass->remove_client(client, dev->priv->opaque);
}
static void red_char_device_write_buffer_free(RedCharDeviceWriteBuffer *buf)
@@ -1234,17 +1247,3 @@ red_char_device_init(RedCharDevice *self)
g_signal_connect(self, "notify::sin", G_CALLBACK(red_char_device_on_sin_changed), NULL);
}
-
-/* TODO: needs to be moved to class vfuncs once all child classes are gobjects */
-void
-red_char_device_set_callbacks(RedCharDevice *dev,
- RedCharDeviceCallbacks *cbs,
- gpointer opaque)
-{
- g_assert(cbs->read_one_msg_from_device && cbs->ref_msg_to_client &&
- cbs->unref_msg_to_client && cbs->send_msg_to_client &&
- cbs->send_tokens_to_client && cbs->remove_client);
-
- dev->priv->cbs = *cbs;
- dev->priv->opaque = opaque;
-}
diff --git a/server/char-device.h b/server/char-device.h
index 020aa1a2..f4d62836 100644
--- a/server/char-device.h
+++ b/server/char-device.h
@@ -24,6 +24,8 @@
#include "red-channel.h"
#include "migration-protocol.h"
+typedef void RedCharDeviceMsgToClient;
+
#define RED_TYPE_CHAR_DEVICE red_char_device_get_type()
#define RED_CHAR_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), RED_TYPE_CHAR_DEVICE, RedCharDevice))
@@ -48,15 +50,40 @@ struct SpiceCharDeviceState
struct RedCharDeviceClass
{
GObjectClass parent_class;
+
+ /*
+ * Messages that are addressed to the client can be queued in case we have
+ * multiple clients and some of them don't have enough tokens.
+ */
+
+ /* reads from the device till reaching a msg that should be sent to the client,
+ * or till the reading fails */
+ RedCharDeviceMsgToClient* (*read_one_msg_from_device)(SpiceCharDeviceInstance *sin,
+ void *opaque);
+ RedCharDeviceMsgToClient* (*ref_msg_to_client)(RedCharDeviceMsgToClient *msg,
+ void *opaque);
+ void (*unref_msg_to_client)(RedCharDeviceMsgToClient *msg,
+ void *opaque);
+ void (*send_msg_to_client)(RedCharDeviceMsgToClient *msg,
+ RedClient *client,
+ void *opaque); /* after this call, the message is unreferenced */
+
+ /* The cb is called when a predefined number of write buffers were consumed by the
+ * device */
+ void (*send_tokens_to_client)(RedClient *client, uint32_t tokens, void *opaque);
+
+ /* The cb is called when a server (self) message that was addressed to the device,
+ * has been completely written to it */
+ void (*on_free_self_token)(void *opaque);
+
+ /* This cb is called if it is recommanded that a client will be removed
+ * 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)(RedClient *client, void *opaque);
};
GType red_char_device_get_type(void) G_GNUC_CONST;
-typedef struct RedCharDeviceCallbacks RedCharDeviceCallbacks;
-void red_char_device_set_callbacks(RedCharDevice *dev,
- RedCharDeviceCallbacks *cbs,
- gpointer opaque);
-
/*
* Shared code for char devices, mainly for flow control.
*
@@ -133,40 +160,6 @@ typedef struct RedCharDeviceWriteBuffer {
uint32_t refs;
} RedCharDeviceWriteBuffer;
-typedef void RedCharDeviceMsgToClient;
-
-struct RedCharDeviceCallbacks {
- /*
- * Messages that are addressed to the client can be queued in case we have
- * multiple clients and some of them don't have enough tokens.
- */
-
- /* reads from the device till reaching a msg that should be sent to the client,
- * or till the reading fails */
- RedCharDeviceMsgToClient* (*read_one_msg_from_device)(SpiceCharDeviceInstance *sin,
- void *opaque);
- RedCharDeviceMsgToClient* (*ref_msg_to_client)(RedCharDeviceMsgToClient *msg,
- void *opaque);
- void (*unref_msg_to_client)(RedCharDeviceMsgToClient *msg,
- void *opaque);
- void (*send_msg_to_client)(RedCharDeviceMsgToClient *msg,
- RedClient *client,
- void *opaque); /* after this call, the message is unreferenced */
-
- /* The cb is called when a predefined number of write buffers were consumed by the
- * device */
- void (*send_tokens_to_client)(RedClient *client, uint32_t tokens, void *opaque);
-
- /* The cb is called when a server (self) message that was addressed to the device,
- * has been completely written to it */
- void (*on_free_self_token)(void *opaque);
-
- /* This cb is called if it is recommanded that a client will be removed
- * 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)(RedClient *client, void *opaque);
-};
-
void red_char_device_reset_dev_instance(RedCharDevice *dev,
SpiceCharDeviceInstance *sin);
void red_char_device_destroy(RedCharDevice *dev);
diff --git a/server/reds.c b/server/reds.c
index 92832888..e3f479d7 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -4322,33 +4322,28 @@ static void
red_char_device_vdi_port_class_init(RedCharDeviceVDIPortClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS(klass);
+ RedCharDeviceClass *char_dev_class = RED_CHAR_DEVICE_CLASS(klass);
g_type_class_add_private(klass, sizeof (RedCharDeviceVDIPortPrivate));
object_class->finalize = red_char_device_vdi_port_finalize;
object_class->constructed = red_char_device_vdi_port_constructed;
+
+ char_dev_class->read_one_msg_from_device = vdi_port_read_one_msg_from_device;
+ char_dev_class->ref_msg_to_client = vdi_port_ref_msg_to_client;
+ char_dev_class->unref_msg_to_client = vdi_port_unref_msg_to_client;
+ char_dev_class->send_msg_to_client = vdi_port_send_msg_to_client;
+ char_dev_class->send_tokens_to_client = vdi_port_send_tokens_to_client;
+ char_dev_class->remove_client = vdi_port_remove_client;
+ char_dev_class->on_free_self_token = vdi_port_on_free_self_token;
}
static RedCharDeviceVDIPort *red_char_device_vdi_port_new(RedsState *reds)
{
- RedCharDevice *char_dev;
- RedCharDeviceCallbacks char_dev_cbs = {
- .read_one_msg_from_device = vdi_port_read_one_msg_from_device,
- .ref_msg_to_client = vdi_port_ref_msg_to_client,
- .unref_msg_to_client = vdi_port_unref_msg_to_client,
- .send_msg_to_client = vdi_port_send_msg_to_client,
- .send_tokens_to_client = vdi_port_send_tokens_to_client,
- .remove_client = vdi_port_remove_client,
- .on_free_self_token = vdi_port_on_free_self_token,
- };
-
- char_dev = g_object_new(RED_TYPE_CHAR_DEVICE_VDIPORT,
- "spice-server", reds,
- "client-tokens-interval", REDS_TOKENS_TO_SEND,
- "self-tokens", REDS_NUM_INTERNAL_AGENT_MESSAGES,
- NULL);
-
- red_char_device_set_callbacks(RED_CHAR_DEVICE(char_dev),
- &char_dev_cbs, reds);
- return RED_CHAR_DEVICE_VDIPORT(char_dev);
+ return g_object_new(RED_TYPE_CHAR_DEVICE_VDIPORT,
+ "spice-server", reds,
+ "client-tokens-interval", REDS_TOKENS_TO_SEND,
+ "self-tokens", REDS_NUM_INTERNAL_AGENT_MESSAGES,
+ "opaque", reds,
+ NULL);
}
diff --git a/server/smartcard.c b/server/smartcard.c
index 8d382ce1..ba6f2f54 100644
--- a/server/smartcard.c
+++ b/server/smartcard.c
@@ -272,14 +272,6 @@ static SpiceCharDeviceInstance *smartcard_readers_get_unattached(void)
static RedCharDeviceSmartcard *smartcard_device_new(RedsState *reds, SpiceCharDeviceInstance *sin)
{
RedCharDevice *char_dev;
- RedCharDeviceCallbacks char_dev_cbs = {
- .read_one_msg_from_device = smartcard_read_msg_from_device,
- .ref_msg_to_client = smartcard_ref_msg_to_client,
- .unref_msg_to_client = smartcard_unref_msg_to_client,
- .send_msg_to_client = smartcard_send_msg_to_client,
- .send_tokens_to_client = smartcard_send_tokens_to_client,
- .remove_client = smartcard_remove_client,
- };
char_dev = g_object_new(RED_TYPE_CHAR_DEVICE_SMARTCARD,
"sin", sin,
@@ -288,8 +280,8 @@ static RedCharDeviceSmartcard *smartcard_device_new(RedsState *reds, SpiceCharDe
"self-tokens", ~0ULL,
NULL);
- red_char_device_set_callbacks(RED_CHAR_DEVICE(char_dev),
- &char_dev_cbs, char_dev);
+ g_object_set(char_dev, "opaque", char_dev, NULL);
+
return RED_CHAR_DEVICE_SMARTCARD(char_dev);
}
@@ -869,10 +861,18 @@ static void
red_char_device_smartcard_class_init(RedCharDeviceSmartcardClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS(klass);
+ RedCharDeviceClass *char_dev_class = RED_CHAR_DEVICE_CLASS(klass);
g_type_class_add_private(klass, sizeof (RedCharDeviceSmartcardPrivate));
object_class->finalize = red_char_device_smartcard_finalize;
+
+ char_dev_class->read_one_msg_from_device = smartcard_read_msg_from_device;
+ char_dev_class->ref_msg_to_client = smartcard_ref_msg_to_client;
+ char_dev_class->unref_msg_to_client = smartcard_unref_msg_to_client;
+ char_dev_class->send_msg_to_client = smartcard_send_msg_to_client;
+ char_dev_class->send_tokens_to_client = smartcard_send_tokens_to_client;
+ char_dev_class->remove_client = smartcard_remove_client;
}
static void
diff --git a/server/spicevmc.c b/server/spicevmc.c
index cb8bcc60..1c41845c 100644
--- a/server/spicevmc.c
+++ b/server/spicevmc.c
@@ -611,6 +611,14 @@ SPICE_GNUC_VISIBLE void spice_server_port_event(SpiceCharDeviceInstance *sin, ui
static void
red_char_device_spicevmc_class_init(RedCharDeviceSpiceVmcClass *klass)
{
+ RedCharDeviceClass *char_dev_class = RED_CHAR_DEVICE_CLASS(klass);
+
+ char_dev_class->read_one_msg_from_device = spicevmc_chardev_read_msg_from_dev;
+ char_dev_class->ref_msg_to_client = spicevmc_chardev_ref_msg_to_client;
+ char_dev_class->unref_msg_to_client = spicevmc_chardev_unref_msg_to_client;
+ 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;
}
static void
@@ -623,25 +631,11 @@ red_char_device_spicevmc_new(SpiceCharDeviceInstance *sin,
RedsState *reds,
void *opaque)
{
- RedCharDevice *char_dev;
- RedCharDeviceCallbacks char_dev_cbs = {
- .read_one_msg_from_device = spicevmc_chardev_read_msg_from_dev,
- .ref_msg_to_client = spicevmc_chardev_ref_msg_to_client,
- .unref_msg_to_client = spicevmc_chardev_unref_msg_to_client,
- .send_msg_to_client = spicevmc_chardev_send_msg_to_client,
- .send_tokens_to_client = spicevmc_char_dev_send_tokens_to_client,
- .remove_client = spicevmc_char_dev_remove_client,
- };
-
- char_dev = g_object_new(RED_TYPE_CHAR_DEVICE_SPICEVMC,
- "sin", sin,
- "spice-server", reds,
- "client-tokens-interval", 0ULL,
- "self-tokens", ~0ULL,
- "opaque", opaque,
- NULL);
-
- red_char_device_set_callbacks(RED_CHAR_DEVICE(char_dev),
- &char_dev_cbs, opaque);
- return char_dev;
+ return g_object_new(RED_TYPE_CHAR_DEVICE_SPICEVMC,
+ "sin", sin,
+ "spice-server", reds,
+ "client-tokens-interval", 0ULL,
+ "self-tokens", ~0ULL,
+ "opaque", opaque,
+ NULL);
}