eris  1.4.0
A WorldForge client library.
Metaserver.h
1 // TODO: Copyright stuff
2 
3 #ifndef ERIS_METASERVER_H
4 #define ERIS_METASERVER_H
5 
6 #include "Types.h"
7 #include "ServerInfo.h"
8 
9 #include <Atlas/Objects/Decoder.h>
10 
11 #include <sigc++/trackable.h>
12 #include <sigc++/signal.h>
13 
14 #include <boost/asio.hpp>
15 #include <boost/asio/steady_timer.hpp>
16 
17 #include <memory>
18 
19 #include <cstdint>
20 #include <ios>
21 
22 // Forward decls
23 namespace Eris {
24 
25 // Forward Declerations
26 class MetaQuery;
27 
28 class BaseConnection;
29 
30 
31 class EventService;
32 
33 const int DATA_BUFFER_SIZE = 4096;
34 
36 typedef std::list<ServerInfo> ServerList;
37 struct MetaDecoder;
39 class Meta : virtual public sigc::trackable {
40  friend struct MetaDecoder;
41 public:
42  typedef enum {
43  INVALID = 0,
47  } MetaStatus;
48 
61  Meta(boost::asio::io_service& io_service,
62  EventService& eventService,
63  std::string msv,
64  unsigned int maxQueries);
65 
66  ~Meta();
67 
69  size_t getGameServerCount() const;
70 
74  const ServerInfo& getInfoForServer(size_t index) const;
75 
77  void queryServerByIndex(size_t index);
78 
85  void refresh();
86 
91  void cancel();
92 
93  void dispatch();
94 
95 // accessors
96  MetaStatus getStatus() const {
97  return m_status;
98  }
99 // signals
100 
102  sigc::signal<void, const ServerInfo&> ReceivedServerInfo;
103 
108  sigc::signal<void, int> CompletedServerList;
109 
111  sigc::signal<void> AllQueriesDone;
112 
117  sigc::signal<void, const std::string&> Failure;
118 
119 protected:
120  friend class MetaQuery;
121 
122  void objectArrived(Atlas::Objects::Root obj);
123 
124  void doFailure(const std::string& msg);
125 
126  void queryFailure(MetaQuery* q, const std::string& msg);
127 
128  void query();
129 
130  void queryTimeout(MetaQuery* q);
131 
132  void metaTimeout();
133 
136  void connect();
137 
139  void disconnect();
140 
141 private:
142 
143  std::unique_ptr<Atlas::Objects::Factories> m_factories;
144  void connect(const boost::asio::ip::udp::endpoint& endpoint);
145 
146  void write();
147 
148  void do_read();
149 
151  void recv();
152 
154  void recvCmd(uint32_t op);
155 
157  void processCmd();
158 
161  void listReq(unsigned int offset = 0);
162 
163  void setupRecvCmd();
164 
165  void setupRecvData(int words, uint32_t got);
166 
167  void deleteQuery(MetaQuery* query);
168 
169  void internalQuery(size_t index);
170 
171  void startTimeout();
172 
173  boost::asio::io_service& m_io_service;
174 
175  EventService& m_event_service;
176 
177  std::unique_ptr<MetaDecoder> m_decoder;
178 
179  const std::string m_clientName;
180 
181  MetaStatus m_status;
183  const std::string m_metaHost;
184 
185  typedef std::vector<std::unique_ptr<MetaQuery>> QuerySet;
186  QuerySet m_activeQueries;
187 
188  size_t m_maxActiveQueries;
189  size_t m_nextQuery;
190 
191  typedef std::vector<ServerInfo> ServerInfoArray;
192  ServerInfoArray m_gameServers,
193  m_lastValidList;
194 
195  boost::asio::ip::udp::resolver m_resolver;
196 
197  // storage for the Metaserver protocol
198  boost::asio::ip::udp::socket m_socket;
199 
200  boost::asio::steady_timer m_metaTimer;
201 
202  boost::asio::streambuf m_receive_buffer;
203  std::iostream m_receive_stream;
204 
205  std::unique_ptr<boost::asio::streambuf> m_send_buffer;
206  std::iostream m_send_stream;
207 
208  std::array<char, DATA_BUFFER_SIZE> m_data;
209  char* m_dataPtr;
210 
211  std::streamsize m_bytesToRecv;
212  unsigned int m_totalServers,
213  m_packed;
214 
215  bool m_recvCmd;
216  uint32_t m_gotCmd;
217 
218  void gotData();
219 };
220 
221 } // of namespace Eris
222 
223 #endif
Eris::Meta::Meta
Meta(boost::asio::io_service &io_service, EventService &eventService, std::string msv, unsigned int maxQueries)
Definition: Metaserver.cpp:71
Eris::ServerList
std::list< ServerInfo > ServerList
Storage of server information.
Definition: Metaserver.h:36
Eris::Meta
Meta encapsulates the meta-game system, including the meta-server protocol and queries.
Definition: Metaserver.h:39
Eris::EventService
Handles polling of the IO system as well as making sure that registered handlers are run on the main ...
Definition: EventService.h:42
Eris::Meta::getGameServerCount
size_t getGameServerCount() const
Definition: Metaserver.cpp:185
Eris::Meta::AllQueriesDone
sigc::signal< void > AllQueriesDone
Emitted when the entire server list has been refreshed.
Definition: Metaserver.h:111
Eris::Meta::INVALID
@ INVALID
The server list is not valid.
Definition: Metaserver.h:43
Eris::Meta::Failure
sigc::signal< void, const std::string & > Failure
Definition: Metaserver.h:117
Eris::Meta::VALID
@ VALID
The list is valid and completed.
Definition: Metaserver.h:44
Eris::Meta::getInfoForServer
const ServerInfo & getInfoForServer(size_t index) const
Definition: Metaserver.cpp:175
Eris::Meta::queryServerByIndex
void queryServerByIndex(size_t index)
Query a specific game server; emits a signal when complete.
Definition: Metaserver.cpp:123
Eris::MetaQuery
Definition: MetaQuery.h:20
Eris::Meta::MetaStatus
MetaStatus
Definition: Metaserver.h:42
Eris::Meta::cancel
void cancel()
Definition: Metaserver.cpp:159
Eris::Meta::QUERYING
@ QUERYING
Querying game servers for information.
Definition: Metaserver.h:46
Eris
Definition: Account.cpp:33
Eris::ServerInfo
Definition: ServerInfo.h:22
Eris::Meta::connect
void connect()
Definition: Metaserver.cpp:189
Eris::Meta::ReceivedServerInfo
sigc::signal< void, const ServerInfo & > ReceivedServerInfo
Emitted when information about a server is received.
Definition: Metaserver.h:102
Eris::Meta::CompletedServerList
sigc::signal< void, int > CompletedServerList
Definition: Metaserver.h:108
Eris::Meta::refresh
void refresh()
Definition: Metaserver.cpp:142
Eris::MetaDecoder
Definition: Metaserver.cpp:59
Eris::Meta::disconnect
void disconnect()
Definition: Metaserver.cpp:222
Eris::Meta::GETTING_LIST
@ GETTING_LIST
Retrieving the list of game servers from the metaserver.
Definition: Metaserver.h:45