[libvirt] [libvirt-glib 1/2] Add more parsing helpers to GVirConfigObject

Add gvir_config_object_get_node_content_genum, gvir_config_object_get_attribute and gvir_config_object_get_attribute_genum to complement the existing methods. They all act on a child node of the current node. The _get_attribute functions can also act on the root node of the GVirConfigObject instance if it's passed NULL instead of a child name. --- libvirt-gconfig/libvirt-gconfig-object-private.h | 12 +++ libvirt-gconfig/libvirt-gconfig-object.c | 80 ++++++++++++++++++++++ 2 files changed, 92 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-object-private.h b/libvirt-gconfig/libvirt-gconfig-object-private.h index 7c6575e..692e369 100644 --- a/libvirt-gconfig/libvirt-gconfig-object-private.h +++ b/libvirt-gconfig/libvirt-gconfig-object-private.h @@ -35,6 +35,18 @@ char *gvir_config_object_get_node_content(GVirConfigObject *object, const char *node_name); guint64 gvir_config_object_get_node_content_uint64(GVirConfigObject *object, const char *node_name); +gint gvir_config_object_get_node_content_genum(GVirConfigObject *object, + const char *node_name, + GType enum_type, + gint default_value); +char *gvir_config_object_get_attribute(GVirConfigObject *object, + const char *node_name, + const char *attr_name); +gint gvir_config_object_get_attribute_genum(GVirConfigObject *object, + const char *node_name, + const char *attr_name, + GType enum_type, + gint default_value); void gvir_config_object_set_node_content(GVirConfigObject *object, const char *node_name, const char *value); diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 5c7639f..2b2fd55 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -301,6 +301,28 @@ gvir_config_object_get_node_content(GVirConfigObject *object, return gvir_config_xml_get_child_element_content_glib(node, node_name); } +G_GNUC_INTERNAL char * +gvir_config_object_get_attribute(GVirConfigObject *object, + const char *node_name, + const char *attr_name) +{ + xmlNodePtr node; + + g_return_val_if_fail(attr_name != NULL, NULL); + + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(object)); + if (node == NULL) + return NULL; + + if (node_name != NULL) { + node = gvir_config_xml_get_element(node, node_name, NULL); + if (node == NULL) + return NULL; + } + + return gvir_config_xml_get_attribute_content_glib(node, attr_name); +} + static xmlNodePtr gvir_config_object_set_child_internal(GVirConfigObject *object, xmlNodePtr child, @@ -511,6 +533,64 @@ gvir_config_object_get_node_content_uint64(GVirConfigObject *object, return value; } +G_GNUC_INTERNAL gint +gvir_config_object_get_node_content_genum(GVirConfigObject *object, + const char *node_name, + GType enum_type, + gint default_value) +{ + xmlNodePtr node; + xmlChar *str; + gint value; + + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(object)); + if (node == NULL) + return default_value; + + str = gvir_config_xml_get_child_element_content(node, node_name); + if (!str) + return default_value; + + value = gvir_config_genum_get_value(enum_type, (char *)str, default_value); + xmlFree(str); + + return value; +} + +G_GNUC_INTERNAL gint +gvir_config_object_get_attribute_genum(GVirConfigObject *object, + const char *node_name, + const char *attr_name, + GType enum_type, + gint default_value) +{ + xmlNodePtr node; + xmlChar *attr_val; + gint value; + + g_return_val_if_fail(attr_name != NULL, default_value); + + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(object)); + if (node == NULL) + return default_value; + + if (node_name != NULL) { + node = gvir_config_xml_get_element(node, node_name, NULL); + if (node == NULL) + return default_value; + } + + attr_val = gvir_config_xml_get_attribute_content(node, attr_name); + if (attr_val == NULL) + return default_value; + + value = gvir_config_genum_get_value(enum_type, (char *)attr_val, + default_value); + xmlFree(attr_val); + + return value; +} + GVirConfigObject *gvir_config_object_new_from_xml(GType type, const char *root_name, const char *schema, -- 1.7.7.5

--- libvirt-gconfig/libvirt-gconfig-domain-disk.c | 101 +++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain-disk.h | 10 +++ libvirt-gconfig/libvirt-gconfig.sym | 8 ++ 3 files changed, 119 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain-disk.c b/libvirt-gconfig/libvirt-gconfig-domain-disk.c index 1121007..2f659a0 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-disk.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-disk.c @@ -191,3 +191,104 @@ void gvir_config_domain_disk_set_target_dev(GVirConfigDomainDisk *disk, gvir_config_object_add_child_with_attribute(GVIR_CONFIG_OBJECT(disk), "target", "dev", dev); } + +GVirConfigDomainDiskType +gvir_config_domain_disk_get_disk_type(GVirConfigDomainDisk *disk) +{ + return disk->priv->type; +} + +GVirConfigDomainDiskGuestDeviceType +gvir_config_domain_disk_get_guest_device_type(GVirConfigDomainDisk *disk) +{ + g_return_val_if_fail(GVIR_IS_CONFIG_DOMAIN_DISK(disk), + GVIR_CONFIG_DOMAIN_DISK_GUEST_DEVICE_DISK); + + return gvir_config_object_get_attribute_genum(GVIR_CONFIG_OBJECT(disk), + NULL, + "device", + GVIR_TYPE_CONFIG_DOMAIN_DISK_GUEST_DEVICE_TYPE, + GVIR_CONFIG_DOMAIN_DISK_GUEST_DEVICE_DISK); +} + +GVirConfigDomainDiskSnapshotType +gvir_config_domain_disk_get_snapshot_type(GVirConfigDomainDisk *disk) +{ + g_return_val_if_fail(GVIR_IS_CONFIG_DOMAIN_DISK(disk), + GVIR_CONFIG_DOMAIN_DISK_SNAPSHOT_NO); + + return gvir_config_object_get_attribute_genum(GVIR_CONFIG_OBJECT(disk), + NULL, + "snapshot", + GVIR_TYPE_CONFIG_DOMAIN_DISK_SNAPSHOT_TYPE, + GVIR_CONFIG_DOMAIN_DISK_SNAPSHOT_NO); +} + +char * +gvir_config_domain_disk_get_source(GVirConfigDomainDisk *disk) +{ + const char *attribute_name; + + g_return_val_if_fail(GVIR_IS_CONFIG_DOMAIN_DISK(disk), NULL); + + switch (disk->priv->type) { + case GVIR_CONFIG_DOMAIN_DISK_FILE: + attribute_name = "file"; + break; + case GVIR_CONFIG_DOMAIN_DISK_BLOCK: + attribute_name = "dev"; + break; + case GVIR_CONFIG_DOMAIN_DISK_DIR: + attribute_name = "dir"; + break; + case GVIR_CONFIG_DOMAIN_DISK_NETWORK: + attribute_name = "protocol"; + break; + default: + g_return_val_if_reached(NULL); + } + return gvir_config_object_get_attribute(GVIR_CONFIG_OBJECT(disk), + "source", attribute_name); +} + +char * +gvir_config_domain_disk_get_driver_name(GVirConfigDomainDisk *disk) +{ + g_return_val_if_fail(GVIR_IS_CONFIG_DOMAIN_DISK(disk), NULL); + + return gvir_config_object_get_attribute(GVIR_CONFIG_OBJECT(disk), + "driver", "name"); +} + +char * +gvir_config_domain_disk_get_driver_type(GVirConfigDomainDisk *disk) +{ + g_return_val_if_fail(GVIR_IS_CONFIG_DOMAIN_DISK(disk), NULL); + + return gvir_config_object_get_attribute(GVIR_CONFIG_OBJECT(disk), + "driver", "type"); +} + +GVirConfigDomainDiskBus +gvir_config_domain_disk_get_target_bus(GVirConfigDomainDisk *disk) +{ + /* FIXME: the default value depends on the "name" attribute, should we + * copy what libvirt is doing here? + */ + g_return_val_if_fail(GVIR_IS_CONFIG_DOMAIN_DISK(disk), + GVIR_CONFIG_DOMAIN_DISK_BUS_IDE); + + return gvir_config_object_get_attribute_genum(GVIR_CONFIG_OBJECT(disk), + "target", "snapshot", + GVIR_TYPE_CONFIG_DOMAIN_DISK_BUS, + GVIR_CONFIG_DOMAIN_DISK_BUS_IDE); +} + +char * +gvir_config_domain_disk_get_target_dev(GVirConfigDomainDisk *disk) +{ + g_return_val_if_fail(GVIR_IS_CONFIG_DOMAIN_DISK(disk), NULL); + + return gvir_config_object_get_attribute(GVIR_CONFIG_OBJECT(disk), + "target", "dev"); +} diff --git a/libvirt-gconfig/libvirt-gconfig-domain-disk.h b/libvirt-gconfig/libvirt-gconfig-domain-disk.h index bc63dfe..650bdc6 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-disk.h +++ b/libvirt-gconfig/libvirt-gconfig-domain-disk.h @@ -108,6 +108,16 @@ void gvir_config_domain_disk_set_target_bus(GVirConfigDomainDisk *disk, GVirConfigDomainDiskBus bus); void gvir_config_domain_disk_set_target_dev(GVirConfigDomainDisk *disk, const char *dev); + +GVirConfigDomainDiskType gvir_config_domain_disk_get_disk_type(GVirConfigDomainDisk *disk); +GVirConfigDomainDiskGuestDeviceType gvir_config_domain_disk_get_guest_device_type(GVirConfigDomainDisk *disk); +GVirConfigDomainDiskSnapshotType gvir_config_domain_disk_get_snapshot_type(GVirConfigDomainDisk *disk); +char *gvir_config_domain_disk_get_source(GVirConfigDomainDisk *disk); +char *gvir_config_domain_disk_get_driver_name(GVirConfigDomainDisk *disk); +char *gvir_config_domain_disk_get_driver_type(GVirConfigDomainDisk *disk); +GVirConfigDomainDiskBus gvir_config_domain_disk_get_target_bus(GVirConfigDomainDisk *disk); +char *gvir_config_domain_disk_get_target_dev(GVirConfigDomainDisk *disk); + G_END_DECLS #endif /* __LIBVIRT_GCONFIG_DOMAIN_DISK_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 7200da5..20dc969 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -61,13 +61,21 @@ LIBVIRT_GCONFIG_0.0.3 { gvir_config_domain_disk_type_get_type; gvir_config_domain_disk_new; gvir_config_domain_disk_new_from_xml; + gvir_config_domain_disk_get_driver_name; gvir_config_domain_disk_set_driver_name; + gvir_config_domain_disk_get_driver_type; gvir_config_domain_disk_set_driver_type; + gvir_config_domain_disk_get_guest_device_type; gvir_config_domain_disk_set_guest_device_type; + gvir_config_domain_disk_get_snapshot_type; gvir_config_domain_disk_set_snapshot_type; + gvir_config_domain_disk_get_source; gvir_config_domain_disk_set_source; + gvir_config_domain_disk_get_target_bus; gvir_config_domain_disk_set_target_bus; + gvir_config_domain_disk_get_target_dev; gvir_config_domain_disk_set_target_dev; + gvir_config_domain_disk_get_disk_type; gvir_config_domain_disk_set_type; gvir_config_domain_filesys_get_type; -- 1.7.7.5

Looks good and I've tested it to work in Boxes (with my namespace change on top) so ACK. -- Regards, Zeeshan Ali (Khattak) FSF member#5124

On Tue, Jan 3, 2012 at 4:56 PM, Christophe Fergeau <cfergeau@redhat.com> wrote:
Add gvir_config_object_get_node_content_genum, gvir_config_object_get_attribute and gvir_config_object_get_attribute_genum to complement the existing methods. They all act on a child node of the current node. The _get_attribute functions can also act on the root node of the GVirConfigObject instance if it's passed NULL instead of a child name.
Looks OK, ACK. -- Regards, Zeeshan Ali (Khattak) FSF member#5124
participants (2)
-
Christophe Fergeau
-
Zeeshan Ali (Khattak)