Correct the design error I introduced into ScriptComms. Untested but about to

be.
avinationmerge
Melanie 2012-03-26 00:30:52 +01:00
parent 44f1f87656
commit 4b76c52c41
2 changed files with 25 additions and 18 deletions

View File

@ -31,7 +31,6 @@ using OpenMetaverse;
namespace OpenSim.Region.Framework.Interfaces
{
public delegate void ScriptCommand(UUID script, string id, string module, string command, string k);
public delegate object ScriptInvocation(UUID script, object[] parms);
/// <summary>
/// Interface for communication between OpenSim modules and in-world scripts
@ -46,10 +45,10 @@ namespace OpenSim.Region.Framework.Interfaces
/// </summary>
event ScriptCommand OnScriptCommand;
void RegisterScriptInvocation(ScriptInvocation fn);
ScriptInvocation[] GetScriptInvocationList();
void RegisterScriptInvocation(Delegate fn);
Delegate[] GetScriptInvocationList();
ScriptInvocation LookupScriptInvocation(string fname);
Delegate LookupScriptInvocation(string fname);
string LookupModInvocation(string fname);
Type[] LookupTypeSignature(string fname);
Type LookupReturnType(string fname);

View File

@ -47,15 +47,15 @@ namespace OpenSim.Region.CoreModules.Scripting.ScriptModuleComms
#region ScriptInvocation
protected class ScriptInvocationData
{
public ScriptInvocation ScriptInvocationFn { get; private set; }
public Delegate ScriptInvocationDelegate { 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)
public ScriptInvocationData(string fname, Delegate fn, Type[] callsig, Type returnsig)
{
FunctionName = fname;
ScriptInvocationFn = fn;
ScriptInvocationDelegate = fn;
TypeSignature = callsig;
ReturnType = returnsig;
}
@ -126,26 +126,30 @@ namespace OpenSim.Region.CoreModules.Scripting.ScriptModuleComms
m_scriptModule.PostScriptEvent(script, "link_message", args);
}
public void RegisterScriptInvocation(ScriptInvocation fcall)
public void RegisterScriptInvocation(Delegate fcall)
{
lock (m_scriptInvocation)
{
ParameterInfo[] parameters = fcall.Method.GetParameters ();
Type[] parmTypes = new Type[parameters.Length];
for (int i = 0 ; i < parameters.Length ; i++)
parmTypes[i] = parameters[i].ParameterType;
if (parameters.Length == 0) // Must have one UUID param
return;
// Hide the first parameter
Type[] parmTypes = new Type[parameters.Length - 1];
for (int i = 1 ; i < parameters.Length ; i++)
parmTypes[i - 1] = parameters[i].ParameterType;
m_scriptInvocation[fcall.Method.Name] = new ScriptInvocationData(fcall.Method.Name, fcall, parmTypes, fcall.Method.ReturnType);
}
}
public ScriptInvocation[] GetScriptInvocationList()
public Delegate[] GetScriptInvocationList()
{
List<ScriptInvocation> ret = new List<ScriptInvocation>();
List<Delegate> ret = new List<Delegate>();
lock (m_scriptInvocation)
{
foreach (ScriptInvocationData d in m_scriptInvocation.Values)
ret.Add(d.ScriptInvocationFn);
ret.Add(d.ScriptInvocationDelegate);
}
return ret.ToArray();
}
@ -177,13 +181,13 @@ namespace OpenSim.Region.CoreModules.Scripting.ScriptModuleComms
return null;
}
public ScriptInvocation LookupScriptInvocation(string fname)
public Delegate LookupScriptInvocation(string fname)
{
lock (m_scriptInvocation)
{
ScriptInvocationData sid;
if (m_scriptInvocation.TryGetValue(fname,out sid))
return sid.ScriptInvocationFn;
return sid.ScriptInvocationDelegate;
}
return null;
@ -215,8 +219,12 @@ namespace OpenSim.Region.CoreModules.Scripting.ScriptModuleComms
public object InvokeOperation(UUID scriptid, string fname, params object[] parms)
{
ScriptInvocation fn = LookupScriptInvocation(fname);
return fn(scriptid,parms);
List<object> olist = new List<object>();
olist.Add(scriptid);
foreach (object o in parms)
olist.Add(o);
Delegate fn = LookupScriptInvocation(fname);
return fn.DynamicInvoke(olist.ToArray());
}
#endregion