Reconnected immediately to the XMPP whenever it closes the connection
This commit is contained in:
@@ -114,6 +114,17 @@ int main(int ac, char** av)
|
|||||||
Logger::instance().reset();
|
Logger::instance().reset();
|
||||||
reload.store(false);
|
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:
|
// If the only existing connection is the one to the XMPP component:
|
||||||
// close the XMPP stream.
|
// close the XMPP stream.
|
||||||
if (exiting && xmpp_component->is_connecting())
|
if (exiting && xmpp_component->is_connecting())
|
||||||
|
|||||||
@@ -222,6 +222,9 @@ void SocketHandler::close()
|
|||||||
{
|
{
|
||||||
this->connected = false;
|
this->connected = false;
|
||||||
this->connecting = false;
|
this->connecting = false;
|
||||||
|
this->in_buf.clear();
|
||||||
|
this->out_buf.clear();
|
||||||
|
this->port.clear();
|
||||||
this->poller->remove_socket_handler(this->get_socket());
|
this->poller->remove_socket_handler(this->get_socket());
|
||||||
::close(this->socket);
|
::close(this->socket);
|
||||||
// recreate the socket for a potential future usage
|
// recreate the socket for a potential future usage
|
||||||
|
|||||||
@@ -167,6 +167,11 @@ void XmppComponent::on_remote_stream_close(const XmlNode& node)
|
|||||||
this->doc_open = false;
|
this->doc_open = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void XmppComponent::reset()
|
||||||
|
{
|
||||||
|
this->parser.reset();
|
||||||
|
}
|
||||||
|
|
||||||
void XmppComponent::on_stanza(const Stanza& stanza)
|
void XmppComponent::on_stanza(const Stanza& stanza)
|
||||||
{
|
{
|
||||||
log_debug("XMPP RECEIVING: " << stanza.to_string());
|
log_debug("XMPP RECEIVING: " << stanza.to_string());
|
||||||
|
|||||||
@@ -41,6 +41,10 @@ public:
|
|||||||
* Connect to the XMPP server.
|
* Connect to the XMPP server.
|
||||||
*/
|
*/
|
||||||
void start();
|
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
|
* Serialize the stanza and add it to the out_buf to be sent to the
|
||||||
* server.
|
* server.
|
||||||
|
|||||||
@@ -30,6 +30,11 @@ static void character_data_handler(void *user_data, const XML_Char *s, int len)
|
|||||||
XmppParser::XmppParser():
|
XmppParser::XmppParser():
|
||||||
level(0),
|
level(0),
|
||||||
current_node(nullptr)
|
current_node(nullptr)
|
||||||
|
{
|
||||||
|
this->init_xml_parser();
|
||||||
|
}
|
||||||
|
|
||||||
|
void XmppParser::init_xml_parser()
|
||||||
{
|
{
|
||||||
// Create the expat parser
|
// Create the expat parser
|
||||||
this->parser = XML_ParserCreateNS("UTF-8", ':');
|
this->parser = XML_ParserCreateNS("UTF-8", ':');
|
||||||
@@ -65,6 +70,16 @@ int XmppParser::parse(const int len, const bool is_final)
|
|||||||
return res;
|
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
|
void* XmppParser::get_buffer(const size_t size) const
|
||||||
{
|
{
|
||||||
return XML_GetBuffer(this->parser, static_cast<int>(size));
|
return XML_GetBuffer(this->parser, static_cast<int>(size));
|
||||||
|
|||||||
@@ -34,6 +34,10 @@ public:
|
|||||||
~XmppParser();
|
~XmppParser();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* Init the XML parser and install the callbacks
|
||||||
|
*/
|
||||||
|
void init_xml_parser();
|
||||||
/**
|
/**
|
||||||
* Feed the parser with some XML data
|
* Feed the parser with some XML data
|
||||||
*/
|
*/
|
||||||
@@ -42,6 +46,10 @@ public:
|
|||||||
* Parse the data placed in the parser buffer
|
* Parse the data placed in the parser buffer
|
||||||
*/
|
*/
|
||||||
int parse(const int size, const bool is_final);
|
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.
|
* Get a buffer provided by the xml parser.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user