diff options
author | defanor <defanor@uberspace.net> | 2020-11-20 20:09:28 +0300 |
---|---|---|
committer | defanor <defanor@uberspace.net> | 2020-11-20 20:09:28 +0300 |
commit | 29002b52c9c031efaebfddef74ef8ceed6fd0157 (patch) | |
tree | ed22eaf06307eb6ffeb4a1606037392200f76242 | |
parent | 896304f7e00221fac40825d8072bc0bbc6fae1b0 (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.c | 12 | ||||
-rw-r--r-- | src/rexmpp.h | 17 | ||||
-rw-r--r-- | src/rexmpp_openpgp.c | 8 |
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); |