hl2_src-leak-2017/src/game/server/textstatsmgr.cpp

175 lines
3.9 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "textstatsmgr.h"
#include "tier0/dbg.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
CTextStatsMgr g_TextStatsMgr; // The default text stats manager.
// ------------------------------------------------------------------------------------------ //
// CTextStatsMgr implementation.
// ------------------------------------------------------------------------------------------ //
CTextStatsMgr::CTextStatsMgr( void )
{
m_szStatFilename[0] = 0;
}
bool CTextStatsMgr::WriteFile( IFileSystem *pFileSys, const char *pFilename )
{
// If no filename was specified, use out preset one
if ( !pFilename )
{
pFilename = m_szStatFilename;
}
FileHandle_t hFile = pFileSys->Open( pFilename, "wt", "LOGDIR" );
if ( hFile == FILESYSTEM_INVALID_HANDLE )
return false;
CTextStat *pHead = CTextStat::GetTextStatsList();
for ( CTextStat *pCur=pHead->m_pNext; pCur != pHead; pCur=pCur->m_pNext )
{
if ( pCur->m_pMgr == this )
pCur->m_PrintFn( pFileSys, hFile, pCur->m_pUserData );
}
pFileSys->Close( hFile );
// Call each CTextStatFile..
for( CTextStatFile *pCurFile=CTextStatFile::s_pHead; pCurFile; pCurFile=pCurFile->m_pNext )
{
pCurFile->m_pFn();
}
return true;
}
char *CTextStatsMgr::GetStatsFilename( void )
{
return m_szStatFilename;
}
void CTextStatsMgr::SetStatsFilename( char *sFilename )
{
Assert( sFilename && sFilename[0] );
Q_strncpy( m_szStatFilename, sFilename, sizeof(m_szStatFilename) );
}
// ------------------------------------------------------------------------------------------ //
// CTextStat implementation.
// ------------------------------------------------------------------------------------------ //
CTextStat::CTextStat()
{
m_pPrev = m_pNext = this;
m_pMgr = NULL;
}
CTextStat::CTextStat( TextStatPrintFn printFn, void *pUserData, CTextStatsMgr *pMgr )
{
m_pPrev = m_pNext = this;
Init( printFn, pUserData, pMgr );
}
CTextStat::~CTextStat()
{
Term();
}
void CTextStat::Init( TextStatPrintFn printFn, void *pUserData, CTextStatsMgr *pMgr )
{
Term();
m_pPrev = GetTextStatsList();
m_pNext = GetTextStatsList()->m_pNext;
m_pPrev->m_pNext = m_pNext->m_pPrev = this;
m_PrintFn = printFn;
m_pUserData = pUserData;
m_pMgr = pMgr;
}
void CTextStat::Term()
{
// Remove from the global list.
m_pPrev->m_pNext = m_pNext;
m_pNext->m_pPrev = m_pPrev;
m_pPrev = m_pNext = this;
m_pMgr = NULL;
}
CTextStat::CTextStat( bool bGlobalListHead )
{
Assert( bGlobalListHead );
m_pPrev = m_pNext = this;
}
CTextStat* CTextStat::GetTextStatsList()
{
static CTextStat theList( true );
return &theList;
}
void CTextStat::RemoveFn( void *pUserData )
{
CTextStat *pReg = (CTextStat*)pUserData;
pReg->Term();
}
// ------------------------------------------------------------------------------------------ //
// CTextStatInt implementation.
// ------------------------------------------------------------------------------------------ //
CTextStatInt::CTextStatInt( const char *pName, int initialValue, CTextStatsMgr *pMgr )
{
m_pName = pName;
m_Value = initialValue;
m_Reg.Init( &CTextStatInt::PrintFn, this, pMgr );
}
void CTextStatInt::PrintFn( IFileSystem *pFileSys, FileHandle_t hFile, void *pUserData )
{
CTextStatInt *pStat = (CTextStatInt*)pUserData;
pFileSys->FPrintf( hFile, "%s %d\n", pStat->m_pName, pStat->m_Value );
}
// ------------------------------------------------------------------------------------------ //
// CTextStatFile functions.
// ------------------------------------------------------------------------------------------ //
CTextStatFile *CTextStatFile::s_pHead = NULL;
CTextStatFile::CTextStatFile( TextStatFileFn fn )
{
m_pFn = fn;
m_pNext = CTextStatFile::s_pHead;
CTextStatFile::s_pHead = this;
}