[libvirt] [libvirt-glib 07/13] Add gvir_config_object_set_attribute{_with_type}

Christophe Fergeau cfergeau at redhat.com
Mon Nov 28 15:32:13 UTC 2011


---
 libvirt-gconfig/libvirt-gconfig-object-private.h |    4 +
 libvirt-gconfig/libvirt-gconfig-object.c         |  110 ++++++++++++++++++++++
 libvirt-gconfig/libvirt-gconfig.sym              |    2 +
 3 files changed, 116 insertions(+), 0 deletions(-)

diff --git a/libvirt-gconfig/libvirt-gconfig-object-private.h b/libvirt-gconfig/libvirt-gconfig-object-private.h
index 9703150..071d45c 100644
--- a/libvirt-gconfig/libvirt-gconfig-object-private.h
+++ b/libvirt-gconfig/libvirt-gconfig-object-private.h
@@ -44,6 +44,10 @@ void gvir_config_object_set_child(GVirConfigObject *object,
 
 void gvir_config_object_attach(GVirConfigObject *parent,
                                GVirConfigObject *child);
+void gvir_config_object_set_attribute(GVirConfigObject *object,
+                                      ...) G_GNUC_NULL_TERMINATED;
+void gvir_config_object_set_attribute_with_type(GVirConfigObject *object,
+                                                ...) G_GNUC_NULL_TERMINATED;
 
 G_END_DECLS
 
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c
index ed10726..67507d8 100644
--- a/libvirt-gconfig/libvirt-gconfig-object.c
+++ b/libvirt-gconfig/libvirt-gconfig-object.c
@@ -484,6 +484,116 @@ GVirConfigObject *gvir_config_object_new(GType type,
 }
 
 G_GNUC_INTERNAL void
+gvir_config_object_set_attribute(GVirConfigObject *object, ...)
+{
+    xmlDocPtr doc;
+    va_list args;
+
+    g_return_if_fail(GVIR_IS_CONFIG_OBJECT(object));
+
+    g_object_get(G_OBJECT(object->priv->doc), "doc", &doc, NULL);
+    va_start(args, object);
+    while (TRUE) {
+        const char *name;
+        const char *value;
+        xmlChar *encoded_value;
+
+        name = va_arg(args, const char *);
+        if (name == NULL) {
+            break;
+        }
+        value = va_arg(args, const char *);
+        if (value == NULL) {
+            g_warn_if_reached();
+            break;
+        }
+        encoded_value = xmlEncodeEntitiesReentrant(doc, (xmlChar*)value);
+        xmlNewProp(object->priv->node, (xmlChar *)name, encoded_value);
+        xmlFree(encoded_value);
+    }
+    va_end(args);
+}
+
+G_GNUC_INTERNAL void
+gvir_config_object_set_attribute_with_type(GVirConfigObject *object, ...)
+{
+    va_list args;
+
+    g_return_if_fail(GVIR_IS_CONFIG_OBJECT(object));
+
+    va_start(args, object);
+    while (TRUE) {
+        const char *name;
+        GType attr_type;
+        char *str;
+
+
+        name = va_arg(args, const char *);
+        if (name == NULL) {
+            break;
+        }
+
+        attr_type = va_arg(args, GType);
+        if (G_TYPE_IS_ENUM(attr_type)) {
+            int val;
+            const char *enum_str;
+            val = va_arg(args, int);
+            enum_str = gvir_config_genum_get_nick(attr_type, val);
+            if (enum_str != NULL) {
+                str = g_strdup(enum_str);
+            } else {
+                str = NULL;
+            }
+        } else switch (attr_type) {
+            case G_TYPE_UINT64: {
+                guint64 val;
+                val = va_arg(args, guint64);
+                str = g_strdup_printf("%"G_GUINT64_FORMAT, val);
+                break;
+            }
+            case G_TYPE_UINT: {
+                guint val;
+                val = va_arg(args, guint);
+                str = g_strdup_printf("%u", val);
+                break;
+            }
+            case G_TYPE_INT: {
+                gint val;
+                val = va_arg(args, gint);
+                str = g_strdup_printf("%d", val);
+                break;
+            }
+            case G_TYPE_STRING: {
+                xmlDocPtr doc;
+                xmlChar *enc_str;
+
+                str = va_arg(args, char *);
+                g_object_get(G_OBJECT(object->priv->doc), "doc", &doc, NULL);
+                enc_str = xmlEncodeEntitiesReentrant(doc, (xmlChar*)str);
+                str = g_strdup((char *)enc_str);
+                xmlFree(enc_str);
+                break;
+            }
+            case G_TYPE_BOOLEAN: {
+                gboolean val;
+                val = va_arg(args, gboolean);
+                str = g_strdup_printf("%s", val?"yes":"no");
+                break;
+            }
+            default:
+                g_warning("Unhandled type: %s", g_type_name(attr_type));
+                g_assert_not_reached();
+        }
+
+        if (str != NULL) {
+            xmlNewProp(object->priv->node, (xmlChar *)name, (xmlChar *)str);
+            g_free(str);
+        }
+    }
+    va_end(args);
+}
+
+G_GNUC_INTERNAL void
 gvir_config_object_attach(GVirConfigObject *parent, GVirConfigObject *child)
 {
     g_return_if_fail(GVIR_IS_CONFIG_OBJECT(parent));
diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym
index ec37cdb..1ad7fc4 100644
--- a/libvirt-gconfig/libvirt-gconfig.sym
+++ b/libvirt-gconfig/libvirt-gconfig.sym
@@ -118,6 +118,8 @@ LIBVIRT_GOBJECT_0.0.1 {
 	gvir_config_object_to_xml;
 	gvir_config_object_validate;
 	gvir_config_object_attach;
+	gvir_config_object_set_attribute;
+	gvir_config_object_set_attribute_with_type;
 
 	gvir_config_secret_get_type;
 	gvir_config_secret_new;
-- 
1.7.7.3




More information about the libvir-list mailing list