]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/inspsocket.h
Tons of comments
[user/henk/code/inspircd.git] / include / inspsocket.h
index 7e8593391790cab6c724390e4c25c79c2b230a3d..d2a8ed522b2701717e435ecc48e3a674623e7804 100644 (file)
 #include <sstream>
 #include <string>
 #include <deque>
-#include "inspircd_config.h"
 #include "dns.h"
+#include "inspircd_config.h"
 #include "socket.h"
 
 /**
  * States which a socket may be in
  */
-enum InspSocketState { I_DISCONNECTED, I_RESOLVING, I_CONNECTING, I_CONNECTED, I_LISTENING, I_ERROR };
+enum InspSocketState { I_DISCONNECTED, I_CONNECTING, I_CONNECTED, I_LISTENING, I_ERROR };
 
 /**
  * Error types which a socket may exhibit
  */
-enum InspSocketError { I_ERR_TIMEOUT, I_ERR_SOCKET, I_ERR_CONNECT, I_ERR_BIND, I_ERR_RESOLVE, I_ERR_WRITE };
+enum InspSocketError { I_ERR_TIMEOUT, I_ERR_SOCKET, I_ERR_CONNECT, I_ERR_BIND, I_ERR_RESOLVE, I_ERR_WRITE, I_ERR_NOMOREFDS };
+
+class InspSocket;
 
 /**
  * InspSocket is an extendable socket class which modules
@@ -45,9 +47,9 @@ enum InspSocketError { I_ERR_TIMEOUT, I_ERR_SOCKET, I_ERR_CONNECT, I_ERR_BIND, I
  * and use the InspSocket constructors to establish connections
  * and bindings.
  */
-class InspSocket
+class InspSocket : public Extensible
 {
-private:
+ public:
 
        std::deque<std::string> outbuffer;
 
@@ -56,11 +58,6 @@ private:
         */
         int fd;
 
-       /**
-        * The resolver for this socket
-        */
-       DNS dns;
-
        /**
         * The hostname connected to
         */
@@ -156,9 +153,13 @@ private:
         */
        bool ClosePending;
 
-       bool BindAddr();
+       /** Set to true when we're waiting for a write event.
+        * If this is true and a write event comes in, we
+        * call the write instead of the read method.
+        */
+       bool WaitingForWriteEvent;
 
-public:
+       bool BindAddr();
 
        /**
         * The default constructor does nothing
@@ -174,20 +175,20 @@ public:
         * will be set with the given IP address
         * and placed in CONNECTED state.
         */
-       InspSocket(int newfd, char* ip);
+       InspSocket(int newfd, const char* ip);
 
        /**
         * This constructor is used to create a new
         * socket, either listening for connections, or an outbound connection to another host.
-        * Note that if you specify a hostname in the 'host' parameter, then there will be an extra
-        * step involved (a nonblocking DNS lookup) which will cause your connection to be established
-        * slower than if it was an IP. Therefore, use an IP address where it is available instead.
-        * @param host The hostname to connect to, or bind to
+        * Note that if you specify a hostname in the 'ipaddr' parameter, this class will not
+        * connect. You must resolve your hostnames before passing them to InspSocket. To do so,
+        * you should use the nonblocking class 'Resolver'.
+        * @param ipaddr The IP to connect to, or bind to
         * @param port The port number to connect to, or bind to
         * @param listening true to listen on the given host:port pair, or false to connect to them
         * @param maxtime Number of seconds to wait, if connecting, before the connection times out and an OnTimeout() event is generated
         */
-       InspSocket(const std::string &host, int port, bool listening, unsigned long maxtime);
+       InspSocket(const std::string &ipaddr, int port, bool listening, unsigned long maxtime);
 
        /**
         * This method is called when an outbound
@@ -224,6 +225,8 @@ public:
         */
        virtual bool OnDataReady();
 
+       virtual bool OnWriteReady();
+
        /**
         * When an outbound connection fails, and the
         * attempt times out, you will receive this event.
@@ -298,6 +301,13 @@ public:
         */
        void SetState(InspSocketState s);
 
+       /**
+        * Call this to receive the next write event
+        * that comes along for this fd to the OnWriteReady
+        * method.
+        */
+       void WantWrite();
+
        /**
         * Returns the current socket state.
         */
@@ -334,14 +344,6 @@ public:
         */
        virtual ~InspSocket();
 
-       /**
-        * This method attempts to resolve the hostname,
-        * if a hostname is given and not an IP,
-        * before a connection can occur. This method is
-        * asyncronous.
-        */
-       virtual bool DoResolve();
-
        /**
         * This method attempts to connect to a hostname.
         * This only occurs on a non-listening socket. This