dvander@372: /**
dvander@375: * vim: set ts=4 :
ds@1330: * =============================================================================
dvander@1226: * SourceMod
ds@1947: * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
ds@1330: * =============================================================================
dvander@372: *
ds@1330: * This program is free software; you can redistribute it and/or modify it under
ds@1330: * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330: * Free Software Foundation.
dvander@379: *
ds@1330: * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
ds@1330: * details.
dvander@1226: *
ds@1330: * You should have received a copy of the GNU General Public License along with
ds@1330: * this program. If not, see .
dvander@1226: *
ds@1330: * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330: * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330: * by the Valve Corporation. You must obey the GNU General Public License in
ds@1330: * all respects for all other code used. Additionally, AlliedModders LLC grants
ds@1330: * this exception to all derivative works. AlliedModders LLC defines further
ds@1330: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330: * or .
dvander@372: *
dvander@372: * Version: $Id$
dvander@372: */
dvander@372:
dvander@324: #ifndef _INCLUDE_SOURCEMOD_PLUGINMNGR_INTERFACE_H_
dvander@324: #define _INCLUDE_SOURCEMOD_PLUGINMNGR_INTERFACE_H_
dvander@324:
dvander@372: /**
dvander@372: * @file IPluginSys.h
dvander@372: * @brief Defines the interface for the Plugin System, which manages loaded plugins.
dvander@372: */
dvander@372:
dvander@324: #include
dvander@324: #include
dvander@324:
dvander@324: #define SMINTERFACE_PLUGINSYSTEM_NAME "IPluginManager"
dvander@486: #define SMINTERFACE_PLUGINSYSTEM_VERSION 2
dvander@324:
dvander@372: /** Context user slot 3 is used Core for holding an IPluginContext pointer. */
dvander@324: #define SM_CONTEXTVAR_USER 3
dvander@324:
dvander@324: namespace SourceMod
dvander@324: {
dvander@324: class IPlugin;
dvander@324:
dvander@324: /**
dvander@372: * @brief Encapsulates plugin public information exposed through "myinfo."
dvander@324: */
dvander@324: typedef struct sm_plugininfo_s
dvander@324: {
dvander@372: const char *name; /**< Plugin name */
dvander@372: const char *author; /**< Plugin author */
dvander@372: const char *description; /**< Plugin description */
dvander@372: const char *version; /**< Plugin version string */
dvander@372: const char *url; /**< Plugin URL */
dvander@324: } sm_plugininfo_t;
dvander@324:
dvander@324:
dvander@324: /**
dvander@324: * @brief Describes the usability status of a plugin.
dvander@324: */
dvander@324: enum PluginStatus
dvander@324: {
dvander@372: Plugin_Running=0, /**< Plugin is running */
dvander@324: /* All states below are unexecutable */
dvander@372: Plugin_Paused, /**< Plugin is loaded but paused */
dvander@372: Plugin_Error, /**< Plugin is loaded but errored/locked */
dvander@324: /* All states below do not have all natives */
dvander@372: Plugin_Loaded, /**< Plugin has passed loading and can be finalized */
dvander@372: Plugin_Failed, /**< Plugin has a fatal failure */
dvander@372: Plugin_Created, /**< Plugin is created but not initialized */
dvander@372: Plugin_Uncompiled, /**< Plugin is not yet compiled by the JIT */
dvander@372: Plugin_BadLoad, /**< Plugin failed to load */
dvander@324: };
dvander@324:
dvander@324:
dvander@324: /**
dvander@324: * @brief Describes the object lifetime of a plugin.
dvander@324: */
dvander@324: enum PluginType
dvander@324: {
dvander@372: PluginType_Private, /**< Plugin is privately managed and receives no forwards */
dvander@372: PluginType_MapUpdated, /**< Plugin will never be unloaded unless for updates on mapchange */
dvander@372: PluginType_MapOnly, /**< Plugin will be removed at mapchange */
dvander@372: PluginType_Global, /**< Plugin will never be unloaded or updated */
dvander@324: };
dvander@324:
dvander@324: /**
dvander@324: * @brief Encapsulates a run-time plugin as maintained by SourceMod.
dvander@324: */
dvander@324: class IPlugin
dvander@324: {
dvander@324: public:
dvander@372: /** Virtual destructor */
dvander@324: virtual ~IPlugin()
dvander@324: {
dvander@324: }
dvander@324:
dvander@324: /**
dvander@324: * @brief Returns the lifetime of a plugin.
dvander@324: */
dvander@615: virtual PluginType GetType() =0;
dvander@324:
dvander@324: /**
dvander@2174: * @brief Returns the IPluginRuntime::GetDefaultContext() value.
dvander@324: *
dvander@324: * @return Pointer to an IPluginContext, or NULL if not loaded.
dvander@324: */
dvander@615: virtual SourcePawn::IPluginContext *GetBaseContext() =0;
dvander@324:
dvander@324: /**
dvander@2174: * @brief Deprecated, returns NULL.
dvander@324: *
dvander@2174: * @return NULL.
dvander@324: */
dvander@615: virtual sp_context_t *GetContext() =0;
dvander@324:
dvander@324: /**
dvander@2174: * @brief Deprecated, returns NULL.
dvander@324: *
dvander@2174: * @return NULL.
dvander@324: */
dvander@2174: virtual void *GetPluginStructure() =0;
dvander@324:
dvander@324: /**
dvander@324: * @brief Returns information about the plugin by reference.
dvander@324: *
dvander@324: * @return Pointer to a sm_plugininfo_t object, NULL if plugin is not loaded.
dvander@324: */
dvander@615: virtual const sm_plugininfo_t *GetPublicInfo() =0;
dvander@324:
dvander@324: /**
dvander@324: * @brief Returns the plugin filename (relative to plugins dir).
dvander@324: */
dvander@615: virtual const char *GetFilename() =0;
dvander@324:
dvander@324: /**
dvander@324: * @brief Returns true if a plugin is in debug mode, false otherwise.
dvander@324: */
dvander@615: virtual bool IsDebugging() =0;
dvander@324:
dvander@324: /**
dvander@324: * @brief Returns the plugin status.
dvander@324: */
dvander@615: virtual PluginStatus GetStatus() =0;
dvander@324:
dvander@324: /**
dvander@324: * @brief Sets whether the plugin is paused or not.
dvander@324: *
dvander@324: * @return True on successful state change, false otherwise.
dvander@324: */
dvander@324: virtual bool SetPauseState(bool paused) =0;
dvander@324:
dvander@324: /**
dvander@324: * @brief Returns the unique serial number of a plugin.
dvander@324: */
dvander@615: virtual unsigned int GetSerial() =0;
dvander@324:
dvander@324: /**
dvander@324: * @brief Returns a plugin's identity token.
dvander@324: */
dvander@615: virtual IdentityToken_t *GetIdentity() =0;
dvander@486:
dvander@486: /**
dvander@486: * @brief Sets a property on this plugin. This is used for per-plugin
dvander@486: * data from extensions or other parts of core. The property's value must
dvander@486: * be manually destructed when the plugin is destroyed.
dvander@486: *
dvander@486: * @param prop String containing name of the property.
dvander@486: * @param ptr Generic pointer to set.
dvander@486: * @return True on success, false if the property is already set.
dvander@486: */
dvander@486: virtual bool SetProperty(const char *prop, void *ptr) =0;
dvander@486:
dvander@486: /**
dvander@486: * @brief Gets a property from a plugin.
dvander@486: *
dvander@486: * @param prop String containing the property's name.
dvander@486: * @param ptr Optional pointer to the generic pointer.
dvander@486: * @param remove Optional boolean value; if true, property is removed
dvander@486: * (so it can be set again).
dvander@486: * @return True if the property existed, false otherwise.
dvander@486: */
dvander@486: virtual bool GetProperty(const char *prop, void **ptr, bool remove=false) =0;
dvander@2174:
dvander@2174: /**
dvander@2174: * @brief Returns the runtime representing this plugin.
dvander@2174: *
dvander@2174: * @return IPluginRuntime pointer, or NULL if not loaded.
dvander@2174: */
dvander@2174: virtual SourcePawn::IPluginRuntime *GetRuntime() =0;
dvander@324: };
dvander@324:
dvander@324:
dvander@324: /**
dvander@324: * @brief Iterates over a list of plugins.
dvander@324: */
dvander@324: class IPluginIterator
dvander@324: {
dvander@324: public:
dvander@372: /** Virtual destructor */
dvander@324: virtual ~IPluginIterator()
dvander@324: {
dvander@324: };
dvander@324: public:
dvander@324: /**
dvander@324: * @brief Returns true if there are more plugins in the iterator.
dvander@324: */
dvander@324: virtual bool MorePlugins() =0;
dvander@324:
dvander@324: /**
dvander@324: * @brief Returns the plugin at the current iterator position.
dvander@324: */
dvander@324: virtual IPlugin *GetPlugin() =0;
dvander@324:
dvander@324: /**
dvander@324: * @brief Advances to the next plugin in the iterator.
dvander@324: */
dvander@324: virtual void NextPlugin() =0;
dvander@324:
dvander@324: /**
dvander@324: * @brief Destroys the iterator object.
dvander@324: * Note: You may use 'delete' in lieu of this function.
dvander@324: */
dvander@324: virtual void Release() =0;
dvander@324: };
dvander@324:
dvander@324: /**
dvander@324: * @brief Listens for plugin-oriented events.
dvander@324: */
dvander@324: class IPluginsListener
dvander@324: {
dvander@324: public:
dvander@324: /**
dvander@324: * @brief Called when a plugin is created/mapped into memory.
dvander@324: */
dvander@324: virtual void OnPluginCreated(IPlugin *plugin)
dvander@324: {
dvander@324: }
dvander@324:
dvander@324: /**
dvander@324: * @brief Called when a plugin is fully loaded successfully.
dvander@324: */
dvander@324: virtual void OnPluginLoaded(IPlugin *plugin)
dvander@324: {
dvander@324: }
dvander@324:
dvander@324: /**
faluco@430: * @brief Called when a plugin is paused or unpaused.
faluco@430: */
faluco@430: virtual void OnPluginPauseChange(IPlugin *plugin, bool paused)
faluco@430: {
faluco@430: }
faluco@430:
faluco@430: /**
dvander@324: * @brief Called when a plugin is unloaded (only if fully loaded).
dvander@324: */
dvander@324: virtual void OnPluginUnloaded(IPlugin *plugin)
dvander@324: {
dvander@324: }
dvander@324:
dvander@324: /**
dvander@324: * @brief Called when a plugin is destroyed.
dvander@324: * NOTE: Always called if Created, even if load failed.
dvander@324: */
dvander@324: virtual void OnPluginDestroyed(IPlugin *plugin)
dvander@324: {
dvander@324: }
dvander@324: };
dvander@324:
dvander@324:
dvander@324: /**
dvander@324: * @brief Manages the runtime loading and unloading of plugins.
dvander@324: */
dvander@324: class IPluginManager : public SMInterface
dvander@324: {
dvander@324: public:
dvander@324: virtual const char *GetInterfaceName()
dvander@324: {
dvander@324: return SMINTERFACE_PLUGINSYSTEM_NAME;
dvander@324: }
dvander@324:
dvander@324: virtual unsigned int GetInterfaceVersion()
dvander@324: {
dvander@324: return SMINTERFACE_PLUGINSYSTEM_VERSION;
dvander@324: }
dvander@324: public:
dvander@324: /**
dvander@324: * @brief Attempts to load a plugin.
dvander@324: *
dvander@324: * @param path Path and filename of plugin, relative to plugins folder.
dvander@2226: * @param debug Deprecated, must be false.
dvander@324: * @param type Lifetime of the plugin.
dvander@324: * @param error Buffer to hold any error message.
ds@755: * @param maxlength Maximum length of error message buffer.
faluco@383: * @param wasloaded Stores if the plugin is already loaded.
dvander@324: * @return A new plugin pointer on success, false otherwise.
dvander@324: */
dvander@324: virtual IPlugin *LoadPlugin(const char *path,
dvander@324: bool debug,
dvander@324: PluginType type,
dvander@324: char error[],
ds@755: size_t maxlength,
faluco@383: bool *wasloaded) =0;
dvander@324:
dvander@324: /**
dvander@324: * @brief Attempts to unload a plugin.
dvander@324: *
dvander@324: * @param plugin Pointer to the plugin handle.
dvander@324: * @return True on success, false otherwise.
dvander@324: */
dvander@324: virtual bool UnloadPlugin(IPlugin *plugin) =0;
dvander@324:
dvander@324: /**
dvander@324: * @brief Finds a plugin by its context.
dvander@324: * Note: This function should be considered O(1).
dvander@324: *
dvander@324: * @param ctx Pointer to an sp_context_t.
dvander@324: * @return Pointer to a matching IPlugin, or NULL if none found.
dvander@324: */
dvander@324: virtual IPlugin *FindPluginByContext(const sp_context_t *ctx) =0;
dvander@324:
dvander@324: /**
dvander@324: * @brief Returns the number of plugins (both failed and loaded).
dvander@324: *
dvander@324: * @return The number of internally cached plugins.
dvander@324: */
dvander@324: virtual unsigned int GetPluginCount() =0;
dvander@324:
dvander@324: /**
dvander@324: * @brief Returns a pointer that can be used to iterate through plugins.
dvander@324: * Note: This pointer must be freed using EITHER delete OR IPluginIterator::Release().
dvander@324: */
dvander@324: virtual IPluginIterator *GetPluginIterator() =0;
dvander@324:
dvander@324: /**
dvander@324: * @brief Adds a plugin manager listener.
dvander@324: *
dvander@324: * @param listener Pointer to a listener.
dvander@324: */
dvander@324: virtual void AddPluginsListener(IPluginsListener *listener) =0;
dvander@324:
dvander@324: /**
dvander@324: * @brief Removes a plugin listener.
dvander@324: *
dvander@324: * @param listener Pointer to a listener.
dvander@324: */
dvander@324: virtual void RemovePluginsListener(IPluginsListener *listener) =0;
dvander@324: };
ds@432: }
dvander@324:
dvander@324: #endif //_INCLUDE_SOURCEMOD_PLUGINMNGR_INTERFACE_H_