dvander@218: #ifndef _INCLUDE_SOURCEMOD_HANDLESYSTEM_H_ dvander@218: #define _INCLUDE_SOURCEMOD_HANDLESYSTEM_H_ dvander@218: dvander@218: #include dvander@218: #include "sm_globals.h" dvander@218: #include "sm_trie.h" dvander@218: #include "sourcemod.h" dvander@218: #include "sm_memtable.h" dvander@218: dvander@218: #define HANDLESYS_MAX_HANDLES (1<<16) dvander@218: #define HANDLESYS_MAX_TYPES (1<<9) dvander@218: #define HANDLESYS_MAX_SUBTYPES 0xF dvander@218: #define HANDLESYS_SUBTYPE_MASK 0xF dvander@218: #define HANDLESYS_TYPEARRAY_SIZE (HANDLESYS_MAX_TYPES * (HANDLESYS_MAX_SUBTYPES + 1)) dvander@218: #define HANDLESYS_MAX_SERIALS 0xFFFF dvander@218: #define HANDLESYS_SERIAL_MASK 0xFFFF0000 dvander@218: #define HANDLESYS_HANDLE_MASK 0x0000FFFF dvander@218: dvander@218: struct QHandle dvander@218: { dvander@218: HandleType_t type; dvander@218: void *object; dvander@218: unsigned int freeID; dvander@218: IdentityToken_t source; dvander@218: bool set; dvander@218: unsigned int serial; dvander@218: }; dvander@218: dvander@218: struct QHandleType dvander@218: { dvander@218: IHandleTypeDispatch *dispatch; dvander@218: unsigned int freeID; dvander@218: unsigned int children; dvander@218: HandleSecurity sec; dvander@218: unsigned int opened; dvander@218: int nameIdx; dvander@218: }; dvander@218: dvander@218: class HandleSystem : dvander@218: public IHandleSys dvander@218: { dvander@218: public: dvander@218: HandleSystem(); dvander@218: ~HandleSystem(); dvander@218: public: //IHandleSystem dvander@218: HandleType_t CreateType(const char *name, IHandleTypeDispatch *dispatch); dvander@218: HandleType_t CreateTypeEx(const char *name, dvander@218: IHandleTypeDispatch *dispatch, dvander@218: HandleType_t parent, dvander@218: const HandleSecurity *security); dvander@218: HandleType_t CreateChildType(const char *name, HandleType_t parent, IHandleTypeDispatch *dispatch); dvander@218: bool RemoveType(HandleType_t type, IdentityToken_t ident); dvander@218: bool FindHandleType(const char *name, HandleType_t *type); dvander@218: Handle_t CreateHandle(HandleType_t type, dvander@218: void *object, dvander@218: IdentityToken_t source, dvander@218: IdentityToken_t ident); dvander@218: Handle_t CreateScriptHandle(HandleType_t type, void *object, sp_context_t *ctx, IdentityToken_t ident); dvander@218: HandleError DestroyHandle(Handle_t handle, IdentityToken_t ident); dvander@218: HandleError ReadHandle(Handle_t handle, HandleType_t type, IdentityToken_t ident, void **object); dvander@218: private: dvander@218: QHandle *m_Handles; dvander@218: QHandleType *m_Types; dvander@218: Trie *m_TypeLookup; dvander@218: unsigned int m_TypeTail; dvander@218: unsigned int m_FreeTypes; dvander@218: unsigned int m_HandleTail; dvander@218: unsigned int m_FreeHandles; dvander@218: unsigned int m_HSerial; dvander@218: BaseStringTable *m_strtab; dvander@218: }; dvander@218: dvander@218: extern HandleSystem g_HandleSys; dvander@218: dvander@218: #endif //_INCLUDE_SOURCEMOD_HANDLESYSTEM_H_