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

@@ -28,47 +28,170 @@ using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using log4net;
using Nini.Config;
using OpenMetaverse;
using OpenSim.ApplicationPlugins.ScriptEngine;
using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Scenes;
using ComponentProviders = OpenSim.ApplicationPlugins.ScriptEngine.ComponentRegistry;
using OpenSim.ScriptEngine.Components.DotNetEngine.Events;
using OpenSim.ScriptEngine.Components.DotNetEngine.Scheduler;
using OpenSim.ScriptEngine.Shared;
using ComponentProviders = OpenSim.ApplicationPlugins.ScriptEngine;
namespace OpenSim.ScriptEngine.Engines.DotNetEngine
{
// This is a sample engine
public class DotNetEngine : RegionScriptEngineBase
public partial class DotNetEngine : IScriptEngine
{
// This will be the makeup of this script engine
public string[] ComponentNames = new string[] {
"Commands_LSL",
"Commands_OSSL",
"Compiler_CS",
"Compiler_JS",
"Compiler_LSL",
"Compiler_VB",
"LSLEventProvider",
"Scheduler"
};
//private string[] _ComponentNames = new string[] {
// "Commands_LSL",
// "Commands_OSSL",
// "Compiler_CS",
// "Compiler_JS",
// "Compiler_LSL",
// "Compiler_VB",
// "LSLEventProvider",
// "Scheduler"
// };
internal static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public override string Name
public string Name { get { return "SECS.DotNetEngine"; } }
//public bool IsSharedModule { get { return true; } }
internal RegionInfoStructure RegionInfo;
private string[] commandNames = new string[]
{
"Commands_LSL"
};
private string[] compilerNames = new string[]
{
"Compiler_CS",
"Compiler_JS",
"Compiler_LSL",
"Compiler_YP",
"Compiler_VB"
};
private string[] schedulerNames = new string[]
{
"Scheduler"
};
//internal IScriptLoader m_ScriptLoader;
internal LSLEventProvider m_LSLEventProvider;
//internal IScriptExecutor m_Executor;
//internal Dictionary<string, IScriptCompiler> Compilers = new Dictionary<string, IScriptCompiler>();
internal Dictionary<string, IScriptScheduler> Schedulers = new Dictionary<string, IScriptScheduler>();
public static Dictionary<string, IScriptCompiler> Compilers = new Dictionary<string, IScriptCompiler>();
// private static bool haveInitialized = false;
public DotNetEngine()
{
get { return "DotNetEngine"; }
RegionInfo = new RegionInfoStructure();
RegionInfo.Compilers = Compilers;
RegionInfo.Schedulers = Schedulers;
RegionInfo.Executors = new Dictionary<string, IScriptExecutor>();
RegionInfo.CommandProviders = new Dictionary<string, IScriptCommandProvider>();
RegionInfo.EventProviders = new Dictionary<string, IScriptEventProvider>();
RegionInfo.Logger = LogManager.GetLogger("SECS.DotNetEngine.RegionInfo");
}
public override void Initialize()
public void Initialise(Scene scene, IConfigSource source)
{
// We need to initialize the components we will be using. Our baseclass already has builtin functions for this.
m_log.Info("[" + Name + "]: Initializing SECs (Script Engine Components)");
InitializeComponents(ComponentNames);
RegionInfo.Scene = scene;
RegionInfo.ConfigSource = source;
m_log.DebugFormat("[{0}] Initializing components", Name);
InitializeComponents();
}
public override void PreClose()
public void PostInitialise() { }
/// <summary>
/// Called on region close
/// </summary>
public void Close()
{
// Before
ComponentClose();
}
#region Initialize the Script Engine Components we need
public void InitializeComponents()
{
string cname = "";
m_log.DebugFormat("[{0}] Component initialization", Name);
// Initialize an instance of all module we want
try
{
cname = "ScriptManager";
m_log.DebugFormat("[{0}] Executor: {1}", Name, cname);
RegionInfo.Executors.Add(cname,
ScriptEnginePlugin.GetComponentInstance(RegionInfo, cname) as IScriptExecutor);
cname = "ScriptLoader";
m_log.DebugFormat("[{0}] ScriptLoader: {1}", Name, cname);
RegionInfo.ScriptLoader =
ScriptEnginePlugin.GetComponentInstance(RegionInfo, cname) as IScriptExecutor as ScriptLoader;
// CommandProviders
foreach (string cn in commandNames)
{
cname = cn;
m_log.DebugFormat("[{0}] CommandProvider: {1}", Name, cname);
RegionInfo.CommandProviders.Add(cname,
ScriptEnginePlugin.GetComponentInstance(RegionInfo, cname) as
IScriptCommandProvider);
}
// Compilers
foreach (string cn in compilerNames)
{
cname = cn;
m_log.DebugFormat("[{0}] Compiler: {1}", Name, cname);
RegionInfo.Compilers.Add(cname,
ScriptEnginePlugin.GetComponentInstance(RegionInfo, cname) as
IScriptCompiler);
}
// Schedulers
foreach (string cn in schedulerNames)
{
cname = cn;
m_log.DebugFormat("[{0}] Scheduler: {1}", Name, cname);
RegionInfo.Schedulers.Add(cname,
ScriptEnginePlugin.GetComponentInstance(RegionInfo, cname) as
IScriptScheduler);
}
// Event provider
cname = "LSLEventProvider";
m_log.DebugFormat("[{0}] EventProvider: {1}", Name, cname);
IScriptEventProvider sep = ScriptEnginePlugin.GetComponentInstance(RegionInfo, cname) as IScriptEventProvider;
RegionInfo.EventProviders.Add(cname, sep);
m_LSLEventProvider = sep as LSLEventProvider;
// Hook up events
m_LSLEventProvider.RezScript += Events_RezScript;
m_LSLEventProvider.RemoveScript += Events_RemoveScript;
}
catch (Exception e)
{
m_log.ErrorFormat("[{0}] Exception while loading \"{1}\": {2}", Name, cname, e.ToString());
}
}
private void ComponentClose()
{
// Close schedulers
foreach (IScriptScheduler scheduler in RegionInfo.Schedulers.Values)
{
scheduler.Close();
}
}
#endregion
}
}

View File

@@ -0,0 +1,68 @@
using System;
using System.Collections.Generic;
using System.Text;
using OpenMetaverse;
using OpenSim.ScriptEngine.Components.DotNetEngine.Events;
using OpenSim.ScriptEngine.Shared;
namespace OpenSim.ScriptEngine.Engines.DotNetEngine
{
public partial class DotNetEngine
{
//internal Dictionary<int, IScriptScheduler> ScriptMapping = new Dictionary<int, IScriptScheduler>();
//
// HANDLE EVENTS FROM SCRIPTS
// We will handle script add, change and remove events outside of command pipeline
//
#region Script Add/Change/Remove
void Events_RezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine)
{
// ###
// # New script created
// ###
m_log.DebugFormat(
"[{0}] NEW SCRIPT: localID: {1}, itemID: {2}, startParam: {3}, postOnRez: {4}, engine: {5}",
Name, localID, itemID, startParam, postOnRez, engine);
// Make a script object
ScriptStructure scriptObject = new ScriptStructure();
scriptObject.RegionInfo = RegionInfo;
scriptObject.LocalID = localID;
scriptObject.ItemID = itemID;
scriptObject.Source = script;
//
// Get MetaData from script header
//
ScriptMetaData scriptMetaData = ScriptMetaData.Extract(ref script);
scriptObject.ScriptMetaData = scriptMetaData;
foreach (string key in scriptObject.ScriptMetaData.Keys)
{
m_log.DebugFormat("[{0}] Script metadata: Key: \"{1}\", Value: \"{2}\".", Name, key, scriptObject.ScriptMetaData[key]);
}
//
// Load this assembly
//
// TODO: Use Executor to send a command instead?
m_log.DebugFormat("[{0}] Adding script to scheduler", Name);
RegionInfo.FindScheduler(scriptObject.ScriptMetaData).AddScript(scriptObject);
// Add to our internal mapping
//ScriptMapping.Add(itemID, Schedulers[scheduler]);
}
private void Events_RemoveScript(uint localID, UUID itemID)
{
// Tell all schedulers to remove this item
foreach (IScriptScheduler scheduler in RegionInfo.Schedulers.Values)
{
scheduler.Removecript(localID, itemID);
}
}
#endregion
}
}