public/IPluginSys.h
author David Anderson <dvander@alliedmods.net>
Wed Jan 20 04:01:39 2010 -0800 (2010-01-20)
changeset 2909 c91c2bc4603c
parent 2730 a2ff0a7a1c53
child 3004 e3ac0dc6d9a4
permissions -rw-r--r--
Added PlayerRunCmd offset for DoD:s (bug 4231 mitigation, r=me).
     1 /**
     2  * vim: set ts=4 sw=4 :
     3  * =============================================================================
     4  * SourceMod
     5  * Copyright (C) 2004-2009 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 #ifndef _INCLUDE_SOURCEMOD_PLUGINMNGR_INTERFACE_H_
    33 #define _INCLUDE_SOURCEMOD_PLUGINMNGR_INTERFACE_H_
    34 
    35 /**
    36  * @file IPluginSys.h
    37  * @brief Defines the interface for the Plugin System, which manages loaded plugins.
    38  */
    39 
    40 #include <IShareSys.h>
    41 #include <IHandleSys.h>
    42 #include <sp_vm_api.h>
    43 
    44 #define SMINTERFACE_PLUGINSYSTEM_NAME		"IPluginManager"
    45 #define SMINTERFACE_PLUGINSYSTEM_VERSION	3
    46 
    47 /** Context user slot 3 is used Core for holding an IPluginContext pointer. */
    48 #define SM_CONTEXTVAR_USER		3
    49 
    50 namespace SourceMod
    51 {
    52 	class IPlugin;
    53 
    54 	/** 
    55 	 * @brief Encapsulates plugin public information exposed through "myinfo."
    56 	 */
    57 	typedef struct sm_plugininfo_s
    58 	{
    59 		const char *name;			/**< Plugin name */
    60 		const char *author;			/**< Plugin author */
    61 		const char *description;	/**< Plugin description */
    62 		const char *version;		/**< Plugin version string */
    63 		const char *url;			/**< Plugin URL */
    64 	} sm_plugininfo_t;
    65 
    66 
    67 	/**
    68 	 * @brief Describes the usability status of a plugin.
    69 	 */
    70 	enum PluginStatus
    71 	{
    72 		Plugin_Running=0,		/**< Plugin is running */
    73 		/* All states below are unexecutable */
    74 		Plugin_Paused,			/**< Plugin is loaded but paused */
    75 		Plugin_Error,			/**< Plugin is loaded but errored/locked */
    76 		/* All states below do not have all natives */
    77 		Plugin_Loaded,			/**< Plugin has passed loading and can be finalized */
    78 		Plugin_Failed,			/**< Plugin has a fatal failure */
    79 		Plugin_Created,			/**< Plugin is created but not initialized */
    80 		Plugin_Uncompiled,		/**< Plugin is not yet compiled by the JIT */
    81 		Plugin_BadLoad,			/**< Plugin failed to load */
    82 	};
    83 
    84 
    85 	/**
    86 	 * @brief Describes the object lifetime of a plugin.
    87 	 */
    88 	enum PluginType
    89 	{
    90 		PluginType_Private,			/**< Plugin is privately managed and receives no forwards */
    91 		PluginType_MapUpdated,		/**< Plugin will never be unloaded unless for updates on mapchange */
    92 		PluginType_MapOnly,			/**< Plugin will be removed at mapchange */
    93 		PluginType_Global,			/**< Plugin will never be unloaded or updated */
    94 	};
    95 
    96 	/**
    97 	 * @brief Encapsulates a run-time plugin as maintained by SourceMod.
    98 	 */
    99 	class IPlugin
   100 	{
   101 	public:
   102 		/** Virtual destructor */
   103 		virtual ~IPlugin()
   104 		{
   105 		}
   106 
   107 		/**
   108 		 * @brief Returns the lifetime of a plugin.
   109 		 */
   110 		virtual PluginType GetType() =0;
   111 
   112 		/**
   113 		 * @brief Returns the IPluginRuntime::GetDefaultContext() value.
   114 		 *
   115 		 * @return	Pointer to an IPluginContext, or NULL if not loaded.
   116 		 */
   117 		virtual SourcePawn::IPluginContext *GetBaseContext() =0;
   118 
   119 		/**
   120 		 * @brief Deprecated, returns NULL.
   121 		 *
   122 		 * @return	NULL.
   123 		 */
   124 		virtual sp_context_t *GetContext() =0;
   125 
   126 		/**
   127 		 * @brief Deprecated, returns NULL.
   128 		 *
   129 		 * @return	NULL.
   130 		 */
   131 		virtual void *GetPluginStructure() =0;
   132 
   133 		/**
   134 		 * @brief Returns information about the plugin by reference.
   135 		 *
   136 		 * @return			Pointer to a sm_plugininfo_t object, NULL if plugin is not loaded.
   137 		 */
   138 		virtual const sm_plugininfo_t *GetPublicInfo() =0;
   139 
   140 		/**
   141 		 * @brief Returns the plugin filename (relative to plugins dir).
   142 		 */
   143 		virtual const char *GetFilename() =0;
   144 
   145 		/**
   146 		 * @brief Returns true if a plugin is in debug mode, false otherwise.
   147 		 */
   148 		virtual bool IsDebugging() =0;
   149 
   150 		/**
   151 		 * @brief Returns the plugin status.
   152 		 */
   153 		virtual PluginStatus GetStatus() =0;
   154 		
   155 		/**
   156 		 * @brief Sets whether the plugin is paused or not.
   157 		 *
   158 		 * @return			True on successful state change, false otherwise.
   159 		 */
   160 		virtual bool SetPauseState(bool paused) =0;
   161 
   162 		/**
   163 		 * @brief Returns the unique serial number of a plugin.
   164 		 */
   165 		virtual unsigned int GetSerial() =0;
   166 
   167 		/**
   168 		 * @brief Returns a plugin's identity token.
   169 		 */
   170 		virtual IdentityToken_t *GetIdentity() =0;
   171 
   172 		/**
   173 		 * @brief Sets a property on this plugin.  This is used for per-plugin
   174 		 * data from extensions or other parts of core.  The property's value must 
   175 		 * be manually destructed when the plugin is destroyed.
   176 		 *
   177 		 * @param prop		String containing name of the property.
   178 		 * @param ptr		Generic pointer to set.
   179 		 * @return			True on success, false if the property is already set.
   180 		 */
   181 		virtual bool SetProperty(const char *prop, void *ptr) =0;
   182 
   183 		/**
   184 		 * @brief Gets a property from a plugin.
   185 		 *
   186 		 * @param prop		String containing the property's name.
   187 		 * @param ptr		Optional pointer to the generic pointer.
   188 		 * @param remove	Optional boolean value; if true, property is removed
   189 		 *					(so it can be set again).
   190 		 * @return			True if the property existed, false otherwise.
   191 		 */
   192 		virtual bool GetProperty(const char *prop, void **ptr, bool remove=false) =0;
   193 
   194 		/**
   195 		 * @brief Returns the runtime representing this plugin.
   196 		 *
   197 		 * @return			IPluginRuntime pointer, or NULL if not loaded.
   198 		 */
   199 		virtual SourcePawn::IPluginRuntime *GetRuntime() =0;
   200 	};
   201 
   202 
   203 	/**
   204 	 * @brief Iterates over a list of plugins.
   205 	 */
   206 	class IPluginIterator
   207 	{
   208 	public:
   209 		/** Virtual destructor */
   210 		virtual ~IPluginIterator()
   211 		{
   212 		};
   213 	public:
   214 		/**
   215 		 * @brief Returns true if there are more plugins in the iterator.
   216 		 */
   217 		virtual bool MorePlugins() =0;
   218 
   219 		/**
   220 		 * @brief Returns the plugin at the current iterator position.
   221 		 */
   222 		virtual IPlugin *GetPlugin() =0;
   223 
   224 		/**
   225 		 * @brief Advances to the next plugin in the iterator.
   226 		 */
   227 		virtual void NextPlugin() =0;
   228 
   229 		/**
   230 		 * @brief Destroys the iterator object.
   231 		 * Note: You may use 'delete' in lieu of this function.
   232 		 */
   233 		virtual void Release() =0;
   234 	};
   235 
   236 	/**
   237 	 * @brief Listens for plugin-oriented events.
   238 	 */
   239 	class IPluginsListener
   240 	{
   241 	public:
   242 		/**
   243 		 * @brief Called when a plugin is created/mapped into memory.
   244 		 */
   245 		virtual void OnPluginCreated(IPlugin *plugin)
   246 		{
   247 		}
   248 
   249 		/**
   250 		 * @brief Called when a plugin is fully loaded successfully.
   251 		 */
   252 		virtual void OnPluginLoaded(IPlugin *plugin)
   253 		{
   254 		}
   255 
   256 		/**
   257 		* @brief Called when a plugin is paused or unpaused.
   258 		*/
   259 		virtual void OnPluginPauseChange(IPlugin *plugin, bool paused)
   260 		{
   261 		}
   262 
   263 		/**
   264 		 * @brief Called when a plugin is unloaded (only if fully loaded).
   265 		 */
   266 		virtual void OnPluginUnloaded(IPlugin *plugin)
   267 		{
   268 		}
   269 
   270 		/**
   271 		 * @brief Called when a plugin is destroyed.
   272 		 * NOTE: Always called if Created, even if load failed.
   273 		 */
   274 		virtual void OnPluginDestroyed(IPlugin *plugin)
   275 		{
   276 		}
   277 	};
   278 
   279 
   280 	/**
   281 	 * @brief Manages the runtime loading and unloading of plugins.
   282 	 */
   283 	class IPluginManager : public SMInterface
   284 	{
   285 	public:
   286 		virtual const char *GetInterfaceName()
   287 		{
   288 			return SMINTERFACE_PLUGINSYSTEM_NAME;
   289 		}
   290 
   291 		virtual unsigned int GetInterfaceVersion()
   292 		{
   293 			return SMINTERFACE_PLUGINSYSTEM_VERSION;
   294 		}
   295 	public:
   296 		/**
   297 		 * @brief Attempts to load a plugin.
   298 		 *
   299 		 * @param path		Path and filename of plugin, relative to plugins folder.
   300 		 * @param debug		Deprecated, must be false.
   301 		 * @param type		Lifetime of the plugin.
   302 		 * @param error		Buffer to hold any error message.
   303 		 * @param maxlength	Maximum length of error message buffer.
   304 		 * @param wasloaded	Stores if the plugin is already loaded.
   305 		 * @return			A new plugin pointer on success, false otherwise.
   306 		 */
   307 		virtual IPlugin *LoadPlugin(const char *path, 
   308 									bool debug,
   309 									PluginType type,
   310 									char error[],
   311 									size_t maxlength,
   312 									bool *wasloaded) =0;
   313 
   314 		/**
   315 		 * @brief Attempts to unload a plugin.
   316 		 *
   317 		 * @param plugin	Pointer to the plugin handle.
   318 		 * @return			True on success, false otherwise.
   319 		 */
   320 		virtual bool UnloadPlugin(IPlugin *plugin) =0;
   321 
   322 		/**
   323 		 * @brief Finds a plugin by its context.
   324 		 * Note: This function should be considered O(1).
   325 		 *
   326 		 * @param ctx		Pointer to an sp_context_t.
   327 		 * @return			Pointer to a matching IPlugin, or NULL if none found.
   328 		 */
   329 		virtual IPlugin *FindPluginByContext(const sp_context_t *ctx) =0;
   330 
   331 		/**
   332 		 * @brief Returns the number of plugins (both failed and loaded).
   333 		 *
   334 		 * @return			The number of internally cached plugins.
   335 		 */
   336 		virtual unsigned int GetPluginCount() =0;
   337 
   338 		/**
   339 		 * @brief Returns a pointer that can be used to iterate through plugins.
   340 		 * Note: This pointer must be freed using EITHER delete OR IPluginIterator::Release().
   341 		 */
   342 		virtual IPluginIterator *GetPluginIterator() =0;
   343 
   344 		/** 
   345 		 * @brief Adds a plugin manager listener.
   346 		 *
   347 		 * @param listener	Pointer to a listener.
   348 		 */
   349 		virtual void AddPluginsListener(IPluginsListener *listener) =0;
   350 
   351 		/**
   352 		 * @brief Removes a plugin listener.
   353 		 * 
   354 		 * @param listener	Pointer to a listener.
   355 		 */
   356 		virtual void RemovePluginsListener(IPluginsListener *listener) =0;
   357 
   358 		/**
   359 		 * @brief Converts a Handle to an IPlugin if possible.
   360 		 *
   361 		 * @param handle	Handle.
   362 		 * @param err		Error, set on failure (otherwise undefined).
   363 		 * @return			IPlugin pointer, or NULL on failure.
   364 		 */
   365 		virtual IPlugin *PluginFromHandle(Handle_t handle, HandleError *err) =0;
   366 	};
   367 }
   368 
   369 #endif //_INCLUDE_SOURCEMOD_PLUGINMNGR_INTERFACE_H_
   370