3 * ===============================================================
4 * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
5 * ===============================================================
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
16 #include "HandleSys.h"
17 #include "ExtensionSys.h"
18 #include "LibrarySys.h"
20 ShareSystem g_ShareSys;
22 ShareSystem::ShareSystem()
24 m_IdentRoot.ident = 0;
30 IdentityToken_t *ShareSystem::CreateCoreIdentity()
34 m_CoreType = CreateIdentType("CORE");
37 return CreateIdentity(m_CoreType, this);
40 void ShareSystem::OnSourceModStartup(bool late)
44 g_HandleSys.InitAccessDefaults(&sec, NULL);
45 sec.ident = GetIdentRoot();
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);
50 /* Initialize our static identity handle */
51 m_IdentRoot.ident = g_HandleSys.CreateHandle(m_TypeRoot, NULL, NULL, GetIdentRoot(), NULL);
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);
58 void ShareSystem::OnSourceModShutdown()
62 g_HandleSys.RemoveType(m_CoreType, GetIdentRoot());
65 g_HandleSys.RemoveType(m_IfaceType, GetIdentRoot());
66 g_HandleSys.RemoveType(m_TypeRoot, GetIdentRoot());
69 IdentityType_t ShareSystem::FindIdentType(const char *name)
73 if (g_HandleSys.FindHandleType(name, &type))
75 if (g_HandleSys.TypeCheck(type, m_TypeRoot))
84 IdentityType_t ShareSystem::CreateIdentType(const char *name)
91 return g_HandleSys.CreateType(name, this, m_TypeRoot, NULL, NULL, GetIdentRoot(), NULL);
94 void ShareSystem::OnHandleDestroy(HandleType_t type, void *object)
96 /* THIS WILL NEVER BE CALLED FOR ANYTHING WITH THE IDENTITY TYPE */
99 IdentityToken_t *ShareSystem::CreateIdentity(IdentityType_t type, void *ptr)
107 IdentityToken_t *pToken = new IdentityToken_t;
110 sec.pOwner = sec.pIdentity = GetIdentRoot();
112 pToken->ident = g_HandleSys.CreateHandleInt(type, NULL, &sec, NULL, NULL, true);
119 bool ShareSystem::AddInterface(IExtension *myself, SMInterface *iface)
131 m_Interfaces.push_back(info);
136 bool ShareSystem::RequestInterface(const char *iface_name,
137 unsigned int iface_vers,
139 SMInterface **pIface)
141 /* See if the interface exists */
142 List<IfaceInfo>::iterator iter;
144 IExtension *iface_owner;
146 for (iter=m_Interfaces.begin(); iter!=m_Interfaces.end(); iter++)
148 IfaceInfo &info = (*iter);
150 if (strcmp(iface->GetInterfaceName(), iface_name) == 0)
152 if (iface->GetInterfaceVersion() == iface_vers
153 || iface->IsVersionCompatible(iface_vers))
155 iface_owner = info.owner;
167 /* Add a dependency node */
172 info.owner = iface_owner;
173 g_Extensions.BindDependency(myself, &info);
184 void ShareSystem::AddNatives(IExtension *myself, const sp_nativeinfo_t *natives)
186 g_Extensions.AddNatives(myself, natives);
189 void ShareSystem::DestroyIdentity(IdentityToken_t *identity)
193 sec.pOwner = GetIdentRoot();
194 sec.pIdentity = GetIdentRoot();
196 g_HandleSys.FreeHandle(identity->ident, &sec);
200 void ShareSystem::DestroyIdentType(IdentityType_t type)
202 g_HandleSys.RemoveType(type, GetIdentRoot());
205 void ShareSystem::RemoveInterfaces(IExtension *pExtension)
207 List<IfaceInfo>::iterator iter = m_Interfaces.begin();
209 while (iter != m_Interfaces.end())
211 if ((*iter).owner == pExtension)
213 iter = m_Interfaces.erase(iter);
220 void ShareSystem::AddDependency(IExtension *myself, const char *filename, bool require, bool autoload)
222 g_Extensions.AddDependency(myself, filename, require, autoload);