3 * =============================================================================
5 * Copyright (C) 2004-2009 AlliedModders LLC. All rights reserved.
6 * =============================================================================
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.
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
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/>.
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>.
32 #ifndef _INCLUDE_SOURCEMOD_PLUGINMNGR_INTERFACE_H_
33 #define _INCLUDE_SOURCEMOD_PLUGINMNGR_INTERFACE_H_
37 * @brief Defines the interface for the Plugin System, which manages loaded plugins.
40 #include <IShareSys.h>
41 #include <IHandleSys.h>
42 #include <sp_vm_api.h>
44 #define SMINTERFACE_PLUGINSYSTEM_NAME "IPluginManager"
45 #define SMINTERFACE_PLUGINSYSTEM_VERSION 5
47 /** Context user slot 3 is used Core for holding an IPluginContext pointer. */
48 #define SM_CONTEXTVAR_USER 3
55 * @brief Encapsulates plugin public information exposed through "myinfo."
57 typedef struct sm_plugininfo_s
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 */
68 * @brief Describes the usability status of a plugin.
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 */
86 * @brief Describes the object lifetime of a plugin.
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 */
96 class IPhraseCollection;
99 * @brief Encapsulates a run-time plugin as maintained by SourceMod.
104 /** Virtual destructor */
110 * @brief Returns the lifetime of a plugin.
112 virtual PluginType GetType() =0;
115 * @brief Returns the IPluginRuntime::GetDefaultContext() value.
117 * @return Pointer to an IPluginContext, or NULL if not loaded.
119 virtual SourcePawn::IPluginContext *GetBaseContext() =0;
122 * @brief Deprecated, returns NULL.
126 virtual sp_context_t *GetContext() =0;
129 * @brief Deprecated, returns NULL.
133 virtual void *GetPluginStructure() =0;
136 * @brief Returns information about the plugin by reference.
138 * @return Pointer to a sm_plugininfo_t object, NULL if plugin is not loaded.
140 virtual const sm_plugininfo_t *GetPublicInfo() =0;
143 * @brief Returns the plugin filename (relative to plugins dir).
145 virtual const char *GetFilename() =0;
148 * @brief Returns true if a plugin is in debug mode, false otherwise.
150 virtual bool IsDebugging() =0;
153 * @brief Returns the plugin status.
155 virtual PluginStatus GetStatus() =0;
158 * @brief Sets whether the plugin is paused or not.
160 * @return True on successful state change, false otherwise.
162 virtual bool SetPauseState(bool paused) =0;
165 * @brief Returns the unique serial number of a plugin.
167 virtual unsigned int GetSerial() =0;
170 * @brief Returns a plugin's identity token.
172 virtual IdentityToken_t *GetIdentity() =0;
175 * @brief Sets a property on this plugin. This is used for per-plugin
176 * data from extensions or other parts of core. The property's value must
177 * be manually destructed when the plugin is destroyed.
179 * @param prop String containing name of the property.
180 * @param ptr Generic pointer to set.
181 * @return True on success, false if the property is already set.
183 virtual bool SetProperty(const char *prop, void *ptr) =0;
186 * @brief Gets a property from a plugin.
188 * @param prop String containing the property's name.
189 * @param ptr Optional pointer to the generic pointer.
190 * @param remove Optional boolean value; if true, property is removed
191 * (so it can be set again).
192 * @return True if the property existed, false otherwise.
194 virtual bool GetProperty(const char *prop, void **ptr, bool remove=false) =0;
197 * @brief Returns the runtime representing this plugin.
199 * @return IPluginRuntime pointer, or NULL if not loaded.
201 virtual SourcePawn::IPluginRuntime *GetRuntime() =0;
204 * @brief Returns the plugin's phrase collection.
206 * @return Plugin's phrase collection.
208 virtual IPhraseCollection *GetPhrases() =0;
211 * @brief Returns a plugin's handle.
213 * @return Plugin's handle.
215 virtual Handle_t GetMyHandle() =0;
220 * @brief Iterates over a list of plugins.
222 class IPluginIterator
225 /** Virtual destructor */
226 virtual ~IPluginIterator()
231 * @brief Returns true if there are more plugins in the iterator.
233 virtual bool MorePlugins() =0;
236 * @brief Returns the plugin at the current iterator position.
238 virtual IPlugin *GetPlugin() =0;
241 * @brief Advances to the next plugin in the iterator.
243 virtual void NextPlugin() =0;
246 * @brief Destroys the iterator object.
247 * Note: You may use 'delete' in lieu of this function.
249 virtual void Release() =0;
253 * @brief Listens for plugin-oriented events.
255 class IPluginsListener
259 * @brief Called when a plugin is created/mapped into memory.
261 virtual void OnPluginCreated(IPlugin *plugin)
266 * @brief Called when a plugin is fully loaded successfully.
268 virtual void OnPluginLoaded(IPlugin *plugin)
273 * @brief Called when a plugin is paused or unpaused.
275 virtual void OnPluginPauseChange(IPlugin *plugin, bool paused)
280 * @brief Called when a plugin is unloaded (only if fully loaded).
282 virtual void OnPluginUnloaded(IPlugin *plugin)
287 * @brief Called when a plugin is destroyed.
288 * NOTE: Always called if Created, even if load failed.
290 virtual void OnPluginDestroyed(IPlugin *plugin)
297 * @brief Manages the runtime loading and unloading of plugins.
299 class IPluginManager : public SMInterface
302 virtual const char *GetInterfaceName()
304 return SMINTERFACE_PLUGINSYSTEM_NAME;
307 virtual unsigned int GetInterfaceVersion()
309 return SMINTERFACE_PLUGINSYSTEM_VERSION;
313 * @brief Attempts to load a plugin.
315 * @param path Path and filename of plugin, relative to plugins folder.
316 * @param debug Deprecated, must be false.
317 * @param type Lifetime of the plugin.
318 * @param error Buffer to hold any error message.
319 * @param maxlength Maximum length of error message buffer.
320 * @param wasloaded Stores if the plugin is already loaded.
321 * @return A new plugin pointer on success, false otherwise.
323 virtual IPlugin *LoadPlugin(const char *path,
331 * @brief Attempts to unload a plugin.
333 * @param plugin Pointer to the plugin handle.
334 * @return True on success, false otherwise.
336 virtual bool UnloadPlugin(IPlugin *plugin) =0;
339 * @brief Finds a plugin by its context.
340 * Note: This function should be considered O(1).
342 * @param ctx Pointer to an sp_context_t.
343 * @return Pointer to a matching IPlugin, or NULL if none found.
345 virtual IPlugin *FindPluginByContext(const sp_context_t *ctx) =0;
348 * @brief Returns the number of plugins (both failed and loaded).
350 * @return The number of internally cached plugins.
352 virtual unsigned int GetPluginCount() =0;
355 * @brief Returns a pointer that can be used to iterate through plugins.
356 * Note: This pointer must be freed using EITHER delete OR IPluginIterator::Release().
358 virtual IPluginIterator *GetPluginIterator() =0;
361 * @brief Adds a plugin manager listener.
363 * @param listener Pointer to a listener.
365 virtual void AddPluginsListener(IPluginsListener *listener) =0;
368 * @brief Removes a plugin listener.
370 * @param listener Pointer to a listener.
372 virtual void RemovePluginsListener(IPluginsListener *listener) =0;
375 * @brief Converts a Handle to an IPlugin if possible.
377 * @param handle Handle.
378 * @param err Error, set on failure (otherwise undefined).
379 * @return IPlugin pointer, or NULL on failure.
381 virtual IPlugin *PluginFromHandle(Handle_t handle, HandleError *err) =0;
385 #endif //_INCLUDE_SOURCEMOD_PLUGINMNGR_INTERFACE_H_