diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/Framework/Interfaces/IScriptModule.cs | 14 | ||||
-rw-r--r-- | OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 145 |
2 files changed, 118 insertions, 41 deletions
diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs index 7dde586..9d68eb4 100644 --- a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs | |||
@@ -41,12 +41,16 @@ namespace OpenSim.Region.Framework.Interfaces | |||
41 | bool PostScriptEvent(UUID itemID, string name, Object[] args); | 41 | bool PostScriptEvent(UUID itemID, string name, Object[] args); |
42 | bool PostObjectEvent(UUID itemID, string name, Object[] args); | 42 | bool PostObjectEvent(UUID itemID, string name, Object[] args); |
43 | 43 | ||
44 | // Suspend ALL scripts in a given scene object. The item ID | 44 | /// <summary> |
45 | // is the UUID of a SOG, and the method acts on all contained | 45 | /// Suspends a script. |
46 | // scripts. This is different from the suspend/resume that | 46 | /// </summary> |
47 | // can be issued by a client. | 47 | /// <param name="itemID">The item ID of the script.</param> |
48 | // | ||
49 | void SuspendScript(UUID itemID); | 48 | void SuspendScript(UUID itemID); |
49 | |||
50 | /// <summary> | ||
51 | /// Resumes a script. | ||
52 | /// </summary> | ||
53 | /// <param name="itemID">The item ID of the script.</param> | ||
50 | void ResumeScript(UUID itemID); | 54 | void ResumeScript(UUID itemID); |
51 | 55 | ||
52 | ArrayList GetScriptErrors(UUID itemID); | 56 | ArrayList GetScriptErrors(UUID itemID); |
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index aa11eca..3ebeb75 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |||
@@ -344,14 +344,31 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
344 | "Synonym for scripts show command", HandleShowScripts); | 344 | "Synonym for scripts show command", HandleShowScripts); |
345 | 345 | ||
346 | MainConsole.Instance.Commands.AddCommand( | 346 | MainConsole.Instance.Commands.AddCommand( |
347 | "scripts", false, "scripts suspend", "scripts suspend", "Suspend all scripts", | 347 | "scripts", false, "scripts suspend", "scripts suspend [<script-item-uuid>]", "Suspends all running scripts", |
348 | "Suspends all currently running scripts. This only suspends event delivery, it will not suspend a" | 348 | "Suspends all currently running scripts. This only suspends event delivery, it will not suspend a" |
349 | + " script that is currently processing an event.", | 349 | + " script that is currently processing an event.\n" |
350 | HandleSuspendScripts); | 350 | + "Suspended scripts will continue to accumulate events but won't process them.\n" |
351 | + "If a <script-item-uuid> is given then only that script will be suspended. Otherwise, all suitable scripts are suspended.", | ||
352 | (module, cmdparams) => HandleScriptsAction(cmdparams, HandleSuspendScript)); | ||
351 | 353 | ||
352 | MainConsole.Instance.Commands.AddCommand( | 354 | MainConsole.Instance.Commands.AddCommand( |
353 | "scripts", false, "scripts resume", "scripts resume", "Resume all scripts", | 355 | "scripts", false, "scripts resume", "scripts resume [<script-item-uuid>]", "Resumes all suspended scripts", |
354 | "Resumes all currently suspended scripts", HandleResumeScripts); | 356 | "Resumes all currently suspended scripts.\n" |
357 | + "Resumed scripts will process all events accumulated whilst suspended." | ||
358 | + "If a <script-item-uuid> is given then only that script will be resumed. Otherwise, all suitable scripts are resumed.", | ||
359 | (module, cmdparams) => HandleScriptsAction(cmdparams, HandleResumeScript)); | ||
360 | |||
361 | MainConsole.Instance.Commands.AddCommand( | ||
362 | "scripts", false, "scripts stop", "scripts stop [<script-item-uuid>]", "Stops all running scripts", | ||
363 | "Stops all running scripts." | ||
364 | + "If a <script-item-uuid> is given then only that script will be stopped. Otherwise, all suitable scripts are stopped.", | ||
365 | (module, cmdparams) => HandleScriptsAction(cmdparams, HandleStopScript)); | ||
366 | |||
367 | MainConsole.Instance.Commands.AddCommand( | ||
368 | "scripts", false, "scripts start", "scripts start [<script-item-uuid>]", "Starts all stopped scripts", | ||
369 | "Starts all stopped scripts." | ||
370 | + "If a <script-item-uuid> is given then only that script will be started. Otherwise, all suitable scripts are started.", | ||
371 | (module, cmdparams) => HandleScriptsAction(cmdparams, HandleStartScript)); | ||
355 | } | 372 | } |
356 | 373 | ||
357 | public void HandleShowScripts(string module, string[] cmdparams) | 374 | public void HandleShowScripts(string module, string[] cmdparams) |
@@ -391,41 +408,101 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
391 | } | 408 | } |
392 | } | 409 | } |
393 | 410 | ||
394 | public void HandleSuspendScripts(string module, string[] cmdparams) | 411 | /// <summary> |
412 | /// Parse the raw item id into a script instance from the command params if it's present. | ||
413 | /// </summary> | ||
414 | /// <param name="cmdparams"></param> | ||
415 | /// <param name="instance"></param> | ||
416 | /// <returns>true if we're okay to proceed, false if not.</returns> | ||
417 | private void HandleScriptsAction(string[] cmdparams, Action<IScriptInstance> action) | ||
395 | { | 418 | { |
396 | lock (m_Scripts) | 419 | lock (m_Scripts) |
397 | { | 420 | { |
398 | foreach (IScriptInstance instance in m_Scripts.Values) | 421 | string rawItemId; |
422 | UUID itemId = UUID.Zero; | ||
423 | |||
424 | if (cmdparams.Length == 2) | ||
399 | { | 425 | { |
400 | if (!instance.Suspended) | 426 | foreach (IScriptInstance instance in m_Scripts.Values) |
401 | { | 427 | action(instance); |
402 | instance.Suspend(); | ||
403 | 428 | ||
404 | SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID); | 429 | return; |
405 | MainConsole.Instance.OutputFormat( | 430 | } |
406 | "Suspended {0}.{1}, item UUID {2}, prim UUID {3} @ {4}", | 431 | |
407 | instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition); | 432 | rawItemId = cmdparams[2]; |
433 | |||
434 | if (!UUID.TryParse(rawItemId, out itemId)) | ||
435 | { | ||
436 | MainConsole.Instance.OutputFormat("Error - {0} is not a valid UUID", rawItemId); | ||
437 | return; | ||
438 | } | ||
439 | |||
440 | if (itemId != UUID.Zero) | ||
441 | { | ||
442 | IScriptInstance instance = GetInstance(itemId); | ||
443 | if (instance == null) | ||
444 | { | ||
445 | MainConsole.Instance.OutputFormat("Error - No item found with id {0}", itemId); | ||
446 | return; | ||
447 | } | ||
448 | else | ||
449 | { | ||
450 | action(instance); | ||
451 | return; | ||
408 | } | 452 | } |
409 | } | 453 | } |
410 | } | 454 | } |
411 | } | 455 | } |
412 | 456 | ||
413 | public void HandleResumeScripts(string module, string[] cmdparams) | 457 | private void HandleSuspendScript(IScriptInstance instance) |
414 | { | 458 | { |
415 | lock (m_Scripts) | 459 | if (!instance.Suspended) |
416 | { | 460 | { |
417 | foreach (IScriptInstance instance in m_Scripts.Values) | 461 | instance.Suspend(); |
418 | { | ||
419 | if (instance.Suspended) | ||
420 | { | ||
421 | instance.Resume(); | ||
422 | 462 | ||
423 | SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID); | 463 | SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID); |
424 | MainConsole.Instance.OutputFormat( | 464 | MainConsole.Instance.OutputFormat( |
425 | "Resumed {0}.{1}, item UUID {2}, prim UUID {3} @ {4}", | 465 | "Suspended {0}.{1}, item UUID {2}, prim UUID {3} @ {4}", |
426 | instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition); | 466 | instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition); |
427 | } | 467 | } |
428 | } | 468 | } |
469 | |||
470 | private void HandleResumeScript(IScriptInstance instance) | ||
471 | { | ||
472 | if (instance.Suspended) | ||
473 | { | ||
474 | instance.Resume(); | ||
475 | |||
476 | SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID); | ||
477 | MainConsole.Instance.OutputFormat( | ||
478 | "Resumed {0}.{1}, item UUID {2}, prim UUID {3} @ {4}", | ||
479 | instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition); | ||
480 | } | ||
481 | } | ||
482 | |||
483 | private void HandleStartScript(IScriptInstance instance) | ||
484 | { | ||
485 | if (!instance.Running) | ||
486 | { | ||
487 | instance.Start(); | ||
488 | |||
489 | SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID); | ||
490 | MainConsole.Instance.OutputFormat( | ||
491 | "Started {0}.{1}, item UUID {2}, prim UUID {3} @ {4}", | ||
492 | instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition); | ||
493 | } | ||
494 | } | ||
495 | |||
496 | private void HandleStopScript(IScriptInstance instance) | ||
497 | { | ||
498 | if (instance.Running) | ||
499 | { | ||
500 | instance.Stop(0); | ||
501 | |||
502 | SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID); | ||
503 | MainConsole.Instance.OutputFormat( | ||
504 | "Stopped {0}.{1}, item UUID {2}, prim UUID {3} @ {4}", | ||
505 | instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition); | ||
429 | } | 506 | } |
430 | } | 507 | } |
431 | 508 | ||
@@ -1804,19 +1881,15 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1804 | public void SuspendScript(UUID itemID) | 1881 | public void SuspendScript(UUID itemID) |
1805 | { | 1882 | { |
1806 | IScriptInstance instance = GetInstance(itemID); | 1883 | IScriptInstance instance = GetInstance(itemID); |
1807 | if (instance == null) | 1884 | if (instance != null) |
1808 | return; | 1885 | instance.Suspend(); |
1809 | |||
1810 | instance.Suspend(); | ||
1811 | } | 1886 | } |
1812 | 1887 | ||
1813 | public void ResumeScript(UUID itemID) | 1888 | public void ResumeScript(UUID itemID) |
1814 | { | 1889 | { |
1815 | IScriptInstance instance = GetInstance(itemID); | 1890 | IScriptInstance instance = GetInstance(itemID); |
1816 | if (instance == null) | 1891 | if (instance != null) |
1817 | return; | 1892 | instance.Resume(); |
1818 | |||
1819 | instance.Resume(); | ||
1820 | } | 1893 | } |
1821 | 1894 | ||
1822 | public bool HasScript(UUID itemID, out bool running) | 1895 | public bool HasScript(UUID itemID, out bool running) |
@@ -1831,4 +1904,4 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1831 | return true; | 1904 | return true; |
1832 | } | 1905 | } |
1833 | } | 1906 | } |
1834 | } | 1907 | } \ No newline at end of file |