Eris
1.3.21
|
00001 #ifndef ERIS_BASE_CONNECTION_H 00002 #define ERIS_BASE_CONNECTION_H 00003 00004 #include <Atlas/Objects/ObjectsFwd.h> 00005 00006 #include <sigc++/trackable.h> 00007 #include <sigc++/signal.h> 00008 00009 #include <string> 00010 00011 class tcp_socket_stream; 00012 00013 namespace Atlas 00014 { 00015 class Bridge; 00016 class Codec; 00017 namespace Net 00018 { 00019 class StreamConnect; 00020 } 00021 } 00022 00023 namespace Eris 00024 { 00025 00026 // Forward declarations 00027 class Timeout; 00028 00030 class BaseConnection : virtual public sigc::trackable 00031 { 00032 public: 00034 virtual ~BaseConnection(); 00035 00038 virtual int connect(const std::string &host, short port); 00039 00041 typedef enum { 00042 INVALID_STATUS = 0, 00043 NEGOTIATE, 00044 CONNECTING, 00045 CONNECTED, 00046 DISCONNECTED, 00047 DISCONNECTING, 00048 00049 // doesn't really belong here, but enums aren't subclassable 00050 QUERY_GET 00051 } Status; 00052 00054 Status getStatus() const 00055 { return _status; } 00056 00058 bool isConnected() const 00059 { return (_status == CONNECTED) || (_status == DISCONNECTING);} 00060 00064 int getFileDescriptor(); 00065 00071 const std::string& getHost() const; 00072 00078 short getPort() const; 00079 00081 sigc::signal<void> Connected; 00082 00084 sigc::signal<void> Disconnected; 00085 protected: 00087 00090 BaseConnection(const std::string &cnm, const std::string &id, Atlas::Bridge *br); 00091 00093 void recv(); 00094 00096 virtual void setStatus(Status sc); 00097 00099 virtual void onConnect(); 00100 00102 virtual void handleFailure(const std::string &msg) = 0; 00103 00104 virtual void handleTimeout(const std::string& msg) = 0; 00105 00106 void onConnectTimeout(); 00107 void onNegotiateTimeout(); 00108 00111 void hardDisconnect(bool emit); 00112 00114 void nonblockingConnect(); 00115 00117 void pollNegotiation(); 00118 00119 Atlas::Objects::ObjectsEncoder* _encode; 00120 Atlas::Net::StreamConnect* _sc; 00121 Atlas::Codec* m_codec; 00122 00123 Status _status; 00124 const std::string _id; 00125 00126 tcp_socket_stream* _stream; 00127 std::string _clientName; 00128 00131 Atlas::Bridge* _bridge; 00132 Timeout* _timeout; 00133 00134 std::string _host; 00135 short _port; 00136 }; 00137 00138 } 00139 00140 #endif 00141