00001
00002
00003
#ifndef ERIS_METASERVER_H
00004
#define ERIS_METASERVER_H
00005
00006
#include <Eris/Types.h>
00007
#include <Eris/ServerInfo.h>
00008
00009
#include <Atlas/Message/DecoderBase.h>
00010
00011
#include <sigc++/object.h>
00012
#include <sigc++/signal.h>
00013
00014
#ifndef __WIN32__
00015
00016
#include <stdint.h>
00017
#else
00018
00019
#ifndef _STDINT_H_
00020
#define _STDINT_H_
00021
00022
typedef unsigned char uint8_t;
00023
typedef unsigned short uint16_t;
00024
typedef unsigned int uint32_t;
00025
00026
#endif // _STDINT_H_
00027
00028
#endif // __WIN32__
00029
00030
00031
class udp_socket_stream;
00032
class basic_socket_stream;
00033
00034
namespace Eris {
00035
00036
00037
class MetaQuery;
00038
class BaseConnection;
00039
class Timeout;
00040
class PollData;
00041
00042
#ifndef uint32_t
00043
00044
00045
00046
#ifdef WINDOWS
00047
typedef unsigned int uint32_t;
00048
#endif
00049
00050
#ifdef MACOS
00051
#include <Types.h>
00052
00053
typedef Uint32 uint32_t;
00054
#endif
00055
#endif
00056
00057
const int DATA_BUFFER_SIZE = 4096;
00058
00060
typedef std::list<ServerInfo> ServerList;
00061
00062
typedef enum {
00063 INVALID = 0,
00064 VALID,
00065 IN_PROGRESS
00066 } MetaStatus;
00067
00069 class Meta :
virtual public SigC::Object,
00070
public Atlas::Message::DecoderBase
00071 {
00072
public:
00073
Meta(
const std::string &cnm,
00074
const std::string &msv,
00075
unsigned int maxQueries);
00076
virtual ~
Meta();
00077
00079 ServerList
getGameServerList();
00080
00082
int getGameServerCount()
const;
00083
00085
const ServerInfo&
getInfoForServer(
unsigned int index)
const;
00086
00088
void queryServer(
const std::string &host);
00089
00096
void refresh();
00097
00101
void cancel();
00102
00104 const std::string&
getClientName()
const
00105
{
return _clientName; }
00106
00108 MetaStatus
getStatus()
const
00109
{
return _status; }
00110
00112 unsigned int numServers()
const
00113
{
return getGameServerCount(); }
00114
00115
00116
00118 SigC::Signal1<void, const ServerInfo&>
ReceivedServerInfo;
00119
00121 SigC::Signal1<void, int>
GotServerCount;
00122
00124 SigC::Signal0<void>
CompletedServerList;
00125
00128 SigC::Signal1<void, const std::string&>
Failure;
00129
00130
protected:
00131
friend class MetaQuery;
00132
00133
virtual void objectArrived(
const Atlas::Message::Element &msg);
00134
00136
void recv();
00137
00139
void recvCmd(uint32_t op);
00140
00142
void processCmd();
00143
00146
void listReq(
int offset = 0);
00147
00148
void setupRecvCmd();
00149
void setupRecvData(
int words, uint32_t got);
00150
00151
void doFailure(
const std::string &msg);
00152
void queryFailure(
MetaQuery *q,
const std::string& msg);
00153
00154
void queryTimeout(
MetaQuery *q);
00155
void metaTimeout();
00156
00159
void connect();
00160
00162
void disconnect();
00163
00164 std::string
_clientName;
00165 MetaStatus _status;
00166 std::string _metaHost;
00167
00168
typedef std::list<MetaQuery*> MetaQueryList;
00169
00170 MetaQueryList _activeQueries,
00171 _deleteQueries;
00172 StringList _pendingQueries;
00173
unsigned int _maxActiveQueries;
00174
00175
00176
typedef std::map<std::string, ServerInfo> ServerInfoMap;
00177 ServerInfoMap _gameServers,
00178 _lastValidList;
00179
00180
00181 udp_socket_stream* _stream;
00182
char _data[DATA_BUFFER_SIZE];
00183 char*
_dataPtr;
00184
00185
unsigned int _bytesToRecv,
00186 _totalServers,
00187
_packed;
00188
00189 bool _recvCmd;
00190 uint32_t
_gotCmd;
00191
00192 Timeout*
_timeout;
00193
00194
void gotData(PollData&);
00195 };
00196
00197 }
00198
00199
#endif