aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorOren Hurvitz2014-05-05 15:59:24 +0300
committerOren Hurvitz2014-05-06 07:28:45 +0100
commiteb79c882eab090ee5ee51cadac7bd1dc2e5ddb9f (patch)
tree22036030b5b13ee158db4dd532d84895f6c04d82 /OpenSim/Region
parentShow more meaningful error messages when failed to give an item to another user (diff)
downloadopensim-SC-eb79c882eab090ee5ee51cadac7bd1dc2e5ddb9f.zip
opensim-SC-eb79c882eab090ee5ee51cadac7bd1dc2e5ddb9f.tar.gz
opensim-SC-eb79c882eab090ee5ee51cadac7bd1dc2e5ddb9f.tar.bz2
opensim-SC-eb79c882eab090ee5ee51cadac7bd1dc2e5ddb9f.tar.xz
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.)
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs64
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs6
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs6
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs9
4 files changed, 56 insertions, 29 deletions
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
1167 1167
1168 InventoryFolderBase destFolder = InventoryService.GetFolderForType(remoteClient.AgentId, AssetType.TrashFolder); 1168 InventoryFolderBase destFolder = InventoryService.GetFolderForType(remoteClient.AgentId, AssetType.TrashFolder);
1169 1169
1170 // Move the item to trash. If this is a copiable item, only 1170 // Move the item to trash. If this is a copyable item, only
1171 // a copy will be moved and we will still need to delete 1171 // a copy will be moved and we will still need to delete
1172 // the item from the prim. If it was no copy, is will be 1172 // the item from the prim. If it was no copy, it will be
1173 // deleted by this method. 1173 // deleted by this method.
1174 MoveTaskInventoryItem(remoteClient, destFolder.ID, part, itemID); 1174 string message;
1175 InventoryItemBase item2 = MoveTaskInventoryItem(remoteClient, destFolder.ID, part, itemID, out message);
1176
1177 if (item2 == null)
1178 {
1179 m_log.WarnFormat("[SCENE INVENTORY]: RemoveTaskInventory of item {0} failed: {1}", itemID, message);
1180 remoteClient.SendAgentAlertMessage(message, false);
1181 return;
1182 }
1175 1183
1176 if (group.GetInventoryItem(localID, itemID) != null) 1184 if (group.GetInventoryItem(localID, itemID) != null)
1177 { 1185 {
@@ -1183,11 +1191,12 @@ namespace OpenSim.Region.Framework.Scenes
1183 1191
1184 group.RemoveInventoryItem(localID, itemID); 1192 group.RemoveInventoryItem(localID, itemID);
1185 } 1193 }
1194
1186 part.SendPropertiesToClient(remoteClient); 1195 part.SendPropertiesToClient(remoteClient);
1187 } 1196 }
1188 } 1197 }
1189 1198
1190 private InventoryItemBase CreateAgentInventoryItemFromTask(UUID destAgent, SceneObjectPart part, UUID itemId) 1199 private InventoryItemBase CreateAgentInventoryItemFromTask(UUID destAgent, SceneObjectPart part, UUID itemId, out string message)
1191 { 1200 {
1192 TaskInventoryItem taskItem = part.Inventory.GetInventoryItem(itemId); 1201 TaskInventoryItem taskItem = part.Inventory.GetInventoryItem(itemId);
1193 1202
@@ -1198,12 +1207,13 @@ namespace OpenSim.Region.Framework.Scenes
1198 + " inventory item from a prim's inventory item " 1207 + " inventory item from a prim's inventory item "
1199 + " but the required item does not exist in the prim's inventory", 1208 + " but the required item does not exist in the prim's inventory",
1200 itemId, part.Name, part.UUID); 1209 itemId, part.Name, part.UUID);
1201 1210 message = "Item not found: " + itemId;
1202 return null; 1211 return null;
1203 } 1212 }
1204 1213
1205 if ((destAgent != taskItem.OwnerID) && ((taskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0)) 1214 if ((destAgent != taskItem.OwnerID) && ((taskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0))
1206 { 1215 {
1216 message = "Item doesn't have the Transfer permission.";
1207 return null; 1217 return null;
1208 } 1218 }
1209 1219
@@ -1263,6 +1273,7 @@ namespace OpenSim.Region.Framework.Scenes
1263 } 1273 }
1264 } 1274 }
1265 1275
1276 message = null;
1266 return agentItem; 1277 return agentItem;
1267 } 1278 }
1268 1279
@@ -1273,19 +1284,19 @@ namespace OpenSim.Region.Framework.Scenes
1273 /// <param name="folderID"></param> 1284 /// <param name="folderID"></param>
1274 /// <param name="part"></param> 1285 /// <param name="part"></param>
1275 /// <param name="itemID"></param> 1286 /// <param name="itemID"></param>
1276 public InventoryItemBase MoveTaskInventoryItem(IClientAPI remoteClient, UUID folderId, SceneObjectPart part, UUID itemId) 1287 public InventoryItemBase MoveTaskInventoryItem(IClientAPI remoteClient, UUID folderId, SceneObjectPart part, UUID itemId, out string message)
1277 { 1288 {
1278 m_log.DebugFormat( 1289 m_log.DebugFormat(
1279 "[PRIM INVENTORY]: Adding item {0} from {1} to folder {2} for {3}", 1290 "[PRIM INVENTORY]: Adding item {0} from {1} to folder {2} for {3}",
1280 itemId, part.Name, folderId, remoteClient.Name); 1291 itemId, part.Name, folderId, remoteClient.Name);
1281 1292
1282 InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(remoteClient.AgentId, part, itemId); 1293 InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(remoteClient.AgentId, part, itemId, out message);
1283
1284 if (agentItem == null) 1294 if (agentItem == null)
1285 return null; 1295 return null;
1286 1296
1287 agentItem.Folder = folderId; 1297 agentItem.Folder = folderId;
1288 AddInventoryItem(remoteClient, agentItem); 1298 AddInventoryItem(remoteClient, agentItem);
1299 message = null;
1289 return agentItem; 1300 return agentItem;
1290 } 1301 }
1291 1302
@@ -1336,7 +1347,11 @@ namespace OpenSim.Region.Framework.Scenes
1336 return; 1347 return;
1337 } 1348 }
1338 1349
1339 MoveTaskInventoryItem(remoteClient, folderId, part, itemId); 1350 string message;
1351 InventoryItemBase item = MoveTaskInventoryItem(remoteClient, folderId, part, itemId, out message);
1352
1353 if (item == null)
1354 remoteClient.SendAgentAlertMessage(message, false);
1340 } 1355 }
1341 1356
1342 /// <summary> 1357 /// <summary>
@@ -1350,17 +1365,17 @@ namespace OpenSim.Region.Framework.Scenes
1350 /// </param> 1365 /// </param>
1351 /// <param name="part"></param> 1366 /// <param name="part"></param>
1352 /// <param name="itemID"></param> 1367 /// <param name="itemID"></param>
1353 public InventoryItemBase MoveTaskInventoryItem(UUID avatarId, UUID folderId, SceneObjectPart part, UUID itemId) 1368 public InventoryItemBase MoveTaskInventoryItem(UUID avatarId, UUID folderId, SceneObjectPart part, UUID itemId, out string message)
1354 { 1369 {
1355 ScenePresence avatar; 1370 ScenePresence avatar;
1356 1371
1357 if (TryGetScenePresence(avatarId, out avatar)) 1372 if (TryGetScenePresence(avatarId, out avatar))
1358 { 1373 {
1359 return MoveTaskInventoryItem(avatar.ControllingClient, folderId, part, itemId); 1374 return MoveTaskInventoryItem(avatar.ControllingClient, folderId, part, itemId, out message);
1360 } 1375 }
1361 else 1376 else
1362 { 1377 {
1363 InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(avatarId, part, itemId); 1378 InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(avatarId, part, itemId, out message);
1364 1379
1365 if (agentItem == null) 1380 if (agentItem == null)
1366 return null; 1381 return null;
@@ -1474,6 +1489,11 @@ namespace OpenSim.Region.Framework.Scenes
1474 1489
1475 public UUID MoveTaskInventoryItems(UUID destID, string category, SceneObjectPart host, List<UUID> items) 1490 public UUID MoveTaskInventoryItems(UUID destID, string category, SceneObjectPart host, List<UUID> items)
1476 { 1491 {
1492 ScenePresence avatar;
1493 IClientAPI remoteClient = null;
1494 if (TryGetScenePresence(destID, out avatar))
1495 remoteClient = avatar.ControllingClient;
1496
1477 InventoryFolderBase rootFolder = InventoryService.GetRootFolder(destID); 1497 InventoryFolderBase rootFolder = InventoryService.GetRootFolder(destID);
1478 1498
1479 UUID newFolderID = UUID.Random(); 1499 UUID newFolderID = UUID.Random();
@@ -1483,7 +1503,8 @@ namespace OpenSim.Region.Framework.Scenes
1483 1503
1484 foreach (UUID itemID in items) 1504 foreach (UUID itemID in items)
1485 { 1505 {
1486 InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(destID, host, itemID); 1506 string message;
1507 InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(destID, host, itemID, out message);
1487 1508
1488 if (agentItem != null) 1509 if (agentItem != null)
1489 { 1510 {
@@ -1491,18 +1512,17 @@ namespace OpenSim.Region.Framework.Scenes
1491 1512
1492 AddInventoryItem(agentItem); 1513 AddInventoryItem(agentItem);
1493 } 1514 }
1515 else
1516 {
1517 if (remoteClient != null)
1518 remoteClient.SendAgentAlertMessage(message, false);
1519 }
1494 } 1520 }
1495 1521
1496 ScenePresence avatar = null; 1522 if (remoteClient != null)
1497 if (TryGetScenePresence(destID, out avatar))
1498 { 1523 {
1499 //profile.SendInventoryDecendents(avatar.ControllingClient, 1524 SendInventoryUpdate(remoteClient, rootFolder, true, false);
1500 // profile.RootFolder.ID, true, false); 1525 SendInventoryUpdate(remoteClient, newFolder, false, true);
1501 //profile.SendInventoryDecendents(avatar.ControllingClient,
1502 // newFolderID, false, true);
1503
1504 SendInventoryUpdate(avatar.ControllingClient, rootFolder, true, false);
1505 SendInventoryUpdate(avatar.ControllingClient, newFolder, false, true);
1506 } 1526 }
1507 1527
1508 return newFolderID; 1528 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
136 = InventoryArchiveUtils.FindFoldersByPath(scene.InventoryService, user1.PrincipalID, "Objects")[0]; 136 = InventoryArchiveUtils.FindFoldersByPath(scene.InventoryService, user1.PrincipalID, "Objects")[0];
137 137
138 // Perform test 138 // Perform test
139 scene.MoveTaskInventoryItem(user1.PrincipalID, folder.ID, sop1, sopItem1.ItemID); 139 string message;
140 scene.MoveTaskInventoryItem(user1.PrincipalID, folder.ID, sop1, sopItem1.ItemID, out message);
140 141
141 InventoryItemBase ncUserItem 142 InventoryItemBase ncUserItem
142 = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, user1.PrincipalID, "Objects/ncItem"); 143 = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, user1.PrincipalID, "Objects/ncItem");
@@ -165,7 +166,8 @@ namespace OpenSim.Region.Framework.Tests
165 scene, sop1, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900), "Hello World!"); 166 scene, sop1, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900), "Hello World!");
166 167
167 // Perform test 168 // Perform test
168 scene.MoveTaskInventoryItem(user1.PrincipalID, UUID.Zero, sop1, sopItem1.ItemID); 169 string message;
170 scene.MoveTaskInventoryItem(user1.PrincipalID, UUID.Zero, sop1, sopItem1.ItemID, out message);
169 171
170 InventoryItemBase ncUserItem 172 InventoryItemBase ncUserItem
171 = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, user1.PrincipalID, "Notecards/ncItem"); 173 = 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
4127 } 4127 }
4128 } 4128 }
4129 // destination is an avatar 4129 // destination is an avatar
4130 InventoryItemBase agentItem = World.MoveTaskInventoryItem(destId, UUID.Zero, m_host, objId); 4130 string message;
4131 InventoryItemBase agentItem = World.MoveTaskInventoryItem(destId, UUID.Zero, m_host, objId, out message);
4131 4132
4132 if (agentItem == null) 4133 if (agentItem == null)
4134 {
4135 llSay(0, message);
4133 return; 4136 return;
4137 }
4134 4138
4135 if (m_TransferModule != null) 4139 if (m_TransferModule != null)
4136 { 4140 {
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
3397 if (sp == null) 3397 if (sp == null)
3398 return; 3398 return;
3399 3399
3400 InventoryItemBase newItem = World.MoveTaskInventoryItem(sp.UUID, UUID.Zero, m_host, item.ItemID); 3400 string message;
3401 InventoryItemBase newItem = World.MoveTaskInventoryItem(sp.UUID, UUID.Zero, m_host, item.ItemID, out message);
3401 3402
3402 if (newItem == null) 3403 if (newItem == null)
3403 { 3404 {
3404 m_log.ErrorFormat( 3405 m_log.ErrorFormat(
3405 "[OSSL API]: Could not create user inventory item {0} for {1}, attach point {2} in {3}", 3406 "[OSSL API]: Could not create user inventory item {0} for {1}, attach point {2} in {3}: {4}",
3406 itemName, m_host.Name, attachmentPoint, World.Name); 3407 itemName, m_host.Name, attachmentPoint, World.Name, message);
3407 3408 ((LSL_Api)m_LSL_Api).llSay(0, message);
3408 return; 3409 return;
3409 } 3410 }
3410 3411