aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/XEngine/XEngine.cs')
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/XEngine.cs340
1 files changed, 300 insertions, 40 deletions
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index c8f6559..65c7416 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -42,7 +42,7 @@ using log4net;
42using Nini.Config; 42using Nini.Config;
43using Amib.Threading; 43using Amib.Threading;
44using OpenSim.Framework; 44using OpenSim.Framework;
45using OpenSim.Region.CoreModules.Framework.EventQueue; 45using OpenSim.Framework.Console;
46using OpenSim.Region.Framework.Scenes; 46using OpenSim.Region.Framework.Scenes;
47using OpenSim.Region.Framework.Interfaces; 47using OpenSim.Region.Framework.Interfaces;
48using OpenSim.Region.ScriptEngine.Shared; 48using OpenSim.Region.ScriptEngine.Shared;
@@ -89,6 +89,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
89 private IXmlRpcRouter m_XmlRpcRouter; 89 private IXmlRpcRouter m_XmlRpcRouter;
90 private int m_EventLimit; 90 private int m_EventLimit;
91 private bool m_KillTimedOutScripts; 91 private bool m_KillTimedOutScripts;
92 private string m_ScriptEnginesPath = null;
93
94 /// <summary>
95 /// Is the entire simulator in the process of shutting down?
96 /// </summary>
97 private bool m_SimulatorShuttingDown;
92 98
93 private static List<XEngine> m_ScriptEngines = 99 private static List<XEngine> m_ScriptEngines =
94 new List<XEngine>(); 100 new List<XEngine>();
@@ -224,6 +230,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine
224 get { return m_ScriptConfig; } 230 get { return m_ScriptConfig; }
225 } 231 }
226 232
233 public string ScriptEnginePath
234 {
235 get { return m_ScriptEnginesPath; }
236 }
237
227 public IConfigSource ConfigSource 238 public IConfigSource ConfigSource
228 { 239 {
229 get { return m_ConfigSource; } 240 get { return m_ConfigSource; }
@@ -281,6 +292,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
281 m_EventLimit = m_ScriptConfig.GetInt("EventLimit", 30); 292 m_EventLimit = m_ScriptConfig.GetInt("EventLimit", 30);
282 m_KillTimedOutScripts = m_ScriptConfig.GetBoolean("KillTimedOutScripts", false); 293 m_KillTimedOutScripts = m_ScriptConfig.GetBoolean("KillTimedOutScripts", false);
283 m_SaveTime = m_ScriptConfig.GetInt("SaveInterval", 120) * 1000; 294 m_SaveTime = m_ScriptConfig.GetInt("SaveInterval", 120) * 1000;
295 m_ScriptEnginesPath = m_ScriptConfig.GetString("ScriptEnginesPath", "ScriptEngines");
284 296
285 m_Prio = ThreadPriority.BelowNormal; 297 m_Prio = ThreadPriority.BelowNormal;
286 switch (priority) 298 switch (priority)
@@ -327,10 +339,185 @@ namespace OpenSim.Region.ScriptEngine.XEngine
327 OnScriptRemoved += m_XmlRpcRouter.ScriptRemoved; 339 OnScriptRemoved += m_XmlRpcRouter.ScriptRemoved;
328 OnObjectRemoved += m_XmlRpcRouter.ObjectRemoved; 340 OnObjectRemoved += m_XmlRpcRouter.ObjectRemoved;
329 } 341 }
342
343 MainConsole.Instance.Commands.AddCommand(
344 "scripts", false, "scripts show", "scripts show", "Show script information",
345 "Show information on all scripts known to the script engine", HandleShowScripts);
346
347 MainConsole.Instance.Commands.AddCommand(
348 "scripts", false, "show scripts", "show scripts", "Show script information",
349 "Synonym for scripts show command", HandleShowScripts);
350
351 MainConsole.Instance.Commands.AddCommand(
352 "scripts", false, "scripts suspend", "scripts suspend [<script-item-uuid>]", "Suspends all running scripts",
353 "Suspends all currently running scripts. This only suspends event delivery, it will not suspend a"
354 + " script that is currently processing an event.\n"
355 + "Suspended scripts will continue to accumulate events but won't process them.\n"
356 + "If a <script-item-uuid> is given then only that script will be suspended. Otherwise, all suitable scripts are suspended.",
357 (module, cmdparams) => HandleScriptsAction(cmdparams, HandleSuspendScript));
358
359 MainConsole.Instance.Commands.AddCommand(
360 "scripts", false, "scripts resume", "scripts resume [<script-item-uuid>]", "Resumes all suspended scripts",
361 "Resumes all currently suspended scripts.\n"
362 + "Resumed scripts will process all events accumulated whilst suspended."
363 + "If a <script-item-uuid> is given then only that script will be resumed. Otherwise, all suitable scripts are resumed.",
364 (module, cmdparams) => HandleScriptsAction(cmdparams, HandleResumeScript));
365
366 MainConsole.Instance.Commands.AddCommand(
367 "scripts", false, "scripts stop", "scripts stop [<script-item-uuid>]", "Stops all running scripts",
368 "Stops all running scripts."
369 + "If a <script-item-uuid> is given then only that script will be stopped. Otherwise, all suitable scripts are stopped.",
370 (module, cmdparams) => HandleScriptsAction(cmdparams, HandleStopScript));
371
372 MainConsole.Instance.Commands.AddCommand(
373 "scripts", false, "scripts start", "scripts start [<script-item-uuid>]", "Starts all stopped scripts",
374 "Starts all stopped scripts."
375 + "If a <script-item-uuid> is given then only that script will be started. Otherwise, all suitable scripts are started.",
376 (module, cmdparams) => HandleScriptsAction(cmdparams, HandleStartScript));
377 }
378
379 public void HandleShowScripts(string module, string[] cmdparams)
380 {
381 lock (m_Scripts)
382 {
383 MainConsole.Instance.OutputFormat(
384 "Showing {0} scripts in {1}", m_Scripts.Count, m_Scene.RegionInfo.RegionName);
385
386 foreach (IScriptInstance instance in m_Scripts.Values)
387 {
388 SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID);
389 string status;
390
391 if (instance.ShuttingDown)
392 {
393 status = "shutting down";
394 }
395 else if (instance.Suspended)
396 {
397 status = "suspended";
398 }
399 else if (!instance.Running)
400 {
401 status = "stopped";
402 }
403 else
404 {
405 status = "running";
406 }
407
408 MainConsole.Instance.OutputFormat(
409 "{0}.{1}, item UUID {2}, prim UUID {3} @ {4} ({5})",
410 instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID,
411 sop.AbsolutePosition, status);
412 }
413 }
414 }
415
416 /// <summary>
417 /// Parse the raw item id into a script instance from the command params if it's present.
418 /// </summary>
419 /// <param name="cmdparams"></param>
420 /// <param name="instance"></param>
421 /// <returns>true if we're okay to proceed, false if not.</returns>
422 private void HandleScriptsAction(string[] cmdparams, Action<IScriptInstance> action)
423 {
424 lock (m_Scripts)
425 {
426 string rawItemId;
427 UUID itemId = UUID.Zero;
428
429 if (cmdparams.Length == 2)
430 {
431 foreach (IScriptInstance instance in m_Scripts.Values)
432 action(instance);
433
434 return;
435 }
436
437 rawItemId = cmdparams[2];
438
439 if (!UUID.TryParse(rawItemId, out itemId))
440 {
441 MainConsole.Instance.OutputFormat("Error - {0} is not a valid UUID", rawItemId);
442 return;
443 }
444
445 if (itemId != UUID.Zero)
446 {
447 IScriptInstance instance = GetInstance(itemId);
448 if (instance == null)
449 {
450 // Commented out for now since this will cause false reports on simulators with more than
451 // one scene where the current command line set region is 'root' (which causes commands to
452 // go to both regions... (sigh)
453// MainConsole.Instance.OutputFormat("Error - No item found with id {0}", itemId);
454 return;
455 }
456 else
457 {
458 action(instance);
459 return;
460 }
461 }
462 }
463 }
464
465 private void HandleSuspendScript(IScriptInstance instance)
466 {
467 if (!instance.Suspended)
468 {
469 instance.Suspend();
470
471 SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID);
472 MainConsole.Instance.OutputFormat(
473 "Suspended {0}.{1}, item UUID {2}, prim UUID {3} @ {4}",
474 instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition);
475 }
476 }
477
478 private void HandleResumeScript(IScriptInstance instance)
479 {
480 if (instance.Suspended)
481 {
482 instance.Resume();
483
484 SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID);
485 MainConsole.Instance.OutputFormat(
486 "Resumed {0}.{1}, item UUID {2}, prim UUID {3} @ {4}",
487 instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition);
488 }
489 }
490
491 private void HandleStartScript(IScriptInstance instance)
492 {
493 if (!instance.Running)
494 {
495 instance.Start();
496
497 SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID);
498 MainConsole.Instance.OutputFormat(
499 "Started {0}.{1}, item UUID {2}, prim UUID {3} @ {4}",
500 instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition);
501 }
502 }
503
504 private void HandleStopScript(IScriptInstance instance)
505 {
506 if (instance.Running)
507 {
508 instance.Stop(0);
509
510 SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID);
511 MainConsole.Instance.OutputFormat(
512 "Stopped {0}.{1}, item UUID {2}, prim UUID {3} @ {4}",
513 instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition);
514 }
330 } 515 }
331 516
332 public void RemoveRegion(Scene scene) 517 public void RemoveRegion(Scene scene)
333 { 518 {
519 if (!m_Enabled)
520 return;
334 lockScriptsForRead(true); 521 lockScriptsForRead(true);
335 foreach (IScriptInstance instance in m_Scripts.Values) 522 foreach (IScriptInstance instance in m_Scripts.Values)
336 { 523 {
@@ -355,12 +542,20 @@ namespace OpenSim.Region.ScriptEngine.XEngine
355 // Must be done explicitly because they have infinite 542 // Must be done explicitly because they have infinite
356 // lifetime 543 // lifetime
357 // 544 //
358 m_DomainScripts[instance.AppDomain].Remove(instance.ItemID); 545 if (!m_SimulatorShuttingDown)
359 if (m_DomainScripts[instance.AppDomain].Count == 0)
360 { 546 {
361 m_DomainScripts.Remove(instance.AppDomain); 547 m_DomainScripts[instance.AppDomain].Remove(instance.ItemID);
362 UnloadAppDomain(instance.AppDomain); 548 if (m_DomainScripts[instance.AppDomain].Count == 0)
549 {
550 m_DomainScripts.Remove(instance.AppDomain);
551 UnloadAppDomain(instance.AppDomain);
552 }
363 } 553 }
554
555 m_Scripts.Clear();
556 m_PrimObjects.Clear();
557 m_Assemblies.Clear();
558 m_DomainScripts.Clear();
364 } 559 }
365 lockScriptsForRead(false); 560 lockScriptsForRead(false);
366 lockScriptsForWrite(true); 561 lockScriptsForWrite(true);
@@ -403,12 +598,18 @@ namespace OpenSim.Region.ScriptEngine.XEngine
403 m_ThreadPool.QueueWorkItem(new WorkItemCallback(this.DoBackup), 598 m_ThreadPool.QueueWorkItem(new WorkItemCallback(this.DoBackup),
404 new Object[] { m_SaveTime }); 599 new Object[] { m_SaveTime });
405 } 600 }
601 }
406 602
603 public void StartProcessing()
604 {
407 m_ThreadPool.Start(); 605 m_ThreadPool.Start();
408 } 606 }
409 607
410 public void Close() 608 public void Close()
411 { 609 {
610 if (!m_Enabled)
611 return;
612
412 lock (m_ScriptEngines) 613 lock (m_ScriptEngines)
413 { 614 {
414 if (m_ScriptEngines.Contains(this)) 615 if (m_ScriptEngines.Contains(this))
@@ -455,11 +656,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
455 return 0; 656 return 0;
456 } 657 }
457 658
458 public object DoMaintenance(object p) 659 public void SaveAllState()
459 { 660 {
460 object[] parms = (object[])p;
461 int sleepTime = (int)parms[0];
462
463 foreach (IScriptInstance inst in m_Scripts.Values) 661 foreach (IScriptInstance inst in m_Scripts.Values)
464 { 662 {
465 if (inst.EventTime() > m_EventLimit) 663 if (inst.EventTime() > m_EventLimit)
@@ -469,6 +667,14 @@ namespace OpenSim.Region.ScriptEngine.XEngine
469 inst.Start(); 667 inst.Start();
470 } 668 }
471 } 669 }
670 }
671
672 public object DoMaintenance(object p)
673 {
674 object[] parms = (object[])p;
675 int sleepTime = (int)parms[0];
676
677 SaveAllState();
472 678
473 System.Threading.Thread.Sleep(sleepTime); 679 System.Threading.Thread.Sleep(sleepTime);
474 680
@@ -478,7 +684,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
478 return 0; 684 return 0;
479 } 685 }
480 686
481 public Type ReplaceableInterface 687 public Type ReplaceableInterface
482 { 688 {
483 get { return null; } 689 get { return null; }
484 } 690 }
@@ -632,7 +838,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
632 bool postOnRez = (bool)p[4]; 838 bool postOnRez = (bool)p[4];
633 StateSource stateSource = (StateSource)p[5]; 839 StateSource stateSource = (StateSource)p[5];
634 840
635 lock(m_CompileDict) 841 lock (m_CompileDict)
636 { 842 {
637 if (!m_CompileDict.ContainsKey(itemID)) 843 if (!m_CompileDict.ContainsKey(itemID))
638 return false; 844 return false;
@@ -648,7 +854,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
648 SceneObjectPart part = m_Scene.GetSceneObjectPart(localID); 854 SceneObjectPart part = m_Scene.GetSceneObjectPart(localID);
649 if (part == null) 855 if (part == null)
650 { 856 {
651 m_log.Error("[Script] SceneObjectPart unavailable. Script NOT started."); 857 m_log.ErrorFormat("[Script]: SceneObjectPart with localID {0} unavailable. Script NOT started.", localID);
652 m_ScriptErrorMessage += "SceneObjectPart unavailable. Script NOT started.\n"; 858 m_ScriptErrorMessage += "SceneObjectPart unavailable. Script NOT started.\n";
653 m_ScriptFailCount++; 859 m_ScriptFailCount++;
654 return false; 860 return false;
@@ -769,8 +975,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
769 } 975 }
770 } 976 }
771 977
772
773
774 ScriptInstance instance = null; 978 ScriptInstance instance = null;
775 // Create the object record 979 // Create the object record
776 lockScriptsForRead(true); 980 lockScriptsForRead(true);
@@ -789,9 +993,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
789 try 993 try
790 { 994 {
791 AppDomainSetup appSetup = new AppDomainSetup(); 995 AppDomainSetup appSetup = new AppDomainSetup();
792 // appSetup.ApplicationBase = Path.Combine( 996 appSetup.PrivateBinPath = Path.Combine(
793 // "ScriptEngines", 997 m_ScriptEnginesPath,
794 // m_Scene.RegionInfo.RegionID.ToString()); 998 m_Scene.RegionInfo.RegionID.ToString());
795 999
796 Evidence baseEvidence = AppDomain.CurrentDomain.Evidence; 1000 Evidence baseEvidence = AppDomain.CurrentDomain.Evidence;
797 Evidence evidence = new Evidence(baseEvidence); 1001 Evidence evidence = new Evidence(baseEvidence);
@@ -840,8 +1044,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine
840 item.Name, startParam, postOnRez, 1044 item.Name, startParam, postOnRez,
841 stateSource, m_MaxScriptQueue); 1045 stateSource, m_MaxScriptQueue);
842 1046
843 m_log.DebugFormat("[XEngine] Loaded script {0}.{1}, script UUID {2}, prim UUID {3} @ {4}", 1047 m_log.DebugFormat(
844 part.ParentGroup.RootPart.Name, item.Name, assetID, part.UUID, part.ParentGroup.RootPart.AbsolutePosition.ToString()); 1048 "[XEngine] Loaded script {0}.{1}, script UUID {2}, prim UUID {3} @ {4}.{5}",
1049 part.ParentGroup.RootPart.Name, item.Name, assetID, part.UUID,
1050 part.ParentGroup.RootPart.AbsolutePosition, part.ParentGroup.Scene.RegionInfo.RegionName);
845 1051
846 if (presence != null) 1052 if (presence != null)
847 { 1053 {
@@ -892,9 +1098,19 @@ namespace OpenSim.Region.ScriptEngine.XEngine
892 m_CompileDict.Remove(itemID); 1098 m_CompileDict.Remove(itemID);
893 } 1099 }
894 1100
895 lock (m_Scripts) 1101 lockScriptsForRead(true);
1102 // Do we even have it?
1103 if (!m_Scripts.ContainsKey(itemID))
896 { 1104 {
1105 // Do we even have it?
1106 if (!m_Scripts.ContainsKey(itemID))
1107 return;
1108
897 lockScriptsForRead(false); 1109 lockScriptsForRead(false);
1110 lockScriptsForWrite(true);
1111 m_Scripts.Remove(itemID);
1112 lockScriptsForWrite(false);
1113
898 return; 1114 return;
899 } 1115 }
900 1116
@@ -948,7 +1164,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
948 1164
949 CleanAssemblies(); 1165 CleanAssemblies();
950 1166
951
952 ScriptRemoved handlerScriptRemoved = OnScriptRemoved; 1167 ScriptRemoved handlerScriptRemoved = OnScriptRemoved;
953 if (handlerScriptRemoved != null) 1168 if (handlerScriptRemoved != null)
954 handlerScriptRemoved(itemID); 1169 handlerScriptRemoved(itemID);
@@ -1039,7 +1254,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1039 startInfo.IdleTimeout = idleTimeout*1000; // convert to seconds as stated in .ini 1254 startInfo.IdleTimeout = idleTimeout*1000; // convert to seconds as stated in .ini
1040 startInfo.MaxWorkerThreads = maxThreads; 1255 startInfo.MaxWorkerThreads = maxThreads;
1041 startInfo.MinWorkerThreads = minThreads; 1256 startInfo.MinWorkerThreads = minThreads;
1042 startInfo.ThreadPriority = threadPriority; 1257 startInfo.ThreadPriority = threadPriority;;
1043 startInfo.StackSize = stackSize; 1258 startInfo.StackSize = stackSize;
1044 startInfo.StartSuspended = true; 1259 startInfo.StartSuspended = true;
1045 1260
@@ -1068,7 +1283,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1068 1283
1069 IScriptInstance instance = (ScriptInstance) parms; 1284 IScriptInstance instance = (ScriptInstance) parms;
1070 1285
1071 //m_log.DebugFormat("[XENGINE]: Processing event for {0}", instance); 1286 //m_log.DebugFormat("[XEngine]: Processing event for {0}", instance);
1072 1287
1073 return instance.EventProcessor(); 1288 return instance.EventProcessor();
1074 } 1289 }
@@ -1082,26 +1297,34 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1082 public bool PostObjectEvent(uint localID, EventParams p) 1297 public bool PostObjectEvent(uint localID, EventParams p)
1083 { 1298 {
1084 bool result = false; 1299 bool result = false;
1085 1300 List<UUID> uuids = null;
1301
1086 lock (m_PrimObjects) 1302 lock (m_PrimObjects)
1087 { 1303 {
1088 if (!m_PrimObjects.ContainsKey(localID)) 1304 if (!m_PrimObjects.ContainsKey(localID))
1089 return false; 1305 return false;
1090 1306
1307 uuids = m_PrimObjects[localID];
1091 1308
1092 foreach (UUID itemID in m_PrimObjects[localID]) 1309
1310 foreach (UUID itemID in uuids)
1311 {
1312 IScriptInstance instance = null;
1313 try
1093 { 1314 {
1094 if (m_Scripts.ContainsKey(itemID)) 1315 if (m_Scripts.ContainsKey(itemID))
1095 { 1316 instance = m_Scripts[itemID];
1096 IScriptInstance instance = m_Scripts[itemID];
1097 if (instance != null)
1098 {
1099 instance.PostEvent(p);
1100 result = true;
1101 }
1102 }
1103 } 1317 }
1318 catch { /* ignore race conditions */ }
1319
1320 if (instance != null)
1321 {
1322 instance.PostEvent(p);
1323 result = true;
1324 }
1325 }
1104 } 1326 }
1327
1105 return result; 1328 return result;
1106 } 1329 }
1107 1330
@@ -1177,8 +1400,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1177 if (!(sender is System.AppDomain)) 1400 if (!(sender is System.AppDomain))
1178 return null; 1401 return null;
1179 1402
1180 string[] pathList = new string[] {"bin", "ScriptEngines", 1403 string[] pathList = new string[] {"bin", m_ScriptEnginesPath,
1181 Path.Combine("ScriptEngines", 1404 Path.Combine(m_ScriptEnginesPath,
1182 m_Scene.RegionInfo.RegionID.ToString())}; 1405 m_Scene.RegionInfo.RegionID.ToString())};
1183 1406
1184 string assemblyName = args.Name; 1407 string assemblyName = args.Name;
@@ -1302,6 +1525,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1302 1525
1303 public void OnShutdown() 1526 public void OnShutdown()
1304 { 1527 {
1528 m_SimulatorShuttingDown = true;
1529
1305 List<IScriptInstance> instances = new List<IScriptInstance>(); 1530 List<IScriptInstance> instances = new List<IScriptInstance>();
1306 1531
1307 lockScriptsForRead(true); 1532 lockScriptsForRead(true);
@@ -1346,16 +1571,22 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1346 } 1571 }
1347 else 1572 else
1348 { 1573 {
1349 eq.Enqueue(EventQueueHelper.ScriptRunningReplyEvent(objectID, itemID, GetScriptState(itemID), true), 1574 eq.Enqueue(eq.ScriptRunningEvent(objectID, itemID, GetScriptState(itemID), true),
1350 controllingClient.AgentId); 1575 controllingClient.AgentId);
1351 } 1576 }
1352 } 1577 }
1353 1578
1354 public string GetXMLState(UUID itemID) 1579 public string GetXMLState(UUID itemID)
1355 { 1580 {
1581// m_log.DebugFormat("[XEngine]: Getting XML state for {0}", itemID);
1582
1356 IScriptInstance instance = GetInstance(itemID); 1583 IScriptInstance instance = GetInstance(itemID);
1357 if (instance == null) 1584 if (instance == null)
1585 {
1586// m_log.DebugFormat("[XEngine]: Found no script for {0}, returning empty string", itemID);
1358 return ""; 1587 return "";
1588 }
1589
1359 string xml = instance.GetXMLState(); 1590 string xml = instance.GetXMLState();
1360 1591
1361 XmlDocument sdoc = new XmlDocument(); 1592 XmlDocument sdoc = new XmlDocument();
@@ -1364,7 +1595,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1364 { 1595 {
1365 sdoc.LoadXml(xml); 1596 sdoc.LoadXml(xml);
1366 } 1597 }
1367 catch (System.Xml.XmlException e) 1598 catch (System.Xml.XmlException)
1368 { 1599 {
1369 loadedState = false; 1600 loadedState = false;
1370 } 1601 }
@@ -1496,6 +1727,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1496 mapData.InnerText = map; 1727 mapData.InnerText = map;
1497 1728
1498 stateData.AppendChild(mapData); 1729 stateData.AppendChild(mapData);
1730
1731// m_log.DebugFormat("[XEngine]: Got XML state for {0}", itemID);
1732
1499 return doc.InnerXml; 1733 return doc.InnerXml;
1500 } 1734 }
1501 1735
@@ -1555,7 +1789,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1555 string fn = assemE.GetAttribute("Filename"); 1789 string fn = assemE.GetAttribute("Filename");
1556 string base64 = assemE.InnerText; 1790 string base64 = assemE.InnerText;
1557 1791
1558 string path = Path.Combine("ScriptEngines", World.RegionInfo.RegionID.ToString()); 1792 string path = Path.Combine(m_ScriptEnginesPath, World.RegionInfo.RegionID.ToString());
1559 path = Path.Combine(path, fn); 1793 path = Path.Combine(path, fn);
1560 1794
1561 if (!File.Exists(path)) 1795 if (!File.Exists(path))
@@ -1595,7 +1829,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1595 } 1829 }
1596 } 1830 }
1597 1831
1598 string statepath = Path.Combine("ScriptEngines", World.RegionInfo.RegionID.ToString()); 1832 string statepath = Path.Combine(m_ScriptEnginesPath, World.RegionInfo.RegionID.ToString());
1599 statepath = Path.Combine(statepath, itemID.ToString() + ".state"); 1833 statepath = Path.Combine(statepath, itemID.ToString() + ".state");
1600 1834
1601 try 1835 try
@@ -1621,7 +1855,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1621 { 1855 {
1622 XmlElement mapE = (XmlElement)mapL[0]; 1856 XmlElement mapE = (XmlElement)mapL[0];
1623 1857
1624 string mappath = Path.Combine("ScriptEngines", World.RegionInfo.RegionID.ToString()); 1858 string mappath = Path.Combine(m_ScriptEnginesPath, World.RegionInfo.RegionID.ToString());
1625 mappath = Path.Combine(mappath, mapE.GetAttribute("Filename")); 1859 mappath = Path.Combine(mappath, mapE.GetAttribute("Filename"));
1626 1860
1627 try 1861 try
@@ -1661,5 +1895,31 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1661 return new ArrayList(); 1895 return new ArrayList();
1662 } 1896 }
1663 } 1897 }
1898
1899 public void SuspendScript(UUID itemID)
1900 {
1901 IScriptInstance instance = GetInstance(itemID);
1902 if (instance != null)
1903 instance.Suspend();
1904 }
1905
1906 public void ResumeScript(UUID itemID)
1907 {
1908 IScriptInstance instance = GetInstance(itemID);
1909 if (instance != null)
1910 instance.Resume();
1911 }
1912
1913 public bool HasScript(UUID itemID, out bool running)
1914 {
1915 running = true;
1916
1917 IScriptInstance instance = GetInstance(itemID);
1918 if (instance == null)
1919 return false;
1920
1921 running = instance.Running;
1922 return true;
1923 }
1664 } 1924 }
1665} 1925}