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);
|
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;
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue