[libvirt] [libvirt-designer PATCHv3 5/9] Automatically add SPICE channel with SPICE graphics
Michal Privoznik
mprivozn at redhat.com
Tue Jun 4 17:11:23 UTC 2013
On 04.06.2013 16:33, Christophe Fergeau wrote:
> When the user sets up the graphical framebuffer to use SPICE,
> we now add automatically the SPICE agent channel if it's not present
> already.
> ---
> libvirt-designer/libvirt-designer-domain.c | 85 ++++++++++++++++++++++++++++++
> 1 file changed, 85 insertions(+)
>
> diff --git a/libvirt-designer/libvirt-designer-domain.c b/libvirt-designer/libvirt-designer-domain.c
> index a1914dd..1d37e21 100644
> --- a/libvirt-designer/libvirt-designer-domain.c
> +++ b/libvirt-designer/libvirt-designer-domain.c
> @@ -69,6 +69,7 @@ static gboolean error_is_set(GError **error)
> return ((error != NULL) && (*error != NULL));
> }
>
> +static const char GVIR_DESIGNER_SPICE_CHANNEL_NAME[] = "com.redhat.spice.0";
> static const char GVIR_DESIGNER_VIRTIO_BLOCK_DEVICE_ID[] = "http://pciids.sourceforge.net/v2.2/pci.ids/1af4/1001";
>
> enum {
> @@ -314,6 +315,29 @@ end:
> }
>
>
> +static GList *
> +gvir_designer_domain_get_device_by_type(GVirDesignerDomain *design, GType type)
> +{
> + GList *devices;
> + GList *it;
> + GList *matched_devices = NULL;
> +
> + devices = gvir_config_domain_get_devices(design->priv->config);
> + for (it = devices; it != NULL; it = it->next) {
> + GType device_type = G_OBJECT_TYPE(it->data);
> +
> + if (g_type_is_a(device_type, type)) {
> + matched_devices = g_list_prepend(matched_devices,
> + g_object_ref(G_OBJECT(it->data)));
> + }
> +
> + }
> + g_list_free_full(devices, g_object_unref);
> +
> + return g_list_reverse(matched_devices);
> +}
> +
> +
> static void gvir_designer_domain_add_clock(GVirDesignerDomain *design)
> {
> GVirConfigDomainClock *clock;
> @@ -349,6 +373,65 @@ static void gvir_designer_domain_add_clock(GVirDesignerDomain *design)
> }
>
>
> +static gboolean
> +gvir_designer_domain_has_spice_channel(GVirDesignerDomain *design)
> +{
> + GList *devices;
> + GList *it;
> + gboolean has_spice = FALSE;
> +
> + devices = gvir_designer_domain_get_device_by_type(design,
> + GVIR_CONFIG_TYPE_DOMAIN_CHANNEL);
> + for (it = devices; it != NULL; it = it->next) {
> + GVirConfigDomainChannel *channel;
> + const char *target_name;
> + channel = GVIR_CONFIG_DOMAIN_CHANNEL(it->data);
> + target_name = gvir_config_domain_channel_get_target_name(channel);
> + if (g_strcmp0(target_name, GVIR_DESIGNER_SPICE_CHANNEL_NAME) == 0) {
> + /* FIXME could do more sanity checks (check if the channel
> + * source has the 'spicevmc' type)
> + */
> + GVirConfigDomainChannelTargetType target_type;
> + target_type = gvir_config_domain_channel_get_target_type(channel);
> + if (target_type == GVIR_CONFIG_DOMAIN_CHANNEL_TARGET_VIRTIO) {
> + has_spice = TRUE;
> + } else {
> + g_critical("Inconsistent SPICE channel, target type is wrong (%d)",
> + target_type);
Is this really a critical issue? What about g_warning instead?
> + has_spice = FALSE;
> + }
> +
> + break;
> + }
> + }
> + g_list_free_full(devices, g_object_unref);
> +
> + return has_spice;
> +}
> +
> +
> +static void gvir_designer_domain_add_spice_channel(GVirDesignerDomain *design)
> +{
> + /* FIXME: error out if there is no support for the vioserial device */
> + GVirConfigDomainChannel *channel;
> + GVirConfigDomainChardevSourceSpiceVmc *vmc;
> +
> + channel = gvir_config_domain_channel_new();
> + gvir_config_domain_channel_set_target_type(channel,
> + GVIR_CONFIG_DOMAIN_CHANNEL_TARGET_VIRTIO);
> + gvir_config_domain_channel_set_target_name(channel,
> + GVIR_DESIGNER_SPICE_CHANNEL_NAME);
> + vmc = gvir_config_domain_chardev_source_spicevmc_new();
> + gvir_config_domain_chardev_set_source(GVIR_CONFIG_DOMAIN_CHARDEV(channel),
> + GVIR_CONFIG_DOMAIN_CHARDEV_SOURCE(vmc));
> + g_object_unref(G_OBJECT(vmc));
> +
> + gvir_config_domain_add_device(design->priv->config,
> + GVIR_CONFIG_DOMAIN_DEVICE(channel));
> + g_object_unref(G_OBJECT(channel));
> +}
> +
> +
> static GVirConfigDomainGraphics *
> gvir_designer_domain_create_graphics_desktop(GVirDesignerDomain *design,
> GError **error)
> @@ -432,6 +515,8 @@ gvir_designer_domain_add_graphics(GVirDesignerDomain *design,
> gvir_config_domain_graphics_spice_set_image_compression(spice,
> GVIR_CONFIG_DOMAIN_GRAPHICS_SPICE_IMAGE_COMPRESSION_OFF);
> graphics = GVIR_CONFIG_DOMAIN_GRAPHICS(spice);
> + if (!gvir_designer_domain_has_spice_channel(design))
> + gvir_designer_domain_add_spice_channel(design);
>
> break;
> }
>
More information about the libvir-list
mailing list