|
dvander@370
|
1 |
/** |
|
ds@653
|
2 |
* vim: set ts=4 : |
|
ds@1330
|
3 |
* ============================================================================= |
|
dvander@1231
|
4 |
* SourceMod |
|
ds@3099
|
5 |
* Copyright (C) 2004-2010 AlliedModders LLC. All rights reserved. |
|
ds@1330
|
6 |
* ============================================================================= |
|
dvander@370
|
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@1231
|
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@1231
|
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@1231
|
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@370
|
28 |
* |
|
dvander@370
|
29 |
* Version: $Id$ |
|
dvander@370
|
30 |
*/ |
|
dvander@370
|
31 |
|
|
dvander@173
|
32 |
#ifndef _INCLUDE_SOURCEMOD_PLUGINSYSTEM_H_ |
|
dvander@173
|
33 |
#define _INCLUDE_SOURCEMOD_PLUGINSYSTEM_H_ |
|
dvander@173
|
34 |
|
|
dvander@211
|
35 |
#include <time.h> |
|
faluco@333
|
36 |
#include <errno.h> |
|
faluco@333
|
37 |
#include <sys/stat.h> |
|
dvander@173
|
38 |
#include <IPluginSys.h> |
|
dvander@220
|
39 |
#include <IHandleSys.h> |
|
ds@611
|
40 |
#include <IForwardSys.h> |
|
dvander@174
|
41 |
#include <sh_list.h> |
|
dvander@174
|
42 |
#include <sh_stack.h> |
|
faluco@389
|
43 |
#include <sh_vector.h> |
|
dvander@601
|
44 |
#include <sh_string.h> |
|
dvander@173
|
45 |
#include "sm_globals.h" |
|
dvander@211
|
46 |
#include "sm_trie.h" |
|
dvander@220
|
47 |
#include "sourcemod.h" |
|
dvander@309
|
48 |
#include <IRootConsoleMenu.h> |
|
skamonkey@3515
|
49 |
#if SOURCE_ENGINE >= SE_ALIENSWARM |
|
ds@3099
|
50 |
#include "convar_sm_swarm.h" |
|
skamonkey@3613
|
51 |
#elif SOURCE_ENGINE >= SE_LEFT4DEAD |
|
ds@2400
|
52 |
#include "convar_sm_l4d.h" |
|
skamonkey@3613
|
53 |
#elif SOURCE_ENGINE >= SE_ORANGEBOX |
|
faluco@1541
|
54 |
#include "convar_sm_ob.h" |
|
faluco@1541
|
55 |
#else |
|
ds@457
|
56 |
#include "convar_sm.h" |
|
faluco@1541
|
57 |
#endif |
|
dvander@2042
|
58 |
#include "ITranslator.h" |
|
asherkin@3601
|
59 |
#include "IGameConfigs.h" |
|
dvander@2086
|
60 |
#include "NativeOwner.h" |
|
dvander@2086
|
61 |
#include "ShareSys.h" |
|
dvander@173
|
62 |
|
|
dvander@2547
|
63 |
class CPlayer; |
|
dvander@2547
|
64 |
|
|
dvander@174
|
65 |
using namespace SourceHook; |
|
dvander@174
|
66 |
|
|
dvander@209
|
67 |
/** |
|
dvander@209
|
68 |
* NOTES: |
|
dvander@209
|
69 |
* |
|
dvander@1923
|
70 |
* UPDATE 2008-03-11: These comments are horribly out of date. They paint a good overall |
|
dvander@1923
|
71 |
* picture of how PluginSys works, but things like dependencies and fake natives have |
|
dvander@1923
|
72 |
* complicated things quite a bit. |
|
dvander@1923
|
73 |
* |
|
dvander@209
|
74 |
* Currently this system needs a lot of work but it's good skeletally. Plugin creation |
|
dvander@209
|
75 |
* is done without actually compiling anything. This is done by Load functions in the |
|
dvander@209
|
76 |
* manager. This will need a rewrite when we add context switching. |
|
dvander@209
|
77 |
* |
|
dvander@209
|
78 |
* The plugin object itself has a few things to note. The most important is that it stores |
|
dvander@209
|
79 |
* a table of function objects. The manager marshals allocation and freeing of these objects. |
|
dvander@209
|
80 |
* The plugin object can be in erroneous states, they are: |
|
dvander@209
|
81 |
* Plugin_Error --> Some error occurred any time during or after compilation. |
|
dvander@209
|
82 |
* This error can be cleared since the plugin itself is valid. |
|
dvander@209
|
83 |
* However, the state itself being set prevents any runtime action. |
|
dvander@209
|
84 |
* Plugin_BadLoad --> The plugin failed to load entirely and nothing can be done to save it. |
|
dvander@209
|
85 |
* |
|
dvander@209
|
86 |
* If a plugin fails to load externally, it is never added to the internal tracker. However, |
|
dvander@209
|
87 |
* plugins that failed to load from the internal loading mechanism are always tracked. This |
|
dvander@209
|
88 |
* allows users to see which automatically loaded plugins failed, and makes the interface a bit |
|
dvander@209
|
89 |
* more flexible. |
|
dvander@211
|
90 |
* |
|
dvander@211
|
91 |
* Once a plugin is compiled, it sets its own state to Plugin_Created. This state is still invalid |
|
dvander@211
|
92 |
* for execution. SourceMod is a two pass system, and even though the second pass is not implemented |
|
dvander@211
|
93 |
* yet, it is structured so Plugin_Created must be switched to Plugin_Running in the second pass. When |
|
dvander@211
|
94 |
* implemented, a Created plugin will be switched to Error in the second pass if it not loadable. |
|
dvander@211
|
95 |
* |
|
dvander@211
|
96 |
* The two pass loading mechanism is described below. Modules/natives are not implemented yet. |
|
dvander@211
|
97 |
* PASS ONE: All loadable plugins are found and have the following steps performed: |
|
dvander@211
|
98 |
* 1. Loading and compilation is attempted. |
|
dvander@211
|
99 |
* 2. If successful, all natives from Core are added. |
|
dvander@211
|
100 |
* 3. OnPluginLoad() is called. |
|
dvander@211
|
101 |
* 4. If failed, any user natives are scrapped and the process halts here. |
|
dvander@211
|
102 |
* 5. If successful, the plugin is ready for Pass 2. |
|
dvander@211
|
103 |
* INTERMEDIATE: |
|
dvander@211
|
104 |
* 1. All forced modules are loaded. |
|
dvander@211
|
105 |
* PASS TWO: All loaded plugins are found and have these steps performed: |
|
dvander@211
|
106 |
* 1. Any modules referenced in the plugin that are not already loaded, are loaded. |
|
dvander@211
|
107 |
* 2. If any module fails to load and the plugin requires it, load fails and jump to step 6. |
|
dvander@211
|
108 |
* 3. If any natives are unresolved, check if they are found in the user-natives pool. |
|
dvander@211
|
109 |
* 4. If yes, load succeeds. If not, natives are passed through a native acceptance filter. |
|
dvander@211
|
110 |
* 5. If the filter fails, the plugin is marked as failed. |
|
dvander@211
|
111 |
* 6. If the plugin has failed to load at this point, any dynamic natives it has added are scrapped. |
|
dvander@211
|
112 |
* Furthermore, any plugin that referenced these natives must now have pass 2 re-ran. |
|
dvander@211
|
113 |
* PASS THREE (not a real pass): |
|
ds@426
|
114 |
* 7. Once all plugins are deemed to be loaded, OnPluginStart() is called |
|
dvander@209
|
115 |
*/ |
|
dvander@209
|
116 |
|
|
faluco@383
|
117 |
enum LoadRes |
|
faluco@383
|
118 |
{ |
|
faluco@383
|
119 |
LoadRes_Successful, |
|
faluco@383
|
120 |
LoadRes_AlreadyLoaded, |
|
dvander@1436
|
121 |
LoadRes_Failure, |
|
fyrenmoo@2675
|
122 |
LoadRes_SilentFailure, |
|
dvander@1436
|
123 |
LoadRes_NeverLoad |
|
faluco@383
|
124 |
}; |
|
faluco@383
|
125 |
|
|
fyrenmoo@2675
|
126 |
enum APLRes |
|
fyrenmoo@2675
|
127 |
{ |
|
fyrenmoo@2675
|
128 |
APLRes_Success, |
|
fyrenmoo@2675
|
129 |
APLRes_Failure, |
|
fyrenmoo@2675
|
130 |
APLRes_SilentFailure |
|
fyrenmoo@2675
|
131 |
}; |
|
fyrenmoo@2675
|
132 |
|
|
asherkin@3703
|
133 |
enum LibraryAction |
|
asherkin@3703
|
134 |
{ |
|
asherkin@3703
|
135 |
LibraryAction_Removed, |
|
asherkin@3703
|
136 |
LibraryAction_Added |
|
asherkin@3703
|
137 |
}; |
|
asherkin@3703
|
138 |
|
|
dvander@978
|
139 |
struct AutoConfig |
|
dvander@978
|
140 |
{ |
|
dvander@978
|
141 |
String autocfg; |
|
dvander@978
|
142 |
String folder; |
|
dvander@978
|
143 |
bool create; |
|
dvander@978
|
144 |
}; |
|
dvander@978
|
145 |
|
|
faluco@1112
|
146 |
class CPlugin; |
|
faluco@1112
|
147 |
|
|
dvander@2086
|
148 |
class CPlugin : |
|
dvander@2086
|
149 |
public IPlugin, |
|
dvander@2086
|
150 |
public CNativeOwner |
|
dvander@173
|
151 |
{ |
|
dvander@174
|
152 |
friend class CPluginManager; |
|
dvander@176
|
153 |
friend class CFunction; |
|
dvander@173
|
154 |
public: |
|
dvander@209
|
155 |
CPlugin(const char *file); |
|
dvander@209
|
156 |
~CPlugin(); |
|
dvander@209
|
157 |
public: |
|
faluco@641
|
158 |
PluginType GetType(); |
|
faluco@641
|
159 |
SourcePawn::IPluginContext *GetBaseContext(); |
|
faluco@641
|
160 |
sp_context_t *GetContext(); |
|
dvander@2193
|
161 |
void *GetPluginStructure(); |
|
faluco@641
|
162 |
const char *GetFilename(); |
|
faluco@641
|
163 |
bool IsDebugging(); |
|
faluco@641
|
164 |
PluginStatus GetStatus(); |
|
fyrenmoo@2675
|
165 |
bool IsSilentlyFailed(); |
|
fyrenmoo@2675
|
166 |
void SetSilentlyFailed(bool sf); |
|
dvander@2193
|
167 |
const sm_plugininfo_t *GetPublicInfo(); |
|
faluco@641
|
168 |
bool SetPauseState(bool paused); |
|
faluco@641
|
169 |
unsigned int GetSerial(); |
|
faluco@641
|
170 |
IdentityToken_t *GetIdentity(); |
|
dvander@1766
|
171 |
unsigned int CalcMemUsage(); |
|
faluco@641
|
172 |
bool SetProperty(const char *prop, void *ptr); |
|
faluco@641
|
173 |
bool GetProperty(const char *prop, void **ptr, bool remove=false); |
|
dvander@2086
|
174 |
void DropEverything(); |
|
dvander@2193
|
175 |
SourcePawn::IPluginRuntime *GetRuntime(); |
|
dvander@173
|
176 |
public: |
|
dvander@209
|
177 |
/** |
|
dvander@209
|
178 |
* Creates a plugin object with default values. |
|
dvander@209
|
179 |
* If an error buffer is specified, and an error occurs, the error will be copied to the buffer |
|
dvander@209
|
180 |
* and NULL will be returned. |
|
dvander@209
|
181 |
* If an error buffer is not specified, the error will be copied to an internal buffer and |
|
dvander@209
|
182 |
* a valid (but error-stated) CPlugin will be returned. |
|
dvander@209
|
183 |
*/ |
|
dvander@209
|
184 |
static CPlugin *CreatePlugin(const char *file, char *error, size_t maxlength); |
|
dvander@209
|
185 |
public: |
|
dvander@229
|
186 |
|
|
dvander@209
|
187 |
/** |
|
dvander@209
|
188 |
* Sets an error state on the plugin |
|
dvander@209
|
189 |
*/ |
|
dvander@209
|
190 |
void SetErrorState(PluginStatus status, const char *error_fmt, ...); |
|
dvander@211
|
191 |
|
|
dvander@211
|
192 |
/** |
|
dvander@229
|
193 |
* Initializes the plugin's identity information |
|
dvander@229
|
194 |
*/ |
|
dvander@229
|
195 |
void InitIdentity(); |
|
dvander@229
|
196 |
|
|
dvander@229
|
197 |
/** |
|
dvander@211
|
198 |
* Calls the OnPluginLoad function, and sets any failed states if necessary. |
|
dvander@211
|
199 |
* NOTE: Valid pre-states are: Plugin_Created |
|
dvander@282
|
200 |
* NOTE: If validated, plugin state is changed to Plugin_Loaded |
|
dvander@211
|
201 |
* |
|
dvander@211
|
202 |
* If the error buffer is NULL, the error message is cached locally. |
|
dvander@211
|
203 |
*/ |
|
fyrenmoo@2675
|
204 |
APLRes Call_AskPluginLoad(char *error, size_t maxlength); |
|
dvander@211
|
205 |
|
|
dvander@211
|
206 |
/** |
|
ds@426
|
207 |
* Calls the OnPluginStart function. |
|
dvander@211
|
208 |
* NOTE: Valid pre-states are: Plugin_Created |
|
dvander@282
|
209 |
* NOTE: Post-state will be Plugin_Running |
|
dvander@211
|
210 |
*/ |
|
ds@426
|
211 |
void Call_OnPluginStart(); |
|
dvander@282
|
212 |
|
|
dvander@282
|
213 |
/** |
|
ds@426
|
214 |
* Calls the OnPluginEnd function. |
|
dvander@282
|
215 |
*/ |
|
ds@426
|
216 |
void Call_OnPluginEnd(); |
|
faluco@290
|
217 |
|
|
faluco@290
|
218 |
/** |
|
faluco@1221
|
219 |
* Calls the OnAllPluginsLoaded function. |
|
faluco@1221
|
220 |
*/ |
|
faluco@1221
|
221 |
void Call_OnAllPluginsLoaded(); |
|
faluco@1221
|
222 |
|
|
faluco@1221
|
223 |
/** |
|
dvander@315
|
224 |
* Returns true if a plugin is usable. |
|
dvander@315
|
225 |
*/ |
|
dvander@615
|
226 |
bool IsRunnable(); |
|
faluco@389
|
227 |
|
|
faluco@389
|
228 |
/** |
|
dvander@2042
|
229 |
* Get languages info. |
|
dvander@536
|
230 |
*/ |
|
dvander@2042
|
231 |
IPhraseCollection *GetPhrases(); |
|
dvander@211
|
232 |
public: |
|
faluco@333
|
233 |
/** |
|
dvander@536
|
234 |
* Returns the modification time during last plugin load. |
|
dvander@536
|
235 |
*/ |
|
dvander@615
|
236 |
time_t GetTimeStamp(); |
|
faluco@333
|
237 |
|
|
faluco@333
|
238 |
/** |
|
dvander@536
|
239 |
* Returns the current modification time of the plugin file. |
|
dvander@536
|
240 |
*/ |
|
faluco@333
|
241 |
time_t GetFileTimeStamp(); |
|
dvander@282
|
242 |
|
|
dvander@282
|
243 |
/** |
|
dvander@282
|
244 |
* Returns true if the plugin was running, but is now invalid. |
|
dvander@282
|
245 |
*/ |
|
dvander@282
|
246 |
bool WasRunning(); |
|
dvander@536
|
247 |
|
|
dvander@536
|
248 |
Handle_t GetMyHandle(); |
|
dvander@978
|
249 |
|
|
dvander@2086
|
250 |
bool AddFakeNative(IPluginFunction *pFunc, const char *name, SPVM_FAKENATIVE_FUNC func); |
|
dvander@978
|
251 |
void AddConfig(bool autoCreate, const char *cfg, const char *folder); |
|
dvander@978
|
252 |
unsigned int GetConfigCount(); |
|
dvander@978
|
253 |
AutoConfig *GetConfig(unsigned int i); |
|
faluco@1112
|
254 |
inline void AddLibrary(const char *name) |
|
faluco@1089
|
255 |
{ |
|
faluco@1112
|
256 |
m_Libraries.push_back(name); |
|
faluco@1089
|
257 |
} |
|
asherkin@3703
|
258 |
void LibraryActions(LibraryAction action); |
|
dvander@2342
|
259 |
void SyncMaxClients(int max_clients); |
|
dvander@173
|
260 |
protected: |
|
dvander@2342
|
261 |
bool UpdateInfo(); |
|
faluco@333
|
262 |
void SetTimeStamp(time_t t); |
|
dvander@605
|
263 |
void DependencyDropped(CPlugin *pOwner); |
|
dvander@173
|
264 |
private: |
|
dvander@174
|
265 |
PluginType m_type; |
|
ds@652
|
266 |
char m_filename[PLATFORM_MAX_PATH]; |
|
dvander@173
|
267 |
PluginStatus m_status; |
|
fyrenmoo@2675
|
268 |
bool m_bSilentlyFailed; |
|
dvander@173
|
269 |
unsigned int m_serial; |
|
dvander@173
|
270 |
sm_plugininfo_t m_info; |
|
dvander@209
|
271 |
char m_errormsg[256]; |
|
dvander@211
|
272 |
time_t m_LastAccess; |
|
dvander@229
|
273 |
IdentityToken_t *m_ident; |
|
dvander@220
|
274 |
Handle_t m_handle; |
|
dvander@282
|
275 |
bool m_WasRunning; |
|
dvander@2042
|
276 |
IPhraseCollection *m_pPhrases; |
|
faluco@1112
|
277 |
List<String> m_RequiredLibs; |
|
faluco@1112
|
278 |
List<String> m_Libraries; |
|
dvander@486
|
279 |
Trie *m_pProps; |
|
dvander@605
|
280 |
bool m_FakeNativesMissing; |
|
faluco@1112
|
281 |
bool m_LibraryMissing; |
|
dvander@978
|
282 |
CVector<AutoConfig *> m_configs; |
|
dvander@1630
|
283 |
bool m_bGotAllLoaded; |
|
dvander@2105
|
284 |
int m_FileVersion; |
|
dvander@2105
|
285 |
char m_DateTime[256]; |
|
dvander@2193
|
286 |
IPluginRuntime *m_pRuntime; |
|
dvander@2193
|
287 |
IPluginContext *m_pContext; |
|
dvander@2342
|
288 |
sp_pubvar_t *m_MaxClientsVar; |
|
dvander@601
|
289 |
}; |
|
dvander@601
|
290 |
|
|
dvander@220
|
291 |
class CPluginManager : |
|
dvander@220
|
292 |
public IPluginManager, |
|
dvander@220
|
293 |
public SMGlobalClass, |
|
dvander@309
|
294 |
public IHandleTypeDispatch, |
|
dvander@309
|
295 |
public IRootConsoleCommand |
|
dvander@174
|
296 |
{ |
|
dvander@176
|
297 |
friend class CPlugin; |
|
dvander@174
|
298 |
public: |
|
dvander@174
|
299 |
CPluginManager(); |
|
dvander@176
|
300 |
~CPluginManager(); |
|
dvander@174
|
301 |
public: |
|
dvander@203
|
302 |
/* Implements iterator class */ |
|
dvander@174
|
303 |
class CPluginIterator : public IPluginIterator |
|
dvander@174
|
304 |
{ |
|
dvander@174
|
305 |
public: |
|
dvander@213
|
306 |
CPluginIterator(List<CPlugin *> *mylist); |
|
dvander@174
|
307 |
virtual ~CPluginIterator(); |
|
dvander@174
|
308 |
virtual bool MorePlugins(); |
|
dvander@174
|
309 |
virtual IPlugin *GetPlugin(); |
|
dvander@174
|
310 |
virtual void NextPlugin(); |
|
dvander@282
|
311 |
void Release(); |
|
dvander@174
|
312 |
public: |
|
dvander@174
|
313 |
void Reset(); |
|
dvander@174
|
314 |
private: |
|
dvander@213
|
315 |
List<CPlugin *> *mylist; |
|
dvander@213
|
316 |
List<CPlugin *>::iterator current; |
|
dvander@174
|
317 |
}; |
|
dvander@174
|
318 |
friend class CPluginManager::CPluginIterator; |
|
dvander@203
|
319 |
public: //IPluginManager |
|
dvander@282
|
320 |
IPlugin *LoadPlugin(const char *path, |
|
dvander@174
|
321 |
bool debug, |
|
dvander@174
|
322 |
PluginType type, |
|
dvander@174
|
323 |
char error[], |
|
ds@755
|
324 |
size_t maxlength, |
|
faluco@383
|
325 |
bool *wasloaded); |
|
dvander@282
|
326 |
bool UnloadPlugin(IPlugin *plugin); |
|
dvander@282
|
327 |
IPlugin *FindPluginByContext(const sp_context_t *ctx); |
|
dvander@282
|
328 |
unsigned int GetPluginCount(); |
|
dvander@282
|
329 |
IPluginIterator *GetPluginIterator(); |
|
dvander@282
|
330 |
void AddPluginsListener(IPluginsListener *listener); |
|
dvander@282
|
331 |
void RemovePluginsListener(IPluginsListener *listener); |
|
dvander@220
|
332 |
public: //SMGlobalClass |
|
dvander@282
|
333 |
void OnSourceModAllInitialized(); |
|
dvander@282
|
334 |
void OnSourceModShutdown(); |
|
asherkin@3601
|
335 |
ConfigResult OnSourceModConfigChanged(const char *key, const char *value, ConfigSource source, char *error, size_t maxlength); |
|
dvander@2342
|
336 |
void OnSourceModMaxPlayersChanged(int newvalue); |
|
dvander@220
|
337 |
public: //IHandleTypeDispatch |
|
dvander@282
|
338 |
void OnHandleDestroy(HandleType_t type, void *object); |
|
dvander@1766
|
339 |
bool GetHandleApproxSize(HandleType_t type, void *object, unsigned int *pSize); |
|
dvander@309
|
340 |
public: //IRootConsoleCommand |
|
faluco@1541
|
341 |
void OnRootConsoleCommand(const char *cmdname, const CCommand &command); |
|
dvander@190
|
342 |
public: |
|
dvander@203
|
343 |
/** |
|
dvander@211
|
344 |
* Loads all plugins not yet loaded |
|
dvander@203
|
345 |
*/ |
|
dvander@211
|
346 |
void LoadAll_FirstPass(const char *config, const char *basedir); |
|
dvander@211
|
347 |
|
|
dvander@211
|
348 |
/** |
|
dvander@211
|
349 |
* Runs the second loading pass for all plugins |
|
dvander@211
|
350 |
*/ |
|
dvander@211
|
351 |
void LoadAll_SecondPass(); |
|
dvander@203
|
352 |
|
|
dvander@203
|
353 |
/** |
|
dvander@203
|
354 |
* Tests a plugin file mask against a local folder. |
|
dvander@203
|
355 |
* The alias is searched backwards from localdir - i.e., given this input: |
|
dvander@203
|
356 |
* csdm/ban csdm/ban |
|
dvander@203
|
357 |
* ban csdm/ban |
|
dvander@203
|
358 |
* csdm/ban optional/csdm/ban |
|
dvander@203
|
359 |
* All of these will return true for an alias match. |
|
dvander@203
|
360 |
* Wildcards are allowed in the filename. |
|
dvander@203
|
361 |
*/ |
|
dvander@209
|
362 |
bool TestAliasMatch(const char *alias, const char *localdir); |
|
dvander@211
|
363 |
|
|
dvander@211
|
364 |
/** |
|
dvander@211
|
365 |
* Returns whether anything loaded will be a late load. |
|
dvander@211
|
366 |
*/ |
|
faluco@290
|
367 |
bool IsLateLoadTime() const; |
|
dvander@233
|
368 |
|
|
dvander@233
|
369 |
/** |
|
dvander@247
|
370 |
* Converts a Handle to an IPlugin if possible. |
|
dvander@247
|
371 |
*/ |
|
dvander@247
|
372 |
IPlugin *PluginFromHandle(Handle_t handle, HandleError *err); |
|
faluco@290
|
373 |
|
|
faluco@290
|
374 |
/** |
|
dvander@309
|
375 |
* Finds a plugin based on its index. (starts on index 1) |
|
dvander@309
|
376 |
*/ |
|
faluco@290
|
377 |
CPlugin *GetPluginByOrder(int num); |
|
dvander@309
|
378 |
|
|
dvander@1638
|
379 |
int GetOrderOfPlugin(IPlugin *pl); |
|
dvander@1638
|
380 |
|
|
ds@457
|
381 |
/** |
|
ds@457
|
382 |
* Internal version of FindPluginByContext() |
|
ds@457
|
383 |
*/ |
|
dvander@2193
|
384 |
CPlugin *GetPluginByCtx(const sp_context_t *ctx); |
|
ds@457
|
385 |
|
|
dvander@309
|
386 |
/** |
|
dvander@309
|
387 |
* Gets status text for a status code |
|
dvander@309
|
388 |
*/ |
|
dvander@309
|
389 |
const char *GetStatusText(PluginStatus status); |
|
dvander@315
|
390 |
|
|
faluco@333
|
391 |
/** |
|
faluco@333
|
392 |
* Reload or update plugins on level shutdown. |
|
faluco@333
|
393 |
*/ |
|
faluco@333
|
394 |
void ReloadOrUnloadPlugins(); |
|
faluco@333
|
395 |
|
|
ds@611
|
396 |
/** |
|
ds@611
|
397 |
* Add public functions from all running or paused |
|
ds@611
|
398 |
* plugins to the specified forward if the names match. |
|
ds@611
|
399 |
*/ |
|
ds@611
|
400 |
void AddFunctionsToForward(const char *name, IChangeableForward *pForward); |
|
ds@611
|
401 |
|
|
faluco@1221
|
402 |
/** |
|
faluco@1221
|
403 |
* Iterates through plugins to call OnAllPluginsLoaded. |
|
faluco@1221
|
404 |
*/ |
|
faluco@1221
|
405 |
void AllPluginsLoaded(); |
|
faluco@1221
|
406 |
|
|
dvander@900
|
407 |
CPlugin *GetPluginFromIdentity(IdentityToken_t *pToken); |
|
dvander@900
|
408 |
|
|
dvander@1018
|
409 |
void Shutdown(); |
|
dvander@1018
|
410 |
|
|
asherkin@3703
|
411 |
void OnLibraryAction(const char *lib, LibraryAction action); |
|
dvander@1124
|
412 |
|
|
dvander@1124
|
413 |
bool LibraryExists(const char *lib); |
|
faluco@1348
|
414 |
|
|
faluco@1348
|
415 |
bool ReloadPlugin(CPlugin *pl); |
|
dvander@1630
|
416 |
|
|
dvander@1630
|
417 |
void UnloadAll(); |
|
dvander@1902
|
418 |
|
|
dvander@1902
|
419 |
CPlugin *FindPluginByConsoleArg(const char *arg); |
|
dvander@2342
|
420 |
|
|
dvander@2342
|
421 |
void SyncMaxClients(int max_clients); |
|
dvander@2547
|
422 |
|
|
dvander@2547
|
423 |
void ListPluginsToClient(CPlayer *player, const CCommand &args); |
|
dvander@209
|
424 |
private: |
|
ds@755
|
425 |
LoadRes _LoadPlugin(CPlugin **pPlugin, const char *path, bool debug, PluginType type, char error[], size_t maxlength); |
|
dvander@298
|
426 |
|
|
dvander@298
|
427 |
void LoadAutoPlugin(const char *plugin); |
|
dvander@298
|
428 |
|
|
dvander@209
|
429 |
/** |
|
dvander@209
|
430 |
* Recursively loads all plugins in the given directory. |
|
dvander@209
|
431 |
*/ |
|
dvander@209
|
432 |
void LoadPluginsFromDir(const char *basedir, const char *localdir); |
|
dvander@209
|
433 |
|
|
dvander@209
|
434 |
/** |
|
dvander@211
|
435 |
* Adds a plugin object. This is wrapped by LoadPlugin functions. |
|
dvander@211
|
436 |
*/ |
|
dvander@211
|
437 |
void AddPlugin(CPlugin *pPlugin); |
|
dvander@211
|
438 |
|
|
dvander@211
|
439 |
/** |
|
dvander@211
|
440 |
* Runs the second loading pass on a plugin. |
|
dvander@209
|
441 |
*/ |
|
dvander@298
|
442 |
bool RunSecondPass(CPlugin *pPlugin, char *error, size_t maxlength); |
|
dvander@211
|
443 |
|
|
dvander@211
|
444 |
/** |
|
dvander@315
|
445 |
* Runs an extension pass on a plugin. |
|
dvander@315
|
446 |
*/ |
|
dvander@315
|
447 |
bool LoadOrRequireExtensions(CPlugin *pPlugin, unsigned int pass, char *error, size_t maxlength); |
|
faluco@430
|
448 |
|
|
faluco@1112
|
449 |
/** |
|
faluco@1112
|
450 |
* Manages required natives. |
|
faluco@1112
|
451 |
*/ |
|
faluco@1112
|
452 |
bool FindOrRequirePluginDeps(CPlugin *pPlugin, char *error, size_t maxlength); |
|
faluco@1112
|
453 |
|
|
faluco@430
|
454 |
void _SetPauseState(CPlugin *pPlugin, bool pause); |
|
dvander@174
|
455 |
protected: |
|
dvander@209
|
456 |
/** |
|
dvander@209
|
457 |
* Caching internal objects |
|
dvander@209
|
458 |
*/ |
|
dvander@174
|
459 |
void ReleaseIterator(CPluginIterator *iter); |
|
dvander@900
|
460 |
public: |
|
dvander@229
|
461 |
inline IdentityToken_t *GetIdentity() |
|
dvander@229
|
462 |
{ |
|
dvander@229
|
463 |
return m_MyIdent; |
|
dvander@229
|
464 |
} |
|
dvander@601
|
465 |
private: |
|
faluco@1112
|
466 |
void TryRefreshDependencies(CPlugin *pOther); |
|
dvander@174
|
467 |
private: |
|
dvander@174
|
468 |
List<IPluginsListener *> m_listeners; |
|
dvander@213
|
469 |
List<CPlugin *> m_plugins; |
|
dvander@174
|
470 |
CStack<CPluginManager::CPluginIterator *> m_iters; |
|
dvander@211
|
471 |
Trie *m_LoadLookup; |
|
dvander@211
|
472 |
bool m_AllPluginsLoaded; |
|
dvander@229
|
473 |
IdentityToken_t *m_MyIdent; |
|
dvander@601
|
474 |
|
|
dvander@601
|
475 |
/* Dynamic native stuff */ |
|
dvander@601
|
476 |
List<FakeNative *> m_Natives; |
|
dvander@601
|
477 |
|
|
dvander@1630
|
478 |
bool m_LoadingLocked; |
|
asherkin@3601
|
479 |
|
|
asherkin@3601
|
480 |
// Config |
|
asherkin@3601
|
481 |
bool m_bBlockBadPlugins; |
|
asherkin@3703
|
482 |
|
|
asherkin@3703
|
483 |
// Forwards |
|
asherkin@3703
|
484 |
IForward *m_pOnLibraryAdded; |
|
asherkin@3703
|
485 |
IForward *m_pOnLibraryRemoved; |
|
dvander@174
|
486 |
}; |
|
dvander@174
|
487 |
|
|
dvander@211
|
488 |
extern CPluginManager g_PluginSys; |
|
dvander@174
|
489 |
|
|
dvander@173
|
490 |
#endif //_INCLUDE_SOURCEMOD_PLUGINSYSTEM_H_ |
|
dvander@2906
|
491 |
|