00001 #ifndef ERIS_BASE_CONNECTION_H 00002 #define ERIS_BASE_CONNECTION_H 00003 00004 #include <sigc++/trackable.h> 00005 #include <sigc++/signal.h> 00006 00007 #include <iostream> 00008 00009 class tcp_socket_stream; 00010 00011 #include <Atlas/Objects/ObjectsFwd.h> 00012 #include <Atlas/Net/Stream.h> 00013 00014 namespace Atlas 00015 { 00016 class Bridge; 00017 class Codec; 00018 } 00019 00020 namespace Eris 00021 { 00022 00023 // Forward declarations 00024 class Timeout; 00025 00027 class BaseConnection : virtual public sigc::trackable 00028 { 00029 public: 00031 virtual ~BaseConnection(); 00032 00035 virtual int connect(const std::string &host, short port); 00036 00038 typedef enum { 00039 INVALID_STATUS = 0, 00040 NEGOTIATE, 00041 CONNECTING, 00042 CONNECTED, 00043 DISCONNECTED, 00044 DISCONNECTING, 00045 00046 // doesn't really belong here, but enums aren't subclassable 00047 QUERY_GET 00048 } Status; 00049 00051 Status getStatus() const 00052 { return _status; } 00053 00055 bool isConnected() const 00056 { return (_status == CONNECTED) || (_status == DISCONNECTING);} 00057 00061 int getFileDescriptor(); 00062 00064 sigc::signal<void> Connected; 00065 00067 sigc::signal<void> Disconnected; 00068 protected: 00070 00073 BaseConnection(const std::string &cnm, const std::string &id, Atlas::Bridge *br); 00074 00076 void recv(); 00077 00079 virtual void setStatus(Status sc); 00080 00082 virtual void onConnect(); 00083 00085 virtual void handleFailure(const std::string &msg) = 0; 00086 00087 virtual void handleTimeout(const std::string& msg) = 0; 00088 00089 void onConnectTimeout(); 00090 void onNegotiateTimeout(); 00091 00094 void hardDisconnect(bool emit); 00095 00097 void nonblockingConnect(); 00098 00100 void pollNegotiation(); 00101 00102 Atlas::Objects::ObjectsEncoder* _encode; 00103 Atlas::Net::StreamConnect* _sc; 00104 Atlas::Codec* m_codec; 00105 00106 Status _status; 00107 const std::string _id; 00108 00109 tcp_socket_stream* _stream; 00110 std::string _clientName; 00111 00114 Atlas::Bridge* _bridge; 00115 Timeout* _timeout; 00116 00117 std::string _host; 00118 short _port; 00119 }; 00120 00121 } 00122 00123 #endif 00124