~singpolyma/biboumi

ffc820e234ebba39a0f04607f9a0fb044fe31b73 — Florent Le Coz 10 years ago e196d2f
Reconnected immediately to the XMPP whenever it closes the connection
M src/main.cpp => src/main.cpp +11 -0
@@ 114,6 114,17 @@ int main(int ac, char** av)
      Logger::instance().reset();
      reload.store(false);
    }
    // Reconnect to the XMPP server if this was not intended.  This may have
    // happened because we sent something invalid to it and it decided to
    // close the connection.  This is a bug that should be fixed, but we
    // still reconnect automatically instead of dropping everything
    if (!exiting && !xmpp_component->is_connected() &&
        !xmpp_component->is_connecting())
      {
        xmpp_component->reset();
        p.add_socket_handler(xmpp_component);
        xmpp_component->start();
      }
    // If the only existing connection is the one to the XMPP component:
    // close the XMPP stream.
    if (exiting && xmpp_component->is_connecting())

M src/network/socket_handler.cpp => src/network/socket_handler.cpp +3 -0
@@ 222,6 222,9 @@ void SocketHandler::close()
{
  this->connected = false;
  this->connecting = false;
  this->in_buf.clear();
  this->out_buf.clear();
  this->port.clear();
  this->poller->remove_socket_handler(this->get_socket());
  ::close(this->socket);
  // recreate the socket for a potential future usage

M src/xmpp/xmpp_component.cpp => src/xmpp/xmpp_component.cpp +5 -0
@@ 167,6 167,11 @@ void XmppComponent::on_remote_stream_close(const XmlNode& node)
  this->doc_open = false;
}

void XmppComponent::reset()
{
  this->parser.reset();
}

void XmppComponent::on_stanza(const Stanza& stanza)
{
  log_debug("XMPP RECEIVING: " << stanza.to_string());

M src/xmpp/xmpp_component.hpp => src/xmpp/xmpp_component.hpp +4 -0
@@ 42,6 42,10 @@ public:
   */
  void start();
  /**
   * Reset the component so we can use the component on a new XMPP stream
   */
  void reset();
  /**
   * Serialize the stanza and add it to the out_buf to be sent to the
   * server.
   */

M src/xmpp/xmpp_parser.cpp => src/xmpp/xmpp_parser.cpp +15 -0
@@ 31,6 31,11 @@ XmppParser::XmppParser():
  level(0),
  current_node(nullptr)
{
  this->init_xml_parser();
}

void XmppParser::init_xml_parser()
{
  // Create the expat parser
  this->parser = XML_ParserCreateNS("UTF-8", ':');
  XML_SetUserData(this->parser, static_cast<void*>(this));


@@ 65,6 70,16 @@ int XmppParser::parse(const int len, const bool is_final)
  return res;
}

void XmppParser::reset()
{
  XML_ParserFree(this->parser);
  this->init_xml_parser();
  if (this->current_node)
    delete this->current_node;
  this->current_node = nullptr;
  this->level = 0;
}

void* XmppParser::get_buffer(const size_t size) const
{
  return XML_GetBuffer(this->parser, static_cast<int>(size));

M src/xmpp/xmpp_parser.hpp => src/xmpp/xmpp_parser.hpp +8 -0
@@ 35,6 35,10 @@ public:

public:
  /**
   * Init the XML parser and install the callbacks
   */
  void init_xml_parser();
  /**
   * Feed the parser with some XML data
   */
  int feed(const char* data, const int len, const bool is_final);


@@ 43,6 47,10 @@ public:
   */
  int parse(const int size, const bool is_final);
  /**
   * Reset the parser, so it can be used from scratch afterward
   */
  void reset();
  /**
   * Get a buffer provided by the xml parser.
   */
  void* get_buffer(const size_t size) const;