summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorent Le Coz <louiz@louiz.org>2013-12-27 11:53:29 +0100
committerFlorent Le Coz <louiz@louiz.org>2014-01-04 01:59:35 +0100
commitaa53276859a5fc80071d24111a311297e058e603 (patch)
treefeac10c8765c161684a558416ef537abfe1707e4
parent483e17020dc4f19223001ab36da0dc48a15a0d3e (diff)
downloadbiboumi-aa53276859a5fc80071d24111a311297e058e603.tar.gz
biboumi-aa53276859a5fc80071d24111a311297e058e603.tar.bz2
biboumi-aa53276859a5fc80071d24111a311297e058e603.tar.xz
biboumi-aa53276859a5fc80071d24111a311297e058e603.zip
Keep a "connected" state in the SocketHandler class
-rw-r--r--src/bridge/bridge.cpp1
-rw-r--r--src/irc/irc_client.cpp2
-rw-r--r--src/network/socket_handler.cpp13
-rw-r--r--src/network/socket_handler.hpp2
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<IrcClient>(hostname, username, this));
std::shared_ptr<IrcClient> 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 <iostream>
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;