summaryrefslogtreecommitdiffstats
path: root/lasso
diff options
context:
space:
mode:
authorBenjamin Dauvergne <bdauvergne@entrouvert.com>2008-11-03 14:15:44 +0000
committerBenjamin Dauvergne <bdauvergne@entrouvert.com>2008-11-03 14:15:44 +0000
commita8adf797fefd1440d2c421a90a4c1fee46afc317 (patch)
tree04f315df67fae0916f6d10ab04ff1d9fff1c034e /lasso
parent770e3c5538b3cb69da76cae3c8fbe44e16f14f8e (diff)
downloadlasso-a8adf797fefd1440d2c421a90a4c1fee46afc317.tar.gz
lasso-a8adf797fefd1440d2c421a90a4c1fee46afc317.tar.xz
lasso-a8adf797fefd1440d2c421a90a4c1fee46afc317.zip
API to cleanup LassoNode tree of keeped xmlNode
* lasso/xml/xml.c: - add a new function lasso_node_cleanup_original_xmlnodes to disallocate all keeped xmlNode inside a tree of LassoNodes. - add internal function lasso_node_traversal to iterate across a LassoNode tree (could be used to reimplement lasso_node_destroy) It is a preorder traversal.
Diffstat (limited to 'lasso')
-rw-r--r--lasso/xml/xml.c62
-rw-r--r--lasso/xml/xml.h1
2 files changed, 63 insertions, 0 deletions
diff --git a/lasso/xml/xml.c b/lasso/xml/xml.c
index bdbb2725..a846623f 100644
--- a/lasso/xml/xml.c
+++ b/lasso/xml/xml.c
@@ -64,8 +64,10 @@ static gboolean find_path(LassoNode *node, char *path, LassoNode **value_node,
static void lasso_node_add_signature_template(LassoNode *node, xmlNode *xmlnode,
struct XmlSnippet *snippet_signature);
+static void lasso_node_traversal(LassoNode *node, void (*do_to_node)(LassoNode *node));
static LassoNode* lasso_node_new_from_xmlNode_with_type(xmlNode *xmlnode, char *typename);
+static void lasso_node_remove_original_xmlnode(LassoNode *node);
GHashTable *dst_services_by_href = NULL; /* ID-WSF 1 extra DST services, indexed on href */
GHashTable *dst_services_by_prefix = NULL; /* ID-WSF 1 extra DST services, indexed on prefix */
@@ -951,11 +953,71 @@ lasso_node_get_xmlNode(LassoNode *node, gboolean lasso_dump)
return class->get_xmlNode(node, lasso_dump);
}
+/**
+ * lasso_node_cleanup_original_xmlnodes:
+ *
+ * @node: a #LassoNode
+ *
+ * Traverse the #LassoNode tree starting at Node and remove original_xmlNode if found.
+ */
+void
+lasso_node_cleanup_original_xmlnodes(LassoNode *node)
+{
+ lasso_node_traversal(node, lasso_node_remove_original_xmlnode);
+}
+
/*****************************************************************************/
/* implementation methods */
/*****************************************************************************/
static void
+lasso_node_remove_original_xmlnode(LassoNode *node) {
+ lasso_release_gobject(node->original_xmlNode);
+}
+
+static void
+lasso_node_traversal(LassoNode *node, void (*do_to_node)(LassoNode *node)) {
+ LassoNodeClass *class;
+ struct XmlSnippet *snippet;
+ do_to_node(node);
+
+ class = LASSO_NODE_GET_CLASS(node);
+ if (class->node_data == NULL || node == NULL || do_to_node == NULL) {
+ return;
+ }
+ snippet = class->node_data->snippets;
+ while (snippet->name != NULL) {
+ SnippetType type;
+ void **value = G_STRUCT_MEMBER_P(node, snippet->offset);
+
+ type = snippet->type & 0xff;
+ switch (type) {
+ case SNIPPET_NODE:
+ case SNIPPET_NAME_IDENTIFIER:
+ case SNIPPET_NODE_IN_CHILD:
+ do_to_node(*value);
+ lasso_node_traversal(*value, do_to_node);
+ break;
+ case SNIPPET_LIST_NODES:
+ {
+ GList *list = *value;
+ while (list != NULL) {
+ if (list->data) {
+ do_to_node(list->data);
+ lasso_node_traversal(*value, do_to_node);
+ }
+ list = g_list_next(list);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ snippet++;
+ }
+}
+
+static void
lasso_node_impl_destroy(LassoNode *node)
{
g_object_unref(G_OBJECT(node));
diff --git a/lasso/xml/xml.h b/lasso/xml/xml.h
index b25ee63f..73576897 100644
--- a/lasso/xml/xml.h
+++ b/lasso/xml/xml.h
@@ -129,6 +129,7 @@ LASSO_EXPORT LassoNode* lasso_node_new_from_dump(const char *dump);
LASSO_EXPORT LassoNode* lasso_node_new_from_soap(const char *soap);
LASSO_EXPORT LassoNode* lasso_node_new_from_xmlNode(xmlNode* node);
+LASSO_EXPORT void lasso_node_cleanup_original_xmlnodes(LassoNode *node);
LASSO_EXPORT void lasso_node_destroy(LassoNode *node);
LASSO_EXPORT char* lasso_node_dump(LassoNode *node);
LASSO_EXPORT char* lasso_node_export_to_base64(LassoNode *node);