The InspIRCd Project
Home | Developers | Wiki | Forums | Bug Tracker | SVN | Download
Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

inspsocket.h

Go to the documentation of this file.
00001 /*       +------------------------------------+
00002  *       | Inspire Internet Relay Chat Daemon |
00003  *       +------------------------------------+
00004  *
00005  *  InspIRCd: (C) 2002-2008 InspIRCd Development Team
00006  * See: http://www.inspircd.org/wiki/index.php/Credits
00007  *
00008  * This program is free but copyrighted software; see
00009  *          the file COPYING for details.
00010  *
00011  * ---------------------------------------------------
00012  */
00013 
00014 #ifndef __INSP_SOCKET_H__
00015 #define __INSP_SOCKET_H__
00016 
00017 #include "timer.h"
00018 
00022 enum BufferedSocketState
00023 {
00025         I_DISCONNECTED,
00027         I_CONNECTING,
00029         I_CONNECTED,
00031         I_ERROR
00032 };
00033 
00037 enum BufferedSocketError
00038 {
00040         I_ERR_TIMEOUT,
00042         I_ERR_SOCKET,
00044         I_ERR_CONNECT,
00046         I_ERR_BIND,
00048         I_ERR_RESOLVE,
00050         I_ERR_WRITE,
00052         I_ERR_NOMOREFDS
00053 };
00054 
00055 /* Required forward declarations */
00056 class BufferedSocket;
00057 class InspIRCd;
00058 
00061 class CoreExport SocketTimeout : public Timer
00062 {
00063  private:
00066         BufferedSocket* sock;
00067 
00070         InspIRCd* ServerInstance;
00071 
00074         int sfd;
00075 
00076  public:
00084         SocketTimeout(int fd, InspIRCd* Instance, BufferedSocket* thesock, long secs_from_now, time_t now) : Timer(secs_from_now, now), sock(thesock), ServerInstance(Instance), sfd(fd) { };
00085 
00088         virtual void Tick(time_t now);
00089 };
00090 
00100 class CoreExport BufferedSocket : public EventHandler
00101 {
00102  public:
00103 
00106         std::string cbindip;
00107 
00110         InspIRCd* ServerInstance;
00111 
00114         SocketTimeout* Timeout;
00115 
00118         std::deque<std::string> outbuffer;
00119 
00122         char host[MAXBUF];
00123 
00126         int port;
00127 
00133         BufferedSocketState state;
00134 
00140         char IP[MAXBUF];
00141 
00146         socklen_t length;
00147 
00151         bool FlushWriteBuffer();
00152 
00159         void SetQueues();
00160 
00165         bool ClosePending;
00166 
00172         bool BindAddr(const std::string &ip);
00173 
00178         BufferedSocket(InspIRCd* SI);
00179 
00188         BufferedSocket(InspIRCd* SI, int newfd, const char* ip);
00189 
00201         BufferedSocket(InspIRCd* SI, const std::string &ipaddr, int port, unsigned long maxtime, const std::string &connectbindip = "");
00202 
00208         virtual bool OnConnected();
00209 
00216         virtual void OnError(BufferedSocketError e);
00217 
00222         virtual int OnDisconnect();
00223 
00236         virtual bool OnDataReady();
00237 
00257         bool OnWriteReady();
00258 
00270         virtual void OnTimeout();
00271 
00278         virtual void OnClose();
00279 
00285         virtual const char* Read();
00286 
00292         std::string GetIP();
00293 
00299         virtual void Write(const std::string &data);
00300 
00306         void SetState(BufferedSocketState s);
00307 
00311         BufferedSocketState GetState();
00312 
00315         bool InternalMarkConnected();
00316 
00322         virtual void Close();
00323 
00329         virtual ~BufferedSocket();
00330 
00336         virtual bool DoConnect(unsigned long maxtime);
00337 
00340         void HandleEvent(EventType et, int errornum = 0);
00341 
00344         bool Readable();
00345 };
00346 
00347 #endif
00348