mirror of
https://github.com/opensim/opensim.git
synced 2026-08-06 17:32:42 +08:00
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:
@@ -1,101 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSim Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using log4net;
|
||||
using OpenSim.ApplicationPlugins.ScriptEngine.Components;
|
||||
|
||||
namespace OpenSim.ApplicationPlugins.ScriptEngine
|
||||
{
|
||||
/// <summary>
|
||||
/// Used to load ScriptEngine component .dll's
|
||||
/// </summary>
|
||||
internal class ComponentLoader
|
||||
{
|
||||
internal static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
//private ScriptEnginePlugin scriptEnginePlugin;
|
||||
public ComponentLoader(ScriptEnginePlugin sep)
|
||||
{
|
||||
//scriptEnginePlugin = sep;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Load components from directory
|
||||
/// </summary>
|
||||
/// <param name="directory"></param>
|
||||
public void Load(string directory)
|
||||
{
|
||||
// We may want to change how this functions as currently it required unique class names for each component
|
||||
|
||||
foreach (string file in Directory.GetFiles(directory, "*.dll"))
|
||||
{
|
||||
//m_log.DebugFormat("[ScriptEngine]: Loading: [{0}].", file);
|
||||
Assembly componentAssembly = Assembly.LoadFrom(file);
|
||||
if (componentAssembly != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Go through all types in the assembly
|
||||
foreach (Type componentType in componentAssembly.GetTypes())
|
||||
{
|
||||
if (componentType.IsPublic
|
||||
&& !componentType.IsAbstract)
|
||||
{
|
||||
if (componentType.IsSubclassOf(typeof (ComponentBase)))
|
||||
{
|
||||
// We have found an type which is derived from ProdiverBase, add it to provider list
|
||||
m_log.InfoFormat("[ScriptEngine]: Adding component: {0}", componentType.Name);
|
||||
lock (ComponentRegistry.providers)
|
||||
{
|
||||
ComponentRegistry.providers.Add(componentType.Name, componentType);
|
||||
}
|
||||
}
|
||||
if (componentType.IsSubclassOf(typeof(RegionScriptEngineBase)))
|
||||
{
|
||||
// We have found an type which is derived from RegionScriptEngineBase, add it to engine list
|
||||
m_log.InfoFormat("[ScriptEngine]: Adding script engine: {0}", componentType.Name);
|
||||
lock (ComponentRegistry.scriptEngines)
|
||||
{
|
||||
ComponentRegistry.scriptEngines.Add(componentType.Name, componentType);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
(ReflectionTypeLoadException)
|
||||
{
|
||||
m_log.InfoFormat("[ScriptEngine]: Could not load types for [{0}].", componentAssembly.FullName);
|
||||
}
|
||||
} //if
|
||||
} //foreach
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSim Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using OpenSim.ApplicationPlugins.ScriptEngine;
|
||||
using OpenSim.ApplicationPlugins.ScriptEngine.Components;
|
||||
|
||||
namespace OpenSim.ApplicationPlugins.ScriptEngine
|
||||
{
|
||||
/// <summary>
|
||||
/// Component providers
|
||||
/// This is where any component (any part) of the Script Engine Component System (SECS) registers.
|
||||
/// Nothing is instanciated at this point. The modules just need to register here to be available for any script engine.
|
||||
/// </summary>
|
||||
public static class ComponentRegistry
|
||||
{
|
||||
// Component providers are registered here wit a name (string)
|
||||
// When a script engine is created the components are instanciated
|
||||
public static Dictionary<string, Type> providers = new Dictionary<string, Type>();
|
||||
public static Dictionary<string, Type> scriptEngines = new Dictionary<string, Type>();
|
||||
|
||||
///// <summary>
|
||||
///// Returns a list of ProviderBase objects which has been instanciated by their name
|
||||
///// </summary>
|
||||
///// <param name="Providers">List of Script Engine Components</param>
|
||||
///// <returns></returns>
|
||||
//public static List<ComponentBase> GetComponents(string[] Providers)
|
||||
//{
|
||||
// List<ComponentBase> pbl = new List<ComponentBase>();
|
||||
// if (Providers != null)
|
||||
// {
|
||||
// foreach (string p in Providers)
|
||||
// {
|
||||
// if (providers.ContainsKey(p))
|
||||
// pbl.Add(Activator.CreateInstance(providers[p]) as ComponentBase);
|
||||
// }
|
||||
// }
|
||||
|
||||
// return pbl;
|
||||
//}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSim Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace OpenSim.ApplicationPlugins.ScriptEngine.Components
|
||||
{
|
||||
public abstract class CommandBase: ComponentBase
|
||||
{
|
||||
//public override iProviderBase CreateInstance()
|
||||
//{
|
||||
// throw new NotImplementedException();
|
||||
//}
|
||||
|
||||
//public override void Start()
|
||||
//{
|
||||
// throw new NotImplementedException();
|
||||
//}
|
||||
}
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSim Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace OpenSim.ApplicationPlugins.ScriptEngine.Components
|
||||
{
|
||||
public abstract class CompilerBase: ComponentBase
|
||||
{
|
||||
//public override iProviderBase CreateInstance()
|
||||
//{
|
||||
// throw new NotImplementedException();
|
||||
//}
|
||||
|
||||
//public override void Start()
|
||||
//{
|
||||
// throw new NotImplementedException();
|
||||
//}
|
||||
}
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSim Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace OpenSim.ApplicationPlugins.ScriptEngine.Components
|
||||
{
|
||||
/// <summary>
|
||||
/// Generic baseclass for component providers
|
||||
/// </summary>
|
||||
public abstract class ComponentBase //: iProviderBase
|
||||
{
|
||||
//public abstract iProviderBase CreateInstance();
|
||||
public abstract void Start();
|
||||
public abstract void Close();
|
||||
public RegionScriptEngineBase scriptEngine;
|
||||
public void Initialize(RegionScriptEngineBase ScriptEngine)
|
||||
{
|
||||
scriptEngine = ScriptEngine;
|
||||
}
|
||||
|
||||
static ComponentBase()
|
||||
{
|
||||
// We got loaded -- should we register now?
|
||||
//OpenSim.ApplicationPlugins.ScriptEngine.ComponentProviders.providers.Add(GetType());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSim Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace OpenSim.ApplicationPlugins.ScriptEngine.Components
|
||||
{
|
||||
public abstract class EventBase : ComponentBase
|
||||
{
|
||||
//public override iProviderBase CreateInstance()
|
||||
//{
|
||||
// throw new NotImplementedException();
|
||||
//}
|
||||
|
||||
//public override void Start()
|
||||
//{
|
||||
// throw new NotImplementedException();
|
||||
//}
|
||||
}
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSim Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace OpenSim.ApplicationPlugins.ScriptEngine.Components
|
||||
{
|
||||
public abstract class SchedulerBase: ComponentBase
|
||||
{
|
||||
//public override iProviderBase CreateInstance()
|
||||
//{
|
||||
// throw new NotImplementedException();
|
||||
//}
|
||||
|
||||
//public override void Start()
|
||||
//{
|
||||
// throw new NotImplementedException();
|
||||
//}
|
||||
}
|
||||
}
|
||||
@@ -26,45 +26,51 @@
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using OpenSim.Region.Environment.Interfaces;
|
||||
using OpenSim.Region.Environment.Scenes;
|
||||
using OpenSim.ScriptEngine.Shared;
|
||||
|
||||
namespace OpenSim.ApplicationPlugins.ScriptEngine
|
||||
{
|
||||
public class RegionScriptEnginePlugin : IRegionModule
|
||||
public class RegionEngineLoader : IRegionModule
|
||||
{
|
||||
// This is a region module.
|
||||
// This means: Every time a new region is created, a new instance of this module is also created.
|
||||
// This module is responsible for starting the script engine for this region.
|
||||
public string Name { get { return "SECS.DotNetEngine.Scheduler.RegionLoader"; } }
|
||||
public bool IsSharedModule { get { return true; } }
|
||||
|
||||
internal static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
private string tempScriptEngineName = "DotNetEngine";
|
||||
public RegionScriptEngineBase scriptEngine;
|
||||
public IScriptEngine scriptEngine;
|
||||
public IConfigSource ConfigSource;
|
||||
public IConfig ScriptConfigSource;
|
||||
public void Initialise(Scene scene, IConfigSource source)
|
||||
{
|
||||
return;
|
||||
// New region is being created
|
||||
// Create a new script engine
|
||||
// try
|
||||
// {
|
||||
// lock (ComponentRegistry.scriptEngines)
|
||||
// {
|
||||
// scriptEngine =
|
||||
// Activator.CreateInstance(ComponentRegistry.scriptEngines[tempScriptEngineName]) as
|
||||
// RegionScriptEngineBase;
|
||||
// }
|
||||
// scriptEngine.Initialize(scene, source);
|
||||
// }
|
||||
// catch (Exception ex)
|
||||
// {
|
||||
// scriptEngine.m_log.Error("[ScriptEngine]: Unable to load engine \"" + tempScriptEngineName + "\": " + ex.ToString());
|
||||
// }
|
||||
// Make sure we have config
|
||||
if (ConfigSource.Configs["SECS"] == null)
|
||||
ConfigSource.AddConfig("SECS");
|
||||
ScriptConfigSource = ConfigSource.Configs["SECS"];
|
||||
|
||||
// Is SECS enabled?
|
||||
if (ScriptConfigSource.GetBoolean("Enabled", false))
|
||||
{
|
||||
LoadEngine();
|
||||
if (scriptEngine != null)
|
||||
scriptEngine.Initialise(scene, source);
|
||||
}
|
||||
}
|
||||
|
||||
public void PostInitialise()
|
||||
{
|
||||
// Nothing
|
||||
if (scriptEngine != null)
|
||||
scriptEngine.PostInitialise();
|
||||
}
|
||||
|
||||
public void Close()
|
||||
@@ -76,18 +82,34 @@ namespace OpenSim.ApplicationPlugins.ScriptEngine
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
scriptEngine.m_log.Error("[ScriptEngine]: Unable to close engine \"" + tempScriptEngineName + "\": " + ex.ToString());
|
||||
m_log.ErrorFormat("[{0}] Unable to close engine \"{1}\": {2}", Name, tempScriptEngineName, ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
public string Name
|
||||
private void LoadEngine()
|
||||
{
|
||||
get { return "ScriptEngine Region Loader"; }
|
||||
m_log.DebugFormat("[{0}] Loading region script engine engine \"{1}\".", Name, tempScriptEngineName);
|
||||
try
|
||||
{
|
||||
lock (ScriptEnginePlugin.scriptEngines)
|
||||
{
|
||||
if (!ScriptEnginePlugin.scriptEngines.ContainsKey(tempScriptEngineName))
|
||||
{
|
||||
m_log.ErrorFormat("[{0}] Unable to load region script engine: Script engine \"{1}\" does not exist.", Name, tempScriptEngineName);
|
||||
}
|
||||
else
|
||||
{
|
||||
scriptEngine =
|
||||
Activator.CreateInstance(ScriptEnginePlugin.scriptEngines[tempScriptEngineName]) as
|
||||
IScriptEngine;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
m_log.ErrorFormat("[{0}] Internal error loading region script engine \"{1}\": {2}", Name, tempScriptEngineName, ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsSharedModule
|
||||
{
|
||||
get { return true; }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,182 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSim Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using OpenSim.ApplicationPlugins.ScriptEngine.Components;
|
||||
using OpenSim.Region.Environment.Scenes;
|
||||
|
||||
namespace OpenSim.ApplicationPlugins.ScriptEngine
|
||||
{
|
||||
public abstract class RegionScriptEngineBase
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Called on region initialize
|
||||
/// </summary>
|
||||
public abstract void Initialize();
|
||||
public abstract string Name { get; }
|
||||
/// <summary>
|
||||
/// Called before components receive Close()
|
||||
/// </summary>
|
||||
public abstract void PreClose();
|
||||
// Hold list of all the different components we have working for us
|
||||
public List<ComponentBase> Components = new List<ComponentBase>();
|
||||
|
||||
public Scene m_Scene;
|
||||
public IConfigSource m_ConfigSource;
|
||||
public readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
public void Initialize(Scene scene, IConfigSource source)
|
||||
{
|
||||
// Region started
|
||||
m_Scene = scene;
|
||||
m_ConfigSource = source;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates instances of script engine components inside "components" List
|
||||
/// </summary>
|
||||
/// <param name="ComponentList">Array of comonent names to initialize</param>
|
||||
public void InitializeComponents(string[] ComponentList)
|
||||
{
|
||||
// Take list of providers to initialize and make instances of them
|
||||
foreach (string c in ComponentList)
|
||||
{
|
||||
m_log.Info("[" + Name + "]: Loading: " + c);
|
||||
lock (Components)
|
||||
{
|
||||
lock (ComponentRegistry.providers)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (ComponentRegistry.providers.ContainsKey(c))
|
||||
Components.Add(Activator.CreateInstance(ComponentRegistry.providers[c]) as ComponentBase);
|
||||
else
|
||||
m_log.Error("[" + Name + "]: Component \"" + c + "\" not found, can not load");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
m_log.Error("[" + Name + "]: Exception loading \"" + c + "\": " + ex.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Run Initialize on all our providers, hand over a reference of ourself.
|
||||
foreach (ComponentBase p in Components.ToArray())
|
||||
{
|
||||
try
|
||||
{
|
||||
p.Initialize(this);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
lock (Components)
|
||||
{
|
||||
m_log.Error("[" + Name + "]: Error initializing \"" + p.GetType().FullName + "\": " +
|
||||
ex.ToString());
|
||||
if (Components.Contains(p))
|
||||
Components.Remove(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
// All modules has been initialized, call Start() on them.
|
||||
foreach (ComponentBase p in Components.ToArray())
|
||||
{
|
||||
try
|
||||
{
|
||||
p.Start();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
lock (Components)
|
||||
{
|
||||
m_log.Error("[" + Name + "]: Error starting \"" + p.GetType().FullName + "\": " + ex.ToString());
|
||||
if (Components.Contains(p))
|
||||
Components.Remove(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#region Functions to return lists based on type
|
||||
// Predicate for searching List for a certain type
|
||||
private static bool FindType<T>(ComponentBase pb)
|
||||
{
|
||||
if (pb.GetType() is T)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
public List<ComponentBase> GetCommandComponentList()
|
||||
{
|
||||
return Components.FindAll(FindType<CommandBase>);
|
||||
}
|
||||
public List<ComponentBase> GetCompilerComponentList()
|
||||
{
|
||||
return Components.FindAll(FindType<CompilerBase>);
|
||||
}
|
||||
public List<ComponentBase> GetEventComponentList()
|
||||
{
|
||||
return Components.FindAll(FindType<EventBase>);
|
||||
}
|
||||
public List<ComponentBase> GetScheduleComponentList()
|
||||
{
|
||||
return Components.FindAll(FindType<SchedulerBase>);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public void Close()
|
||||
{
|
||||
// We need to shut down
|
||||
|
||||
// First call abstracted PreClose()
|
||||
PreClose();
|
||||
|
||||
// Then Call Close() on all components
|
||||
foreach (ComponentBase p in Components.ToArray())
|
||||
{
|
||||
try
|
||||
{
|
||||
p.Close();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// TODO: Print error to console
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
<Addin id="ScriptEngine" version="0.1">
|
||||
<Runtime>
|
||||
<Import assembly="OpenSim.ApplicationPlugins.ScriptEngine.dll" />
|
||||
</Runtime>
|
||||
<Dependencies>
|
||||
<Addin id="OpenSim" version="0.5" />
|
||||
<Addin id="RegionProxy" version="0.1" />
|
||||
</Dependencies>
|
||||
<Extension path="/OpenSim/Startup">
|
||||
<Plugin id="ScriptEngine" type="OpenSim.ApplicationPlugins.ScriptEngine.ScriptEnginePlugin" />
|
||||
</Extension>
|
||||
</Addin>
|
||||
@@ -0,0 +1,11 @@
|
||||
<Addin id="OpenSim.ApplicationPlugins.ScriptEngine" version="0.1">
|
||||
<Runtime>
|
||||
<Import assembly="OpenSim.ApplicationPlugins.ScriptEngine.dll" />
|
||||
</Runtime>
|
||||
<Dependencies>
|
||||
<Addin id="OpenSim" version="0.5" />
|
||||
</Dependencies>
|
||||
<Extension path = "/OpenSim/Startup">
|
||||
<Plugin id="ScriptEnginePlugin" type="OpenSim.ApplicationPlugins.ScriptEngine.ScriptEnginePlugin" />
|
||||
</Extension>
|
||||
</Addin>
|
||||
@@ -26,29 +26,143 @@
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using OpenSim.ScriptEngine.Shared;
|
||||
using log4net;
|
||||
|
||||
namespace OpenSim.ApplicationPlugins.ScriptEngine
|
||||
{
|
||||
/// <summary>
|
||||
/// Loads all Script Engine Components
|
||||
/// </summary>
|
||||
public class ScriptEnginePlugin : IApplicationPlugin
|
||||
{
|
||||
internal static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
internal OpenSimBase m_OpenSim;
|
||||
private ComponentLoader pluginLoader;
|
||||
|
||||
// Component providers are registered here wit a name (string)
|
||||
// When a script engine is created the components are instanciated
|
||||
public static Dictionary<string, Type> providers = new Dictionary<string, Type>();
|
||||
public static Dictionary<string, Type> scriptEngines = new Dictionary<string, Type>();
|
||||
|
||||
|
||||
public ScriptEnginePlugin()
|
||||
{
|
||||
// Application startup
|
||||
#if DEBUG
|
||||
m_log.InfoFormat("[{0}] ##################################", Name);
|
||||
m_log.InfoFormat("[{0}] # Script Engine Component System #", Name);
|
||||
m_log.InfoFormat("[{0}] ##################################", Name);
|
||||
#else
|
||||
m_log.InfoFormat("[{0}] Script Engine Component System", Name);
|
||||
#endif
|
||||
|
||||
// Load all modules from current directory
|
||||
// We only want files named OpenSim.ScriptEngine.*.dll
|
||||
Load(".", "OpenSim.ScriptEngine.*.dll");
|
||||
}
|
||||
|
||||
public void Initialise(OpenSimBase openSim)
|
||||
{
|
||||
|
||||
// Our objective: Load component .dll's
|
||||
m_OpenSim = openSim;
|
||||
pluginLoader = new ComponentLoader(this);
|
||||
|
||||
m_log.Info("[" + Name + "]: Script Engine Component System");
|
||||
m_log.Info("[" + Name + "]: Loading Script Engine Components");
|
||||
pluginLoader.Load("ScriptEngines");
|
||||
|
||||
//m_OpenSim.Shutdown();
|
||||
}
|
||||
|
||||
private readonly static string nameIScriptEngineComponent = typeof(IScriptEngineComponent).Name; // keep interface name in managed code
|
||||
private readonly static string nameIScriptEngine = typeof(IScriptEngine).Name; // keep interface name in managed code
|
||||
/// <summary>
|
||||
/// Load components from directory
|
||||
/// </summary>
|
||||
/// <param name="directory"></param>
|
||||
public void Load(string directory, string filter)
|
||||
{
|
||||
// We may want to change how this functions as currently it required unique class names for each component
|
||||
|
||||
foreach (string file in Directory.GetFiles(directory, filter))
|
||||
{
|
||||
//m_log.DebugFormat("[ScriptEngine]: Loading: [{0}].", file);
|
||||
Assembly componentAssembly = null;
|
||||
try
|
||||
{
|
||||
componentAssembly = Assembly.LoadFrom(file);
|
||||
} catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[{0}] Error loading: \"{1}\".", Name, file);
|
||||
}
|
||||
if (componentAssembly != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Go through all types in the assembly
|
||||
foreach (Type componentType in componentAssembly.GetTypes())
|
||||
{
|
||||
if (componentType.IsPublic
|
||||
&& !componentType.IsAbstract)
|
||||
{
|
||||
//if (componentType.IsSubclassOf(typeof(ComponentBase)))
|
||||
if (componentType.GetInterface(nameIScriptEngineComponent) != null)
|
||||
{
|
||||
// We have found an type which is derived from ProdiverBase, add it to provider list
|
||||
m_log.InfoFormat("[{0}] Adding component: {1}", Name, componentType.Name);
|
||||
lock (providers)
|
||||
{
|
||||
providers.Add(componentType.Name, componentType);
|
||||
}
|
||||
}
|
||||
//if (componentType.IsSubclassOf(typeof(ScriptEngineBase)))
|
||||
if (componentType.GetInterface(nameIScriptEngine) != null)
|
||||
{
|
||||
// We have found an type which is derived from RegionScriptEngineBase, add it to engine list
|
||||
m_log.InfoFormat("[{0}] Adding script engine: {1}", Name, componentType.Name);
|
||||
lock (scriptEngines)
|
||||
{
|
||||
scriptEngines.Add(componentType.Name, componentType);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
(ReflectionTypeLoadException re)
|
||||
{
|
||||
m_log.ErrorFormat("[{0}] Could not load component \"{1}\": {2}", Name, componentAssembly.FullName, re.ToString());
|
||||
int c = 0;
|
||||
foreach (Exception e in re.LoaderExceptions)
|
||||
{
|
||||
c++;
|
||||
m_log.ErrorFormat("[{0}] LoaderException {1}: {2}", Name, c, e.ToString());
|
||||
}
|
||||
}
|
||||
} //if
|
||||
} //foreach
|
||||
}
|
||||
|
||||
public static IScriptEngineComponent GetComponentInstance(string name, params Object[] args)
|
||||
{
|
||||
if (!providers.ContainsKey(name))
|
||||
throw new Exception("ScriptEngine requested component named \"" + name +
|
||||
"\" that does not exist.");
|
||||
|
||||
return Activator.CreateInstance(providers[name], args) as IScriptEngineComponent;
|
||||
}
|
||||
|
||||
private readonly static string nameIScriptEngineRegionComponent = typeof(IScriptEngineRegionComponent).Name; // keep interface name in managed code
|
||||
public static IScriptEngineComponent GetComponentInstance(RegionInfoStructure info, string name, params Object[] args)
|
||||
{
|
||||
IScriptEngineComponent c = GetComponentInstance(name, args);
|
||||
|
||||
// If module is IScriptEngineRegionComponent then it will have one instance per region and we will initialize it
|
||||
if (c.GetType().GetInterface(nameIScriptEngineRegionComponent) != null)
|
||||
((IScriptEngineRegionComponent)c).Initialize(info);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
#region IApplicationPlugin stuff
|
||||
/// <summary>
|
||||
/// Returns the plugin version
|
||||
@@ -65,16 +179,13 @@ namespace OpenSim.ApplicationPlugins.ScriptEngine
|
||||
/// <returns>Plugin name, eg MySQL User Provider</returns>
|
||||
public string Name
|
||||
{
|
||||
get { return "ScriptEngine"; }
|
||||
get { return "SECS"; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Default-initialises the plugin
|
||||
/// </summary>
|
||||
public void Initialise()
|
||||
{
|
||||
//throw new NotImplementedException();
|
||||
}
|
||||
public void Initialise() { }
|
||||
|
||||
///<summary>
|
||||
///Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
|
||||
@@ -85,5 +196,6 @@ namespace OpenSim.ApplicationPlugins.ScriptEngine
|
||||
//throw new NotImplementedException();
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user