public/smsdk_ext.cpp
author Peace-Maker <januk@freenet.de>
Fri May 09 10:36:58 2014 -0700 (2014-05-09)
changeset 4349 4772045265f8
parent 4333 862af2b45ac0
permissions -rw-r--r--
Clear default driver reference if unloaded (bug 5934, r=dvander).
     1 /**
     2  * vim: set ts=4 sw=4 tw=99 noet:
     3  * =============================================================================
     4  * SourceMod Base Extension Code
     5  * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
     6  * =============================================================================
     7  *
     8  * This program is free software; you can redistribute it and/or modify it under
     9  * the terms of the GNU General Public License, version 3.0, as published by the
    10  * Free Software Foundation.
    11  * 
    12  * This program is distributed in the hope that it will be useful, but WITHOUT
    13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    14  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
    15  * details.
    16  *
    17  * You should have received a copy of the GNU General Public License along with
    18  * this program.  If not, see <http://www.gnu.org/licenses/>.
    19  *
    20  * As a special exception, AlliedModders LLC gives you permission to link the
    21  * code of this program (as well as its derivative works) to "Half-Life 2," the
    22  * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
    23  * by the Valve Corporation.  You must obey the GNU General Public License in
    24  * all respects for all other code used.  Additionally, AlliedModders LLC grants
    25  * this exception to all derivative works.  AlliedModders LLC defines further
    26  * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
    27  * or <http://www.sourcemod.net/license.php>.
    28  *
    29  * Version: $Id$
    30  */
    31 
    32 #include <stdio.h>
    33 #include <stdlib.h>
    34 #include "smsdk_ext.h"
    35 
    36 /**
    37  * @file smsdk_ext.cpp
    38  * @brief Contains wrappers for making Extensions easier to write.
    39  */
    40 
    41 IExtension *myself = NULL;				/**< Ourself */
    42 IShareSys *g_pShareSys = NULL;			/**< Share system */
    43 IShareSys *sharesys = NULL;				/**< Share system */
    44 ISourceMod *g_pSM = NULL;				/**< SourceMod helpers */
    45 ISourceMod *smutils = NULL;				/**< SourceMod helpers */
    46 
    47 #if defined SMEXT_ENABLE_FORWARDSYS
    48 IForwardManager *g_pForwards = NULL;	/**< Forward system */
    49 IForwardManager *forwards = NULL;		/**< Forward system */
    50 #endif
    51 #if defined SMEXT_ENABLE_HANDLESYS
    52 IHandleSys *g_pHandleSys = NULL;		/**< Handle system */
    53 IHandleSys *handlesys = NULL;			/**< Handle system */
    54 #endif
    55 #if defined SMEXT_ENABLE_PLAYERHELPERS
    56 IPlayerManager *playerhelpers = NULL;	/**< Player helpers */
    57 #endif //SMEXT_ENABLE_PLAYERHELPERS
    58 #if defined SMEXT_ENABLE_DBMANAGER
    59 IDBManager *dbi = NULL;					/**< DB Manager */
    60 #endif //SMEXT_ENABLE_DBMANAGER
    61 #if defined SMEXT_ENABLE_GAMECONF
    62 IGameConfigManager *gameconfs = NULL;	/**< Game config manager */
    63 #endif //SMEXT_ENABLE_DBMANAGER
    64 #if defined SMEXT_ENABLE_MEMUTILS
    65 IMemoryUtils *memutils = NULL;
    66 #endif //SMEXT_ENABLE_DBMANAGER
    67 #if defined SMEXT_ENABLE_GAMEHELPERS
    68 IGameHelpers *gamehelpers = NULL;
    69 #endif
    70 #if defined SMEXT_ENABLE_TIMERSYS
    71 ITimerSystem *timersys = NULL;
    72 #endif
    73 #if defined SMEXT_ENABLE_ADTFACTORY
    74 IADTFactory *adtfactory = NULL;
    75 #endif
    76 #if defined SMEXT_ENABLE_THREADER
    77 IThreader *threader = NULL;
    78 #endif
    79 #if defined SMEXT_ENABLE_LIBSYS
    80 ILibrarySys *libsys = NULL;
    81 #endif
    82 #if defined SMEXT_ENABLE_PLUGINSYS
    83 SourceMod::IPluginManager *plsys;
    84 #endif
    85 #if defined SMEXT_ENABLE_MENUS
    86 IMenuManager *menus = NULL;
    87 #endif
    88 #if defined SMEXT_ENABLE_ADMINSYS
    89 IAdminSystem *adminsys = NULL;
    90 #endif
    91 #if defined SMEXT_ENABLE_TEXTPARSERS
    92 ITextParsers *textparsers = NULL;
    93 #endif
    94 #if defined SMEXT_ENABLE_USERMSGS
    95 IUserMessages *usermsgs = NULL;
    96 #endif
    97 #if defined SMEXT_ENABLE_TRANSLATOR
    98 ITranslator *translator = NULL;
    99 #endif
   100 #if defined SMEXT_ENABLE_NINVOKE
   101 INativeInterface *ninvoke = NULL;
   102 #endif
   103 #if defined SMEXT_ENABLE_ROOTCONSOLEMENU
   104 IRootConsole *rootconsole = NULL;
   105 #endif
   106 
   107 /** Exports the main interface */
   108 PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
   109 {
   110 	return g_pExtensionIface;
   111 }
   112 
   113 SDKExtension::SDKExtension()
   114 {
   115 #if defined SMEXT_CONF_METAMOD
   116 	m_SourceMMLoaded = false;
   117 	m_WeAreUnloaded = false;
   118 	m_WeGotPauseChange = false;
   119 #endif
   120 }
   121 
   122 bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t maxlength, bool late)
   123 {
   124 	g_pShareSys = sharesys = sys;
   125 	myself = me;
   126 
   127 #if defined SMEXT_CONF_METAMOD
   128 	m_WeAreUnloaded = true;
   129 
   130 	if (!m_SourceMMLoaded)
   131 	{
   132 		if (error)
   133 		{
   134 			snprintf(error, maxlength, "Metamod attach failed");
   135 		}
   136 		return false;
   137 	}
   138 #endif
   139 	SM_GET_IFACE(SOURCEMOD, g_pSM);
   140 	smutils = g_pSM;
   141 #if defined SMEXT_ENABLE_HANDLESYS
   142 	SM_GET_IFACE(HANDLESYSTEM, g_pHandleSys);
   143 	handlesys = g_pHandleSys;
   144 #endif
   145 #if defined SMEXT_ENABLE_FORWARDSYS
   146 	SM_GET_IFACE(FORWARDMANAGER, g_pForwards);
   147 	forwards = g_pForwards;
   148 #endif
   149 #if defined SMEXT_ENABLE_PLAYERHELPERS
   150 	SM_GET_IFACE(PLAYERMANAGER, playerhelpers);
   151 #endif
   152 #if defined SMEXT_ENABLE_DBMANAGER
   153 	SM_GET_IFACE(DBI, dbi);
   154 #endif
   155 #if defined SMEXT_ENABLE_GAMECONF
   156 	SM_GET_IFACE(GAMECONFIG, gameconfs);
   157 #endif
   158 #if defined SMEXT_ENABLE_MEMUTILS
   159 	SM_GET_IFACE(MEMORYUTILS, memutils);
   160 #endif
   161 #if defined SMEXT_ENABLE_GAMEHELPERS
   162 	SM_GET_IFACE(GAMEHELPERS, gamehelpers);
   163 #endif
   164 #if defined SMEXT_ENABLE_TIMERSYS
   165 	SM_GET_IFACE(TIMERSYS, timersys);
   166 #endif
   167 #if defined SMEXT_ENABLE_ADTFACTORY
   168 	SM_GET_IFACE(ADTFACTORY, adtfactory);
   169 #endif
   170 #if defined SMEXT_ENABLE_THREADER
   171 	SM_GET_IFACE(THREADER, threader);
   172 #endif
   173 #if defined SMEXT_ENABLE_LIBSYS
   174 	SM_GET_IFACE(LIBRARYSYS, libsys);
   175 #endif
   176 #if defined SMEXT_ENABLE_PLUGINSYS
   177 	SM_GET_IFACE(PLUGINSYSTEM, plsys);
   178 #endif
   179 #if defined SMEXT_ENABLE_MENUS
   180 	SM_GET_IFACE(MENUMANAGER, menus);
   181 #endif
   182 #if defined SMEXT_ENABLE_ADMINSYS
   183 	SM_GET_IFACE(ADMINSYS, adminsys);
   184 #endif
   185 #if defined SMEXT_ENABLE_TEXTPARSERS
   186 	SM_GET_IFACE(TEXTPARSERS, textparsers);
   187 #endif
   188 #if defined SMEXT_ENABLE_USERMSGS
   189 	SM_GET_IFACE(USERMSGS, usermsgs);
   190 #endif
   191 #if defined SMEXT_ENABLE_TRANSLATOR
   192 	SM_GET_IFACE(TRANSLATOR, translator);
   193 #endif
   194 #if defined SMEXT_ENABLE_NINVOKE
   195 	SM_GET_IFACE(NINVOKE, ninvoke);
   196 #endif
   197 #if defined SMEXT_ENABLE_ROOTCONSOLEMENU
   198 	SM_GET_IFACE(ROOTCONSOLE, rootconsole);
   199 #endif
   200 
   201 	if (SDK_OnLoad(error, maxlength, late))
   202 	{
   203 #if defined SMEXT_CONF_METAMOD
   204 		m_WeAreUnloaded = true;
   205 #endif
   206 		return true;
   207 	}
   208 
   209 	return false;
   210 }
   211 
   212 bool SDKExtension::IsMetamodExtension()
   213 {
   214 #if defined SMEXT_CONF_METAMOD
   215 	return true;
   216 #else
   217 	return false;
   218 #endif
   219 }
   220 
   221 void SDKExtension::OnExtensionPauseChange(bool state)
   222 {
   223 #if defined SMEXT_CONF_METAMOD
   224 	m_WeGotPauseChange = true;
   225 #endif
   226 	SDK_OnPauseChange(state);
   227 }
   228 
   229 void SDKExtension::OnExtensionsAllLoaded()
   230 {
   231 	SDK_OnAllLoaded();
   232 }
   233 
   234 void SDKExtension::OnExtensionUnload()
   235 {
   236 #if defined SMEXT_CONF_METAMOD
   237 	m_WeAreUnloaded = true;
   238 #endif
   239 	SDK_OnUnload();
   240 }
   241 
   242 void SDKExtension::OnDependenciesDropped()
   243 {
   244 	SDK_OnDependenciesDropped();
   245 }
   246 
   247 const char *SDKExtension::GetExtensionAuthor()
   248 {
   249 	return SMEXT_CONF_AUTHOR;
   250 }
   251 
   252 const char *SDKExtension::GetExtensionDateString()
   253 {
   254 	return SMEXT_CONF_DATESTRING;
   255 }
   256 
   257 const char *SDKExtension::GetExtensionDescription()
   258 {
   259 	return SMEXT_CONF_DESCRIPTION;
   260 }
   261 
   262 const char *SDKExtension::GetExtensionVerString()
   263 {
   264 	return SMEXT_CONF_VERSION;
   265 }
   266 
   267 const char *SDKExtension::GetExtensionName()
   268 {
   269 	return SMEXT_CONF_NAME;
   270 }
   271 
   272 const char *SDKExtension::GetExtensionTag()
   273 {
   274 	return SMEXT_CONF_LOGTAG;
   275 }
   276 
   277 const char *SDKExtension::GetExtensionURL()
   278 {
   279 	return SMEXT_CONF_URL;
   280 }
   281 
   282 bool SDKExtension::SDK_OnLoad(char *error, size_t maxlength, bool late)
   283 {
   284 	return true;
   285 }
   286 
   287 void SDKExtension::SDK_OnUnload()
   288 {
   289 }
   290 
   291 void SDKExtension::SDK_OnPauseChange(bool paused)
   292 {
   293 }
   294 
   295 void SDKExtension::SDK_OnAllLoaded()
   296 {
   297 }
   298 
   299 void SDKExtension::SDK_OnDependenciesDropped()
   300 {
   301 }
   302 
   303 #if defined SMEXT_CONF_METAMOD
   304 
   305 PluginId g_PLID = 0;						/**< Metamod plugin ID */
   306 ISmmPlugin *g_PLAPI = NULL;					/**< Metamod plugin API */
   307 SourceHook::ISourceHook *g_SHPtr = NULL;	/**< SourceHook pointer */
   308 ISmmAPI *g_SMAPI = NULL;					/**< SourceMM API pointer */
   309 
   310 IVEngineServer *engine = NULL;				/**< IVEngineServer pointer */
   311 IServerGameDLL *gamedll = NULL;				/**< IServerGameDLL pointer */
   312 
   313 /** Exposes the extension to Metamod */
   314 SMM_API void *PL_EXPOSURE(const char *name, int *code)
   315 {
   316 #if defined METAMOD_PLAPI_VERSION
   317 	if (name && !strcmp(name, METAMOD_PLAPI_NAME))
   318 #else
   319 	if (name && !strcmp(name, PLAPI_NAME))
   320 #endif
   321 	{
   322 		if (code)
   323 		{
   324 			*code = IFACE_OK;
   325 		}
   326 		return static_cast<void *>(g_pExtensionIface);
   327 	}
   328 
   329 	if (code)
   330 	{
   331 		*code = IFACE_FAILED;
   332 	}
   333 
   334 	return NULL;
   335 }
   336 
   337 bool SDKExtension::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)
   338 {
   339 	PLUGIN_SAVEVARS();
   340 
   341 #if !defined METAMOD_PLAPI_VERSION
   342 	GET_V_IFACE_ANY(serverFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
   343 	GET_V_IFACE_CURRENT(engineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
   344 #else
   345 	GET_V_IFACE_ANY(GetServerFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
   346 	GET_V_IFACE_CURRENT(GetEngineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
   347 #endif
   348 
   349 	m_SourceMMLoaded = true;
   350 
   351 	return SDK_OnMetamodLoad(ismm, error, maxlen, late);
   352 }
   353 
   354 bool SDKExtension::Unload(char *error, size_t maxlen)
   355 {
   356 	if (!m_WeAreUnloaded)
   357 	{
   358 		if (error)
   359 		{
   360 			snprintf(error, maxlen, "This extension must be unloaded by SourceMod.");
   361 		}
   362 		return false;
   363 	}
   364 
   365 	return SDK_OnMetamodUnload(error, maxlen);
   366 }
   367 
   368 bool SDKExtension::Pause(char *error, size_t maxlen)
   369 {
   370 	if (!m_WeGotPauseChange)
   371 	{
   372 		if (error)
   373 		{
   374 			snprintf(error, maxlen, "This extension must be paused by SourceMod.");
   375 		}
   376 		return false;
   377 	}
   378 
   379 	m_WeGotPauseChange = false;
   380 
   381 	return SDK_OnMetamodPauseChange(true, error, maxlen);
   382 }
   383 
   384 bool SDKExtension::Unpause(char *error, size_t maxlen)
   385 {
   386 	if (!m_WeGotPauseChange)
   387 	{
   388 		if (error)
   389 		{
   390 			snprintf(error, maxlen, "This extension must be unpaused by SourceMod.");
   391 		}
   392 		return false;
   393 	}
   394 
   395 	m_WeGotPauseChange = false;
   396 
   397 	return SDK_OnMetamodPauseChange(false, error, maxlen);
   398 }
   399 
   400 const char *SDKExtension::GetAuthor()
   401 {
   402 	return GetExtensionAuthor();
   403 }
   404 
   405 const char *SDKExtension::GetDate()
   406 {
   407 	return GetExtensionDateString();
   408 }
   409 
   410 const char *SDKExtension::GetDescription()
   411 {
   412 	return GetExtensionDescription();
   413 }
   414 
   415 const char *SDKExtension::GetLicense()
   416 {
   417 	return SMEXT_CONF_LICENSE;
   418 }
   419 
   420 const char *SDKExtension::GetLogTag()
   421 {
   422 	return GetExtensionTag();
   423 }
   424 
   425 const char *SDKExtension::GetName()
   426 {
   427 	return GetExtensionName();
   428 }
   429 
   430 const char *SDKExtension::GetURL()
   431 {
   432 	return GetExtensionURL();
   433 }
   434 
   435 const char *SDKExtension::GetVersion()
   436 {
   437 	return GetExtensionVerString();
   438 }
   439 
   440 bool SDKExtension::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlength, bool late)
   441 {
   442 	return true;
   443 }
   444 
   445 bool SDKExtension::SDK_OnMetamodUnload(char *error, size_t maxlength)
   446 {
   447 	return true;
   448 }
   449 
   450 bool SDKExtension::SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength)
   451 {
   452 	return true;
   453 }
   454 
   455 #endif
   456 
   457 /* Overload a few things to prevent libstdc++ linking */
   458 #if defined __linux__ || defined __APPLE__
   459 extern "C" void __cxa_pure_virtual(void)
   460 {
   461 }
   462 
   463 void *operator new(size_t size)
   464 {
   465 	return malloc(size);
   466 }
   467 
   468 void *operator new[](size_t size) 
   469 {
   470 	return malloc(size);
   471 }
   472 
   473 void operator delete(void *ptr) 
   474 {
   475 	free(ptr);
   476 }
   477 
   478 void operator delete[](void * ptr)
   479 {
   480 	free(ptr);
   481 }
   482 #endif
   483