summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordefanor <defanor@uberspace.net>2020-11-20 20:09:28 +0300
committerdefanor <defanor@uberspace.net>2020-11-20 20:09:28 +0300
commit29002b52c9c031efaebfddef74ef8ceed6fd0157 (patch)
treeed22eaf06307eb6ffeb4a1606037392200f76242
parent896304f7e00221fac40825d8072bc0bbc6fae1b0 (diff)
Add rexmpp_xml_parse
This is intended mostly for language bindings, which may prefer to avoid libxml2, and to rely on serialized XML for bridging.
-rw-r--r--src/rexmpp.c12
-rw-r--r--src/rexmpp.h17
-rw-r--r--src/rexmpp_openpgp.c8
3 files changed, 30 insertions, 7 deletions
diff --git a/src/rexmpp.c b/src/rexmpp.c
index e9adeef..14d8159 100644
--- a/src/rexmpp.c
+++ b/src/rexmpp.c
@@ -696,7 +696,17 @@ xmlNodePtr rexmpp_xml_set_delay (rexmpp_t *s, xmlNodePtr node) {
return node;
}
-char *rexmpp_xml_serialize(xmlNodePtr node) {
+xmlNodePtr rexmpp_xml_parse (const char *str, int str_len) {
+ xmlNodePtr elem = NULL;
+ xmlDocPtr doc = xmlReadMemory(str, str_len, "", "utf-8", XML_PARSE_NONET);
+ if (doc != NULL) {
+ elem = xmlCopyNode(xmlDocGetRootElement(doc), 1);
+ xmlFreeDoc(doc);
+ }
+ return elem;
+}
+
+char *rexmpp_xml_serialize (xmlNodePtr node) {
xmlBufferPtr buf = xmlBufferCreate();
xmlSaveCtxtPtr ctx = xmlSaveToBuffer(buf, "utf-8", 0);
xmlSaveTree(ctx, node);
diff --git a/src/rexmpp.h b/src/rexmpp.h
index e1cfe0e..fa8e8bd 100644
--- a/src/rexmpp.h
+++ b/src/rexmpp.h
@@ -430,6 +430,14 @@ struct timeval *rexmpp_timeout (rexmpp_t *s,
int rexmpp_fds (rexmpp_t *s, fd_set *read_fds, fd_set *write_fds);
/**
+ @brief A helper function for XML parsing.
+ @param[in] str A string to parse.
+ @param[in] str_len String length.
+ @returns Parsed XML, or NULL on failure.
+*/
+xmlNodePtr rexmpp_xml_parse (const char *str, int str_len);
+
+/**
@brief A helper function for XML serialisation.
@param[in] node An XML node.
@returns A string (must be freed by the caller).
@@ -490,6 +498,15 @@ xmlNodePtr rexmpp_xml_find_child (xmlNodePtr node,
const char *namespace,
const char *name);
+/**
+ @brief Finds a PEP event.
+ @param[in] s ::rexmpp
+ @param[in] from JID.
+ @param[in] node PEP node.
+ @param[out] prev_event The event preceding the returned one.
+ @returns A pointer to the message announcing an event, or NULL on
+ failure.
+*/
xmlNodePtr rexmpp_find_event (rexmpp_t *s,
const char *from,
const char *node,
diff --git a/src/rexmpp_openpgp.c b/src/rexmpp_openpgp.c
index 6cd4a3a..908e66d 100644
--- a/src/rexmpp_openpgp.c
+++ b/src/rexmpp_openpgp.c
@@ -514,12 +514,8 @@ rexmpp_openpgp_decrypt_verify (rexmpp_t *s,
rexmpp_log(s, LOG_ERR, "Failed to release and get memory");
return NULL;
}
- xmlNodePtr elem = NULL;
- xmlDocPtr doc = xmlReadMemory(plain, plain_len, "", "utf-8", XML_PARSE_NONET);
- if (doc != NULL) {
- elem = xmlCopyNode(xmlDocGetRootElement(doc), 1);
- xmlFreeDoc(doc);
- } else {
+ xmlNodePtr elem = rexmpp_xml_parse(plain, plain_len);
+ if(elem == NULL) {
rexmpp_log(s, LOG_ERR, "Failed to parse an XML document");
}
free(plain);