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 00067 sigc::signal<void> Connected; 00068 00070 sigc::signal<void> Disconnected; 00071 protected: 00073 00076 BaseConnection(const std::string &cnm, const std::string &id, Atlas::Bridge *br); 00077 00079 void recv(); 00080 00082 virtual void setStatus(Status sc); 00083 00085 virtual void onConnect(); 00086 00088 virtual void handleFailure(const std::string &msg) = 0; 00089 00090 virtual void handleTimeout(const std::string& msg) = 0; 00091 00092 void onConnectTimeout(); 00093 void onNegotiateTimeout(); 00094 00097 void hardDisconnect(bool emit); 00098 00100 void nonblockingConnect(); 00101 00103 void pollNegotiation(); 00104 00105 Atlas::Objects::ObjectsEncoder* _encode; 00106 Atlas::Net::StreamConnect* _sc; 00107 Atlas::Codec* m_codec; 00108 00109 Status _status; 00110 const std::string _id; 00111 00112 tcp_socket_stream* _stream; 00113 std::string _clientName; 00114 00117 Atlas::Bridge* _bridge; 00118 Timeout* _timeout; 00119 00120 std::string _host; 00121 short _port; 00122 }; 00123 00124 } 00125 00126 #endif 00127