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... --- .../Framework/Interfaces/INonSharedRegionModule.cs | 35 ++++++++++ .../Framework/Interfaces/IRegionModuleBase.cs | 76 ++++++++++++++++++++++ .../Interfaces/IRegionModulesController.cs | 38 +++++++++++ .../Framework/Interfaces/ISharedRegionModule.cs | 40 ++++++++++++ OpenSim/Region/Framework/Scenes/SceneBase.cs | 65 ++++++++++++++++-- 5 files changed, 247 insertions(+), 7 deletions(-) create mode 100644 OpenSim/Region/Framework/Interfaces/INonSharedRegionModule.cs create mode 100644 OpenSim/Region/Framework/Interfaces/IRegionModuleBase.cs create mode 100644 OpenSim/Region/Framework/Interfaces/IRegionModulesController.cs create mode 100644 OpenSim/Region/Framework/Interfaces/ISharedRegionModule.cs (limited to 'OpenSim/Region/Framework') diff --git a/OpenSim/Region/Framework/Interfaces/INonSharedRegionModule.cs b/OpenSim/Region/Framework/Interfaces/INonSharedRegionModule.cs new file mode 100644 index 0000000..b8af866 --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/INonSharedRegionModule.cs @@ -0,0 +1,35 @@ +/* + * 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; + +namespace OpenSim.Region.Framework.Interfaces +{ + public interface INonSharedRegionModule : IRegionModuleBase + { + } +} diff --git a/OpenSim/Region/Framework/Interfaces/IRegionModuleBase.cs b/OpenSim/Region/Framework/Interfaces/IRegionModuleBase.cs new file mode 100644 index 0000000..265b464 --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/IRegionModuleBase.cs @@ -0,0 +1,76 @@ +/* + * 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 Mono.Addins; +using Nini.Config; +using OpenSim.Region.Framework.Scenes; + +namespace OpenSim.Region.Framework.Interfaces +{ + public interface IRegionModuleBase + { + /// + /// The name of the module + /// + string Name { get; } + + /// + /// This is called to initialize the region module. For shared modules, this is called + /// exactly once, after creating the single (shared) instance. For non-shared modules, + /// this is called once on each instance, after the instace for the region has been created. + /// + /// + /// A + /// + void Initialise(IConfigSource source); + + /// + /// This is the inverse to . After a Close(), this instance won't be usable anymore. + /// + void Close(); + + /// + /// This is called whenever a is added. For shared modules, this can happen several times. + /// For non-shared modules, this happens exactly once, after has been called. + /// + /// + /// A + /// + void AddRegion(Scene scene); + + /// + /// This is called whenever a is removed. For shared modules, this can happen several times. + /// For non-shared modules, this happens exactly once, if the scene this instance is associated with is removed. + /// + /// + /// A + /// + void RemoveRegion(Scene scene); + } + +} diff --git a/OpenSim/Region/Framework/Interfaces/IRegionModulesController.cs b/OpenSim/Region/Framework/Interfaces/IRegionModulesController.cs new file mode 100644 index 0000000..d38c962 --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/IRegionModulesController.cs @@ -0,0 +1,38 @@ +/* + * 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 OpenSim.Region.Framework.Scenes; + +namespace OpenSim.Region.Framework.Interfaces +{ + public interface IRegionModulesController + { + void AddRegionToModules(Scene scene); + void RemoveRegionFromModules (Scene scene); + } +} diff --git a/OpenSim/Region/Framework/Interfaces/ISharedRegionModule.cs b/OpenSim/Region/Framework/Interfaces/ISharedRegionModule.cs new file mode 100644 index 0000000..d0b6ecc --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/ISharedRegionModule.cs @@ -0,0 +1,40 @@ +/* + * 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; + +namespace OpenSim.Region.Framework.Interfaces +{ + public interface ISharedRegionModule : IRegionModuleBase + { + /// + /// This is called exactly once after all the shared region-modules have been instanciated and + /// d. + /// + void PostInitialise(); + } +} diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs index 3695b21..42f3d97 100644 --- a/OpenSim/Region/Framework/Scenes/SceneBase.cs +++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs @@ -59,13 +59,19 @@ namespace OpenSim.Region.Framework.Scenes } protected Dictionary m_modules = new Dictionary(); + public Dictionary RegionModules + { + get { return m_regionModules; } + } + private Dictionary m_regionModules = new Dictionary(); + /// /// The module interfaces available from this scene. /// protected Dictionary> ModuleInterfaces = new Dictionary>(); protected Dictionary ModuleAPIMethods = new Dictionary(); - + /// /// The module commanders available from this scene /// @@ -235,7 +241,7 @@ namespace OpenSim.Region.Framework.Scenes } } Modules.Clear(); - + try { EventManager.TriggerShutdown(); @@ -279,6 +285,24 @@ namespace OpenSim.Region.Framework.Scenes } /// + /// Add a region-module to this scene. TODO: This will replace AddModule in the future. + /// + /// + /// + public void AddRegionModule(string name, IRegionModuleBase module) + { + if (!RegionModules.ContainsKey(name)) + { + RegionModules.Add(name, module); + } + } + + public void RemoveRegionModule(string name) + { + RegionModules.Remove(name); + } + + /// /// Register a module commander. /// /// @@ -368,6 +392,25 @@ namespace OpenSim.Region.Framework.Scenes } } + public void UnregisterModuleInterface(M mod) + { + List l; + if (ModuleInterfaces.TryGetValue(typeof(M), out l)) + { + if (l.Remove(mod)) + { + if (mod is IEntityCreator) + { + IEntityCreator entityCreator = (IEntityCreator)mod; + foreach (PCode pcode in entityCreator.CreationCapabilities) + { + m_entityCreators[pcode] = null; + } + } + } + } + } + public void StackModuleInterface(M mod) { List l; @@ -462,11 +505,19 @@ namespace OpenSim.Region.Framework.Scenes if (mod != null) { - if (!(mod is IRegionModule)) - throw new Exception("AddCommand module parameter must be IRegionModule"); - IRegionModule module = (IRegionModule)mod; - modulename = module.Name; - shared = module.IsSharedModule; + if (mod is IRegionModule) + { + IRegionModule module = (IRegionModule)mod; + modulename = module.Name; + shared = module.IsSharedModule; + } + else if (mod is IRegionModuleBase) + { + IRegionModuleBase module = (IRegionModuleBase)mod; + modulename = module.Name; + shared = mod is ISharedRegionModule; + } + else throw new Exception("AddCommand module parameter must be IRegionModule or IRegionModuleBase"); } MainConsole.Instance.Commands.AddCommand(modulename, shared, command, shorthelp, longhelp, callback); -- cgit v1.1