00001 #ifndef ERIS_BASE_CONNECTION_H
00002 #define ERIS_BASE_CONNECTION_H
00003
00004 #include <sigc++/object.h>
00005 #include <sigc++/signal.h>
00006
00007 #include <iostream>
00008
00009
00010 namespace Atlas {
00011 class Bridge;
00012 template <class Stream> class Codec;
00013 namespace Objects { class Encoder; }
00014 namespace Net { class StreamConnect; }
00015 namespace Message { class Encoder; }
00016 }
00017
00018
00019 class tcp_socket_stream;
00020
00021 namespace Eris
00022 {
00023
00024
00025 class Timeout;
00026
00028 class BaseConnection :
00029 virtual public SigC::Object
00030 {
00031 public:
00033 virtual ~BaseConnection();
00034
00037 virtual void connect(const std::string &host, short port);
00038
00040 typedef enum {
00041 INVALID_STATUS = 0,
00042 NEGOTIATE,
00043 CONNECTING,
00044 CONNECTED,
00045 DISCONNECTED,
00046 DISCONNECTING,
00047
00048
00049 QUERY_GET
00050 } Status;
00051
00053 Status getStatus() const
00054 { return _status; }
00055
00057 bool isConnected() const
00058 { return (_status == CONNECTED) || (_status == DISCONNECTING);}
00059
00063 int getFileDescriptor();
00064
00066 SigC::Signal0<void> Connected;
00067
00069 SigC::Signal0<void> Disconnected;
00070 protected:
00072
00075 BaseConnection(const std::string &cnm, const std::string &id, Atlas::Bridge *br);
00076
00078 void recv();
00079
00081 virtual void setStatus(Status sc);
00082
00084 virtual void onConnect();
00085
00087 virtual void handleFailure(const std::string &msg) = 0;
00088
00090 virtual void bindTimeout(Timeout &t, Status sc) = 0;
00091
00094 void hardDisconnect(bool emit);
00095
00097 void nonblockingConnect();
00098
00100 void pollNegotiation();
00101
00102 Atlas::Objects::Encoder* _encode;
00103 Atlas::Message::Encoder* _msgEncode;
00104 Atlas::Net::StreamConnect* _sc;
00105 Atlas::Codec<std::iostream>* _codec;
00106
00107 Status _status;
00108 const std::string _id;
00109
00110 tcp_socket_stream* _stream;
00111 std::string _clientName;
00112
00115 Atlas::Bridge* _bridge;
00116 Timeout* _timeout;
00117
00118 std::string _host;
00119 short _port;
00120 };
00121
00122 }
00123
00124 #endif
00125