[libvirt] [libvirt-glib 23/23] Add GVirConfigDomain::features
Daniel P. Berrange
berrange at redhat.com
Tue Oct 18 11:53:20 UTC 2011
On Fri, Oct 07, 2011 at 11:41:08AM +0200, Christophe Fergeau wrote:
> ---
> libvirt-gconfig/libvirt-gconfig-domain.c | 71 ++++++++++++++++++++++++++++
> libvirt-gconfig/libvirt-gconfig-domain.h | 4 ++
> libvirt-gconfig/libvirt-gconfig.sym | 2 +
> libvirt-gconfig/tests/test-domain-create.c | 12 +++++
> libvirt-gconfig/tests/test-domain-parse.c | 7 +++
> libvirt-gconfig/tests/test-domain.xml | 1 +
> 6 files changed, 97 insertions(+), 0 deletions(-)
>
> diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c
> index 71bfb55..4a32595 100644
> --- a/libvirt-gconfig/libvirt-gconfig-domain.c
> +++ b/libvirt-gconfig/libvirt-gconfig-domain.c
> @@ -45,6 +45,7 @@ enum {
> PROP_0,
> PROP_NAME,
> PROP_MEMORY,
> + PROP_FEATURES
> };
>
> static void gvir_config_domain_get_property(GObject *object,
> @@ -61,6 +62,9 @@ static void gvir_config_domain_get_property(GObject *object,
> case PROP_MEMORY:
> g_value_set_uint64(value, gvir_config_domain_get_memory(domain));
> break;
> + case PROP_FEATURES:
> + g_value_take_boxed(value, gvir_config_domain_get_features(domain));
> + break;
>
> default:
> G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
> @@ -81,6 +85,9 @@ static void gvir_config_domain_set_property(GObject *object,
> case PROP_MEMORY:
> gvir_config_domain_set_memory(domain, g_value_get_uint64(value));
> break;
> + case PROP_FEATURES:
> + gvir_config_domain_set_features(domain, g_value_get_boxed(value));
> + break;
> default:
> G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
> }
> @@ -113,6 +120,14 @@ static void gvir_config_domain_class_init(GVirConfigDomainClass *klass)
> 0,
> G_PARAM_READWRITE |
> G_PARAM_STATIC_STRINGS));
> + g_object_class_install_property(object_class,
> + PROP_FEATURES,
> + g_param_spec_boxed("features",
> + "Features",
> + "Hypervisor Features",
> + G_TYPE_STRV,
> + G_PARAM_READWRITE |
> + G_PARAM_STATIC_STRINGS));
> }
>
>
> @@ -179,3 +194,59 @@ void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory)
> "memory", memory);
> g_object_notify(G_OBJECT(domain), "memory");
> }
> +
> +/**
> + * gvir_config_domain_get_features:
> + * Returns: (transfer full):
> + */
> +GStrv gvir_config_domain_get_features(GVirConfigDomain *domain)
> +{
> + GPtrArray *features;
> + xmlNodePtr parent_node;
> + xmlNodePtr node;
> + xmlNodePtr it;
> +
> + parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain));
> + if (parent_node == NULL)
> + return NULL;
> +
> + node = gvir_config_xml_get_element(parent_node, "features", NULL);
> + if (node == NULL)
> + return NULL;
> +
> + features = g_ptr_array_new();
> + for (it = node->children; it != NULL; it = it->next) {
> + g_ptr_array_add(features, g_strdup((char *)it->name));
> + }
> + g_ptr_array_add(features, NULL);
> +
> + return (GStrv)g_ptr_array_free(features, FALSE);
> +}
> +
> +void gvir_config_domain_set_features(GVirConfigDomain *domain,
> + const GStrv features)
> +{
> + xmlNodePtr parent_node;
> + xmlNodePtr features_node;
> + xmlNodePtr old_node;
> + GStrv it;
> +
> + parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain));
> + features_node = xmlNewDocNode(parent_node->doc, NULL,
> + (xmlChar *)"features", NULL);
> + for (it = features; *it != NULL; it++) {
> + xmlNodePtr node;
> +
> + node = xmlNewDocNode(parent_node->doc, NULL, (xmlChar *)*it, NULL);
> + xmlAddChild(features_node, node);
> + }
> +
> + old_node = gvir_config_xml_get_element(parent_node, "features", NULL);
> + if (old_node) {
> + old_node = xmlReplaceNode(old_node, features_node);
> + xmlFreeNode(old_node);
> + } else {
> + xmlAddChild(parent_node, features_node);
> + }
> + g_object_notify(G_OBJECT(domain), "features");
> +}
> diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h
> index 03169b2..d9f0c09 100644
> --- a/libvirt-gconfig/libvirt-gconfig-domain.h
> +++ b/libvirt-gconfig/libvirt-gconfig-domain.h
> @@ -66,6 +66,10 @@ char *gvir_config_domain_get_name(GVirConfigDomain *domain);
> void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name);
> guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain);
> void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory);
> +GStrv gvir_config_domain_get_features(GVirConfigDomain *domain);
> +void gvir_config_domain_set_features(GVirConfigDomain *domain,
> + const GStrv features);
> +
>
> G_END_DECLS
>
> diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym
> index 7acb95d..951aac6 100644
> --- a/libvirt-gconfig/libvirt-gconfig.sym
> +++ b/libvirt-gconfig/libvirt-gconfig.sym
> @@ -6,6 +6,8 @@ LIBVIRT_GOBJECT_0.0.1 {
> gvir_config_domain_get_type;
> gvir_config_domain_new;
> gvir_config_domain_new_from_xml;
> + gvir_config_domain_get_features;
> + gvir_config_domain_set_features;
> gvir_config_domain_get_memory;
> gvir_config_domain_set_memory;
> gvir_config_domain_get_name;
> diff --git a/libvirt-gconfig/tests/test-domain-create.c b/libvirt-gconfig/tests/test-domain-create.c
> index fe0063c..a719ed2 100644
> --- a/libvirt-gconfig/tests/test-domain-create.c
> +++ b/libvirt-gconfig/tests/test-domain-create.c
> @@ -28,10 +28,14 @@
> #include <string.h>
> #include <libvirt-gconfig/libvirt-gconfig.h>
>
> +const char *features[] = { "foo", "bar", "baz", NULL };
> +
> int main(void)
> {
> GVirConfigDomain *domain;
> char *name;
> + GStrv feat;
> + unsigned int i;
> char *xml;
>
> g_type_init();
> @@ -47,6 +51,14 @@ int main(void)
> gvir_config_domain_set_memory(domain, 1234);
> g_assert(gvir_config_domain_get_memory(domain) == 1234);
>
> + gvir_config_domain_set_features(domain, (const GStrv)features);
> + feat = gvir_config_domain_get_features(domain);
> + for (i = 0; features[i] != NULL; i++) {
> + g_assert(feat[i] != NULL);
> + g_assert(strcmp(feat[i], features[i]) == 0);
> + }
> + g_strfreev(feat);
> +
> xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(domain));
> g_print("%s\n", xml);
> g_free(xml);
> diff --git a/libvirt-gconfig/tests/test-domain-parse.c b/libvirt-gconfig/tests/test-domain-parse.c
> index 7521d20..9528816 100644
> --- a/libvirt-gconfig/tests/test-domain-parse.c
> +++ b/libvirt-gconfig/tests/test-domain-parse.c
> @@ -33,6 +33,7 @@ int main(int argc, char **argv)
> {
> GVirConfigDomain *domain;
> char *name;
> + GStrv features;
> char *xml;
> GError *error = NULL;
>
> @@ -69,6 +70,12 @@ int main(int argc, char **argv)
>
> g_assert(gvir_config_domain_get_memory(domain) == 987654321);
>
> + features = gvir_config_domain_get_features(domain);
> + g_assert(g_strv_length(features) == 2);
> + g_assert(strcmp(features[0], "f1") == 0);
> + g_assert(strcmp(features[1], "f2") == 0);
> + g_strfreev(features);
> +
> g_free(xml);
>
> xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(domain));
> diff --git a/libvirt-gconfig/tests/test-domain.xml b/libvirt-gconfig/tests/test-domain.xml
> index d887e95..a9610cc 100644
> --- a/libvirt-gconfig/tests/test-domain.xml
> +++ b/libvirt-gconfig/tests/test-domain.xml
> @@ -2,5 +2,6 @@
> <name>foo</name>
> <uuid>4dea22b31d52d8f32516782e98ab3fa0</uuid>
> <description>Some human readable description</description>
> + <features><f1/><f2/></features>
> <memory>987654321</memory>
> </domain>
ACK
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list