|
dvander@218
|
1 |
#ifndef _INCLUDE_SOURCEMOD_HANDLESYSTEM_H_ |
|
dvander@218
|
2 |
#define _INCLUDE_SOURCEMOD_HANDLESYSTEM_H_ |
|
dvander@218
|
3 |
|
|
dvander@218
|
4 |
#include <IHandleSys.h> |
|
dvander@218
|
5 |
#include "sm_globals.h" |
|
dvander@218
|
6 |
#include "sm_trie.h" |
|
dvander@218
|
7 |
#include "sourcemod.h" |
|
dvander@218
|
8 |
#include "sm_memtable.h" |
|
dvander@218
|
9 |
|
|
dvander@218
|
10 |
#define HANDLESYS_MAX_HANDLES (1<<16) |
|
dvander@218
|
11 |
#define HANDLESYS_MAX_TYPES (1<<9) |
|
dvander@218
|
12 |
#define HANDLESYS_MAX_SUBTYPES 0xF |
|
dvander@218
|
13 |
#define HANDLESYS_SUBTYPE_MASK 0xF |
|
dvander@218
|
14 |
#define HANDLESYS_TYPEARRAY_SIZE (HANDLESYS_MAX_TYPES * (HANDLESYS_MAX_SUBTYPES + 1)) |
|
dvander@218
|
15 |
#define HANDLESYS_MAX_SERIALS 0xFFFF |
|
dvander@218
|
16 |
#define HANDLESYS_SERIAL_MASK 0xFFFF0000 |
|
dvander@218
|
17 |
#define HANDLESYS_HANDLE_MASK 0x0000FFFF |
|
dvander@218
|
18 |
|
|
dvander@218
|
19 |
struct QHandle |
|
dvander@218
|
20 |
{ |
|
dvander@218
|
21 |
HandleType_t type; |
|
dvander@218
|
22 |
void *object; |
|
dvander@218
|
23 |
unsigned int freeID; |
|
dvander@218
|
24 |
IdentityToken_t source; |
|
dvander@218
|
25 |
bool set; |
|
dvander@218
|
26 |
unsigned int serial; |
|
dvander@218
|
27 |
}; |
|
dvander@218
|
28 |
|
|
dvander@218
|
29 |
struct QHandleType |
|
dvander@218
|
30 |
{ |
|
dvander@218
|
31 |
IHandleTypeDispatch *dispatch; |
|
dvander@218
|
32 |
unsigned int freeID; |
|
dvander@218
|
33 |
unsigned int children; |
|
dvander@218
|
34 |
HandleSecurity sec; |
|
dvander@218
|
35 |
unsigned int opened; |
|
dvander@218
|
36 |
int nameIdx; |
|
dvander@218
|
37 |
}; |
|
dvander@218
|
38 |
|
|
dvander@218
|
39 |
class HandleSystem : |
|
dvander@218
|
40 |
public IHandleSys |
|
dvander@218
|
41 |
{ |
|
dvander@218
|
42 |
public: |
|
dvander@218
|
43 |
HandleSystem(); |
|
dvander@218
|
44 |
~HandleSystem(); |
|
dvander@218
|
45 |
public: //IHandleSystem |
|
dvander@218
|
46 |
HandleType_t CreateType(const char *name, IHandleTypeDispatch *dispatch); |
|
dvander@218
|
47 |
HandleType_t CreateTypeEx(const char *name, |
|
dvander@218
|
48 |
IHandleTypeDispatch *dispatch, |
|
dvander@218
|
49 |
HandleType_t parent, |
|
dvander@218
|
50 |
const HandleSecurity *security); |
|
dvander@218
|
51 |
HandleType_t CreateChildType(const char *name, HandleType_t parent, IHandleTypeDispatch *dispatch); |
|
dvander@218
|
52 |
bool RemoveType(HandleType_t type, IdentityToken_t ident); |
|
dvander@218
|
53 |
bool FindHandleType(const char *name, HandleType_t *type); |
|
dvander@218
|
54 |
Handle_t CreateHandle(HandleType_t type, |
|
dvander@218
|
55 |
void *object, |
|
dvander@218
|
56 |
IdentityToken_t source, |
|
dvander@218
|
57 |
IdentityToken_t ident); |
|
dvander@218
|
58 |
Handle_t CreateScriptHandle(HandleType_t type, void *object, sp_context_t *ctx, IdentityToken_t ident); |
|
dvander@218
|
59 |
HandleError DestroyHandle(Handle_t handle, IdentityToken_t ident); |
|
dvander@218
|
60 |
HandleError ReadHandle(Handle_t handle, HandleType_t type, IdentityToken_t ident, void **object); |
|
dvander@218
|
61 |
private: |
|
dvander@218
|
62 |
QHandle *m_Handles; |
|
dvander@218
|
63 |
QHandleType *m_Types; |
|
dvander@218
|
64 |
Trie *m_TypeLookup; |
|
dvander@218
|
65 |
unsigned int m_TypeTail; |
|
dvander@218
|
66 |
unsigned int m_FreeTypes; |
|
dvander@218
|
67 |
unsigned int m_HandleTail; |
|
dvander@218
|
68 |
unsigned int m_FreeHandles; |
|
dvander@218
|
69 |
unsigned int m_HSerial; |
|
dvander@218
|
70 |
BaseStringTable *m_strtab; |
|
dvander@218
|
71 |
}; |
|
dvander@218
|
72 |
|
|
dvander@218
|
73 |
extern HandleSystem g_HandleSys; |
|
dvander@218
|
74 |
|
|
dvander@218
|
75 |
#endif //_INCLUDE_SOURCEMOD_HANDLESYSTEM_H_ |