//===== Copyright © 1996-2009, Valve Corporation, All rights reserved. ======// // // Purpose: // //===========================================================================// #ifndef X360_LOBBYAPI_H #define X360_LOBBYAPI_H #ifdef _WIN32 #pragma once #endif #ifdef _X360 class CX360LobbyObject; class CX360LobbyObject { public: CX360LobbyObject() { memset( this, 0, sizeof( *this ) ); } public: uint64 GetSessionId() const { return ( uint64 const & ) m_xiInfo.sessionID; } public: HANDLE m_hHandle; uint64 m_uiNonce; XSESSION_INFO m_xiInfo; IN_ADDR m_inaSecure; XSESSION_INFO m_xiExternalPeer; bool m_bXSessionStarted; }; abstract_class IDormantOperation { public: // Runs a dormant operation frame loop // Returns true to keep running // Return false when the operation should be // deleted from the dormant update list virtual bool UpdateDormantOperation() = 0; }; abstract_class IX360LobbyAsyncOperation : public IMatchAsyncOperation { public: virtual CX360LobbyObject const & GetLobby() = 0; virtual void Update() = 0; }; struct CX360LobbyFlags_t { DWORD m_dwFlags; DWORD m_dwGameType; int m_numPublicSlots; int m_numPrivateSlots; bool m_bCanLockJoins; }; struct CX360LobbyMigrateOperation_t { CX360LobbyObject *m_pLobby; DWORD m_ret; bool m_bFinished; }; typedef void* CX360LobbyMigrateHandle_t; abstract_class IX360LeaderboardBatchWriter { public: virtual void AddProperty( int dwViewId, XUSER_PROPERTY const &xp ) = 0; virtual void WriteBatchAndDestroy() = 0; }; CX360LobbyFlags_t MMX360_DescribeLobbyFlags( KeyValues *pSettings, bool bHost, bool bWantLocked = false ); #define XSESSION_INFO_STRING_LENGTH ( 2 * sizeof( XSESSION_INFO ) + 1 ) void MMX360_SessionInfoToString( XSESSION_INFO const &xsi, char *pchBuffer ); void MMX360_SessionInfoFromString( XSESSION_INFO &xsi, char const *pchBuffer ); #define XNADDR_STRING_LENGTH ( 2 * sizeof( XNADDR ) + 1 ) void MMX360_XnaddrToString( XNADDR const &xsi, char *pchBuffer ); void MMX360_XnaddrFromString( XNADDR &xsi, char const *pchBuffer ); void MMX360_LobbyDelete( CX360LobbyObject &lobby, IX360LobbyAsyncOperation **ppOperation ); void MMX360_LobbyCreate( KeyValues *pSettings, IX360LobbyAsyncOperation **ppOperation ); void MMX360_LobbyConnect( KeyValues *pSettings, IX360LobbyAsyncOperation **ppOperation ); CX360LobbyMigrateHandle_t MMX360_LobbyMigrateHost( CX360LobbyObject &lobby, CX360LobbyMigrateOperation_t *pOperation ); CX360LobbyMigrateHandle_t MMX360_LobbyMigrateClient( CX360LobbyObject &lobby, XSESSION_INFO const &xsiNewHost, CX360LobbyMigrateOperation_t *pOperation ); CX360LobbyMigrateOperation_t * MMX360_LobbyMigrateSetListener( CX360LobbyMigrateHandle_t hMigrateCall, CX360LobbyMigrateOperation_t *pOperation ); void MMX360_LobbyJoinMembers( KeyValues *pSettings, CX360LobbyObject &lobby, int idxMachineStart = 0, int idxMachineEnd = -1 ); void MMX360_LobbyLeaveMembers( KeyValues *pSettings, CX360LobbyObject &lobby, int idxMachineStart = 0, int idxMachineEnd = -1 ); bool MMX360_LobbySetActiveGameplayState( CX360LobbyObject &lobby, bool bActive, char const *szSecureServerAddress ); int MMX360_GetUserCtrlrIndex( XUID xuid ); XOVERLAPPED * MMX360_NewOverlappedDormant( void (*pfnCompletion)( XOVERLAPPED *, void * ) = NULL, void *pvParam = NULL ); void MMX360_RegisterDormant( IDormantOperation *pDormant ); void MMX360_UpdateDormantOperations(); IX360LeaderboardBatchWriter * MMX360_CreateLeaderboardBatchWriter( XUID xuidGamer ); void MMX360_CancelOverlapped( XOVERLAPPED *pxOverlapped ); // // Helpful functions to be used when overlapped operation completes // template < typename T > void OnCompleted_DeleteData( XOVERLAPPED *, void *pvData ) { delete reinterpret_cast< T * >( pvData ); } template < typename T > void OnCompleted_DeleteDataArray( XOVERLAPPED *, void *pvData ) { delete [] reinterpret_cast< T * >( pvData ); } #else class CSteamLobbyObject { public: CSteamLobbyObject() { memset( this, 0, sizeof( *this ) ); } public: uint64 GetSessionId() const { return m_uiLobbyID; } public: uint64 m_uiLobbyID; enum LobbyState_t { STATE_DEFAULT = 0, STATE_ACTIVE_GAME, STATE_DISCONNECTED_FROM_STEAM, }; LobbyState_t m_eLobbyState; }; #endif #endif