diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/ExtensionHandler.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/ExtensionHandler.cs new file mode 100644 index 0000000000..bc159eb31e --- /dev/null +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/ExtensionHandler.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Text; +using OpenSim.Region.OptionalModules.Scripting.Minimodule.Interfaces; + +namespace OpenSim.Region.OptionalModules.Scripting.Minimodule +{ + class ExtensionHandler : IExtension + { + private readonly Dictionary m_instances; + + public ExtensionHandler(Dictionary instances) + { + m_instances = instances; + } + + public T Get() + { + return (T) m_instances[typeof (T)]; + } + + public bool TryGet(out T extension) + { + if (!m_instances.ContainsKey(typeof(T))) + { + extension = default(T); + return false; + } + + extension = Get(); + return true; + } + + public bool Has() + { + return m_instances.ContainsKey(typeof (T)); + } + } +} diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Host.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Host.cs index b7f67dd2ec..94796e411c 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Host.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Host.cs @@ -28,6 +28,7 @@ using System.Reflection; using log4net; using OpenSim.Region.Framework.Scenes; +using OpenSim.Region.OptionalModules.Scripting.Minimodule.Interfaces; namespace OpenSim.Region.OptionalModules.Scripting.Minimodule { @@ -36,11 +37,13 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule private readonly IObject m_obj; private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private readonly IGraphics m_graphics; + private readonly IExtension m_extend; //private Scene m_scene; - public Host(IObject m_obj, Scene m_scene) + public Host(IObject m_obj, Scene m_scene, IExtension m_extend) { this.m_obj = m_obj; + this.m_extend = m_extend; //this.m_scene = m_scene; m_graphics = new Graphics(m_scene); @@ -60,5 +63,10 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule { get { return m_graphics; } } + + public IExtension Extensions + { + get { return m_extend; } + } } } diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/IMRMModule.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IMRMModule.cs new file mode 100644 index 0000000000..4c37a44df1 --- /dev/null +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IMRMModule.cs @@ -0,0 +1,7 @@ +namespace OpenSim.Region.OptionalModules.Scripting.Minimodule +{ + public interface IMRMModule + { + void RegisterExtension(T instance); + } +} \ No newline at end of file diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IExtension.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IExtension.cs new file mode 100644 index 0000000000..b58e600895 --- /dev/null +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IExtension.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Region.OptionalModules.Scripting.Minimodule.Interfaces +{ + public interface IExtension + { + T Get(); + bool TryGet(out T extension); + bool Has(); + } +} diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IHost.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IHost.cs index 6c7691925e..fd73ffd9cf 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IHost.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IHost.cs @@ -29,6 +29,7 @@ using System; using System.Collections.Generic; using System.Text; using log4net; +using OpenSim.Region.OptionalModules.Scripting.Minimodule.Interfaces; namespace OpenSim.Region.OptionalModules.Scripting.Minimodule { @@ -37,5 +38,6 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule IObject Object { get; } ILog Console { get; } IGraphics Graphics { get; } + IExtension Extensions { get; } } } diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs index 0572fc7e76..b0fe22212d 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs @@ -41,15 +41,22 @@ using OpenSim.Region.Framework.Scenes; namespace OpenSim.Region.OptionalModules.Scripting.Minimodule { - public class MRMModule : IRegionModule + public class MRMModule : IRegionModule, IMRMModule { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private Scene m_scene; private readonly Dictionary m_scripts = new Dictionary(); + private readonly Dictionary m_extensions = new Dictionary(); + private static readonly CSharpCodeProvider CScodeProvider = new CSharpCodeProvider(); + public void RegisterExtension(T instance) + { + m_extensions[typeof (T)] = instance; + } + public void Initialise(Scene scene, IConfigSource source) { if (source.Configs["MRM"] != null) @@ -59,6 +66,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule m_log.Info("[MRM] Enabling MRM Module"); m_scene = scene; scene.EventManager.OnRezScript += EventManager_OnRezScript; + + scene.RegisterModuleInterface(this); } else { @@ -82,7 +91,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule { m_log.Info("[MRM] Found C# MRM"); IWorld m_world = new World(m_scene); - IHost m_host = new Host(new SOPObject(m_scene, localID), m_scene); + IHost m_host = new Host(new SOPObject(m_scene, localID), m_scene, new ExtensionHandler(m_extensions)); MRMBase mmb = (MRMBase)AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap( CompileFromDotNetText(script, itemID.ToString()),