From aa53276859a5fc80071d24111a311297e058e603 Mon Sep 17 00:00:00 2001 From: Florent Le Coz Date: Fri, 27 Dec 2013 11:53:29 +0100 Subject: Keep a "connected" state in the SocketHandler class --- src/bridge/bridge.cpp | 1 - src/irc/irc_client.cpp | 2 ++ src/network/socket_handler.cpp | 13 ++++++++++++- src/network/socket_handler.hpp | 2 ++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/bridge/bridge.cpp b/src/bridge/bridge.cpp index 606cb02..3a755a3 100644 --- a/src/bridge/bridge.cpp +++ b/src/bridge/bridge.cpp @@ -50,7 +50,6 @@ IrcClient* Bridge::get_irc_client(const std::string& hostname, const std::string this->irc_clients.emplace(hostname, std::make_shared(hostname, username, this)); std::shared_ptr irc = this->irc_clients.at(hostname); this->poller->add_socket_handler(irc); - irc->start(); return irc.get(); } } diff --git a/src/irc/irc_client.cpp b/src/irc/irc_client.cpp index 881de96..4e37a63 100644 --- a/src/irc/irc_client.cpp +++ b/src/irc/irc_client.cpp @@ -128,6 +128,8 @@ void IrcClient::send_quit_command() void IrcClient::send_join_command(const std::string& chan_name) { + if (!this->connected) + this->start(); if (this->welcomed == false) this->channels_to_join.push_back(chan_name); else diff --git a/src/network/socket_handler.cpp b/src/network/socket_handler.cpp index c1ad8ae..484aa8f 100644 --- a/src/network/socket_handler.cpp +++ b/src/network/socket_handler.cpp @@ -14,7 +14,8 @@ #include SocketHandler::SocketHandler(): - poller(nullptr) + poller(nullptr), + connected(false) { if ((this->socket = ::socket(AF_INET, SOCK_STREAM, 0)) == -1) throw std::runtime_error("Could not create socket"); @@ -46,6 +47,7 @@ bool SocketHandler::connect(const std::string& address, const std::string& port) if (::connect(this->socket, rp->ai_addr, rp->ai_addrlen) == 0) { log_info("Connection success."); + this->connected = true; this->on_connected(); return true; } @@ -99,8 +101,12 @@ void SocketHandler::on_send() void SocketHandler::close() { + this->connected = false; this->poller->remove_socket_handler(this->get_socket()); ::close(this->socket); + // recreate the socket for a potential future usage + if ((this->socket = ::socket(AF_INET, SOCK_STREAM, 0)) == -1) + throw std::runtime_error("Could not create socket"); } socket_t SocketHandler::get_socket() const @@ -116,3 +122,8 @@ void SocketHandler::send_data(std::string&& data) this->poller->watch_send_events(this); } } + +bool SocketHandler::is_connected() const +{ + return this->connected; +} diff --git a/src/network/socket_handler.hpp b/src/network/socket_handler.hpp index 675d247..ec63ea7 100644 --- a/src/network/socket_handler.hpp +++ b/src/network/socket_handler.hpp @@ -61,6 +61,7 @@ public: * should be truncated, only the unused data should be left untouched. */ virtual void parse_in_buffer() = 0; + bool is_connected() const; protected: socket_t socket; @@ -84,6 +85,7 @@ protected: * (actually it is sharing our ownership with a Bridge). */ Poller* poller; + bool connected; private: SocketHandler(const SocketHandler&) = delete; -- cgit v1.2.3