|
dvander@173
|
1 |
#ifndef _INCLUDE_SOURCEMOD_PLUGINSYSTEM_H_ |
|
dvander@173
|
2 |
#define _INCLUDE_SOURCEMOD_PLUGINSYSTEM_H_ |
|
dvander@173
|
3 |
|
|
dvander@173
|
4 |
#include <IPluginSys.h> |
|
dvander@174
|
5 |
#include <sh_list.h> |
|
dvander@174
|
6 |
#include <sh_stack.h> |
|
dvander@173
|
7 |
#include "sm_globals.h" |
|
dvander@177
|
8 |
#include "CFunction.h" |
|
dvander@173
|
9 |
|
|
dvander@174
|
10 |
using namespace SourceHook; |
|
dvander@174
|
11 |
|
|
dvander@174
|
12 |
#define SM_CONTEXTVAR_MYSELF 0 |
|
dvander@174
|
13 |
|
|
dvander@173
|
14 |
struct ContextPair |
|
dvander@173
|
15 |
{ |
|
dvander@173
|
16 |
ContextPair() : base(NULL), ctx(NULL) |
|
dvander@173
|
17 |
{ |
|
dvander@173
|
18 |
}; |
|
dvander@173
|
19 |
IPluginContext *base; |
|
dvander@173
|
20 |
sp_context_t *ctx; |
|
dvander@173
|
21 |
}; |
|
dvander@173
|
22 |
|
|
dvander@173
|
23 |
class CPlugin : public IPlugin |
|
dvander@173
|
24 |
{ |
|
dvander@174
|
25 |
friend class CPluginManager; |
|
dvander@176
|
26 |
friend class CFunction; |
|
dvander@173
|
27 |
public: |
|
dvander@174
|
28 |
virtual PluginType GetType() const; |
|
dvander@173
|
29 |
virtual SourcePawn::IPluginContext *GetBaseContext() const; |
|
dvander@173
|
30 |
virtual sp_context_t *GetContext() const; |
|
dvander@173
|
31 |
virtual const sm_plugininfo_t *GetPublicInfo() const; |
|
dvander@173
|
32 |
virtual const char *GetFilename() const; |
|
dvander@173
|
33 |
virtual bool IsDebugging() const; |
|
dvander@173
|
34 |
virtual PluginStatus GetStatus() const; |
|
dvander@173
|
35 |
virtual bool SetPauseState(bool paused); |
|
dvander@173
|
36 |
virtual unsigned int GetSerial() const; |
|
dvander@173
|
37 |
virtual const sp_plugin_t *GetPluginStructure() const; |
|
dvander@174
|
38 |
virtual IPluginFunction *GetFunctionByName(const char *public_name); |
|
dvander@174
|
39 |
virtual IPluginFunction *GetFunctionById(funcid_t func_id); |
|
dvander@173
|
40 |
public: |
|
dvander@173
|
41 |
static CPlugin *CreatePlugin(const char *file, |
|
dvander@173
|
42 |
bool debug_default, |
|
dvander@174
|
43 |
PluginType life, |
|
dvander@173
|
44 |
char *error, |
|
dvander@173
|
45 |
size_t maxlen); |
|
dvander@173
|
46 |
protected: |
|
dvander@173
|
47 |
void UpdateInfo(); |
|
dvander@173
|
48 |
private: |
|
dvander@173
|
49 |
ContextPair m_ctx_current; |
|
dvander@173
|
50 |
ContextPair m_ctx_backup; |
|
dvander@174
|
51 |
PluginType m_type; |
|
dvander@173
|
52 |
bool m_debugging; |
|
dvander@173
|
53 |
char m_filename[PLATFORM_MAX_PATH+1]; |
|
dvander@173
|
54 |
PluginStatus m_status; |
|
dvander@173
|
55 |
unsigned int m_serial; |
|
dvander@173
|
56 |
sm_plugininfo_t m_info; |
|
dvander@173
|
57 |
sp_plugin_t *m_plugin; |
|
dvander@176
|
58 |
unsigned int m_funcsnum; |
|
dvander@176
|
59 |
CFunction **m_priv_funcs; |
|
dvander@176
|
60 |
CFunction **m_pub_funcs; |
|
dvander@173
|
61 |
}; |
|
dvander@173
|
62 |
|
|
dvander@174
|
63 |
class CPluginManager : public IPluginManager |
|
dvander@174
|
64 |
{ |
|
dvander@176
|
65 |
friend class CPlugin; |
|
dvander@174
|
66 |
public: |
|
dvander@174
|
67 |
CPluginManager(); |
|
dvander@176
|
68 |
~CPluginManager(); |
|
dvander@174
|
69 |
public: |
|
dvander@174
|
70 |
class CPluginIterator : public IPluginIterator |
|
dvander@174
|
71 |
{ |
|
dvander@174
|
72 |
public: |
|
dvander@174
|
73 |
CPluginIterator(List<IPlugin *> *mylist); |
|
dvander@174
|
74 |
virtual ~CPluginIterator(); |
|
dvander@174
|
75 |
virtual bool MorePlugins(); |
|
dvander@174
|
76 |
virtual IPlugin *GetPlugin(); |
|
dvander@174
|
77 |
virtual void NextPlugin(); |
|
dvander@174
|
78 |
virtual void Release(); |
|
dvander@174
|
79 |
public: |
|
dvander@174
|
80 |
void Reset(); |
|
dvander@174
|
81 |
private: |
|
dvander@174
|
82 |
List<IPlugin *> *mylist; |
|
dvander@174
|
83 |
List<IPlugin *>::iterator current; |
|
dvander@174
|
84 |
}; |
|
dvander@174
|
85 |
friend class CPluginManager::CPluginIterator; |
|
dvander@174
|
86 |
public: |
|
dvander@174
|
87 |
virtual IPlugin *LoadPlugin(const char *path, |
|
dvander@174
|
88 |
bool debug, |
|
dvander@174
|
89 |
PluginType type, |
|
dvander@174
|
90 |
char error[], |
|
dvander@174
|
91 |
size_t err_max); |
|
dvander@174
|
92 |
virtual bool UnloadPlugin(IPlugin *plugin); |
|
dvander@174
|
93 |
virtual IPlugin *FindPluginByContext(const sp_context_t *ctx); |
|
dvander@174
|
94 |
virtual unsigned int GetPluginCount(); |
|
dvander@174
|
95 |
virtual IPluginIterator *GetPluginIterator(); |
|
dvander@174
|
96 |
virtual void AddPluginsListener(IPluginsListener *listener); |
|
dvander@174
|
97 |
virtual void RemovePluginsListener(IPluginsListener *listener); |
|
dvander@174
|
98 |
protected: |
|
dvander@174
|
99 |
void ReleaseIterator(CPluginIterator *iter); |
|
dvander@176
|
100 |
CFunction *GetFunctionFromPool(funcid_t f, CPlugin *plugin); |
|
dvander@176
|
101 |
void ReleaseFunctionToPool(CFunction *func); |
|
dvander@174
|
102 |
private: |
|
dvander@174
|
103 |
List<IPluginsListener *> m_listeners; |
|
dvander@174
|
104 |
List<IPlugin *> m_plugins; |
|
dvander@174
|
105 |
CStack<CPluginManager::CPluginIterator *> m_iters; |
|
dvander@176
|
106 |
CStack<CFunction *> m_funcpool; |
|
dvander@174
|
107 |
}; |
|
dvander@174
|
108 |
|
|
dvander@174
|
109 |
extern CPluginManager g_PluginMngr; |
|
dvander@174
|
110 |
|
|
dvander@173
|
111 |
#endif //_INCLUDE_SOURCEMOD_PLUGINSYSTEM_H_ |