aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/OptionalModules/Scripting/Minimodule/MiniModule.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/OptionalModules/Scripting/Minimodule/MiniModule.cs')
-rw-r--r--OpenSim/Region/OptionalModules/Scripting/Minimodule/MiniModule.cs108
1 files changed, 69 insertions, 39 deletions
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/MiniModule.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/MiniModule.cs
index 2e91142..ae8d632 100644
--- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/MiniModule.cs
+++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/MiniModule.cs
@@ -1,47 +1,65 @@
1using System; 1using System;
2using System.CodeDom.Compiler; 2using System.CodeDom.Compiler;
3using System.Collections.Generic;
3using System.IO; 4using System.IO;
4using System.Reflection; 5using System.Reflection;
5using System.Text; 6using System.Text;
6using log4net; 7using log4net;
7using Microsoft.CSharp; 8using Microsoft.CSharp;
8using Nini.Config; 9using Nini.Config;
10using OpenMetaverse;
9using OpenSim.Region.Framework.Interfaces; 11using OpenSim.Region.Framework.Interfaces;
10using OpenSim.Region.Framework.Scenes; 12using OpenSim.Region.Framework.Scenes;
11 13
12namespace OpenSim.Region.OptionalModules.Scripting.Minimodule 14namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
13{ 15{
14 class MiniModule : IRegionModule 16 public class MiniModule : IRegionModule
15 { 17 {
16 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 18 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
17 private Scene m_scene; 19 private Scene m_scene;
18 20
21 private readonly Dictionary<UUID,MiniModuleBase> m_scripts = new Dictionary<UUID, MiniModuleBase>();
19 22
20 private static readonly CSharpCodeProvider CScodeProvider = new CSharpCodeProvider(); 23 private static readonly CSharpCodeProvider CScodeProvider = new CSharpCodeProvider();
21 24
22 public void Initialise(Scene scene, IConfigSource source) 25 public void Initialise(Scene scene, IConfigSource source)
23 { 26 {
24 m_scene = scene; 27 if (source.Configs["MRM"] != null)
25 scene.EventManager.OnRezScript += EventManager_OnRezScript; 28 {
29 if (source.Configs["MRM"].GetBoolean("Enabled", false))
30 {
31 m_log.Info("[MRM] Enabling MRM Module");
32 m_scene = scene;
33 scene.EventManager.OnRezScript += EventManager_OnRezScript;
34 }
35 else
36 {
37 m_log.Info("[MRM] Disabled MRM Module (Express)");
38 }
39 }
40 else
41 {
42 m_log.Info("[MRM] Disabled MRM Module (Omission)");
43 }
26 } 44 }
27 45
28 void EventManager_OnRezScript(uint localID, OpenMetaverse.UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource) 46 void EventManager_OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource)
29 { 47 {
30 if(true) 48 if (script.StartsWith("//MiniMod:C#"))
31 return;
32
33 if(engine == "MiniMod")
34 { 49 {
35 if(script.StartsWith("//MiniMod:C#")) 50 m_log.Info("[MRM] Found C# MRM");
36 { 51 IWorld m_world = new World(m_scene);
37 IWorld m_world = new World(m_scene); 52 IHost m_host = new Host(new SOPObject(m_scene, localID));
38 IHost m_host = new Host(new SOPObject(m_scene, localID)); 53
39 54 MiniModuleBase mmb = (MiniModuleBase) AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap(
40 MiniModuleBase mmb = (MiniModuleBase) AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap( 55 CompileFromDotNetText(script, itemID.ToString()),
41 CompileFromDotNetText(script, itemID.ToString()), 56 "OpenSim.MiniModule");
42 "OpenSim.MiniModule"); 57 m_log.Info("[MRM] Created MRM Instance");
43 mmb.InitMiniModule(m_world, m_host); 58 mmb.InitMiniModule(m_world, m_host);
44 } 59 m_scripts[itemID] = mmb;
60
61 m_log.Info("[MRM] Starting MRM");
62 mmb.Start();
45 } 63 }
46 } 64 }
47 65
@@ -52,7 +70,10 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
52 70
53 public void Close() 71 public void Close()
54 { 72 {
55 73 foreach (KeyValuePair<UUID, MiniModuleBase> pair in m_scripts)
74 {
75 pair.Value.Stop();
76 }
56 } 77 }
57 78
58 public string Name 79 public string Name
@@ -78,8 +99,16 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
78 99
79 // Output assembly name 100 // Output assembly name
80 string OutFile = Path.Combine("MiniModules", Path.Combine( 101 string OutFile = Path.Combine("MiniModules", Path.Combine(
81 m_scene.RegionInfo.RegionID.ToString(), 102 m_scene.RegionInfo.RegionID.ToString(),
82 FilePrefix + "_compiled_" + uuid + ".dll")); 103 FilePrefix + "_compiled_" + uuid + ".dll"));
104
105 // Create Directories for Assemblies
106 if (!Directory.Exists("MiniModules"))
107 Directory.CreateDirectory("MiniModules");
108 string tmp = Path.Combine("MiniModules", m_scene.RegionInfo.RegionID.ToString());
109 if (!Directory.Exists(tmp))
110 Directory.CreateDirectory(tmp);
111
83 try 112 try
84 { 113 {
85 File.Delete(OutFile); 114 File.Delete(OutFile);
@@ -87,26 +116,26 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
87 catch (IOException e) 116 catch (IOException e)
88 { 117 {
89 throw new Exception("Unable to delete old existing " + 118 throw new Exception("Unable to delete old existing " +
90 "script-file before writing new. Compile aborted: " + 119 "script-file before writing new. Compile aborted: " +
91 e); 120 e);
92 } 121 }
93 122
94 // DEBUG - write source to disk 123 // DEBUG - write source to disk
95 string srcFileName = FilePrefix + "_source_" + 124 string srcFileName = FilePrefix + "_source_" +
96 Path.GetFileNameWithoutExtension(OutFile) + ext; 125 Path.GetFileNameWithoutExtension(OutFile) + ext;
97 try 126 try
98 { 127 {
99 File.WriteAllText(Path.Combine(Path.Combine( 128 File.WriteAllText(Path.Combine(Path.Combine(
100 "MiniModules", 129 "MiniModules",
101 m_scene.RegionInfo.RegionID.ToString()), 130 m_scene.RegionInfo.RegionID.ToString()),
102 srcFileName), Script); 131 srcFileName), Script);
103 } 132 }
104 catch (Exception ex) //NOTLEGIT - Should be just FileIOException 133 catch (Exception ex) //NOTLEGIT - Should be just FileIOException
105 { 134 {
106 m_log.Error("[Compiler]: Exception while " + 135 m_log.Error("[Compiler]: Exception while " +
107 "trying to write script source to file \"" + 136 "trying to write script source to file \"" +
108 srcFileName + "\": " + ex.ToString()); 137 srcFileName + "\": " + ex.ToString());
109 } 138 }
110 139
111 // Do actual compile 140 // Do actual compile
112 CompilerParameters parameters = new CompilerParameters(); 141 CompilerParameters parameters = new CompilerParameters();
@@ -120,7 +149,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
120 // TODO: Add Libraries 149 // TODO: Add Libraries
121 parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, 150 parameters.ReferencedAssemblies.Add(Path.Combine(rootPath,
122 "OpenSim.Region.OptionalModules.dll")); 151 "OpenSim.Region.OptionalModules.dll"));
123 152 parameters.ReferencedAssemblies.Add(Path.Combine(rootPath,
153 "log4net.dll"));
124 154
125 parameters.GenerateExecutable = false; 155 parameters.GenerateExecutable = false;
126 parameters.OutputAssembly = OutFile; 156 parameters.OutputAssembly = OutFile;