diff options
Diffstat (limited to '')
12 files changed, 218 insertions, 458 deletions
diff --git a/OpenSim/ApplicationPlugins/ScriptEngine/ComponentLoader.cs b/OpenSim/ApplicationPlugins/ScriptEngine/ComponentLoader.cs deleted file mode 100644 index d2e3cd0..0000000 --- a/OpenSim/ApplicationPlugins/ScriptEngine/ComponentLoader.cs +++ /dev/null | |||
@@ -1,101 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | using System.Collections.Generic; | ||
29 | using System.IO; | ||
30 | using System.Reflection; | ||
31 | using System.Text; | ||
32 | using log4net; | ||
33 | using OpenSim.ApplicationPlugins.ScriptEngine.Components; | ||
34 | |||
35 | namespace OpenSim.ApplicationPlugins.ScriptEngine | ||
36 | { | ||
37 | /// <summary> | ||
38 | /// Used to load ScriptEngine component .dll's | ||
39 | /// </summary> | ||
40 | internal class ComponentLoader | ||
41 | { | ||
42 | internal static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
43 | //private ScriptEnginePlugin scriptEnginePlugin; | ||
44 | public ComponentLoader(ScriptEnginePlugin sep) | ||
45 | { | ||
46 | //scriptEnginePlugin = sep; | ||
47 | } | ||
48 | |||
49 | /// <summary> | ||
50 | /// Load components from directory | ||
51 | /// </summary> | ||
52 | /// <param name="directory"></param> | ||
53 | public void Load(string directory) | ||
54 | { | ||
55 | // We may want to change how this functions as currently it required unique class names for each component | ||
56 | |||
57 | foreach (string file in Directory.GetFiles(directory, "*.dll")) | ||
58 | { | ||
59 | //m_log.DebugFormat("[ScriptEngine]: Loading: [{0}].", file); | ||
60 | Assembly componentAssembly = Assembly.LoadFrom(file); | ||
61 | if (componentAssembly != null) | ||
62 | { | ||
63 | try | ||
64 | { | ||
65 | // Go through all types in the assembly | ||
66 | foreach (Type componentType in componentAssembly.GetTypes()) | ||
67 | { | ||
68 | if (componentType.IsPublic | ||
69 | && !componentType.IsAbstract) | ||
70 | { | ||
71 | if (componentType.IsSubclassOf(typeof (ComponentBase))) | ||
72 | { | ||
73 | // We have found an type which is derived from ProdiverBase, add it to provider list | ||
74 | m_log.InfoFormat("[ScriptEngine]: Adding component: {0}", componentType.Name); | ||
75 | lock (ComponentRegistry.providers) | ||
76 | { | ||
77 | ComponentRegistry.providers.Add(componentType.Name, componentType); | ||
78 | } | ||
79 | } | ||
80 | if (componentType.IsSubclassOf(typeof(RegionScriptEngineBase))) | ||
81 | { | ||
82 | // We have found an type which is derived from RegionScriptEngineBase, add it to engine list | ||
83 | m_log.InfoFormat("[ScriptEngine]: Adding script engine: {0}", componentType.Name); | ||
84 | lock (ComponentRegistry.scriptEngines) | ||
85 | { | ||
86 | ComponentRegistry.scriptEngines.Add(componentType.Name, componentType); | ||
87 | } | ||
88 | } | ||
89 | } | ||
90 | } | ||
91 | } | ||
92 | catch | ||
93 | (ReflectionTypeLoadException) | ||
94 | { | ||
95 | m_log.InfoFormat("[ScriptEngine]: Could not load types for [{0}].", componentAssembly.FullName); | ||
96 | } | ||
97 | } //if | ||
98 | } //foreach | ||
99 | } | ||
100 | } | ||
101 | } \ No newline at end of file | ||
diff --git a/OpenSim/ApplicationPlugins/ScriptEngine/ComponentRegistry.cs b/OpenSim/ApplicationPlugins/ScriptEngine/ComponentRegistry.cs deleted file mode 100644 index 5ffa490..0000000 --- a/OpenSim/ApplicationPlugins/ScriptEngine/ComponentRegistry.cs +++ /dev/null | |||
@@ -1,68 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | using System.Collections.Generic; | ||
29 | using System.Text; | ||
30 | using OpenSim.ApplicationPlugins.ScriptEngine; | ||
31 | using OpenSim.ApplicationPlugins.ScriptEngine.Components; | ||
32 | |||
33 | namespace OpenSim.ApplicationPlugins.ScriptEngine | ||
34 | { | ||
35 | /// <summary> | ||
36 | /// Component providers | ||
37 | /// This is where any component (any part) of the Script Engine Component System (SECS) registers. | ||
38 | /// Nothing is instanciated at this point. The modules just need to register here to be available for any script engine. | ||
39 | /// </summary> | ||
40 | public static class ComponentRegistry | ||
41 | { | ||
42 | // Component providers are registered here wit a name (string) | ||
43 | // When a script engine is created the components are instanciated | ||
44 | public static Dictionary<string, Type> providers = new Dictionary<string, Type>(); | ||
45 | public static Dictionary<string, Type> scriptEngines = new Dictionary<string, Type>(); | ||
46 | |||
47 | ///// <summary> | ||
48 | ///// Returns a list of ProviderBase objects which has been instanciated by their name | ||
49 | ///// </summary> | ||
50 | ///// <param name="Providers">List of Script Engine Components</param> | ||
51 | ///// <returns></returns> | ||
52 | //public static List<ComponentBase> GetComponents(string[] Providers) | ||
53 | //{ | ||
54 | // List<ComponentBase> pbl = new List<ComponentBase>(); | ||
55 | // if (Providers != null) | ||
56 | // { | ||
57 | // foreach (string p in Providers) | ||
58 | // { | ||
59 | // if (providers.ContainsKey(p)) | ||
60 | // pbl.Add(Activator.CreateInstance(providers[p]) as ComponentBase); | ||
61 | // } | ||
62 | // } | ||
63 | |||
64 | // return pbl; | ||
65 | //} | ||
66 | |||
67 | } | ||
68 | } \ No newline at end of file | ||
diff --git a/OpenSim/ApplicationPlugins/ScriptEngine/RegionScriptEnginePlugin.cs b/OpenSim/ApplicationPlugins/ScriptEngine/RegionEngineLoader.cs index e6def85..115d237 100644 --- a/OpenSim/ApplicationPlugins/ScriptEngine/RegionScriptEnginePlugin.cs +++ b/OpenSim/ApplicationPlugins/ScriptEngine/RegionEngineLoader.cs | |||
@@ -26,45 +26,51 @@ | |||
26 | */ | 26 | */ |
27 | using System; | 27 | using System; |
28 | using System.Collections.Generic; | 28 | using System.Collections.Generic; |
29 | using System.Reflection; | ||
29 | using System.Text; | 30 | using System.Text; |
31 | using log4net; | ||
30 | using Nini.Config; | 32 | using Nini.Config; |
31 | using OpenSim.Region.Environment.Interfaces; | 33 | using OpenSim.Region.Environment.Interfaces; |
32 | using OpenSim.Region.Environment.Scenes; | 34 | using OpenSim.Region.Environment.Scenes; |
35 | using OpenSim.ScriptEngine.Shared; | ||
33 | 36 | ||
34 | namespace OpenSim.ApplicationPlugins.ScriptEngine | 37 | namespace OpenSim.ApplicationPlugins.ScriptEngine |
35 | { | 38 | { |
36 | public class RegionScriptEnginePlugin : IRegionModule | 39 | public class RegionEngineLoader : IRegionModule |
37 | { | 40 | { |
38 | // This is a region module. | 41 | // This is a region module. |
39 | // This means: Every time a new region is created, a new instance of this module is also created. | 42 | // This means: Every time a new region is created, a new instance of this module is also created. |
40 | // This module is responsible for starting the script engine for this region. | 43 | // This module is responsible for starting the script engine for this region. |
44 | public string Name { get { return "SECS.DotNetEngine.Scheduler.RegionLoader"; } } | ||
45 | public bool IsSharedModule { get { return true; } } | ||
41 | 46 | ||
47 | internal static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
42 | private string tempScriptEngineName = "DotNetEngine"; | 48 | private string tempScriptEngineName = "DotNetEngine"; |
43 | public RegionScriptEngineBase scriptEngine; | 49 | public IScriptEngine scriptEngine; |
50 | public IConfigSource ConfigSource; | ||
51 | public IConfig ScriptConfigSource; | ||
44 | public void Initialise(Scene scene, IConfigSource source) | 52 | public void Initialise(Scene scene, IConfigSource source) |
45 | { | 53 | { |
46 | return; | ||
47 | // New region is being created | 54 | // New region is being created |
48 | // Create a new script engine | 55 | // Create a new script engine |
49 | // try | 56 | // Make sure we have config |
50 | // { | 57 | if (ConfigSource.Configs["SECS"] == null) |
51 | // lock (ComponentRegistry.scriptEngines) | 58 | ConfigSource.AddConfig("SECS"); |
52 | // { | 59 | ScriptConfigSource = ConfigSource.Configs["SECS"]; |
53 | // scriptEngine = | 60 | |
54 | // Activator.CreateInstance(ComponentRegistry.scriptEngines[tempScriptEngineName]) as | 61 | // Is SECS enabled? |
55 | // RegionScriptEngineBase; | 62 | if (ScriptConfigSource.GetBoolean("Enabled", false)) |
56 | // } | 63 | { |
57 | // scriptEngine.Initialize(scene, source); | 64 | LoadEngine(); |
58 | // } | 65 | if (scriptEngine != null) |
59 | // catch (Exception ex) | 66 | scriptEngine.Initialise(scene, source); |
60 | // { | 67 | } |
61 | // scriptEngine.m_log.Error("[ScriptEngine]: Unable to load engine \"" + tempScriptEngineName + "\": " + ex.ToString()); | ||
62 | // } | ||
63 | } | 68 | } |
64 | 69 | ||
65 | public void PostInitialise() | 70 | public void PostInitialise() |
66 | { | 71 | { |
67 | // Nothing | 72 | if (scriptEngine != null) |
73 | scriptEngine.PostInitialise(); | ||
68 | } | 74 | } |
69 | 75 | ||
70 | public void Close() | 76 | public void Close() |
@@ -76,18 +82,34 @@ namespace OpenSim.ApplicationPlugins.ScriptEngine | |||
76 | } | 82 | } |
77 | catch (Exception ex) | 83 | catch (Exception ex) |
78 | { | 84 | { |
79 | scriptEngine.m_log.Error("[ScriptEngine]: Unable to close engine \"" + tempScriptEngineName + "\": " + ex.ToString()); | 85 | m_log.ErrorFormat("[{0}] Unable to close engine \"{1}\": {2}", Name, tempScriptEngineName, ex.ToString()); |
80 | } | 86 | } |
81 | } | 87 | } |
82 | 88 | ||
83 | public string Name | 89 | private void LoadEngine() |
84 | { | 90 | { |
85 | get { return "ScriptEngine Region Loader"; } | 91 | m_log.DebugFormat("[{0}] Loading region script engine engine \"{1}\".", Name, tempScriptEngineName); |
92 | try | ||
93 | { | ||
94 | lock (ScriptEnginePlugin.scriptEngines) | ||
95 | { | ||
96 | if (!ScriptEnginePlugin.scriptEngines.ContainsKey(tempScriptEngineName)) | ||
97 | { | ||
98 | m_log.ErrorFormat("[{0}] Unable to load region script engine: Script engine \"{1}\" does not exist.", Name, tempScriptEngineName); | ||
99 | } | ||
100 | else | ||
101 | { | ||
102 | scriptEngine = | ||
103 | Activator.CreateInstance(ScriptEnginePlugin.scriptEngines[tempScriptEngineName]) as | ||
104 | IScriptEngine; | ||
105 | } | ||
106 | } | ||
107 | } | ||
108 | catch (Exception ex) | ||
109 | { | ||
110 | m_log.ErrorFormat("[{0}] Internal error loading region script engine \"{1}\": {2}", Name, tempScriptEngineName, ex.ToString()); | ||
111 | } | ||
86 | } | 112 | } |
87 | 113 | ||
88 | public bool IsSharedModule | ||
89 | { | ||
90 | get { return true; } | ||
91 | } | ||
92 | } | 114 | } |
93 | } | 115 | } |
diff --git a/OpenSim/ApplicationPlugins/ScriptEngine/RegionScriptEngineBase.cs b/OpenSim/ApplicationPlugins/ScriptEngine/RegionScriptEngineBase.cs deleted file mode 100644 index 89a90ae..0000000 --- a/OpenSim/ApplicationPlugins/ScriptEngine/RegionScriptEngineBase.cs +++ /dev/null | |||
@@ -1,182 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | using System.Collections.Generic; | ||
29 | using System.Reflection; | ||
30 | using System.Text; | ||
31 | using log4net; | ||
32 | using Nini.Config; | ||
33 | using OpenSim.ApplicationPlugins.ScriptEngine.Components; | ||
34 | using OpenSim.Region.Environment.Scenes; | ||
35 | |||
36 | namespace OpenSim.ApplicationPlugins.ScriptEngine | ||
37 | { | ||
38 | public abstract class RegionScriptEngineBase | ||
39 | { | ||
40 | |||
41 | /// <summary> | ||
42 | /// Called on region initialize | ||
43 | /// </summary> | ||
44 | public abstract void Initialize(); | ||
45 | public abstract string Name { get; } | ||
46 | /// <summary> | ||
47 | /// Called before components receive Close() | ||
48 | /// </summary> | ||
49 | public abstract void PreClose(); | ||
50 | // Hold list of all the different components we have working for us | ||
51 | public List<ComponentBase> Components = new List<ComponentBase>(); | ||
52 | |||
53 | public Scene m_Scene; | ||
54 | public IConfigSource m_ConfigSource; | ||
55 | public readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
56 | |||
57 | public void Initialize(Scene scene, IConfigSource source) | ||
58 | { | ||
59 | // Region started | ||
60 | m_Scene = scene; | ||
61 | m_ConfigSource = source; | ||
62 | Initialize(); | ||
63 | } | ||
64 | |||
65 | /// <summary> | ||
66 | /// Creates instances of script engine components inside "components" List | ||
67 | /// </summary> | ||
68 | /// <param name="ComponentList">Array of comonent names to initialize</param> | ||
69 | public void InitializeComponents(string[] ComponentList) | ||
70 | { | ||
71 | // Take list of providers to initialize and make instances of them | ||
72 | foreach (string c in ComponentList) | ||
73 | { | ||
74 | m_log.Info("[" + Name + "]: Loading: " + c); | ||
75 | lock (Components) | ||
76 | { | ||
77 | lock (ComponentRegistry.providers) | ||
78 | { | ||
79 | try | ||
80 | { | ||
81 | if (ComponentRegistry.providers.ContainsKey(c)) | ||
82 | Components.Add(Activator.CreateInstance(ComponentRegistry.providers[c]) as ComponentBase); | ||
83 | else | ||
84 | m_log.Error("[" + Name + "]: Component \"" + c + "\" not found, can not load"); | ||
85 | } | ||
86 | catch (Exception ex) | ||
87 | { | ||
88 | m_log.Error("[" + Name + "]: Exception loading \"" + c + "\": " + ex.ToString()); | ||
89 | } | ||
90 | } | ||
91 | } | ||
92 | } | ||
93 | |||
94 | |||
95 | // Run Initialize on all our providers, hand over a reference of ourself. | ||
96 | foreach (ComponentBase p in Components.ToArray()) | ||
97 | { | ||
98 | try | ||
99 | { | ||
100 | p.Initialize(this); | ||
101 | } | ||
102 | catch (Exception ex) | ||
103 | { | ||
104 | lock (Components) | ||
105 | { | ||
106 | m_log.Error("[" + Name + "]: Error initializing \"" + p.GetType().FullName + "\": " + | ||
107 | ex.ToString()); | ||
108 | if (Components.Contains(p)) | ||
109 | Components.Remove(p); | ||
110 | } | ||
111 | } | ||
112 | } | ||
113 | // All modules has been initialized, call Start() on them. | ||
114 | foreach (ComponentBase p in Components.ToArray()) | ||
115 | { | ||
116 | try | ||
117 | { | ||
118 | p.Start(); | ||
119 | } | ||
120 | catch (Exception ex) | ||
121 | { | ||
122 | lock (Components) | ||
123 | { | ||
124 | m_log.Error("[" + Name + "]: Error starting \"" + p.GetType().FullName + "\": " + ex.ToString()); | ||
125 | if (Components.Contains(p)) | ||
126 | Components.Remove(p); | ||
127 | } | ||
128 | } | ||
129 | } | ||
130 | |||
131 | } | ||
132 | |||
133 | #region Functions to return lists based on type | ||
134 | // Predicate for searching List for a certain type | ||
135 | private static bool FindType<T>(ComponentBase pb) | ||
136 | { | ||
137 | if (pb.GetType() is T) | ||
138 | return true; | ||
139 | return false; | ||
140 | } | ||
141 | public List<ComponentBase> GetCommandComponentList() | ||
142 | { | ||
143 | return Components.FindAll(FindType<CommandBase>); | ||
144 | } | ||
145 | public List<ComponentBase> GetCompilerComponentList() | ||
146 | { | ||
147 | return Components.FindAll(FindType<CompilerBase>); | ||
148 | } | ||
149 | public List<ComponentBase> GetEventComponentList() | ||
150 | { | ||
151 | return Components.FindAll(FindType<EventBase>); | ||
152 | } | ||
153 | public List<ComponentBase> GetScheduleComponentList() | ||
154 | { | ||
155 | return Components.FindAll(FindType<SchedulerBase>); | ||
156 | } | ||
157 | |||
158 | #endregion | ||
159 | |||
160 | public void Close() | ||
161 | { | ||
162 | // We need to shut down | ||
163 | |||
164 | // First call abstracted PreClose() | ||
165 | PreClose(); | ||
166 | |||
167 | // Then Call Close() on all components | ||
168 | foreach (ComponentBase p in Components.ToArray()) | ||
169 | { | ||
170 | try | ||
171 | { | ||
172 | p.Close(); | ||
173 | } | ||
174 | catch (Exception) | ||
175 | { | ||
176 | // TODO: Print error to console | ||
177 | } | ||
178 | } | ||
179 | } | ||
180 | } | ||
181 | } | ||
182 | |||
diff --git a/OpenSim/ApplicationPlugins/ScriptEngine/Resources/ScriptEngine.addin.xml b/OpenSim/ApplicationPlugins/ScriptEngine/Resources/ScriptEngine.addin.xml deleted file mode 100644 index 38f6eb0..0000000 --- a/OpenSim/ApplicationPlugins/ScriptEngine/Resources/ScriptEngine.addin.xml +++ /dev/null | |||
@@ -1,12 +0,0 @@ | |||
1 | <Addin id="ScriptEngine" version="0.1"> | ||
2 | <Runtime> | ||
3 | <Import assembly="OpenSim.ApplicationPlugins.ScriptEngine.dll" /> | ||
4 | </Runtime> | ||
5 | <Dependencies> | ||
6 | <Addin id="OpenSim" version="0.5" /> | ||
7 | <Addin id="RegionProxy" version="0.1" /> | ||
8 | </Dependencies> | ||
9 | <Extension path="/OpenSim/Startup"> | ||
10 | <Plugin id="ScriptEngine" type="OpenSim.ApplicationPlugins.ScriptEngine.ScriptEnginePlugin" /> | ||
11 | </Extension> | ||
12 | </Addin> | ||
diff --git a/OpenSim/ApplicationPlugins/ScriptEngine/Resources/ScriptEnginePlugin.addin.xml b/OpenSim/ApplicationPlugins/ScriptEngine/Resources/ScriptEnginePlugin.addin.xml new file mode 100644 index 0000000..f067bf4 --- /dev/null +++ b/OpenSim/ApplicationPlugins/ScriptEngine/Resources/ScriptEnginePlugin.addin.xml | |||
@@ -0,0 +1,11 @@ | |||
1 | <Addin id="OpenSim.ApplicationPlugins.ScriptEngine" version="0.1"> | ||
2 | <Runtime> | ||
3 | <Import assembly="OpenSim.ApplicationPlugins.ScriptEngine.dll" /> | ||
4 | </Runtime> | ||
5 | <Dependencies> | ||
6 | <Addin id="OpenSim" version="0.5" /> | ||
7 | </Dependencies> | ||
8 | <Extension path = "/OpenSim/Startup"> | ||
9 | <Plugin id="ScriptEnginePlugin" type="OpenSim.ApplicationPlugins.ScriptEngine.ScriptEnginePlugin" /> | ||
10 | </Extension> | ||
11 | </Addin> | ||
diff --git a/OpenSim/ApplicationPlugins/ScriptEngine/ScriptEnginePlugin.cs b/OpenSim/ApplicationPlugins/ScriptEngine/ScriptEnginePlugin.cs index 32c7748..f81b848 100644 --- a/OpenSim/ApplicationPlugins/ScriptEngine/ScriptEnginePlugin.cs +++ b/OpenSim/ApplicationPlugins/ScriptEngine/ScriptEnginePlugin.cs | |||
@@ -26,29 +26,143 @@ | |||
26 | */ | 26 | */ |
27 | using System; | 27 | using System; |
28 | using System.Collections.Generic; | 28 | using System.Collections.Generic; |
29 | using System.IO; | ||
29 | using System.Reflection; | 30 | using System.Reflection; |
30 | using System.Text; | 31 | using System.Text; |
32 | using System.Threading; | ||
33 | using OpenSim.ScriptEngine.Shared; | ||
31 | using log4net; | 34 | using log4net; |
32 | 35 | ||
33 | namespace OpenSim.ApplicationPlugins.ScriptEngine | 36 | namespace OpenSim.ApplicationPlugins.ScriptEngine |
34 | { | 37 | { |
38 | /// <summary> | ||
39 | /// Loads all Script Engine Components | ||
40 | /// </summary> | ||
35 | public class ScriptEnginePlugin : IApplicationPlugin | 41 | public class ScriptEnginePlugin : IApplicationPlugin |
36 | { | 42 | { |
37 | internal static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 43 | internal static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
38 | internal OpenSimBase m_OpenSim; | 44 | internal OpenSimBase m_OpenSim; |
39 | private ComponentLoader pluginLoader; | 45 | |
46 | // Component providers are registered here wit a name (string) | ||
47 | // When a script engine is created the components are instanciated | ||
48 | public static Dictionary<string, Type> providers = new Dictionary<string, Type>(); | ||
49 | public static Dictionary<string, Type> scriptEngines = new Dictionary<string, Type>(); | ||
50 | |||
51 | |||
52 | public ScriptEnginePlugin() | ||
53 | { | ||
54 | // Application startup | ||
55 | #if DEBUG | ||
56 | m_log.InfoFormat("[{0}] ##################################", Name); | ||
57 | m_log.InfoFormat("[{0}] # Script Engine Component System #", Name); | ||
58 | m_log.InfoFormat("[{0}] ##################################", Name); | ||
59 | #else | ||
60 | m_log.InfoFormat("[{0}] Script Engine Component System", Name); | ||
61 | #endif | ||
62 | |||
63 | // Load all modules from current directory | ||
64 | // We only want files named OpenSim.ScriptEngine.*.dll | ||
65 | Load(".", "OpenSim.ScriptEngine.*.dll"); | ||
66 | } | ||
40 | 67 | ||
41 | public void Initialise(OpenSimBase openSim) | 68 | public void Initialise(OpenSimBase openSim) |
42 | { | 69 | { |
70 | |||
43 | // Our objective: Load component .dll's | 71 | // Our objective: Load component .dll's |
44 | m_OpenSim = openSim; | 72 | m_OpenSim = openSim; |
45 | pluginLoader = new ComponentLoader(this); | 73 | //m_OpenSim.Shutdown(); |
74 | } | ||
75 | |||
76 | private readonly static string nameIScriptEngineComponent = typeof(IScriptEngineComponent).Name; // keep interface name in managed code | ||
77 | private readonly static string nameIScriptEngine = typeof(IScriptEngine).Name; // keep interface name in managed code | ||
78 | /// <summary> | ||
79 | /// Load components from directory | ||
80 | /// </summary> | ||
81 | /// <param name="directory"></param> | ||
82 | public void Load(string directory, string filter) | ||
83 | { | ||
84 | // We may want to change how this functions as currently it required unique class names for each component | ||
85 | |||
86 | foreach (string file in Directory.GetFiles(directory, filter)) | ||
87 | { | ||
88 | //m_log.DebugFormat("[ScriptEngine]: Loading: [{0}].", file); | ||
89 | Assembly componentAssembly = null; | ||
90 | try | ||
91 | { | ||
92 | componentAssembly = Assembly.LoadFrom(file); | ||
93 | } catch (Exception e) | ||
94 | { | ||
95 | m_log.ErrorFormat("[{0}] Error loading: \"{1}\".", Name, file); | ||
96 | } | ||
97 | if (componentAssembly != null) | ||
98 | { | ||
99 | try | ||
100 | { | ||
101 | // Go through all types in the assembly | ||
102 | foreach (Type componentType in componentAssembly.GetTypes()) | ||
103 | { | ||
104 | if (componentType.IsPublic | ||
105 | && !componentType.IsAbstract) | ||
106 | { | ||
107 | //if (componentType.IsSubclassOf(typeof(ComponentBase))) | ||
108 | if (componentType.GetInterface(nameIScriptEngineComponent) != null) | ||
109 | { | ||
110 | // We have found an type which is derived from ProdiverBase, add it to provider list | ||
111 | m_log.InfoFormat("[{0}] Adding component: {1}", Name, componentType.Name); | ||
112 | lock (providers) | ||
113 | { | ||
114 | providers.Add(componentType.Name, componentType); | ||
115 | } | ||
116 | } | ||
117 | //if (componentType.IsSubclassOf(typeof(ScriptEngineBase))) | ||
118 | if (componentType.GetInterface(nameIScriptEngine) != null) | ||
119 | { | ||
120 | // We have found an type which is derived from RegionScriptEngineBase, add it to engine list | ||
121 | m_log.InfoFormat("[{0}] Adding script engine: {1}", Name, componentType.Name); | ||
122 | lock (scriptEngines) | ||
123 | { | ||
124 | scriptEngines.Add(componentType.Name, componentType); | ||
125 | } | ||
126 | } | ||
127 | } | ||
128 | } | ||
129 | } | ||
130 | catch | ||
131 | (ReflectionTypeLoadException re) | ||
132 | { | ||
133 | m_log.ErrorFormat("[{0}] Could not load component \"{1}\": {2}", Name, componentAssembly.FullName, re.ToString()); | ||
134 | int c = 0; | ||
135 | foreach (Exception e in re.LoaderExceptions) | ||
136 | { | ||
137 | c++; | ||
138 | m_log.ErrorFormat("[{0}] LoaderException {1}: {2}", Name, c, e.ToString()); | ||
139 | } | ||
140 | } | ||
141 | } //if | ||
142 | } //foreach | ||
143 | } | ||
144 | |||
145 | public static IScriptEngineComponent GetComponentInstance(string name, params Object[] args) | ||
146 | { | ||
147 | if (!providers.ContainsKey(name)) | ||
148 | throw new Exception("ScriptEngine requested component named \"" + name + | ||
149 | "\" that does not exist."); | ||
46 | 150 | ||
47 | m_log.Info("[" + Name + "]: Script Engine Component System"); | 151 | return Activator.CreateInstance(providers[name], args) as IScriptEngineComponent; |
48 | m_log.Info("[" + Name + "]: Loading Script Engine Components"); | ||
49 | pluginLoader.Load("ScriptEngines"); | ||
50 | |||
51 | } | 152 | } |
153 | |||
154 | private readonly static string nameIScriptEngineRegionComponent = typeof(IScriptEngineRegionComponent).Name; // keep interface name in managed code | ||
155 | public static IScriptEngineComponent GetComponentInstance(RegionInfoStructure info, string name, params Object[] args) | ||
156 | { | ||
157 | IScriptEngineComponent c = GetComponentInstance(name, args); | ||
158 | |||
159 | // If module is IScriptEngineRegionComponent then it will have one instance per region and we will initialize it | ||
160 | if (c.GetType().GetInterface(nameIScriptEngineRegionComponent) != null) | ||
161 | ((IScriptEngineRegionComponent)c).Initialize(info); | ||
162 | |||
163 | return c; | ||
164 | } | ||
165 | |||
52 | #region IApplicationPlugin stuff | 166 | #region IApplicationPlugin stuff |
53 | /// <summary> | 167 | /// <summary> |
54 | /// Returns the plugin version | 168 | /// Returns the plugin version |
@@ -65,16 +179,13 @@ namespace OpenSim.ApplicationPlugins.ScriptEngine | |||
65 | /// <returns>Plugin name, eg MySQL User Provider</returns> | 179 | /// <returns>Plugin name, eg MySQL User Provider</returns> |
66 | public string Name | 180 | public string Name |
67 | { | 181 | { |
68 | get { return "ScriptEngine"; } | 182 | get { return "SECS"; } |
69 | } | 183 | } |
70 | 184 | ||
71 | /// <summary> | 185 | /// <summary> |
72 | /// Default-initialises the plugin | 186 | /// Default-initialises the plugin |
73 | /// </summary> | 187 | /// </summary> |
74 | public void Initialise() | 188 | public void Initialise() { } |
75 | { | ||
76 | //throw new NotImplementedException(); | ||
77 | } | ||
78 | 189 | ||
79 | ///<summary> | 190 | ///<summary> |
80 | ///Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. | 191 | ///Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. |
@@ -85,5 +196,6 @@ namespace OpenSim.ApplicationPlugins.ScriptEngine | |||
85 | //throw new NotImplementedException(); | 196 | //throw new NotImplementedException(); |
86 | } | 197 | } |
87 | #endregion | 198 | #endregion |
199 | |||
88 | } | 200 | } |
89 | } | 201 | } |
diff --git a/OpenSim/ApplicationPlugins/ScriptEngine/Components/ComponentBase.cs b/OpenSim/ScriptEngine/Components/DotNetEngine/Compilers/Compiler_YP.cs index 48c6bfe..c81ad76 100644 --- a/OpenSim/ApplicationPlugins/ScriptEngine/Components/ComponentBase.cs +++ b/OpenSim/ScriptEngine/Components/DotNetEngine/Compilers/Compiler_YP.cs | |||
@@ -26,28 +26,30 @@ | |||
26 | */ | 26 | */ |
27 | using System; | 27 | using System; |
28 | using System.Collections.Generic; | 28 | using System.Collections.Generic; |
29 | using System.Reflection; | ||
29 | using System.Text; | 30 | using System.Text; |
31 | using OpenSim.ScriptEngine.Components.DotNetEngine.Compilers.YP; | ||
32 | using OpenSim.ScriptEngine.Shared; | ||
30 | 33 | ||
31 | namespace OpenSim.ApplicationPlugins.ScriptEngine.Components | 34 | namespace OpenSim.ScriptEngine.Components.DotNetEngine.Compilers |
32 | { | 35 | { |
33 | /// <summary> | 36 | public class Compiler_YP: IScriptCompiler |
34 | /// Generic baseclass for component providers | ||
35 | /// </summary> | ||
36 | public abstract class ComponentBase //: iProviderBase | ||
37 | { | 37 | { |
38 | //public abstract iProviderBase CreateInstance(); | 38 | |
39 | public abstract void Start(); | 39 | private readonly Compiler_CS m_Compiler_CS = new Compiler_CS(); |
40 | public abstract void Close(); | 40 | |
41 | public RegionScriptEngineBase scriptEngine; | 41 | public string Compile(ScriptMetaData scriptMetaData, ref string script) |
42 | public void Initialize(RegionScriptEngineBase ScriptEngine) | ||
43 | { | 42 | { |
44 | scriptEngine = ScriptEngine; | 43 | // Convert script to CS |
44 | string scriptCS = YP2CS.Convert(ref script); | ||
45 | // Use CS compiler to compile it | ||
46 | return m_Compiler_CS.Compile(scriptMetaData, ref scriptCS); | ||
45 | } | 47 | } |
46 | 48 | ||
47 | static ComponentBase() | 49 | public string PreProcessScript(ref string script) |
48 | { | 50 | { |
49 | // We got loaded -- should we register now? | 51 | // This is handled by our converter |
50 | //OpenSim.ApplicationPlugins.ScriptEngine.ComponentProviders.providers.Add(GetType()); | 52 | return script; |
51 | } | 53 | } |
52 | } | 54 | } |
53 | } \ No newline at end of file | 55 | } |
diff --git a/OpenSim/ApplicationPlugins/ScriptEngine/Components/EventBase.cs b/OpenSim/ScriptEngine/Shared/IScriptCompiler.cs index 1c0fd52..3bc0c03 100644 --- a/OpenSim/ApplicationPlugins/ScriptEngine/Components/EventBase.cs +++ b/OpenSim/ScriptEngine/Shared/IScriptCompiler.cs | |||
@@ -26,20 +26,15 @@ | |||
26 | */ | 26 | */ |
27 | using System; | 27 | using System; |
28 | using System.Collections.Generic; | 28 | using System.Collections.Generic; |
29 | using System.Reflection; | ||
29 | using System.Text; | 30 | using System.Text; |
31 | using ScriptAssemblies; | ||
30 | 32 | ||
31 | namespace OpenSim.ApplicationPlugins.ScriptEngine.Components | 33 | namespace OpenSim.ScriptEngine.Shared |
32 | { | 34 | { |
33 | public abstract class EventBase : ComponentBase | 35 | public interface IScriptCompiler : IScriptEngineComponent |
34 | { | 36 | { |
35 | //public override iProviderBase CreateInstance() | 37 | string Compile(ScriptMetaData scriptMetaData, ref string script); |
36 | //{ | 38 | string PreProcessScript(ref string script); |
37 | // throw new NotImplementedException(); | ||
38 | //} | ||
39 | |||
40 | //public override void Start() | ||
41 | //{ | ||
42 | // throw new NotImplementedException(); | ||
43 | //} | ||
44 | } | 39 | } |
45 | } \ No newline at end of file | 40 | } \ No newline at end of file |
diff --git a/OpenSim/ApplicationPlugins/ScriptEngine/Components/CommandBase.cs b/OpenSim/ScriptEngine/Shared/IScriptEngineComponent.cs index 4708554..3c977a5 100644 --- a/OpenSim/ApplicationPlugins/ScriptEngine/Components/CommandBase.cs +++ b/OpenSim/ScriptEngine/Shared/IScriptEngineComponent.cs | |||
@@ -28,18 +28,9 @@ using System; | |||
28 | using System.Collections.Generic; | 28 | using System.Collections.Generic; |
29 | using System.Text; | 29 | using System.Text; |
30 | 30 | ||
31 | namespace OpenSim.ApplicationPlugins.ScriptEngine.Components | 31 | namespace OpenSim.ScriptEngine.Shared |
32 | { | 32 | { |
33 | public abstract class CommandBase: ComponentBase | 33 | public interface IScriptEngineComponent |
34 | { | 34 | { |
35 | //public override iProviderBase CreateInstance() | ||
36 | //{ | ||
37 | // throw new NotImplementedException(); | ||
38 | //} | ||
39 | |||
40 | //public override void Start() | ||
41 | //{ | ||
42 | // throw new NotImplementedException(); | ||
43 | //} | ||
44 | } | 35 | } |
45 | } \ No newline at end of file | 36 | } \ No newline at end of file |
diff --git a/OpenSim/ApplicationPlugins/ScriptEngine/Components/CompilerBase.cs b/OpenSim/ScriptEngine/Shared/IScriptExecutor.cs index e62d1f2..77bea13 100644 --- a/OpenSim/ApplicationPlugins/ScriptEngine/Components/CompilerBase.cs +++ b/OpenSim/ScriptEngine/Shared/IScriptExecutor.cs | |||
@@ -27,19 +27,13 @@ | |||
27 | using System; | 27 | using System; |
28 | using System.Collections.Generic; | 28 | using System.Collections.Generic; |
29 | using System.Text; | 29 | using System.Text; |
30 | using OpenSim.ScriptEngine.Shared; | ||
30 | 31 | ||
31 | namespace OpenSim.ApplicationPlugins.ScriptEngine.Components | 32 | namespace OpenSim.ScriptEngine.Shared |
32 | { | 33 | { |
33 | public abstract class CompilerBase: ComponentBase | 34 | public interface IScriptExecutor : IScriptEngineComponent, IScriptEngineRegionComponent |
34 | { | 35 | { |
35 | //public override iProviderBase CreateInstance() | 36 | void ExecuteCommand(ref ScriptStructure scriptContainer, EventParams p); |
36 | //{ | 37 | void ExecuteCommand(EventParams p); |
37 | // throw new NotImplementedException(); | ||
38 | //} | ||
39 | |||
40 | //public override void Start() | ||
41 | //{ | ||
42 | // throw new NotImplementedException(); | ||
43 | //} | ||
44 | } | 38 | } |
45 | } \ No newline at end of file | 39 | } \ No newline at end of file |
diff --git a/OpenSim/ApplicationPlugins/ScriptEngine/Components/SchedulerBase.cs b/OpenSim/ScriptEngine/Shared/IScriptScheduler.cs index 9d5aff0..3e56c12 100644 --- a/OpenSim/ApplicationPlugins/ScriptEngine/Components/SchedulerBase.cs +++ b/OpenSim/ScriptEngine/Shared/IScriptScheduler.cs | |||
@@ -27,19 +27,15 @@ | |||
27 | using System; | 27 | using System; |
28 | using System.Collections.Generic; | 28 | using System.Collections.Generic; |
29 | using System.Text; | 29 | using System.Text; |
30 | using OpenMetaverse; | ||
31 | using OpenSim.ScriptEngine.Shared; | ||
30 | 32 | ||
31 | namespace OpenSim.ApplicationPlugins.ScriptEngine.Components | 33 | namespace OpenSim.ScriptEngine.Shared |
32 | { | 34 | { |
33 | public abstract class SchedulerBase: ComponentBase | 35 | public interface IScriptScheduler : IScriptEngineComponent |
34 | { | 36 | { |
35 | //public override iProviderBase CreateInstance() | 37 | void AddScript(ScriptStructure script); |
36 | //{ | 38 | void Removecript(uint id, UUID itemID); |
37 | // throw new NotImplementedException(); | 39 | void Close(); |
38 | //} | ||
39 | |||
40 | //public override void Start() | ||
41 | //{ | ||
42 | // throw new NotImplementedException(); | ||
43 | //} | ||
44 | } | 40 | } |
45 | } \ No newline at end of file | 41 | } \ No newline at end of file |