//===== Copyright © 1996-2009, Valve Corporation, All rights reserved. ======// // // Purpose: // //===========================================================================// #ifndef DS_SEARCHER_H #define DS_SEARCHER_H #ifdef _WIN32 #pragma once #endif class CDsSearcher; #include "mm_framework.h" class CDsSearcher : public IMatchAsyncOperationCallback, IMatchEventsSink { public: explicit CDsSearcher( KeyValues *pSettings, uint64 uiReserveCookie, IMatchSession *pMatchSession, uint64 ullCrypt = 0ull ); virtual ~CDsSearcher(); // IMatchEventsSink public: virtual void OnEvent( KeyValues *pEvent ); public: virtual void Update(); virtual void Destroy(); virtual bool IsFinished(); struct DsResult_t { bool m_bAborted; bool m_bDedicated; char m_szConnectionString[256]; #ifdef _X360 char m_szInsecureSendableServerAddress[256]; #elif !defined( NO_STEAM ) char m_szPublicConnectionString[256]; char m_szPrivateConnectionString[256]; #endif void CopyToServerKey( KeyValues *pKvServer, uint64 ullCrypt = 0ull ) const; }; virtual DsResult_t const& GetResult(); protected: void InitDedicatedSearch(); void InitWithKnownServer(); void ReserveNextServer(); virtual void OnOperationFinished( IMatchAsyncOperation *pOperation ); float m_flTimeout; IMatchAsyncOperation *m_pAsyncOperation; protected: #ifdef _X360 CXlspTitleServers *m_pTitleServers; void Xlsp_EnumerateDcs(); void Xlsp_OnEnumerateDcsCompleted(); CUtlVector< CXlspDatacenter > m_arrDatacenters; char m_chDatacenterQuery[ MAX_PATH ]; void Xlsp_PrepareDatacenterQuery(); void Xlsp_StartNextDc(); CXlspDatacenter m_dc; void Xlsp_OnDcServerBatch( void const *pData, int numBytes ); CUtlVector< uint16 > m_arrServerPorts; #elif !defined( NO_STEAM ) int m_nSearchPass; void Steam_SearchPass(); class CServerListListener : public ISteamMatchmakingServerListResponse { public: explicit CServerListListener( CDsSearcher *pDsSearcher, CUtlVector< MatchMakingKeyValuePair_t > &filters ); void Destroy(); public: // Server has responded ok with updated data virtual void ServerResponded( HServerListRequest hReq, int iServer ); // Server has failed to respond virtual void ServerFailedToRespond( HServerListRequest hReq, int iServer ) { gameserveritem_t *pServer = steamapicontext->SteamMatchmakingServers() ->GetServerDetails( hReq, iServer ); DevMsg( " server failed to respond '%s'\n", pServer->m_NetAdr.GetConnectionAddressString() ); } // A list refresh you had initiated is now 100% completed virtual void RefreshComplete( HServerListRequest hReq, EMatchMakingServerResponse response ); protected: CDsSearcher *m_pOuter; HServerListRequest m_hRequest; }; friend class CServerListListener; CServerListListener *m_pServerListListener; struct DsServer_t { DsServer_t( char const *szConnectionString, char const *szPrivateConnectionString, int nPing ) : m_nPing( nPing ) { Q_strncpy( m_szConnectionString, szConnectionString, ARRAYSIZE( m_szConnectionString ) ); Q_strncpy( m_szPrivateConnectionString, szPrivateConnectionString, ARRAYSIZE( m_szPrivateConnectionString ) ); } char m_szConnectionString[256]; char m_szPrivateConnectionString[256]; int m_nPing; }; CUtlVector< DsServer_t > m_arrServerList; void Steam_OnDedicatedServerListFetched(); #endif protected: IMatchSession *m_pMatchSession; KeyValues *m_pSettings; uint64 m_uiReserveCookie; KeyValues *m_pReserveSettings; KeyValues::AutoDelete m_autodelete_pReserveSettings; enum State_t { STATE_INIT, STATE_WAITING, #ifdef _X360 STATE_XLSP_ENUMERATE_DCS, STATE_XLSP_NEXT_DC, STATE_XLSP_REQUESTING_SERVERS, #elif !defined( NO_STEAM ) STATE_STEAM_REQUESTING_SERVERS, STATE_STEAM_NEXT_SEARCH_PASS, #endif STATE_RESERVING, STATE_FINISHED, }; State_t m_eState; DsResult_t m_Result; // If we are loadtesting, do a 2-pass search // 1st pass, look for empty ds with sv_load_test = 1 // 2 pass, don't include sv_load_test flag in search bool m_bLoadTest; uint64 m_ullCrypt; }; #endif