diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs index 6ba00686e4..7d7f90432e 100644 --- a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs @@ -25,15 +25,18 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +using System; using OpenMetaverse; namespace OpenSim.Region.Framework.Interfaces { - public interface IScriptModule + public interface IScriptModule : IRegionModule { string ScriptEngineName { get; } string GetAssemblyName(UUID itemID); string GetXMLState(UUID itemID); + + bool PostScriptEvent(UUID itemID, string name, Object[] args); } } diff --git a/OpenSim/Region/Framework/Interfaces/IXmlRpcRouter.cs b/OpenSim/Region/Framework/Interfaces/IXmlRpcRouter.cs new file mode 100644 index 0000000000..c38319a7a6 --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/IXmlRpcRouter.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 OpenMetaverse; + +namespace OpenSim.Region.Framework.Interfaces +{ + public interface IXmlRpcRouter + { + void RegisterNewReceiver(IScriptModule scriptEngine, UUID channelID, UUID objectID, UUID itemID, string url); + void ScriptRemoved(UUID itemID); + void ObjectRemoved(UUID objectID); + } +} diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs index b850227d0c..34a7c7adfa 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs @@ -96,6 +96,11 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine get { return "ScriptEngine.DotNetEngine"; } } + public IScriptModule ScriptModule + { + get { return this; } + } + public event ScriptRemoved OnScriptRemoved; public event ObjectRemoved OnObjectRemoved; @@ -212,6 +217,11 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine p.EventName, p.DetectParams, p.Params); } + public bool PostScriptEvent(UUID itemID, string name, Object[] p) + { + return PostScriptEvent(itemID, new EventParams(name, p, new DetectParams[0])); + } + public DetectParams GetDetectParams(UUID itemID, int number) { uint localID = m_ScriptManager.GetLocalID(itemID); diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptEngine.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptEngine.cs index 8da46f4cd9..fd352cf6e2 100644 --- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptEngine.cs +++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptEngine.cs @@ -29,6 +29,7 @@ using log4net; using System; using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.Framework.Scenes; +using OpenSim.Region.Framework.Interfaces; using OpenMetaverse; using Nini.Config; using OpenSim.Region.ScriptEngine.Interfaces; @@ -54,6 +55,8 @@ namespace OpenSim.Region.ScriptEngine.Interfaces Scene World { get; } + IScriptModule ScriptModule { get; } + event ScriptRemoved OnScriptRemoved; event ObjectRemoved OnObjectRemoved; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index d3543add6e..f4e7990ef2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -6108,6 +6108,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (xmlrpcMod.IsEnabled()) { UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_localID, m_itemID, UUID.Zero); + IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface(); + if (xmlRpcRouter != null) + xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID, m_itemID, "http://"+System.Environment.MachineName+":"+xmlrpcMod.Port.ToString()+"/"); object[] resobj = new object[] { new LSL_Integer(1), new LSL_String(channelID.ToString()), new LSL_String(UUID.Zero.ToString()), new LSL_String(String.Empty), new LSL_Integer(0), new LSL_String(String.Empty) }; m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( "remote_data", resobj, diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 357ee32881..a78dad6837 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -78,6 +78,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine #pragma warning disable 414 private EventManager m_EventManager; #pragma warning restore 414 + private IXmlRpcRouter m_XmlRpcRouter; private int m_EventLimit; private bool m_KillTimedOutScripts; @@ -130,6 +131,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine get { return m_ScriptEngines; } } + public IScriptModule ScriptModule + { + get { return this; } + } + // private struct RezScriptParms // { // uint LocalID; @@ -222,6 +228,13 @@ namespace OpenSim.Region.ScriptEngine.XEngine m_MaxScriptQueue, m_StackSize); m_Scene.StackModuleInterface(this); + + m_XmlRpcRouter = m_Scene.RequestModuleInterface(); + if (m_XmlRpcRouter != null) + { + OnScriptRemoved += m_XmlRpcRouter.ScriptRemoved; + OnObjectRemoved += m_XmlRpcRouter.ObjectRemoved; + } } public void PostInitialise() @@ -917,6 +930,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine return false; } + public bool PostScriptEvent(UUID itemID, string name, Object[] p) + { + return PostScriptEvent(itemID, new EventParams(name, p, new DetectParams[0])); + } + public Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) {