summaryrefslogtreecommitdiff
path: root/tracker/AdminServer/ServerList.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /tracker/AdminServer/ServerList.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'tracker/AdminServer/ServerList.h')
-rw-r--r--tracker/AdminServer/ServerList.h112
1 files changed, 112 insertions, 0 deletions
diff --git a/tracker/AdminServer/ServerList.h b/tracker/AdminServer/ServerList.h
new file mode 100644
index 0000000..accbd20
--- /dev/null
+++ b/tracker/AdminServer/ServerList.h
@@ -0,0 +1,112 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================
+
+#ifndef SERVERLIST_H
+#define SERVERLIST_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "server.h"
+#include "netadr.h"
+#include "serverinfo.h"
+#include "iresponse.h"
+
+
+#include "utlrbtree.h"
+
+class CSocket;
+class IServerRefreshResponse;
+
+// holds a single query - definition needs to be public
+struct query_t
+{
+ netadr_t addr;
+ int serverID;
+ float sendTime;
+};
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles a list of servers, and can refresh them
+//-----------------------------------------------------------------------------
+class CServerList: public IResponse
+{
+public:
+ CServerList(IServerRefreshResponse *gameList);
+ ~CServerList();
+
+ // Handles a frame of networking
+ void RunFrame();
+
+ // gets a server from the list by id, range [0, ServerCount)
+ serveritem_t &GetServer(unsigned int serverID);
+
+ // returns the number of servers
+ int ServerCount();
+
+ // adds a new server to the list, returning a handle to the server
+ unsigned int AddNewServer(serveritem_t &server);
+
+ // starts a refresh
+ void StartRefresh();
+
+ // stops all refreshing
+ void StopRefresh();
+
+ // clears all servers from the list
+ void Clear();
+
+ // marks a server to be refreshed
+ void AddServerToRefreshList(unsigned int serverID);
+
+ // returns true if servers are currently being refreshed
+ bool IsRefreshing();
+
+ // returns the number of servers not yet pinged
+ int RefreshListRemaining();
+
+ // implementation of IRconResponse interface
+ // called when the server has successfully responded to an info command
+ virtual void ServerResponded();
+
+ // called when a server response has timed out
+ virtual void ServerFailedToRespond();
+
+
+private:
+ // Run query logic for this frame
+ void QueryFrame();
+ // recalculates a servers ping, from the last few ping times
+ int CalculateAveragePing(serveritem_t &server);
+
+ IServerRefreshResponse *m_pResponseTarget;
+
+ enum
+ {
+ MAX_QUERY_SOCKETS = 255,
+ };
+
+
+ // holds the list of all the currently active queries
+ CUtlRBTree<query_t, unsigned short> m_Queries;
+
+ // list of all known servers
+ CUtlVector<CServerInfo *> m_Servers;
+
+ // list of servers to be refreshed, in order... this would be more optimal as a queue
+ CUtlVector<int> m_RefreshList;
+
+ int m_iUpdateSerialNumber; // serial number of current update so we don't get results overlapping between different server list updates
+ bool m_bQuerying; // Is refreshing taking place?
+ int m_nMaxActive; // Max # of simultaneous sockets to use for querying
+ int m_nMaxRampUp; // increasing number of sockets to use
+ int m_nRampUpSpeed; // amount to ramp up each frame
+ int m_nInvalidServers; // number of servers marked as 'no not refresh'
+ int m_nRefreshedServers; // count of servers refreshed
+};
+
+#endif // SERVERLIST_H