core/systems/ExtensionSys.cpp
changeset 305 59ef1afbe958
parent 304 fa485d2f25ed
child 310 1efceafbda26
     1.1 --- a/core/systems/ExtensionSys.cpp	Wed Jan 17 03:01:38 2007 +0000
     1.2 +++ b/core/systems/ExtensionSys.cpp	Wed Jan 17 06:48:11 2007 +0000
     1.3 @@ -3,6 +3,7 @@
     1.4  #include "ShareSys.h"
     1.5  #include "CLogger.h"
     1.6  #include "sourcemm_api.h"
     1.7 +#include "PluginSys.h"
     1.8  
     1.9  CExtensionManager g_Extensions;
    1.10  IdentityType_t g_ExtType;
    1.11 @@ -94,6 +95,16 @@
    1.12  	}
    1.13  }
    1.14  
    1.15 +void CExtension::AddPlugin(IPlugin *pPlugin)
    1.16 +{
    1.17 +	m_Plugins.push_back(pPlugin);
    1.18 +}
    1.19 +
    1.20 +void CExtension::RemovePlugin(IPlugin *pPlugin)
    1.21 +{
    1.22 +	m_Plugins.remove(pPlugin);
    1.23 +}
    1.24 +
    1.25  void CExtension::SetError(const char *error)
    1.26  {
    1.27  	m_Error.assign(error);
    1.28 @@ -197,10 +208,12 @@
    1.29  void CExtensionManager::OnSourceModAllInitialized()
    1.30  {
    1.31  	g_ExtType = g_ShareSys.CreateIdentType("EXTENSION");
    1.32 +	g_PluginSys.AddPluginsListener(this);
    1.33  }
    1.34  
    1.35  void CExtensionManager::OnSourceModShutdown()
    1.36  {
    1.37 +	g_PluginSys.RemovePluginsListener(this);
    1.38  	g_ShareSys.DestroyIdentType(g_ExtType);
    1.39  }
    1.40  
    1.41 @@ -217,7 +230,7 @@
    1.42  
    1.43  	if (!p->IsLoaded())
    1.44  	{
    1.45 -		g_Logger.LogError("[SOURCEMOD] Unable to load extension \"%s\": %s", path, error);
    1.46 +		g_Logger.LogError("[SM] Unable to load extension \"%s\": %s", path, error);
    1.47  		p->SetError(error);
    1.48  	}
    1.49  
    1.50 @@ -316,6 +329,23 @@
    1.51  	pExt->AddInterface(pInterface);
    1.52  }
    1.53  
    1.54 +void CExtensionManager::BindChildPlugin(IExtension *pParent, IPlugin *pPlugin)
    1.55 +{
    1.56 +	CExtension *pExt = (CExtension *)pParent;
    1.57 +
    1.58 +	pExt->AddPlugin(pPlugin);
    1.59 +}
    1.60 +
    1.61 +void CExtensionManager::OnPluginDestroyed(IPlugin *plugin)
    1.62 +{
    1.63 +	List<CExtension *>::iterator iter;
    1.64 +
    1.65 +	for (iter=m_Libs.begin(); iter!=m_Libs.end(); iter++)
    1.66 +	{
    1.67 +		(*iter)->RemovePlugin(plugin);
    1.68 +	}
    1.69 +}
    1.70 +
    1.71  bool CExtensionManager::UnloadExtension(IExtension *_pExt)
    1.72  {
    1.73  	if (!_pExt)
    1.74 @@ -339,6 +369,15 @@
    1.75  	/* Handle dependencies */
    1.76  	if (pExt->IsLoaded())
    1.77  	{
    1.78 +		/* Unload any dependent plugins */
    1.79 +		List<IPlugin *>::iterator p_iter = pExt->m_Plugins.begin();
    1.80 +		while (p_iter != pExt->m_Plugins.end())
    1.81 +		{
    1.82 +			g_PluginSys.UnloadPlugin((*p_iter));
    1.83 +			/* It should already have been removed! */
    1.84 +			assert(pExt->m_Plugins.find((*p_iter)) != pExt->m_Plugins.end());
    1.85 +		}
    1.86 +
    1.87  		/* Notify and/or unload all dependencies */
    1.88  		List<CExtension *>::iterator c_iter;
    1.89  		CExtension *pDep;