Merge branch 'master' of ssh://opensimulator.org/var/git/opensim
commit
0548eeb571
|
@ -31,6 +31,7 @@ using OpenMetaverse;
|
||||||
namespace OpenSim.Region.Framework.Interfaces
|
namespace OpenSim.Region.Framework.Interfaces
|
||||||
{
|
{
|
||||||
public delegate void ScriptCommand(UUID script, string id, string module, string command, string k);
|
public delegate void ScriptCommand(UUID script, string id, string module, string command, string k);
|
||||||
|
public delegate object ScriptInvocation(UUID script, object[] parms);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interface for communication between OpenSim modules and in-world scripts
|
/// Interface for communication between OpenSim modules and in-world scripts
|
||||||
|
@ -45,6 +46,15 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event ScriptCommand OnScriptCommand;
|
event ScriptCommand OnScriptCommand;
|
||||||
|
|
||||||
|
void RegisterScriptInvocation(string name, ScriptInvocation fn, Type[] csig, Type rsig);
|
||||||
|
|
||||||
|
ScriptInvocation LookupScriptInvocation(string fname);
|
||||||
|
string LookupModInvocation(string fname);
|
||||||
|
Type[] LookupTypeSignature(string fname);
|
||||||
|
Type LookupReturnType(string fname);
|
||||||
|
|
||||||
|
object InvokeOperation(UUID scriptId, string fname, params object[] parms);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Send a link_message event to an in-world script
|
/// Send a link_message event to an in-world script
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Collections.Generic;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using log4net;
|
using log4net;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
|
@ -35,7 +36,7 @@ using OpenSim.Region.Framework.Scenes;
|
||||||
using Mono.Addins;
|
using Mono.Addins;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
|
|
||||||
namespace OpenSim.Region.OptionalModules.Scripting.ScriptModuleComms
|
namespace OpenSim.Region.CoreModules.Scripting.ScriptModuleComms
|
||||||
{
|
{
|
||||||
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "ScriptModuleCommsModule")]
|
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "ScriptModuleCommsModule")]
|
||||||
class ScriptModuleCommsModule : INonSharedRegionModule, IScriptModuleComms
|
class ScriptModuleCommsModule : INonSharedRegionModule, IScriptModuleComms
|
||||||
|
@ -43,10 +44,30 @@ namespace OpenSim.Region.OptionalModules.Scripting.ScriptModuleComms
|
||||||
private static readonly ILog m_log =
|
private static readonly ILog m_log =
|
||||||
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
private IScriptModule m_scriptModule = null;
|
#region ScriptInvocation
|
||||||
|
protected class ScriptInvocationData
|
||||||
|
{
|
||||||
|
public ScriptInvocation ScriptInvocationFn { get; private set; }
|
||||||
|
public string FunctionName { get; private set; }
|
||||||
|
public Type[] TypeSignature { get; private set; }
|
||||||
|
public Type ReturnType { get; private set; }
|
||||||
|
|
||||||
|
public ScriptInvocationData(string fname, ScriptInvocation fn, Type[] callsig, Type returnsig)
|
||||||
|
{
|
||||||
|
FunctionName = fname;
|
||||||
|
ScriptInvocationFn = fn;
|
||||||
|
TypeSignature = callsig;
|
||||||
|
ReturnType = returnsig;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Dictionary<string,ScriptInvocationData> m_scriptInvocation = new Dictionary<string,ScriptInvocationData>();
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private IScriptModule m_scriptModule = null;
|
||||||
public event ScriptCommand OnScriptCommand;
|
public event ScriptCommand OnScriptCommand;
|
||||||
|
|
||||||
|
#region RegionModuleInterface
|
||||||
public void Initialise(IConfigSource config)
|
public void Initialise(IConfigSource config)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -81,6 +102,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.ScriptModuleComms
|
||||||
public void Close()
|
public void Close()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region ScriptModuleComms
|
||||||
|
|
||||||
public void RaiseEvent(UUID script, string id, string module, string command, string k)
|
public void RaiseEvent(UUID script, string id, string module, string command, string k)
|
||||||
{
|
{
|
||||||
|
@ -101,5 +125,76 @@ namespace OpenSim.Region.OptionalModules.Scripting.ScriptModuleComms
|
||||||
|
|
||||||
m_scriptModule.PostScriptEvent(script, "link_message", args);
|
m_scriptModule.PostScriptEvent(script, "link_message", args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void RegisterScriptInvocation(string fname, ScriptInvocation fcall, Type[] csig, Type rsig)
|
||||||
|
{
|
||||||
|
lock (m_scriptInvocation)
|
||||||
|
{
|
||||||
|
m_scriptInvocation[fname] = new ScriptInvocationData(fname,fcall,csig,rsig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string LookupModInvocation(string fname)
|
||||||
|
{
|
||||||
|
lock (m_scriptInvocation)
|
||||||
|
{
|
||||||
|
ScriptInvocationData sid;
|
||||||
|
if (m_scriptInvocation.TryGetValue(fname,out sid))
|
||||||
|
{
|
||||||
|
if (sid.ReturnType == typeof(string))
|
||||||
|
return "modInvokeS";
|
||||||
|
else if (sid.ReturnType == typeof(int))
|
||||||
|
return "modInvokeI";
|
||||||
|
else if (sid.ReturnType == typeof(float))
|
||||||
|
return "modInvokeF";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ScriptInvocation LookupScriptInvocation(string fname)
|
||||||
|
{
|
||||||
|
lock (m_scriptInvocation)
|
||||||
|
{
|
||||||
|
ScriptInvocationData sid;
|
||||||
|
if (m_scriptInvocation.TryGetValue(fname,out sid))
|
||||||
|
return sid.ScriptInvocationFn;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Type[] LookupTypeSignature(string fname)
|
||||||
|
{
|
||||||
|
lock (m_scriptInvocation)
|
||||||
|
{
|
||||||
|
ScriptInvocationData sid;
|
||||||
|
if (m_scriptInvocation.TryGetValue(fname,out sid))
|
||||||
|
return sid.TypeSignature;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Type LookupReturnType(string fname)
|
||||||
|
{
|
||||||
|
lock (m_scriptInvocation)
|
||||||
|
{
|
||||||
|
ScriptInvocationData sid;
|
||||||
|
if (m_scriptInvocation.TryGetValue(fname,out sid))
|
||||||
|
return sid.ReturnType;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public object InvokeOperation(UUID scriptid, string fname, params object[] parms)
|
||||||
|
{
|
||||||
|
ScriptInvocation fn = LookupScriptInvocation(fname);
|
||||||
|
return fn(scriptid,parms);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,6 +116,115 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
wComm.DeliverMessage(ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL, m_host.Name, m_host.UUID, message);
|
wComm.DeliverMessage(ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL, m_host.Name, m_host.UUID, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="fname">The name of the function to invoke</param>
|
||||||
|
/// <param name="fname">List of parameters</param>
|
||||||
|
/// <returns>string result of the invocation</returns>
|
||||||
|
public string modInvokeS(string fname, params object[] parms)
|
||||||
|
{
|
||||||
|
Type returntype = m_comms.LookupReturnType(fname);
|
||||||
|
if (returntype != typeof(string))
|
||||||
|
MODError(String.Format("return type mismatch for {0}",fname));
|
||||||
|
|
||||||
|
return (string)modInvoke(fname,parms);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int modInvokeI(string fname, params object[] parms)
|
||||||
|
{
|
||||||
|
Type returntype = m_comms.LookupReturnType(fname);
|
||||||
|
if (returntype != typeof(int))
|
||||||
|
MODError(String.Format("return type mismatch for {0}",fname));
|
||||||
|
|
||||||
|
return (int)modInvoke(fname,parms);
|
||||||
|
}
|
||||||
|
|
||||||
|
public float modInvokeF(string fname, params object[] parms)
|
||||||
|
{
|
||||||
|
Type returntype = m_comms.LookupReturnType(fname);
|
||||||
|
if (returntype != typeof(float))
|
||||||
|
MODError(String.Format("return type mismatch for {0}",fname));
|
||||||
|
|
||||||
|
return (float)modInvoke(fname,parms);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Invokes a preregistered function through the ScriptModuleComms class
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="fname">The name of the function to invoke</param>
|
||||||
|
/// <param name="fname">List of parameters</param>
|
||||||
|
/// <returns>string result of the invocation</returns>
|
||||||
|
protected object modInvoke(string fname, params object[] parms)
|
||||||
|
{
|
||||||
|
if (!m_MODFunctionsEnabled)
|
||||||
|
{
|
||||||
|
MODShoutError("Module command functions not enabled");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
Type[] signature = m_comms.LookupTypeSignature(fname);
|
||||||
|
if (signature.Length != parms.Length)
|
||||||
|
MODError(String.Format("wrong number of parameters to function {0}",fname));
|
||||||
|
|
||||||
|
object[] convertedParms = new object[parms.Length];
|
||||||
|
|
||||||
|
for (int i = 0; i < parms.Length; i++)
|
||||||
|
{
|
||||||
|
if (parms[i] is LSL_String)
|
||||||
|
{
|
||||||
|
if (signature[i] != typeof(string))
|
||||||
|
MODError(String.Format("parameter type mismatch in {0}; expecting {1}",fname,signature[i].Name));
|
||||||
|
|
||||||
|
convertedParms[i] = (string)(LSL_String)parms[i];
|
||||||
|
}
|
||||||
|
else if (parms[i] is LSL_Integer)
|
||||||
|
{
|
||||||
|
if (signature[i] != typeof(int))
|
||||||
|
MODError(String.Format("parameter type mismatch in {0}; expecting {1}",fname,signature[i].Name));
|
||||||
|
|
||||||
|
convertedParms[i] = (int)(LSL_Integer)parms[i];
|
||||||
|
}
|
||||||
|
else if (parms[i] is LSL_Float)
|
||||||
|
{
|
||||||
|
if (signature[i] != typeof(float))
|
||||||
|
MODError(String.Format("parameter type mismatch in {0}; expecting {1}",fname,signature[i].Name));
|
||||||
|
|
||||||
|
convertedParms[i] = (float)(LSL_Float)parms[i];
|
||||||
|
}
|
||||||
|
else if (parms[i] is LSL_Key)
|
||||||
|
{
|
||||||
|
if (signature[i] != typeof(string))
|
||||||
|
MODError(String.Format("parameter type mismatch in {0}; expecting {1}",fname,signature[i].Name));
|
||||||
|
|
||||||
|
convertedParms[i] = (string)(LSL_Key)parms[i];
|
||||||
|
}
|
||||||
|
else if (parms[i] is LSL_Rotation)
|
||||||
|
{
|
||||||
|
if (signature[i] != typeof(string))
|
||||||
|
MODError(String.Format("parameter type mismatch in {0}; expecting {1}",fname,signature[i].Name));
|
||||||
|
|
||||||
|
convertedParms[i] = (string)(LSL_Rotation)parms[i];
|
||||||
|
}
|
||||||
|
else if (parms[i] is LSL_Vector)
|
||||||
|
{
|
||||||
|
if (signature[i] != typeof(string))
|
||||||
|
MODError(String.Format("parameter type mismatch in {0}; expecting {1}",fname,signature[i].Name));
|
||||||
|
|
||||||
|
convertedParms[i] = (string)(LSL_Vector)parms[i];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (signature[i] != parms[i].GetType())
|
||||||
|
MODError(String.Format("parameter type mismatch in {0}; expecting {1}",fname,signature[i].Name));
|
||||||
|
|
||||||
|
convertedParms[i] = parms[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_comms.InvokeOperation(m_itemID,fname,convertedParms);
|
||||||
|
}
|
||||||
|
|
||||||
public string modSendCommand(string module, string command, string k)
|
public string modSendCommand(string module, string command, string k)
|
||||||
{
|
{
|
||||||
if (!m_MODFunctionsEnabled)
|
if (!m_MODFunctionsEnabled)
|
||||||
|
|
|
@ -40,6 +40,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
|
||||||
{
|
{
|
||||||
public interface IMOD_Api
|
public interface IMOD_Api
|
||||||
{
|
{
|
||||||
|
// Invocation functions
|
||||||
|
string modInvokeS(string fname, params object[] parms);
|
||||||
|
int modInvokeI(string fname, params object[] parms);
|
||||||
|
float modInvokeF(string fname, params object[] parms);
|
||||||
|
// vector modInvokeV(string fname, params object[] parms);
|
||||||
|
// rotation modInvokeV(string fname, params object[] parms);
|
||||||
|
// key modInvokeK(string fname, params object[] parms);
|
||||||
|
// list modInvokeL(string fname, params object[] parms);
|
||||||
|
|
||||||
//Module functions
|
//Module functions
|
||||||
string modSendCommand(string modules, string command, string k);
|
string modSendCommand(string modules, string command, string k);
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,6 +58,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||||
m_MOD_Functions = (IMOD_Api)api;
|
m_MOD_Functions = (IMOD_Api)api;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string modInvokeS(string fname, params object[] parms)
|
||||||
|
{
|
||||||
|
return m_MOD_Functions.modInvokeS(fname, parms);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int modInvokeI(string fname, params object[] parms)
|
||||||
|
{
|
||||||
|
return m_MOD_Functions.modInvokeI(fname, parms);
|
||||||
|
}
|
||||||
|
|
||||||
|
public float modInvokeF(string fname, params object[] parms)
|
||||||
|
{
|
||||||
|
return m_MOD_Functions.modInvokeF(fname, parms);
|
||||||
|
}
|
||||||
|
|
||||||
public string modSendCommand(string module, string command, string k)
|
public string modSendCommand(string module, string command, string k)
|
||||||
{
|
{
|
||||||
return m_MOD_Functions.modSendCommand(module, command, k);
|
return m_MOD_Functions.modSendCommand(module, command, k);
|
||||||
|
|
|
@ -32,6 +32,8 @@ using System.Reflection;
|
||||||
using log4net;
|
using log4net;
|
||||||
using Tools;
|
using Tools;
|
||||||
|
|
||||||
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
|
|
||||||
namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
{
|
{
|
||||||
public class CSCodeGenerator : ICodeConverter
|
public class CSCodeGenerator : ICodeConverter
|
||||||
|
@ -45,12 +47,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
private int m_CSharpLine; // the current line of generated C# code
|
private int m_CSharpLine; // the current line of generated C# code
|
||||||
private int m_CSharpCol; // the current column of generated C# code
|
private int m_CSharpCol; // the current column of generated C# code
|
||||||
private List<string> m_warnings = new List<string>();
|
private List<string> m_warnings = new List<string>();
|
||||||
|
private IScriptModuleComms m_comms = null;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates an 'empty' CSCodeGenerator instance.
|
/// Creates an 'empty' CSCodeGenerator instance.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public CSCodeGenerator()
|
public CSCodeGenerator()
|
||||||
{
|
{
|
||||||
|
m_comms = null;
|
||||||
|
ResetCounters();
|
||||||
|
}
|
||||||
|
|
||||||
|
public CSCodeGenerator(IScriptModuleComms comms)
|
||||||
|
{
|
||||||
|
m_comms = comms;
|
||||||
ResetCounters();
|
ResetCounters();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -866,8 +876,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
{
|
{
|
||||||
string retstr = String.Empty;
|
string retstr = String.Empty;
|
||||||
|
|
||||||
retstr += Generate(String.Format("{0}(", CheckName(fc.Id)), fc);
|
string modinvoke = null;
|
||||||
|
if (m_comms != null)
|
||||||
|
modinvoke = m_comms.LookupModInvocation(fc.Id);
|
||||||
|
|
||||||
|
if (modinvoke != null)
|
||||||
|
{
|
||||||
|
if (fc.kids[0] is ArgumentList)
|
||||||
|
{
|
||||||
|
if ((fc.kids[0] as ArgumentList).kids.Count == 0)
|
||||||
|
retstr += Generate(String.Format("{0}(\"{1}\"",modinvoke,fc.Id), fc);
|
||||||
|
else
|
||||||
|
retstr += Generate(String.Format("{0}(\"{1}\",",modinvoke,fc.Id), fc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
retstr += Generate(String.Format("{0}(", CheckName(fc.Id)), fc);
|
||||||
|
}
|
||||||
|
|
||||||
foreach (SYMBOL kid in fc.kids)
|
foreach (SYMBOL kid in fc.kids)
|
||||||
retstr += GenerateNode(kid);
|
retstr += GenerateNode(kid);
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@ using Microsoft.CSharp;
|
||||||
//using Microsoft.JScript;
|
//using Microsoft.JScript;
|
||||||
using Microsoft.VisualBasic;
|
using Microsoft.VisualBasic;
|
||||||
using log4net;
|
using log4net;
|
||||||
|
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Region.ScriptEngine.Interfaces;
|
using OpenSim.Region.ScriptEngine.Interfaces;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
|
@ -293,6 +294,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
{
|
{
|
||||||
// m_log.DebugFormat("[Compiler]: Compiling script\n{0}", Script);
|
// m_log.DebugFormat("[Compiler]: Compiling script\n{0}", Script);
|
||||||
|
|
||||||
|
IScriptModuleComms comms = m_scriptEngine.World.RequestModuleInterface<IScriptModuleComms>();
|
||||||
|
|
||||||
linemap = null;
|
linemap = null;
|
||||||
m_warnings.Clear();
|
m_warnings.Clear();
|
||||||
|
|
||||||
|
@ -382,7 +385,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
if (language == enumCompileType.lsl)
|
if (language == enumCompileType.lsl)
|
||||||
{
|
{
|
||||||
// Its LSL, convert it to C#
|
// Its LSL, convert it to C#
|
||||||
LSL_Converter = (ICodeConverter)new CSCodeGenerator();
|
LSL_Converter = (ICodeConverter)new CSCodeGenerator(comms);
|
||||||
compileScript = LSL_Converter.Convert(Script);
|
compileScript = LSL_Converter.Convert(Script);
|
||||||
|
|
||||||
// copy converter warnings into our warnings.
|
// copy converter warnings into our warnings.
|
||||||
|
|
Loading…
Reference in New Issue