Eris  1.3.19
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     
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