summaryrefslogtreecommitdiff
path: root/public/gcsdk/gcinterface.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/gcsdk/gcinterface.h')
-rw-r--r--public/gcsdk/gcinterface.h181
1 files changed, 181 insertions, 0 deletions
diff --git a/public/gcsdk/gcinterface.h b/public/gcsdk/gcinterface.h
new file mode 100644
index 0000000..f29f760
--- /dev/null
+++ b/public/gcsdk/gcinterface.h
@@ -0,0 +1,181 @@
+//====== Copyright �, Valve Corporation, All rights reserved. =================
+//
+// Purpose: Defines the GC interface exposed to the host
+//
+//=============================================================================
+
+
+#ifndef GCINTERFACE_H
+#define GCINTERFACE_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "gamecoordinator/igamecoordinator.h"
+#include "gamecoordinator/igamecoordinatorhost.h"
+
+namespace GCSDK
+{
+class CGCDirProcess;
+class CGCBase;
+
+//-----------------------------------------------------------------------------
+// Purpose: Defines the GC interface exposed to the host. This is here to find
+// out from the host which actual GC class to instantiate, and to pass through
+// all other calls
+//-----------------------------------------------------------------------------
+class CGCInterface : public IGameCoordinator
+{
+public:
+ CGCInterface();
+ ~CGCInterface();
+
+ //message sources that we tag message tracking with so they can be filtered accordingly
+ enum EMsgSource
+ {
+ eMsgSource_System = ( 1 << 0 ),
+ eMsgSource_Client = ( 1 << 1 ),
+ eMsgSource_GC = ( 1 << 2 ),
+ };
+
+ // Simple accessors
+ IGameCoordinator *GetGC();
+
+ AppId_t GetAppID() const;
+ const char *GetDebugName() const;
+ EUniverse GetUniverse() const;
+ bool BIsDevMode() const;
+ const char *GetGCDLLPath() const;
+ //returns the process ID of the parent process, or 0 if it isn't specified
+ HANDLE GetParentProcess() const { return m_hParentProcess; }
+
+ // Exposed functions from IGameCoordinatorHost
+ bool BProcessSystemMessage( uint32 unGCSysMsgType, const void *pubData, uint32 cubData );
+ bool BSendMessageToClient( uint64 ullSteamID, uint32 unMsgType, const void *pubData, uint32 cubData );
+ bool BSendMessageToGC( int iGCServerIDTarget, uint32 unMsgType, const void *pubData, uint32 cubData );
+ void EmitSpew( const char *pchGroupName, SpewType_t spewType, int iSpewLevel, int iLevelLog, const char *pchMsg );
+ void AsyncSQLQuery( IGCSQLQuery *pQuery, int eSchemaCatalog );
+ void SetStartupComplete( bool bSuccess );
+ void SetShutdownComplete();
+
+ // Additional services
+ uint64 GenerateGID();
+ static uint32 GetGCDirIndexFromGID( GID_t gid );
+ bool BSaveConvars();
+ void RecordAssert( const char *pchFile, int nLine, const char *pchMessage, bool *pbShouldWriteMinidump );
+ CSteamID ConstructSteamIDForClient( AccountID_t unAccountID ) const;
+
+ // Implementation of IGameCoordinator
+ virtual bool BAsyncInit( uint32 unAppID, const char *pchDebugName, int iGCIndex, IGameCoordinatorHost *pHost ) OVERRIDE;
+ virtual bool BMainLoopOncePerFrame( uint64 ulLimitMicroseconds ) OVERRIDE;
+ virtual bool BMainLoopUntilFrameCompletion( uint64 ulLimitMicroseconds ) OVERRIDE;
+ virtual bool BAsyncShutdown() OVERRIDE;
+ virtual void Unload() OVERRIDE;
+ virtual void HandleMessageFromClient( uint64 ullSenderID, uint32 unMsgType, void *pubData, uint32 cubData ) OVERRIDE;
+ virtual void HandleMessageFromSystem( uint32 unGCSysMsgType, void *pubData, uint32 cubData ) OVERRIDE;
+ virtual void HandleMessageFromGC( int iGCServerIDSender, uint32 unMsgType, void *pubData, uint32 cubData ) OVERRIDE;
+
+ // Allows temporary capturing of log spew for ease of generating alerts
+ void StartLogCapture();
+ void EndLogCapture();
+ const CUtlVector<CUtlString> *GetLogCapture();
+ void ClearLogCapture();
+
+ //the current version of the GC used for reporting purposes only
+ uint32 GetVersion() const { return m_nVersion; }
+ const char* GetMachineName() const { return m_sMachineName; }
+
+ //provides access to the name of the binary for this GC for development builds. This is blank for non-development builds
+ const char* GetDevBinaryName() const { return m_sDevBinaryName; }
+
+ //access to stats recorded about various asserts triggered in the system
+ struct AssertInfo_t
+ {
+ //the line the assert fired from
+ uint32 m_nLine;
+ //how many actually fired and recorded
+ uint32 m_nTotalFired;
+ uint32 m_nTotalRecorded;
+ //how many fired since the last clear
+ uint32 m_nWindowFired;
+ //the string associated with the first firing
+ CUtlString m_sMsg;
+ //the times we recorded last
+ CUtlVector< RTime32 > m_vRecordTimes;
+ };
+ typedef CUtlDict< CUtlVector< AssertInfo_t* >* > AssertInfoDict_t;
+ const AssertInfoDict_t& GetAssertInfo() const { return m_dictAsserts; }
+
+ //called to reset the assert window, this is useful for tracking how many asserts fired within a specific time range
+ void ClearAssertWindowCounts();
+
+ //called to add a substring that console output will be filtered against. This is only intended for urgent text squelching
+ void AddBlockEmitString( const char* pszStr, bool bBlockConsole, bool bBlockLog );
+ void ClearBlockEmitStrings();
+
+ //asserts are always rate limited. If you absolutely need to avoid that, you can use this object to force asserts to be recorded regardless of rate limiting
+ class CDisableAssertRateLimit
+ {
+ public:
+ CDisableAssertRateLimit() { s_nDisabledCount++; }
+ ~CDisableAssertRateLimit() { s_nDisabledCount--; }
+ static int32 s_nDisabledCount;
+ };
+
+private:
+
+ //the list of substrings we want to filter text based upon
+ struct BlockString_t
+ {
+ CUtlString m_sStr;
+ bool m_bBlockLog;
+ bool m_bBlockConsole;
+ };
+ CUtlVector< BlockString_t* > m_BlockEmitStrings;
+
+ //called to clear all existing assert stats
+ void ClearAssertInfo();
+
+ //this will handle loading the config file for the GC and initializing the directory, and will return the config key values
+ //so that it can be used to load the convars from
+ bool BReadConfigDirectory( KeyValuesAD& configValues );
+
+ //handles loading in the convars from the key values loaded with BReadConfigDirectory, and will setup the convars based upon
+ //what GC type this is
+ bool BReadConvars( KeyValuesAD& configValues );
+ void InitConVars( KeyValues *pkvConvars );
+
+ IGameCoordinatorHost *m_pGCHost;
+ CGCBase *m_pGC;
+ const CGCDirProcess *m_pGCDirProcess;
+
+ //the version of the GC. This is for reporting purposes only, and will be zero for development builds
+ uint32 m_nVersion;
+
+ AppId_t m_nAppID;
+ CUtlConstString m_sDebugName;
+ EUniverse m_eUniverse;
+ bool m_bDevMode;
+ CUtlConstString m_sGCDLLPath;
+
+ uint64 m_ullGID;
+ HANDLE m_hParentProcess;
+
+ //all the asserts that have fired
+ AssertInfoDict_t m_dictAsserts;
+
+ CUtlVector<CUtlString> m_vecLogCapture;
+ bool m_bLogCaptureEnabled;
+
+ //the name of the binary, set for development build
+ CUtlString m_sDevBinaryName;
+
+ //the name of the machine we are running on
+ CUtlString m_sMachineName;
+};
+
+extern CGCInterface *GGCInterface();
+
+} // namespace GCSDK
+
+#endif // GCINTERFACE_H