core/systems/ShareSys.cpp
author Matt Woodrow <pred@alliedmods.net>
Tue Mar 11 23:52:56 2008 +0000 (2008-03-11)
changeset 1921 f993e100e5a3
parent 1770 9c545310f947
child 1947 e73a1e51833b
permissions -rw-r--r--
Fixed bug in GetAdjustedTime()
dvander@370
     1
/**
ds@653
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
dvander@1231
     4
 * SourceMod
dvander@1231
     5
 * Copyright (C) 2004-2007 AlliedModders LLC.  All rights reserved.
ds@1330
     6
 * =============================================================================
dvander@370
     7
 *
ds@1330
     8
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    10
 * Free Software Foundation.
dvander@1231
    11
 * 
ds@1330
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    15
 * details.
dvander@1231
    16
 *
ds@1330
    17
 * You should have received a copy of the GNU General Public License along with
ds@1330
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1231
    19
 *
ds@1330
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    27
 * or <http://www.sourcemod.net/license.php>.
dvander@370
    28
 *
dvander@370
    29
 * Version: $Id$
dvander@370
    30
 */
dvander@370
    31
dvander@229
    32
#include "ShareSys.h"
dvander@229
    33
#include "HandleSys.h"
dvander@304
    34
#include "ExtensionSys.h"
dvander@336
    35
#include "LibrarySys.h"
dvander@229
    36
dvander@229
    37
ShareSystem g_ShareSys;
dvander@229
    38
dvander@229
    39
ShareSystem::ShareSystem()
dvander@229
    40
{
dvander@229
    41
	m_IdentRoot.ident = 0;
dvander@229
    42
	m_TypeRoot = 0;
dvander@229
    43
	m_IfaceType = 0;
dvander@229
    44
	m_CoreType = 0;
dvander@229
    45
}
dvander@229
    46
dvander@229
    47
IdentityToken_t *ShareSystem::CreateCoreIdentity()
dvander@229
    48
{
dvander@229
    49
	if (!m_CoreType)
dvander@229
    50
	{
dvander@229
    51
		m_CoreType = CreateIdentType("CORE");
dvander@229
    52
	}
dvander@229
    53
dvander@868
    54
	return CreateIdentity(m_CoreType, this);
dvander@229
    55
}
dvander@229
    56
dvander@1770
    57
void ShareSystem::Initialize()
dvander@229
    58
{
dvander@262
    59
	TypeAccess sec;
dvander@229
    60
dvander@262
    61
	g_HandleSys.InitAccessDefaults(&sec, NULL);
dvander@262
    62
	sec.ident = GetIdentRoot();
dvander@262
    63
dvander@262
    64
	m_TypeRoot = g_HandleSys.CreateType("Identity", this, 0, &sec, NULL, NULL, NULL);
dvander@262
    65
	m_IfaceType = g_HandleSys.CreateType("Interface", this, 0, NULL, NULL, GetIdentRoot(), NULL);
dvander@229
    66
dvander@229
    67
	/* Initialize our static identity handle */
dvander@262
    68
	m_IdentRoot.ident = g_HandleSys.CreateHandle(m_TypeRoot, NULL, NULL, GetIdentRoot(), NULL);
dvander@305
    69
dvander@336
    70
	/* Add the Handle System and others... they are too innocent and pure to do it themselves */
dvander@305
    71
	AddInterface(NULL, &g_HandleSys);
dvander@336
    72
	AddInterface(NULL, &g_LibSys);
dvander@229
    73
}
dvander@229
    74
dvander@229
    75
void ShareSystem::OnSourceModShutdown()
dvander@229
    76
{
dvander@229
    77
	if (m_CoreType)
dvander@229
    78
	{
dvander@229
    79
		g_HandleSys.RemoveType(m_CoreType, GetIdentRoot());
dvander@229
    80
	}
dvander@229
    81
dvander@229
    82
	g_HandleSys.RemoveType(m_IfaceType, GetIdentRoot());
dvander@229
    83
	g_HandleSys.RemoveType(m_TypeRoot, GetIdentRoot());
dvander@229
    84
}
dvander@229
    85
dvander@229
    86
IdentityType_t ShareSystem::FindIdentType(const char *name)
dvander@229
    87
{
dvander@229
    88
	HandleType_t type;
dvander@229
    89
dvander@229
    90
	if (g_HandleSys.FindHandleType(name, &type))
dvander@229
    91
	{
dvander@229
    92
		if (g_HandleSys.TypeCheck(type, m_TypeRoot))
dvander@229
    93
		{
dvander@229
    94
			return type;
dvander@229
    95
		}
dvander@229
    96
	}
dvander@229
    97
dvander@229
    98
	return 0;
dvander@229
    99
}
dvander@229
   100
dvander@229
   101
IdentityType_t ShareSystem::CreateIdentType(const char *name)
dvander@229
   102
{
dvander@229
   103
	if (!m_TypeRoot)
dvander@229
   104
	{
dvander@229
   105
		return 0;
dvander@229
   106
	}
dvander@229
   107
dvander@262
   108
	return g_HandleSys.CreateType(name, this, m_TypeRoot, NULL, NULL, GetIdentRoot(), NULL);
dvander@229
   109
}
dvander@229
   110
dvander@229
   111
void ShareSystem::OnHandleDestroy(HandleType_t type, void *object)
dvander@229
   112
{
dvander@283
   113
	/* THIS WILL NEVER BE CALLED FOR ANYTHING WITH THE IDENTITY TYPE */
dvander@229
   114
}
dvander@229
   115
dvander@868
   116
IdentityToken_t *ShareSystem::CreateIdentity(IdentityType_t type, void *ptr)
dvander@229
   117
{
dvander@229
   118
	if (!m_TypeRoot)
dvander@229
   119
	{
dvander@229
   120
		return 0;
dvander@229
   121
	}
dvander@229
   122
dvander@229
   123
	/* :TODO: Cache? */
dvander@229
   124
	IdentityToken_t *pToken = new IdentityToken_t;
dvander@528
   125
dvander@528
   126
	HandleSecurity sec;
dvander@528
   127
	sec.pOwner = sec.pIdentity = GetIdentRoot();
dvander@528
   128
dvander@528
   129
	pToken->ident = g_HandleSys.CreateHandleInt(type, NULL, &sec, NULL, NULL, true);
dvander@868
   130
	pToken->ptr = ptr;
dvander@868
   131
	pToken->type = type;
dvander@229
   132
dvander@229
   133
	return pToken;
dvander@229
   134
}
dvander@229
   135
dvander@304
   136
bool ShareSystem::AddInterface(IExtension *myself, SMInterface *iface)
dvander@229
   137
{
dvander@229
   138
	if (!iface)
dvander@229
   139
	{
dvander@229
   140
		return false;
dvander@229
   141
	}
dvander@229
   142
dvander@229
   143
	IfaceInfo info;
dvander@229
   144
dvander@304
   145
	info.owner = myself;
dvander@229
   146
	info.iface = iface;
dvander@229
   147
	
dvander@229
   148
	m_Interfaces.push_back(info);
dvander@229
   149
dvander@229
   150
	return true;
dvander@229
   151
}
dvander@229
   152
dvander@229
   153
bool ShareSystem::RequestInterface(const char *iface_name, 
dvander@229
   154
								   unsigned int iface_vers, 
dvander@311
   155
								   IExtension *myself, 
dvander@229
   156
								   SMInterface **pIface)
dvander@229
   157
{
dvander@229
   158
	/* See if the interface exists */
dvander@229
   159
	List<IfaceInfo>::iterator iter;
dvander@229
   160
	SMInterface *iface;
dvander@304
   161
	IExtension *iface_owner;
dvander@229
   162
	bool found = false;
dvander@229
   163
	for (iter=m_Interfaces.begin(); iter!=m_Interfaces.end(); iter++)
dvander@229
   164
	{
dvander@229
   165
		IfaceInfo &info = (*iter);
dvander@229
   166
		iface = info.iface;
dvander@229
   167
		if (strcmp(iface->GetInterfaceName(), iface_name) == 0)
dvander@229
   168
		{
dvander@229
   169
			if (iface->GetInterfaceVersion() == iface_vers
dvander@229
   170
				|| iface->IsVersionCompatible(iface_vers))
dvander@229
   171
			{
dvander@304
   172
				iface_owner = info.owner;
dvander@229
   173
				found = true;
dvander@229
   174
				break;
dvander@229
   175
			}
dvander@229
   176
		}
dvander@229
   177
	}
dvander@229
   178
dvander@229
   179
	if (!found)
dvander@229
   180
	{
dvander@229
   181
		return false;
dvander@229
   182
	}
dvander@229
   183
dvander@304
   184
	/* Add a dependency node */
dvander@229
   185
	if (iface_owner)
dvander@229
   186
	{
dvander@304
   187
		IfaceInfo info;
dvander@304
   188
		info.iface = iface;
dvander@304
   189
		info.owner = iface_owner;
dvander@311
   190
		g_Extensions.BindDependency(myself, &info);
dvander@229
   191
	}
dvander@229
   192
dvander@304
   193
	if (pIface)
dvander@304
   194
	{
dvander@304
   195
		*pIface = iface;
dvander@304
   196
	}
dvander@229
   197
dvander@304
   198
	return true;
dvander@229
   199
}
dvander@229
   200
dvander@312
   201
void ShareSystem::AddNatives(IExtension *myself, const sp_nativeinfo_t *natives)
dvander@229
   202
{
dvander@315
   203
	g_Extensions.AddNatives(myself, natives);
dvander@229
   204
}
dvander@229
   205
dvander@229
   206
void ShareSystem::DestroyIdentity(IdentityToken_t *identity)
dvander@229
   207
{
dvander@262
   208
	HandleSecurity sec;
dvander@262
   209
dvander@262
   210
	sec.pOwner = GetIdentRoot();
dvander@262
   211
	sec.pIdentity = GetIdentRoot();
dvander@262
   212
dvander@262
   213
	g_HandleSys.FreeHandle(identity->ident, &sec);
dvander@229
   214
	delete identity;
dvander@229
   215
}
dvander@229
   216
dvander@229
   217
void ShareSystem::DestroyIdentType(IdentityType_t type)
dvander@229
   218
{
dvander@229
   219
	g_HandleSys.RemoveType(type, GetIdentRoot());
dvander@229
   220
}
dvander@229
   221
dvander@304
   222
void ShareSystem::RemoveInterfaces(IExtension *pExtension)
dvander@304
   223
{
dvander@304
   224
	List<IfaceInfo>::iterator iter = m_Interfaces.begin();
dvander@304
   225
dvander@304
   226
	while (iter != m_Interfaces.end())
dvander@304
   227
	{
dvander@304
   228
		if ((*iter).owner == pExtension)
dvander@304
   229
		{
dvander@304
   230
			iter = m_Interfaces.erase(iter);
dvander@304
   231
		} else {
dvander@304
   232
			iter++;
dvander@304
   233
		}
dvander@304
   234
	}
dvander@304
   235
}
dvander@324
   236
dvander@324
   237
void ShareSystem::AddDependency(IExtension *myself, const char *filename, bool require, bool autoload)
dvander@324
   238
{
dvander@324
   239
	g_Extensions.AddDependency(myself, filename, require, autoload);
dvander@324
   240
}
dvander@324
   241
dvander@1572
   242
void ShareSystem::RegisterLibrary(IExtension *myself, const char *name)
dvander@1572
   243
{
dvander@1572
   244
	g_Extensions.AddLibrary(myself, name);
dvander@1572
   245
}
dvander@1689
   246
dvander@1689
   247
void ShareSystem::OverrideNatives(IExtension *myself, const sp_nativeinfo_t *natives)
dvander@1689
   248
{
dvander@1689
   249
	g_Extensions.OverrideNatives(myself, natives);
dvander@1689
   250
}