Counter Strike : Global Offensive Source Code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

193 lines
3.8 KiB

//===== Copyright © 1996-2009, Valve Corporation, All rights reserved. ======//
//
// Purpose:
//
//===========================================================================//
#ifndef X360_XLSP_CMD_H
#define X360_XLSP_CMD_H
#ifdef _X360
#ifdef _WIN32
#pragma once
#endif
struct CXlspDatacenter;
class CXlspTitleServers;
class CXlspConnection;
class CJob;
//
// Datacenter info
//
struct CXlspDatacenter
{
XTITLE_SERVER_INFO m_xsi;
XNQOSINFO m_qos;
char m_szGatewayName[ XTITLE_SERVER_MAX_SERVER_INFO_LEN ];
int m_nMasterServerPortStart;
int m_numMasterServers;
int m_nPingBucket;
bool m_bSupportsPII;
IN_ADDR m_adrSecure;
static int Compare( CXlspDatacenter const *dc1, CXlspDatacenter const *dc2 );
bool ParseServerInfo();
void Destroy();
};
class CXlspTitleServers : public IDormantOperation
{
public:
explicit CXlspTitleServers( int nPingLimit, bool bMustSupportPII );
~CXlspTitleServers();
public:
bool IsSearchCompleted() const;
CUtlVector< CXlspDatacenter > & GetDatacenters();
void Update();
void Destroy();
public:
virtual bool UpdateDormantOperation();
protected:
bool EnumerateDcs( HANDLE &hEnumerate, XOVERLAPPED &xOverlapped, CUtlBuffer &bufResults );
bool ExecuteQosDcs( HANDLE &hEnumerate, XOVERLAPPED &xOverlapped, CUtlBuffer &bufResults, DWORD &numServers, XNQOS *&pQos );
void ParseDatacentersFromQos( CUtlVector< CXlspDatacenter > &arrDcs, CUtlBuffer &bufResults, XNQOS *&pQos );
protected:
enum State_t
{
STATE_INIT,
STATE_XLSP_ENUMERATE_DCS,
STATE_XLSP_QOS_DCS,
STATE_FINISHED
};
State_t m_eState;
HANDLE m_hEnumerate;
XOVERLAPPED m_xOverlapped;
CUtlBuffer m_bufXlspEnumerateDcs;
DWORD m_numServers;
XNQOS *m_pQos;
float m_flTimeout;
int m_nPingLimit;
bool m_bMustSupportPII;
CJob *m_pCancelOverlappedJob;
CUtlVector< CXlspDatacenter > m_arrDcs;
};
//
// XLSP Connection
//
class CXlspConnection : public IMatchEventsSink
{
public:
explicit CXlspConnection( bool bMustSupportPII );
protected:
virtual ~CXlspConnection();
public:
bool IsConnected() const;
bool HasError() const;
CXlspDatacenter const & GetDatacenter() const;
bool ExecuteCmd( KeyValues *pCommand, int numRetriesAllowed = 0, float flCmdRetryTimeout = 0 );
KeyValues * GetCmdResult() const { return m_pCmdResult; }
virtual void Update();
virtual void Destroy();
public:
void ResolveCmdSystemValues( KeyValues *pCommand );
// IMatchEventsSink
protected:
virtual void OnEvent( KeyValues *pEvent );
protected:
void ConnectXlspDc();
protected:
netadr_t GetXlspDcAddress();
enum State_t
{
STATE_INIT,
STATE_CONNECTING, // INIT -> CONNECTING -> CONNECTED
STATE_CONNECTED,
STATE_RUNNINGCMD, // CONNECTED -> RUNNINGCMD -> CONNECTED
STATE_ERROR
};
State_t m_eState;
//
// XLSP datacenters information
//
CXlspTitleServers *m_pTitleServers;
CXlspDatacenter m_dc;
int m_idCmdReplyId;
CUtlVector< char > m_bufCmdRetry;
int m_numCmdRetriesAllowed;
float m_flCmdRetryTimeout;
KeyValues *m_pCmdResult;
float m_flTimeout;
bool m_bMustSupportPII;
};
class CXlspConnectionCmdBatch
{
public:
CXlspConnectionCmdBatch( CXlspConnection *pConnection, CUtlVector< KeyValues * > &arrCommands, int numRetriesAllowedPerEachCmd = 0, float flCommandTimeout = 0.0f );
protected:
virtual ~CXlspConnectionCmdBatch();
public:
bool IsFinished() const;
bool HasAllResults() const;
CUtlVector< KeyValues * > &GetResults() { return m_arrResults; }
public:
virtual void Update();
virtual void Destroy();
protected:
void RunNextCmd();
protected:
CUtlVector< KeyValues * > m_arrCommands;
CUtlVector< KeyValues * > m_arrResults;
enum State_t
{
STATE_BATCH_WAITING,
STATE_RUNNINGCMD,
STATE_FINISHED
};
State_t m_eState;
int m_iCommand;
CXlspConnection *m_pXlspConn;
int m_numRetriesAllowedPerEachCmd;
float m_flCommandTimeout;
};
#endif // _X360
#endif // X360_XLSP_CMD_H