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;