00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "asterisk.h"
00029 #include "asterisk/xml.h"
00030 #include "asterisk/logger.h"
00031
00032 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 369001 $")
00033
00034 #if defined(HAVE_LIBXML2)
00035 #include <libxml/parser.h>
00036 #include <libxml/tree.h>
00037 #include <libxml/xinclude.h>
00038
00039
00040
00041 int ast_xml_init(void)
00042 {
00043 LIBXML_TEST_VERSION
00044
00045 return 0;
00046 }
00047
00048 int ast_xml_finish(void)
00049 {
00050 xmlCleanupParser();
00051
00052 return 0;
00053 }
00054
00055 struct ast_xml_doc *ast_xml_open(char *filename)
00056 {
00057 xmlDoc *doc;
00058
00059 if (!filename) {
00060 return NULL;
00061 }
00062
00063 doc = xmlReadFile(filename, NULL, XML_PARSE_RECOVER);
00064 if (doc) {
00065
00066 if (xmlXIncludeProcess(doc) < 0) {
00067 xmlFreeDoc(doc);
00068 return NULL;
00069 }
00070 }
00071
00072 return (struct ast_xml_doc *) doc;
00073 }
00074
00075 struct ast_xml_doc *ast_xml_new(void)
00076 {
00077 xmlDoc *doc;
00078
00079 doc = xmlNewDoc((const xmlChar *) "1.0");
00080 return (struct ast_xml_doc *) doc;
00081 }
00082
00083 struct ast_xml_node *ast_xml_new_node(const char *name)
00084 {
00085 xmlNode *node;
00086 if (!name) {
00087 return NULL;
00088 }
00089
00090 node = xmlNewNode(NULL, (const xmlChar *) name);
00091
00092 return (struct ast_xml_node *) node;
00093 }
00094
00095 struct ast_xml_node *ast_xml_new_child(struct ast_xml_node *parent, const char *child_name)
00096 {
00097 xmlNode *child;
00098
00099 if (!parent || !child_name) {
00100 return NULL;
00101 }
00102
00103 child = xmlNewChild((xmlNode *) parent, NULL, (const xmlChar *) child_name, NULL);
00104 return (struct ast_xml_node *) child;
00105 }
00106
00107 struct ast_xml_node *ast_xml_add_child(struct ast_xml_node *parent, struct ast_xml_node *child)
00108 {
00109 if (!parent || !child) {
00110 return NULL;
00111 }
00112 return (struct ast_xml_node *) xmlAddChild((xmlNode *) parent, (xmlNode *) child);
00113 }
00114
00115 struct ast_xml_doc *ast_xml_read_memory(char *buffer, size_t size)
00116 {
00117 xmlDoc *doc;
00118
00119 if (!buffer) {
00120 return NULL;
00121 }
00122
00123 if (!(doc = xmlParseMemory(buffer, (int) size))) {
00124
00125 if (xmlXIncludeProcess(doc) < 0) {
00126 xmlFreeDoc(doc);
00127 return NULL;
00128 }
00129 }
00130
00131 return (struct ast_xml_doc *) doc;
00132 }
00133
00134 void ast_xml_close(struct ast_xml_doc *doc)
00135 {
00136 if (!doc) {
00137 return;
00138 }
00139
00140 xmlFreeDoc((xmlDoc *) doc);
00141 doc = NULL;
00142 }
00143
00144 void ast_xml_set_root(struct ast_xml_doc *doc, struct ast_xml_node *node)
00145 {
00146 if (!doc || !node) {
00147 return;
00148 }
00149
00150 xmlDocSetRootElement((xmlDoc *) doc, (xmlNode *) node);
00151 }
00152
00153 struct ast_xml_node *ast_xml_get_root(struct ast_xml_doc *doc)
00154 {
00155 xmlNode *root_node;
00156
00157 if (!doc) {
00158 return NULL;
00159 }
00160
00161 root_node = xmlDocGetRootElement((xmlDoc *) doc);
00162
00163 return (struct ast_xml_node *) root_node;
00164 }
00165
00166 void ast_xml_free_node(struct ast_xml_node *node)
00167 {
00168 if (!node) {
00169 return;
00170 }
00171
00172 xmlFreeNode((xmlNode *) node);
00173 node = NULL;
00174 }
00175
00176 void ast_xml_free_attr(const char *attribute)
00177 {
00178 if (attribute) {
00179 xmlFree((char *) attribute);
00180 }
00181 }
00182
00183 void ast_xml_free_text(const char *text)
00184 {
00185 if (text) {
00186 xmlFree((char *) text);
00187 }
00188 }
00189
00190 const char *ast_xml_get_attribute(struct ast_xml_node *node, const char *attrname)
00191 {
00192 xmlChar *attrvalue;
00193
00194 if (!node) {
00195 return NULL;
00196 }
00197
00198 if (!attrname) {
00199 return NULL;
00200 }
00201
00202 attrvalue = xmlGetProp((xmlNode *) node, (xmlChar *) attrname);
00203
00204 return (const char *) attrvalue;
00205 }
00206
00207 int ast_xml_set_attribute(struct ast_xml_node *node, const char *name, const char *value)
00208 {
00209 if (!name || !value) {
00210 return -1;
00211 }
00212
00213 if (!xmlSetProp((xmlNode *) node, (xmlChar *) name, (xmlChar *) value)) {
00214 return -1;
00215 }
00216
00217 return 0;
00218 }
00219
00220 struct ast_xml_node *ast_xml_find_element(struct ast_xml_node *root_node, const char *name, const char *attrname, const char *attrvalue)
00221 {
00222 struct ast_xml_node *cur;
00223 const char *attr;
00224
00225 if (!root_node) {
00226 return NULL;
00227 }
00228
00229 for (cur = root_node; cur; cur = ast_xml_node_get_next(cur)) {
00230
00231 if (strcmp(ast_xml_node_get_name(cur), name)) {
00232 continue;
00233 }
00234
00235 if (!attrname || !attrvalue) {
00236 return cur;
00237 }
00238
00239 if ((attr = ast_xml_get_attribute(cur, attrname))) {
00240
00241 if (!strcmp(attr, attrvalue)) {
00242 ast_xml_free_attr(attr);
00243 return cur;
00244 }
00245 ast_xml_free_attr(attr);
00246 }
00247 }
00248
00249 return NULL;
00250 }
00251
00252 struct ast_xml_doc *ast_xml_get_doc(struct ast_xml_node *node)
00253 {
00254 if (!node) {
00255 return NULL;
00256 }
00257
00258 return (struct ast_xml_doc *) ((xmlNode *)node)->doc;
00259 }
00260
00261 struct ast_xml_ns *ast_xml_find_namespace(struct ast_xml_doc *doc, struct ast_xml_node *node, const char *ns_name) {
00262 xmlNsPtr ns = xmlSearchNs((xmlDocPtr) doc, (xmlNodePtr) node, (xmlChar *) ns_name);
00263 return (struct ast_xml_ns *) ns;
00264 }
00265
00266 const char *ast_xml_get_ns_href(struct ast_xml_ns *ns)
00267 {
00268 return (const char *) ((xmlNsPtr) ns)->href;
00269 }
00270
00271 const char *ast_xml_get_text(struct ast_xml_node *node)
00272 {
00273 if (!node) {
00274 return NULL;
00275 }
00276
00277 return (const char *) xmlNodeGetContent((xmlNode *) node);
00278 }
00279
00280 void ast_xml_set_text(struct ast_xml_node *node, const char *content)
00281 {
00282 if (!node || !content) {
00283 return;
00284 }
00285
00286 xmlNodeSetContent((xmlNode *) node, (const xmlChar *) content);
00287 }
00288
00289 int ast_xml_doc_dump_file(FILE *output, struct ast_xml_doc *doc)
00290 {
00291 return xmlDocDump(output, (xmlDocPtr)doc);
00292 }
00293
00294 const char *ast_xml_node_get_name(struct ast_xml_node *node)
00295 {
00296 return (const char *) ((xmlNode *) node)->name;
00297 }
00298
00299 struct ast_xml_node *ast_xml_node_get_children(struct ast_xml_node *node)
00300 {
00301 return (struct ast_xml_node *) ((xmlNode *) node)->children;
00302 }
00303
00304 struct ast_xml_node *ast_xml_node_get_next(struct ast_xml_node *node)
00305 {
00306 return (struct ast_xml_node *) ((xmlNode *) node)->next;
00307 }
00308
00309 struct ast_xml_node *ast_xml_node_get_prev(struct ast_xml_node *node)
00310 {
00311 return (struct ast_xml_node *) ((xmlNode *) node)->prev;
00312 }
00313
00314 struct ast_xml_node *ast_xml_node_get_parent(struct ast_xml_node *node)
00315 {
00316 return (struct ast_xml_node *) ((xmlNode *) node)->parent;
00317 }
00318
00319 #endif
00320