Complete the work on the Replaceable interface logic. From this commit onwards
the mere presence of a full version of a replaceable module will cause the replaceable module in core to be deactivated.arthursv
parent
72b6e7f949
commit
c73ee1d06e
|
@ -149,21 +149,68 @@ namespace OpenSim.ApplicationPlugins.RegionModulesController
|
||||||
|
|
||||||
public void AddRegionToModules (Scene scene)
|
public void AddRegionToModules (Scene scene)
|
||||||
{
|
{
|
||||||
|
Dictionary<Type, ISharedRegionModule> deferredSharedModules =
|
||||||
|
new Dictionary<Type, ISharedRegionModule>();
|
||||||
|
Dictionary<Type, INonSharedRegionModule> deferredNonSharedModules =
|
||||||
|
new Dictionary<Type, INonSharedRegionModule>();
|
||||||
|
|
||||||
|
Type s = scene.GetType();
|
||||||
|
MethodInfo mi = s.GetMethod("RequestModuleInterface");
|
||||||
|
|
||||||
|
List<ISharedRegionModule> sharedlist = new List<ISharedRegionModule>();
|
||||||
foreach (ISharedRegionModule module in m_sharedInstances)
|
foreach (ISharedRegionModule module in m_sharedInstances)
|
||||||
{
|
{
|
||||||
|
Type replaceableInterface = module.ReplacableInterface;
|
||||||
|
if (replaceableInterface != null)
|
||||||
|
{
|
||||||
|
MethodInfo mii = mi.MakeGenericMethod(replaceableInterface);
|
||||||
|
|
||||||
|
if (mii.Invoke(scene, new object[0]) != null)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[REGIONMODULE]: Not loading {0} because another module has registered {1}", module.Name, replaceableInterface.ToString());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
deferredSharedModules[replaceableInterface] = module;
|
||||||
|
m_log.DebugFormat("[REGIONMODULE]: Deferred load of {0}", module.Name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
m_log.DebugFormat("[REGIONMODULE]: Adding scene {0} to shared module {1}",
|
m_log.DebugFormat("[REGIONMODULE]: Adding scene {0} to shared module {1}",
|
||||||
scene.RegionInfo.RegionName, module.Name);
|
scene.RegionInfo.RegionName, module.Name);
|
||||||
|
|
||||||
module.AddRegion(scene);
|
module.AddRegion(scene);
|
||||||
scene.AddRegionModule(module.Name, module);
|
scene.AddRegionModule(module.Name, module);
|
||||||
|
|
||||||
|
sharedlist.Add(module);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<INonSharedRegionModule> list = new List<INonSharedRegionModule>();
|
List<INonSharedRegionModule> list = new List<INonSharedRegionModule>();
|
||||||
foreach (Type type in m_nonSharedModules)
|
foreach (Type type in m_nonSharedModules)
|
||||||
{
|
{
|
||||||
INonSharedRegionModule module = (INonSharedRegionModule)Activator.CreateInstance(type);
|
INonSharedRegionModule module = (INonSharedRegionModule)Activator.CreateInstance(type);
|
||||||
|
|
||||||
|
Type replaceableInterface = module.ReplacableInterface;
|
||||||
|
if (replaceableInterface != null)
|
||||||
|
{
|
||||||
|
MethodInfo mii = mi.MakeGenericMethod(replaceableInterface);
|
||||||
|
|
||||||
|
if (mii.Invoke(scene, new object[0]) != null)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[REGIONMODULE]: Not loading {0} because another module has registered {1}", module.Name, replaceableInterface.ToString());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
deferredNonSharedModules[replaceableInterface] = module;
|
||||||
|
m_log.DebugFormat("[REGIONMODULE]: Deferred load of {0}", module.Name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
m_log.DebugFormat("[REGIONMODULE]: Adding scene {0} to non-shared module {1}",
|
m_log.DebugFormat("[REGIONMODULE]: Adding scene {0} to non-shared module {1}",
|
||||||
scene.RegionInfo.RegionName, module.Name);
|
scene.RegionInfo.RegionName, module.Name);
|
||||||
|
|
||||||
module.Initialise(m_openSim.ConfigSource.Source);
|
module.Initialise(m_openSim.ConfigSource.Source);
|
||||||
|
|
||||||
list.Add(module);
|
list.Add(module);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,6 +220,60 @@ namespace OpenSim.ApplicationPlugins.RegionModulesController
|
||||||
scene.AddRegionModule(module.Name, module);
|
scene.AddRegionModule(module.Name, module);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Now all modules without a replaceable base interface are loaded
|
||||||
|
// Replaceable modules have either been skipped, or omitted.
|
||||||
|
// Now scan the deferred modules here
|
||||||
|
|
||||||
|
foreach (ISharedRegionModule module in deferredSharedModules.Values)
|
||||||
|
{
|
||||||
|
Type replaceableInterface = module.ReplacableInterface;
|
||||||
|
MethodInfo mii = mi.MakeGenericMethod(replaceableInterface);
|
||||||
|
|
||||||
|
if (mii.Invoke(scene, new object[0]) != null)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[REGIONMODULE]: Not loading {0} because another module has registered {1}", module.Name, replaceableInterface.ToString());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_log.DebugFormat("[REGIONMODULE]: Adding scene {0} to shared module {1} (deferred)",
|
||||||
|
scene.RegionInfo.RegionName, module.Name);
|
||||||
|
|
||||||
|
module.AddRegion(scene);
|
||||||
|
scene.AddRegionModule(module.Name, module);
|
||||||
|
|
||||||
|
sharedlist.Add(module);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<INonSharedRegionModule> deferredlist = new List<INonSharedRegionModule>();
|
||||||
|
foreach (INonSharedRegionModule module in deferredNonSharedModules.Values)
|
||||||
|
{
|
||||||
|
Type replaceableInterface = module.ReplacableInterface;
|
||||||
|
if (replaceableInterface != null)
|
||||||
|
{
|
||||||
|
MethodInfo mii = mi.MakeGenericMethod(replaceableInterface);
|
||||||
|
|
||||||
|
if (mii.Invoke(scene, new object[0]) != null)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[REGIONMODULE]: Not loading {0} because another module has registered {1}", module.Name, replaceableInterface.ToString());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_log.DebugFormat("[REGIONMODULE]: Adding scene {0} to non-shared module {1} (deferred)",
|
||||||
|
scene.RegionInfo.RegionName, module.Name);
|
||||||
|
|
||||||
|
module.Initialise(m_openSim.ConfigSource.Source);
|
||||||
|
|
||||||
|
list.Add(module);
|
||||||
|
deferredlist.Add(module);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (INonSharedRegionModule module in deferredlist)
|
||||||
|
{
|
||||||
|
module.AddRegion(scene);
|
||||||
|
scene.AddRegionModule(module.Name, module);
|
||||||
|
}
|
||||||
|
|
||||||
// This is needed for all module types. Modules will register
|
// This is needed for all module types. Modules will register
|
||||||
// Interfaces with scene in AddScene, and will also need a means
|
// Interfaces with scene in AddScene, and will also need a means
|
||||||
// to access interfaces registered by other modules. Without
|
// to access interfaces registered by other modules. Without
|
||||||
|
@ -183,7 +284,7 @@ namespace OpenSim.ApplicationPlugins.RegionModulesController
|
||||||
// and unneccessary caching logic repeated in all modules.
|
// and unneccessary caching logic repeated in all modules.
|
||||||
// The extra function stub is just that much cleaner
|
// The extra function stub is just that much cleaner
|
||||||
//
|
//
|
||||||
foreach (ISharedRegionModule module in m_sharedInstances)
|
foreach (ISharedRegionModule module in sharedlist)
|
||||||
{
|
{
|
||||||
module.RegionLoaded(scene);
|
module.RegionLoaded(scene);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue