//========= 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