core/interfaces/IPluginSys.h
author Borja Ferrer <faluco@alliedmods.net>
Mon Nov 13 13:55:44 2006 +0000 (2006-11-13)
changeset 185 5e0987d38ee0
parent 177 d29ade52d953
child 209 fae1894d884c
permissions -rw-r--r--
iface comment fixes and sync
dvander@140
     1
#ifndef _INCLUDE_SOURCEMOD_PLUGINMNGR_INTERFACE_H_
dvander@140
     2
#define _INCLUDE_SOURCEMOD_PLUGINMNGR_INTERFACE_H_
dvander@140
     3
dvander@140
     4
#include <IShareSys.h>
dvander@172
     5
#include <sp_vm_api.h>
dvander@140
     6
dvander@140
     7
#define SMINTERFACE_PLUGINMANAGER_NAME		"IPluginManager"
dvander@140
     8
#define SMINTERFACE_PLUGINMANAGER_VERSION	1
dvander@140
     9
dvander@174
    10
#define SM_CONTEXTVAR_USER		3
dvander@174
    11
dvander@140
    12
namespace SourceMod
dvander@140
    13
{
dvander@177
    14
	class IPlugin;
dvander@177
    15
dvander@159
    16
	/** 
dvander@159
    17
	 * @brief Encapsulates plugin public information.
dvander@159
    18
	 */
dvander@159
    19
	typedef struct sm_plugininfo_s
dvander@159
    20
	{
dvander@159
    21
		const char *name;
dvander@159
    22
		const char *author;
dvander@159
    23
		const char *description;
dvander@159
    24
		const char *version;
dvander@159
    25
		const char *url;
dvander@159
    26
	} sm_plugininfo_t;
dvander@159
    27
dvander@159
    28
	/**
dvander@159
    29
	 * @brief Describes the usability status of a plugin.
dvander@159
    30
	 */
dvander@159
    31
	enum PluginStatus
dvander@159
    32
	{
dvander@159
    33
		Plugin_Running=0,		/* Plugin is running */
dvander@172
    34
		Plugin_Loaded,			/* Plugin is loaded but not initialized */
dvander@159
    35
		Plugin_Paused,			/* Plugin is paused */
dvander@159
    36
		Plugin_Stopped,			/* Plugin is paused for map changes, too */
dvander@159
    37
		Plugin_Error,			/* Plugin has a blocking error */
dvander@159
    38
		Plugin_BadLoad,			/* Plugin failed to load */
dvander@159
    39
	};
dvander@159
    40
dvander@174
    41
dvander@159
    42
	/**
dvander@159
    43
	 * @brief Describes the object lifetime of a plugin.
dvander@159
    44
	 */
dvander@174
    45
	enum PluginType
dvander@174
    46
	{
dvander@174
    47
		PluginType_Private,			/* Plugin is privately managed and receives no forwards */
dvander@174
    48
		PluginType_MapUpdated,		/* Plugin will never be unloaded unless for updates on mapchange */
dvander@174
    49
		PluginType_MapOnly,			/* Plugin will be removed at mapchange */
dvander@174
    50
		PluginType_Global,			/* Plugin will never be unloaded or updated */
dvander@174
    51
	};
dvander@174
    52
dvander@177
    53
	class IPluginFunction;
dvander@159
    54
dvander@159
    55
	/**
dvander@159
    56
	 * @brief Encapsulates a run-time plugin as maintained by SourceMod.
dvander@159
    57
	 */
dvander@174
    58
	class IPlugin
dvander@140
    59
	{
dvander@140
    60
	public:
dvander@174
    61
		virtual ~IPlugin()
dvander@140
    62
		{
dvander@174
    63
		}
dvander@174
    64
dvander@159
    65
		/**
dvander@159
    66
		 * @brief Returns the lifetime of a plugin.
dvander@159
    67
		 */
dvander@174
    68
		virtual PluginType GetType() const =0;
dvander@159
    69
dvander@159
    70
		/**
dvander@159
    71
		 * @brief Returns the current API context being used in the plugin.
dvander@159
    72
		 *
dvander@159
    73
		 * @return	Pointer to an IPluginContext, or NULL if not loaded.
dvander@159
    74
		 */
dvander@172
    75
		virtual SourcePawn::IPluginContext *GetBaseContext() const =0;
dvander@159
    76
dvander@159
    77
		/**
dvander@159
    78
		 * @brief Returns the context structure being used in the plugin.
dvander@159
    79
		 *
dvander@172
    80
		 * @return	Pointer to an sp_context_t, or NULL if not loaded.
dvander@159
    81
		 */
dvander@172
    82
		virtual sp_context_t *GetContext() const =0;
dvander@159
    83
dvander@159
    84
		/**
dvander@172
    85
		 * @brief Returns the plugin file structure.
dvander@159
    86
		 *
dvander@172
    87
		 * @return	Pointer to an sp_plugin_t, or NULL if not loaded.
dvander@159
    88
		 */
dvander@172
    89
		virtual const sp_plugin_t *GetPluginStructure() const =0;
dvander@172
    90
dvander@172
    91
		/**
dvander@172
    92
		 * @brief Returns information about the plugin by reference.
dvander@172
    93
		 *
dvander@172
    94
		 * @return			Pointer to a sm_plugininfo_t object, NULL if plugin is not loaded.
dvander@172
    95
		 */
dvander@172
    96
		virtual const sm_plugininfo_t *GetPublicInfo() const =0;
dvander@159
    97
dvander@159
    98
		/**
dvander@159
    99
		 * @brief Returns the plugin filename (relative to plugins dir).
dvander@159
   100
		 */
dvander@172
   101
		virtual const char *GetFilename() const =0;
dvander@159
   102
dvander@159
   103
		/**
dvander@159
   104
		 * @brief Returns true if a plugin is in debug mode, false otherwise.
dvander@159
   105
		 */
dvander@172
   106
		virtual bool IsDebugging() const =0;
dvander@159
   107
dvander@159
   108
		/**
dvander@159
   109
		 * @brief Returns the plugin status.
dvander@159
   110
		 */
dvander@172
   111
		virtual PluginStatus GetStatus() const =0;
dvander@159
   112
		
dvander@159
   113
		/**
dvander@159
   114
		 * @brief Sets whether the plugin is paused or not.
dvander@159
   115
		 *
dvander@172
   116
		 * @return			True on successful state change, false otherwise.
dvander@159
   117
		 */
dvander@159
   118
		virtual bool SetPauseState(bool paused) =0;
dvander@159
   119
dvander@159
   120
		/**
dvander@159
   121
		 * @brief Returns the unique serial number of a plugin.
dvander@159
   122
		 */
dvander@172
   123
		virtual unsigned int GetSerial() const =0;
dvander@174
   124
dvander@174
   125
		/**
dvander@174
   126
		 * @brief Returns a function by name.
dvander@174
   127
		 *
dvander@174
   128
		 * @param public_name		Name of the function.
dvander@174
   129
		 * @return					A new IPluginFunction pointer, NULL if not found.
dvander@174
   130
		 */
dvander@174
   131
		virtual IPluginFunction *GetFunctionByName(const char *public_name) =0;
dvander@174
   132
dvander@174
   133
		/**
dvander@174
   134
		 * @brief Returns a function by its id.
dvander@174
   135
		 *
dvander@174
   136
		 * @param func_id			Function ID.
dvander@174
   137
		 * @return					A new IPluginFunction pointer, NULL if not found.
dvander@174
   138
		 */
dvander@174
   139
		virtual IPluginFunction *GetFunctionById(funcid_t func_id) =0;
dvander@140
   140
	};
dvander@140
   141
dvander@159
   142
dvander@159
   143
	/**
dvander@159
   144
	 * @brief Iterates over a list of plugins.
dvander@159
   145
	 */
dvander@159
   146
	class IPluginIterator
dvander@140
   147
	{
dvander@159
   148
	public:
dvander@172
   149
		virtual ~IPluginIterator()
dvander@159
   150
		{
dvander@159
   151
		};
dvander@159
   152
	public:
dvander@159
   153
		/**
dvander@159
   154
		 * @brief Returns true if there are more plugins in the iterator.
dvander@159
   155
		 */
dvander@159
   156
		virtual bool MorePlugins() =0;
dvander@159
   157
dvander@159
   158
		/**
dvander@159
   159
		 * @brief Returns the plugin at the current iterator position.
dvander@159
   160
		 */
dvander@159
   161
		virtual IPlugin *GetPlugin() =0;
dvander@159
   162
dvander@159
   163
		/**
dvander@159
   164
		 * @brief Advances to the next plugin in the iterator.
dvander@159
   165
		 */
dvander@159
   166
		virtual void NextPlugin() =0;
dvander@159
   167
dvander@159
   168
		/**
dvander@159
   169
		 * @brief Destroys the iterator object.
dvander@159
   170
		 * Note: You may use 'delete' in lieu of this function.
dvander@159
   171
		 */
dvander@159
   172
		virtual void Release() =0;
dvander@140
   173
	};
dvander@140
   174
dvander@174
   175
	/**
dvander@174
   176
	 * @brief Listens for plugin-oriented events.
dvander@174
   177
	 */
dvander@174
   178
	class IPluginsListener
dvander@174
   179
	{
dvander@174
   180
	public:
dvander@174
   181
		/**
dvander@174
   182
		 * @brief Called when a plugin is created/mapped into memory.
dvander@174
   183
		 */
dvander@174
   184
		virtual void OnPluginCreated(IPlugin *plugin)
dvander@174
   185
		{
dvander@174
   186
		}
dvander@174
   187
dvander@174
   188
		/**
dvander@174
   189
		 * @brief Called when a plugin is fully loaded successfully.
dvander@174
   190
		 */
dvander@174
   191
		virtual void OnPluginLoaded(IPlugin *plugin)
dvander@174
   192
		{
dvander@174
   193
		}
dvander@174
   194
dvander@174
   195
		/**
dvander@174
   196
		 * @brief Called when a plugin is unloaded (only if fully loaded).
dvander@174
   197
		 */
dvander@174
   198
		virtual void OnPluginUnloaded(IPlugin *plugin)
dvander@174
   199
		{
dvander@174
   200
		}
dvander@174
   201
dvander@174
   202
		/**
dvander@174
   203
		 * @brief Called when a plugin is destroyed.
dvander@174
   204
		 * NOTE: Always called if Created, even if load failed.
dvander@174
   205
		 */
dvander@174
   206
		virtual void OnPluginDestroyed(IPlugin *plugin)
dvander@174
   207
		{
dvander@174
   208
		}
dvander@174
   209
	};
dvander@174
   210
dvander@159
   211
dvander@159
   212
	/**
dvander@159
   213
	 * @brief Manages the runtime loading and unloading of plugins.
dvander@159
   214
	 */
dvander@140
   215
	class IPluginManager : public SMInterface
dvander@140
   216
	{
dvander@140
   217
	public:
dvander@140
   218
		virtual const char *GetInterfaceName()
dvander@140
   219
		{
dvander@140
   220
			return SMINTERFACE_PLUGINMANAGER_NAME;
dvander@140
   221
		}
dvander@140
   222
dvander@140
   223
		virtual unsigned int GetInterfaceVersion()
dvander@140
   224
		{
dvander@140
   225
			return SMINTERFACE_PLUGINMANAGER_VERSION;
dvander@140
   226
		}
dvander@140
   227
	public:
dvander@140
   228
		/**
dvander@140
   229
		 * @brief Attempts to load a plugin.
dvander@140
   230
		 *
dvander@140
   231
		 * @param path		Path and filename of plugin, relative to plugins folder.
dvander@140
   232
		 * @param debug		Whether or not to default the plugin into debug mode.
faluco@185
   233
		 * @param type		Lifetime of the plugin.
dvander@140
   234
		 * @param error		Buffer to hold any error message.
dvander@140
   235
		 * @param err_max	Maximum length of error message buffer.
dvander@140
   236
		 * @return			A new plugin pointer on success, false otherwise.
dvander@140
   237
		 */
dvander@140
   238
		virtual IPlugin *LoadPlugin(const char *path, 
dvander@140
   239
									bool debug,
dvander@174
   240
									PluginType type,
dvander@140
   241
									char error[],
dvander@140
   242
									size_t err_max) =0;
dvander@159
   243
dvander@159
   244
		/**
dvander@159
   245
		 * @brief Attempts to unload a plugin.
dvander@159
   246
		 *
faluco@185
   247
		 * @param plugin	Pointer to the plugin handle.
dvander@159
   248
		 * @return			True on success, false otherwise.
dvander@159
   249
		 */
dvander@159
   250
		virtual bool UnloadPlugin(IPlugin *plugin) =0;
dvander@159
   251
dvander@159
   252
		/**
dvander@159
   253
		 * @brief Finds a plugin by its context.
dvander@159
   254
		 * Note: This function should be considered O(1).
dvander@159
   255
		 *
faluco@185
   256
		 * @param ctx		Pointer to an sp_context_t.
dvander@159
   257
		 * @return			Pointer to a matching IPlugin, or NULL if none found.
dvander@159
   258
		 */
dvander@159
   259
		virtual IPlugin *FindPluginByContext(const sp_context_t *ctx) =0;
dvander@159
   260
dvander@159
   261
		/**
dvander@159
   262
		 * @brief Returns the number of plugins (both failed and loaded).
dvander@159
   263
		 *
dvander@159
   264
		 * @return			The number of internally cached plugins.
dvander@159
   265
		 */
dvander@159
   266
		virtual unsigned int GetPluginCount() =0;
dvander@159
   267
dvander@159
   268
		/**
dvander@159
   269
		 * @brief Returns a pointer that can be used to iterate through plugins.
dvander@159
   270
		 * Note: This pointer must be freed using EITHER delete OR IPluginIterator::Release().
dvander@159
   271
		 */
dvander@159
   272
		virtual IPluginIterator *GetPluginIterator() =0;
dvander@174
   273
dvander@174
   274
		/** 
dvander@174
   275
		 * @brief Adds a plugin manager listener.
dvander@174
   276
		 *
dvander@174
   277
		 * @param listener	Pointer to a listener.
dvander@174
   278
		 */
dvander@174
   279
		virtual void AddPluginsListener(IPluginsListener *listener) =0;
dvander@174
   280
dvander@174
   281
		/**
dvander@174
   282
		 * @brief Removes a plugin listener.
dvander@174
   283
		 * 
dvander@174
   284
		 * @param listener	Pointer to a listener.
dvander@174
   285
		 */
dvander@174
   286
		virtual void RemovePluginsListener(IPluginsListener *listener) =0;
dvander@140
   287
	};
dvander@140
   288
};
dvander@140
   289
dvander@140
   290
#endif //_INCLUDE_SOURCEMOD_PLUGINMNGR_INTERFACE_H_