diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
index b27b7da10e..950e4b0df2 100644
--- a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
@@ -41,12 +41,16 @@ namespace OpenSim.Region.Framework.Interfaces
bool PostScriptEvent(UUID itemID, string name, Object[] args);
bool PostObjectEvent(UUID itemID, string name, Object[] args);
- // Suspend ALL scripts in a given scene object. The item ID
- // is the UUID of a SOG, and the method acts on all contained
- // scripts. This is different from the suspend/resume that
- // can be issued by a client.
- //
+ ///
+ /// Suspends a script.
+ ///
+ /// The item ID of the script.
void SuspendScript(UUID itemID);
+
+ ///
+ /// Resumes a script.
+ ///
+ /// The item ID of the script.
void ResumeScript(UUID itemID);
ArrayList GetScriptErrors(UUID itemID);
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 003e735922..240e36fd8c 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -276,25 +276,31 @@ namespace OpenSim.Region.ScriptEngine.XEngine
"Synonym for scripts show command", HandleShowScripts);
MainConsole.Instance.Commands.AddCommand(
- "scripts", false, "scripts suspend", "scripts suspend", "Suspends all running scripts",
+ "scripts", false, "scripts suspend", "scripts suspend []", "Suspends all running scripts",
"Suspends all currently running scripts. This only suspends event delivery, it will not suspend a"
+ " script that is currently processing an event.\n"
- + "Suspended scripts will continue to accumulate events but won't process them.",
- HandleSuspendScripts);
+ + "Suspended scripts will continue to accumulate events but won't process them.\n"
+ + "If a is given then only that script will be suspended. Otherwise, all suitable scripts are suspended.",
+ (module, cmdparams) => HandleScriptsAction(cmdparams, HandleSuspendScript));
MainConsole.Instance.Commands.AddCommand(
- "scripts", false, "scripts resume", "scripts resume", "Resumes all suspended scripts",
+ "scripts", false, "scripts resume", "scripts resume []", "Resumes all suspended scripts",
"Resumes all currently suspended scripts.\n"
- + "Resumed scripts will process all events accumulated whilst suspended.",
- HandleResumeScripts);
+ + "Resumed scripts will process all events accumulated whilst suspended."
+ + "If a is given then only that script will be resumed. Otherwise, all suitable scripts are resumed.",
+ (module, cmdparams) => HandleScriptsAction(cmdparams, HandleResumeScript));
MainConsole.Instance.Commands.AddCommand(
- "scripts", false, "scripts stop", "scripts stop", "Stops all running scripts",
- HandleStopScripts);
+ "scripts", false, "scripts stop", "scripts stop []", "Stops all running scripts",
+ "Stops all running scripts."
+ + "If a is given then only that script will be stopped. Otherwise, all suitable scripts are stopped.",
+ (module, cmdparams) => HandleScriptsAction(cmdparams, HandleStopScript));
MainConsole.Instance.Commands.AddCommand(
- "scripts", false, "scripts start", "scripts start", "Starts all stopped scripts",
- HandleStartScripts);
+ "scripts", false, "scripts start", "scripts start []", "Starts all stopped scripts",
+ "Starts all stopped scripts."
+ + "If a is given then only that script will be started. Otherwise, all suitable scripts are started.",
+ (module, cmdparams) => HandleScriptsAction(cmdparams, HandleStartScript));
}
public void HandleShowScripts(string module, string[] cmdparams)
@@ -334,79 +340,101 @@ namespace OpenSim.Region.ScriptEngine.XEngine
}
}
- public void HandleSuspendScripts(string module, string[] cmdparams)
+ ///
+ /// Parse the raw item id into a script instance from the command params if it's present.
+ ///
+ ///
+ ///
+ /// true if we're okay to proceed, false if not.
+ private void HandleScriptsAction(string[] cmdparams, Action action)
{
lock (m_Scripts)
{
- foreach (IScriptInstance instance in m_Scripts.Values)
+ string rawItemId;
+ UUID itemId = UUID.Zero;
+
+ if (cmdparams.Length == 2)
{
- if (!instance.Suspended)
- {
- instance.Suspend();
+ foreach (IScriptInstance instance in m_Scripts.Values)
+ action(instance);
- SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID);
- MainConsole.Instance.OutputFormat(
- "Suspended {0}.{1}, item UUID {2}, prim UUID {3} @ {4}",
- instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition);
+ return;
+ }
+
+ rawItemId = cmdparams[2];
+
+ if (!UUID.TryParse(rawItemId, out itemId))
+ {
+ MainConsole.Instance.OutputFormat("Error - {0} is not a valid UUID", rawItemId);
+ return;
+ }
+
+ if (itemId != UUID.Zero)
+ {
+ IScriptInstance instance = GetInstance(itemId);
+ if (instance == null)
+ {
+ MainConsole.Instance.OutputFormat("Error - No item found with id {0}", itemId);
+ return;
+ }
+ else
+ {
+ action(instance);
+ return;
}
}
}
}
- public void HandleResumeScripts(string module, string[] cmdparams)
+ private void HandleSuspendScript(IScriptInstance instance)
{
- lock (m_Scripts)
+ if (!instance.Suspended)
{
- foreach (IScriptInstance instance in m_Scripts.Values)
- {
- if (instance.Suspended)
- {
- instance.Resume();
+ instance.Suspend();
- SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID);
- MainConsole.Instance.OutputFormat(
- "Resumed {0}.{1}, item UUID {2}, prim UUID {3} @ {4}",
- instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition);
- }
- }
+ SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID);
+ MainConsole.Instance.OutputFormat(
+ "Suspended {0}.{1}, item UUID {2}, prim UUID {3} @ {4}",
+ instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition);
}
}
- public void HandleStartScripts(string module, string[] cmdparams)
+ private void HandleResumeScript(IScriptInstance instance)
{
- lock (m_Scripts)
+ if (instance.Suspended)
{
- foreach (IScriptInstance instance in m_Scripts.Values)
- {
- if (!instance.Running)
- {
- instance.Start();
+ instance.Resume();
- SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID);
- MainConsole.Instance.OutputFormat(
- "Started {0}.{1}, item UUID {2}, prim UUID {3} @ {4}",
- instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition);
- }
- }
+ SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID);
+ MainConsole.Instance.OutputFormat(
+ "Resumed {0}.{1}, item UUID {2}, prim UUID {3} @ {4}",
+ instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition);
}
}
- public void HandleStopScripts(string module, string[] cmdparams)
+ private void HandleStartScript(IScriptInstance instance)
{
- lock (m_Scripts)
+ if (!instance.Running)
{
- foreach (IScriptInstance instance in m_Scripts.Values)
- {
- if (instance.Running)
- {
- instance.Stop(0);
+ instance.Start();
- SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID);
- MainConsole.Instance.OutputFormat(
- "Stopped {0}.{1}, item UUID {2}, prim UUID {3} @ {4}",
- instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition);
- }
- }
+ SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID);
+ MainConsole.Instance.OutputFormat(
+ "Started {0}.{1}, item UUID {2}, prim UUID {3} @ {4}",
+ instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition);
+ }
+ }
+
+ private void HandleStopScript(IScriptInstance instance)
+ {
+ if (instance.Running)
+ {
+ instance.Stop(0);
+
+ SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID);
+ MainConsole.Instance.OutputFormat(
+ "Stopped {0}.{1}, item UUID {2}, prim UUID {3} @ {4}",
+ instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition);
}
}
@@ -1770,19 +1798,15 @@ namespace OpenSim.Region.ScriptEngine.XEngine
public void SuspendScript(UUID itemID)
{
IScriptInstance instance = GetInstance(itemID);
- if (instance == null)
- return;
-
- instance.Suspend();
+ if (instance != null)
+ instance.Suspend();
}
public void ResumeScript(UUID itemID)
{
IScriptInstance instance = GetInstance(itemID);
- if (instance == null)
- return;
-
- instance.Resume();
+ if (instance != null)
+ instance.Resume();
}
}
-}
+}
\ No newline at end of file