This property stores the XML node corresponding to the current
configuration object in the XML tree. When creating configuration
objects from a XML string, the XML file will be lazily loaded, and
this property will be set.
---
libvirt-gconfig/libvirt-gconfig-object.c | 35 +++++++++++++++++++++++++++--
1 files changed, 32 insertions(+), 3 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c
b/libvirt-gconfig/libvirt-gconfig-object.c
index 52e9be0..762baf9 100644
--- a/libvirt-gconfig/libvirt-gconfig-object.c
+++ b/libvirt-gconfig/libvirt-gconfig-object.c
@@ -43,7 +43,11 @@ struct _GVirConfigObjectPrivate
gchar *doc;
gchar *schema;
+ /* FIXME: docHandle is node->doc, can probably be removed to avoid the
+ * 2 getting out of sync
+ */
xmlDocPtr docHandle;
+ xmlNodePtr node;
};
G_DEFINE_ABSTRACT_TYPE(GVirConfigObject, gvir_config_object, G_TYPE_OBJECT);
@@ -52,6 +56,7 @@ enum {
PROP_0,
PROP_DOC,
PROP_SCHEMA,
+ PROP_NODE
};
@@ -83,6 +88,10 @@ static void gvir_config_object_get_property(GObject *object,
g_value_set_string(value, priv->schema);
break;
+ case PROP_NODE:
+ g_value_set_pointer(value, gvir_config_object_get_xml_node(conn, NULL));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
}
@@ -108,6 +117,16 @@ static void gvir_config_object_set_property(GObject *object,
priv->schema = g_value_dup_string(value);
break;
+ case PROP_NODE:
+ priv->node = g_value_get_pointer(value);
+ if ((priv->docHandle != NULL) && (priv->docHandle !=
priv->node->doc))
+ xmlFreeDoc(priv->docHandle);
+ if (priv->node)
+ priv->docHandle = priv->node->doc;
+ else
+ priv->docHandle = NULL;
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
}
@@ -164,6 +183,15 @@ static void gvir_config_object_class_init(GVirConfigObjectClass
*klass)
G_PARAM_STATIC_NICK |
G_PARAM_STATIC_BLURB));
+ g_object_class_install_property(object_class,
+ PROP_NODE,
+ g_param_spec_pointer("node",
+ "XML Node",
+ "The XML node this config
object corresponds to",
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+
g_type_class_add_private(klass, sizeof(GVirConfigObjectPrivate));
}
@@ -202,6 +230,7 @@ gvir_config_object_parse(GVirConfigObject *config,
"%s",
"Unable to parse configuration");
}
+ priv->node = priv->docHandle->children;
}
@@ -277,6 +306,8 @@ const gchar *gvir_config_object_get_schema(GVirConfigObject *config)
}
/* NB: the xmlDocPtr must not be freed by the caller */
+/* gupnp has wrapped xmlDoc in a gobject */
+/* not really useful, can be obtained from xmlNode::doc */
xmlDocPtr gvir_config_object_get_xml_doc(GVirConfigObject *config, GError **error)
{
gvir_config_object_parse(config, error);
@@ -290,7 +321,5 @@ xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config,
GError **error)
{
gvir_config_object_parse(config, error);
- if (error)
- return NULL;
- return config->priv->docHandle->children;
+ return config->priv->node;
}
--
1.7.6.4