core/systems/ShareSys.cpp
author David Anderson <dvander@alliedmods.net>
Wed Jan 17 18:22:00 2007 +0000 (2007-01-17)
changeset 309 51e67f50830e
parent 305 59ef1afbe958
child 311 31192ed0fe13
permissions -rw-r--r--
Finished porting the "plugins" command to the new menu system
     1 #include "ShareSys.h"
     2 #include "HandleSys.h"
     3 #include "ExtensionSys.h"
     4 
     5 ShareSystem g_ShareSys;
     6 
     7 ShareSystem::ShareSystem()
     8 {
     9 	m_IdentRoot.ident = 0;
    10 	m_TypeRoot = 0;
    11 	m_IfaceType = 0;
    12 	m_CoreType = 0;
    13 }
    14 
    15 IdentityToken_t *ShareSystem::CreateCoreIdentity()
    16 {
    17 	if (!m_CoreType)
    18 	{
    19 		m_CoreType = CreateIdentType("CORE");
    20 	}
    21 
    22 	return CreateIdentity(m_CoreType);
    23 }
    24 
    25 void ShareSystem::OnSourceModStartup(bool late)
    26 {
    27 	TypeAccess sec;
    28 
    29 	g_HandleSys.InitAccessDefaults(&sec, NULL);
    30 	sec.ident = GetIdentRoot();
    31 
    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);
    34 
    35 	/* Initialize our static identity handle */
    36 	m_IdentRoot.ident = g_HandleSys.CreateHandle(m_TypeRoot, NULL, NULL, GetIdentRoot(), NULL);
    37 
    38 	/* Add the Handle System... it's too innocent and pure to do it itself */
    39 	AddInterface(NULL, &g_HandleSys);
    40 }
    41 
    42 void ShareSystem::OnSourceModShutdown()
    43 {
    44 	if (m_CoreType)
    45 	{
    46 		g_HandleSys.RemoveType(m_CoreType, GetIdentRoot());
    47 	}
    48 
    49 	g_HandleSys.RemoveType(m_IfaceType, GetIdentRoot());
    50 	g_HandleSys.RemoveType(m_TypeRoot, GetIdentRoot());
    51 }
    52 
    53 IdentityType_t ShareSystem::FindIdentType(const char *name)
    54 {
    55 	HandleType_t type;
    56 
    57 	if (g_HandleSys.FindHandleType(name, &type))
    58 	{
    59 		if (g_HandleSys.TypeCheck(type, m_TypeRoot))
    60 		{
    61 			return type;
    62 		}
    63 	}
    64 
    65 	return 0;
    66 }
    67 
    68 IdentityType_t ShareSystem::CreateIdentType(const char *name)
    69 {
    70 	if (!m_TypeRoot)
    71 	{
    72 		return 0;
    73 	}
    74 
    75 	return g_HandleSys.CreateType(name, this, m_TypeRoot, NULL, NULL, GetIdentRoot(), NULL);
    76 }
    77 
    78 void ShareSystem::OnHandleDestroy(HandleType_t type, void *object)
    79 {
    80 	/* THIS WILL NEVER BE CALLED FOR ANYTHING WITH THE IDENTITY TYPE */
    81 }
    82 
    83 IdentityToken_t *ShareSystem::CreateIdentity(IdentityType_t type)
    84 {
    85 	if (!m_TypeRoot)
    86 	{
    87 		return 0;
    88 	}
    89 
    90 	/* :TODO: Cache? */
    91 	IdentityToken_t *pToken = new IdentityToken_t;
    92 	pToken->ident = g_HandleSys.CreateHandleEx(type, NULL, GetIdentRoot(), GetIdentRoot(), NULL, true);
    93 
    94 	return pToken;
    95 }
    96 
    97 bool ShareSystem::AddInterface(IExtension *myself, SMInterface *iface)
    98 {
    99 	if (!iface)
   100 	{
   101 		return false;
   102 	}
   103 
   104 	IfaceInfo info;
   105 
   106 	info.owner = myself;
   107 	info.iface = iface;
   108 	
   109 	m_Interfaces.push_back(info);
   110 
   111 	return true;
   112 }
   113 
   114 bool ShareSystem::RequestInterface(const char *iface_name, 
   115 								   unsigned int iface_vers, 
   116 								   IExtension *mysql, 
   117 								   SMInterface **pIface)
   118 {
   119 	/* See if the interface exists */
   120 	List<IfaceInfo>::iterator iter;
   121 	SMInterface *iface;
   122 	IExtension *iface_owner;
   123 	bool found = false;
   124 	for (iter=m_Interfaces.begin(); iter!=m_Interfaces.end(); iter++)
   125 	{
   126 		IfaceInfo &info = (*iter);
   127 		iface = info.iface;
   128 		if (strcmp(iface->GetInterfaceName(), iface_name) == 0)
   129 		{
   130 			if (iface->GetInterfaceVersion() == iface_vers
   131 				|| iface->IsVersionCompatible(iface_vers))
   132 			{
   133 				iface_owner = info.owner;
   134 				found = true;
   135 				break;
   136 			}
   137 		}
   138 	}
   139 
   140 	if (!found)
   141 	{
   142 		return false;
   143 	}
   144 
   145 	/* Add a dependency node */
   146 	if (iface_owner)
   147 	{
   148 		IfaceInfo info;
   149 		info.iface = iface;
   150 		info.owner = iface_owner;
   151 		g_Extensions.BindDependency(iface_owner, &info);
   152 	}
   153 
   154 	if (pIface)
   155 	{
   156 		*pIface = iface;
   157 	}
   158 
   159 	return true;
   160 }
   161 
   162 void ShareSystem::AddNatives(IdentityToken_t *token, const sp_nativeinfo_t *natives[])
   163 {
   164 	/* :TODO: implement */
   165 }
   166 
   167 void ShareSystem::DestroyIdentity(IdentityToken_t *identity)
   168 {
   169 	HandleSecurity sec;
   170 
   171 	sec.pOwner = GetIdentRoot();
   172 	sec.pIdentity = GetIdentRoot();
   173 
   174 	g_HandleSys.FreeHandle(identity->ident, &sec);
   175 	delete identity;
   176 }
   177 
   178 void ShareSystem::DestroyIdentType(IdentityType_t type)
   179 {
   180 	g_HandleSys.RemoveType(type, GetIdentRoot());
   181 }
   182 
   183 void ShareSystem::RemoveInterfaces(IExtension *pExtension)
   184 {
   185 	List<IfaceInfo>::iterator iter = m_Interfaces.begin();
   186 
   187 	while (iter != m_Interfaces.end())
   188 	{
   189 		if ((*iter).owner == pExtension)
   190 		{
   191 			iter = m_Interfaces.erase(iter);
   192 		} else {
   193 			iter++;
   194 		}
   195 	}
   196 }