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.

This commit is contained in:
Tedd Hansen
2008-11-08 17:35:48 +00:00
parent cf0a14bec9
commit 9511a8c763
53 changed files with 2997 additions and 573 deletions

View File

@@ -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<string, IScriptApi> Apis;
public Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> 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<string, Delegate> 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());
}
}
}
/// <summary>
/// Cache functions into a dictionary with delegates. Should be faster than reflection.
/// </summary>
private void CacheInternalFunctions()
{
Type scriptObjectType = ScriptObject.GetType();
InternalFunctions = new Dictionary<string, Delegate>();
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);
}
}
}
}
}