summaryrefslogtreecommitdiff
path: root/src/xmpp/xmpp_stanza.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/xmpp/xmpp_stanza.cpp')
-rw-r--r--src/xmpp/xmpp_stanza.cpp49
1 files changed, 47 insertions, 2 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