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