diff --git a/OpenSim/Framework/Capabilities/Caps.cs b/OpenSim/Framework/Capabilities/Caps.cs
index 1f1ac78d93..74c6ab0dc6 100644
--- a/OpenSim/Framework/Capabilities/Caps.cs
+++ b/OpenSim/Framework/Capabilities/Caps.cs
@@ -46,7 +46,7 @@ namespace OpenSim.Framework.Capabilities
public delegate UUID UpdateItem(UUID itemID, byte[] data);
- public delegate void UpdateTaskScript(UUID itemID, UUID primID, bool isScriptRunning, byte[] data);
+ public delegate void UpdateTaskScript(UUID itemID, UUID primID, bool isScriptRunning, byte[] data, ref ArrayList errors);
public delegate void NewInventoryItem(UUID userID, InventoryItemBase item);
@@ -54,7 +54,7 @@ namespace OpenSim.Framework.Capabilities
public delegate UUID ItemUpdatedCallback(UUID userID, UUID itemID, byte[] data);
- public delegate void TaskScriptUpdatedCallback(UUID userID, UUID itemID, UUID primID,
+ public delegate ArrayList TaskScriptUpdatedCallback(UUID userID, UUID itemID, UUID primID,
bool isScriptRunning, byte[] data);
public delegate InventoryCollection FetchInventoryDescendentsCAPS(UUID agentID, UUID folderID, UUID ownerID,
@@ -940,11 +940,13 @@ namespace OpenSim.Framework.Capabilities
/// Prim containing item to update
/// Signals whether the script to update is currently running
/// New asset data
- public void TaskScriptUpdated(UUID itemID, UUID primID, bool isScriptRunning, byte[] data)
+ public void TaskScriptUpdated(UUID itemID, UUID primID, bool isScriptRunning, byte[] data, ref ArrayList errors)
{
if (TaskScriptUpdatedCall != null)
{
- TaskScriptUpdatedCall(m_agentID, itemID, primID, isScriptRunning, data);
+ ArrayList e = TaskScriptUpdatedCall(m_agentID, itemID, primID, isScriptRunning, data);
+ foreach (Object item in e)
+ errors.Add(item);
}
}
@@ -1174,17 +1176,20 @@ namespace OpenSim.Framework.Capabilities
// data, path, param));
string res = String.Empty;
- LLSDTaskInventoryUploadComplete uploadComplete = new LLSDTaskInventoryUploadComplete();
+ LLSDTaskScriptUploadComplete uploadComplete = new LLSDTaskScriptUploadComplete();
+ ArrayList errors = new ArrayList();
handlerUpdateTaskScript = OnUpLoad;
if (handlerUpdateTaskScript != null)
{
- handlerUpdateTaskScript(inventoryItemID, primID, isScriptRunning, data);
+ handlerUpdateTaskScript(inventoryItemID, primID, isScriptRunning, data, ref errors);
}
- uploadComplete.item_id = inventoryItemID;
- uploadComplete.task_id = primID;
+ uploadComplete.new_asset = inventoryItemID;
+ uploadComplete.compiled = errors.Count > 0 ? false : true;
uploadComplete.state = "complete";
+ uploadComplete.errors = new OSDArray();
+ uploadComplete.errors.Array = errors;
res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
index 89a45da1c9..67395fa23d 100644
--- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
@@ -26,6 +26,7 @@
*/
using System.Collections.Generic;
+using System.Collections;
using OpenMetaverse;
using OpenSim.Framework;
@@ -71,6 +72,7 @@ namespace OpenSim.Region.Framework.Interfaces
/// Start all the scripts contained in this entity's inventory
///
void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource);
+ ArrayList GetScriptErrors(UUID itemID);
///
/// Stop all the scripts in this entity.
diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
index 98efcbef57..e90b3004fe 100644
--- a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
@@ -26,6 +26,7 @@
*/
using System;
+using System.Collections;
using OpenMetaverse;
namespace OpenSim.Region.Framework.Interfaces
@@ -39,5 +40,7 @@ namespace OpenSim.Region.Framework.Interfaces
bool PostScriptEvent(UUID itemID, string name, Object[] args);
bool PostObjectEvent(UUID itemID, string name, Object[] args);
+
+ ArrayList GetScriptErrors(UUID itemID);
}
}
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 7ca779a7ea..bce7d324fe 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -27,6 +27,7 @@
using System;
using System.Collections.Generic;
+using System.Collections;
using System.Reflection;
using System.Text;
using System.Timers;
@@ -215,13 +216,13 @@ namespace OpenSim.Region.Framework.Scenes
/// The prim which contains the item to update
/// Indicates whether the script to update is currently running
///
- public void CapsUpdateTaskInventoryScriptAsset(IClientAPI remoteClient, UUID itemId,
+ public ArrayList CapsUpdateTaskInventoryScriptAsset(IClientAPI remoteClient, UUID itemId,
UUID primId, bool isScriptRunning, byte[] data)
{
if (!Permissions.CanEditScript(itemId, primId, remoteClient.AgentId))
{
remoteClient.SendAgentAlertMessage("Insufficient permissions to edit script", false);
- return;
+ return new ArrayList();
}
// Retrieve group
@@ -234,7 +235,7 @@ namespace OpenSim.Region.Framework.Scenes
"Prim inventory update requested for item ID {0} in prim ID {1} but this prim does not exist",
itemId, primId);
- return;
+ return new ArrayList();
}
// Retrieve item
@@ -247,7 +248,7 @@ namespace OpenSim.Region.Framework.Scenes
+ " but the item does not exist in this inventory",
itemId, part.Name, part.UUID);
- return;
+ return new ArrayList();
}
AssetBase asset = CreateAsset(item.Name, item.Description, (sbyte)AssetType.LSLText, data);
@@ -264,29 +265,33 @@ namespace OpenSim.Region.Framework.Scenes
part.GetProperties(remoteClient);
// Trigger rerunning of script (use TriggerRezScript event, see RezScript)
+ ArrayList errors = new ArrayList();
+
if (isScriptRunning)
{
// Needs to determine which engine was running it and use that
//
part.Inventory.CreateScriptInstance(item.ItemID, 0, false, DefaultScriptEngine, 0);
+ errors = part.Inventory.GetScriptErrors(item.ItemID);
}
else
{
remoteClient.SendAgentAlertMessage("Script saved", false);
}
+ return errors;
}
///
/// CapsUpdateTaskInventoryScriptAsset(IClientAPI, UUID, UUID, bool, byte[])
///
- public void CapsUpdateTaskInventoryScriptAsset(UUID avatarId, UUID itemId,
+ public ArrayList CapsUpdateTaskInventoryScriptAsset(UUID avatarId, UUID itemId,
UUID primId, bool isScriptRunning, byte[] data)
{
ScenePresence avatar;
if (TryGetAvatar(avatarId, out avatar))
{
- CapsUpdateTaskInventoryScriptAsset(
+ return CapsUpdateTaskInventoryScriptAsset(
avatar.ControllingClient, itemId, primId, isScriptRunning, data);
}
else
@@ -295,6 +300,7 @@ namespace OpenSim.Region.Framework.Scenes
"[PRIM INVENTORY]: " +
"Avatar {0} cannot be found to update its prim item asset",
avatarId);
+ return new ArrayList();
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index cdd23bd98d..c3c6342974 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -29,6 +29,7 @@ using System;
using System.Xml;
using System.IO;
using System.Collections.Generic;
+using System.Collections;
using System.Reflection;
using OpenMetaverse;
using log4net;
@@ -210,6 +211,27 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+ public ArrayList GetScriptErrors(UUID itemID)
+ {
+ ArrayList ret = new ArrayList();
+
+ IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces();
+ if (engines == null) // No engine at all
+ return ret;
+
+ foreach (IScriptModule e in engines)
+ {
+ if (e != null)
+ {
+ ArrayList errors = e.GetScriptErrors(itemID);
+ foreach (Object line in errors)
+ ret.Add(line);
+ }
+ }
+
+ return ret;
+ }
+
///
/// Stop all the scripts in this prim.
///
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 2a9a2dbc9d..31684ae78d 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -1552,5 +1552,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine
return true;
}
+
+ public ArrayList GetScriptErrors(UUID itemID)
+ {
+ return new ArrayList();
+ }
}
}