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
parent
1e5cff32fc
commit
eb79c882ea
|
@ -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
|
|||
/// <param name="folderID"></param>
|
||||
/// <param name="part"></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(
|
||||
"[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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -1350,17 +1365,17 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// </param>
|
||||
/// <param name="part"></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;
|
||||
|
||||
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<UUID> 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;
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue