|
dvander@372
|
1 |
/** |
|
dvander@2730
|
2 |
* vim: set ts=4 sw=4 : |
|
ds@1330
|
3 |
* ============================================================================= |
|
dvander@1226
|
4 |
* SourceMod |
|
dvander@2730
|
5 |
* Copyright (C) 2004-2009 AlliedModders LLC. All rights reserved. |
|
ds@1330
|
6 |
* ============================================================================= |
|
dvander@372
|
7 |
* |
|
ds@1330
|
8 |
* This program is free software; you can redistribute it and/or modify it under |
|
ds@1330
|
9 |
* the terms of the GNU General Public License, version 3.0, as published by the |
|
ds@1330
|
10 |
* Free Software Foundation. |
|
dvander@379
|
11 |
* |
|
ds@1330
|
12 |
* This program is distributed in the hope that it will be useful, but WITHOUT |
|
ds@1330
|
13 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
|
ds@1330
|
14 |
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more |
|
ds@1330
|
15 |
* details. |
|
dvander@1226
|
16 |
* |
|
ds@1330
|
17 |
* You should have received a copy of the GNU General Public License along with |
|
ds@1330
|
18 |
* this program. If not, see <http://www.gnu.org/licenses/>. |
|
dvander@1226
|
19 |
* |
|
ds@1330
|
20 |
* As a special exception, AlliedModders LLC gives you permission to link the |
|
ds@1330
|
21 |
* code of this program (as well as its derivative works) to "Half-Life 2," the |
|
ds@1330
|
22 |
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software |
|
ds@1330
|
23 |
* by the Valve Corporation. You must obey the GNU General Public License in |
|
ds@1330
|
24 |
* all respects for all other code used. Additionally, AlliedModders LLC grants |
|
ds@1330
|
25 |
* this exception to all derivative works. AlliedModders LLC defines further |
|
ds@1330
|
26 |
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), |
|
ds@1330
|
27 |
* or <http://www.sourcemod.net/license.php>. |
|
dvander@372
|
28 |
* |
|
dvander@372
|
29 |
* Version: $Id$ |
|
dvander@372
|
30 |
*/ |
|
dvander@372
|
31 |
|
|
dvander@324
|
32 |
#ifndef _INCLUDE_SOURCEMOD_PLUGINMNGR_INTERFACE_H_ |
|
dvander@324
|
33 |
#define _INCLUDE_SOURCEMOD_PLUGINMNGR_INTERFACE_H_ |
|
dvander@324
|
34 |
|
|
dvander@372
|
35 |
/** |
|
dvander@372
|
36 |
* @file IPluginSys.h |
|
dvander@372
|
37 |
* @brief Defines the interface for the Plugin System, which manages loaded plugins. |
|
dvander@372
|
38 |
*/ |
|
dvander@372
|
39 |
|
|
dvander@324
|
40 |
#include <IShareSys.h> |
|
dvander@2730
|
41 |
#include <IHandleSys.h> |
|
dvander@324
|
42 |
#include <sp_vm_api.h> |
|
dvander@324
|
43 |
|
|
dvander@324
|
44 |
#define SMINTERFACE_PLUGINSYSTEM_NAME "IPluginManager" |
|
dvander@3008
|
45 |
#define SMINTERFACE_PLUGINSYSTEM_VERSION 5 |
|
dvander@324
|
46 |
|
|
dvander@372
|
47 |
/** Context user slot 3 is used Core for holding an IPluginContext pointer. */ |
|
dvander@324
|
48 |
#define SM_CONTEXTVAR_USER 3 |
|
dvander@324
|
49 |
|
|
dvander@324
|
50 |
namespace SourceMod |
|
dvander@324
|
51 |
{ |
|
dvander@324
|
52 |
class IPlugin; |
|
dvander@324
|
53 |
|
|
dvander@324
|
54 |
/** |
|
dvander@372
|
55 |
* @brief Encapsulates plugin public information exposed through "myinfo." |
|
dvander@324
|
56 |
*/ |
|
dvander@324
|
57 |
typedef struct sm_plugininfo_s |
|
dvander@324
|
58 |
{ |
|
dvander@372
|
59 |
const char *name; /**< Plugin name */ |
|
dvander@372
|
60 |
const char *author; /**< Plugin author */ |
|
dvander@372
|
61 |
const char *description; /**< Plugin description */ |
|
dvander@372
|
62 |
const char *version; /**< Plugin version string */ |
|
dvander@372
|
63 |
const char *url; /**< Plugin URL */ |
|
dvander@324
|
64 |
} sm_plugininfo_t; |
|
dvander@324
|
65 |
|
|
dvander@324
|
66 |
|
|
dvander@324
|
67 |
/** |
|
dvander@324
|
68 |
* @brief Describes the usability status of a plugin. |
|
dvander@324
|
69 |
*/ |
|
dvander@324
|
70 |
enum PluginStatus |
|
dvander@324
|
71 |
{ |
|
dvander@372
|
72 |
Plugin_Running=0, /**< Plugin is running */ |
|
dvander@324
|
73 |
/* All states below are unexecutable */ |
|
dvander@372
|
74 |
Plugin_Paused, /**< Plugin is loaded but paused */ |
|
dvander@372
|
75 |
Plugin_Error, /**< Plugin is loaded but errored/locked */ |
|
dvander@324
|
76 |
/* All states below do not have all natives */ |
|
dvander@372
|
77 |
Plugin_Loaded, /**< Plugin has passed loading and can be finalized */ |
|
dvander@372
|
78 |
Plugin_Failed, /**< Plugin has a fatal failure */ |
|
dvander@372
|
79 |
Plugin_Created, /**< Plugin is created but not initialized */ |
|
dvander@372
|
80 |
Plugin_Uncompiled, /**< Plugin is not yet compiled by the JIT */ |
|
dvander@372
|
81 |
Plugin_BadLoad, /**< Plugin failed to load */ |
|
dvander@324
|
82 |
}; |
|
dvander@324
|
83 |
|
|
dvander@324
|
84 |
|
|
dvander@324
|
85 |
/** |
|
dvander@324
|
86 |
* @brief Describes the object lifetime of a plugin. |
|
dvander@324
|
87 |
*/ |
|
dvander@324
|
88 |
enum PluginType |
|
dvander@324
|
89 |
{ |
|
dvander@372
|
90 |
PluginType_Private, /**< Plugin is privately managed and receives no forwards */ |
|
dvander@372
|
91 |
PluginType_MapUpdated, /**< Plugin will never be unloaded unless for updates on mapchange */ |
|
dvander@372
|
92 |
PluginType_MapOnly, /**< Plugin will be removed at mapchange */ |
|
dvander@372
|
93 |
PluginType_Global, /**< Plugin will never be unloaded or updated */ |
|
dvander@324
|
94 |
}; |
|
dvander@324
|
95 |
|
|
dvander@3004
|
96 |
class IPhraseCollection; |
|
dvander@3004
|
97 |
|
|
dvander@324
|
98 |
/** |
|
dvander@324
|
99 |
* @brief Encapsulates a run-time plugin as maintained by SourceMod. |
|
dvander@324
|
100 |
*/ |
|
dvander@324
|
101 |
class IPlugin |
|
dvander@324
|
102 |
{ |
|
dvander@324
|
103 |
public: |
|
dvander@372
|
104 |
/** Virtual destructor */ |
|
dvander@324
|
105 |
virtual ~IPlugin() |
|
dvander@324
|
106 |
{ |
|
dvander@324
|
107 |
} |
|
dvander@324
|
108 |
|
|
dvander@324
|
109 |
/** |
|
dvander@324
|
110 |
* @brief Returns the lifetime of a plugin. |
|
dvander@324
|
111 |
*/ |
|
dvander@615
|
112 |
virtual PluginType GetType() =0; |
|
dvander@324
|
113 |
|
|
dvander@324
|
114 |
/** |
|
dvander@2174
|
115 |
* @brief Returns the IPluginRuntime::GetDefaultContext() value. |
|
dvander@324
|
116 |
* |
|
dvander@324
|
117 |
* @return Pointer to an IPluginContext, or NULL if not loaded. |
|
dvander@324
|
118 |
*/ |
|
dvander@615
|
119 |
virtual SourcePawn::IPluginContext *GetBaseContext() =0; |
|
dvander@324
|
120 |
|
|
dvander@324
|
121 |
/** |
|
dvander@2174
|
122 |
* @brief Deprecated, returns NULL. |
|
dvander@324
|
123 |
* |
|
dvander@2174
|
124 |
* @return NULL. |
|
dvander@324
|
125 |
*/ |
|
dvander@615
|
126 |
virtual sp_context_t *GetContext() =0; |
|
dvander@324
|
127 |
|
|
dvander@324
|
128 |
/** |
|
dvander@2174
|
129 |
* @brief Deprecated, returns NULL. |
|
dvander@324
|
130 |
* |
|
dvander@2174
|
131 |
* @return NULL. |
|
dvander@324
|
132 |
*/ |
|
dvander@2174
|
133 |
virtual void *GetPluginStructure() =0; |
|
dvander@324
|
134 |
|
|
dvander@324
|
135 |
/** |
|
dvander@324
|
136 |
* @brief Returns information about the plugin by reference. |
|
dvander@324
|
137 |
* |
|
dvander@324
|
138 |
* @return Pointer to a sm_plugininfo_t object, NULL if plugin is not loaded. |
|
dvander@324
|
139 |
*/ |
|
dvander@615
|
140 |
virtual const sm_plugininfo_t *GetPublicInfo() =0; |
|
dvander@324
|
141 |
|
|
dvander@324
|
142 |
/** |
|
dvander@324
|
143 |
* @brief Returns the plugin filename (relative to plugins dir). |
|
dvander@324
|
144 |
*/ |
|
dvander@615
|
145 |
virtual const char *GetFilename() =0; |
|
dvander@324
|
146 |
|
|
dvander@324
|
147 |
/** |
|
dvander@324
|
148 |
* @brief Returns true if a plugin is in debug mode, false otherwise. |
|
dvander@324
|
149 |
*/ |
|
dvander@615
|
150 |
virtual bool IsDebugging() =0; |
|
dvander@324
|
151 |
|
|
dvander@324
|
152 |
/** |
|
dvander@324
|
153 |
* @brief Returns the plugin status. |
|
dvander@324
|
154 |
*/ |
|
dvander@615
|
155 |
virtual PluginStatus GetStatus() =0; |
|
dvander@324
|
156 |
|
|
dvander@324
|
157 |
/** |
|
dvander@324
|
158 |
* @brief Sets whether the plugin is paused or not. |
|
dvander@324
|
159 |
* |
|
dvander@324
|
160 |
* @return True on successful state change, false otherwise. |
|
dvander@324
|
161 |
*/ |
|
dvander@324
|
162 |
virtual bool SetPauseState(bool paused) =0; |
|
dvander@324
|
163 |
|
|
dvander@324
|
164 |
/** |
|
dvander@324
|
165 |
* @brief Returns the unique serial number of a plugin. |
|
dvander@324
|
166 |
*/ |
|
dvander@615
|
167 |
virtual unsigned int GetSerial() =0; |
|
dvander@324
|
168 |
|
|
dvander@324
|
169 |
/** |
|
dvander@324
|
170 |
* @brief Returns a plugin's identity token. |
|
dvander@324
|
171 |
*/ |
|
dvander@615
|
172 |
virtual IdentityToken_t *GetIdentity() =0; |
|
dvander@486
|
173 |
|
|
dvander@486
|
174 |
/** |
|
dvander@486
|
175 |
* @brief Sets a property on this plugin. This is used for per-plugin |
|
dvander@486
|
176 |
* data from extensions or other parts of core. The property's value must |
|
dvander@486
|
177 |
* be manually destructed when the plugin is destroyed. |
|
dvander@486
|
178 |
* |
|
dvander@486
|
179 |
* @param prop String containing name of the property. |
|
dvander@486
|
180 |
* @param ptr Generic pointer to set. |
|
dvander@486
|
181 |
* @return True on success, false if the property is already set. |
|
dvander@486
|
182 |
*/ |
|
dvander@486
|
183 |
virtual bool SetProperty(const char *prop, void *ptr) =0; |
|
dvander@486
|
184 |
|
|
dvander@486
|
185 |
/** |
|
dvander@486
|
186 |
* @brief Gets a property from a plugin. |
|
dvander@486
|
187 |
* |
|
dvander@486
|
188 |
* @param prop String containing the property's name. |
|
dvander@486
|
189 |
* @param ptr Optional pointer to the generic pointer. |
|
dvander@486
|
190 |
* @param remove Optional boolean value; if true, property is removed |
|
dvander@486
|
191 |
* (so it can be set again). |
|
dvander@486
|
192 |
* @return True if the property existed, false otherwise. |
|
dvander@486
|
193 |
*/ |
|
dvander@486
|
194 |
virtual bool GetProperty(const char *prop, void **ptr, bool remove=false) =0; |
|
dvander@2174
|
195 |
|
|
dvander@2174
|
196 |
/** |
|
dvander@2174
|
197 |
* @brief Returns the runtime representing this plugin. |
|
dvander@2174
|
198 |
* |
|
dvander@2174
|
199 |
* @return IPluginRuntime pointer, or NULL if not loaded. |
|
dvander@2174
|
200 |
*/ |
|
dvander@2174
|
201 |
virtual SourcePawn::IPluginRuntime *GetRuntime() =0; |
|
dvander@3004
|
202 |
|
|
dvander@3004
|
203 |
/** |
|
dvander@3004
|
204 |
* @brief Returns the plugin's phrase collection. |
|
dvander@3004
|
205 |
* |
|
dvander@3004
|
206 |
* @return Plugin's phrase collection. |
|
dvander@3004
|
207 |
*/ |
|
dvander@3004
|
208 |
virtual IPhraseCollection *GetPhrases() =0; |
|
dvander@3008
|
209 |
|
|
dvander@3008
|
210 |
/** |
|
dvander@3008
|
211 |
* @brief Returns a plugin's handle. |
|
dvander@3008
|
212 |
* |
|
dvander@3008
|
213 |
* @return Plugin's handle. |
|
dvander@3008
|
214 |
*/ |
|
dvander@3008
|
215 |
virtual Handle_t GetMyHandle() =0; |
|
dvander@324
|
216 |
}; |
|
dvander@324
|
217 |
|
|
dvander@324
|
218 |
|
|
dvander@324
|
219 |
/** |
|
dvander@324
|
220 |
* @brief Iterates over a list of plugins. |
|
dvander@324
|
221 |
*/ |
|
dvander@324
|
222 |
class IPluginIterator |
|
dvander@324
|
223 |
{ |
|
dvander@324
|
224 |
public: |
|
dvander@372
|
225 |
/** Virtual destructor */ |
|
dvander@324
|
226 |
virtual ~IPluginIterator() |
|
dvander@324
|
227 |
{ |
|
dvander@324
|
228 |
}; |
|
dvander@324
|
229 |
public: |
|
dvander@324
|
230 |
/** |
|
dvander@324
|
231 |
* @brief Returns true if there are more plugins in the iterator. |
|
dvander@324
|
232 |
*/ |
|
dvander@324
|
233 |
virtual bool MorePlugins() =0; |
|
dvander@324
|
234 |
|
|
dvander@324
|
235 |
/** |
|
dvander@324
|
236 |
* @brief Returns the plugin at the current iterator position. |
|
dvander@324
|
237 |
*/ |
|
dvander@324
|
238 |
virtual IPlugin *GetPlugin() =0; |
|
dvander@324
|
239 |
|
|
dvander@324
|
240 |
/** |
|
dvander@324
|
241 |
* @brief Advances to the next plugin in the iterator. |
|
dvander@324
|
242 |
*/ |
|
dvander@324
|
243 |
virtual void NextPlugin() =0; |
|
dvander@324
|
244 |
|
|
dvander@324
|
245 |
/** |
|
dvander@324
|
246 |
* @brief Destroys the iterator object. |
|
dvander@324
|
247 |
* Note: You may use 'delete' in lieu of this function. |
|
dvander@324
|
248 |
*/ |
|
dvander@324
|
249 |
virtual void Release() =0; |
|
dvander@324
|
250 |
}; |
|
dvander@324
|
251 |
|
|
dvander@324
|
252 |
/** |
|
dvander@324
|
253 |
* @brief Listens for plugin-oriented events. |
|
dvander@324
|
254 |
*/ |
|
dvander@324
|
255 |
class IPluginsListener |
|
dvander@324
|
256 |
{ |
|
dvander@324
|
257 |
public: |
|
dvander@324
|
258 |
/** |
|
dvander@324
|
259 |
* @brief Called when a plugin is created/mapped into memory. |
|
dvander@324
|
260 |
*/ |
|
dvander@324
|
261 |
virtual void OnPluginCreated(IPlugin *plugin) |
|
dvander@324
|
262 |
{ |
|
dvander@324
|
263 |
} |
|
dvander@324
|
264 |
|
|
dvander@324
|
265 |
/** |
|
dvander@324
|
266 |
* @brief Called when a plugin is fully loaded successfully. |
|
dvander@324
|
267 |
*/ |
|
dvander@324
|
268 |
virtual void OnPluginLoaded(IPlugin *plugin) |
|
dvander@324
|
269 |
{ |
|
dvander@324
|
270 |
} |
|
dvander@324
|
271 |
|
|
dvander@324
|
272 |
/** |
|
faluco@430
|
273 |
* @brief Called when a plugin is paused or unpaused. |
|
faluco@430
|
274 |
*/ |
|
faluco@430
|
275 |
virtual void OnPluginPauseChange(IPlugin *plugin, bool paused) |
|
faluco@430
|
276 |
{ |
|
faluco@430
|
277 |
} |
|
faluco@430
|
278 |
|
|
faluco@430
|
279 |
/** |
|
dvander@324
|
280 |
* @brief Called when a plugin is unloaded (only if fully loaded). |
|
dvander@324
|
281 |
*/ |
|
dvander@324
|
282 |
virtual void OnPluginUnloaded(IPlugin *plugin) |
|
dvander@324
|
283 |
{ |
|
dvander@324
|
284 |
} |
|
dvander@324
|
285 |
|
|
dvander@324
|
286 |
/** |
|
dvander@324
|
287 |
* @brief Called when a plugin is destroyed. |
|
dvander@324
|
288 |
* NOTE: Always called if Created, even if load failed. |
|
dvander@324
|
289 |
*/ |
|
dvander@324
|
290 |
virtual void OnPluginDestroyed(IPlugin *plugin) |
|
dvander@324
|
291 |
{ |
|
dvander@324
|
292 |
} |
|
dvander@324
|
293 |
}; |
|
dvander@324
|
294 |
|
|
dvander@324
|
295 |
|
|
dvander@324
|
296 |
/** |
|
dvander@324
|
297 |
* @brief Manages the runtime loading and unloading of plugins. |
|
dvander@324
|
298 |
*/ |
|
dvander@324
|
299 |
class IPluginManager : public SMInterface |
|
dvander@324
|
300 |
{ |
|
dvander@324
|
301 |
public: |
|
dvander@324
|
302 |
virtual const char *GetInterfaceName() |
|
dvander@324
|
303 |
{ |
|
dvander@324
|
304 |
return SMINTERFACE_PLUGINSYSTEM_NAME; |
|
dvander@324
|
305 |
} |
|
dvander@324
|
306 |
|
|
dvander@324
|
307 |
virtual unsigned int GetInterfaceVersion() |
|
dvander@324
|
308 |
{ |
|
dvander@324
|
309 |
return SMINTERFACE_PLUGINSYSTEM_VERSION; |
|
dvander@324
|
310 |
} |
|
dvander@324
|
311 |
public: |
|
dvander@324
|
312 |
/** |
|
dvander@324
|
313 |
* @brief Attempts to load a plugin. |
|
dvander@324
|
314 |
* |
|
dvander@324
|
315 |
* @param path Path and filename of plugin, relative to plugins folder. |
|
dvander@2226
|
316 |
* @param debug Deprecated, must be false. |
|
dvander@324
|
317 |
* @param type Lifetime of the plugin. |
|
dvander@324
|
318 |
* @param error Buffer to hold any error message. |
|
ds@755
|
319 |
* @param maxlength Maximum length of error message buffer. |
|
faluco@383
|
320 |
* @param wasloaded Stores if the plugin is already loaded. |
|
dvander@324
|
321 |
* @return A new plugin pointer on success, false otherwise. |
|
dvander@324
|
322 |
*/ |
|
dvander@324
|
323 |
virtual IPlugin *LoadPlugin(const char *path, |
|
dvander@324
|
324 |
bool debug, |
|
dvander@324
|
325 |
PluginType type, |
|
dvander@324
|
326 |
char error[], |
|
ds@755
|
327 |
size_t maxlength, |
|
faluco@383
|
328 |
bool *wasloaded) =0; |
|
dvander@324
|
329 |
|
|
dvander@324
|
330 |
/** |
|
dvander@324
|
331 |
* @brief Attempts to unload a plugin. |
|
dvander@324
|
332 |
* |
|
dvander@324
|
333 |
* @param plugin Pointer to the plugin handle. |
|
dvander@324
|
334 |
* @return True on success, false otherwise. |
|
dvander@324
|
335 |
*/ |
|
dvander@324
|
336 |
virtual bool UnloadPlugin(IPlugin *plugin) =0; |
|
dvander@324
|
337 |
|
|
dvander@324
|
338 |
/** |
|
dvander@324
|
339 |
* @brief Finds a plugin by its context. |
|
dvander@324
|
340 |
* Note: This function should be considered O(1). |
|
dvander@324
|
341 |
* |
|
dvander@324
|
342 |
* @param ctx Pointer to an sp_context_t. |
|
dvander@324
|
343 |
* @return Pointer to a matching IPlugin, or NULL if none found. |
|
dvander@324
|
344 |
*/ |
|
dvander@324
|
345 |
virtual IPlugin *FindPluginByContext(const sp_context_t *ctx) =0; |
|
dvander@324
|
346 |
|
|
dvander@324
|
347 |
/** |
|
dvander@324
|
348 |
* @brief Returns the number of plugins (both failed and loaded). |
|
dvander@324
|
349 |
* |
|
dvander@324
|
350 |
* @return The number of internally cached plugins. |
|
dvander@324
|
351 |
*/ |
|
dvander@324
|
352 |
virtual unsigned int GetPluginCount() =0; |
|
dvander@324
|
353 |
|
|
dvander@324
|
354 |
/** |
|
dvander@324
|
355 |
* @brief Returns a pointer that can be used to iterate through plugins. |
|
dvander@324
|
356 |
* Note: This pointer must be freed using EITHER delete OR IPluginIterator::Release(). |
|
dvander@324
|
357 |
*/ |
|
dvander@324
|
358 |
virtual IPluginIterator *GetPluginIterator() =0; |
|
dvander@324
|
359 |
|
|
dvander@324
|
360 |
/** |
|
dvander@324
|
361 |
* @brief Adds a plugin manager listener. |
|
dvander@324
|
362 |
* |
|
dvander@324
|
363 |
* @param listener Pointer to a listener. |
|
dvander@324
|
364 |
*/ |
|
dvander@324
|
365 |
virtual void AddPluginsListener(IPluginsListener *listener) =0; |
|
dvander@324
|
366 |
|
|
dvander@324
|
367 |
/** |
|
dvander@324
|
368 |
* @brief Removes a plugin listener. |
|
dvander@324
|
369 |
* |
|
dvander@324
|
370 |
* @param listener Pointer to a listener. |
|
dvander@324
|
371 |
*/ |
|
dvander@324
|
372 |
virtual void RemovePluginsListener(IPluginsListener *listener) =0; |
|
dvander@2730
|
373 |
|
|
dvander@2730
|
374 |
/** |
|
dvander@2730
|
375 |
* @brief Converts a Handle to an IPlugin if possible. |
|
dvander@2730
|
376 |
* |
|
dvander@2730
|
377 |
* @param handle Handle. |
|
dvander@2730
|
378 |
* @param err Error, set on failure (otherwise undefined). |
|
dvander@2730
|
379 |
* @return IPlugin pointer, or NULL on failure. |
|
dvander@2730
|
380 |
*/ |
|
dvander@2730
|
381 |
virtual IPlugin *PluginFromHandle(Handle_t handle, HandleError *err) =0; |
|
dvander@324
|
382 |
}; |
|
ds@432
|
383 |
} |
|
dvander@324
|
384 |
|
|
dvander@324
|
385 |
#endif //_INCLUDE_SOURCEMOD_PLUGINMNGR_INTERFACE_H_ |
|
dvander@2730
|
386 |
|