core/systems/ShareSys.cpp
author David Anderson <dvander@alliedmods.net>
Thu Jan 18 20:56:41 2007 +0000 (2007-01-18)
changeset 313 35d47ceae36f
parent 312 804f4de0aa69
child 315 5f48300aa103
permissions -rw-r--r--
This is now const
dvander@229
     1
#include "ShareSys.h"
dvander@229
     2
#include "HandleSys.h"
dvander@304
     3
#include "ExtensionSys.h"
dvander@229
     4
dvander@229
     5
ShareSystem g_ShareSys;
dvander@229
     6
dvander@229
     7
ShareSystem::ShareSystem()
dvander@229
     8
{
dvander@229
     9
	m_IdentRoot.ident = 0;
dvander@229
    10
	m_TypeRoot = 0;
dvander@229
    11
	m_IfaceType = 0;
dvander@229
    12
	m_CoreType = 0;
dvander@229
    13
}
dvander@229
    14
dvander@229
    15
IdentityToken_t *ShareSystem::CreateCoreIdentity()
dvander@229
    16
{
dvander@229
    17
	if (!m_CoreType)
dvander@229
    18
	{
dvander@229
    19
		m_CoreType = CreateIdentType("CORE");
dvander@229
    20
	}
dvander@229
    21
dvander@229
    22
	return CreateIdentity(m_CoreType);
dvander@229
    23
}
dvander@229
    24
dvander@229
    25
void ShareSystem::OnSourceModStartup(bool late)
dvander@229
    26
{
dvander@262
    27
	TypeAccess sec;
dvander@229
    28
dvander@262
    29
	g_HandleSys.InitAccessDefaults(&sec, NULL);
dvander@262
    30
	sec.ident = GetIdentRoot();
dvander@262
    31
dvander@262
    32
	m_TypeRoot = g_HandleSys.CreateType("Identity", this, 0, &sec, NULL, NULL, NULL);
dvander@262
    33
	m_IfaceType = g_HandleSys.CreateType("Interface", this, 0, NULL, NULL, GetIdentRoot(), NULL);
dvander@229
    34
dvander@229
    35
	/* Initialize our static identity handle */
dvander@262
    36
	m_IdentRoot.ident = g_HandleSys.CreateHandle(m_TypeRoot, NULL, NULL, GetIdentRoot(), NULL);
dvander@305
    37
dvander@305
    38
	/* Add the Handle System... it's too innocent and pure to do it itself */
dvander@305
    39
	AddInterface(NULL, &g_HandleSys);
dvander@229
    40
}
dvander@229
    41
dvander@229
    42
void ShareSystem::OnSourceModShutdown()
dvander@229
    43
{
dvander@229
    44
	if (m_CoreType)
dvander@229
    45
	{
dvander@229
    46
		g_HandleSys.RemoveType(m_CoreType, GetIdentRoot());
dvander@229
    47
	}
dvander@229
    48
dvander@229
    49
	g_HandleSys.RemoveType(m_IfaceType, GetIdentRoot());
dvander@229
    50
	g_HandleSys.RemoveType(m_TypeRoot, GetIdentRoot());
dvander@229
    51
}
dvander@229
    52
dvander@229
    53
IdentityType_t ShareSystem::FindIdentType(const char *name)
dvander@229
    54
{
dvander@229
    55
	HandleType_t type;
dvander@229
    56
dvander@229
    57
	if (g_HandleSys.FindHandleType(name, &type))
dvander@229
    58
	{
dvander@229
    59
		if (g_HandleSys.TypeCheck(type, m_TypeRoot))
dvander@229
    60
		{
dvander@229
    61
			return type;
dvander@229
    62
		}
dvander@229
    63
	}
dvander@229
    64
dvander@229
    65
	return 0;
dvander@229
    66
}
dvander@229
    67
dvander@229
    68
IdentityType_t ShareSystem::CreateIdentType(const char *name)
dvander@229
    69
{
dvander@229
    70
	if (!m_TypeRoot)
dvander@229
    71
	{
dvander@229
    72
		return 0;
dvander@229
    73
	}
dvander@229
    74
dvander@262
    75
	return g_HandleSys.CreateType(name, this, m_TypeRoot, NULL, NULL, GetIdentRoot(), NULL);
dvander@229
    76
}
dvander@229
    77
dvander@229
    78
void ShareSystem::OnHandleDestroy(HandleType_t type, void *object)
dvander@229
    79
{
dvander@283
    80
	/* THIS WILL NEVER BE CALLED FOR ANYTHING WITH THE IDENTITY TYPE */
dvander@229
    81
}
dvander@229
    82
dvander@229
    83
IdentityToken_t *ShareSystem::CreateIdentity(IdentityType_t type)
dvander@229
    84
{
dvander@229
    85
	if (!m_TypeRoot)
dvander@229
    86
	{
dvander@229
    87
		return 0;
dvander@229
    88
	}
dvander@229
    89
dvander@229
    90
	/* :TODO: Cache? */
dvander@229
    91
	IdentityToken_t *pToken = new IdentityToken_t;
dvander@283
    92
	pToken->ident = g_HandleSys.CreateHandleEx(type, NULL, GetIdentRoot(), GetIdentRoot(), NULL, true);
dvander@229
    93
dvander@229
    94
	return pToken;
dvander@229
    95
}
dvander@229
    96
dvander@304
    97
bool ShareSystem::AddInterface(IExtension *myself, SMInterface *iface)
dvander@229
    98
{
dvander@229
    99
	if (!iface)
dvander@229
   100
	{
dvander@229
   101
		return false;
dvander@229
   102
	}
dvander@229
   103
dvander@229
   104
	IfaceInfo info;
dvander@229
   105
dvander@304
   106
	info.owner = myself;
dvander@229
   107
	info.iface = iface;
dvander@229
   108
	
dvander@229
   109
	m_Interfaces.push_back(info);
dvander@229
   110
dvander@229
   111
	return true;
dvander@229
   112
}
dvander@229
   113
dvander@229
   114
bool ShareSystem::RequestInterface(const char *iface_name, 
dvander@229
   115
								   unsigned int iface_vers, 
dvander@311
   116
								   IExtension *myself, 
dvander@229
   117
								   SMInterface **pIface)
dvander@229
   118
{
dvander@229
   119
	/* See if the interface exists */
dvander@229
   120
	List<IfaceInfo>::iterator iter;
dvander@229
   121
	SMInterface *iface;
dvander@304
   122
	IExtension *iface_owner;
dvander@229
   123
	bool found = false;
dvander@229
   124
	for (iter=m_Interfaces.begin(); iter!=m_Interfaces.end(); iter++)
dvander@229
   125
	{
dvander@229
   126
		IfaceInfo &info = (*iter);
dvander@229
   127
		iface = info.iface;
dvander@229
   128
		if (strcmp(iface->GetInterfaceName(), iface_name) == 0)
dvander@229
   129
		{
dvander@229
   130
			if (iface->GetInterfaceVersion() == iface_vers
dvander@229
   131
				|| iface->IsVersionCompatible(iface_vers))
dvander@229
   132
			{
dvander@304
   133
				iface_owner = info.owner;
dvander@229
   134
				found = true;
dvander@229
   135
				break;
dvander@229
   136
			}
dvander@229
   137
		}
dvander@229
   138
	}
dvander@229
   139
dvander@229
   140
	if (!found)
dvander@229
   141
	{
dvander@229
   142
		return false;
dvander@229
   143
	}
dvander@229
   144
dvander@304
   145
	/* Add a dependency node */
dvander@229
   146
	if (iface_owner)
dvander@229
   147
	{
dvander@304
   148
		IfaceInfo info;
dvander@304
   149
		info.iface = iface;
dvander@304
   150
		info.owner = iface_owner;
dvander@311
   151
		g_Extensions.BindDependency(myself, &info);
dvander@229
   152
	}
dvander@229
   153
dvander@304
   154
	if (pIface)
dvander@304
   155
	{
dvander@304
   156
		*pIface = iface;
dvander@304
   157
	}
dvander@229
   158
dvander@304
   159
	return true;
dvander@229
   160
}
dvander@229
   161
dvander@312
   162
void ShareSystem::AddNatives(IExtension *myself, const sp_nativeinfo_t *natives)
dvander@229
   163
{
dvander@313
   164
	
dvander@229
   165
}
dvander@229
   166
dvander@229
   167
void ShareSystem::DestroyIdentity(IdentityToken_t *identity)
dvander@229
   168
{
dvander@262
   169
	HandleSecurity sec;
dvander@262
   170
dvander@262
   171
	sec.pOwner = GetIdentRoot();
dvander@262
   172
	sec.pIdentity = GetIdentRoot();
dvander@262
   173
dvander@262
   174
	g_HandleSys.FreeHandle(identity->ident, &sec);
dvander@229
   175
	delete identity;
dvander@229
   176
}
dvander@229
   177
dvander@229
   178
void ShareSystem::DestroyIdentType(IdentityType_t type)
dvander@229
   179
{
dvander@229
   180
	g_HandleSys.RemoveType(type, GetIdentRoot());
dvander@229
   181
}
dvander@229
   182
dvander@304
   183
void ShareSystem::RemoveInterfaces(IExtension *pExtension)
dvander@304
   184
{
dvander@304
   185
	List<IfaceInfo>::iterator iter = m_Interfaces.begin();
dvander@304
   186
dvander@304
   187
	while (iter != m_Interfaces.end())
dvander@304
   188
	{
dvander@304
   189
		if ((*iter).owner == pExtension)
dvander@304
   190
		{
dvander@304
   191
			iter = m_Interfaces.erase(iter);
dvander@304
   192
		} else {
dvander@304
   193
			iter++;
dvander@304
   194
		}
dvander@304
   195
	}
dvander@304
   196
}