391 lines
9.7 KiB
C++
391 lines
9.7 KiB
C++
//===== Copyright © 1996-2009, Valve Corporation, All rights reserved. ======//
|
|
//
|
|
// Purpose:
|
|
//
|
|
//===========================================================================//
|
|
|
|
#ifndef SYS_SESSION_H
|
|
#define SYS_SESSION_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
class CSysSessionBase;
|
|
class CSysSessionHost;
|
|
class CSysSessionClient;
|
|
|
|
#include "x360_lobbyapi.h"
|
|
#include "x360_netmgr.h"
|
|
|
|
class CSysSessionBase
|
|
#ifdef _X360
|
|
: public IX360NetworkEvents
|
|
#endif
|
|
{
|
|
friend class CSysSessionHost;
|
|
friend class CSysSessionClient;
|
|
|
|
protected:
|
|
CSysSessionBase( KeyValues *pSettings );
|
|
virtual ~CSysSessionBase();
|
|
|
|
public:
|
|
virtual bool Update();
|
|
virtual void Destroy();
|
|
virtual void Command( KeyValues *pCommand );
|
|
|
|
uint64 GetReservationCookie();
|
|
uint64 GetNonceCookie();
|
|
uint64 GetSessionID();
|
|
virtual XUID GetHostXuid( XUID xuidValidResult = 0ull ) = 0;
|
|
|
|
void SetSessionActiveGameplayState( bool bActive, char const *szSecureServerAddress );
|
|
void UpdateTeamProperties( KeyValues *pTeamProperties );
|
|
void UpdateServerInfo( KeyValues *pServerKey );
|
|
|
|
public:
|
|
void ReplyLanSearch( KeyValues *msg );
|
|
|
|
public:
|
|
virtual void DebugPrint();
|
|
void SendMessage( KeyValues *msg );
|
|
|
|
protected:
|
|
virtual void ReceiveMessage( KeyValues *msg, bool bValidatedLobbyMember, XUID xuidSrc );
|
|
virtual void OnPlayerLeave( XUID xuid );
|
|
virtual bool IsServiceSession();
|
|
|
|
bool FindAndRemovePlayerFromMembers( XUID xuid );
|
|
void UpdateSessionProperties( KeyValues *kv, bool bHost );
|
|
|
|
virtual void OnSessionEvent( KeyValues *notify );
|
|
void SendEventsNotification( KeyValues *notify );
|
|
bool SendQueuedEventsNotifications();
|
|
|
|
void PrintValue( KeyValues *val, char *chBuffer, int numBytesBuffer );
|
|
|
|
#ifdef _X360
|
|
|
|
CX360LobbyObject m_lobby;
|
|
CX360NetworkMgr *m_pNetworkMgr;
|
|
IX360LobbyAsyncOperation *m_pAsyncOperation;
|
|
|
|
CX360LobbyMigrateHandle_t m_hLobbyMigrateCall;
|
|
CX360LobbyMigrateOperation_t m_MigrateCallState;
|
|
|
|
INetSupport::NetworkSocket_t GetX360NetSocket();
|
|
|
|
virtual void OnAsyncOperationFinished() = 0;
|
|
void ReleaseAsyncOperation();
|
|
|
|
// IX360NetworkEvents
|
|
virtual void OnX360NetPacket( KeyValues *msg );
|
|
virtual void OnX360NetDisconnected( XUID xuidRemote );
|
|
|
|
// Members management code
|
|
void OnX360AllSessionMembersJoinLeave( KeyValues *kv );
|
|
|
|
// Check whether host migration should be allowed
|
|
// on the session
|
|
virtual bool ShouldAllowX360HostMigration();
|
|
|
|
virtual bool UpdateMigrationCall();
|
|
|
|
#elif !defined( NO_STEAM )
|
|
public:
|
|
STEAM_CALLBACK_MANUAL( CSysSessionBase, Steam_OnLobbyChatMsg, LobbyChatMsg_t, m_CallbackOnLobbyChatMsg );
|
|
STEAM_CALLBACK_MANUAL( CSysSessionBase, Steam_OnLobbyChatUpdate, LobbyChatUpdate_t, m_CallbackOnLobbyChatUpdate );
|
|
STEAM_CALLBACK( CSysSessionBase, Steam_OnServersConnected, SteamServersConnected_t, m_CallbackOnServersConnected );
|
|
STEAM_CALLBACK( CSysSessionBase, Steam_OnServersDisconnected, SteamServersDisconnected_t, m_CallbackOnServersDisconnected );
|
|
STEAM_CALLBACK( CSysSessionBase, Steam_OnP2PSessionRequest, P2PSessionRequest_t, m_CallbackOnP2PSessionRequest );
|
|
|
|
protected:
|
|
void UnpackAndReceiveMessage( const void *pvBuffer, int numBytes, bool bValidatedLobbyMember, XUID xuidSrc );
|
|
void SetupSteamRankingConfiguration();
|
|
bool IsSteamRankingConfigured() const;
|
|
|
|
protected:
|
|
CSteamLobbyObject m_lobby;
|
|
bool m_bVoiceUsingSessionP2P;
|
|
|
|
char const * LobbyEnterErrorAsString( LobbyEnter_t *pLobbyEnter );
|
|
void LobbySetDataFromKeyValues( char const *szPath, KeyValues *key, bool bRecurse = true );
|
|
|
|
#else
|
|
uint64 m_lobby;
|
|
#endif
|
|
|
|
protected:
|
|
// Voice engine
|
|
virtual void Voice_ProcessTalkers( KeyValues *pMachine, bool bAdd );
|
|
virtual void Voice_CaptureAndTransmitLocalVoiceData();
|
|
virtual void Voice_Playback( KeyValues *msg, XUID xuidSrc );
|
|
virtual void Voice_UpdateLocalHeadsetsStatus();
|
|
float m_Voice_flLastHeadsetStatusCheck;
|
|
|
|
public:
|
|
virtual void Voice_UpdateMutelist();
|
|
|
|
protected:
|
|
KeyValues *m_pSettings;
|
|
XUID m_xuidMachineId;
|
|
|
|
public:
|
|
|
|
enum Result
|
|
{
|
|
RESULT_UNDEFINED,
|
|
RESULT_FAIL,
|
|
RESULT_SUCCESS
|
|
};
|
|
|
|
Result m_result;
|
|
Result GetResult() { return m_result; }
|
|
};
|
|
|
|
class CSysSessionHost : public CSysSessionBase
|
|
{
|
|
public:
|
|
explicit CSysSessionHost( KeyValues *pSettings );
|
|
explicit CSysSessionHost( CSysSessionClient *pClient, KeyValues *pSettings );
|
|
virtual ~CSysSessionHost();
|
|
|
|
public:
|
|
virtual bool Update();
|
|
virtual void Destroy();
|
|
|
|
virtual XUID GetHostXuid( XUID xuidValidResult = 0ull );
|
|
|
|
void KickPlayer( KeyValues *pCommand );
|
|
|
|
#ifdef _X360
|
|
void GetHostSessionInfo( char chBuffer[ XSESSION_INFO_STRING_LENGTH ] );
|
|
uint64 GetHostSessionId();
|
|
#endif
|
|
|
|
void UpdateMembersInfo();
|
|
void OnUpdateSessionSettings( KeyValues *kv );
|
|
void OnPlayerUpdated( KeyValues *pPlayer );
|
|
void OnMachineUpdated( KeyValues *pMachine );
|
|
|
|
void Migrate( KeyValues *pCommand );
|
|
|
|
void ReserveTeamSession( XUID key, int numPlayers );
|
|
void UnreserveTeamSession( );
|
|
|
|
void SetCryptKey( uint64 ullCrypt ) { m_ullCrypt = ullCrypt; }
|
|
uint64 GetCryptKey() const { return m_ullCrypt; }
|
|
|
|
public:
|
|
virtual void DebugPrint();
|
|
|
|
protected:
|
|
virtual void ReceiveMessage( KeyValues *msg, bool bValidatedLobbyMember, XUID xuidSrc ) OVERRIDE;
|
|
virtual void OnPlayerLeave( XUID xuid );
|
|
|
|
protected:
|
|
|
|
bool Process_RequestJoinData( XUID xuidClient, KeyValues *pSettings );
|
|
void Process_TeamReservation( XUID key, int teamSize );
|
|
void Process_VoiceStatus( KeyValues *msg, XUID xuidSrc );
|
|
void Process_VoiceMutelist( KeyValues *msg );
|
|
|
|
void UpdateStateInit();
|
|
|
|
void InitSessionProperties();
|
|
void UpdateSessionProperties( KeyValues *kv );
|
|
|
|
uint64 m_ullCrypt;
|
|
XUID m_teamResKey;
|
|
int m_numRemainingTeamPlayers;
|
|
float m_flTeamResStartTime;
|
|
|
|
#ifdef _X360
|
|
|
|
virtual void OnAsyncOperationFinished();
|
|
|
|
// IX360NetworkEvents
|
|
virtual void OnX360NetDisconnected( XUID xuidRemote );
|
|
virtual bool OnX360NetConnectionlessPacket( netpacket_t *pkt, KeyValues *msg );
|
|
|
|
void DestroyAfterMigrationFinished();
|
|
|
|
#elif !defined( NO_STEAM )
|
|
|
|
CCallResult< CSysSessionHost, LobbyCreated_t > m_CallbackOnLobbyCreated;
|
|
void Steam_OnLobbyCreated( LobbyCreated_t *p, bool bError );
|
|
|
|
STEAM_CALLBACK_MANUAL( CSysSessionHost, Steam_OnLobbyEntered, LobbyEnter_t, m_CallbackOnLobbyEntered );
|
|
|
|
bool GetLobbyType( KeyValues *kv, ELobbyType *peType, bool *pbJoinable );
|
|
double m_dblDormantMembersCheckTime;
|
|
int m_numDormantMembersDetected;
|
|
|
|
#endif
|
|
|
|
enum State_t
|
|
{
|
|
STATE_INIT,
|
|
STATE_CREATING,
|
|
STATE_IDLE,
|
|
STATE_FAIL,
|
|
STATE_MIGRATE,
|
|
#ifdef _X360
|
|
STATE_ALLOWING_MIGRATE,
|
|
STATE_DELETE,
|
|
#endif
|
|
STATE_UNDEFINED
|
|
};
|
|
|
|
State_t m_eState;
|
|
float m_flTimeOperationStarted;
|
|
float m_flInitializeTimestamp;
|
|
|
|
CUtlMap< XUID, double, int, CDefLess< XUID > > m_mapKickedPlayers;
|
|
};
|
|
|
|
class CSysSessionClient : public CSysSessionBase
|
|
{
|
|
public:
|
|
explicit CSysSessionClient( KeyValues *pSettings );
|
|
explicit CSysSessionClient( CSysSessionHost *pHost, KeyValues *pSettings );
|
|
virtual ~CSysSessionClient();
|
|
|
|
public:
|
|
virtual bool Update();
|
|
virtual void Destroy();
|
|
|
|
virtual XUID GetHostXuid( XUID xuidValidResult = 0ull );
|
|
|
|
#ifdef _X360
|
|
char const * GetHostNetworkAddress( XSESSION_INFO &xsi );
|
|
#endif
|
|
|
|
void Migrate( KeyValues *pCommand );
|
|
|
|
public:
|
|
virtual void DebugPrint();
|
|
|
|
protected:
|
|
virtual void ReceiveMessage( KeyValues *msg, bool bValidatedLobbyMember, XUID xuidSrc ) OVERRIDE;
|
|
virtual void OnPlayerLeave( XUID xuid );
|
|
|
|
protected:
|
|
void Send_RequestJoinData();
|
|
|
|
void Process_ReplyJoinData_Our( KeyValues *msg );
|
|
void Process_ReplyJoinData_Other( KeyValues *msg );
|
|
void Process_OnPlayerUpdated( KeyValues *msg );
|
|
void Process_OnMachineUpdated( KeyValues *msg );
|
|
void Process_Kicked( KeyValues *msg );
|
|
|
|
protected:
|
|
void UpdateStateInit();
|
|
|
|
void InitSessionProperties( KeyValues *pSettings );
|
|
void UpdateSessionProperties( KeyValues *kv );
|
|
|
|
#ifdef _X360
|
|
|
|
virtual void OnAsyncOperationFinished();
|
|
virtual void XP2P_Interconnect();
|
|
|
|
// IX360NetworkEvents
|
|
virtual void OnX360NetDisconnected( XUID xuidRemote );
|
|
virtual bool OnX360NetConnectionlessPacket( netpacket_t *pkt, KeyValues *msg );
|
|
|
|
XNADDR m_xnaddrLocal;
|
|
|
|
#elif !defined( NO_STEAM )
|
|
|
|
STEAM_CALLBACK_MANUAL( CSysSessionClient, Steam_OnLobbyEntered, LobbyEnter_t, m_CallbackOnLobbyEntered );
|
|
|
|
#endif
|
|
|
|
struct RequestJoinDataInfo_t
|
|
{
|
|
XUID m_xuidLeader; // XUID of the leader who must reply
|
|
float m_fTimeSent; // Time when request was sent
|
|
} m_RequestJoinDataInfo;
|
|
|
|
enum State_t
|
|
{
|
|
STATE_INIT,
|
|
#if !defined ( NO_STEAM )
|
|
STATE_JOIN_LOBBY,
|
|
#endif
|
|
STATE_CREATING,
|
|
STATE_REQUESTING_JOIN_DATA,
|
|
STATE_IDLE,
|
|
STATE_FAIL,
|
|
STATE_MIGRATE,
|
|
#ifdef _X360
|
|
STATE_DELETE,
|
|
#endif
|
|
STATE_UNDEFINED
|
|
};
|
|
|
|
State_t m_eState;
|
|
|
|
float m_flInitializeTimestamp;
|
|
};
|
|
|
|
class CSysSessionConTeamHost : public CSysSessionBase
|
|
{
|
|
public:
|
|
explicit CSysSessionConTeamHost( KeyValues *pSettings );
|
|
virtual ~CSysSessionConTeamHost();
|
|
|
|
virtual bool Update();
|
|
virtual void Destroy();
|
|
|
|
// Once reservation is successful call this function to know which side
|
|
// each player should be assigned to
|
|
// In keyvalues, the convention is that team CT = 1, team T = 2
|
|
bool GetPlayerSidesAssignment( int *numPlayers, uint64 playerIDs[10], int side[10] );
|
|
|
|
protected:
|
|
virtual void ReceiveMessage( KeyValues *msg, bool bValidatedLobbyMember, XUID xuidSrc ) OVERRIDE;
|
|
void SendReservationRequest();
|
|
void Succeeded();
|
|
void Failed();
|
|
XUID GetHostXuid( XUID xuidValidResult );
|
|
|
|
enum State_t
|
|
{
|
|
STATE_INIT,
|
|
STATE_WAITING_LOBBY_JOIN,
|
|
STATE_SEND_RESERVATION_REQUEST,
|
|
STATE_WAITING_RESERVATION_REQUEST,
|
|
STATE_DONE,
|
|
STATE_DELETE,
|
|
};
|
|
|
|
State_t m_eState;
|
|
|
|
float m_lastRequestSendTime;
|
|
|
|
public:
|
|
|
|
#ifdef _X360
|
|
|
|
XSESSION_INFO m_sessionInfo;
|
|
|
|
virtual bool OnX360NetConnectionlessPacket( netpacket_t *pkt, KeyValues *msg );
|
|
virtual void OnAsyncOperationFinished();
|
|
IN_ADDR m_inaddr;
|
|
|
|
#elif !defined( NO_STEAM )
|
|
|
|
STEAM_CALLBACK_MANUAL( CSysSessionConTeamHost, Steam_OnLobbyEntered, LobbyEnter_t, m_CallbackOnLobbyEntered );
|
|
|
|
#endif
|
|
};
|
|
|
|
|
|
#ifdef _X360
|
|
void SysSession360_UpdatePending();
|
|
#endif
|
|
|
|
#endif
|