3 #include "ExtensionSys.h"
5 ShareSystem g_ShareSys;
7 ShareSystem::ShareSystem()
15 IdentityToken_t *ShareSystem::CreateCoreIdentity()
19 m_CoreType = CreateIdentType("CORE");
22 return CreateIdentity(m_CoreType);
25 void ShareSystem::OnSourceModStartup(bool late)
29 g_HandleSys.InitAccessDefaults(&sec, NULL);
30 sec.ident = GetIdentRoot();
32 m_TypeRoot = g_HandleSys.CreateType("Identity", this, 0, &sec, NULL, NULL, NULL);
33 m_IfaceType = g_HandleSys.CreateType("Interface", this, 0, NULL, NULL, GetIdentRoot(), NULL);
35 /* Initialize our static identity handle */
36 m_IdentRoot.ident = g_HandleSys.CreateHandle(m_TypeRoot, NULL, NULL, GetIdentRoot(), NULL);
38 /* Add the Handle System... it's too innocent and pure to do it itself */
39 AddInterface(NULL, &g_HandleSys);
42 void ShareSystem::OnSourceModShutdown()
46 g_HandleSys.RemoveType(m_CoreType, GetIdentRoot());
49 g_HandleSys.RemoveType(m_IfaceType, GetIdentRoot());
50 g_HandleSys.RemoveType(m_TypeRoot, GetIdentRoot());
53 IdentityType_t ShareSystem::FindIdentType(const char *name)
57 if (g_HandleSys.FindHandleType(name, &type))
59 if (g_HandleSys.TypeCheck(type, m_TypeRoot))
68 IdentityType_t ShareSystem::CreateIdentType(const char *name)
75 return g_HandleSys.CreateType(name, this, m_TypeRoot, NULL, NULL, GetIdentRoot(), NULL);
78 void ShareSystem::OnHandleDestroy(HandleType_t type, void *object)
80 /* THIS WILL NEVER BE CALLED FOR ANYTHING WITH THE IDENTITY TYPE */
83 IdentityToken_t *ShareSystem::CreateIdentity(IdentityType_t type)
91 IdentityToken_t *pToken = new IdentityToken_t;
92 pToken->ident = g_HandleSys.CreateHandleEx(type, NULL, GetIdentRoot(), GetIdentRoot(), NULL, true);
97 bool ShareSystem::AddInterface(IExtension *myself, SMInterface *iface)
109 m_Interfaces.push_back(info);
114 bool ShareSystem::RequestInterface(const char *iface_name,
115 unsigned int iface_vers,
117 SMInterface **pIface)
119 /* See if the interface exists */
120 List<IfaceInfo>::iterator iter;
122 IExtension *iface_owner;
124 for (iter=m_Interfaces.begin(); iter!=m_Interfaces.end(); iter++)
126 IfaceInfo &info = (*iter);
128 if (strcmp(iface->GetInterfaceName(), iface_name) == 0)
130 if (iface->GetInterfaceVersion() == iface_vers
131 || iface->IsVersionCompatible(iface_vers))
133 iface_owner = info.owner;
145 /* Add a dependency node */
150 info.owner = iface_owner;
151 g_Extensions.BindDependency(iface_owner, &info);
162 void ShareSystem::AddNatives(IdentityToken_t *token, const sp_nativeinfo_t *natives[])
164 /* :TODO: implement */
167 void ShareSystem::DestroyIdentity(IdentityToken_t *identity)
171 sec.pOwner = GetIdentRoot();
172 sec.pIdentity = GetIdentRoot();
174 g_HandleSys.FreeHandle(identity->ident, &sec);
178 void ShareSystem::DestroyIdentType(IdentityType_t type)
180 g_HandleSys.RemoveType(type, GetIdentRoot());
183 void ShareSystem::RemoveInterfaces(IExtension *pExtension)
185 List<IfaceInfo>::iterator iter = m_Interfaces.begin();
187 while (iter != m_Interfaces.end())
189 if ((*iter).owner == pExtension)
191 iter = m_Interfaces.erase(iter);