core/systems/ShareSys.cpp
author Borja Ferrer <faluco@alliedmods.net>
Thu Jul 05 14:47:36 2007 +0000 (2007-07-05)
changeset 1041 f7b2073013df
parent 868 bdbf922e246f
child 1231 17badaf66ce4
permissions -rw-r--r--
added a time stamp argument to FormatTime
dvander@370
     1
/**
ds@653
     2
 * vim: set ts=4 :
dvander@370
     3
 * ===============================================================
dvander@370
     4
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@370
     5
 * ===============================================================
dvander@370
     6
 *
dvander@370
     7
 * This file is not open source and may not be copied without explicit
dvander@370
     8
 * written permission of AlliedModders LLC.  This file may not be redistributed 
dvander@370
     9
 * in whole or significant part.
dvander@370
    10
 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
dvander@370
    11
 *
dvander@370
    12
 * Version: $Id$
dvander@370
    13
 */
dvander@370
    14
dvander@229
    15
#include "ShareSys.h"
dvander@229
    16
#include "HandleSys.h"
dvander@304
    17
#include "ExtensionSys.h"
dvander@336
    18
#include "LibrarySys.h"
dvander@229
    19
dvander@229
    20
ShareSystem g_ShareSys;
dvander@229
    21
dvander@229
    22
ShareSystem::ShareSystem()
dvander@229
    23
{
dvander@229
    24
	m_IdentRoot.ident = 0;
dvander@229
    25
	m_TypeRoot = 0;
dvander@229
    26
	m_IfaceType = 0;
dvander@229
    27
	m_CoreType = 0;
dvander@229
    28
}
dvander@229
    29
dvander@229
    30
IdentityToken_t *ShareSystem::CreateCoreIdentity()
dvander@229
    31
{
dvander@229
    32
	if (!m_CoreType)
dvander@229
    33
	{
dvander@229
    34
		m_CoreType = CreateIdentType("CORE");
dvander@229
    35
	}
dvander@229
    36
dvander@868
    37
	return CreateIdentity(m_CoreType, this);
dvander@229
    38
}
dvander@229
    39
dvander@229
    40
void ShareSystem::OnSourceModStartup(bool late)
dvander@229
    41
{
dvander@262
    42
	TypeAccess sec;
dvander@229
    43
dvander@262
    44
	g_HandleSys.InitAccessDefaults(&sec, NULL);
dvander@262
    45
	sec.ident = GetIdentRoot();
dvander@262
    46
dvander@262
    47
	m_TypeRoot = g_HandleSys.CreateType("Identity", this, 0, &sec, NULL, NULL, NULL);
dvander@262
    48
	m_IfaceType = g_HandleSys.CreateType("Interface", this, 0, NULL, NULL, GetIdentRoot(), NULL);
dvander@229
    49
dvander@229
    50
	/* Initialize our static identity handle */
dvander@262
    51
	m_IdentRoot.ident = g_HandleSys.CreateHandle(m_TypeRoot, NULL, NULL, GetIdentRoot(), NULL);
dvander@305
    52
dvander@336
    53
	/* Add the Handle System and others... they are too innocent and pure to do it themselves */
dvander@305
    54
	AddInterface(NULL, &g_HandleSys);
dvander@336
    55
	AddInterface(NULL, &g_LibSys);
dvander@229
    56
}
dvander@229
    57
dvander@229
    58
void ShareSystem::OnSourceModShutdown()
dvander@229
    59
{
dvander@229
    60
	if (m_CoreType)
dvander@229
    61
	{
dvander@229
    62
		g_HandleSys.RemoveType(m_CoreType, GetIdentRoot());
dvander@229
    63
	}
dvander@229
    64
dvander@229
    65
	g_HandleSys.RemoveType(m_IfaceType, GetIdentRoot());
dvander@229
    66
	g_HandleSys.RemoveType(m_TypeRoot, GetIdentRoot());
dvander@229
    67
}
dvander@229
    68
dvander@229
    69
IdentityType_t ShareSystem::FindIdentType(const char *name)
dvander@229
    70
{
dvander@229
    71
	HandleType_t type;
dvander@229
    72
dvander@229
    73
	if (g_HandleSys.FindHandleType(name, &type))
dvander@229
    74
	{
dvander@229
    75
		if (g_HandleSys.TypeCheck(type, m_TypeRoot))
dvander@229
    76
		{
dvander@229
    77
			return type;
dvander@229
    78
		}
dvander@229
    79
	}
dvander@229
    80
dvander@229
    81
	return 0;
dvander@229
    82
}
dvander@229
    83
dvander@229
    84
IdentityType_t ShareSystem::CreateIdentType(const char *name)
dvander@229
    85
{
dvander@229
    86
	if (!m_TypeRoot)
dvander@229
    87
	{
dvander@229
    88
		return 0;
dvander@229
    89
	}
dvander@229
    90
dvander@262
    91
	return g_HandleSys.CreateType(name, this, m_TypeRoot, NULL, NULL, GetIdentRoot(), NULL);
dvander@229
    92
}
dvander@229
    93
dvander@229
    94
void ShareSystem::OnHandleDestroy(HandleType_t type, void *object)
dvander@229
    95
{
dvander@283
    96
	/* THIS WILL NEVER BE CALLED FOR ANYTHING WITH THE IDENTITY TYPE */
dvander@229
    97
}
dvander@229
    98
dvander@868
    99
IdentityToken_t *ShareSystem::CreateIdentity(IdentityType_t type, void *ptr)
dvander@229
   100
{
dvander@229
   101
	if (!m_TypeRoot)
dvander@229
   102
	{
dvander@229
   103
		return 0;
dvander@229
   104
	}
dvander@229
   105
dvander@229
   106
	/* :TODO: Cache? */
dvander@229
   107
	IdentityToken_t *pToken = new IdentityToken_t;
dvander@528
   108
dvander@528
   109
	HandleSecurity sec;
dvander@528
   110
	sec.pOwner = sec.pIdentity = GetIdentRoot();
dvander@528
   111
dvander@528
   112
	pToken->ident = g_HandleSys.CreateHandleInt(type, NULL, &sec, NULL, NULL, true);
dvander@868
   113
	pToken->ptr = ptr;
dvander@868
   114
	pToken->type = type;
dvander@229
   115
dvander@229
   116
	return pToken;
dvander@229
   117
}
dvander@229
   118
dvander@304
   119
bool ShareSystem::AddInterface(IExtension *myself, SMInterface *iface)
dvander@229
   120
{
dvander@229
   121
	if (!iface)
dvander@229
   122
	{
dvander@229
   123
		return false;
dvander@229
   124
	}
dvander@229
   125
dvander@229
   126
	IfaceInfo info;
dvander@229
   127
dvander@304
   128
	info.owner = myself;
dvander@229
   129
	info.iface = iface;
dvander@229
   130
	
dvander@229
   131
	m_Interfaces.push_back(info);
dvander@229
   132
dvander@229
   133
	return true;
dvander@229
   134
}
dvander@229
   135
dvander@229
   136
bool ShareSystem::RequestInterface(const char *iface_name, 
dvander@229
   137
								   unsigned int iface_vers, 
dvander@311
   138
								   IExtension *myself, 
dvander@229
   139
								   SMInterface **pIface)
dvander@229
   140
{
dvander@229
   141
	/* See if the interface exists */
dvander@229
   142
	List<IfaceInfo>::iterator iter;
dvander@229
   143
	SMInterface *iface;
dvander@304
   144
	IExtension *iface_owner;
dvander@229
   145
	bool found = false;
dvander@229
   146
	for (iter=m_Interfaces.begin(); iter!=m_Interfaces.end(); iter++)
dvander@229
   147
	{
dvander@229
   148
		IfaceInfo &info = (*iter);
dvander@229
   149
		iface = info.iface;
dvander@229
   150
		if (strcmp(iface->GetInterfaceName(), iface_name) == 0)
dvander@229
   151
		{
dvander@229
   152
			if (iface->GetInterfaceVersion() == iface_vers
dvander@229
   153
				|| iface->IsVersionCompatible(iface_vers))
dvander@229
   154
			{
dvander@304
   155
				iface_owner = info.owner;
dvander@229
   156
				found = true;
dvander@229
   157
				break;
dvander@229
   158
			}
dvander@229
   159
		}
dvander@229
   160
	}
dvander@229
   161
dvander@229
   162
	if (!found)
dvander@229
   163
	{
dvander@229
   164
		return false;
dvander@229
   165
	}
dvander@229
   166
dvander@304
   167
	/* Add a dependency node */
dvander@229
   168
	if (iface_owner)
dvander@229
   169
	{
dvander@304
   170
		IfaceInfo info;
dvander@304
   171
		info.iface = iface;
dvander@304
   172
		info.owner = iface_owner;
dvander@311
   173
		g_Extensions.BindDependency(myself, &info);
dvander@229
   174
	}
dvander@229
   175
dvander@304
   176
	if (pIface)
dvander@304
   177
	{
dvander@304
   178
		*pIface = iface;
dvander@304
   179
	}
dvander@229
   180
dvander@304
   181
	return true;
dvander@229
   182
}
dvander@229
   183
dvander@312
   184
void ShareSystem::AddNatives(IExtension *myself, const sp_nativeinfo_t *natives)
dvander@229
   185
{
dvander@315
   186
	g_Extensions.AddNatives(myself, natives);
dvander@229
   187
}
dvander@229
   188
dvander@229
   189
void ShareSystem::DestroyIdentity(IdentityToken_t *identity)
dvander@229
   190
{
dvander@262
   191
	HandleSecurity sec;
dvander@262
   192
dvander@262
   193
	sec.pOwner = GetIdentRoot();
dvander@262
   194
	sec.pIdentity = GetIdentRoot();
dvander@262
   195
dvander@262
   196
	g_HandleSys.FreeHandle(identity->ident, &sec);
dvander@229
   197
	delete identity;
dvander@229
   198
}
dvander@229
   199
dvander@229
   200
void ShareSystem::DestroyIdentType(IdentityType_t type)
dvander@229
   201
{
dvander@229
   202
	g_HandleSys.RemoveType(type, GetIdentRoot());
dvander@229
   203
}
dvander@229
   204
dvander@304
   205
void ShareSystem::RemoveInterfaces(IExtension *pExtension)
dvander@304
   206
{
dvander@304
   207
	List<IfaceInfo>::iterator iter = m_Interfaces.begin();
dvander@304
   208
dvander@304
   209
	while (iter != m_Interfaces.end())
dvander@304
   210
	{
dvander@304
   211
		if ((*iter).owner == pExtension)
dvander@304
   212
		{
dvander@304
   213
			iter = m_Interfaces.erase(iter);
dvander@304
   214
		} else {
dvander@304
   215
			iter++;
dvander@304
   216
		}
dvander@304
   217
	}
dvander@304
   218
}
dvander@324
   219
dvander@324
   220
void ShareSystem::AddDependency(IExtension *myself, const char *filename, bool require, bool autoload)
dvander@324
   221
{
dvander@324
   222
	g_Extensions.AddDependency(myself, filename, require, autoload);
dvander@324
   223
}
dvander@324
   224