diff options
-rw-r--r-- | src/xmpp/xmpp_stanza.cpp | 49 | ||||
-rw-r--r-- | src/xmpp/xmpp_stanza.hpp | 2 |
2 files changed, 48 insertions, 3 deletions
diff --git a/src/xmpp/xmpp_stanza.cpp b/src/xmpp/xmpp_stanza.cpp index a1a04ba..169a8ef 100644 --- a/src/xmpp/xmpp_stanza.cpp +++ b/src/xmpp/xmpp_stanza.cpp @@ -4,6 +4,8 @@ #include <iostream> +#include <string.h> + std::string xml_escape(const std::string& data) { std::string res; @@ -35,6 +37,49 @@ std::string xml_escape(const std::string& data) return res; } +std::string xml_unescape(const std::string& data) +{ + std::string res; + res.reserve(data.size()); + const char* str = data.c_str(); + while (str && *str && (str - data.c_str()) < data.size()) + { + if (*str == '&') + { + if (strncmp(str+1, "amp;", 4) == 0) + { + res += "&"; + str += 4; + } + else if (strncmp(str+1, "lt;", 3) == 0) + { + res += "<"; + str += 3; + } + else if (strncmp(str+1, "gt;", 3) == 0) + { + res += ">"; + str += 3; + } + else if (strncmp(str+1, "quot;", 5) == 0) + { + res += "\""; + str += 5; + } + else if (strncmp(str+1, "apos;", 5) == 0) + { + res += "'"; + str += 5; + } + else + res += "&"; + } + else + res += *str; + str++; + } + return res; +} XmlNode::XmlNode(const std::string& name, XmlNode* parent): name(name), @@ -89,12 +134,12 @@ void XmlNode::add_to_inner(const std::string& data) std::string XmlNode::get_inner() const { - return this->inner; + return xml_unescape(this->inner); } std::string XmlNode::get_tail() const { - return this->tail; + return xml_unescape(this->tail); } XmlNode* XmlNode::get_child(const std::string& name) const diff --git a/src/xmpp/xmpp_stanza.hpp b/src/xmpp/xmpp_stanza.hpp index d2fe8c8..2ce8ce2 100644 --- a/src/xmpp/xmpp_stanza.hpp +++ b/src/xmpp/xmpp_stanza.hpp @@ -6,6 +6,7 @@ #include <vector> std::string xml_escape(const std::string& data); +std::string xml_unescape(const std::string& data); /** * Raised on operator[] when the attribute does not exist @@ -66,7 +67,6 @@ public: void add_to_inner(const std::string& data); /** * Get the content of inner - * TODO: unescape it here. */ std::string get_inner() const; /** |