|
|
//===== Copyright � 1996-2009, Valve Corporation, All rights reserved. ======//
//
// Purpose:
//
//===========================================================================//
#include "mm_extensions.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
CMatchExtensions::CMatchExtensions() { ; }
CMatchExtensions::~CMatchExtensions() { ; }
static CMatchExtensions g_MatchExtensions; CMatchExtensions *g_pMatchExtensions = &g_MatchExtensions;
//
// Implementation
//
void CMatchExtensions::RegisterExtensionInterface( char const *szInterfaceString, void *pvInterface ) { Assert( szInterfaceString ); Assert( pvInterface ); if ( !szInterfaceString || !pvInterface ) return;
RegisteredInterface_t &rInfo = m_mapRegisteredInterfaces[ szInterfaceString ]; Assert( rInfo.m_nRefCount >= 0 );
if ( rInfo.m_nRefCount > 0 ) { // Interface already registered
Assert( pvInterface == rInfo.m_pvInterface ); } else { // Fresh registration of the interface
Assert( !rInfo.m_pvInterface ); rInfo.m_pvInterface = pvInterface; }
// Increment refcount
++ rInfo.m_nRefCount;
// Fire a callback for interface registration
OnExtensionInterfaceUpdated( szInterfaceString, pvInterface ); }
void CMatchExtensions::UnregisterExtensionInterface( char const *szInterfaceString, void *pvInterface ) { Assert( szInterfaceString ); Assert( pvInterface ); if ( !szInterfaceString || !pvInterface ) return;
RegisteredInterface_t &rInfo = m_mapRegisteredInterfaces[ szInterfaceString ]; Assert( rInfo.m_nRefCount > 0 ); if ( rInfo.m_nRefCount <= 0 ) return;
Assert( pvInterface == rInfo.m_pvInterface );
-- rInfo.m_nRefCount; if ( 0 == rInfo.m_nRefCount ) { rInfo.m_pvInterface = NULL; OnExtensionInterfaceUpdated( szInterfaceString, NULL ); } }
void * CMatchExtensions::GetRegisteredExtensionInterface( char const *szInterfaceString ) { RegisteredInterface_t &rInfo = m_mapRegisteredInterfaces[ szInterfaceString ]; if ( rInfo.m_nRefCount > 0 && rInfo.m_pvInterface ) return rInfo.m_pvInterface; else return NULL; }
//
// Known interfaces recognition
//
void CMatchExtensions::OnExtensionInterfaceUpdated( char const *szInterfaceString, void *pvInterface ) { typedef void * Exts_t::* Ext_t;
struct CachedInterfacePtr_t { char const *m_szName; Ext_t m_ppInterface; };
static CachedInterfacePtr_t s_table[] = { { LOCALIZE_INTERFACE_VERSION, (Ext_t) &Exts_t::m_pILocalize }, { INETSUPPORT_VERSION_STRING, (Ext_t) &Exts_t::m_pINetSupport }, { IENGINEVOICE_INTERFACE_VERSION, (Ext_t) &Exts_t::m_pIEngineVoice }, { VENGINE_CLIENT_INTERFACE_VERSION, (Ext_t) &Exts_t::m_pIVEngineClient }, { INTERFACEVERSION_VENGINESERVER, (Ext_t) &Exts_t::m_pIVEngineServer }, { INTERFACEVERSION_SERVERGAMEDLL, (Ext_t) &Exts_t::m_pIServerGameDLL }, { INTERFACEVERSION_GAMEEVENTSMANAGER2, (Ext_t) &Exts_t::m_pIGameEventManager2 }, { CLIENT_DLL_INTERFACE_VERSION, ( Ext_t ) &Exts_t::m_pIBaseClientDLL }, #ifdef _X360
{ XBOXSYSTEM_INTERFACE_VERSION, (Ext_t) &Exts_t::m_pIXboxSystem }, { XONLINE_INTERFACE_VERSION, (Ext_t) &Exts_t::m_pIXOnline }, #endif
{ NULL, NULL } };
for ( CachedInterfacePtr_t *ptr = s_table; ptr->m_szName; ++ ptr ) { if ( !Q_stricmp( ptr->m_szName, szInterfaceString ) ) { m_exts.*(ptr->m_ppInterface) = pvInterface; } } }
|