~singpolyma/biboumi

2be4811d14f921f92e7f976b6e3c9ceb5404086b — Florent Le Coz 10 years ago 096a4e3
Unescape XML before sending messages over IRC
2 files changed, 48 insertions(+), 3 deletions(-)

M src/xmpp/xmpp_stanza.cpp
M src/xmpp/xmpp_stanza.hpp
M src/xmpp/xmpp_stanza.cpp => src/xmpp/xmpp_stanza.cpp +47 -2
@@ 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

M src/xmpp/xmpp_stanza.hpp => src/xmpp/xmpp_stanza.hpp +1 -1
@@ 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;
  /**