From: "Zeeshan Ali (Khattak)" <zeeshanak@xxxxxxxxx> Currently we only support existing DomainDevice implementations: DomainDisk and DomainInterface. --- .../libvirt-gobject-domain-device-private.h | 2 + libvirt-gobject/libvirt-gobject-domain-device.c | 21 ++++++++++ libvirt-gobject/libvirt-gobject-domain.c | 42 ++++++++++++++++++++ libvirt-gobject/libvirt-gobject-domain.h | 3 + libvirt-gobject/libvirt-gobject.sym | 1 + 5 files changed, 69 insertions(+), 0 deletions(-) diff --git a/libvirt-gobject/libvirt-gobject-domain-device-private.h b/libvirt-gobject/libvirt-gobject-domain-device-private.h index 72c660e..292a2ac 100644 --- a/libvirt-gobject/libvirt-gobject-domain-device-private.h +++ b/libvirt-gobject/libvirt-gobject-domain-device-private.h @@ -24,6 +24,8 @@ G_BEGIN_DECLS +G_GNUC_INTERNAL GVirDomainDevice *gvir_domain_device_new(GVirConfigDomainDevice *config, + GVirDomain *domain); virDomainPtr gvir_domain_device_get_domain_handle(GVirDomainDevice *self); G_END_DECLS diff --git a/libvirt-gobject/libvirt-gobject-domain-device.c b/libvirt-gobject/libvirt-gobject-domain-device.c index 85879d2..0ec5dad 100644 --- a/libvirt-gobject/libvirt-gobject-domain-device.c +++ b/libvirt-gobject/libvirt-gobject-domain-device.c @@ -176,3 +176,24 @@ GVirDomain *gvir_domain_device_get_domain(GVirDomainDevice *device) { GVirConfigDomainDevice *gvir_domain_device_get_config(GVirDomainDevice *device) { return g_object_ref (device->priv->config); } + +G_GNUC_INTERNAL GVirDomainDevice *gvir_domain_device_new(GVirConfigDomainDevice *config, + GVirDomain *domain) +{ + GType type; + + g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_DEVICE(config), NULL); + + if (GVIR_CONFIG_IS_DOMAIN_DISK(config)) + type = GVIR_TYPE_DOMAIN_DISK; + else if (GVIR_CONFIG_IS_DOMAIN_INTERFACE(config)) + type = GVIR_TYPE_DOMAIN_INTERFACE; + else { + g_debug("Unknown device type: %s", G_OBJECT_TYPE_NAME(config)); + return NULL; + } + + return GVIR_DOMAIN_DEVICE(g_object_new(type, + "config", config, + "domain", domain, NULL)); +} diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index 23ad882..3c66c9c 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -29,6 +29,7 @@ #include "libvirt-glib/libvirt-glib.h" #include "libvirt-gobject/libvirt-gobject.h" #include "libvirt-gobject-compat.h" +#include "libvirt-gobject/libvirt-gobject-domain-device-private.h" #define GVIR_DOMAIN_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_DOMAIN, GVirDomainPrivate)) @@ -868,3 +869,44 @@ gboolean gvir_domain_get_saved(GVirDomain *dom) return virDomainHasManagedSaveImage(dom->priv->handle, 0) == 1; } + +/** + * gvir_domain_get_devices: + * @domain: the domain + * @err: place-holder for possible errors, or NULL + * + * Gets the list of devices attached to @domain + * + * Returns: (element-type LibvirtGObject.DomainDevice) (transfer full): a newly + * allocated #GList of #GVirDomainDevice. + */ +GList *gvir_domain_get_devices(GVirDomain *domain, + GError **err) +{ + GVirConfigDomain *config; + GList *config_devices; + GList *node; + GList *ret = NULL; + + g_return_val_if_fail(GVIR_IS_DOMAIN(domain), NULL); + + config = gvir_domain_get_config(domain, 0, err); + if (config == NULL) + return ret; + + config_devices = gvir_config_domain_get_devices(config); + for (node = config_devices; node != NULL; node = node->next) { + GVirConfigDomainDevice *device_config; + GVirDomainDevice *device; + + device_config = GVIR_CONFIG_DOMAIN_DEVICE(node->data); + device = gvir_domain_device_new(device_config, domain); + if (device != NULL) + ret = g_list_append(ret, device); + + g_object_unref (device_config); + } + g_list_free (config_devices); + + return ret; +} diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index 56500a8..8a4836e 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -183,6 +183,9 @@ gboolean gvir_domain_save_finish (GVirDomain *dom, gboolean gvir_domain_get_persistent(GVirDomain *dom); gboolean gvir_domain_get_saved(GVirDomain *dom); +GList *gvir_domain_get_devices(GVirDomain *domain, + GError **err); + G_END_DECLS #endif /* __LIBVIRT_GOBJECT_DOMAIN_H__ */ diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index d6999dc..b7b95cb 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -72,6 +72,7 @@ LIBVIRT_GOBJECT_0.0.4 { gvir_domain_get_persistent; gvir_domain_get_saved; gvir_domain_screenshot; + gvir_domain_get_devices; gvir_domain_snapshot_get_type; gvir_domain_snapshot_handle_get_type; -- 1.7.7.6 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list