extensions/batsupport/smsdk_ext.cpp
author David Anderson <dvander@alliedmods.net>
Tue Feb 27 08:21:01 2007 +0000 (2007-02-27)
changeset 542 4a7c23cfa070
permissions -rw-r--r--
implemented wrapper around BAT's AdminInterface
dvander@542
     1
/**
dvander@542
     2
 * vim: set ts=4 :
dvander@542
     3
 * ===============================================================
dvander@542
     4
 * SourceMod, Copyright (C) 2004-2007 AlliedModders LLC. 
dvander@542
     5
 * All rights reserved.
dvander@542
     6
 * ===============================================================
dvander@542
     7
 *
dvander@542
     8
 *  This file is part of the SourceMod/SourcePawn SDK.  This file may only be used 
dvander@542
     9
 * or modified under the Terms and Conditions of its License Agreement, which is found 
dvander@542
    10
 * in LICENSE.txt.  The Terms and Conditions for making SourceMod extensions/plugins 
dvander@542
    11
 * may change at any time.  To view the latest information, see:
dvander@542
    12
 *   http://www.sourcemod.net/license.php
dvander@542
    13
 *
dvander@542
    14
 * Version: $Id$
dvander@542
    15
 */
dvander@542
    16
dvander@542
    17
#include <stdio.h>
dvander@542
    18
#include <malloc.h>
dvander@542
    19
#include "smsdk_ext.h"
dvander@542
    20
dvander@542
    21
/**
dvander@542
    22
 * @file smsdk_ext.cpp
dvander@542
    23
 * @brief Contains wrappers for making Extensions easier to write.
dvander@542
    24
 */
dvander@542
    25
dvander@542
    26
IShareSys *g_pShareSys = NULL;			/**< Share system */
dvander@542
    27
IExtension *myself = NULL;				/**< Ourself */
dvander@542
    28
IHandleSys *g_pHandleSys = NULL;		/**< Handle system */
dvander@542
    29
ISourceMod *g_pSM = NULL;				/**< SourceMod helpers */
dvander@542
    30
IForwardManager *g_pForwards = NULL;	/**< Forward system */
dvander@542
    31
dvander@542
    32
/** Exports the main interface */
dvander@542
    33
PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
dvander@542
    34
{
dvander@542
    35
	return g_pExtensionIface;
dvander@542
    36
}
dvander@542
    37
dvander@542
    38
SDKExtension::SDKExtension()
dvander@542
    39
{
dvander@542
    40
#if defined SMEXT_CONF_METAMOD
dvander@542
    41
	m_SourceMMLoaded = false;
dvander@542
    42
	m_WeAreUnloaded = false;
dvander@542
    43
	m_WeGotPauseChange = false;
dvander@542
    44
#endif
dvander@542
    45
}
dvander@542
    46
dvander@542
    47
bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t err_max, bool late)
dvander@542
    48
{
dvander@542
    49
	g_pShareSys = sys;
dvander@542
    50
	myself = me;
dvander@542
    51
dvander@542
    52
#if defined SMEXT_CONF_METAMOD
dvander@542
    53
	m_WeAreUnloaded = true;
dvander@542
    54
dvander@542
    55
	if (!m_SourceMMLoaded)
dvander@542
    56
	{
dvander@542
    57
		if (error)
dvander@542
    58
		{
dvander@542
    59
			snprintf(error, err_max, "Metamod attach failed");
dvander@542
    60
		}
dvander@542
    61
		return false;
dvander@542
    62
	}
dvander@542
    63
#endif
dvander@542
    64
dvander@542
    65
	SM_GET_IFACE(HANDLESYSTEM, g_pHandleSys);
dvander@542
    66
	SM_GET_IFACE(SOURCEMOD, g_pSM);
dvander@542
    67
	SM_GET_IFACE(FORWARDMANAGER, g_pForwards);
dvander@542
    68
dvander@542
    69
	if (SDK_OnLoad(error, err_max, late))
dvander@542
    70
	{
dvander@542
    71
#if defined SMEXT_CONF_METAMOD
dvander@542
    72
		m_WeAreUnloaded = true;
dvander@542
    73
#endif
dvander@542
    74
		return true;
dvander@542
    75
	}
dvander@542
    76
dvander@542
    77
	return false;
dvander@542
    78
}
dvander@542
    79
dvander@542
    80
bool SDKExtension::IsMetamodExtension()
dvander@542
    81
{
dvander@542
    82
#if defined SMEXT_CONF_METAMOD
dvander@542
    83
	return true;
dvander@542
    84
#else
dvander@542
    85
	return false;
dvander@542
    86
#endif
dvander@542
    87
}
dvander@542
    88
dvander@542
    89
void SDKExtension::OnExtensionPauseChange(bool state)
dvander@542
    90
{
dvander@542
    91
#if defined SMEXT_CONF_METAMOD
dvander@542
    92
	m_WeGotPauseChange = true;
dvander@542
    93
#endif
dvander@542
    94
	SDK_OnPauseChange(state);
dvander@542
    95
}
dvander@542
    96
dvander@542
    97
void SDKExtension::OnExtensionsAllLoaded()
dvander@542
    98
{
dvander@542
    99
	SDK_OnAllLoaded();
dvander@542
   100
}
dvander@542
   101
dvander@542
   102
void SDKExtension::OnExtensionUnload()
dvander@542
   103
{
dvander@542
   104
#if defined SMEXT_CONF_METAMOD
dvander@542
   105
	m_WeAreUnloaded = true;
dvander@542
   106
#endif
dvander@542
   107
	SDK_OnUnload();
dvander@542
   108
}
dvander@542
   109
dvander@542
   110
const char *SDKExtension::GetExtensionAuthor()
dvander@542
   111
{
dvander@542
   112
	return SMEXT_CONF_AUTHOR;
dvander@542
   113
}
dvander@542
   114
dvander@542
   115
const char *SDKExtension::GetExtensionDateString()
dvander@542
   116
{
dvander@542
   117
	return SMEXT_CONF_DATESTRING;
dvander@542
   118
}
dvander@542
   119
dvander@542
   120
const char *SDKExtension::GetExtensionDescription()
dvander@542
   121
{
dvander@542
   122
	return SMEXT_CONF_DESCRIPTION;
dvander@542
   123
}
dvander@542
   124
dvander@542
   125
const char *SDKExtension::GetExtensionVerString()
dvander@542
   126
{
dvander@542
   127
	return SMEXT_CONF_VERSION;
dvander@542
   128
}
dvander@542
   129
dvander@542
   130
const char *SDKExtension::GetExtensionName()
dvander@542
   131
{
dvander@542
   132
	return SMEXT_CONF_NAME;
dvander@542
   133
}
dvander@542
   134
dvander@542
   135
const char *SDKExtension::GetExtensionTag()
dvander@542
   136
{
dvander@542
   137
	return SMEXT_CONF_LOGTAG;
dvander@542
   138
}
dvander@542
   139
dvander@542
   140
const char *SDKExtension::GetExtensionURL()
dvander@542
   141
{
dvander@542
   142
	return SMEXT_CONF_URL;
dvander@542
   143
}
dvander@542
   144
dvander@542
   145
bool SDKExtension::SDK_OnLoad(char *error, size_t err_max, bool late)
dvander@542
   146
{
dvander@542
   147
	return true;
dvander@542
   148
}
dvander@542
   149
dvander@542
   150
void SDKExtension::SDK_OnUnload()
dvander@542
   151
{
dvander@542
   152
}
dvander@542
   153
dvander@542
   154
void SDKExtension::SDK_OnPauseChange(bool paused)
dvander@542
   155
{
dvander@542
   156
}
dvander@542
   157
dvander@542
   158
void SDKExtension::SDK_OnAllLoaded()
dvander@542
   159
{
dvander@542
   160
}
dvander@542
   161
dvander@542
   162
#if defined SMEXT_CONF_METAMOD
dvander@542
   163
dvander@542
   164
PluginId g_PLID = 0;						/**< Metamod plugin ID */
dvander@542
   165
ISmmPlugin *g_PLAPI = NULL;					/**< Metamod plugin API */
dvander@542
   166
SourceHook::ISourceHook *g_SHPtr = NULL;	/**< SourceHook pointer */
dvander@542
   167
ISmmAPI *g_SMAPI = NULL;					/**< SourceMM API pointer */
dvander@542
   168
dvander@542
   169
IVEngineServer *engine = NULL;				/**< IVEngineServer pointer */
dvander@542
   170
IServerGameDLL *gamedll = NULL;				/**< IServerGameDLL pointer */
dvander@542
   171
dvander@542
   172
/** Exposes the extension to Metamod */
dvander@542
   173
SMM_API void *PL_EXPOSURE(const char *name, int *code)
dvander@542
   174
{
dvander@542
   175
	if (name && !strcmp(name, PLAPI_NAME))
dvander@542
   176
	{
dvander@542
   177
		if (code)
dvander@542
   178
		{
dvander@542
   179
			*code = IFACE_OK;
dvander@542
   180
		}
dvander@542
   181
		return static_cast<void *>(g_pExtensionIface);
dvander@542
   182
	}
dvander@542
   183
dvander@542
   184
	if (code)
dvander@542
   185
	{
dvander@542
   186
		*code = IFACE_FAILED;
dvander@542
   187
	}
dvander@542
   188
dvander@542
   189
	return NULL;
dvander@542
   190
}
dvander@542
   191
dvander@542
   192
bool SDKExtension::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)
dvander@542
   193
{
dvander@542
   194
	PLUGIN_SAVEVARS();
dvander@542
   195
dvander@542
   196
	GET_V_IFACE_ANY(serverFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
dvander@542
   197
	GET_V_IFACE_CURRENT(engineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
dvander@542
   198
dvander@542
   199
	m_SourceMMLoaded = true;
dvander@542
   200
dvander@542
   201
	return SDK_OnMetamodLoad(error, maxlen, late);
dvander@542
   202
}
dvander@542
   203
dvander@542
   204
bool SDKExtension::Unload(char *error, size_t maxlen)
dvander@542
   205
{
dvander@542
   206
	if (!m_WeAreUnloaded)
dvander@542
   207
	{
dvander@542
   208
		if (error)
dvander@542
   209
		{
dvander@542
   210
			snprintf(error, maxlen, "This extension must be unloaded by SourceMod.");
dvander@542
   211
		}
dvander@542
   212
		return false;
dvander@542
   213
	}
dvander@542
   214
dvander@542
   215
	return SDK_OnMetamodUnload(error, maxlen);
dvander@542
   216
}
dvander@542
   217
dvander@542
   218
bool SDKExtension::Pause(char *error, size_t maxlen)
dvander@542
   219
{
dvander@542
   220
	if (!m_WeGotPauseChange)
dvander@542
   221
	{
dvander@542
   222
		if (error)
dvander@542
   223
		{
dvander@542
   224
			snprintf(error, maxlen, "This extension must be paused by SourceMod.");
dvander@542
   225
		}
dvander@542
   226
		return false;
dvander@542
   227
	}
dvander@542
   228
dvander@542
   229
	m_WeGotPauseChange = false;
dvander@542
   230
dvander@542
   231
	return SDK_OnMetamodPauseChange(true, error, maxlen);
dvander@542
   232
}
dvander@542
   233
dvander@542
   234
bool SDKExtension::Unpause(char *error, size_t maxlen)
dvander@542
   235
{
dvander@542
   236
	if (!m_WeGotPauseChange)
dvander@542
   237
	{
dvander@542
   238
		if (error)
dvander@542
   239
		{
dvander@542
   240
			snprintf(error, maxlen, "This extension must be unpaused by SourceMod.");
dvander@542
   241
		}
dvander@542
   242
		return false;
dvander@542
   243
	}
dvander@542
   244
dvander@542
   245
	m_WeGotPauseChange = false;
dvander@542
   246
dvander@542
   247
	return SDK_OnMetamodPauseChange(false, error, maxlen);
dvander@542
   248
}
dvander@542
   249
dvander@542
   250
const char *SDKExtension::GetAuthor()
dvander@542
   251
{
dvander@542
   252
	return GetExtensionAuthor();
dvander@542
   253
}
dvander@542
   254
dvander@542
   255
const char *SDKExtension::GetDate()
dvander@542
   256
{
dvander@542
   257
	return GetExtensionDateString();
dvander@542
   258
}
dvander@542
   259
dvander@542
   260
const char *SDKExtension::GetDescription()
dvander@542
   261
{
dvander@542
   262
	return GetExtensionDescription();
dvander@542
   263
}
dvander@542
   264
dvander@542
   265
const char *SDKExtension::GetLicense()
dvander@542
   266
{
dvander@542
   267
	return SMEXT_CONF_LICENSE;
dvander@542
   268
}
dvander@542
   269
dvander@542
   270
const char *SDKExtension::GetLogTag()
dvander@542
   271
{
dvander@542
   272
	return GetExtensionTag();
dvander@542
   273
}
dvander@542
   274
dvander@542
   275
const char *SDKExtension::GetName()
dvander@542
   276
{
dvander@542
   277
	return GetExtensionName();
dvander@542
   278
}
dvander@542
   279
dvander@542
   280
const char *SDKExtension::GetURL()
dvander@542
   281
{
dvander@542
   282
	return GetExtensionURL();
dvander@542
   283
}
dvander@542
   284
dvander@542
   285
const char *SDKExtension::GetVersion()
dvander@542
   286
{
dvander@542
   287
	return GetExtensionVerString();
dvander@542
   288
}
dvander@542
   289
dvander@542
   290
bool SDKExtension::SDK_OnMetamodLoad(char *error, size_t err_max, bool late)
dvander@542
   291
{
dvander@542
   292
	return true;
dvander@542
   293
}
dvander@542
   294
dvander@542
   295
bool SDKExtension::SDK_OnMetamodUnload(char *error, size_t err_max)
dvander@542
   296
{
dvander@542
   297
	return true;
dvander@542
   298
}
dvander@542
   299
dvander@542
   300
bool SDKExtension::SDK_OnMetamodPauseChange(bool paused, char *error, size_t err_max)
dvander@542
   301
{
dvander@542
   302
	return true;
dvander@542
   303
}
dvander@542
   304
dvander@542
   305
#endif
dvander@542
   306
dvander@542
   307
/* Overload a few things to prevent libstdc++ linking */
dvander@542
   308
#if defined __linux__
dvander@542
   309
extern "C" void __cxa_pure_virtual(void)
dvander@542
   310
{
dvander@542
   311
}
dvander@542
   312
dvander@542
   313
void *operator new(size_t size)
dvander@542
   314
{
dvander@542
   315
	return malloc(size);
dvander@542
   316
}
dvander@542
   317
dvander@542
   318
void *operator new[](size_t size) 
dvander@542
   319
{
dvander@542
   320
	return malloc(size);
dvander@542
   321
}
dvander@542
   322
dvander@542
   323
void operator delete(void *ptr) 
dvander@542
   324
{
dvander@542
   325
	free(ptr);
dvander@542
   326
}
dvander@542
   327
dvander@542
   328
void operator delete[](void * ptr)
dvander@542
   329
{
dvander@542
   330
	free(ptr);
dvander@542
   331
}
dvander@542
   332
#endif
dvander@542
   333