//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Expose functions from sys_dll.cpp.
//
// $NoKeywords: $
//=============================================================================//

#ifndef SYS_DLL_H
#define SYS_DLL_H

#ifdef _WIN32
#pragma once
#endif

#include "interface.h"

//-----------------------------------------------------------------------------
// Forward declarations
//-----------------------------------------------------------------------------
class IHammer;
class IDataCache;
class IPhysics;
class IMDLCache;
class IMatSystemSurface;
class IVideoServices;
class IVideoRecorder;
class IInputSystem;
class IDedicatedExports;
class ISoundEmitterSystemBase;

typedef unsigned short AVIHandle_t;


//-----------------------------------------------------------------------------
// Class factories
//-----------------------------------------------------------------------------
// This factory gets to many of the major app-single systems,
// including the material system, vgui, vgui surface, the file system.
extern CreateInterfaceFn g_AppSystemFactory;

// this factory connect the AppSystemFactory + client.dll + gameui.dll
extern CreateInterfaceFn g_GameSystemFactory;


//-----------------------------------------------------------------------------
// Singleton interfaces
//-----------------------------------------------------------------------------
extern IHammer *g_pHammer;
extern IDataCache *g_pDataCache;
extern IPhysics *g_pPhysics;
extern IMDLCache *g_pMDLCache;
extern IMatSystemSurface *g_pMatSystemSurface;
extern IInputSystem *g_pInputSystem;
extern IVideoServices *g_pVideo;
extern IDedicatedExports *dedicated;

//-----------------------------------------------------------------------------
// Other singletons
//-----------------------------------------------------------------------------
extern IVideoRecorder *g_pVideoRecorder;

inline bool InEditMode()
{
	return g_pHammer != NULL;
}

struct modinfo_t
{
	char szInfo[ 256 ];
	char szDL  [ 256 ];
	char szHLVersion[ 32 ];
	int version;
	int size;
	bool svonly;
	bool cldll;
};

extern modinfo_t gmodinfo;

void LoadEntityDLLs( const char *szBaseDir, bool bIsServerOnly );
void UnloadEntityDLLs( void );

// This returns true if someone called Error() or Sys_Error() and we're exiting.
// Since we call exit() from inside those, some destructors need to be safe and not crash.
bool IsInErrorExit();

// error message
bool Sys_MessageBox(const char *title, const char *info, bool bShowOkAndCancel);

bool ServerDLL_Load( bool bIsServerOnly );
void ServerDLL_Unload();

typedef uint32 AppId_t;

// steam.inf information.
struct SteamInfVersionInfo_t
{
	int32 ClientVersion; // PatchVersion
	int32 ServerVersion; // ServerVersion
	char szVersionString[ 32 ]; // PatchVersion string
	char szProductString[ 32 ]; // ProductName string

	AppId_t AppID; // Steam AppID. Read from steam.inf(AppID) or gameinfo.txt(SteamAppId)
	AppId_t ServerAppID; // ServerAppID. Used for dedicated server crash reporting.
};
const SteamInfVersionInfo_t& GetSteamInfIDVersionInfo();

extern CreateInterfaceFn g_ServerFactory;

#endif