core/systems/HandleSys.h
author David Anderson <dvander@alliedmods.net>
Sat Dec 16 22:27:18 2006 +0000 (2006-12-16)
changeset 218 cbc16328b1bf
child 222 8d009d0087f1
permissions -rw-r--r--
implemented and finalized initial HandleSystem API
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_