summaryrefslogtreecommitdiff
path: root/src/network/socket_handler.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/socket_handler.hpp')
-rw-r--r--src/network/socket_handler.hpp61
1 files changed, 47 insertions, 14 deletions
diff --git a/src/network/socket_handler.hpp b/src/network/socket_handler.hpp
index 165f732..4152a4e 100644
--- a/src/network/socket_handler.hpp
+++ b/src/network/socket_handler.hpp
@@ -1,6 +1,8 @@
#ifndef SOCKET_HANDLER_INCLUDED
# define SOCKET_HANDLER_INCLUDED
+#include <string>
+
typedef int socket_t;
class Poller;
@@ -14,34 +16,65 @@ class Poller;
class SocketHandler
{
public:
- explicit SocketHandler():
- poller(nullptr)
- {}
+ explicit SocketHandler();
+ virtual ~SocketHandler() {}
+ /**
+ * Connect to the remote server, and call on_connected() if this succeeds
+ */
+ void connect(const std::string& address, const std::string& port);
/**
* Set the pointer to the given Poller, to communicate with it.
*/
- void set_poller(Poller* poller)
- {
- this->poller = poller;
- };
+ void set_poller(Poller* poller);
+ /**
+ * Reads data in our in_buf and the call parse_in_buf, for the implementor
+ * to handle the data received so far.
+ */
+ void on_recv();
/**
- * Happens when the socket is ready to be received from.
+ * Write as much data from out_buf as possible, in the socket.
*/
- virtual void on_recv() = 0;
+ void on_send();
/**
- * Happens when the socket is ready to be written to.
+ * Add the given data to out_buf and tell our poller that we want to be
+ * notified when a send event is ready.
*/
- virtual void on_send() = 0;
+ void send_data(std::string&& data);
/**
* Returns the socket that should be handled by the poller.
*/
- virtual socket_t get_socket() const = 0;
+ socket_t get_socket() const;
+ /**
+ * Close the connection, remove us from the poller
+ */
+ void close();
+ /**
+ * Called when the connection is successful.
+ */
+ virtual void on_connected() = 0;
+ /**
+ * Called when we detect a disconnection from the remote host.
+ */
+ virtual void on_connection_close() = 0;
/**
- * Close the connection.
+ * Handle/consume (some of) the data received so far. If some data is used, the in_buf
+ * should be truncated, only the unused data should be left untouched.
*/
- virtual void close() = 0;
+ virtual void parse_in_buffer() = 0;
protected:
+ socket_t socket;
+ /**
+ * Where data read from the socket is added, until we can parse a whole
+ * IRC message, the used data is then removed from that buffer.
+ *
+ * TODO: something more efficient than a string.
+ */
+ std::string in_buf;
+ /**
+ * Where data is added, when we want to send something to the client.
+ */
+ std::string out_buf;
/**
* A pointer to the poller that manages us, because we need to communicate
* with it, sometimes (for example to tell it that he now needs to watch