extensions/sqlite/sdk/smsdk_ext.cpp
author David Anderson <dvander@alliedmods.net>
Sun Jul 29 01:15:31 2007 +0000 (2007-07-29)
changeset 1203 633c25ce6405
child 1226 478550a4d5ec
permissions -rw-r--r--
initial import of sqlite extension
     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 #if defined SMEXT_ENABLE_MEMUTILS
    52 IMemoryUtils *memutils = NULL;
    53 #endif //SMEXT_ENABLE_DBMANAGER
    54 #if defined SMEXT_ENABLE_GAMEHELPERS
    55 IGameHelpers *gamehelpers = NULL;
    56 #endif
    57 #if defined SMEXT_ENABLE_TIMERSYS
    58 ITimerSystem *timersys = NULL;
    59 #endif
    60 #if defined SMEXT_ENABLE_ADTFACTORY
    61 IADTFactory *adtfactory = NULL;
    62 #endif
    63 #if defined SMEXT_ENABLE_THREADER
    64 IThreader *threader = NULL;
    65 #endif
    66 #if defined SMEXT_ENABLE_LIBSYS
    67 ILibrarySys *libsys = NULL;
    68 #endif
    69 
    70 /** Exports the main interface */
    71 PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
    72 {
    73 	return g_pExtensionIface;
    74 }
    75 
    76 SDKExtension::SDKExtension()
    77 {
    78 #if defined SMEXT_CONF_METAMOD
    79 	m_SourceMMLoaded = false;
    80 	m_WeAreUnloaded = false;
    81 	m_WeGotPauseChange = false;
    82 #endif
    83 }
    84 
    85 bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t maxlength, bool late)
    86 {
    87 	g_pShareSys = sharesys = sys;
    88 	myself = me;
    89 
    90 #if defined SMEXT_CONF_METAMOD
    91 	m_WeAreUnloaded = true;
    92 
    93 	if (!m_SourceMMLoaded)
    94 	{
    95 		if (error)
    96 		{
    97 			snprintf(error, maxlength, "Metamod attach failed");
    98 		}
    99 		return false;
   100 	}
   101 #endif
   102 	SM_GET_IFACE(SOURCEMOD, g_pSM);
   103 	smutils = g_pSM;
   104 #if defined SMEXT_ENABLE_HANDLESYS
   105 	SM_GET_IFACE(HANDLESYSTEM, g_pHandleSys);
   106 	handlesys = g_pHandleSys;
   107 #endif
   108 #if defined SMEXT_ENABLE_FORWARDSYS
   109 	SM_GET_IFACE(FORWARDMANAGER, g_pForwards);
   110 	forwards = g_pForwards;
   111 #endif
   112 #if defined SMEXT_ENABLE_PLAYERHELPERS
   113 	SM_GET_IFACE(PLAYERMANAGER, playerhelpers);
   114 #endif
   115 #if defined SMEXT_ENABLE_DBMANAGER
   116 	SM_GET_IFACE(DBI, dbi);
   117 #endif
   118 #if defined SMEXT_ENABLE_GAMECONF
   119 	SM_GET_IFACE(GAMECONFIG, gameconfs);
   120 #endif
   121 #if defined SMEXT_ENABLE_MEMUTILS
   122 	SM_GET_IFACE(MEMORYUTILS, memutils);
   123 #endif
   124 #if defined SMEXT_ENABLE_GAMEHELPERS
   125 	SM_GET_IFACE(GAMEHELPERS, gamehelpers);
   126 #endif
   127 #if defined SMEXT_ENABLE_TIMERSYS
   128 	SM_GET_IFACE(TIMERSYS, timersys);
   129 #endif
   130 #if defined SMEXT_ENABLE_ADTFACTORY
   131 	SM_GET_IFACE(ADTFACTORY, adtfactory);
   132 #endif
   133 #if defined SMEXT_ENABLE_THREADER
   134 	SM_GET_IFACE(THREADER, threader);
   135 #endif
   136 #if defined SMEXT_ENABLE_LIBSYS
   137 	SM_GET_IFACE(LIBRARYSYS, libsys);
   138 #endif
   139 
   140 	if (SDK_OnLoad(error, maxlength, late))
   141 	{
   142 #if defined SMEXT_CONF_METAMOD
   143 		m_WeAreUnloaded = true;
   144 #endif
   145 		return true;
   146 	}
   147 
   148 	return false;
   149 }
   150 
   151 bool SDKExtension::IsMetamodExtension()
   152 {
   153 #if defined SMEXT_CONF_METAMOD
   154 	return true;
   155 #else
   156 	return false;
   157 #endif
   158 }
   159 
   160 void SDKExtension::OnExtensionPauseChange(bool state)
   161 {
   162 #if defined SMEXT_CONF_METAMOD
   163 	m_WeGotPauseChange = true;
   164 #endif
   165 	SDK_OnPauseChange(state);
   166 }
   167 
   168 void SDKExtension::OnExtensionsAllLoaded()
   169 {
   170 	SDK_OnAllLoaded();
   171 }
   172 
   173 void SDKExtension::OnExtensionUnload()
   174 {
   175 #if defined SMEXT_CONF_METAMOD
   176 	m_WeAreUnloaded = true;
   177 #endif
   178 	SDK_OnUnload();
   179 }
   180 
   181 const char *SDKExtension::GetExtensionAuthor()
   182 {
   183 	return SMEXT_CONF_AUTHOR;
   184 }
   185 
   186 const char *SDKExtension::GetExtensionDateString()
   187 {
   188 	return SMEXT_CONF_DATESTRING;
   189 }
   190 
   191 const char *SDKExtension::GetExtensionDescription()
   192 {
   193 	return SMEXT_CONF_DESCRIPTION;
   194 }
   195 
   196 const char *SDKExtension::GetExtensionVerString()
   197 {
   198 	return SMEXT_CONF_VERSION;
   199 }
   200 
   201 const char *SDKExtension::GetExtensionName()
   202 {
   203 	return SMEXT_CONF_NAME;
   204 }
   205 
   206 const char *SDKExtension::GetExtensionTag()
   207 {
   208 	return SMEXT_CONF_LOGTAG;
   209 }
   210 
   211 const char *SDKExtension::GetExtensionURL()
   212 {
   213 	return SMEXT_CONF_URL;
   214 }
   215 
   216 bool SDKExtension::SDK_OnLoad(char *error, size_t maxlength, bool late)
   217 {
   218 	return true;
   219 }
   220 
   221 void SDKExtension::SDK_OnUnload()
   222 {
   223 }
   224 
   225 void SDKExtension::SDK_OnPauseChange(bool paused)
   226 {
   227 }
   228 
   229 void SDKExtension::SDK_OnAllLoaded()
   230 {
   231 }
   232 
   233 #if defined SMEXT_CONF_METAMOD
   234 
   235 PluginId g_PLID = 0;						/**< Metamod plugin ID */
   236 ISmmPlugin *g_PLAPI = NULL;					/**< Metamod plugin API */
   237 SourceHook::ISourceHook *g_SHPtr = NULL;	/**< SourceHook pointer */
   238 ISmmAPI *g_SMAPI = NULL;					/**< SourceMM API pointer */
   239 
   240 IVEngineServer *engine = NULL;				/**< IVEngineServer pointer */
   241 IServerGameDLL *gamedll = NULL;				/**< IServerGameDLL pointer */
   242 
   243 /** Exposes the extension to Metamod */
   244 SMM_API void *PL_EXPOSURE(const char *name, int *code)
   245 {
   246 	if (name && !strcmp(name, PLAPI_NAME))
   247 	{
   248 		if (code)
   249 		{
   250 			*code = IFACE_OK;
   251 		}
   252 		return static_cast<void *>(g_pExtensionIface);
   253 	}
   254 
   255 	if (code)
   256 	{
   257 		*code = IFACE_FAILED;
   258 	}
   259 
   260 	return NULL;
   261 }
   262 
   263 bool SDKExtension::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)
   264 {
   265 	PLUGIN_SAVEVARS();
   266 
   267 	GET_V_IFACE_ANY(serverFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
   268 	GET_V_IFACE_CURRENT(engineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
   269 
   270 	m_SourceMMLoaded = true;
   271 
   272 	return SDK_OnMetamodLoad(ismm, error, maxlen, late);
   273 }
   274 
   275 bool SDKExtension::Unload(char *error, size_t maxlen)
   276 {
   277 	if (!m_WeAreUnloaded)
   278 	{
   279 		if (error)
   280 		{
   281 			snprintf(error, maxlen, "This extension must be unloaded by SourceMod.");
   282 		}
   283 		return false;
   284 	}
   285 
   286 	return SDK_OnMetamodUnload(error, maxlen);
   287 }
   288 
   289 bool SDKExtension::Pause(char *error, size_t maxlen)
   290 {
   291 	if (!m_WeGotPauseChange)
   292 	{
   293 		if (error)
   294 		{
   295 			snprintf(error, maxlen, "This extension must be paused by SourceMod.");
   296 		}
   297 		return false;
   298 	}
   299 
   300 	m_WeGotPauseChange = false;
   301 
   302 	return SDK_OnMetamodPauseChange(true, error, maxlen);
   303 }
   304 
   305 bool SDKExtension::Unpause(char *error, size_t maxlen)
   306 {
   307 	if (!m_WeGotPauseChange)
   308 	{
   309 		if (error)
   310 		{
   311 			snprintf(error, maxlen, "This extension must be unpaused by SourceMod.");
   312 		}
   313 		return false;
   314 	}
   315 
   316 	m_WeGotPauseChange = false;
   317 
   318 	return SDK_OnMetamodPauseChange(false, error, maxlen);
   319 }
   320 
   321 const char *SDKExtension::GetAuthor()
   322 {
   323 	return GetExtensionAuthor();
   324 }
   325 
   326 const char *SDKExtension::GetDate()
   327 {
   328 	return GetExtensionDateString();
   329 }
   330 
   331 const char *SDKExtension::GetDescription()
   332 {
   333 	return GetExtensionDescription();
   334 }
   335 
   336 const char *SDKExtension::GetLicense()
   337 {
   338 	return SMEXT_CONF_LICENSE;
   339 }
   340 
   341 const char *SDKExtension::GetLogTag()
   342 {
   343 	return GetExtensionTag();
   344 }
   345 
   346 const char *SDKExtension::GetName()
   347 {
   348 	return GetExtensionName();
   349 }
   350 
   351 const char *SDKExtension::GetURL()
   352 {
   353 	return GetExtensionURL();
   354 }
   355 
   356 const char *SDKExtension::GetVersion()
   357 {
   358 	return GetExtensionVerString();
   359 }
   360 
   361 bool SDKExtension::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlength, bool late)
   362 {
   363 	return true;
   364 }
   365 
   366 bool SDKExtension::SDK_OnMetamodUnload(char *error, size_t maxlength)
   367 {
   368 	return true;
   369 }
   370 
   371 bool SDKExtension::SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength)
   372 {
   373 	return true;
   374 }
   375 
   376 #endif
   377 
   378 /* Overload a few things to prevent libstdc++ linking */
   379 #if defined __linux__
   380 extern "C" void __cxa_pure_virtual(void)
   381 {
   382 }
   383 
   384 void *operator new(size_t size)
   385 {
   386 	return malloc(size);
   387 }
   388 
   389 void *operator new[](size_t size) 
   390 {
   391 	return malloc(size);
   392 }
   393 
   394 void operator delete(void *ptr) 
   395 {
   396 	free(ptr);
   397 }
   398 
   399 void operator delete[](void * ptr)
   400 {
   401 	free(ptr);
   402 }
   403 #endif