00001
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef _SOCKETS_ISocketHandler_H
00033 #define _SOCKETS_ISocketHandler_H
00034 #include "sockets-config.h"
00035
00036 #include <list>
00037 #include <map>
00038
00039 #include "socket_include.h"
00040 #include "Socket.h"
00041 #include "StdLog.h"
00042
00043 #ifdef SOCKETS_NAMESPACE
00044 namespace SOCKETS_NAMESPACE {
00045 #endif
00046
00047 class SocketAddress;
00048 class IMutex;
00049
00050
00053 class ISocketHandler
00054 {
00055 friend class Socket;
00056
00057 public:
00060 #ifdef ENABLE_POOL
00061 class PoolSocket : public Socket
00062 {
00063 public:
00064 PoolSocket(ISocketHandler& h,Socket *src) : Socket(h) {
00065 CopyConnection( src );
00066 SetIsClient();
00067 }
00068
00069 void OnRead() {
00070 Handler().LogError(this, "OnRead", 0, "data on hibernating socket", LOG_LEVEL_FATAL);
00071 SetCloseAndDelete();
00072 }
00073 void OnOptions(int,int,int,SOCKET) {}
00074
00075 };
00076 #endif
00077
00078 public:
00079 virtual ~ISocketHandler() {}
00080
00082 virtual ISocketHandler *Create(StdLog * = NULL) = 0;
00083
00085 virtual ISocketHandler *Create(IMutex&, ISocketHandler&, StdLog * = NULL) = 0;
00086
00088 virtual bool ParentHandlerIsValid() = 0;
00089
00091 virtual ISocketHandler& ParentHandler() = 0;
00092
00094 virtual ISocketHandler& GetRandomHandler() = 0;
00095
00097 virtual ISocketHandler& GetEffectiveHandler() = 0;
00098
00100 virtual void SetNumberOfThreads(size_t n) = 0;
00101
00103 virtual bool IsThreaded() = 0;
00104
00106 virtual void EnableRelease() = 0;
00107
00109 virtual void Release() = 0;
00110
00112 virtual IMutex& GetMutex() const = 0;
00113
00116 virtual void RegStdLog(StdLog *log) = 0;
00117
00119 virtual void LogError(Socket *p,const std::string& user_text,int err,const std::string& sys_err,loglevel_t t = LOG_LEVEL_WARNING) = 0;
00120
00121
00122
00123
00125 virtual void Add(Socket *) = 0;
00126
00127 protected:
00129 virtual void Remove(Socket *) = 0;
00130
00132 virtual int ISocketHandler_Select(struct timeval *) = 0;
00133
00134 public:
00136 virtual void ISocketHandler_Add(Socket *,bool bRead,bool bWrite) = 0;
00137 virtual void ISocketHandler_Mod(Socket *,bool bRead,bool bWrite) = 0;
00138 virtual void ISocketHandler_Del(Socket *) = 0;
00139
00141 virtual int Select(long sec,long usec) = 0;
00143 virtual int Select() = 0;
00145 virtual int Select(struct timeval *tsel) = 0;
00146
00148 virtual bool Valid(Socket *) = 0;
00150 virtual bool Valid(socketuid_t) = 0;
00151
00153 virtual size_t GetCount() = 0;
00154
00156 virtual size_t MaxCount() = 0;
00157
00160 virtual bool OkToAccept(Socket *p) = 0;
00161
00163 virtual const std::map<SOCKET, Socket *>& AllSockets() = 0;
00164
00166 virtual size_t MaxTcpLineSize() = 0;
00167
00168 virtual void SetCallOnConnect(bool = true) = 0;
00169 virtual void SetDetach(bool = true) = 0;
00170 virtual void SetTimeout(bool = true) = 0;
00171 virtual void SetRetry(bool = true) = 0;
00172 virtual void SetClose(bool = true) = 0;
00173
00174
00175
00176
00177
00178 #ifdef ENABLE_POOL
00179
00180 virtual ISocketHandler::PoolSocket *FindConnection(int type,const std::string& protocol,SocketAddress&) = 0;
00182 virtual void EnablePool(bool = true) = 0;
00185 virtual bool PoolEnabled() = 0;
00186 #endif // ENABLE_POOL
00187
00188
00189
00190
00191 #ifdef ENABLE_SOCKS4
00192
00193 virtual void SetSocks4Host(ipaddr_t) = 0;
00195 virtual void SetSocks4Host(const std::string& ) = 0;
00197 virtual void SetSocks4Port(port_t) = 0;
00199 virtual void SetSocks4Userid(const std::string& ) = 0;
00201 virtual void SetSocks4TryDirect(bool = true) = 0;
00204 virtual ipaddr_t GetSocks4Host() = 0;
00207 virtual port_t GetSocks4Port() = 0;
00210 virtual const std::string& GetSocks4Userid() = 0;
00213 virtual bool Socks4TryDirect() = 0;
00214 #endif // ENABLE_SOCKS4
00215
00216
00217
00218
00219 #ifdef ENABLE_RESOLVER
00220
00222 virtual void EnableResolver(port_t = 16667) = 0;
00225 virtual bool ResolverEnabled() = 0;
00229 virtual int Resolve(Socket *,const std::string& host,port_t port) = 0;
00230 #ifdef ENABLE_IPV6
00231 virtual int Resolve6(Socket *,const std::string& host,port_t port) = 0;
00232 #endif
00233
00234 virtual int Resolve(Socket *,ipaddr_t a) = 0;
00235 #ifdef ENABLE_IPV6
00236 virtual int Resolve(Socket *,in6_addr& a) = 0;
00237 #endif
00238
00239 virtual port_t GetResolverPort() = 0;
00241 virtual bool ResolverReady() = 0;
00243 virtual bool Resolving(Socket *) = 0;
00244 #endif // ENABLE_RESOLVER
00245
00246 #ifdef ENABLE_DETACH
00247
00248 virtual void SetSlave(bool x = true) = 0;
00250 virtual bool IsSlave() = 0;
00251 #endif // ENABLE_DETACH
00252
00253 };
00254
00255
00256 #ifdef SOCKETS_NAMESPACE
00257 }
00258 #endif
00259
00260 #endif // _SOCKETS_ISocketHandler_H
00261