Asterisk - The Open Source Telephony Project GIT-master-f36a736
Functions
xml.c File Reference

XML abstraction layer. More...

#include "asterisk.h"
#include "asterisk/xml.h"
#include "asterisk/logger.h"
#include "asterisk/utils.h"
#include "asterisk/autoconfig.h"
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <libxml/xinclude.h>
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>
Include dependency graph for xml.c:

Go to the source code of this file.

Functions

struct ast_xml_node * ast_xml_add_child (struct ast_xml_node *parent, struct ast_xml_node *child)
 Add a child node, to a specified parent node. More...
 
struct ast_xml_node * ast_xml_add_child_list (struct ast_xml_node *parent, struct ast_xml_node *child)
 Add a list of child nodes, to a specified parent node. More...
 
void ast_xml_close (struct ast_xml_doc *doc)
 Close an already open document and free the used structure. More...
 
struct ast_xml_node * ast_xml_copy_node_list (struct ast_xml_node *list)
 Create a copy of a n ode list. More...
 
int ast_xml_doc_dump_file (FILE *output, struct ast_xml_doc *doc)
 Dump the specified document to a file. More...
 
void ast_xml_doc_dump_memory (struct ast_xml_doc *doc, char **buffer, int *length)
 Dump the specified document to a buffer. More...
 
struct ast_xml_node * ast_xml_find_element (struct ast_xml_node *root_node, const char *name, const char *attrname, const char *attrvalue)
 Find a node element by name. More...
 
struct ast_xml_ns * ast_xml_find_namespace (struct ast_xml_doc *doc, struct ast_xml_node *node, const char *ns_name)
 
int ast_xml_finish (void)
 Cleanup library allocated global data. More...
 
void ast_xml_free_attr (const char *attribute)
 Free an attribute returned by ast_xml_get_attribute() More...
 
void ast_xml_free_node (struct ast_xml_node *node)
 Free node. More...
 
void ast_xml_free_text (const char *text)
 Free a content element that was returned by ast_xml_get_text() More...
 
const char * ast_xml_get_attribute (struct ast_xml_node *node, const char *attrname)
 Get a node attribute by name. More...
 
struct ast_xml_doc * ast_xml_get_doc (struct ast_xml_node *node)
 Get the document based on a node. More...
 
const char * ast_xml_get_ns_href (struct ast_xml_ns *ns)
 Get the href of a namespace. More...
 
const char * ast_xml_get_ns_prefix (struct ast_xml_ns *ns)
 Get the prefix of a namespace. More...
 
struct ast_xml_node * ast_xml_get_root (struct ast_xml_doc *doc)
 Get the document root node. More...
 
const char * ast_xml_get_text (struct ast_xml_node *node)
 Get an element content string. More...
 
int ast_xml_init (void)
 Initialize the XML library implementation. This function is used to setup everything needed to start working with the xml implementation. More...
 
struct ast_xml_doc * ast_xml_new (void)
 Create a XML document. More...
 
struct ast_xml_node * ast_xml_new_child (struct ast_xml_node *parent, const char *child_name)
 Add a child node inside a passed parent node. More...
 
struct ast_xml_node * ast_xml_new_node (const char *name)
 Create a XML node. More...
 
struct ast_xml_node * ast_xml_node_get_children (struct ast_xml_node *node)
 Get the node's children. More...
 
const char * ast_xml_node_get_name (struct ast_xml_node *node)
 Get the name of a node. More...
 
struct ast_xml_node * ast_xml_node_get_next (struct ast_xml_node *node)
 Get the next node in the same level. More...
 
struct ast_xml_node * ast_xml_node_get_parent (struct ast_xml_node *node)
 Get the parent of a specified node. More...
 
struct ast_xml_node * ast_xml_node_get_prev (struct ast_xml_node *node)
 Get the previous node in the same leve. More...
 
struct ast_xml_doc * ast_xml_open (char *filename)
 Open an XML document. More...
 
struct ast_xml_xpath_results * ast_xml_query (struct ast_xml_doc *doc, const char *xpath_str)
 Execute an XPath query on an XML document. More...
 
struct ast_xml_xpath_results * ast_xml_query_with_namespaces (struct ast_xml_doc *doc, const char *xpath_str, struct ast_xml_namespace_def_vector *namespaces)
 Execute an XPath query on an XML document with namespaces. More...
 
struct ast_xml_doc * ast_xml_read_memory (char *buffer, size_t size)
 Open an XML document that resides in memory. More...
 
int ast_xml_set_attribute (struct ast_xml_node *node, const char *name, const char *value)
 Set an attribute to a node. More...
 
void ast_xml_set_name (struct ast_xml_node *node, const char *name)
 Set or reset an element's name. More...
 
void ast_xml_set_root (struct ast_xml_doc *doc, struct ast_xml_node *node)
 Specify the root node of a XML document. More...
 
void ast_xml_set_text (struct ast_xml_node *node, const char *content)
 Set an element content string. More...
 
struct ast_xml_node * ast_xml_xpath_get_first_result (struct ast_xml_xpath_results *results)
 Return the first result node of an XPath query. More...
 
struct ast_xml_node * ast_xml_xpath_get_result (struct ast_xml_xpath_results *results, int i)
 Return a specific result node of an XPath query. More...
 
int ast_xml_xpath_num_results (struct ast_xml_xpath_results *results)
 Return the number of results from an XPath query. More...
 
void ast_xml_xpath_results_free (struct ast_xml_xpath_results *results)
 Free the XPath results. More...
 
static int process_xincludes (xmlDoc *doc)
 

Detailed Description

XML abstraction layer.

Author
Eliel C. Sardanons (LU1ALY) eliel.nosp@m.s@gm.nosp@m.ail.c.nosp@m.om

Definition in file xml.c.

Function Documentation

◆ ast_xml_add_child()

struct ast_xml_node * ast_xml_add_child ( struct ast_xml_node *  parent,
struct ast_xml_node *  child 
)

Add a child node, to a specified parent node.

Parameters
parentWhere to add the child node.
childThe child node to add.
Return values
NULLon error.
non-NULLThe add child node on success.

Definition at line 168 of file xml.c.

169{
170 if (!parent || !child) {
171 return NULL;
172 }
173 return (struct ast_xml_node *) xmlAddChild((xmlNode *) parent, (xmlNode *) child);
174}
#define NULL
Definition: resample.c:96

References NULL.

Referenced by ast_geoloc_eprofile_to_pidf(), ast_geoloc_eprofiles_to_pidf(), and geoloc_eprofile_to_intermediate().

◆ ast_xml_add_child_list()

struct ast_xml_node * ast_xml_add_child_list ( struct ast_xml_node *  parent,
struct ast_xml_node *  child 
)

Add a list of child nodes, to a specified parent node.

Parameters
parentWhere to add the child node.
childThe child list to add.
Return values
NULLon error.
non-NULLThe added child list on success.

Definition at line 176 of file xml.c.

177{
178 if (!parent || !child) {
179 return NULL;
180 }
181 return (struct ast_xml_node *) xmlAddChildList((xmlNode *) parent, (xmlNode *) child);
182}

References NULL.

Referenced by ast_geoloc_eprofiles_to_pidf(), and handle_dump_docs().

◆ ast_xml_close()

void ast_xml_close ( struct ast_xml_doc *  doc)

Close an already open document and free the used structure.

Parameters
docXML Document to close

Definition at line 211 of file xml.c.

212{
213 if (!doc) {
214 return;
215 }
216
217 xmlFreeDoc((xmlDoc *) doc);
218 doc = NULL;
219}

References NULL.

Referenced by ast_geoloc_eprofile_create_from_pidf(), ast_geoloc_eprofile_to_pidf(), ast_geoloc_eprofiles_to_pidf(), handle_dump_docs(), handle_incoming_request(), xmldoc_load_documentation(), and xmldoc_purge_documentation().

◆ ast_xml_copy_node_list()

struct ast_xml_node * ast_xml_copy_node_list ( struct ast_xml_node *  list)

Create a copy of a n ode list.

Parameters
listThe list to copy.
Return values
NULLon error.
non-NULLThe copied list.

Definition at line 184 of file xml.c.

185{
186 if (!list) {
187 return NULL;
188 }
189 return (struct ast_xml_node *) xmlCopyNodeList((xmlNode *) list);
190}

References NULL.

Referenced by ast_geoloc_eprofiles_to_pidf(), and handle_dump_docs().

◆ ast_xml_doc_dump_file()

int ast_xml_doc_dump_file ( FILE *  output,
struct ast_xml_doc *  doc 
)

Dump the specified document to a file.

Definition at line 380 of file xml.c.

381{
382 return xmlDocDump(output, (xmlDocPtr)doc);
383}

Referenced by handle_dump_docs().

◆ ast_xml_doc_dump_memory()

void ast_xml_doc_dump_memory ( struct ast_xml_doc *  doc,
char **  buffer,
int *  length 
)

Dump the specified document to a buffer.

Parameters
docThe XML doc to dump
bufferA pointer to a char * to receive the address of the results
lengthA pointer to an int to receive the length of the results
Note
The result buffer must be freed with ast_xml_free_text().

Definition at line 385 of file xml.c.

386{
387 xmlDocDumpFormatMemory((xmlDocPtr)doc, (xmlChar **)buffer, length, 1);
388}

Referenced by ast_geoloc_eprofile_create_from_pidf(), ast_geoloc_eprofile_to_pidf(), ast_geoloc_eprofiles_to_pidf(), and geoloc_eprofile_create_from_xslt_result().

◆ ast_xml_find_element()

struct ast_xml_node * ast_xml_find_element ( struct ast_xml_node *  root_node,
const char *  name,
const char *  attrname,
const char *  attrvalue 
)

Find a node element by name.

Parameters
root_nodeThis is the node starting point.
nameNode name to find.
attrnameattribute name to match (if NULL it won't be matched).
attrvalueattribute value to match (if NULL it won't be matched).
Return values
NULLif not found.
Returns
The node on success.

Definition at line 297 of file xml.c.

298{
299 struct ast_xml_node *cur;
300 const char *attr;
301
302 if (!root_node) {
303 return NULL;
304 }
305
306 for (cur = root_node; cur; cur = ast_xml_node_get_next(cur)) {
307 /* Check if the name matchs */
308 if (strcmp(ast_xml_node_get_name(cur), name)) {
309 continue;
310 }
311 /* We need to check for a specific attribute name? */
312 if (!attrname || !attrvalue) {
313 return cur;
314 }
315 /* Get the attribute, we need to compare it. */
316 if ((attr = ast_xml_get_attribute(cur, attrname))) {
317 /* does attribute name/value matches? */
318 if (!strcmp(attr, attrvalue)) {
319 ast_xml_free_attr(attr);
320 return cur;
321 }
322 ast_xml_free_attr(attr);
323 }
324 }
325
326 return NULL;
327}
static const char name[]
Definition: format_mp3.c:68
const char * ast_xml_get_attribute(struct ast_xml_node *node, const char *attrname)
Get a node attribute by name.
Definition: xml.c:267
const char * ast_xml_node_get_name(struct ast_xml_node *node)
Get the name of a node.
Definition: xml.c:390
void ast_xml_free_attr(const char *attribute)
Free an attribute returned by ast_xml_get_attribute()
Definition: xml.c:253
struct ast_xml_node * ast_xml_node_get_next(struct ast_xml_node *node)
Get the next node in the same level.
Definition: xml.c:400

References ast_xml_free_attr(), ast_xml_get_attribute(), ast_xml_node_get_name(), ast_xml_node_get_next(), name, and NULL.

Referenced by _xmldoc_build_field(), load_modules(), xmldoc_build_final_response(), xmldoc_build_list_responses(), xmldoc_get_node(), and xmldoc_get_syntax_config_object().

◆ ast_xml_find_namespace()

struct ast_xml_ns * ast_xml_find_namespace ( struct ast_xml_doc *  doc,
struct ast_xml_node *  node,
const char *  ns_name 
)

Definition at line 338 of file xml.c.

338 {
339 xmlNsPtr ns = xmlSearchNs((xmlDocPtr) doc, (xmlNodePtr) node, (xmlChar *) ns_name);
340 return (struct ast_xml_ns *) ns;
341}
Definition: test_heap.c:38

◆ ast_xml_finish()

int ast_xml_finish ( void  )

Cleanup library allocated global data.

Return values
0On success.
1On error.

Definition at line 57 of file xml.c.

58{
59 xmlCleanupParser();
60#ifdef HAVE_LIBXSLT
61#ifdef HAVE_LIBXSLT_CLEANUP
62 xsltCleanupGlobals();
63#else
64 xsltUninit();
65#endif
66#endif
67
68 return 0;
69}

Referenced by xmldoc_unload_documentation().

◆ ast_xml_free_attr()

void ast_xml_free_attr ( const char *  attribute)

◆ ast_xml_free_node()

void ast_xml_free_node ( struct ast_xml_node *  node)

Free node.

Parameters
nodeNode to be released.

Definition at line 243 of file xml.c.

244{
245 if (!node) {
246 return;
247 }
248
249 xmlFreeNode((xmlNode *) node);
250 node = NULL;
251}

References NULL.

Referenced by ast_geoloc_eprofiles_to_pidf(), geoloc_civicaddr_list_to_xml(), geoloc_eprofile_to_intermediate(), and geoloc_gml_list_to_xml().

◆ ast_xml_free_text()

void ast_xml_free_text ( const char *  text)

◆ ast_xml_get_attribute()

const char * ast_xml_get_attribute ( struct ast_xml_node *  node,
const char *  attrname 
)

Get a node attribute by name.

Parameters
nodeNode where to search the attribute.
attrnameAttribute name.
Return values
NULLon error
Returns
The attribute value on success.
Note
The result must be freed with ast_xml_free_attr().

Definition at line 267 of file xml.c.

268{
269 xmlChar *attrvalue;
270
271 if (!node) {
272 return NULL;
273 }
274
275 if (!attrname) {
276 return NULL;
277 }
278
279 attrvalue = xmlGetProp((xmlNode *) node, (xmlChar *) attrname);
280
281 return (const char *) attrvalue;
282}

References NULL.

Referenced by _ast_xmldoc_build_seealso(), ast_geoloc_eprofile_to_pidf(), ast_geoloc_eprofiles_to_pidf(), ast_xml_find_element(), ast_xmldoc_build_documentation(), ast_xmldoc_regenerate_doc_item(), build_config_docs(), geoloc_eprofile_create_from_xslt_result(), var_list_from_confidence(), var_list_from_loc_info(), var_list_from_node(), xmldoc_attribute_match(), xmldoc_build_final_response(), xmldoc_build_list_responses(), xmldoc_get_syntax_cmd(), xmldoc_get_syntax_config_object(), xmldoc_get_syntax_config_option(), xmldoc_get_syntax_fun(), xmldoc_get_syntax_manager(), xmldoc_parse_argument(), xmldoc_parse_enumlist(), xmldoc_parse_example(), xmldoc_parse_info(), xmldoc_parse_optionlist(), xmldoc_parse_parameter(), xmldoc_parse_variable(), and xmldoc_parse_variablelist().

◆ ast_xml_get_doc()

struct ast_xml_doc * ast_xml_get_doc ( struct ast_xml_node *  node)

Get the document based on a node.

Parameters
nodeA node that is part of the dom.
Returns
The dom pointer where this node resides.

Definition at line 329 of file xml.c.

330{
331 if (!node) {
332 return NULL;
333 }
334
335 return (struct ast_xml_doc *) ((xmlNode *)node)->doc;
336}

References NULL.

◆ ast_xml_get_ns_href()

const char * ast_xml_get_ns_href ( struct ast_xml_ns *  ns)

Get the href of a namespace.

Parameters
nsThe namespace
Returns
The href of the namespace.

Definition at line 348 of file xml.c.

349{
350 return (const char *) ((xmlNsPtr) ns)->href;
351}

◆ ast_xml_get_ns_prefix()

const char * ast_xml_get_ns_prefix ( struct ast_xml_ns *  ns)

Get the prefix of a namespace.

Parameters
nsThe namespace
Returns
The prefix of the namespace.

Definition at line 343 of file xml.c.

344{
345 return (const char *) ((xmlNsPtr) ns)->prefix;
346}

◆ ast_xml_get_root()

struct ast_xml_node * ast_xml_get_root ( struct ast_xml_doc *  doc)

Get the document root node.

Parameters
docXML Document reference
Return values
NULLon error
Returns
The root node on success.

Definition at line 230 of file xml.c.

231{
232 xmlNode *root_node;
233
234 if (!doc) {
235 return NULL;
236 }
237
238 root_node = xmlDocGetRootElement((xmlDoc *) doc);
239
240 return (struct ast_xml_node *) root_node;
241}

References NULL.

Referenced by ast_xmldoc_build_documentation(), geoloc_eprofile_create_from_xslt_result(), handle_dump_docs(), is_pidf_lo(), xmldoc_get_node(), and xmldoc_load_documentation().

◆ ast_xml_get_text()

const char * ast_xml_get_text ( struct ast_xml_node *  node)

Get an element content string.

Parameters
nodeNode from where to get the string.
Return values
NULLon error.
Returns
The text content of node.

Definition at line 353 of file xml.c.

354{
355 if (!node) {
356 return NULL;
357 }
358
359 return (const char *) xmlNodeGetContent((xmlNode *) node);
360}

References NULL.

Referenced by _ast_xmldoc_build_seealso(), geoloc_eprofile_create_from_xslt_result(), load_modules(), var_list_from_confidence(), var_list_from_node(), xmldoc_get_formatted(), xmldoc_get_syntax_config_object(), xmldoc_parse_example(), xmldoc_parse_para(), and xmldoc_parse_variable().

◆ ast_xml_init()

int ast_xml_init ( void  )

Initialize the XML library implementation. This function is used to setup everything needed to start working with the xml implementation.

Return values
0On success.
1On error.

Definition at line 48 of file xml.c.

49{
50 LIBXML_TEST_VERSION
51#ifdef HAVE_LIBXSLT
52 xsltInit();
53#endif
54 return 0;
55}

Referenced by xmldoc_load_documentation().

◆ ast_xml_new()

struct ast_xml_doc * ast_xml_new ( void  )

Create a XML document.

Return values
NULLon error.
non-NULLThe allocated document structure.

Definition at line 136 of file xml.c.

137{
138 xmlDoc *doc;
139
140 doc = xmlNewDoc((const xmlChar *) "1.0");
141 return (struct ast_xml_doc *) doc;
142}

Referenced by ast_geoloc_eprofile_to_pidf(), ast_geoloc_eprofiles_to_pidf(), and handle_dump_docs().

◆ ast_xml_new_child()

struct ast_xml_node * ast_xml_new_child ( struct ast_xml_node *  parent,
const char *  child_name 
)

Add a child node inside a passed parent node.

Parameters
parentThe pointer of the parent node.
child_nameThe name of the child node to add.
Return values
NULLon error.
non-NULLThe created child node pointer.

Definition at line 156 of file xml.c.

157{
158 xmlNode *child;
159
160 if (!parent || !child_name) {
161 return NULL;
162 }
163
164 child = xmlNewChild((xmlNode *) parent, NULL, (const xmlChar *) child_name, NULL);
165 return (struct ast_xml_node *) child;
166}

References NULL.

Referenced by geoloc_civicaddr_list_to_xml(), geoloc_eprofile_to_intermediate(), geoloc_gml_list_to_xml(), and xmldoc_update_config_type().

◆ ast_xml_new_node()

struct ast_xml_node * ast_xml_new_node ( const char *  name)

Create a XML node.

Parameters
nameThe name of the node to be created.
Return values
NULLon error.
non-NULLThe allocated node structe.

Definition at line 144 of file xml.c.

145{
146 xmlNode *node;
147 if (!name) {
148 return NULL;
149 }
150
151 node = xmlNewNode(NULL, (const xmlChar *) name);
152
153 return (struct ast_xml_node *) node;
154}

References name, and NULL.

Referenced by ast_geoloc_eprofile_to_pidf(), ast_geoloc_eprofiles_to_pidf(), geoloc_civicaddr_list_to_xml(), geoloc_eprofile_to_intermediate(), geoloc_gml_list_to_xml(), and handle_dump_docs().

◆ ast_xml_node_get_children()

struct ast_xml_node * ast_xml_node_get_children ( struct ast_xml_node *  node)

◆ ast_xml_node_get_name()

const char * ast_xml_node_get_name ( struct ast_xml_node *  node)

◆ ast_xml_node_get_next()

struct ast_xml_node * ast_xml_node_get_next ( struct ast_xml_node *  node)

◆ ast_xml_node_get_parent()

struct ast_xml_node * ast_xml_node_get_parent ( struct ast_xml_node *  node)

Get the parent of a specified node.

Definition at line 410 of file xml.c.

411{
412 return (struct ast_xml_node *) ((xmlNode *) node)->parent;
413}

◆ ast_xml_node_get_prev()

struct ast_xml_node * ast_xml_node_get_prev ( struct ast_xml_node *  node)

Get the previous node in the same leve.

Definition at line 405 of file xml.c.

406{
407 return (struct ast_xml_node *) ((xmlNode *) node)->prev;
408}

◆ ast_xml_open()

struct ast_xml_doc * ast_xml_open ( char *  filename)

Open an XML document.

Parameters
filenameDocument path.
Return values
NULLon error.
Returns
The ast_xml_doc reference to the open document.

Definition at line 94 of file xml.c.

95{
96 xmlDoc *doc;
97
98 if (!filename) {
99 return NULL;
100 }
101
102 doc = xmlReadFile(filename, NULL, XML_PARSE_RECOVER | XML_PARSE_NOENT);
103 if (!doc) {
104 return NULL;
105 }
106
107 /* process xinclude elements. */
108 if (process_xincludes(doc) < 0) {
109 xmlFreeDoc(doc);
110 return NULL;
111 }
112
113#ifdef HAVE_LIBXSLT
114 {
115 xsltStylesheetPtr xslt = xsltLoadStylesheetPI(doc);
116 if (xslt) {
117 xmlDocPtr tmpdoc = xsltApplyStylesheet(xslt, doc, NULL);
118 xsltFreeStylesheet(xslt);
119 xmlFreeDoc(doc);
120 if (!tmpdoc) {
121 return NULL;
122 }
123 doc = tmpdoc;
124 }
125 }
126#else /* no HAVE_LIBXSLT */
127 ast_log(LOG_NOTICE, "XSLT support not found. XML documentation may be incomplete.\n");
128#endif /* HAVE_LIBXSLT */
129
130 /* Optimize for XPath */
131 xmlXPathOrderDocElems(doc);
132
133 return (struct ast_xml_doc *) doc;
134}
#define ast_log
Definition: astobj2.c:42
#define LOG_NOTICE
static int process_xincludes(xmlDoc *doc)
Definition: xml.c:83

References ast_log, LOG_NOTICE, NULL, and process_xincludes().

Referenced by xmldoc_load_documentation().

◆ ast_xml_query()

struct ast_xml_xpath_results * ast_xml_query ( struct ast_xml_doc *  doc,
const char *  xpath_str 
)

Execute an XPath query on an XML document.

Parameters
docXML document to query
xpath_strThe XPath query string to execute on the document
Returns
An object containing the results of the XPath query on success
Return values
NULLon failure
Since
12

Definition at line 441 of file xml.c.

442{
443 xmlXPathContextPtr context;
444 xmlXPathObjectPtr result;
445 if (!(context = xmlXPathNewContext((xmlDoc *) doc))) {
446 ast_log(LOG_ERROR, "Could not create XPath context!\n");
447 return NULL;
448 }
449 result = xmlXPathEvalExpression((xmlChar *) xpath_str, context);
450 xmlXPathFreeContext(context);
451 if (!result) {
452 ast_log(LOG_WARNING, "Error for query: %s\n", xpath_str);
453 return NULL;
454 }
455 if (xmlXPathNodeSetIsEmpty(result->nodesetval)) {
456 xmlXPathFreeObject(result);
457 ast_debug(5, "No results for query: %s\n", xpath_str);
458 return NULL;
459 }
460 return (struct ast_xml_xpath_results *) result;
461}
static PGresult * result
Definition: cel_pgsql.c:84
#define ast_debug(level,...)
Log a DEBUG message.
#define LOG_ERROR
#define LOG_WARNING

References ast_debug, ast_log, voicemailpwcheck::context, LOG_ERROR, LOG_WARNING, NULL, and result.

Referenced by ast_xmldoc_query().

◆ ast_xml_query_with_namespaces()

struct ast_xml_xpath_results * ast_xml_query_with_namespaces ( struct ast_xml_doc *  doc,
const char *  xpath_str,
struct ast_xml_namespace_def_vector namespaces 
)

Execute an XPath query on an XML document with namespaces.

Parameters
docXML document to query
xpath_strThe XPath query string to execute on the document
namespacesA vector of ast_xml_namespace structures (not pointers)
Returns
An object containing the results of the XPath query on success
Return values
NULLon failure

Definition at line 463 of file xml.c.

465{
466 xmlXPathContextPtr context;
467 xmlXPathObjectPtr result;
468 int i;
469
470 if (!(context = xmlXPathNewContext((xmlDoc *) doc))) {
471 ast_log(LOG_ERROR, "Could not create XPath context!\n");
472 return NULL;
473 }
474
475 for (i = 0; i < AST_VECTOR_SIZE(namespaces); i++) {
476 struct ast_xml_namespace_def ns = AST_VECTOR_GET(namespaces, i);
477 if (xmlXPathRegisterNs(context, (xmlChar *)ns.prefix,
478 (xmlChar *)ns.href) != 0) {
479 xmlXPathFreeContext(context);
480 ast_log(LOG_ERROR, "Could not register namespace %s:%s\n",
481 ns.prefix, ns.href);
482 return NULL;
483 }
484 }
485
486 result = xmlXPathEvalExpression((xmlChar *) xpath_str, context);
487 xmlXPathFreeContext(context);
488 if (!result) {
489 ast_log(LOG_WARNING, "Error for query: %s\n", xpath_str);
490 return NULL;
491 }
492 if (xmlXPathNodeSetIsEmpty(result->nodesetval)) {
493 xmlXPathFreeObject(result);
494 ast_debug(5, "No results for query: %s\n", xpath_str);
495 return NULL;
496 }
497 return (struct ast_xml_xpath_results *) result;
498}
Namespace definition.
Definition: xml.h:325
const char * prefix
Definition: xml.h:326
const char * href
Definition: xml.h:327
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition: vector.h:609
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:680

References ast_debug, ast_log, AST_VECTOR_GET, AST_VECTOR_SIZE, voicemailpwcheck::context, ast_xml_namespace_def::href, LOG_ERROR, LOG_WARNING, NULL, ast_xml_namespace_def::prefix, and result.

◆ ast_xml_read_memory()

struct ast_xml_doc * ast_xml_read_memory ( char *  buffer,
size_t  size 
)

Open an XML document that resides in memory.

Parameters
bufferThe address where the document is stored
sizeThe number of bytes in the document
Return values
NULLon error.
Returns
The ast_xml_doc reference to the open document.

Definition at line 192 of file xml.c.

193{
194 xmlDoc *doc;
195
196 if (!buffer) {
197 return NULL;
198 }
199
200 if (!(doc = xmlParseMemory(buffer, (int) size))) {
201 /* process xinclude elements. */
202 if (process_xincludes(doc) < 0) {
203 xmlFreeDoc(doc);
204 return NULL;
205 }
206 }
207
208 return (struct ast_xml_doc *) doc;
209}

References NULL, and process_xincludes().

Referenced by handle_incoming_request().

◆ ast_xml_set_attribute()

int ast_xml_set_attribute ( struct ast_xml_node *  node,
const char *  name,
const char *  value 
)

Set an attribute to a node.

Parameters
nodeIn which node we want to insert the attribute.
nameThe attribute name.
valueThe attribute value.
Return values
0on success.
-1on error.

Definition at line 284 of file xml.c.

285{
286 if (!name || !value) {
287 return -1;
288 }
289
290 if (!xmlSetProp((xmlNode *) node, (xmlChar *) name, (xmlChar *) value)) {
291 return -1;
292 }
293
294 return 0;
295}
int value
Definition: syslog.c:37

References name, and value.

Referenced by ast_geoloc_eprofile_to_pidf(), ast_geoloc_eprofiles_to_pidf(), geoloc_civicaddr_list_to_xml(), geoloc_eprofile_to_intermediate(), geoloc_gml_list_to_xml(), xmldoc_update_config_option(), and xmldoc_update_config_type().

◆ ast_xml_set_name()

void ast_xml_set_name ( struct ast_xml_node *  node,
const char *  name 
)

Set or reset an element's name.

Parameters
nodeNode whose name is to be set.
nameNew name.

Definition at line 371 of file xml.c.

372{
373 if (!node || !name) {
374 return;
375 }
376
377 xmlNodeSetName((xmlNode *) node, (const xmlChar *) name);
378}

References name.

◆ ast_xml_set_root()

void ast_xml_set_root ( struct ast_xml_doc *  doc,
struct ast_xml_node *  node 
)

Specify the root node of a XML document.

Parameters
docXML Document reference
nodeA pointer to the node we want to set as root node.

Definition at line 221 of file xml.c.

222{
223 if (!doc || !node) {
224 return;
225 }
226
227 xmlDocSetRootElement((xmlDoc *) doc, (xmlNode *) node);
228}

Referenced by ast_geoloc_eprofile_to_pidf(), ast_geoloc_eprofiles_to_pidf(), and handle_dump_docs().

◆ ast_xml_set_text()

void ast_xml_set_text ( struct ast_xml_node *  node,
const char *  content 
)

Set an element content string.

Parameters
nodeNode from where to set the content string.
contentThe text to insert in the node.

Definition at line 362 of file xml.c.

363{
364 if (!node || !content) {
365 return;
366 }
367
368 xmlNodeSetContent((xmlNode *) node, (const xmlChar *) content);
369}

Referenced by geoloc_civicaddr_list_to_xml(), geoloc_eprofile_to_intermediate(), geoloc_gml_list_to_xml(), and xmldoc_update_config_type().

◆ ast_xml_xpath_get_first_result()

struct ast_xml_node * ast_xml_xpath_get_first_result ( struct ast_xml_xpath_results *  results)

Return the first result node of an XPath query.

Parameters
resultsThe XPath results object to get the first result from
Returns
The first result in the XPath object on success
Return values
NULLon error
Since
12

Definition at line 415 of file xml.c.

416{
417 return (struct ast_xml_node *) ((xmlXPathObjectPtr) results)->nodesetval->nodeTab[0];
418}

Referenced by load_modules(), xmldoc_update_config_option(), and xmldoc_update_config_type().

◆ ast_xml_xpath_get_result()

struct ast_xml_node * ast_xml_xpath_get_result ( struct ast_xml_xpath_results *  results,
int  n 
)

Return a specific result node of an XPath query.

Parameters
resultsThe XPath results object to get the result from
nThe index of the result to get
Returns
The nth result in the XPath object on success
Return values
NULLon error

Definition at line 420 of file xml.c.

421{
422 return (struct ast_xml_node *) ((xmlXPathObjectPtr) results)->nodesetval->nodeTab[i];
423}

◆ ast_xml_xpath_num_results()

int ast_xml_xpath_num_results ( struct ast_xml_xpath_results *  results)

Return the number of results from an XPath query.

Parameters
resultsThe XPath results object to count
Returns
The number of results in the XPath object
Since
12

Definition at line 433 of file xml.c.

434{
435 if (!results) {
436 return 0;
437 }
438 return ((xmlXPathObjectPtr) results)->nodesetval->nodeNr;
439}

◆ ast_xml_xpath_results_free()

void ast_xml_xpath_results_free ( struct ast_xml_xpath_results *  results)

Free the XPath results.

Parameters
resultsThe XPath results object to dispose of
Since
12

Definition at line 425 of file xml.c.

426{
427 if (!results) {
428 return;
429 }
430 xmlXPathFreeObject((xmlXPathObjectPtr) results);
431}

Referenced by load_modules(), xmldoc_update_config_option(), and xmldoc_update_config_type().

◆ process_xincludes()

static int process_xincludes ( xmlDoc *  doc)
static

Definition at line 83 of file xml.c.

84{
85 int res;
86
87 do {
88 res = xmlXIncludeProcess(doc);
89 } while (res > 0);
90
91 return res;
92}

Referenced by ast_xml_open(), and ast_xml_read_memory().