|
dvander@140
|
1 |
#ifndef _INCLUDE_SOURCEMOD_IFACE_SHARE_SYS_H_ |
|
dvander@140
|
2 |
#define _INCLUDE_SOURCEMOD_IFACE_SHARE_SYS_H_ |
|
dvander@140
|
3 |
|
|
dvander@140
|
4 |
namespace SourceMod |
|
dvander@140
|
5 |
{ |
|
dvander@140
|
6 |
/** |
|
dvander@140
|
7 |
* @brief Defines the base functionality required by a shared interface. |
|
dvander@140
|
8 |
*/ |
|
dvander@140
|
9 |
class SMInterface |
|
dvander@140
|
10 |
{ |
|
dvander@140
|
11 |
public: |
|
dvander@140
|
12 |
/** |
|
dvander@140
|
13 |
* @brief Must return an integer defining the interface's version. |
|
dvander@140
|
14 |
*/ |
|
dvander@140
|
15 |
virtual unsigned int GetInterfaceVersion() =0; |
|
dvander@140
|
16 |
|
|
dvander@140
|
17 |
/** |
|
dvander@140
|
18 |
* @brief Must return a string defining the interface's unique name. |
|
dvander@140
|
19 |
*/ |
|
dvander@140
|
20 |
virtual const char *GetInterfaceName() =0; |
|
dvander@140
|
21 |
|
|
dvander@140
|
22 |
/** |
|
dvander@140
|
23 |
* @brief Must return whether the requested version number is backwards comaptible. |
|
dvander@140
|
24 |
* Note: This can be overridden for breaking changes or custom versioning. |
|
dvander@140
|
25 |
* |
|
dvander@140
|
26 |
* @param version Version number to compare against. |
|
dvander@140
|
27 |
* @return True if compatible, false otherwise. |
|
dvander@140
|
28 |
*/ |
|
dvander@140
|
29 |
virtual bool IsVersionCompatible(unsigned int version) |
|
dvander@140
|
30 |
{ |
|
dvander@140
|
31 |
if (version > GetInterfaceVersion()) |
|
dvander@140
|
32 |
{ |
|
dvander@140
|
33 |
return false; |
|
dvander@140
|
34 |
} |
|
dvander@140
|
35 |
|
|
dvander@140
|
36 |
return true; |
|
dvander@140
|
37 |
} |
|
dvander@140
|
38 |
}; |
|
dvander@140
|
39 |
|
|
dvander@140
|
40 |
enum UnloadableParentType |
|
dvander@140
|
41 |
{ |
|
dvander@140
|
42 |
ParentType_Module, |
|
dvander@140
|
43 |
ParentType_Plugin |
|
dvander@140
|
44 |
}; |
|
dvander@140
|
45 |
|
|
dvander@140
|
46 |
/** |
|
dvander@140
|
47 |
* @brief Denotes a top-level unloadable object. |
|
dvander@140
|
48 |
*/ |
|
dvander@140
|
49 |
class IUnloadableParent |
|
dvander@140
|
50 |
{ |
|
dvander@140
|
51 |
public: |
|
dvander@140
|
52 |
virtual UnloadableParentType GetParentType() =0; |
|
dvander@140
|
53 |
|
|
dvander@140
|
54 |
virtual void *GetParentToken() =0; |
|
dvander@140
|
55 |
|
|
dvander@140
|
56 |
/** |
|
dvander@140
|
57 |
* @brief Called when an interface this object has requested is removed. |
|
dvander@140
|
58 |
* |
|
dvander@140
|
59 |
* @param pIface Interface being removed. |
|
dvander@140
|
60 |
*/ |
|
dvander@140
|
61 |
virtual void OnInterfaceUnlink(SMInterface *pIface) =0; |
|
dvander@140
|
62 |
protected: |
|
dvander@140
|
63 |
void *m_parent_token; |
|
dvander@140
|
64 |
}; |
|
dvander@140
|
65 |
|
|
dvander@140
|
66 |
/** |
|
dvander@140
|
67 |
* @brief Listens for unlinked objects. |
|
dvander@140
|
68 |
*/ |
|
dvander@140
|
69 |
class IUnlinkListener |
|
dvander@140
|
70 |
{ |
|
dvander@140
|
71 |
public: |
|
dvander@140
|
72 |
/** |
|
dvander@140
|
73 |
* @brief Called when a parent object is unloaded. |
|
dvander@140
|
74 |
* |
|
dvander@140
|
75 |
* @param parent The parent object which is dying. |
|
dvander@140
|
76 |
*/ |
|
dvander@140
|
77 |
virtual void OnParentUnlink(IUnloadableParent *parent) |
|
dvander@140
|
78 |
{ |
|
dvander@140
|
79 |
} |
|
dvander@140
|
80 |
}; |
|
dvander@140
|
81 |
|
|
dvander@140
|
82 |
/** |
|
dvander@140
|
83 |
* @brief Tracks dependencies and fires dependency listeners. |
|
dvander@140
|
84 |
*/ |
|
dvander@140
|
85 |
class IShareSys |
|
dvander@140
|
86 |
{ |
|
dvander@140
|
87 |
public: |
|
dvander@140
|
88 |
/** |
|
dvander@140
|
89 |
* @brief Adds an interface to the global interface system |
|
dvander@140
|
90 |
* |
|
dvander@140
|
91 |
* @param iface Interface pointer (must be unique). |
|
dvander@140
|
92 |
* @param parent Parent unloadable token given to the module/interface. |
|
dvander@140
|
93 |
*/ |
|
dvander@140
|
94 |
virtual bool AddInterface(SMInterface *iface, IUnloadableParent *parent) =0; |
|
dvander@140
|
95 |
|
|
dvander@140
|
96 |
/** |
|
dvander@140
|
97 |
* @brief Requests an interface from the global interface system. |
|
dvander@140
|
98 |
* If found, the interface's internal reference count will be increased. |
|
dvander@140
|
99 |
* |
|
dvander@140
|
100 |
* @param iface_name Interface name. |
|
dvander@140
|
101 |
* @param iface_vers Interface version to attempt to match. |
|
dvander@140
|
102 |
* @param me Object requesting this interface, in order to track dependencies. |
|
dvander@140
|
103 |
* @param pIface Pointer to store the return value in. |
|
dvander@140
|
104 |
*/ |
|
dvander@140
|
105 |
virtual bool RequestInterface(const char *iface_name, |
|
dvander@140
|
106 |
unsigned int iface_vers, |
|
dvander@140
|
107 |
IUnloadableParent *me, |
|
dvander@140
|
108 |
void **pIface) =0; |
|
dvander@140
|
109 |
|
|
dvander@140
|
110 |
/** |
|
dvander@140
|
111 |
* @brief Unloads an interface. |
|
dvander@140
|
112 |
* |
|
dvander@140
|
113 |
* @param iface Interface pointer. |
|
dvander@140
|
114 |
* @param parent Security token, trivial measure to prevent accidental unloads. |
|
dvander@140
|
115 |
* This token must match the one used with AddInterface(). |
|
dvander@140
|
116 |
*/ |
|
dvander@140
|
117 |
virtual void RemoveInterface(SMInterface *iface, IUnloadableParent *parent) =0; |
|
dvander@140
|
118 |
|
|
dvander@140
|
119 |
/** |
|
dvander@140
|
120 |
* @brief Adds an unlink listener. |
|
dvander@140
|
121 |
* |
|
dvander@140
|
122 |
* @param pListener Listener pointer. |
|
dvander@140
|
123 |
*/ |
|
dvander@140
|
124 |
virtual void AddUnlinkListener(IUnlinkListener *pListener) =0; |
|
dvander@140
|
125 |
|
|
dvander@140
|
126 |
/** |
|
dvander@140
|
127 |
* @brief Removes an unlink listener. |
|
dvander@140
|
128 |
* |
|
dvander@140
|
129 |
* @param pListener Listener pointer. |
|
dvander@140
|
130 |
*/ |
|
dvander@140
|
131 |
virtual void RemoveUnlinkListener(IUnlinkListener *pListener) =0; |
|
dvander@140
|
132 |
}; |
|
dvander@140
|
133 |
}; |
|
dvander@140
|
134 |
|
|
dvander@140
|
135 |
#endif //_INCLUDE_SOURCEMOD_IFACE_SHARE_SYS_H_ |