From eb79c882eab090ee5ee51cadac7bd1dc2e5ddb9f Mon Sep 17 00:00:00 2001
From: Oren Hurvitz
Date: Mon, 5 May 2014 15:59:24 +0300
Subject: Show more meaningful error messages when failed to move an item from
a prim to a user's inventory.
Also, actually show the error to the user in more cases. (Previously, sometimes the operation failed without telling the user anything.)
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 64 ++++++++++++++--------
.../Framework/Scenes/Tests/TaskInventoryTests.cs | 6 +-
.../Shared/Api/Implementation/LSL_Api.cs | 6 +-
.../Shared/Api/Implementation/OSSL_Api.cs | 9 +--
4 files changed, 56 insertions(+), 29 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 27cd5c6..4988868 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1167,11 +1167,19 @@ namespace OpenSim.Region.Framework.Scenes
InventoryFolderBase destFolder = InventoryService.GetFolderForType(remoteClient.AgentId, AssetType.TrashFolder);
- // Move the item to trash. If this is a copiable item, only
+ // Move the item to trash. If this is a copyable item, only
// a copy will be moved and we will still need to delete
- // the item from the prim. If it was no copy, is will be
+ // the item from the prim. If it was no copy, it will be
// deleted by this method.
- MoveTaskInventoryItem(remoteClient, destFolder.ID, part, itemID);
+ string message;
+ InventoryItemBase item2 = MoveTaskInventoryItem(remoteClient, destFolder.ID, part, itemID, out message);
+
+ if (item2 == null)
+ {
+ m_log.WarnFormat("[SCENE INVENTORY]: RemoveTaskInventory of item {0} failed: {1}", itemID, message);
+ remoteClient.SendAgentAlertMessage(message, false);
+ return;
+ }
if (group.GetInventoryItem(localID, itemID) != null)
{
@@ -1183,11 +1191,12 @@ namespace OpenSim.Region.Framework.Scenes
group.RemoveInventoryItem(localID, itemID);
}
+
part.SendPropertiesToClient(remoteClient);
}
}
- private InventoryItemBase CreateAgentInventoryItemFromTask(UUID destAgent, SceneObjectPart part, UUID itemId)
+ private InventoryItemBase CreateAgentInventoryItemFromTask(UUID destAgent, SceneObjectPart part, UUID itemId, out string message)
{
TaskInventoryItem taskItem = part.Inventory.GetInventoryItem(itemId);
@@ -1198,12 +1207,13 @@ namespace OpenSim.Region.Framework.Scenes
+ " inventory item from a prim's inventory item "
+ " but the required item does not exist in the prim's inventory",
itemId, part.Name, part.UUID);
-
+ message = "Item not found: " + itemId;
return null;
}
if ((destAgent != taskItem.OwnerID) && ((taskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0))
{
+ message = "Item doesn't have the Transfer permission.";
return null;
}
@@ -1263,6 +1273,7 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+ message = null;
return agentItem;
}
@@ -1273,19 +1284,19 @@ namespace OpenSim.Region.Framework.Scenes
///
///
///
- public InventoryItemBase MoveTaskInventoryItem(IClientAPI remoteClient, UUID folderId, SceneObjectPart part, UUID itemId)
+ public InventoryItemBase MoveTaskInventoryItem(IClientAPI remoteClient, UUID folderId, SceneObjectPart part, UUID itemId, out string message)
{
m_log.DebugFormat(
"[PRIM INVENTORY]: Adding item {0} from {1} to folder {2} for {3}",
itemId, part.Name, folderId, remoteClient.Name);
- InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(remoteClient.AgentId, part, itemId);
-
+ InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(remoteClient.AgentId, part, itemId, out message);
if (agentItem == null)
return null;
agentItem.Folder = folderId;
AddInventoryItem(remoteClient, agentItem);
+ message = null;
return agentItem;
}
@@ -1336,7 +1347,11 @@ namespace OpenSim.Region.Framework.Scenes
return;
}
- MoveTaskInventoryItem(remoteClient, folderId, part, itemId);
+ string message;
+ InventoryItemBase item = MoveTaskInventoryItem(remoteClient, folderId, part, itemId, out message);
+
+ if (item == null)
+ remoteClient.SendAgentAlertMessage(message, false);
}
///
@@ -1350,17 +1365,17 @@ namespace OpenSim.Region.Framework.Scenes
///
///
///
- public InventoryItemBase MoveTaskInventoryItem(UUID avatarId, UUID folderId, SceneObjectPart part, UUID itemId)
+ public InventoryItemBase MoveTaskInventoryItem(UUID avatarId, UUID folderId, SceneObjectPart part, UUID itemId, out string message)
{
ScenePresence avatar;
if (TryGetScenePresence(avatarId, out avatar))
{
- return MoveTaskInventoryItem(avatar.ControllingClient, folderId, part, itemId);
+ return MoveTaskInventoryItem(avatar.ControllingClient, folderId, part, itemId, out message);
}
else
{
- InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(avatarId, part, itemId);
+ InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(avatarId, part, itemId, out message);
if (agentItem == null)
return null;
@@ -1474,6 +1489,11 @@ namespace OpenSim.Region.Framework.Scenes
public UUID MoveTaskInventoryItems(UUID destID, string category, SceneObjectPart host, List items)
{
+ ScenePresence avatar;
+ IClientAPI remoteClient = null;
+ if (TryGetScenePresence(destID, out avatar))
+ remoteClient = avatar.ControllingClient;
+
InventoryFolderBase rootFolder = InventoryService.GetRootFolder(destID);
UUID newFolderID = UUID.Random();
@@ -1483,7 +1503,8 @@ namespace OpenSim.Region.Framework.Scenes
foreach (UUID itemID in items)
{
- InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(destID, host, itemID);
+ string message;
+ InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(destID, host, itemID, out message);
if (agentItem != null)
{
@@ -1491,18 +1512,17 @@ namespace OpenSim.Region.Framework.Scenes
AddInventoryItem(agentItem);
}
+ else
+ {
+ if (remoteClient != null)
+ remoteClient.SendAgentAlertMessage(message, false);
+ }
}
- ScenePresence avatar = null;
- if (TryGetScenePresence(destID, out avatar))
+ if (remoteClient != null)
{
- //profile.SendInventoryDecendents(avatar.ControllingClient,
- // profile.RootFolder.ID, true, false);
- //profile.SendInventoryDecendents(avatar.ControllingClient,
- // newFolderID, false, true);
-
- SendInventoryUpdate(avatar.ControllingClient, rootFolder, true, false);
- SendInventoryUpdate(avatar.ControllingClient, newFolder, false, true);
+ SendInventoryUpdate(remoteClient, rootFolder, true, false);
+ SendInventoryUpdate(remoteClient, newFolder, false, true);
}
return newFolderID;
diff --git a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs
index 6e0ea7d..f809267 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs
@@ -136,7 +136,8 @@ namespace OpenSim.Region.Framework.Tests
= InventoryArchiveUtils.FindFoldersByPath(scene.InventoryService, user1.PrincipalID, "Objects")[0];
// Perform test
- scene.MoveTaskInventoryItem(user1.PrincipalID, folder.ID, sop1, sopItem1.ItemID);
+ string message;
+ scene.MoveTaskInventoryItem(user1.PrincipalID, folder.ID, sop1, sopItem1.ItemID, out message);
InventoryItemBase ncUserItem
= InventoryArchiveUtils.FindItemByPath(scene.InventoryService, user1.PrincipalID, "Objects/ncItem");
@@ -165,7 +166,8 @@ namespace OpenSim.Region.Framework.Tests
scene, sop1, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900), "Hello World!");
// Perform test
- scene.MoveTaskInventoryItem(user1.PrincipalID, UUID.Zero, sop1, sopItem1.ItemID);
+ string message;
+ scene.MoveTaskInventoryItem(user1.PrincipalID, UUID.Zero, sop1, sopItem1.ItemID, out message);
InventoryItemBase ncUserItem
= InventoryArchiveUtils.FindItemByPath(scene.InventoryService, user1.PrincipalID, "Notecards/ncItem");
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 0e6b24a..d169912 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -4127,10 +4127,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
}
// destination is an avatar
- InventoryItemBase agentItem = World.MoveTaskInventoryItem(destId, UUID.Zero, m_host, objId);
+ string message;
+ InventoryItemBase agentItem = World.MoveTaskInventoryItem(destId, UUID.Zero, m_host, objId, out message);
if (agentItem == null)
+ {
+ llSay(0, message);
return;
+ }
if (m_TransferModule != null)
{
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 6302455..de2c3f7 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -3397,14 +3397,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (sp == null)
return;
- InventoryItemBase newItem = World.MoveTaskInventoryItem(sp.UUID, UUID.Zero, m_host, item.ItemID);
+ string message;
+ InventoryItemBase newItem = World.MoveTaskInventoryItem(sp.UUID, UUID.Zero, m_host, item.ItemID, out message);
if (newItem == null)
{
m_log.ErrorFormat(
- "[OSSL API]: Could not create user inventory item {0} for {1}, attach point {2} in {3}",
- itemName, m_host.Name, attachmentPoint, World.Name);
-
+ "[OSSL API]: Could not create user inventory item {0} for {1}, attach point {2} in {3}: {4}",
+ itemName, m_host.Name, attachmentPoint, World.Name, message);
+ ((LSL_Api)m_LSL_Api).llSay(0, message);
return;
}
--
cgit v1.1