Asterisk data retrieval API.
[asterisk/asterisk.git] / main / xml.c
index 9a0c66d..e28a989 100644 (file)
 
 #include "asterisk.h"
 #include "asterisk/xml.h"
+#include "asterisk/logger.h"
 
 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
 #if defined(HAVE_LIBXML2)
 #include <libxml/parser.h>
 #include <libxml/tree.h>
+#include <libxml/xinclude.h>
 /* libxml2 ast_xml implementation. */
 
 
@@ -55,10 +57,75 @@ struct ast_xml_doc *ast_xml_open(char *filename)
        }
 
        doc = xmlReadFile(filename, NULL, XML_PARSE_RECOVER);
+       if (doc) {
+               /* process xinclude elements. */
+               if (xmlXIncludeProcess(doc) < 0) {
+                       xmlFreeDoc(doc);
+                       return NULL;
+               }
+       }
 
        return (struct ast_xml_doc *) doc;
 }
 
+struct ast_xml_doc *ast_xml_new(void)
+{
+       xmlDoc *doc;
+
+       doc = xmlNewDoc((const xmlChar *) "1.0");
+       return (struct ast_xml_doc *) doc;
+}
+
+struct ast_xml_node *ast_xml_new_node(const char *name)
+{
+       xmlNode *node;
+       if (!name) {
+               return NULL;
+       }
+
+       node = xmlNewNode(NULL, (const xmlChar *) name);
+
+       return (struct ast_xml_node *) node;
+}
+
+struct ast_xml_node *ast_xml_new_child(struct ast_xml_node *parent, const char *child_name)
+{
+       xmlNode *child;
+
+       if (!parent || !child_name) {
+               return NULL;
+       }
+
+       child = xmlNewChild((xmlNode *) parent, NULL, (const xmlChar *) child_name, NULL);
+       return (struct ast_xml_node *) child;
+}
+
+struct ast_xml_node *ast_xml_add_child(struct ast_xml_node *parent, struct ast_xml_node *child)
+{
+       if (!parent || !child) {
+               return NULL;
+       }
+       return (struct ast_xml_node *) xmlAddChild((xmlNode *) parent, (xmlNode *) child);
+}
+
+struct ast_xml_doc *ast_xml_read_memory(char *buffer, size_t size)
+{
+       xmlDoc *doc;
+
+       if (!buffer) {
+               return NULL;
+       }
+
+       if (!(doc = xmlParseMemory(buffer, (int) size))) {
+               /* process xinclude elements. */
+               if (xmlXIncludeProcess(doc) < 0) {
+                       xmlFreeDoc(doc);
+                       return NULL;
+               }
+       }
+
+       return (struct ast_xml_doc *) doc;
+}
 
 void ast_xml_close(struct ast_xml_doc *doc)
 {
@@ -70,6 +137,14 @@ void ast_xml_close(struct ast_xml_doc *doc)
        doc = NULL;
 }
 
+void ast_xml_set_root(struct ast_xml_doc *doc, struct ast_xml_node *node)
+{
+       if (!doc || !node) {
+               return;
+       }
+
+       xmlDocSetRootElement((xmlDoc *) doc, (xmlNode *) node);
+}
 
 struct ast_xml_node *ast_xml_get_root(struct ast_xml_doc *doc)
 {
@@ -125,6 +200,19 @@ const char *ast_xml_get_attribute(struct ast_xml_node *node, const char *attrnam
        return (const char *) attrvalue;
 }
 
+int ast_xml_set_attribute(struct ast_xml_node *node, const char *name, const char *value)
+{
+       if (!name || !value) {
+               return -1;
+       }
+
+       if (!xmlSetProp((xmlNode *) node, (xmlChar *) name, (xmlChar *) value)) {
+               return -1;
+       }
+
+       return 0;
+}
+
 struct ast_xml_node *ast_xml_find_element(struct ast_xml_node *root_node, const char *name, const char *attrname, const char *attrvalue)
 {
        struct ast_xml_node *cur;
@@ -157,6 +245,25 @@ struct ast_xml_node *ast_xml_find_element(struct ast_xml_node *root_node, const
        return NULL;
 }
 
+struct ast_xml_doc *ast_xml_get_doc(struct ast_xml_node *node)
+{
+       if (!node) {
+               return NULL;
+       }
+
+       return (struct ast_xml_doc *) ((xmlNode *)node)->doc;
+}
+
+struct ast_xml_ns *ast_xml_find_namespace(struct ast_xml_doc *doc, struct ast_xml_node *node, const char *ns_name) {
+       xmlNsPtr ns = xmlSearchNs((xmlDocPtr) doc, (xmlNodePtr) node, (xmlChar *) ns_name);
+       return (struct ast_xml_ns *) ns;
+}
+
+const char *ast_xml_get_ns_href(struct ast_xml_ns *ns)
+{
+       return (const char *) ((xmlNsPtr) ns)->href;
+}
+
 const char *ast_xml_get_text(struct ast_xml_node *node)
 {
        if (!node) {
@@ -166,6 +273,20 @@ const char *ast_xml_get_text(struct ast_xml_node *node)
        return (const char *) xmlNodeGetContent((xmlNode *) node);
 }
 
+void ast_xml_set_text(struct ast_xml_node *node, const char *content)
+{
+       if (!node || !content) {
+               return;
+       }
+
+       xmlNodeSetContent((xmlNode *) node, (const xmlChar *) content);
+}
+
+int ast_xml_doc_dump_file(FILE *output, struct ast_xml_doc *doc)
+{
+       return xmlDocDump(output, (xmlDocPtr)doc);
+}
+
 const char *ast_xml_node_get_name(struct ast_xml_node *node)
 {
        return (const char *) ((xmlNode *) node)->name;