Eris  1.3.23
BaseConnection.h
1 #ifndef ERIS_BASE_CONNECTION_H
2 #define ERIS_BASE_CONNECTION_H
3 
4 #include <Atlas/Objects/ObjectsFwd.h>
5 
6 #include <sigc++/trackable.h>
7 #include <sigc++/signal.h>
8 
9 #include <string>
10 #include <memory>
11 #include <functional>
12 
13 class stream_socket_stream;
14 
15 namespace Atlas
16 {
17  class Bridge;
18  class Codec;
19  namespace Net
20  {
21  class StreamConnect;
22  }
23 }
24 
25 namespace Eris
26 {
27 
28 // Forward declarations
29 class Timeout;
30 
32 class BaseConnection : virtual public sigc::trackable
33 {
34 public:
36  virtual ~BaseConnection();
37 
40  virtual int connect(const std::string &host, short port);
41 
45  virtual int connectLocal(const std::string &socket);
46 
48  typedef enum {
55 
56  // doesn't really belong here, but enums aren't subclassable
57  QUERY_GET
58  } Status;
59 
61  Status getStatus() const
62  { return _status; }
63 
65  bool isConnected() const
66  { return (_status == CONNECTED) || (_status == DISCONNECTING);}
67 
71  int getFileDescriptor();
72 
78  const std::string& getHost() const;
79 
85  short getPort() const;
86 
88  sigc::signal<void> Connected;
89 
91  sigc::signal<void> Disconnected;
92 protected:
94 
97  BaseConnection(const std::string &cnm, const std::string &id, Atlas::Bridge *br);
98 
100  void recv();
101 
103  virtual void setStatus(Status sc);
104 
106  virtual void onConnect();
107 
109  virtual void handleFailure(const std::string &msg) = 0;
110 
111  virtual void handleTimeout(const std::string& msg) = 0;
112 
113  void onConnectTimeout();
114  void onNegotiateTimeout();
115 
118  void hardDisconnect(bool emit);
119 
121  void nonblockingConnect();
122 
124  void pollNegotiation();
125 
126  Atlas::Objects::ObjectsEncoder* _encode;
127  Atlas::Net::StreamConnect* _sc;
128  Atlas::Codec* m_codec;
129 
131  const std::string _id;
132 
133  stream_socket_stream* _stream;
134  std::function<int(void)> _open_next_func;
135  std::function<bool(void)> _is_ready_func;
136 
137  std::string _clientName;
138 
141  Atlas::Bridge* _bridge;
143 
144  std::string _host;
145  short _port;
146 };
147 
148 }
149 
150 #endif
151 
Eris::BaseConnection::hardDisconnect
void hardDisconnect(bool emit)
performs and instant disconnection from the server @emit specified whether the change of state should...
Definition: BaseConnection.cpp:159
Eris::Timeout
Timeout
Definition: Timeout.h:13
Eris::BaseConnection::BaseConnection
BaseConnection(const std::string &cnm, const std::string &id, Atlas::Bridge *br)
create an unconnected instance
Definition: BaseConnection.cpp:45
Eris::BaseConnection::~BaseConnection
virtual ~BaseConnection()
destructor, will perform a hard disconnect if necessary
Definition: BaseConnection.cpp:74
Eris::BaseConnection::onConnect
virtual void onConnect()
derived-class notification when connection and negotiation is completed
Definition: BaseConnection.cpp:309
Eris::BaseConnection::Disconnected
sigc::signal< void > Disconnected
final disconnect (or hard disocnnect) notifcation
Definition: BaseConnection.h:91
Eris::BaseConnection::_stream
stream_socket_stream * _stream
the underlying iostream channel
Definition: BaseConnection.h:133
Eris::BaseConnection::pollNegotiation
void pollNegotiation()
track negotation of the Atlas codecs / stream
Definition: BaseConnection.cpp:274
Eris::BaseConnection::_status
Status _status
current status of the connection
Definition: BaseConnection.h:130
Eris::BaseConnection::_bridge
Atlas::Bridge * _bridge
the connection bridge (i.e something implementing objectArrived()) : this can be the derived class it...
Definition: BaseConnection.h:141
Eris::BaseConnection::Connected
sigc::signal< void > Connected
sent on successful negotiation of a game server connection
Definition: BaseConnection.h:88
Eris::BaseConnection::setStatus
virtual void setStatus(Status sc)
update the connection status and generate signals
Definition: BaseConnection.cpp:329
Eris::BaseConnection::_id
const std::string _id
a unique identifier for this connection
Definition: BaseConnection.h:131
Eris::BaseConnection::INVALID_STATUS
@ INVALID_STATUS
indicates an illegal state
Definition: BaseConnection.h:49
Eris::BaseConnection::DISCONNECTED
@ DISCONNECTED
finished disconnection
Definition: BaseConnection.h:53
Eris::BaseConnection::_host
std::string _host
the host name we're connected to
Definition: BaseConnection.h:144
Eris::BaseConnection::CONNECTING
@ CONNECTING
stream / socket connection in progress
Definition: BaseConnection.h:51
Eris::BaseConnection::recv
void recv()
perform a blocking read from the underlying socket
Definition: BaseConnection.cpp:205
Eris::BaseConnection::NEGOTIATE
@ NEGOTIATE
Atlas negotiation in progress.
Definition: BaseConnection.h:50
Eris::BaseConnection::isConnected
bool isConnected() const
Ascertain whether or not the connection is usable for transport.
Definition: BaseConnection.h:65
Eris::BaseConnection::_encode
Atlas::Objects::ObjectsEncoder * _encode
the objects encoder, bound to _codec
Definition: BaseConnection.h:126
Eris::BaseConnection::nonblockingConnect
void nonblockingConnect()
complete the connection state and start negotiation
Definition: BaseConnection.cpp:242
Eris::BaseConnection::handleFailure
virtual void handleFailure(const std::string &msg)=0
derived-class notification when a failure occurs
Eris::InvalidOperation
Definition: Exceptions.h:29
Eris::BaseConnection::DISCONNECTING
@ DISCONNECTING
clean disconnection in progress
Definition: BaseConnection.h:54
Eris::BaseConnection::_open_next_func
std::function< int(void)> _open_next_func
a method for calling "open_next" on the stream, if such functionality is available
Definition: BaseConnection.h:134
Eris::BaseConnection::CONNECTED
@ CONNECTED
connection fully established
Definition: BaseConnection.h:52
Eris::BaseConnection
Underlying Atlas connection, providing a send interface, and receive (dispatch) system.
Definition: BaseConnection.h:33
Eris::BaseConnection::_timeout
Timeout * _timeout
network level timeouts
Definition: BaseConnection.h:142
Eris::BaseConnection::getStatus
Status getStatus() const
get the current status of the connection
Definition: BaseConnection.h:61
Eris::BaseConnection::getHost
const std::string & getHost() const
Gets the host of the connection.
Definition: BaseConnection.cpp:341
Eris::debug
Definition: LogStream.h:36
Eris::BaseConnection::_port
short _port
the port we're connected to
Definition: BaseConnection.h:145
Eris::warning
Definition: LogStream.h:46
Eris::Timeout::Expired
sigc::signal< void > Expired
The timeout signal.
Definition: Timeout.h:50
Eris::BaseConnection::_is_ready_func
std::function< bool(void)> _is_ready_func
a method for calling "is_ready" on the stream, if such functionality is available
Definition: BaseConnection.h:135
Eris::BaseConnection::getPort
short getPort() const
Gets the port of the connection.
Definition: BaseConnection.cpp:346
Eris::BaseConnection::_clientName
std::string _clientName
the client identified used during connection
Definition: BaseConnection.h:137
Eris::BaseConnection::connectLocal
virtual int connectLocal(const std::string &socket)
Try to connect to a local socket.
Definition: BaseConnection.cpp:118
Eris::BaseConnection::Status
Status
possible states for the connection
Definition: BaseConnection.h:48
Eris::BaseConnection::_sc
Atlas::Net::StreamConnect * _sc
negotiation object (NULL after connection!)
Definition: BaseConnection.h:127
Eris::BaseConnection::QUERY_GET
@ QUERY_GET
meta-query performing GET operation
Definition: BaseConnection.h:57
Eris::BaseConnection::getFileDescriptor
int getFileDescriptor()
get the underlyinmg file descriptor (socket).
Definition: BaseConnection.cpp:334
Eris::BaseConnection::connect
virtual int connect(const std::string &host, short port)
open a connection to the specified host/port; invokes the failure handler if the connection could not...
Definition: BaseConnection.cpp:82