@@ -44,11 +44,15 @@ static char *sock_path;
struct VCChardev {
SpiceChardev parent;
};
-typedef struct VCChardev VCChardev;
+
+struct VCChardevClass {
+ ChardevClass parent;
+ void (*parent_open)(Chardev *chr, ChardevBackend *backend,
+ bool *be_opened, Error **errp);
+};
#define TYPE_CHARDEV_VC "chardev-vc"
-DECLARE_INSTANCE_CHECKER(VCChardev, VC_CHARDEV,
- TYPE_CHARDEV_VC)
+OBJECT_DECLARE_TYPE(VCChardev, VCChardevClass, chardev_vc, CHARDEV_VC)
static ChardevBackend *
chr_spice_backend_new(void)
@@ -66,6 +70,7 @@ static void vc_chr_open(Chardev *chr,
bool *be_opened,
Error **errp)
{
+ VCChardevClass *vc = CHARDEV_VC_GET_CLASS(chr);
ChardevBackend *be;
const char *fqdn = NULL;
@@ -80,7 +85,7 @@ static void vc_chr_open(Chardev *chr,
be = chr_spice_backend_new();
be->u.spiceport.data->fqdn = fqdn ?
g_strdup(fqdn) : g_strdup_printf("org.qemu.console.%s", chr->label);
- qemu_chr_open_spice_port(chr, be, be_opened, errp);
+ vc->parent_open(chr, be, be_opened, errp);
qapi_free_ChardevBackend(be);
}
@@ -91,8 +96,11 @@ static void vc_chr_set_echo(Chardev *chr, bool echo)
static void char_vc_class_init(ObjectClass *oc, void *data)
{
+ VCChardevClass *vc = CHARDEV_VC_CLASS(oc);
ChardevClass *cc = CHARDEV_CLASS(oc);
+ vc->parent_open = cc->open;
+
cc->parse = qemu_chr_parse_vc;
cc->open = vc_chr_open;
cc->chr_set_echo = vc_chr_set_echo;
@@ -103,6 +111,7 @@ static const TypeInfo char_vc_type_info = {
.parent = TYPE_CHARDEV_SPICEPORT,
.instance_size = sizeof(VCChardev),
.class_init = char_vc_class_init,
+ .class_size = sizeof(VCChardevClass),
};
static void spice_app_atexit(void)
Save the parent object's open function pointer in the (new) VCChardevClass struct instead before overwriting it, so we can look it up when needed. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- ui/spice-app.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)