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