~singpolyma/biboumi

aa53276859a5fc80071d24111a311297e058e603 — Florent Le Coz 10 years ago 483e170
Keep a "connected" state in the SocketHandler class
M src/bridge/bridge.cpp => src/bridge/bridge.cpp +0 -1
@@ 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();
    }
}

M src/irc/irc_client.cpp => src/irc/irc_client.cpp +2 -0
@@ 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

M src/network/socket_handler.cpp => src/network/socket_handler.cpp +12 -1
@@ 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;
}

M src/network/socket_handler.hpp => src/network/socket_handler.hpp +2 -0
@@ 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;