diff options
author | Benjamin Dauvergne <bdauvergne@entrouvert.com> | 2008-11-03 14:15:44 +0000 |
---|---|---|
committer | Benjamin Dauvergne <bdauvergne@entrouvert.com> | 2008-11-03 14:15:44 +0000 |
commit | a8adf797fefd1440d2c421a90a4c1fee46afc317 (patch) | |
tree | 04f315df67fae0916f6d10ab04ff1d9fff1c034e /lasso | |
parent | 770e3c5538b3cb69da76cae3c8fbe44e16f14f8e (diff) | |
download | lasso-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.c | 62 | ||||
-rw-r--r-- | lasso/xml/xml.h | 1 |
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); |