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
23namespace Eris {
24
25// Forward Declerations
26class MetaQuery;
27
28class BaseConnection;
29
30
31class EventService;
32
33const int DATA_BUFFER_SIZE = 4096;
34
36typedef std::list<ServerInfo> ServerList;
37struct MetaDecoder;
39class Meta : virtual public sigc::trackable {
40 friend struct MetaDecoder;
41public:
42 typedef enum {
43 INVALID = 0,
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
119protected:
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
141private:
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
Handles polling of the IO system as well as making sure that registered handlers are run on the main ...
Definition: EventService.h:43
Meta encapsulates the meta-game system, including the meta-server protocol and queries.
Definition: Metaserver.h:39
sigc::signal< void, const ServerInfo & > ReceivedServerInfo
Emitted when information about a server is received.
Definition: Metaserver.h:102
size_t getGameServerCount() const
Definition: Metaserver.cpp:185
@ GETTING_LIST
Retrieving the list of game servers from the metaserver.
Definition: Metaserver.h:45
@ QUERYING
Querying game servers for information.
Definition: Metaserver.h:46
@ VALID
The list is valid and completed.
Definition: Metaserver.h:44
@ INVALID
The server list is not valid.
Definition: Metaserver.h:43
const ServerInfo & getInfoForServer(size_t index) const
Definition: Metaserver.cpp:175
void refresh()
Definition: Metaserver.cpp:142
void queryServerByIndex(size_t index)
Query a specific game server; emits a signal when complete.
Definition: Metaserver.cpp:123
sigc::signal< void, const std::string & > Failure
Definition: Metaserver.h:117
sigc::signal< void > AllQueriesDone
Emitted when the entire server list has been refreshed.
Definition: Metaserver.h:111
void connect()
Definition: Metaserver.cpp:189
Meta(boost::asio::io_service &io_service, EventService &eventService, std::string msv, unsigned int maxQueries)
Definition: Metaserver.cpp:71
sigc::signal< void, int > CompletedServerList
Definition: Metaserver.h:108
void disconnect()
Definition: Metaserver.cpp:222
void cancel()
Definition: Metaserver.cpp:159
Definition: Account.cpp:33
std::list< ServerInfo > ServerList
Storage of server information.
Definition: Metaserver.h:36