From 648452dd91e07be4ec0e81793807e86bd48362c4 Mon Sep 17 00:00:00 2001 From: Homer Horwitz Date: Sun, 5 Apr 2009 17:08:11 +0000 Subject: - Add new RegionModulesControllerPlugin to the application modules - Change several classes to use the new plugin for handling of region-modules (NOTE: No regionmodule is using this yet) - Add necessary prebuild parts (don't forget to runprebuild) Attention: Work in progress. This shouldn't break anything, but you never know... --- .../RegionModulesControllerPlugin.cs | 192 +++++++++++++++++++++ .../RegionModulesControllerPlugin.addin.xml | 13 ++ 2 files changed, 205 insertions(+) create mode 100644 OpenSim/ApplicationPlugins/RegionModulesController/RegionModulesControllerPlugin.cs create mode 100644 OpenSim/ApplicationPlugins/RegionModulesController/Resources/RegionModulesControllerPlugin.addin.xml (limited to 'OpenSim/ApplicationPlugins') diff --git a/OpenSim/ApplicationPlugins/RegionModulesController/RegionModulesControllerPlugin.cs b/OpenSim/ApplicationPlugins/RegionModulesController/RegionModulesControllerPlugin.cs new file mode 100644 index 0000000..7dc4a74 --- /dev/null +++ b/OpenSim/ApplicationPlugins/RegionModulesController/RegionModulesControllerPlugin.cs @@ -0,0 +1,192 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Reflection; +using log4net; +using Mono.Addins; +using OpenSim; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; + +namespace OpenSim.ApplicationPlugins.RegionModulesController +{ + public class RegionModulesControllerPlugin : IRegionModulesController, IApplicationPlugin + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private OpenSimBase m_openSim; // for getting the config + + private string m_name; + + private List m_nonSharedModules = new List(); + private List m_sharedModules = new List(); + + private List m_sharedInstances = new List(); + +#region IApplicationPlugin implementation + + public void Initialise (OpenSimBase openSim) + { + m_log.DebugFormat("[REGIONMODULES]: Initializing..."); + m_openSim = openSim; + openSim.ApplicationRegistry.RegisterInterface(this); + + string id = AddinManager.CurrentAddin.Id; + int pos = id.LastIndexOf("."); + if (pos == -1) m_name = id; + else m_name = id.Substring(pos + 1); + + ExtensionNodeList list = AddinManager.GetExtensionNodes("/OpenSim/RegionModules"); + m_log.DebugFormat("[XXX] list: {0}", list.Count); + // load all the (new) region-module classes + foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes("/OpenSim/RegionModules")) + { + m_log.DebugFormat("[REGIONMODULES]: Found node {0}", node.Id); + // TODO why does node.Type.isSubclassOf(typeof(ISharedRegionModule)) not work? + if (node.Type.GetInterface(typeof(ISharedRegionModule).ToString()) != null) + { + m_log.DebugFormat("[REGIONMODULES]: Found shared region module {0}, class {1}", node.Id, node.Type); + m_sharedModules.Add(node.Type); + } + else if (node.Type.GetInterface(typeof(INonSharedRegionModule).ToString()) != null) + { + m_log.DebugFormat("[REGIONMODULES]: Found non-shared region module {0}, class {1}", node.Id, node.Type); + m_nonSharedModules.Add(node.Type); + } + else + m_log.DebugFormat("[REGIONMODULES]: Found unknown type of module {0}, class {1}", node.Id, node.Type); + } + + // now we've got all the region-module classes loaded, create one instance of every ISharedRegionModule, + // initialize and postinitialize it. This Initialise we are in is called before LoadRegion.PostInitialise + // is called (which loads the regions), so we don't have any regions in the server yet. + foreach (Type type in m_sharedModules) + { + ISharedRegionModule module = (ISharedRegionModule)Activator.CreateInstance(type); + m_sharedInstances.Add(module); + module.Initialise(openSim.ConfigSource.Source); + } + + foreach (ISharedRegionModule module in m_sharedInstances) + { + module.PostInitialise(); + } + } + + public void PostInitialise () + { + } + +#endregion + +#region IPlugin implementation + + public void Initialise () + { + throw new System.NotImplementedException(); + } + +#endregion + +#region IDisposable implementation + + public void Dispose () + { + // we expect that all regions have been removed already + while (m_sharedInstances.Count > 0) + { + m_sharedInstances[0].Close(); + m_sharedInstances.RemoveAt(0); + } + m_sharedModules.Clear(); + m_nonSharedModules.Clear(); + } + +#endregion + + + public string Version + { + get + { + return AddinManager.CurrentAddin.Version; + } + } + + public string Name + { + get + { + return m_name; + } + } + +#region IRegionModulesController implementation + + public void AddRegionToModules (Scene scene) + { + foreach (ISharedRegionModule module in m_sharedInstances) + { + m_log.DebugFormat("[REGIONMODULE]: Adding scene {0} to shared module {1}", + scene.RegionInfo.RegionName, module.Name); + module.AddRegion(scene); + scene.AddRegionModule(module.Name, module); + } + + foreach (Type type in m_nonSharedModules) + { + INonSharedRegionModule module = (INonSharedRegionModule)Activator.CreateInstance(type); + m_log.DebugFormat("[REGIONMODULE]: Adding scene {0} to non-shared module {1}", + scene.RegionInfo.RegionName, module.Name); + module.Initialise(m_openSim.ConfigSource.Source); + module.AddRegion(scene); + scene.AddRegionModule(module.Name, module); + } + } + + public void RemoveRegionFromModules (Scene scene) + { + foreach (IRegionModuleBase module in scene.RegionModules.Values) + { + m_log.DebugFormat("[REGIONMODULE]: Removing scene {0} from module {1}", + scene.RegionInfo.RegionName, module.Name); + module.RemoveRegion(scene); + if (module is INonSharedRegionModule) + { + // as we were the only user, this instance has to die + module.Close(); + } + } + scene.RegionModules.Clear(); + } + +#endregion + + } +} diff --git a/OpenSim/ApplicationPlugins/RegionModulesController/Resources/RegionModulesControllerPlugin.addin.xml b/OpenSim/ApplicationPlugins/RegionModulesController/Resources/RegionModulesControllerPlugin.addin.xml new file mode 100644 index 0000000..a92713b --- /dev/null +++ b/OpenSim/ApplicationPlugins/RegionModulesController/Resources/RegionModulesControllerPlugin.addin.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + -- cgit v1.1