|
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. |
|
dvander@140
|
233 |
* @param lifetime 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 |
* |
|
dvander@159
|
247 |
* @param 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 |
* |
|
dvander@159
|
256 |
* @param 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_ |