//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
# include <unistd.h>
# include <string.h>
# include <dlfcn.h>
# include <stdarg.h>
# include <sys/types.h>
# include <sys/time.h>
# ifdef OSX
# include <malloc/malloc.h>
# else
# include <malloc.h>
# endif
# include <stdio.h>
# include <stdlib.h>
# include <dlfcn.h>
# include "isys.h"
# include "console/conproc.h"
# include "dedicated.h"
# include "engine_hlds_api.h"
# include "checksum_md5.h"
# include "idedicatedexports.h"
# include "tier0/vcrmode.h"
# include "tier0/dbg.h"
# include "mathlib/mathlib.h"
# include "interface.h"
# include "tier1/strtools.h"
# include "tier0/icommandline.h"
# include "materialsystem/imaterialsystem.h"
# include "istudiorender.h"
# include "SoundEmitterSystem/isoundemittersystembase.h"
# include "datacache/idatacache.h"
# include "datacache/imdlcache.h"
# include "vphysics_interface.h"
# include "icvar.h"
# include "filesystem/IQueuedLoader.h"
# include "console/TextConsoleUnix.h"
bool InitInstance ( ) ;
char g_szEXEName [ MAX_PATH ] ;
extern CTextConsoleUnix console ;
//-----------------------------------------------------------------------------
// Purpose: Implements OS Specific layer ( loosely )
//-----------------------------------------------------------------------------
class CSys : public ISys
{
public :
virtual ~ CSys ( ) ;
virtual bool LoadModules ( CDedicatedAppSystemGroup * pAppSystemGroup ) ;
void Sleep ( int msec ) ;
bool GetExecutableName ( char * out ) ;
void ErrorMessage ( int level , const char * msg ) ;
void WriteStatusText ( char * szText ) ;
void UpdateStatus ( int force ) ;
long LoadLibrary ( char * lib ) ;
void FreeLibrary ( long library ) ;
void * GetProcAddress ( long library , const char * name ) ;
bool CreateConsoleWindow ( void ) ;
void DestroyConsoleWindow ( void ) ;
void ConsoleOutput ( char * string ) ;
char * ConsoleInput ( int index , char * buf , int buflen ) ;
void Printf ( const char * fmt , . . . ) ;
} ;
static CSys g_Sys ;
ISys * sys = & g_Sys ;
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
CSys : : ~ CSys ( )
{
sys = NULL ;
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : msec
// Output :
//-----------------------------------------------------------------------------
void CSys : : Sleep ( int msec )
{
usleep ( msec * 1000 ) ;
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : handle, function name-
// Output : void *
//-----------------------------------------------------------------------------
void * CSys : : GetProcAddress ( long library , const char * name )
{
return dlsym ( library , name ) ;
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : *lib -
// Output : long
//-----------------------------------------------------------------------------
long CSys : : LoadLibrary ( char * lib )
{
void * hDll = NULL ;
char cwd [ 1024 ] ;
char absolute_lib [ 1024 ] ;
if ( ! getcwd ( cwd , sizeof ( cwd ) ) )
ErrorMessage ( 1 , " Sys_LoadLibrary: Couldn't determine current directory. " ) ;
if ( cwd [ strlen ( cwd ) - 1 ] = = ' / ' )
cwd [ strlen ( cwd ) - 1 ] = 0 ;
Q_snprintf ( absolute_lib , sizeof ( absolute_lib ) , " %s/%s " , cwd , lib ) ;
hDll = dlopen ( absolute_lib , RTLD_NOW ) ;
if ( ! hDll )
{
ErrorMessage ( 1 , dlerror ( ) ) ;
}
return ( long ) hDll ;
}
void CSys : : FreeLibrary ( long library )
{
if ( ! library )
return ;
dlclose ( ( void * ) library ) ;
}
bool CSys : : GetExecutableName ( char * out )
{
char * name = strrchr ( g_szEXEName , ' / ' ) ;
if ( name )
{
strcpy ( out , name + 1 ) ;
return true ;
}
else
{
return false ;
}
}
/*
= = = = = = = = = = = = = =
ErrorMessage
Engine is erroring out , display error in message box
= = = = = = = = = = = = = =
*/
void CSys : : ErrorMessage ( int level , const char * msg )
{
Error ( " %s \n " , msg ) ;
exit ( - 1 ) ;
}
void CSys : : UpdateStatus ( int force )
{
}
/*
= = = = = = = = = = = = = = = =
ConsoleOutput
Print text to the dedicated console
= = = = = = = = = = = = = = = =
*/
void CSys : : ConsoleOutput ( char * string )
{
console . Print ( string ) ;
}
/*
= = = = = = = = = = = = = =
Printf
Engine is printing to console
= = = = = = = = = = = = = =
*/
void CSys : : Printf ( const char * fmt , . . . )
{
// Dump text to debugging console.
va_list argptr ;
char szText [ 1024 ] ;
va_start ( argptr , fmt ) ;
Q_vsnprintf ( szText , sizeof ( szText ) , fmt , argptr ) ;
va_end ( argptr ) ;
// Get Current text and append it.
ConsoleOutput ( szText ) ;
}
/*
= = = = = = = = = = = = = = = =
ConsoleInput
= = = = = = = = = = = = = = = =
*/
char * CSys : : ConsoleInput ( int index , char * buf , int buflen )
{
return console . GetLine ( index , buf , buflen ) ;
}
/*
= = = = = = = = = = = = = =
WriteStatusText
= = = = = = = = = = = = = =
*/
void CSys : : WriteStatusText ( char * szText )
{
}
/*
= = = = = = = = = = = = = =
CreateConsoleWindow
Create console window ( overridable ? )
= = = = = = = = = = = = = =
*/
bool CSys : : CreateConsoleWindow ( void )
{
return true ;
}
/*
= = = = = = = = = = = = = =
DestroyConsoleWindow
= = = = = = = = = = = = = =
*/
void CSys : : DestroyConsoleWindow ( void )
{
}
/*
= = = = = = = = = = = = = = = =
GameInit
= = = = = = = = = = = = = = = =
*/
bool CSys : : LoadModules ( CDedicatedAppSystemGroup * pAppSystemGroup )
{
AppSystemInfo_t appSystems [ ] =
{
{ " engine " DLL_EXT_STRING , CVAR_QUERY_INTERFACE_VERSION } ,
{ " soundemittersystem " DLL_EXT_STRING , SOUNDEMITTERSYSTEM_INTERFACE_VERSION } , // loaded for backwards compatability, prevents crash on exit for old game dlls
{ " materialsystem " DLL_EXT_STRING , MATERIAL_SYSTEM_INTERFACE_VERSION } ,
{ " studiorender " DLL_EXT_STRING , STUDIO_RENDER_INTERFACE_VERSION } ,
{ " vphysics " DLL_EXT_STRING , VPHYSICS_INTERFACE_VERSION } ,
{ " datacache " DLL_EXT_STRING , DATACACHE_INTERFACE_VERSION } ,
{ " datacache " DLL_EXT_STRING , MDLCACHE_INTERFACE_VERSION } ,
{ " datacache " DLL_EXT_STRING , STUDIO_DATA_CACHE_INTERFACE_VERSION } ,
{ " dedicated " DLL_EXT_STRING , QUEUEDLOADER_INTERFACE_VERSION } ,
{ " engine " DLL_EXT_STRING , VENGINE_HLDS_API_VERSION } ,
{ " " , " " } // Required to terminate the list
} ;
if ( ! pAppSystemGroup - > AddSystems ( appSystems ) )
return false ;
engine = ( IDedicatedServerAPI * ) pAppSystemGroup - > FindSystem ( VENGINE_HLDS_API_VERSION ) ;
// obsolete i think SetCVarIF( (ICvar*)pAppSystemGroup->FindSystem( VENGINE_CVAR_INTERFACE_VERSION ) );
IMaterialSystem * pMaterialSystem = ( IMaterialSystem * ) pAppSystemGroup - > FindSystem ( MATERIAL_SYSTEM_INTERFACE_VERSION ) ;
pMaterialSystem - > SetShaderAPI ( " shaderapiempty " DLL_EXT_STRING ) ;
return true ;
}
bool NET_Init ( )
{
return true ;
}
void NET_Shutdown ( )
{
}
extern int main ( int argc , char * argv [ ] ) ;
DLL_EXPORT int DedicatedMain ( int argc , char * argv [ ] ) ;
int DedicatedMain ( int argc , char * argv [ ] )
{
return main ( argc , argv ) ;
}