|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#ifndef SESSION_H
#define SESSION_H
#ifdef _WIN32
#pragma once
#endif
#include "engine/imatchmaking.h"
#include "ixboxsystem.h"
#include "const.h"
#include "net.h"
// valid session states
enum SESSION_STATE { SESSION_STATE_NONE, SESSION_STATE_CREATING, SESSION_STATE_MIGRATING, SESSION_STATE_IDLE, SESSION_STATE_WAITING_FOR_REGISTRATION, SESSION_STATE_REGISTERING, SESSION_STATE_REGISTERED, SESSION_STATE_STARTING, SESSION_STATE_IN_GAME, SESSION_STATE_ENDING, SESSION_STATE_FINISHED, SESSION_STATE_DELETING };
// slot types for the session
enum SLOTS { SLOTS_TOTALPUBLIC, SLOTS_TOTALPRIVATE, SLOTS_FILLEDPUBLIC, SLOTS_FILLEDPRIVATE, SLOTS_LAST };
class CClientInfo { public: uint64 m_id; // machine id
netadr_t m_adr; // IP and Port
XNADDR m_xnaddr; // XNADDR
XUID m_xuids[MAX_PLAYERS_PER_CLIENT]; // XUIDs
bool m_bInvited; // use private slots
bool m_bRegistered; // registered for arbitration
bool m_bMigrated; // successfully completed migration
bool m_bModified; // completed session modification
bool m_bReportedStats; // reported session stats to Live
bool m_bLoaded; // map load is complete
byte m_cVoiceState[MAX_PLAYERS_PER_CLIENT]; // has voice permission
char m_cPlayers; // number of players on this client
char m_iControllers[MAX_PLAYERS_PER_CLIENT]; // the controller (user index) for each player
char m_iTeam[MAX_PLAYERS_PER_CLIENT]; // each player's team
char m_szGamertags[MAX_PLAYERS_PER_CLIENT][MAX_PLAYER_NAME_LENGTH]; char mutable m_numPrivateSlotsUsed; // number of private slots used by this client if invited
CClientInfo() { Clear(); } void Clear() { Q_memset( this, 0, sizeof( CClientInfo ) ); Q_memset( &m_iTeam, -1, sizeof( m_iTeam ) ); } };
class CMatchmaking; class CSession { public: CSession(); ~CSession();
void ResetSession(); void SetParent( CMatchmaking *pParent ); void RunFrame(); bool CreateSession(); void CancelCreateSession(); void DestroySession(); void RegisterForArbitration(); bool MigrateHost();
void JoinLocal( const CClientInfo *pClient ); void JoinRemote( const CClientInfo *pClient ); void RemoveLocal( const CClientInfo *pClient ); void RemoveRemote( const CClientInfo *pClient );
// Accessors
HANDLE GetSessionHandle(); void SetSessionInfo( XSESSION_INFO *pInfo ); void SetNewSessionInfo( XSESSION_INFO *pInfo ); void GetSessionInfo( XSESSION_INFO *pInfo ); void GetNewSessionInfo( XSESSION_INFO *pInfo ); void SetSessionNonce( int64 nonce ); uint64 GetSessionNonce(); XNKID GetSessionId(); void SetSessionSlots( unsigned int nSlot, unsigned int nPlayers ); uint GetSessionSlots( unsigned int nSlot ); void SetSessionFlags( uint flags ); uint GetSessionFlags(); int GetPlayerCount(); void SetFlag( uint dwFlag ); void SetIsHost( bool bHost ); void SetIsSystemLink( bool bSystemLink ); void SetOwnerId( uint id ); bool IsHost(); bool IsFull(); bool IsArbitrated(); bool IsSystemLink();
void SwitchToState( SESSION_STATE newState );
void SetContext( const uint nContextId, const uint nContextValue, const bool bAsync = true ); void SetProperty( const uint nPropertyId, const uint cbValue, const void *pvValue, const bool bAsync = true );
XSESSION_REGISTRATION_RESULTS *GetRegistrationResults() { return m_pRegistrationResults; }
private: // Update functions
void UpdateCreating(); void UpdateMigrating(); void UpdateRegistering(); void SendNotification( SESSION_NOTIFY notification ); void UpdateSlots( const CClientInfo *pClient, bool bAddPlayers ); double GetTime();
HANDLE m_hSession; // Session handle
bool m_bIsHost; // Is hosting
bool m_bIsArbitrated; // Is Arbitrated
bool m_bUsingQoS; // Is the QoS listener enabled
bool m_bIsSystemLink; // Is this a system link session
XSESSION_INFO m_SessionInfo; // Session ID, key, and host address
XSESSION_INFO m_NewSessionInfo; // Session ID, key, and host address
uint64 m_SessionNonce; // Nonce of the session
uint m_nSessionFlags; // Session creation flags
uint m_nOwnerId; // Which player created the session
uint m_SessionState; double m_fOperationStartTime; CMatchmaking *m_pParent; AsyncHandle_t m_hCreateHandle; AsyncHandle_t m_hMigrateHandle; AsyncHandle_t m_hRegisterHandle;
XSESSION_REGISTRATION_RESULTS *m_pRegistrationResults;
// public/private slots for the session
uint m_nPlayerSlots[SLOTS_LAST];
};
#endif // SESSION_H
|