Eris  1.3.23
Connection.h
1 #ifndef ERIS_CONNECTION_H
2 #define ERIS_CONNECTION_H
3 
4 #include <Eris/BaseConnection.h>
5 #include <Eris/ServerInfo.h>
6 
7 #include <Atlas/Objects/Decoder.h>
8 #include <Atlas/Objects/ObjectsFwd.h>
9 #include <Atlas/Objects/RootOperation.h>
10 
11 #include <deque>
12 #include <map>
13 #include <memory>
14 
18 // Forward declaration of the skstream type
19 class basic_socket_stream;
20 
21 namespace Eris
22 {
23 
24 // Forward declarations
25 class Timeout;
26 class PollData;
27 class TypeService;
28 class Router;
29 class Redispatch;
30 class ResponseTracker;
31 class TestInjector;
32 
34 
37 class Connection :
38  public BaseConnection,
39  public Atlas::Objects::ObjectsDecoder
40 {
41 public:
43 
47  Connection(const std::string &cnm, const std::string& host, short port, bool debug);
48 
53  Connection(const std::string &cnm, const std::string& socket, bool debug);
54 
55  virtual ~Connection();
56 
60  int connect();
61 
63  int disconnect();
64 
65  TypeService* getTypeService() const
66  { return m_typeService.get(); }
67 
68  ResponseTracker* getResponder() const
69  { return m_responder.get(); }
70 
72 
75  virtual void send(const Atlas::Objects::Root &obj);
76 
77  void setDefaultRouter(Router* router);
78 
79  void clearDefaultRouter();
80 
81  void registerRouterForTo(Router* router, const std::string toId);
82  void unregisterRouterForTo(Router* router, const std::string toId);
83 
84  void registerRouterForFrom(Router* router, const std::string fromId);
85  void unregisterRouterForFrom(Router* router, const std::string fromId);
86 
91  void lock();
92 
95  void unlock();
96 
103  void refreshServerInfo();
104 
110  void getServerInfo(ServerInfo&) const;
111 
112  sigc::signal<void> GotServerInfo;
113 
115 
119  sigc::signal<bool> Disconnecting;
120 
127  sigc::signal<void, const std::string&> Failure;
128 
130 
133  sigc::signal<void, Status> StatusChanged;
134 
135 protected:
138  virtual void setStatus(Status sc);
139 
141  virtual void handleFailure(const std::string &msg);
142 
143  virtual void handleTimeout(const std::string& msg);
144 
145  virtual void onConnect();
146 
147  void objectArrived(const Atlas::Objects::Root& obj);
148 
149  const std::string _host;
150  const short _port;
151  bool _debug;
152  const std::string _socket;
153 
154  friend class Redispatch;
155  friend class TestInjector;
156 
159  void postForDispatch(const Atlas::Objects::Root& obj);
160 
161  void cleanupRedispatch(Redispatch* r);
162 
163  void gotData(PollData&);
164 
165  void dispatchOp(const Atlas::Objects::Operation::RootOperation& op);
166  void handleServerInfo(const Atlas::Objects::Operation::RootOperation& op);
167 
168  void onDisconnectTimeout();
169 
170  typedef std::deque<Atlas::Objects::Operation::RootOperation> OpDeque;
171  OpDeque m_opDeque;
172 
173  std::unique_ptr<TypeService> m_typeService;
174  Router* m_defaultRouter; // need several of these?
175 
176  typedef std::map<std::string, Router*> IdRouterMap;
177  IdRouterMap m_toRouters;
178  IdRouterMap m_fromRouters;
179 
180  int m_lock;
181 
182  Atlas::Objects::ObjectsEncoder* m_debugRecvEncoder;
183 
184  std::vector<Redispatch*> m_finishedRedispatches;
185  ServerInfo m_info;
186 
187  std::unique_ptr<ResponseTracker> m_responder;
188 };
189 
191 long getNewSerialno();
192 
193 } // of Eris namespace
194 
195 #endif
196 
Eris::Connection::setStatus
virtual void setStatus(Status sc)
update the connection status (and emit the appropriate signal)
Definition: Connection.cpp:321
Eris::Connection::StatusChanged
sigc::signal< void, Status > StatusChanged
indicates a status change on the connection
Definition: Connection.h:133
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:12
Eris::Connection::Failure
sigc::signal< void, const std::string & > Failure
Emitted when a non-fatal error occurs.
Definition: Connection.h:127
Eris::BaseConnection::onConnect
virtual void onConnect()
derived-class notification when connection and negotiation is completed
Definition: BaseConnection.cpp:309
Eris::BaseConnection::_stream
stream_socket_stream * _stream
the underlying iostream channel
Definition: BaseConnection.h:133
Eris::Connection::postForDispatch
void postForDispatch(const Atlas::Objects::Root &obj)
Inject a local operation into the dispatch queue.
Definition: Connection.cpp:364
Eris::PollData
Definition: Poll.h:11
Eris::BaseConnection::_status
Status _status
current status of the connection
Definition: BaseConnection.h:130
Eris::Connection::_port
const short _port
port of the server
Definition: Connection.h:150
Eris::Connection::Connection
Connection(const std::string &cnm, const std::string &host, short port, bool debug)
Create an unconnected instance.
Definition: Connection.cpp:38
Eris::TypeService
A service class querying and caching types.
Definition: TypeService.h:24
Eris::BaseConnection::DISCONNECTED
@ DISCONNECTED
finished disconnection
Definition: BaseConnection.h:53
Eris::Router
abstract interface for objects that can route Atlas data.
Definition: Router.h:10
Eris::error
Definition: LogStream.h:55
Eris::ServerInfo::processServer
void processServer(const Atlas::Objects::Entity::RootEntity &svr)
called by Meta when info is received from the server, sets status to valid.
Definition: ServerInfo.cpp:40
Eris::BaseConnection::recv
void recv()
perform a blocking read from the underlying socket
Definition: BaseConnection.cpp:205
Eris::Connection::m_opDeque
OpDeque m_opDeque
store of all the recived ops waiting to be dispatched
Definition: Connection.h:171
Eris::Connection::connect
int connect()
If the underlying socket cannot be opened, connect will return an error number immediately.
Definition: Connection.cpp:74
Eris::BaseConnection::_encode
Atlas::Objects::ObjectsEncoder * _encode
the objects encoder, bound to _codec
Definition: BaseConnection.h:126
Eris::Connection::getServerInfo
void getServerInfo(ServerInfo &) const
Retrive the current server information.
Definition: Connection.cpp:239
Eris::Redispatch
Definition: Redispatch.h:15
Eris::InvalidOperation
Definition: Exceptions.h:28
Eris::Connection::unlock
void unlock()
Unlock the connection (permit status change).
Definition: Connection.cpp:217
Eris::BaseConnection::DISCONNECTING
@ DISCONNECTING
clean disconnection in progress
Definition: BaseConnection.h:54
Eris::Connection::Disconnecting
sigc::signal< bool > Disconnecting
Emitted when the disconnection process is initiated.
Definition: Connection.h:119
Eris::BaseConnection::CONNECTED
@ CONNECTED
connection fully established
Definition: BaseConnection.h:52
Eris::Connection::handleFailure
virtual void handleFailure(const std::string &msg)
Process failures (to track when reconnection should be permitted)
Definition: Connection.cpp:327
Eris::BaseConnection
Underlying Atlas connection, providing a send interface, and receive (dispatch) system.
Definition: BaseConnection.h:32
Eris::BaseConnection::_timeout
Timeout * _timeout
network level timeouts
Definition: BaseConnection.h:142
Eris::Connection::send
virtual void send(const Atlas::Objects::Root &obj)
Transmit an Atlas::Objects instance to the server.
Definition: Connection.cpp:147
Eris::Connection::disconnect
int disconnect()
Initiate disconnection from the server.
Definition: Connection.cpp:83
Eris::debug
Definition: LogStream.h:35
Eris::ServerInfo
Information about a specific game server, retrieved via the Meta-server and anonymous GETs.
Definition: ServerInfo.h:21
Eris::Connection::onConnect
virtual void onConnect()
derived-class notification when connection and negotiation is completed
Definition: Connection.cpp:351
Eris::warning
Definition: LogStream.h:45
Eris::Timeout::Expired
sigc::signal< void > Expired
The timeout signal.
Definition: Timeout.h:50
Eris::Connection
Underlying Atlas connection, providing a send interface, and receive (dispatch) system.
Definition: Connection.h:37
Eris::Connection::refreshServerInfo
void refreshServerInfo()
Update the information stored about the current server.
Definition: Connection.cpp:244
Eris::Connection::lock
void lock()
Lock then connection's state.
Definition: Connection.cpp:212
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::ResponseTracker
Definition: Response.h:59
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