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