Eris 1.3.18
BaseConnection.h
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