core/logic/intercom.h
author Nicholas Hastings <skamonkey@gmail.com>
Wed Oct 09 08:43:08 2013 -0400 (2013-10-09)
changeset 4138 da768ad428cf
parent 4045 2891bbc5932b
child 4139 de7d1cd00703
permissions -rw-r--r--
Move DBManager and DB natives from core to logic (bug 5953, r=fyren).
dvander@2726
     1
/**
dvander@3881
     2
 * vim: set ts=4 sw=4 tw=99 noet:
dvander@2726
     3
 * =============================================================================
dvander@2726
     4
 * SourceMod
dvander@2726
     5
 * Copyright (C) 2004-2009 AlliedModders LLC.  All rights reserved.
dvander@2726
     6
 * =============================================================================
dvander@2726
     7
 *
dvander@2726
     8
 * This program is free software; you can redistribute it and/or modify it under
dvander@2726
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
dvander@2726
    10
 * Free Software Foundation.
dvander@2726
    11
 * 
dvander@2726
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@2726
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@2726
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
dvander@2726
    15
 * details.
dvander@2726
    16
 *
dvander@2726
    17
 * You should have received a copy of the GNU General Public License along with
dvander@2726
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@2726
    19
 *
dvander@2726
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
dvander@2726
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@2726
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@2726
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
dvander@2726
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
dvander@2726
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
dvander@2726
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@2726
    27
 * or <http://www.sourcemod.net/license.php>.
dvander@2726
    28
 *
dvander@2726
    29
 * Version: $Id$
dvander@2726
    30
 */
dvander@2726
    31
dvander@3872
    32
#ifndef _INCLUDE_SOURCEMOD_INTERCOM_H_
dvander@3872
    33
#define _INCLUDE_SOURCEMOD_INTERCOM_H_
dvander@3872
    34
dvander@2726
    35
#include <sp_vm_api.h>
dvander@2726
    36
#include <IHandleSys.h>
dvander@2726
    37
#include <IShareSys.h>
dvander@3872
    38
#include <IPluginSys.h>
skamonkey@4138
    39
#include <IDBDriver.h>
dvander@3872
    40
#include <sh_string.h>
dvander@3872
    41
#include <sp_vm_api.h>
dvander@3872
    42
#include <sh_vector.h>
dvander@3872
    43
#include <IExtensionSys.h>
dvander@2726
    44
dvander@2726
    45
using namespace SourceMod;
dvander@3872
    46
using namespace SourcePawn;
dvander@3872
    47
using namespace SourceHook;
dvander@2726
    48
dvander@2726
    49
/**
dvander@2726
    50
 * Add 1 to the RHS of this expression to bump the intercom file
dvander@2726
    51
 * This is to prevent mismatching core/logic binaries
dvander@2726
    52
 */
systematicmania@4045
    53
#define SM_LOGIC_MAGIC		(0x0F47C0DE - 24)
dvander@2726
    54
dvander@2726
    55
#if defined SM_LOGIC
dvander@2726
    56
class IVEngineServer
dvander@2726
    57
#else
dvander@2726
    58
class IVEngineServer_Logic
dvander@2726
    59
#endif
dvander@2726
    60
{
dvander@2726
    61
public:
dvander@2726
    62
	virtual bool IsMapValid(const char *map) = 0;
dvander@3001
    63
	virtual void ServerCommand(const char *cmd) = 0;
dvander@2726
    64
};
dvander@2726
    65
voidedweasel@3929
    66
typedef int FileFindHandle_t; 
voidedweasel@3929
    67
voidedweasel@3929
    68
#if defined SM_LOGIC
voidedweasel@3929
    69
class IFileSystem
voidedweasel@3929
    70
#else
voidedweasel@3929
    71
class IFileSystem_Logic
voidedweasel@3929
    72
#endif
voidedweasel@3929
    73
{
voidedweasel@3929
    74
public:
voidedweasel@3929
    75
	virtual const char *FindFirstEx(const char *pWildCard, const char *pPathID, FileFindHandle_t *pHandle) = 0;
voidedweasel@3929
    76
	virtual const char *FindNext(FileFindHandle_t handle) = 0;
voidedweasel@3929
    77
	virtual void FindClose(FileFindHandle_t handle) = 0;
voidedweasel@3929
    78
};
voidedweasel@3929
    79
dvander@2726
    80
namespace SourceMod
dvander@2726
    81
{
dvander@2726
    82
	class ISourceMod;
dvander@2726
    83
	class ILibrarySys;
dvander@2726
    84
	class ITextParsers;
dvander@2726
    85
	class IThreader;
dvander@2728
    86
	class IRootConsole;
dvander@2728
    87
	class IPluginManager;
dvander@2730
    88
	class IForwardManager;
dvander@2989
    89
	class ITimerSystem;
dvander@2996
    90
	class IPlayerManager;
dvander@3000
    91
	class IAdminSystem;
dvander@3001
    92
	class IGameHelpers;
dvander@3004
    93
	class IPhraseCollection;
dvander@3004
    94
	class ITranslator;
dvander@3010
    95
	class IGameConfig;
dvander@2726
    96
}
dvander@2726
    97
dvander@2726
    98
class IVEngineServer;
voidedweasel@3929
    99
class IFileSystem;
dvander@2726
   100
class ConVar;
skamonkey@4138
   101
class KeyValues;
dvander@3872
   102
class SMGlobalClass;
dvander@3872
   103
dvander@3872
   104
namespace SourceMod
dvander@3872
   105
{
dvander@3872
   106
	class IChangeableForward;
dvander@3872
   107
}
dvander@2726
   108
dvander@2989
   109
struct ServerGlobals
dvander@2989
   110
{
dvander@2989
   111
	const double *universalTime;
dvander@2989
   112
	float *interval_per_tick;
dvander@2989
   113
	float *frametime;
dvander@2989
   114
};
dvander@2989
   115
dvander@3872
   116
struct AutoConfig
dvander@3872
   117
{
dvander@3872
   118
	SourceHook::String autocfg;
dvander@3872
   119
	SourceHook::String folder;
dvander@3872
   120
	bool create;
dvander@3872
   121
};
dvander@3872
   122
dvander@3872
   123
enum LibraryAction
dvander@3872
   124
{
dvander@3872
   125
	LibraryAction_Removed,
dvander@3872
   126
	LibraryAction_Added
dvander@3872
   127
};
dvander@3872
   128
dvander@3872
   129
class CNativeOwner;
dvander@3872
   130
dvander@3872
   131
class SMPlugin : public IPlugin
dvander@3872
   132
{
dvander@3872
   133
public:
dvander@3872
   134
	virtual size_t GetConfigCount() = 0;
dvander@3872
   135
	virtual AutoConfig *GetConfig(size_t i) = 0;
dvander@3872
   136
	virtual void AddLibrary(const char *name) = 0;
dvander@3872
   137
	virtual void AddConfig(bool create, const char *cfg, const char *folder) = 0;
dvander@3872
   138
	virtual void SetErrorState(PluginStatus status, const char *fmt, ...) = 0;
dvander@3872
   139
};
dvander@3872
   140
dvander@3872
   141
class IScriptManager
dvander@3872
   142
{
dvander@3872
   143
public:
dvander@3872
   144
	virtual void LoadAll(const char *config_path, const char *plugins_path) = 0;
dvander@3872
   145
	virtual void RefreshAll() = 0;
dvander@3872
   146
	virtual void Shutdown() = 0;
dvander@3872
   147
	virtual IdentityToken_t *GetIdentity() = 0;
dvander@3872
   148
	virtual void SyncMaxClients(int maxClients) = 0;
dvander@3872
   149
	virtual void AddPluginsListener(IPluginsListener *listener) = 0;
dvander@3872
   150
	virtual void RemovePluginsListener(IPluginsListener *listener) = 0;
dvander@3872
   151
	virtual IPluginIterator *GetPluginIterator() = 0;
dvander@3872
   152
	virtual void OnLibraryAction(const char *name, LibraryAction action) = 0;
dvander@3872
   153
	virtual bool LibraryExists(const char *name) = 0;
dvander@3872
   154
	virtual SMPlugin *FindPluginByOrder(unsigned num) = 0;
dvander@3872
   155
	virtual SMPlugin *FindPluginByIdentity(IdentityToken_t *ident) = 0;
dvander@3872
   156
	virtual SMPlugin *FindPluginByContext(IPluginContext *ctx) = 0;
dvander@3872
   157
	virtual SMPlugin *FindPluginByContext(sp_context_t *ctx) = 0;
dvander@3872
   158
	virtual SMPlugin *FindPluginByConsoleArg(const char *text) = 0;
dvander@3872
   159
	virtual SMPlugin *FindPluginByHandle(Handle_t hndl, HandleError *errp) = 0;
dvander@3872
   160
	virtual bool UnloadPlugin(IPlugin *plugin) = 0;
dvander@3881
   161
	virtual const CVector<SMPlugin *> *ListPlugins() = 0;
dvander@3881
   162
	virtual void FreePluginList(const CVector<SMPlugin *> *list) = 0;
dvander@3872
   163
	virtual void AddFunctionsToForward(const char *name, IChangeableForward *fwd) = 0;
dvander@3872
   164
};
dvander@3872
   165
dvander@3872
   166
class IExtensionSys : public IExtensionManager
dvander@3872
   167
{
dvander@3872
   168
public:
systematicmania@4045
   169
	virtual IExtension *LoadAutoExtension(const char *name, bool bErrorOnMissing=true) = 0;
dvander@3872
   170
	virtual void TryAutoload() = 0;
dvander@3872
   171
	virtual void Shutdown() = 0;
dvander@3872
   172
	virtual IExtension *FindExtensionByFile(const char *name) = 0;
dvander@3872
   173
	virtual bool LibraryExists(const char *name) = 0;
dvander@3872
   174
	virtual void CallOnCoreMapStart(edict_t *edictList, int edictCount, int maxClients) = 0;
dvander@3872
   175
	virtual IExtension *GetExtensionFromIdent(IdentityToken_t *token) = 0;
dvander@3872
   176
	virtual void BindChildPlugin(IExtension *ext, SMPlugin *plugin) = 0;
dvander@3872
   177
	virtual void AddRawDependency(IExtension *myself, IdentityToken_t *token, void *iface) = 0;
dvander@3881
   178
	virtual const CVector<IExtension *> *ListExtensions() = 0;
dvander@3881
   179
	virtual void FreeExtensionList(const CVector<IExtension *> *list) = 0;
dvander@3881
   180
};
dvander@3881
   181
dvander@3881
   182
class AutoPluginList
dvander@3881
   183
{
dvander@3881
   184
public:
dvander@3881
   185
	AutoPluginList(IScriptManager *scripts)
dvander@3881
   186
		: scripts_(scripts), list_(scripts->ListPlugins())
dvander@3881
   187
	{
dvander@3881
   188
	}
dvander@3881
   189
	~AutoPluginList()
dvander@3881
   190
	{
dvander@3881
   191
		scripts_->FreePluginList(list_);
dvander@3881
   192
	}
dvander@3881
   193
	const CVector<SMPlugin *> *operator ->()
dvander@3881
   194
	{
dvander@3881
   195
		return list_;
dvander@3881
   196
	}
dvander@3881
   197
private:
dvander@3881
   198
	IScriptManager *scripts_;
dvander@3881
   199
	const CVector<SMPlugin *> *list_;
dvander@3881
   200
};
dvander@3881
   201
dvander@3881
   202
class AutoExtensionList
dvander@3881
   203
{
dvander@3881
   204
public:
dvander@3881
   205
	AutoExtensionList(IExtensionSys *extensions)
dvander@3881
   206
		: extensions_(extensions), list_(extensions_->ListExtensions())
dvander@3881
   207
	{
dvander@3881
   208
	}
dvander@3881
   209
	~AutoExtensionList()
dvander@3881
   210
	{
dvander@3881
   211
		extensions_->FreeExtensionList(list_);
dvander@3881
   212
	}
dvander@3881
   213
	const CVector<IExtension *> *operator ->()
dvander@3881
   214
	{
dvander@3881
   215
		return list_;
dvander@3881
   216
	}
dvander@3881
   217
private:
dvander@3881
   218
	IExtensionSys *extensions_;
dvander@3881
   219
	const CVector<IExtension *> *list_;
dvander@3872
   220
};
dvander@3872
   221
dvander@3872
   222
class CCommand;
dvander@3872
   223
dvander@2726
   224
struct sm_core_t
dvander@2726
   225
{
dvander@2726
   226
	/* Objects */
dvander@2726
   227
	ISourceMod		*sm;
dvander@2726
   228
	ILibrarySys		*libsys;
dvander@2726
   229
	IVEngineServer	*engine;
voidedweasel@3929
   230
	IFileSystem		*filesystem;
dvander@2728
   231
	IRootConsole	*rootmenu;
dvander@2730
   232
	IForwardManager	*forwardsys;
dvander@2989
   233
	ITimerSystem    *timersys;
dvander@2996
   234
	IPlayerManager  *playerhelpers;
dvander@3000
   235
	IAdminSystem	*adminsys;
dvander@3010
   236
	IGameHelpers    *gamehelpers;
skamonkey@3800
   237
	ISourcePawnEngine **spe1;
skamonkey@3800
   238
	ISourcePawnEngine2 **spe2;
dvander@2726
   239
	/* Functions */
dvander@2726
   240
	ConVar *		(*FindConVar)(const char*);
dvander@2726
   241
	unsigned int	(*strncopy)(char*, const char*, size_t);
dvander@2726
   242
	char *			(*TrimWhitespace)(char *, size_t &);
dvander@2726
   243
	void			(*LogError)(const char*, ...);
dvander@3872
   244
	void			(*LogFatal)(const char*, ...);
dvander@3791
   245
	void			(*Log)(const char*, ...);
dvander@3791
   246
	void			(*LogToFile)(FILE *fp, const char*, ...);
dvander@3791
   247
	void			(*LogToGame)(const char *message);
dvander@3791
   248
	bool			(*FileExists)(const char *path);
dvander@2726
   249
	const char *	(*GetCvarString)(ConVar*);
dvander@2726
   250
	size_t			(*Format)(char*, size_t, const char*, ...);
dvander@3792
   251
	size_t			(*FormatArgs)(char*, size_t, const char*,va_list ap);
dvander@3004
   252
	bool			(*gnprintf)(char *, size_t, const char *, IPhraseCollection *, void **,
dvander@3004
   253
	                            unsigned int, unsigned int &, size_t *, const char **);
dvander@3006
   254
	size_t			(*atcprintf)(char *, size_t, const char *, IPluginContext *, const cell_t *, int *);
dvander@3010
   255
	bool            (*GetGameName)(char *buffer, size_t maxlength);
dvander@3010
   256
	const char *    (*GetGameDescription)();
dvander@3010
   257
	const char *    (*GetSourceEngineName)();
dvander@3010
   258
	bool            (*SymbolsAreHidden)();
fyrenmoo@3366
   259
	const char *	(*GetCoreConfigValue)(const char*);
dvander@3872
   260
	bool			(*IsMapLoading)();
dvander@3872
   261
	bool			(*IsMapRunning)();
dvander@3872
   262
	int				(*Argc)(const CCommand &args);
dvander@3872
   263
	const char *	(*Arg)(const CCommand &args, int arg);
dvander@3872
   264
	int				(*LoadMMSPlugin)(const char *file, bool *ok, char *error, size_t maxlength);
dvander@3872
   265
	void			(*UnloadMMSPlugin)(int id);
dvander@3872
   266
	void			(*DoGlobalPluginLoads)();
dvander@3872
   267
	bool			(*AreConfigsExecuted)();
dvander@3872
   268
	void			(*ExecuteConfigs)(IPluginContext *ctx);
skamonkey@4138
   269
	DatabaseInfo	(*GetDBInfoFromKeyValues)(KeyValues *);
dvander@3882
   270
	const char		*gamesuffix;
dvander@2989
   271
	/* Data */
dvander@2989
   272
	ServerGlobals   *serverGlobals;
dvander@3010
   273
	void *          serverFactory;
dvander@3010
   274
	void *          engineFactory;
skamonkey@3320
   275
	void *          matchmakingDSFactory;
dvander@4029
   276
	SMGlobalClass *	listeners;
dvander@2726
   277
};
dvander@2726
   278
dvander@2726
   279
struct sm_logic_t
dvander@2726
   280
{
dvander@2726
   281
	SMGlobalClass	*head;
dvander@2726
   282
	IThreader		*threader;
dvander@2728
   283
	IProfiler		*profiler;
dvander@3004
   284
	ITranslator		*translator;
dvander@3002
   285
	const char      *(*stristr)(const char *, const char *);
dvander@3004
   286
	bool			(*CoreTranslate)(char *,  size_t, const char *, unsigned int, size_t *, ...);
dvander@3004
   287
	void            (*AddCorePhraseFile)(const char *filename);
dvander@3005
   288
	unsigned int	(*ReplaceAll)(char*, size_t, const char *, const char *, bool);
dvander@3005
   289
	char            *(*ReplaceEx)(char *, size_t, const char *, size_t, const char *, size_t, bool);
dvander@3010
   290
	size_t          (*DecodeHexString)(unsigned char *, size_t, const char *);
dvander@3010
   291
	IGameConfig *   (*GetCoreGameConfig)();
dvander@3791
   292
	bool			(*OnLogPrint)(const char *msg);	// true to supercede
dvander@3792
   293
	IDebugListener   *debugger;
dvander@3792
   294
	void			(*GenerateError)(IPluginContext *, cell_t, int, const char *, ...);
dvander@3872
   295
	void			(*AddNatives)(sp_nativeinfo_t *natives);
dvander@3872
   296
	void			(*DumpHandles)(void (*dumpfn)(const char *fmt, ...));
dvander@3872
   297
	IScriptManager	*scripts;
dvander@3872
   298
	IShareSys		*sharesys;
dvander@3872
   299
	IExtensionSys	*extsys;
dvander@3872
   300
	IHandleSys		*handlesys;
dvander@3872
   301
	IdentityToken_t *core_ident;
dvander@3872
   302
	float			sentinel;
dvander@2726
   303
};
dvander@2726
   304
dvander@2726
   305
typedef void (*LogicInitFunction)(const sm_core_t *core, sm_logic_t *logic);
dvander@2726
   306
typedef LogicInitFunction (*LogicLoadFunction)(uint32_t magic);
dvander@2726
   307
typedef ITextParsers *(*GetITextParsers)();
dvander@2726
   308
dvander@2726
   309
#endif /* _INCLUDE_SOURCEMOD_INTERCOM_H_ */