summaryrefslogtreecommitdiff
path: root/dedicated/sys_windows.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /dedicated/sys_windows.cpp
downloadarchived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz
archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip
Diffstat (limited to 'dedicated/sys_windows.cpp')
-rw-r--r--dedicated/sys_windows.cpp411
1 files changed, 411 insertions, 0 deletions
diff --git a/dedicated/sys_windows.cpp b/dedicated/sys_windows.cpp
new file mode 100644
index 0000000..aacf0aa
--- /dev/null
+++ b/dedicated/sys_windows.cpp
@@ -0,0 +1,411 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <eh.h>
+#include "isys.h"
+#include "console/conproc.h"
+#include "dedicated.h"
+#include "engine_hlds_api.h"
+#include "checksum_md5.h"
+#include "tier0/vcrmode.h"
+#include "tier0/dbg.h"
+#include "tier1/strtools.h"
+#include "tier0/icommandline.h"
+#include "inputsystem/iinputsystem.h"
+#include "SteamAppStartup.h"
+#include "console/textconsole.h"
+#include "vgui/vguihelpers.h"
+#include "appframework/appframework.h"
+#include "materialsystem/imaterialsystem.h"
+#include "istudiorender.h"
+#include "vgui/ivgui.h"
+#include "console/TextConsoleWin32.h"
+#include "icvar.h"
+#include "datacache/idatacache.h"
+#include "datacache/imdlcache.h"
+#include "vphysics_interface.h"
+#include "filesystem.h"
+#include "steam/steam_api.h"
+#include "filesystem/IQueuedLoader.h"
+
+extern CTextConsoleWin32 console;
+extern bool g_bVGui;
+
+//-----------------------------------------------------------------------------
+// Purpose: Implements OS Specific layer ( loosely )
+//-----------------------------------------------------------------------------
+class CSys : public ISys
+{
+public:
+ virtual ~CSys( void );
+
+ 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 );
+
+ bool CreateConsoleWindow( void );
+ void DestroyConsoleWindow( void );
+
+ void ConsoleOutput ( char *string );
+ char *ConsoleInput ( int index, char *buf, int buflen );
+ void Printf( PRINTF_FORMAT_STRING const char *fmt, ... );
+};
+
+static CSys g_Sys;
+ISys *sys = &g_Sys;
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CSys::~CSys()
+{
+ sys = NULL;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : msec -
+//-----------------------------------------------------------------------------
+void CSys::Sleep( int msec )
+{
+ // Call ThreadSleep because it has the necessary magic to set the system
+ // timer resolution so that Sleep( 1 ) will sleep for one millisecond
+ // instead of for 10-16 ms.
+ ThreadSleep( msec );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *lib -
+// Output : long
+//-----------------------------------------------------------------------------
+long CSys::LoadLibrary( char *lib )
+{
+ void *hDll = ::LoadLibrary( lib );
+ return (long)hDll;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : library -
+//-----------------------------------------------------------------------------
+void CSys::FreeLibrary( long library )
+{
+ if ( !library )
+ return;
+
+ ::FreeLibrary( (HMODULE)library );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *out -
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CSys::GetExecutableName( char *out )
+{
+ if ( !::GetModuleFileName( ( HINSTANCE )GetModuleHandle( NULL ), out, 256 ) )
+ {
+ return false;
+ }
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : level -
+// *msg -
+//-----------------------------------------------------------------------------
+void CSys::ErrorMessage( int level, const char *msg )
+{
+ MessageBox( NULL, msg, "Half-Life", MB_OK );
+ PostQuitMessage(0);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : force -
+//-----------------------------------------------------------------------------
+void CSys::UpdateStatus( int force )
+{
+ static double tLast = 0.0;
+ double tCurrent;
+ char szPrompt[256];
+ int n, nMax;
+ char szMap[64];
+ char szHostname[128];
+ float fps;
+
+ if ( !engine )
+ return;
+
+ tCurrent = Sys_FloatTime();
+
+ if ( !force )
+ {
+ if ( ( tCurrent - tLast ) < 0.5f )
+ return;
+ }
+
+ tLast = tCurrent;
+
+ engine->UpdateStatus( &fps, &n, &nMax, szMap, sizeof( szMap ) );
+ engine->UpdateHostname( szHostname, sizeof( szHostname ) );
+
+ console.SetTitle( szHostname );
+
+ Q_snprintf( szPrompt, sizeof( szPrompt ), "%.1f fps %2i/%2i on map %16s", (float)fps, n, nMax, szMap);
+
+ console.SetStatusLine(szPrompt);
+ console.UpdateStatus();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *string -
+// Output : void CSys::ConsoleOutput
+//-----------------------------------------------------------------------------
+void CSys::ConsoleOutput (char *string)
+{
+ if ( g_bVGui )
+ {
+ VGUIPrintf( string );
+ }
+ else
+ {
+ console.Print(string);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *fmt -
+// ... -
+//-----------------------------------------------------------------------------
+void CSys::Printf( PRINTF_FORMAT_STRING 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 );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : char *
+//-----------------------------------------------------------------------------
+char *CSys::ConsoleInput ( int index, char *buf, int buflen )
+{
+ return console.GetLine( index, buf, buflen );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *szText -
+//-----------------------------------------------------------------------------
+void CSys::WriteStatusText( char *szText )
+{
+ SetConsoleTitle( szText );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CSys::CreateConsoleWindow( void )
+{
+ if ( !AllocConsole () )
+ {
+ return false;
+ }
+
+ InitConProc();
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CSys::DestroyConsoleWindow( void )
+{
+ FreeConsole ();
+
+ // shut down QHOST hooks if necessary
+ DeinitConProc ();
+}
+
+
+//-----------------------------------------------------------------------------
+// Loading modules used by the dedicated server.
+//-----------------------------------------------------------------------------
+bool CSys::LoadModules( CDedicatedAppSystemGroup *pAppSystemGroup )
+{
+ AppSystemInfo_t appSystems[] =
+ {
+ { "engine.dll", CVAR_QUERY_INTERFACE_VERSION }, // NOTE: This one must be first!!
+ { "inputsystem.dll", INPUTSYSTEM_INTERFACE_VERSION },
+ { "materialsystem.dll", MATERIAL_SYSTEM_INTERFACE_VERSION },
+ { "studiorender.dll", STUDIO_RENDER_INTERFACE_VERSION },
+ { "vphysics.dll", VPHYSICS_INTERFACE_VERSION },
+ { "datacache.dll", DATACACHE_INTERFACE_VERSION },
+ { "datacache.dll", MDLCACHE_INTERFACE_VERSION },
+ { "datacache.dll", STUDIO_DATA_CACHE_INTERFACE_VERSION },
+ { "vgui2.dll", VGUI_IVGUI_INTERFACE_VERSION },
+ { "engine.dll", VENGINE_HLDS_API_VERSION },
+ { "dedicated.dll", QUEUEDLOADER_INTERFACE_VERSION },
+ { "", "" } // Required to terminate the list
+ };
+
+ if ( !pAppSystemGroup->AddSystems( appSystems ) )
+ return false;
+
+ engine = (IDedicatedServerAPI *)pAppSystemGroup->FindSystem( VENGINE_HLDS_API_VERSION );
+
+ IMaterialSystem* pMaterialSystem = (IMaterialSystem*)pAppSystemGroup->FindSystem( MATERIAL_SYSTEM_INTERFACE_VERSION );
+ pMaterialSystem->SetShaderAPI( "shaderapiempty.dll" );
+ return true;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+bool NET_Init( void )
+{
+ // Startup winock
+ WORD version = MAKEWORD( 1, 1 );
+ WSADATA wsaData;
+
+ int err = WSAStartup( version, &wsaData );
+ if ( err != 0 )
+ {
+ char msg[ 256 ];
+ Q_snprintf( msg, sizeof( msg ), "Winsock 1.1 unavailable...\n" );
+ sys->Printf( "%s", msg );
+ Plat_DebugString( msg );
+ return false;
+ }
+ return true;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void NET_Shutdown( void )
+{
+ // Kill winsock
+ WSACleanup();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : hInstance -
+// hPrevInstance -
+// lpszCmdLine -
+// nCmdShow -
+// Output : int PASCAL
+//-----------------------------------------------------------------------------
+int main(int argc, char **argv); // in sys_ded.cpp
+static char *GetBaseDir( const char *pszBuffer )
+{
+ static char basedir[ MAX_PATH ];
+ char szBuffer[ MAX_PATH ];
+ int j;
+ char *pBuffer = NULL;
+
+ V_strcpy_safe( szBuffer, pszBuffer );
+
+ pBuffer = strrchr( szBuffer,'\\' );
+ if ( pBuffer )
+ {
+ *(pBuffer+1) = '\0';
+ }
+
+ strcpy( basedir, szBuffer );
+
+ j = strlen( basedir );
+ if (j > 0)
+ {
+ if ( ( basedir[ j-1 ] == '\\' ) ||
+ ( basedir[ j-1 ] == '/' ) )
+ {
+ basedir[ j-1 ] = 0;
+ }
+ }
+
+ return basedir;
+}
+
+void MiniDumpFunction( unsigned int nExceptionCode, EXCEPTION_POINTERS *pException )
+{
+ SteamAPI_WriteMiniDump( nExceptionCode, pException, 0 );
+}
+
+extern "C" __declspec(dllexport) int DedicatedMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
+{
+ SetAppInstance( hInstance );
+
+ // Check that we are running on Win32
+ OSVERSIONINFO vinfo;
+ vinfo.dwOSVersionInfoSize = sizeof(vinfo);
+
+ if ( !GetVersionEx ( &vinfo ) )
+ return -1;
+
+ if ( vinfo.dwPlatformId == VER_PLATFORM_WIN32s )
+ return -1;
+
+ int argc, iret = -1;
+ LPWSTR * argv= CommandLineToArgvW(GetCommandLineW(),&argc);
+ CommandLine()->CreateCmdLine( VCRHook_GetCommandLine() );
+
+ if ( !Plat_IsInDebugSession() && !CommandLine()->FindParm( "-nominidumps") )
+ {
+ // This warning only applies if you want to catch structured exceptions (crashes)
+ // using C++ exceptions. We do not want to do that so we can build with C++ exceptions
+ // completely disabled, and just suppress this warning.
+ // warning C4535: calling _set_se_translator() requires /EHa
+ #pragma warning( suppress : 4535 )
+ _set_se_translator( MiniDumpFunction );
+
+ try // this try block allows the SE translator to work
+ {
+ iret = main(argc,(char **)argv);
+ }
+ catch( ... )
+ {
+ return -1;
+ }
+ }
+ else
+ {
+ iret = main(argc,(char **)argv);
+ }
+
+ GlobalFree( argv );
+ return iret;
+}
+