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.)
0.8.0.3
Oren Hurvitz 2014-05-05 15:59:24 +03:00
parent 1e5cff32fc
commit eb79c882ea
4 changed files with 56 additions and 29 deletions

View File

@ -1167,11 +1167,19 @@ namespace OpenSim.Region.Framework.Scenes
InventoryFolderBase destFolder = InventoryService.GetFolderForType(remoteClient.AgentId, AssetType.TrashFolder); 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 // 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. // 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) if (group.GetInventoryItem(localID, itemID) != null)
{ {
@ -1183,11 +1191,12 @@ namespace OpenSim.Region.Framework.Scenes
group.RemoveInventoryItem(localID, itemID); group.RemoveInventoryItem(localID, itemID);
} }
part.SendPropertiesToClient(remoteClient); 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); TaskInventoryItem taskItem = part.Inventory.GetInventoryItem(itemId);
@ -1198,12 +1207,13 @@ namespace OpenSim.Region.Framework.Scenes
+ " inventory item from a prim's inventory item " + " inventory item from a prim's inventory item "
+ " but the required item does not exist in the prim's inventory", + " but the required item does not exist in the prim's inventory",
itemId, part.Name, part.UUID); itemId, part.Name, part.UUID);
message = "Item not found: " + itemId;
return null; return null;
} }
if ((destAgent != taskItem.OwnerID) && ((taskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0)) if ((destAgent != taskItem.OwnerID) && ((taskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0))
{ {
message = "Item doesn't have the Transfer permission.";
return null; return null;
} }
@ -1263,6 +1273,7 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
message = null;
return agentItem; return agentItem;
} }
@ -1273,19 +1284,19 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="folderID"></param> /// <param name="folderID"></param>
/// <param name="part"></param> /// <param name="part"></param>
/// <param name="itemID"></param> /// <param name="itemID"></param>
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( m_log.DebugFormat(
"[PRIM INVENTORY]: Adding item {0} from {1} to folder {2} for {3}", "[PRIM INVENTORY]: Adding item {0} from {1} to folder {2} for {3}",
itemId, part.Name, folderId, remoteClient.Name); 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) if (agentItem == null)
return null; return null;
agentItem.Folder = folderId; agentItem.Folder = folderId;
AddInventoryItem(remoteClient, agentItem); AddInventoryItem(remoteClient, agentItem);
message = null;
return agentItem; return agentItem;
} }
@ -1336,7 +1347,11 @@ namespace OpenSim.Region.Framework.Scenes
return; return;
} }
MoveTaskInventoryItem(remoteClient, folderId, part, itemId); string message;
InventoryItemBase item = MoveTaskInventoryItem(remoteClient, folderId, part, itemId, out message);
if (item == null)
remoteClient.SendAgentAlertMessage(message, false);
} }
/// <summary> /// <summary>
@ -1350,17 +1365,17 @@ namespace OpenSim.Region.Framework.Scenes
/// </param> /// </param>
/// <param name="part"></param> /// <param name="part"></param>
/// <param name="itemID"></param> /// <param name="itemID"></param>
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; ScenePresence avatar;
if (TryGetScenePresence(avatarId, out avatar)) if (TryGetScenePresence(avatarId, out avatar))
{ {
return MoveTaskInventoryItem(avatar.ControllingClient, folderId, part, itemId); return MoveTaskInventoryItem(avatar.ControllingClient, folderId, part, itemId, out message);
} }
else else
{ {
InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(avatarId, part, itemId); InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(avatarId, part, itemId, out message);
if (agentItem == null) if (agentItem == null)
return null; return null;
@ -1474,6 +1489,11 @@ namespace OpenSim.Region.Framework.Scenes
public UUID MoveTaskInventoryItems(UUID destID, string category, SceneObjectPart host, List<UUID> items) public UUID MoveTaskInventoryItems(UUID destID, string category, SceneObjectPart host, List<UUID> items)
{ {
ScenePresence avatar;
IClientAPI remoteClient = null;
if (TryGetScenePresence(destID, out avatar))
remoteClient = avatar.ControllingClient;
InventoryFolderBase rootFolder = InventoryService.GetRootFolder(destID); InventoryFolderBase rootFolder = InventoryService.GetRootFolder(destID);
UUID newFolderID = UUID.Random(); UUID newFolderID = UUID.Random();
@ -1483,7 +1503,8 @@ namespace OpenSim.Region.Framework.Scenes
foreach (UUID itemID in items) foreach (UUID itemID in items)
{ {
InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(destID, host, itemID); string message;
InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(destID, host, itemID, out message);
if (agentItem != null) if (agentItem != null)
{ {
@ -1491,18 +1512,17 @@ namespace OpenSim.Region.Framework.Scenes
AddInventoryItem(agentItem); AddInventoryItem(agentItem);
} }
else
{
if (remoteClient != null)
remoteClient.SendAgentAlertMessage(message, false);
}
} }
ScenePresence avatar = null; if (remoteClient != null)
if (TryGetScenePresence(destID, out avatar))
{ {
//profile.SendInventoryDecendents(avatar.ControllingClient, SendInventoryUpdate(remoteClient, rootFolder, true, false);
// profile.RootFolder.ID, true, false); SendInventoryUpdate(remoteClient, newFolder, false, true);
//profile.SendInventoryDecendents(avatar.ControllingClient,
// newFolderID, false, true);
SendInventoryUpdate(avatar.ControllingClient, rootFolder, true, false);
SendInventoryUpdate(avatar.ControllingClient, newFolder, false, true);
} }
return newFolderID; return newFolderID;

View File

@ -136,7 +136,8 @@ namespace OpenSim.Region.Framework.Tests
= InventoryArchiveUtils.FindFoldersByPath(scene.InventoryService, user1.PrincipalID, "Objects")[0]; = InventoryArchiveUtils.FindFoldersByPath(scene.InventoryService, user1.PrincipalID, "Objects")[0];
// Perform test // 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 InventoryItemBase ncUserItem
= InventoryArchiveUtils.FindItemByPath(scene.InventoryService, user1.PrincipalID, "Objects/ncItem"); = 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!"); scene, sop1, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900), "Hello World!");
// Perform test // 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 InventoryItemBase ncUserItem
= InventoryArchiveUtils.FindItemByPath(scene.InventoryService, user1.PrincipalID, "Notecards/ncItem"); = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, user1.PrincipalID, "Notecards/ncItem");

View File

@ -4127,10 +4127,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
} }
} }
// destination is an avatar // 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) if (agentItem == null)
{
llSay(0, message);
return; return;
}
if (m_TransferModule != null) if (m_TransferModule != null)
{ {

View File

@ -3397,14 +3397,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (sp == null) if (sp == null)
return; 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) if (newItem == null)
{ {
m_log.ErrorFormat( m_log.ErrorFormat(
"[OSSL API]: Could not create user inventory item {0} for {1}, attach point {2} in {3}", "[OSSL API]: Could not create user inventory item {0} for {1}, attach point {2} in {3}: {4}",
itemName, m_host.Name, attachmentPoint, World.Name); itemName, m_host.Name, attachmentPoint, World.Name, message);
((LSL_Api)m_LSL_Api).llSay(0, message);
return; return;
} }