changeset 236:5fa15cd7ffe0

Irccd: transport code looks like connection
author David Demelier <markand@malikania.fr>
date Fri, 12 Aug 2016 15:16:39 +0200
parents 5566cf772073
children 93b21652404f
files lib/irccd/transport-client.cpp lib/irccd/transport-client.hpp lib/irccd/transport-server.hpp
diffstat 3 files changed, 74 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/lib/irccd/transport-client.cpp	Fri Aug 12 15:01:16 2016 +0200
+++ b/lib/irccd/transport-client.cpp	Fri Aug 12 15:16:39 2016 +0200
@@ -30,13 +30,23 @@
         onCommand(document);
 }
 
+unsigned TransportClient::recv(char *buffer, unsigned length)
+{
+    return m_socket.recv(buffer, length);
+}
+
+unsigned TransportClient::send(const char *buffer, unsigned length)
+{
+    return m_socket.send(buffer, length);
+}
+
 void TransportClient::syncInput()
 {
     try {
         std::string buffer;
 
         buffer.resize(512);
-        buffer.resize(m_socket.recv(&buffer[0], buffer.size()));
+        buffer.resize(recv(&buffer[0], buffer.size()));
 
         if (buffer.empty())
             onDie();
@@ -50,7 +60,7 @@
 void TransportClient::syncOutput()
 {
     try {
-        auto ns = m_socket.send(&m_output[0], m_output.size());
+        auto ns = send(&m_output[0], m_output.size());
 
         if (ns == 0)
             onDie();
@@ -133,35 +143,34 @@
     handshake();
 }
 
-void TransportClientTls::syncInput()
+unsigned TransportClientTls::recv(char *buffer, unsigned length)
 {
-    try {
-        std::string buffer;
-
-        buffer.resize(512);
-        buffer.resize(m_ssl.recv(&buffer[0], buffer.size()));
+    unsigned nread = 0;
 
-        if (buffer.empty())
-            onDie();
+    try {
+        nread = m_ssl.recv(buffer, length);
+    } catch (const net::WantReadError &) {
+        m_handshake = HandshakeRead;
+    } catch (const net::WantWriteError &) {
+        m_handshake = HandshakeWrite;
+    }
 
-        m_input += std::move(buffer);
-    } catch (const std::exception &) {
-        onDie();
-    }
+    return nread;
 }
 
-void TransportClientTls::syncOutput()
+unsigned TransportClientTls::send(const char *buffer, unsigned length)
 {
-    try {
-        auto ns = m_ssl.send(&m_output[0], m_output.size());
+    unsigned nsent = 0;
 
-        if (ns == 0)
-            onDie();
+    try {
+        nsent = m_ssl.send(buffer, length);
+    } catch (const net::WantReadError &) {
+        m_handshake = HandshakeRead;
+    } catch (const net::WantWriteError &) {
+        m_handshake = HandshakeWrite;
+    }
 
-        m_output.erase(0, ns);
-    } catch (const std::exception &ex) {
-        onDie();
-    }
+    return nsent;
 }
 
 void TransportClientTls::prepare(fd_set &in, fd_set &out, net::Handle &max)
--- a/lib/irccd/transport-client.hpp	Fri Aug 12 15:01:16 2016 +0200
+++ b/lib/irccd/transport-client.hpp	Fri Aug 12 15:16:39 2016 +0200
@@ -76,8 +76,23 @@
     void parse(const std::string &buffer);
 
 protected:
-    virtual void syncInput();
-    virtual void syncOutput();
+    /**
+     * Try to receive some data into the given buffer.
+     *
+     * \param buffer the destination buffer
+     * \param length the buffer length
+     * \return the number of bytes received
+     */
+    virtual unsigned recv(char *buffer, unsigned length);
+
+    /**
+     * Try to send some data into the given buffer.
+     *
+     * \param buffer the source buffer
+     * \param length the buffer length
+     * \return the number of bytes sent
+     */
+    virtual unsigned send(const char *buffer, unsigned length);
 
 public:
     inline TransportClient(net::TcpSocket socket)
@@ -87,6 +102,20 @@
     }
 
     /**
+     * Convenient wrapper around recv().
+     *
+     * Must be used in sync() function.
+     */
+    void syncInput();
+
+    /**
+     * Convenient wrapper around send().
+     *
+     * Must be used in sync() function.
+     */
+    void syncOutput();
+
+    /**
      * Virtual destructor defaulted.
      */
     virtual ~TransportClient() = default;
@@ -111,8 +140,15 @@
     void handshake();
 
 protected:
-    void syncInput() override;
-    void syncOutput() override;
+    /**
+     * \copydoc TransportClient::recv
+     */
+    unsigned recv(char *buffer, unsigned length) override;
+
+    /**
+     * \copydoc TransportClient::send
+     */
+    unsigned send(const char *buffer, unsigned length) override;
 
 public:
     IRCCD_EXPORT TransportClientTls(const std::string &pkey,
--- a/lib/irccd/transport-server.hpp	Fri Aug 12 15:01:16 2016 +0200
+++ b/lib/irccd/transport-server.hpp	Fri Aug 12 15:16:39 2016 +0200
@@ -133,6 +133,8 @@
     /**
      * Constructor.
      * \pre mode > 0
+     * \param pkey the private key file
+     * \param cert the certificate file
      * \param address the address (* for any)
      * \param port the port number
      * \param mode the domains to use (can be OR'ed)