3 #ifndef ERIS_METASERVER_H
4 #define ERIS_METASERVER_H
7 #include "ServerInfo.h"
9 #include <Atlas/Objects/Decoder.h>
11 #include <sigc++/trackable.h>
12 #include <sigc++/signal.h>
14 #include <boost/asio.hpp>
15 #include <boost/asio/steady_timer.hpp>
33 const int DATA_BUFFER_SIZE = 4096;
39 class Meta :
virtual public sigc::trackable {
61 Meta(boost::asio::io_service& io_service,
64 unsigned int maxQueries);
117 sigc::signal<void, const std::string&>
Failure;
122 void objectArrived(Atlas::Objects::Root obj);
124 void doFailure(
const std::string& msg);
126 void queryFailure(
MetaQuery* q,
const std::string& msg);
143 std::unique_ptr<Atlas::Objects::Factories> m_factories;
144 void connect(
const boost::asio::ip::udp::endpoint& endpoint);
154 void recvCmd(uint32_t op);
161 void listReq(
unsigned int offset = 0);
165 void setupRecvData(
int words, uint32_t got);
169 void internalQuery(
size_t index);
173 boost::asio::io_service& m_io_service;
177 std::unique_ptr<MetaDecoder> m_decoder;
179 const std::string m_clientName;
183 const std::string m_metaHost;
185 typedef std::vector<std::unique_ptr<MetaQuery>> QuerySet;
186 QuerySet m_activeQueries;
188 size_t m_maxActiveQueries;
191 typedef std::vector<ServerInfo> ServerInfoArray;
192 ServerInfoArray m_gameServers,
195 boost::asio::ip::udp::resolver m_resolver;
198 boost::asio::ip::udp::socket m_socket;
200 boost::asio::steady_timer m_metaTimer;
202 boost::asio::streambuf m_receive_buffer;
203 std::iostream m_receive_stream;
205 std::unique_ptr<boost::asio::streambuf> m_send_buffer;
206 std::iostream m_send_stream;
208 std::array<char, DATA_BUFFER_SIZE> m_data;
211 std::streamsize m_bytesToRecv;
212 unsigned int m_totalServers,