diff options
author | Tedd Hansen | 2007-08-18 22:09:07 +0000 |
---|---|---|
committer | Tedd Hansen | 2007-08-18 22:09:07 +0000 |
commit | 240712ca9fc726653e2a03b944baa8b6f8155b07 (patch) | |
tree | 6fd919d0983ba3d108aee5adeec0a9a751dff760 /OpenSim/Region/ScriptEngine | |
parent | Script loads into separate AppDomain without errors. Events and llFunctions n... (diff) | |
download | opensim-SC-240712ca9fc726653e2a03b944baa8b6f8155b07.zip opensim-SC-240712ca9fc726653e2a03b944baa8b6f8155b07.tar.gz opensim-SC-240712ca9fc726653e2a03b944baa8b6f8155b07.tar.bz2 opensim-SC-240712ca9fc726653e2a03b944baa8b6f8155b07.tar.xz |
Scripts are working again. Scripts are now loaded into limited AppDomains (no security yet).
*phew* that only took me 12 hours of coding...
Diffstat (limited to 'OpenSim/Region/ScriptEngine')
4 files changed, 98 insertions, 53 deletions
diff --git a/OpenSim/Region/ScriptEngine/Common/Executor.cs b/OpenSim/Region/ScriptEngine/Common/Executor.cs new file mode 100644 index 0000000..2ae6a60 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Common/Executor.cs | |||
@@ -0,0 +1,10 @@ | |||
1 | using System; | ||
2 | using System.Collections.Generic; | ||
3 | using System.Text; | ||
4 | |||
5 | namespace OpenSim.Region.ScriptEngine.Common | ||
6 | { | ||
7 | class Executor | ||
8 | { | ||
9 | } | ||
10 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs index 435ee08..ad2717c 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs | |||
@@ -61,7 +61,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL | |||
61 | 61 | ||
62 | string rootPath = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory); | 62 | string rootPath = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory); |
63 | string rootPathSE = Path.GetDirectoryName(this.GetType().Assembly.Location); | 63 | string rootPathSE = Path.GetDirectoryName(this.GetType().Assembly.Location); |
64 | Console.WriteLine("Assembly location: " + rootPath); | 64 | //Console.WriteLine("Assembly location: " + rootPath); |
65 | parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenSim.Region.ScriptEngine.Common.dll")); | 65 | parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenSim.Region.ScriptEngine.Common.dll")); |
66 | parameters.ReferencedAssemblies.Add(Path.Combine(rootPathSE, "OpenSim.Region.ScriptEngine.DotNetEngine.dll")); | 66 | parameters.ReferencedAssemblies.Add(Path.Combine(rootPathSE, "OpenSim.Region.ScriptEngine.DotNetEngine.dll")); |
67 | 67 | ||
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass.cs index 84fa9eb..7334e6f 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass.cs | |||
@@ -4,6 +4,8 @@ using System.Text; | |||
4 | using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler; | 4 | using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler; |
5 | using OpenSim.Region.ScriptEngine.Common; | 5 | using OpenSim.Region.ScriptEngine.Common; |
6 | using System.Threading; | 6 | using System.Threading; |
7 | using System.Reflection; | ||
8 | |||
7 | 9 | ||
8 | namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL | 10 | namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL |
9 | { | 11 | { |
@@ -46,6 +48,33 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL | |||
46 | return; | 48 | return; |
47 | } | 49 | } |
48 | 50 | ||
51 | public void ExecuteEvent(string FunctionName, object[] args) | ||
52 | { | ||
53 | //foreach (MemberInfo mi in this.GetType().GetMembers()) | ||
54 | //{ | ||
55 | //if (mi.ToString().ToLower().Contains("default")) | ||
56 | //{ | ||
57 | // Console.WriteLine("Member found: " + mi.ToString()); | ||
58 | //} | ||
59 | //} | ||
60 | |||
61 | Type type = this.GetType(); | ||
62 | |||
63 | Console.WriteLine("ScriptEngine Invoke: \"" + this.State() + "_event_" + FunctionName + "\""); | ||
64 | |||
65 | try | ||
66 | { | ||
67 | type.InvokeMember(this.State() + "_event_" + FunctionName, BindingFlags.InvokeMethod, null, this, args); | ||
68 | } | ||
69 | catch (Exception e) | ||
70 | { | ||
71 | // TODO: Send to correct place | ||
72 | Console.WriteLine("ScriptEngine Exception attempting to executing script function: " + e.ToString()); | ||
73 | } | ||
74 | |||
75 | |||
76 | } | ||
77 | |||
49 | 78 | ||
50 | 79 | ||
51 | // | 80 | // |
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs index 8e0b277..602ac9f 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs | |||
@@ -226,97 +226,103 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine | |||
226 | { | 226 | { |
227 | 227 | ||
228 | //LSL_BaseClass mbrt = (LSL_BaseClass)FreeAppDomain.CreateInstanceAndUnwrap(FileName, "SecondLife.Script"); | 228 | //LSL_BaseClass mbrt = (LSL_BaseClass)FreeAppDomain.CreateInstanceAndUnwrap(FileName, "SecondLife.Script"); |
229 | Console.WriteLine("Base directory: " + AppDomain.CurrentDomain.BaseDirectory); | 229 | //Console.WriteLine("Base directory: " + AppDomain.CurrentDomain.BaseDirectory); |
230 | 230 | ||
231 | //LSL_BaseClass mbrt = (LSL_BaseClass)FreeAppDomain.CreateInstanceFromAndUnwrap(FileName, "SecondLife.Script"); | 231 | LSL_BaseClass mbrt = (LSL_BaseClass)FreeAppDomain.CreateInstanceFromAndUnwrap(FileName, "SecondLife.Script"); |
232 | LSL_BuiltIn_Commands_Interface mbrt = (LSL_BuiltIn_Commands_Interface)FreeAppDomain.CreateInstanceFromAndUnwrap(FileName, "SecondLife.Script"); | 232 | //LSL_BuiltIn_Commands_Interface mbrt = (LSL_BuiltIn_Commands_Interface)FreeAppDomain.CreateInstanceFromAndUnwrap(FileName, "SecondLife.Script"); |
233 | Type mytype = mbrt.GetType(); | 233 | Type mytype = mbrt.GetType(); |
234 | 234 | ||
235 | Console.WriteLine("is proxy={0}", RemotingServices.IsTransparentProxy(mbrt)); | 235 | Console.WriteLine("is proxy={0}", RemotingServices.IsTransparentProxy(mbrt)); |
236 | 236 | ||
237 | 237 | ||
238 | //mbrt.Start(); | 238 | //mbrt.Start(); |
239 | return (LSL_BaseClass)mbrt; | 239 | return mbrt; |
240 | //return (LSL_BaseClass)mbrt; | ||
240 | 241 | ||
241 | 242 | ||
242 | 243 | ||
243 | 244 | ||
244 | 245 | ||
245 | 246 | ||
246 | //myScriptEngine.m_logger.Verbose("ScriptEngine", "ScriptManager Loading Assembly " + FileName); | 247 | // //myScriptEngine.m_logger.Verbose("ScriptEngine", "ScriptManager Loading Assembly " + FileName); |
247 | // Load .Net Assembly (.dll) | 248 | // // Load .Net Assembly (.dll) |
248 | // Initialize and return it | 249 | // // Initialize and return it |
249 | 250 | ||
250 | // TODO: Add error handling | 251 | // // TODO: Add error handling |
251 | // Script might not follow our rules since users can upload -anything- | 252 | // // Script might not follow our rules since users can upload -anything- |
252 | 253 | ||
253 | Assembly a; | 254 | // Assembly a; |
254 | //try | 255 | // //try |
255 | //{ | 256 | // //{ |
256 | 257 | ||
257 | 258 | ||
258 | // Load to default appdomain (temporary) | 259 | // // Load to default appdomain (temporary) |
259 | a = Assembly.LoadFrom(FileName); | 260 | // a = Assembly.LoadFrom(FileName); |
260 | // Load to specified appdomain | 261 | // // Load to specified appdomain |
261 | // TODO: Insert security | 262 | // // TODO: Insert security |
262 | //a = FreeAppDomain.Load(FileName); | 263 | // //a = FreeAppDomain.Load(FileName); |
263 | //} | 264 | // //} |
264 | //catch (Exception e) | 265 | // //catch (Exception e) |
265 | //{ | 266 | // //{ |
266 | //} | 267 | // //} |
267 | 268 | ||
268 | 269 | ||
269 | //foreach (Type _t in a.GetTypes()) | 270 | // //foreach (Type _t in a.GetTypes()) |
270 | //{ | 271 | // //{ |
271 | // Console.WriteLine("Type: " + _t.ToString()); | 272 | // // Console.WriteLine("Type: " + _t.ToString()); |
272 | //} | 273 | // //} |
273 | 274 | ||
274 | Type t; | 275 | // Type t; |
275 | //try | 276 | // //try |
276 | //{ | 277 | // //{ |
277 | t = a.GetType("SecondLife.Script", true); | 278 | // t = a.GetType("SecondLife.Script", true); |
278 | //} | 279 | // //} |
279 | //catch (Exception e) | 280 | // //catch (Exception e) |
280 | //{ | 281 | // //{ |
281 | //} | 282 | // //} |
282 | 283 | ||
283 | // Create constructor arguments | 284 | // // Create constructor arguments |
284 | object[] args = new object[] | 285 | // object[] args = new object[] |
285 | { | 286 | // { |
286 | // this, | 287 | //// this, |
287 | // host | 288 | //// host |
288 | }; | 289 | // }; |
289 | 290 | ||
290 | return (OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass)Activator.CreateInstance(t, args ); | 291 | // return (OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass)Activator.CreateInstance(t, args ); |
291 | 292 | ||
292 | 293 | ||
293 | } | 294 | } |
294 | 295 | ||
295 | internal void ExecuteFunction(IScriptHost ObjectID, string ScriptID, string FunctionName, object[] args) | 296 | internal void ExecuteFunction(IScriptHost ObjectID, string ScriptID, string FunctionName, object[] args) |
296 | { | 297 | { |
298 | |||
299 | // Execute a function in the script | ||
297 | m_scriptEngine.Log.Verbose("ScriptEngine", "Executing Function ObjectID: " + ObjectID + ", ScriptID: " + ScriptID + ", FunctionName: " + FunctionName); | 300 | m_scriptEngine.Log.Verbose("ScriptEngine", "Executing Function ObjectID: " + ObjectID + ", ScriptID: " + ScriptID + ", FunctionName: " + FunctionName); |
298 | OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass Script = m_scriptEngine.myScriptManager.GetScript(ObjectID, ScriptID); | 301 | OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass Script = m_scriptEngine.myScriptManager.GetScript(ObjectID, ScriptID); |
299 | 302 | ||
300 | Type type = Script.GetType(); | 303 | Script.ExecuteEvent(FunctionName, args); |
301 | 304 | ||
305 | //Type type = Script.GetType(); | ||
302 | 306 | ||
303 | m_scriptEngine.Log.Verbose("ScriptEngine", "Invoke: \"" + Script.State() + "_event_" + FunctionName + "\""); | ||
304 | 307 | ||
305 | try | 308 | ////foreach (MemberInfo mi in type.GetMembers()) |
306 | { | 309 | ////{ |
307 | type.InvokeMember(Script.State() + "_event_" + FunctionName, BindingFlags.InvokeMethod, null, Script, args); | 310 | //// Common.SendToDebug("Member found: " + mi.ToString()); |
308 | } | 311 | ////} |
309 | catch (Exception e) | ||
310 | { | ||
311 | m_scriptEngine.Log.Error("ScriptEngine", "Exception attempting to executing script function: " + e.ToString()); | ||
312 | } | ||
313 | 312 | ||
313 | //m_scriptEngine.Log.Verbose("ScriptEngine", "Invoke: \"" + Script.State() + "_event_" + FunctionName + "\""); | ||
314 | 314 | ||
315 | //foreach (MemberInfo mi in type.GetMembers()) | 315 | //try |
316 | //{ | ||
317 | // type.InvokeMember(Script.State() + "_event_" + FunctionName, BindingFlags.InvokeMethod, null, Script, args); | ||
318 | //} | ||
319 | //catch (Exception e) | ||
316 | //{ | 320 | //{ |
317 | // Common.SendToDebug("Member found: " + mi.ToString()); | 321 | // m_scriptEngine.Log.Error("ScriptEngine", "Exception attempting to executing script function: " + e.ToString()); |
318 | //} | 322 | //} |
319 | 323 | ||
324 | |||
325 | |||
320 | } | 326 | } |
321 | 327 | ||
322 | public string RegionName | 328 | public string RegionName |