//========= Copyright Valve Corporation, All rights reserved. ============//
//
//=======================================================================================//

#ifndef SHARED_REPLAYCONTEXT_H
#define SHARED_REPLAYCONTEXT_H
#ifdef _WIN32
#pragma once
#endif

//----------------------------------------------------------------------------------------

#include "baserecordingsessionmanager.h"
#include "baserecordingsessionblockmanager.h"
#include "errorsystem.h"

//----------------------------------------------------------------------------------------

class CBaseRecordingSessionManager;
class CBaseRecordingSessionBlockManager;
class CErrorSystem;
class IThreadPool;

//----------------------------------------------------------------------------------------

class CSharedReplayContext
{
public:
	CSharedReplayContext( IReplayContext *pOwnerContext );
	virtual ~CSharedReplayContext();

	// Sets up public data members and such
	virtual bool						Init( CreateInterfaceFn fnFactory );
	virtual void						Shutdown();

	virtual void						Think();

	virtual bool						IsInitialized() const	{ return m_bInit; }
	
	virtual const char					*GetRelativeBaseDir() const;
	virtual const char					*GetBaseDir() const;
	virtual const char					*GetReplaySubDir() const;

	IThreadPool							*m_pThreadPool;

	CBaseRecordingSessionManager		*m_pRecordingSessionManager;
	CBaseRecordingSessionBlockManager	*m_pRecordingSessionBlockManager;

	CErrorSystem						*m_pErrorSystem;

	CUtlString							m_strRelativeBasePath;	// eg: "/replay/server/"
	CUtlString							m_strBasePath;		// eg: "/user/home/tfadmin/tf/replay/server/"
	CUtlString							m_strSubDir;		// "client" or "server"

	bool								m_bInit;			// Initialized yet?  Set by outer class.

private:
	bool								InitThreadPool();
	void								EnsureDirHierarchy();

	IReplayContext						*m_pOwnerContext;
};

//----------------------------------------------------------------------------------------

#define LINK_TO_SHARED_REPLAYCONTEXT_IMP() \
	CSharedReplayContext	*m_pShared; \
	virtual bool			IsInitialized() const		{ return m_pShared && m_pShared->IsInitialized(); } \
	virtual const char		*GetRelativeBaseDir() const	{ return m_pShared->GetRelativeBaseDir(); } \
	virtual const char		*GetBaseDir() const			{ return m_pShared->GetBaseDir(); } \
	virtual const char		*GetReplaySubDir() const	{ return m_pShared->GetReplaySubDir(); } \
	virtual IReplayErrorSystem	*GetErrorSystem()		{ return m_pShared->m_pErrorSystem; } \
	virtual IRecordingSessionManager	*GetRecordingSessionManager() \
	{ \
		return m_pShared->m_pRecordingSessionManager; \
	} \
	virtual CBaseRecordingSession *GetRecordingSession( ReplayHandle_t hSession ) \
	{ \
		return static_cast< CBaseRecordingSession * >( m_pShared->m_pRecordingSessionManager->Find( hSession ) ); \
	} \
	virtual CBaseRecordingSessionBlockManager *GetRecordingSessionBlockManager() \
	{ \
		return m_pShared->m_pRecordingSessionBlockManager; \
	}

//----------------------------------------------------------------------------------------

class CJob;

bool RunJobToCompletion( IThreadPool *pThreadPool, CJob *pJob );

//----------------------------------------------------------------------------------------

#endif	// SHARED_REPLAYCONTEXT_H