From 9511a8c76370f21e839114007dcd2b25c69b009a Mon Sep 17 00:00:00 2001 From: Tedd Hansen Date: Sat, 8 Nov 2008 17:35:48 +0000 Subject: Work in progress on SECS stuff. Have been holding it off until after 0.6 release. Still messy as hell and doesn't really work yet. Will undergo dramatic changes. AND MOST IMPORTANTLY: Will be conformed to work in coop with todays DNE and XEngine, hopefully one day providing a common interface for all components. --- OpenSim/ScriptEngine/Shared/EventParams.cs | 47 +++++++++ .../ScriptEngine/Shared/IScriptCommandProvider.cs | 10 ++ OpenSim/ScriptEngine/Shared/IScriptCompiler.cs | 40 ++++++++ OpenSim/ScriptEngine/Shared/IScriptEngine.cs | 49 +++++++++ .../ScriptEngine/Shared/IScriptEngineComponent.cs | 36 +++++++ .../Shared/IScriptEngineRegionComponent.cs | 7 ++ .../ScriptEngine/Shared/IScriptEventProvider.cs | 11 +++ OpenSim/ScriptEngine/Shared/IScriptExecutor.cs | 39 ++++++++ OpenSim/ScriptEngine/Shared/IScriptLoader.cs | 9 ++ OpenSim/ScriptEngine/Shared/IScriptScheduler.cs | 41 ++++++++ .../ScriptEngine/Shared/Properties/AssemblyInfo.cs | 36 +++++++ OpenSim/ScriptEngine/Shared/RegionInfoStructure.cs | 94 ++++++++++++++++++ OpenSim/ScriptEngine/Shared/ScriptMetaData.cs | 95 ++++++++++++++++++ OpenSim/ScriptEngine/Shared/ScriptStructure.cs | 109 +++++++++++++++++++++ 14 files changed, 623 insertions(+) create mode 100644 OpenSim/ScriptEngine/Shared/EventParams.cs create mode 100644 OpenSim/ScriptEngine/Shared/IScriptCommandProvider.cs create mode 100644 OpenSim/ScriptEngine/Shared/IScriptCompiler.cs create mode 100644 OpenSim/ScriptEngine/Shared/IScriptEngine.cs create mode 100644 OpenSim/ScriptEngine/Shared/IScriptEngineComponent.cs create mode 100644 OpenSim/ScriptEngine/Shared/IScriptEngineRegionComponent.cs create mode 100644 OpenSim/ScriptEngine/Shared/IScriptEventProvider.cs create mode 100644 OpenSim/ScriptEngine/Shared/IScriptExecutor.cs create mode 100644 OpenSim/ScriptEngine/Shared/IScriptLoader.cs create mode 100644 OpenSim/ScriptEngine/Shared/IScriptScheduler.cs create mode 100644 OpenSim/ScriptEngine/Shared/Properties/AssemblyInfo.cs create mode 100644 OpenSim/ScriptEngine/Shared/RegionInfoStructure.cs create mode 100644 OpenSim/ScriptEngine/Shared/ScriptMetaData.cs create mode 100644 OpenSim/ScriptEngine/Shared/ScriptStructure.cs (limited to 'OpenSim/ScriptEngine/Shared') diff --git a/OpenSim/ScriptEngine/Shared/EventParams.cs b/OpenSim/ScriptEngine/Shared/EventParams.cs new file mode 100644 index 0000000..661086e --- /dev/null +++ b/OpenSim/ScriptEngine/Shared/EventParams.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Text; +using OpenMetaverse; +using OpenSim.Region.ScriptEngine.Shared; + +namespace OpenSim.ScriptEngine.Shared +{ + /// + /// Holds all the data required to execute a scripting event. + /// + public class EventParams + { + public string EventName; + public Object[] Params; + public Region.ScriptEngine.Shared.DetectParams[] DetectParams; + public uint LocalID; + public UUID ItemID; + + public EventParams(uint localID, UUID itemID, string eventName, Object[] eventParams, DetectParams[] detectParams) + { + LocalID = localID; + ItemID = itemID; + EventName = eventName; + Params = eventParams; + DetectParams = detectParams; + } + public EventParams(uint localID, string eventName, Object[] eventParams, DetectParams[] detectParams) + { + LocalID = localID; + EventName = eventName; + Params = eventParams; + DetectParams = detectParams; + } + public void test(params object[] args) + { + string functionName = "test"; + test2(functionName, args); + } + public void test2(string functionName, params object[] args) + { + System.Console.WriteLine(functionName, args); + } + + + } +} \ No newline at end of file diff --git a/OpenSim/ScriptEngine/Shared/IScriptCommandProvider.cs b/OpenSim/ScriptEngine/Shared/IScriptCommandProvider.cs new file mode 100644 index 0000000..f37fcaf --- /dev/null +++ b/OpenSim/ScriptEngine/Shared/IScriptCommandProvider.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.ScriptEngine.Shared +{ + public interface IScriptCommandProvider : ScriptAssemblies.ICommandProvider + { + } +} diff --git a/OpenSim/ScriptEngine/Shared/IScriptCompiler.cs b/OpenSim/ScriptEngine/Shared/IScriptCompiler.cs new file mode 100644 index 0000000..3bc0c03 --- /dev/null +++ b/OpenSim/ScriptEngine/Shared/IScriptCompiler.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; +using System.Collections.Generic; +using System.Reflection; +using System.Text; +using ScriptAssemblies; + +namespace OpenSim.ScriptEngine.Shared +{ + public interface IScriptCompiler : IScriptEngineComponent + { + string Compile(ScriptMetaData scriptMetaData, ref string script); + string PreProcessScript(ref string script); + } +} \ No newline at end of file diff --git a/OpenSim/ScriptEngine/Shared/IScriptEngine.cs b/OpenSim/ScriptEngine/Shared/IScriptEngine.cs new file mode 100644 index 0000000..6148d8d --- /dev/null +++ b/OpenSim/ScriptEngine/Shared/IScriptEngine.cs @@ -0,0 +1,49 @@ +/* + * 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.Text; +using Nini.Config; +using OpenSim.Region.Environment.Interfaces; +using OpenSim.Region.Environment.Scenes; + +namespace OpenSim.ScriptEngine.Shared +{ + public interface IScriptEngine + { + //string[] ComponentNames { get; } + //Dictionary Components { get; } + //void InitializeComponents(); + void Initialise(Scene scene, IConfigSource source); + void PostInitialise(); + void Close(); + string Name { get; } + // string Name { get; } + //void Initialize(); + //void Close(); + } +} \ No newline at end of file diff --git a/OpenSim/ScriptEngine/Shared/IScriptEngineComponent.cs b/OpenSim/ScriptEngine/Shared/IScriptEngineComponent.cs new file mode 100644 index 0000000..3c977a5 --- /dev/null +++ b/OpenSim/ScriptEngine/Shared/IScriptEngineComponent.cs @@ -0,0 +1,36 @@ +/* + * 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.Text; + +namespace OpenSim.ScriptEngine.Shared +{ + public interface IScriptEngineComponent + { + } +} \ No newline at end of file diff --git a/OpenSim/ScriptEngine/Shared/IScriptEngineRegionComponent.cs b/OpenSim/ScriptEngine/Shared/IScriptEngineRegionComponent.cs new file mode 100644 index 0000000..a8d779d --- /dev/null +++ b/OpenSim/ScriptEngine/Shared/IScriptEngineRegionComponent.cs @@ -0,0 +1,7 @@ +namespace OpenSim.ScriptEngine.Shared +{ + public interface IScriptEngineRegionComponent + { + void Initialize(RegionInfoStructure currentRegion); + } +} diff --git a/OpenSim/ScriptEngine/Shared/IScriptEventProvider.cs b/OpenSim/ScriptEngine/Shared/IScriptEventProvider.cs new file mode 100644 index 0000000..a290ba4 --- /dev/null +++ b/OpenSim/ScriptEngine/Shared/IScriptEventProvider.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.ScriptEngine.Shared +{ + public interface IScriptEventProvider : IScriptEngineComponent, IScriptEngineRegionComponent + { + + } +} \ No newline at end of file diff --git a/OpenSim/ScriptEngine/Shared/IScriptExecutor.cs b/OpenSim/ScriptEngine/Shared/IScriptExecutor.cs new file mode 100644 index 0000000..77bea13 --- /dev/null +++ b/OpenSim/ScriptEngine/Shared/IScriptExecutor.cs @@ -0,0 +1,39 @@ +/* + * 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.Text; +using OpenSim.ScriptEngine.Shared; + +namespace OpenSim.ScriptEngine.Shared +{ + public interface IScriptExecutor : IScriptEngineComponent, IScriptEngineRegionComponent + { + void ExecuteCommand(ref ScriptStructure scriptContainer, EventParams p); + void ExecuteCommand(EventParams p); + } +} \ No newline at end of file diff --git a/OpenSim/ScriptEngine/Shared/IScriptLoader.cs b/OpenSim/ScriptEngine/Shared/IScriptLoader.cs new file mode 100644 index 0000000..15f7443 --- /dev/null +++ b/OpenSim/ScriptEngine/Shared/IScriptLoader.cs @@ -0,0 +1,9 @@ +using OpenSim.ScriptEngine.Shared; + +namespace OpenSim.ScriptEngine.Shared +{ + public interface IScriptLoader: IScriptEngineComponent + { + ScriptAssemblies.IScript LoadScript(ScriptStructure script); + } +} \ No newline at end of file diff --git a/OpenSim/ScriptEngine/Shared/IScriptScheduler.cs b/OpenSim/ScriptEngine/Shared/IScriptScheduler.cs new file mode 100644 index 0000000..3e56c12 --- /dev/null +++ b/OpenSim/ScriptEngine/Shared/IScriptScheduler.cs @@ -0,0 +1,41 @@ +/* + * 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.Text; +using OpenMetaverse; +using OpenSim.ScriptEngine.Shared; + +namespace OpenSim.ScriptEngine.Shared +{ + public interface IScriptScheduler : IScriptEngineComponent + { + void AddScript(ScriptStructure script); + void Removecript(uint id, UUID itemID); + void Close(); + } +} \ No newline at end of file diff --git a/OpenSim/ScriptEngine/Shared/Properties/AssemblyInfo.cs b/OpenSim/ScriptEngine/Shared/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..06a3461 --- /dev/null +++ b/OpenSim/ScriptEngine/Shared/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OpenSim.ScriptEngine.Shared")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("OpenSim.ScriptEngine.Shared")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2008")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("ea77002b-c967-4368-ace9-6533f8147d4b")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/ScriptEngine/Shared/RegionInfoStructure.cs b/OpenSim/ScriptEngine/Shared/RegionInfoStructure.cs new file mode 100644 index 0000000..834fac3 --- /dev/null +++ b/OpenSim/ScriptEngine/Shared/RegionInfoStructure.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using log4net; +using Nini.Config; +using OpenSim.Region.Environment.Scenes; +using OpenSim.Region.ScriptEngine.Shared; +using OpenSim.ScriptEngine.Shared; +using EventParams=OpenSim.ScriptEngine.Shared.EventParams; + +namespace OpenSim.ScriptEngine.Shared +{ + public struct RegionInfoStructure + { + public Scene Scene; + public IConfigSource ConfigSource; + + public IScriptLoader ScriptLoader; + public Dictionary EventProviders; + public Dictionary Executors; + public Dictionary Compilers; + public Dictionary Schedulers; + public Dictionary CommandProviders; + public ILog Logger; + + public void Executors_Execute(EventParams p) + { + // Execute a command on all executors + lock (Executors) + { + foreach (IScriptExecutor exec in Executors.Values) + { + exec.ExecuteCommand(p); + } + } + } + public void Executors_Execute(ScriptStructure scriptContainer, EventParams p) + { + // Execute a command on all executors + lock (Executors) + { + foreach (IScriptExecutor exec in Executors.Values) + { + exec.ExecuteCommand(ref scriptContainer, p); + } + } + } + + public IScriptCompiler FindCompiler(ScriptMetaData scriptMetaData) + { + string compiler = "Compiler_LSL"; + if (scriptMetaData.ContainsKey("Compiler")) + compiler = scriptMetaData["Compiler"]; + + lock (Compilers) + { + if (!Compilers.ContainsKey(compiler)) + throw new Exception("Requested script compiler \"" + compiler + "\" does not exist."); + + return Compilers[compiler]; + } + } + + public IScriptScheduler FindScheduler(ScriptMetaData scriptMetaData) + { + string scheduler = "Scheduler"; + if (scriptMetaData.ContainsKey("Scheduler")) + scheduler = scriptMetaData["Scheduler"]; + + lock (Schedulers) + { + if (!Schedulers.ContainsKey(scheduler)) + throw new Exception("Requested script scheduler \"" + scheduler + "\" does not exist."); + + return Schedulers[scheduler]; + } + } + + //public Assembly[] GetCommandProviderAssemblies() + //{ + // lock (CommandProviders) + // { + // Assembly[] ass = new Assembly[CommandProviders.Count]; + // int i = 0; + // foreach (string key in CommandProviders.Keys) + // { + // ass[i] = CommandProviders[key].GetType().Assembly; + // i++; + // } + // return ass; + // } + //} + } +} \ No newline at end of file diff --git a/OpenSim/ScriptEngine/Shared/ScriptMetaData.cs b/OpenSim/ScriptEngine/Shared/ScriptMetaData.cs new file mode 100644 index 0000000..462f2d4 --- /dev/null +++ b/OpenSim/ScriptEngine/Shared/ScriptMetaData.cs @@ -0,0 +1,95 @@ +/* + * 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; + +namespace OpenSim.ScriptEngine.Shared +{ + public class ScriptMetaData: Dictionary + { + private static readonly char[] LineSeparator = "\r\n".ToCharArray(); + private static readonly char[] Separator = { ':' }; + public static ScriptMetaData Extract(ref string Script) + { + ScriptMetaData ret = new ScriptMetaData(); + if (string.IsNullOrEmpty(Script)) + return ret; + + // Process it line by line + string Line = ""; + for (int i = 0; i < Script.Length + 1; i++) + { + // Found a line separator? + if (i < Script.Length + && Script[i] != LineSeparator[0] + && Script[i] != LineSeparator[1]) + { + // No, not end of line. Add to current line + Line += Script[i]; + } + else + { + // Extract MetaData from this line. Returns False if not found. + if (!_GetMetaFromLine(ret, Line)) + continue; + // Empty for next round + Line = ""; + } + } + return ret; + } + + private static bool _GetMetaFromLine(ScriptMetaData ret, string line) + { + line = line.Trim(); + + // Empty line? We may find more later + if (line == "") + return true; + + // Is this a comment? If not, then return false + if (!line.StartsWith("//")) + return false; + + // It is a comment + string[] keyval = line.Split(Separator, 2, StringSplitOptions.None); + keyval[0] = keyval[0].Substring(2, keyval[0].Length - 2).Trim(); + keyval[1] = keyval[1].Trim(); + + // Add it + if (keyval[0] != "") + if (!ret.ContainsKey(keyval[0])) + { + //m_log.DebugFormat("[DotNetEngine] Script metadata: Key: \"{0}\", Value: \"{1}\".", keyval[0], keyval[1]); + ret.Add(keyval[0], keyval[1]); + } + + return true; + } + + } +} \ No newline at end of file diff --git a/OpenSim/ScriptEngine/Shared/ScriptStructure.cs b/OpenSim/ScriptEngine/Shared/ScriptStructure.cs new file mode 100644 index 0000000..cbf333b --- /dev/null +++ b/OpenSim/ScriptEngine/Shared/ScriptStructure.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; +using OpenMetaverse; +using OpenSim.Region.ScriptEngine.Interfaces; +using OpenSim.Region.ScriptEngine.Shared.ScriptBase; +using OpenSim.ScriptEngine.Shared; + +namespace OpenSim.ScriptEngine.Shared +{ + public struct ScriptStructure + { + public RegionInfoStructure RegionInfo; + public ScriptMetaData ScriptMetaData; + + public ScriptAssemblies.IScript ScriptObject; + public string State; + public bool Running; + public bool Disabled; + public string Source; + public int StartParam; + public AppDomain AppDomain; + public Dictionary Apis; + public Dictionary, KeyValuePair> LineMap; + public uint LocalID; + public UUID ItemID; + public string AssemblyFileName; + + public string ScriptID { get { return LocalID.ToString() + "." + ItemID.ToString(); } } + public string Name { get { return "Script:" + ScriptID; } } + private bool Initialized; + private Dictionary InternalFunctions; + public string AssemblyName; + + public void ExecuteEvent(EventParams p) + { + ExecuteMethod(p, true); + } + + public void ExecuteMethod(EventParams p) + { + ExecuteMethod(p, false); + } + private void ExecuteMethod(EventParams p, bool isEvent) + { + // First time initialization? + if (!Initialized) + { + Initialized = true; + CacheInternalFunctions(); + } + + lock (InternalFunctions) + { + // Make function name + string FunctionName; + if (isEvent) + FunctionName = State + "_event_" + p.EventName; + else + FunctionName = p.EventName; + + // Check if this function exist + if (!InternalFunctions.ContainsKey(FunctionName)) + { + // TODO: Send message in-world + //RegionInfo.Scene. + RegionInfo.Logger.ErrorFormat("[{0}] Script function \"{1}\" was not found.", Name, FunctionName); + return; + } + + // Execute script function + try + { + InternalFunctions[FunctionName].DynamicInvoke(p.Params); + } + catch (Exception e) + { + RegionInfo.Logger.ErrorFormat("[{0}] Execute \"{1}\" failed: {2}", Name, FunctionName, e.ToString()); + } + } + } + + /// + /// Cache functions into a dictionary with delegates. Should be faster than reflection. + /// + private void CacheInternalFunctions() + { + Type scriptObjectType = ScriptObject.GetType(); + InternalFunctions = new Dictionary(); + + MethodInfo[] methods = scriptObjectType.GetMethods(); + lock (InternalFunctions) + { + // Read all methods into a dictionary + foreach (MethodInfo mi in methods) + { + // TODO: We don't support overloading + if (!InternalFunctions.ContainsKey(mi.Name)) + InternalFunctions.Add(mi.Name, Delegate.CreateDelegate(scriptObjectType, ScriptObject, mi)); + else + RegionInfo.Logger.ErrorFormat("[{0}] Error: Script function \"{1}\" is already added. We do not support overloading.", + Name, mi.Name); + } + } + } + + } +} \ No newline at end of file -- cgit v1.1