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