|
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_ |