From f9721573d956092c2d993ee41654f3f5e160401c Mon Sep 17 00:00:00 2001 From: SignpostMarv Date: Fri, 14 Sep 2012 13:17:07 +0100 Subject: [PATCH 1/2] Implementing ability to register script constants and invocations on a region module automatically --- .../Interfaces/IScriptModuleComms.cs | 23 ++++++++++++++ .../ScriptModuleCommsModule.cs | 31 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs b/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs index dae7c00207..277c9ed618 100644 --- a/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs +++ b/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs @@ -74,6 +74,14 @@ namespace OpenSim.Region.Framework.Interfaces /// void RegisterScriptInvocation(Type target, string[] methods); + /// + /// Automatically register script invocations by checking for methods + /// with . Should only check + /// public methods. + /// + /// + void RegisterScriptInvocations(IRegionModuleBase target); + /// /// Returns an array of all registered script calls /// @@ -98,9 +106,24 @@ namespace OpenSim.Region.Framework.Interfaces /// For constants void RegisterConstant(string cname, object value); + + /// + /// Automatically register all constants on a region module by + /// checking for fields with . + /// + /// + void RegisterConstants(IRegionModuleBase target); object LookupModConstant(string cname); // For use ONLY by the script API void RaiseEvent(UUID script, string id, string module, string command, string key); } + + [AttributeUsage(AttributeTargets.Method)] + public class ScriptInvocationAttribute : Attribute + { } + + [AttributeUsage(AttributeTargets.Field)] + public class ScriptConstantAttribute : Attribute + { } } diff --git a/OpenSim/Region/OptionalModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs b/OpenSim/Region/OptionalModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs index 23cc633bfc..98396ff803 100644 --- a/OpenSim/Region/OptionalModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs @@ -211,6 +211,23 @@ namespace OpenSim.Region.OptionalModules.Scripting.ScriptModuleComms RegisterScriptInvocation(target, mi); } } + + public void RegisterScriptInvocations(IRegionModuleBase target) + { + foreach(MethodInfo method in target.GetType().GetMethods( + BindingFlags.Public | BindingFlags.Instance | + BindingFlags.Static)) + { + if(method.GetCustomAttributes( + typeof(ScriptInvocationAttribute), true).Any()) + { + if(method.IsStatic) + RegisterScriptInvocation(target.GetType(), method); + else + RegisterScriptInvocation(target, method); + } + } + } public Delegate[] GetScriptInvocationList() { @@ -313,6 +330,20 @@ namespace OpenSim.Region.OptionalModules.Scripting.ScriptModuleComms } } + public void RegisterConstants(IRegionModuleBase target) + { + foreach (FieldInfo field in target.GetType().GetFields( + BindingFlags.Public | BindingFlags.Static | + BindingFlags.Instance)) + { + if (field.GetCustomAttributes( + typeof(ScriptConstantAttribute), true).Any()) + { + RegisterConstant(field.Name, field.GetValue(target)); + } + } + } + /// /// Operation to check for a registered constant /// From 0e5f5538bcaa031ae252468e5c0b70e5dce1a9b1 Mon Sep 17 00:00:00 2001 From: SignpostMarv Date: Fri, 14 Sep 2012 13:20:14 +0100 Subject: [PATCH 2/2] Documentation of IScriptModuleComms.RegisterConstant and IScriptModuleComms.LookupModConstant Signed-off-by: Melanie --- .../Interfaces/IScriptModuleComms.cs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs b/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs index 277c9ed618..93930ce43b 100644 --- a/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs +++ b/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs @@ -104,7 +104,18 @@ namespace OpenSim.Region.Framework.Interfaces /// void DispatchReply(UUID scriptId, int code, string text, string key); - /// For constants + /// + /// Operation to for a region module to register a constant to be used + /// by the script engine + /// + /// + /// The name of the constant. LSL convention is for constant names to + /// be uppercase. + /// + /// + /// The value of the constant. Should be of a type that can be + /// converted to one of + /// void RegisterConstant(string cname, object value); /// @@ -113,6 +124,12 @@ namespace OpenSim.Region.Framework.Interfaces /// /// void RegisterConstants(IRegionModuleBase target); + + /// + /// Operation to check for a registered constant + /// + /// Name of constant + /// Value of constant or null if none found. object LookupModConstant(string cname); // For use ONLY by the script API