aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Scene.Inventory.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs130
1 files changed, 95 insertions, 35 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index bb9f457..91f1b63 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -46,7 +46,7 @@ namespace OpenSim.Region.Framework.Scenes
46{ 46{
47 public partial class Scene 47 public partial class Scene
48 { 48 {
49 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 49 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
50 private static readonly string LogHeader = "[SCENE INVENTORY]"; 50 private static readonly string LogHeader = "[SCENE INVENTORY]";
51 51
52 /// <summary> 52 /// <summary>
@@ -534,9 +534,9 @@ namespace OpenSim.Region.Framework.Scenes
534 /// <param name="recipientClient"></param> 534 /// <param name="recipientClient"></param>
535 /// <param name="senderId">ID of the sender of the item</param> 535 /// <param name="senderId">ID of the sender of the item</param>
536 /// <param name="itemId"></param> 536 /// <param name="itemId"></param>
537 public virtual void GiveInventoryItem(IClientAPI recipientClient, UUID senderId, UUID itemId) 537 public virtual void GiveInventoryItem(IClientAPI recipientClient, UUID senderId, UUID itemId, out string message)
538 { 538 {
539 InventoryItemBase itemCopy = GiveInventoryItem(recipientClient.AgentId, senderId, itemId); 539 InventoryItemBase itemCopy = GiveInventoryItem(recipientClient.AgentId, senderId, itemId, out message);
540 540
541 if (itemCopy != null) 541 if (itemCopy != null)
542 recipientClient.SendBulkUpdateInventory(itemCopy); 542 recipientClient.SendBulkUpdateInventory(itemCopy);
@@ -549,9 +549,9 @@ namespace OpenSim.Region.Framework.Scenes
549 /// <param name="senderId">ID of the sender of the item</param> 549 /// <param name="senderId">ID of the sender of the item</param>
550 /// <param name="itemId"></param> 550 /// <param name="itemId"></param>
551 /// <returns>The inventory item copy given, null if the give was unsuccessful</returns> 551 /// <returns>The inventory item copy given, null if the give was unsuccessful</returns>
552 public virtual InventoryItemBase GiveInventoryItem(UUID recipient, UUID senderId, UUID itemId) 552 public virtual InventoryItemBase GiveInventoryItem(UUID recipient, UUID senderId, UUID itemId, out string message)
553 { 553 {
554 return GiveInventoryItem(recipient, senderId, itemId, UUID.Zero); 554 return GiveInventoryItem(recipient, senderId, itemId, UUID.Zero, out message);
555 } 555 }
556 556
557 /// <summary> 557 /// <summary>
@@ -568,12 +568,15 @@ namespace OpenSim.Region.Framework.Scenes
568 /// The inventory item copy given, null if the give was unsuccessful 568 /// The inventory item copy given, null if the give was unsuccessful
569 /// </returns> 569 /// </returns>
570 public virtual InventoryItemBase GiveInventoryItem( 570 public virtual InventoryItemBase GiveInventoryItem(
571 UUID recipient, UUID senderId, UUID itemId, UUID recipientFolderId) 571 UUID recipient, UUID senderId, UUID itemId, UUID recipientFolderId, out string message)
572 { 572 {
573 //Console.WriteLine("Scene.Inventory.cs: GiveInventoryItem"); 573 //Console.WriteLine("Scene.Inventory.cs: GiveInventoryItem");
574 574
575 if (!Permissions.CanTransferUserInventory(itemId, senderId, recipient)) 575 if (!Permissions.CanTransferUserInventory(itemId, senderId, recipient))
576 {
577 message = "Not allowed to transfer this item.";
576 return null; 578 return null;
579 }
577 580
578 InventoryItemBase item = new InventoryItemBase(itemId, senderId); 581 InventoryItemBase item = new InventoryItemBase(itemId, senderId);
579 item = InventoryService.GetItem(item); 582 item = InventoryService.GetItem(item);
@@ -582,6 +585,7 @@ namespace OpenSim.Region.Framework.Scenes
582 { 585 {
583 m_log.WarnFormat( 586 m_log.WarnFormat(
584 "[AGENT INVENTORY]: Failed to find item {0} sent by {1} to {2}", itemId, senderId, recipient); 587 "[AGENT INVENTORY]: Failed to find item {0} sent by {1} to {2}", itemId, senderId, recipient);
588 message = string.Format("Item not found: {0}.", itemId);
585 return null; 589 return null;
586 } 590 }
587 591
@@ -590,6 +594,7 @@ namespace OpenSim.Region.Framework.Scenes
590 m_log.WarnFormat( 594 m_log.WarnFormat(
591 "[AGENT INVENTORY]: Attempt to send item {0} {1} to {2} failed because sender {3} did not match item owner {4}", 595 "[AGENT INVENTORY]: Attempt to send item {0} {1} to {2} failed because sender {3} did not match item owner {4}",
592 item.Name, item.ID, recipient, senderId, item.Owner); 596 item.Name, item.ID, recipient, senderId, item.Owner);
597 message = "Sender did not match item owner.";
593 return null; 598 return null;
594 } 599 }
595 600
@@ -600,7 +605,10 @@ namespace OpenSim.Region.Framework.Scenes
600 if (!Permissions.BypassPermissions()) 605 if (!Permissions.BypassPermissions())
601 { 606 {
602 if ((item.CurrentPermissions & (uint)PermissionMask.Transfer) == 0) 607 if ((item.CurrentPermissions & (uint)PermissionMask.Transfer) == 0)
608 {
609 message = "Item doesn't have the Transfer permission.";
603 return null; 610 return null;
611 }
604 } 612 }
605 613
606 // Insert a copy of the item into the recipient 614 // Insert a copy of the item into the recipient
@@ -736,9 +744,14 @@ namespace OpenSim.Region.Framework.Scenes
736 InventoryFolderBase root = InventoryService.GetRootFolder(recipient); 744 InventoryFolderBase root = InventoryService.GetRootFolder(recipient);
737 745
738 if (root != null) 746 if (root != null)
747 {
739 itemCopy.Folder = root.ID; 748 itemCopy.Folder = root.ID;
749 }
740 else 750 else
741 return null; // No destination 751 {
752 message = "Can't find a folder to add the item to.";
753 return null;
754 }
742 } 755 }
743 } 756 }
744 757
@@ -763,6 +776,7 @@ namespace OpenSim.Region.Framework.Scenes
763 } 776 }
764 } 777 }
765 778
779 message = null;
766 return itemCopy; 780 return itemCopy;
767 } 781 }
768 782
@@ -780,7 +794,7 @@ namespace OpenSim.Region.Framework.Scenes
780 /// <returns> 794 /// <returns>
781 /// The inventory folder copy given, null if the copy was unsuccessful 795 /// The inventory folder copy given, null if the copy was unsuccessful
782 /// </returns> 796 /// </returns>
783 public virtual InventoryFolderBase GiveInventoryFolder( 797 public virtual InventoryFolderBase GiveInventoryFolder(IClientAPI client,
784 UUID recipientId, UUID senderId, UUID folderId, UUID recipientParentFolderId) 798 UUID recipientId, UUID senderId, UUID folderId, UUID recipientParentFolderId)
785 { 799 {
786 //// Retrieve the folder from the sender 800 //// Retrieve the folder from the sender
@@ -815,13 +829,18 @@ namespace OpenSim.Region.Framework.Scenes
815 InventoryCollection contents = InventoryService.GetFolderContent(senderId, folderId); 829 InventoryCollection contents = InventoryService.GetFolderContent(senderId, folderId);
816 foreach (InventoryFolderBase childFolder in contents.Folders) 830 foreach (InventoryFolderBase childFolder in contents.Folders)
817 { 831 {
818 GiveInventoryFolder(recipientId, senderId, childFolder.ID, newFolder.ID); 832 GiveInventoryFolder(client, recipientId, senderId, childFolder.ID, newFolder.ID);
819 } 833 }
820 834
821 // Give all the items 835 // Give all the items
822 foreach (InventoryItemBase item in contents.Items) 836 foreach (InventoryItemBase item in contents.Items)
823 { 837 {
824 GiveInventoryItem(recipientId, senderId, item.ID, newFolder.ID); 838 string message;
839 if (GiveInventoryItem(recipientId, senderId, item.ID, newFolder.ID, out message) == null)
840 {
841 if (client != null)
842 client.SendAgentAlertMessage(message, false);
843 }
825 } 844 }
826 845
827 return newFolder; 846 return newFolder;
@@ -1148,11 +1167,19 @@ namespace OpenSim.Region.Framework.Scenes
1148 1167
1149 InventoryFolderBase destFolder = InventoryService.GetFolderForType(remoteClient.AgentId, AssetType.TrashFolder); 1168 InventoryFolderBase destFolder = InventoryService.GetFolderForType(remoteClient.AgentId, AssetType.TrashFolder);
1150 1169
1151 // 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
1152 // 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
1153 // 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
1154 // deleted by this method. 1173 // deleted by this method.
1155 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 }
1156 1183
1157 if (group.GetInventoryItem(localID, itemID) != null) 1184 if (group.GetInventoryItem(localID, itemID) != null)
1158 { 1185 {
@@ -1164,11 +1191,16 @@ namespace OpenSim.Region.Framework.Scenes
1164 1191
1165 group.RemoveInventoryItem(localID, itemID); 1192 group.RemoveInventoryItem(localID, itemID);
1166 } 1193 }
1194
1167 part.SendPropertiesToClient(remoteClient); 1195 part.SendPropertiesToClient(remoteClient);
1168 } 1196 }
1169 } 1197 }
1170 1198
1171 private InventoryItemBase CreateAgentInventoryItemFromTask(UUID destAgent, SceneObjectPart part, UUID itemId) 1199
1200 /// <summary>
1201 /// Creates (in memory only) a user inventory item that will contain a copy of a task inventory item.
1202 /// </summary>
1203 private InventoryItemBase CreateAgentInventoryItemFromTask(UUID destAgent, SceneObjectPart part, UUID itemId, out string message)
1172 { 1204 {
1173 TaskInventoryItem taskItem = part.Inventory.GetInventoryItem(itemId); 1205 TaskInventoryItem taskItem = part.Inventory.GetInventoryItem(itemId);
1174 1206
@@ -1179,12 +1211,13 @@ namespace OpenSim.Region.Framework.Scenes
1179 + " inventory item from a prim's inventory item " 1211 + " inventory item from a prim's inventory item "
1180 + " but the required item does not exist in the prim's inventory", 1212 + " but the required item does not exist in the prim's inventory",
1181 itemId, part.Name, part.UUID); 1213 itemId, part.Name, part.UUID);
1182 1214 message = "Item not found: " + itemId;
1183 return null; 1215 return null;
1184 } 1216 }
1185 1217
1186 if ((destAgent != taskItem.OwnerID) && ((taskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0)) 1218 if ((destAgent != taskItem.OwnerID) && ((taskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0))
1187 { 1219 {
1220 message = "Item doesn't have the Transfer permission.";
1188 return null; 1221 return null;
1189 } 1222 }
1190 1223
@@ -1230,11 +1263,24 @@ namespace OpenSim.Region.Framework.Scenes
1230 agentItem.GroupPermissions = taskItem.GroupPermissions; 1263 agentItem.GroupPermissions = taskItem.GroupPermissions;
1231 } 1264 }
1232 1265
1266 message = null;
1267 return agentItem;
1268 }
1269
1270 /// <summary>
1271 /// If the task item is not-copyable then remove it from the prim.
1272 /// </summary>
1273 private void RemoveNonCopyTaskItemFromPrim(SceneObjectPart part, UUID itemId)
1274 {
1275 TaskInventoryItem taskItem = part.Inventory.GetInventoryItem(itemId);
1276 if (taskItem == null)
1277 return;
1278
1233 if (!Permissions.BypassPermissions()) 1279 if (!Permissions.BypassPermissions())
1234 { 1280 {
1235 if ((taskItem.CurrentPermissions & (uint)PermissionMask.Copy) == 0) 1281 if ((taskItem.CurrentPermissions & (uint)PermissionMask.Copy) == 0)
1236 { 1282 {
1237 if (taskItem.Type == 10) 1283 if (taskItem.Type == (int)AssetType.LSLText)
1238 { 1284 {
1239 part.RemoveScriptEvents(itemId); 1285 part.RemoveScriptEvents(itemId);
1240 EventManager.TriggerRemoveScript(part.LocalId, itemId); 1286 EventManager.TriggerRemoveScript(part.LocalId, itemId);
@@ -1243,8 +1289,6 @@ namespace OpenSim.Region.Framework.Scenes
1243 part.Inventory.RemoveInventoryItem(itemId); 1289 part.Inventory.RemoveInventoryItem(itemId);
1244 } 1290 }
1245 } 1291 }
1246
1247 return agentItem;
1248 } 1292 }
1249 1293
1250 /// <summary> 1294 /// <summary>
@@ -1254,19 +1298,22 @@ namespace OpenSim.Region.Framework.Scenes
1254 /// <param name="folderID"></param> 1298 /// <param name="folderID"></param>
1255 /// <param name="part"></param> 1299 /// <param name="part"></param>
1256 /// <param name="itemID"></param> 1300 /// <param name="itemID"></param>
1257 public InventoryItemBase MoveTaskInventoryItem(IClientAPI remoteClient, UUID folderId, SceneObjectPart part, UUID itemId) 1301 public InventoryItemBase MoveTaskInventoryItem(IClientAPI remoteClient, UUID folderId, SceneObjectPart part, UUID itemId, out string message)
1258 { 1302 {
1259 m_log.DebugFormat( 1303 m_log.DebugFormat(
1260 "[PRIM INVENTORY]: Adding item {0} from {1} to folder {2} for {3}", 1304 "[PRIM INVENTORY]: Adding item {0} from {1} to folder {2} for {3}",
1261 itemId, part.Name, folderId, remoteClient.Name); 1305 itemId, part.Name, folderId, remoteClient.Name);
1262 1306
1263 InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(remoteClient.AgentId, part, itemId); 1307 InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(remoteClient.AgentId, part, itemId, out message);
1264
1265 if (agentItem == null) 1308 if (agentItem == null)
1266 return null; 1309 return null;
1267 1310
1268 agentItem.Folder = folderId; 1311 agentItem.Folder = folderId;
1269 AddInventoryItem(remoteClient, agentItem); 1312 AddInventoryItem(remoteClient, agentItem);
1313
1314 RemoveNonCopyTaskItemFromPrim(part, itemId);
1315
1316 message = null;
1270 return agentItem; 1317 return agentItem;
1271 } 1318 }
1272 1319
@@ -1317,7 +1364,11 @@ namespace OpenSim.Region.Framework.Scenes
1317 return; 1364 return;
1318 } 1365 }
1319 1366
1320 MoveTaskInventoryItem(remoteClient, folderId, part, itemId); 1367 string message;
1368 InventoryItemBase item = MoveTaskInventoryItem(remoteClient, folderId, part, itemId, out message);
1369
1370 if (item == null)
1371 remoteClient.SendAgentAlertMessage(message, false);
1321 } 1372 }
1322 1373
1323 /// <summary> 1374 /// <summary>
@@ -1331,17 +1382,17 @@ namespace OpenSim.Region.Framework.Scenes
1331 /// </param> 1382 /// </param>
1332 /// <param name="part"></param> 1383 /// <param name="part"></param>
1333 /// <param name="itemID"></param> 1384 /// <param name="itemID"></param>
1334 public InventoryItemBase MoveTaskInventoryItem(UUID avatarId, UUID folderId, SceneObjectPart part, UUID itemId) 1385 public InventoryItemBase MoveTaskInventoryItem(UUID avatarId, UUID folderId, SceneObjectPart part, UUID itemId, out string message)
1335 { 1386 {
1336 ScenePresence avatar; 1387 ScenePresence avatar;
1337 1388
1338 if (TryGetScenePresence(avatarId, out avatar)) 1389 if (TryGetScenePresence(avatarId, out avatar))
1339 { 1390 {
1340 return MoveTaskInventoryItem(avatar.ControllingClient, folderId, part, itemId); 1391 return MoveTaskInventoryItem(avatar.ControllingClient, folderId, part, itemId, out message);
1341 } 1392 }
1342 else 1393 else
1343 { 1394 {
1344 InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(avatarId, part, itemId); 1395 InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(avatarId, part, itemId, out message);
1345 1396
1346 if (agentItem == null) 1397 if (agentItem == null)
1347 return null; 1398 return null;
@@ -1350,6 +1401,8 @@ namespace OpenSim.Region.Framework.Scenes
1350 1401
1351 AddInventoryItem(agentItem); 1402 AddInventoryItem(agentItem);
1352 1403
1404 RemoveNonCopyTaskItemFromPrim(part, itemId);
1405
1353 return agentItem; 1406 return agentItem;
1354 } 1407 }
1355 } 1408 }
@@ -1455,6 +1508,11 @@ namespace OpenSim.Region.Framework.Scenes
1455 1508
1456 public UUID MoveTaskInventoryItems(UUID destID, string category, SceneObjectPart host, List<UUID> items) 1509 public UUID MoveTaskInventoryItems(UUID destID, string category, SceneObjectPart host, List<UUID> items)
1457 { 1510 {
1511 ScenePresence avatar;
1512 IClientAPI remoteClient = null;
1513 if (TryGetScenePresence(destID, out avatar))
1514 remoteClient = avatar.ControllingClient;
1515
1458 InventoryFolderBase rootFolder = InventoryService.GetRootFolder(destID); 1516 InventoryFolderBase rootFolder = InventoryService.GetRootFolder(destID);
1459 1517
1460 UUID newFolderID = UUID.Random(); 1518 UUID newFolderID = UUID.Random();
@@ -1464,26 +1522,28 @@ namespace OpenSim.Region.Framework.Scenes
1464 1522
1465 foreach (UUID itemID in items) 1523 foreach (UUID itemID in items)
1466 { 1524 {
1467 InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(destID, host, itemID); 1525 string message;
1526 InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(destID, host, itemID, out message);
1468 1527
1469 if (agentItem != null) 1528 if (agentItem != null)
1470 { 1529 {
1471 agentItem.Folder = newFolderID; 1530 agentItem.Folder = newFolderID;
1472 1531
1473 AddInventoryItem(agentItem); 1532 AddInventoryItem(agentItem);
1533
1534 RemoveNonCopyTaskItemFromPrim(host, itemID);
1535 }
1536 else
1537 {
1538 if (remoteClient != null)
1539 remoteClient.SendAgentAlertMessage(message, false);
1474 } 1540 }
1475 } 1541 }
1476 1542
1477 ScenePresence avatar = null; 1543 if (remoteClient != null)
1478 if (TryGetScenePresence(destID, out avatar))
1479 { 1544 {
1480 //profile.SendInventoryDecendents(avatar.ControllingClient, 1545 SendInventoryUpdate(remoteClient, rootFolder, true, false);
1481 // profile.RootFolder.ID, true, false); 1546 SendInventoryUpdate(remoteClient, newFolder, false, true);
1482 //profile.SendInventoryDecendents(avatar.ControllingClient,
1483 // newFolderID, false, true);
1484
1485 SendInventoryUpdate(avatar.ControllingClient, rootFolder, true, false);
1486 SendInventoryUpdate(avatar.ControllingClient, newFolder, false, true);
1487 } 1547 }
1488 1548
1489 return newFolderID; 1549 return newFolderID;