aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs18
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs5
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs11
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs130
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs6
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/UserInventoryTests.cs10
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs5
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs12
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs9
9 files changed, 143 insertions, 63 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
index 79bc5ef..0eb15f8 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
@@ -865,18 +865,26 @@ namespace OpenSim.Region.ClientStack.Linden
865 item = m_Scene.InventoryService.GetItem(new InventoryItemBase(itemID)); 865 item = m_Scene.InventoryService.GetItem(new InventoryItemBase(itemID));
866 if (item != null) 866 if (item != null)
867 { 867 {
868 copyItem = m_Scene.GiveInventoryItem(m_HostCapsObj.AgentID, item.Owner, itemID, folderID); 868 string message;
869 if (copyItem != null && client != null) 869 copyItem = m_Scene.GiveInventoryItem(m_HostCapsObj.AgentID, item.Owner, itemID, folderID, out message);
870 if (client != null)
870 { 871 {
871 m_log.InfoFormat("[CAPS]: CopyInventoryFromNotecard, ItemID:{0}, FolderID:{1}", copyItem.ID, copyItem.Folder); 872 if (copyItem != null)
872 client.SendBulkUpdateInventory(copyItem); 873 {
874 m_log.InfoFormat("[CAPS]: CopyInventoryFromNotecard, ItemID:{0}, FolderID:{1}", copyItem.ID, copyItem.Folder);
875 client.SendBulkUpdateInventory(copyItem);
876 }
877 else
878 {
879 client.SendAgentAlertMessage(message, false);
880 }
873 } 881 }
874 } 882 }
875 else 883 else
876 { 884 {
877 m_log.ErrorFormat("[CAPS]: CopyInventoryFromNotecard - Failed to retrieve item {0} from notecard {1}", itemID, notecardID); 885 m_log.ErrorFormat("[CAPS]: CopyInventoryFromNotecard - Failed to retrieve item {0} from notecard {1}", itemID, notecardID);
878 if (client != null) 886 if (client != null)
879 client.SendAlertMessage("Failed to retrieve item"); 887 client.SendAgentAlertMessage("Failed to retrieve item", false);
880 } 888 }
881 } 889 }
882 catch (Exception e) 890 catch (Exception e)
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 7cb5b53..53217a0 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -1761,6 +1761,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1761 newBlock.Name = Util.StringToBytes256(folder.Name); 1761 newBlock.Name = Util.StringToBytes256(folder.Name);
1762 newBlock.ParentID = folder.ParentID; 1762 newBlock.ParentID = folder.ParentID;
1763 newBlock.Type = (sbyte)folder.Type; 1763 newBlock.Type = (sbyte)folder.Type;
1764 if (newBlock.Type == InventoryItemBase.SUITCASE_FOLDER_TYPE)
1765 newBlock.Type = InventoryItemBase.SUITCASE_FOLDER_FAKE_TYPE;
1764 1766
1765 return newBlock; 1767 return newBlock;
1766 } 1768 }
@@ -2010,8 +2012,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
2010 2012
2011 folderBlock.FolderID = folder.ID; 2013 folderBlock.FolderID = folder.ID;
2012 folderBlock.ParentID = folder.ParentID; 2014 folderBlock.ParentID = folder.ParentID;
2013 //folderBlock.Type = -1;
2014 folderBlock.Type = (sbyte)folder.Type; 2015 folderBlock.Type = (sbyte)folder.Type;
2016 if (folderBlock.Type == InventoryItemBase.SUITCASE_FOLDER_TYPE)
2017 folderBlock.Type = InventoryItemBase.SUITCASE_FOLDER_FAKE_TYPE;
2015 folderBlock.Name = Util.StringToBytes256(folder.Name); 2018 folderBlock.Name = Util.StringToBytes256(folder.Name);
2016 2019
2017 return folderBlock; 2020 return folderBlock;
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
index 0b10dd8..c632798 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
@@ -180,8 +180,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
180 "[INVENTORY TRANSFER]: Inserting original folder {0} into agent {1}'s inventory", 180 "[INVENTORY TRANSFER]: Inserting original folder {0} into agent {1}'s inventory",
181 folderID, new UUID(im.toAgentID)); 181 folderID, new UUID(im.toAgentID));
182 182
183 InventoryFolderBase folderCopy 183 InventoryFolderBase folderCopy
184 = scene.GiveInventoryFolder(receipientID, client.AgentId, folderID, UUID.Zero); 184 = scene.GiveInventoryFolder(client, receipientID, client.AgentId, folderID, UUID.Zero);
185 185
186 if (folderCopy == null) 186 if (folderCopy == null)
187 { 187 {
@@ -217,13 +217,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
217 "into agent {1}'s inventory", 217 "into agent {1}'s inventory",
218 itemID, new UUID(im.toAgentID)); 218 itemID, new UUID(im.toAgentID));
219 219
220 InventoryItemBase itemCopy = scene.GiveInventoryItem( 220 string message;
221 new UUID(im.toAgentID), 221 InventoryItemBase itemCopy = scene.GiveInventoryItem(new UUID(im.toAgentID), client.AgentId, itemID, out message);
222 client.AgentId, itemID);
223 222
224 if (itemCopy == null) 223 if (itemCopy == null)
225 { 224 {
226 client.SendAgentAlertMessage("Can't find item to give. Nothing given.", false); 225 client.SendAgentAlertMessage(message, false);
227 return; 226 return;
228 } 227 }
229 228
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;
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/Framework/Scenes/Tests/UserInventoryTests.cs b/OpenSim/Region/Framework/Scenes/Tests/UserInventoryTests.cs
index e50b4da..0736278 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/UserInventoryTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/UserInventoryTests.cs
@@ -95,7 +95,9 @@ namespace OpenSim.Region.Framework.Tests
95 UserAccount user2 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1002)); 95 UserAccount user2 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1002));
96 InventoryItemBase item1 = UserInventoryHelpers.CreateInventoryItem(scene, "item1", user1.PrincipalID); 96 InventoryItemBase item1 = UserInventoryHelpers.CreateInventoryItem(scene, "item1", user1.PrincipalID);
97 97
98 scene.GiveInventoryItem(user2.PrincipalID, user1.PrincipalID, item1.ID); 98 string message;
99
100 scene.GiveInventoryItem(user2.PrincipalID, user1.PrincipalID, item1.ID, out message);
99 101
100 InventoryItemBase retrievedItem1 102 InventoryItemBase retrievedItem1
101 = UserInventoryHelpers.GetInventoryItem(scene.InventoryService, user2.PrincipalID, "Notecards/item1"); 103 = UserInventoryHelpers.GetInventoryItem(scene.InventoryService, user2.PrincipalID, "Notecards/item1");
@@ -103,7 +105,7 @@ namespace OpenSim.Region.Framework.Tests
103 Assert.That(retrievedItem1, Is.Not.Null); 105 Assert.That(retrievedItem1, Is.Not.Null);
104 106
105 // Try giving back the freshly received item 107 // Try giving back the freshly received item
106 scene.GiveInventoryItem(user1.PrincipalID, user2.PrincipalID, retrievedItem1.ID); 108 scene.GiveInventoryItem(user1.PrincipalID, user2.PrincipalID, retrievedItem1.ID, out message);
107 109
108 List<InventoryItemBase> reretrievedItems 110 List<InventoryItemBase> reretrievedItems
109 = UserInventoryHelpers.GetInventoryItems(scene.InventoryService, user1.PrincipalID, "Notecards/item1"); 111 = UserInventoryHelpers.GetInventoryItems(scene.InventoryService, user1.PrincipalID, "Notecards/item1");
@@ -123,7 +125,7 @@ namespace OpenSim.Region.Framework.Tests
123 InventoryFolderBase folder1 125 InventoryFolderBase folder1
124 = UserInventoryHelpers.CreateInventoryFolder(scene.InventoryService, user1.PrincipalID, "folder1", false); 126 = UserInventoryHelpers.CreateInventoryFolder(scene.InventoryService, user1.PrincipalID, "folder1", false);
125 127
126 scene.GiveInventoryFolder(user2.PrincipalID, user1.PrincipalID, folder1.ID, UUID.Zero); 128 scene.GiveInventoryFolder(null, user2.PrincipalID, user1.PrincipalID, folder1.ID, UUID.Zero);
127 129
128 InventoryFolderBase retrievedFolder1 130 InventoryFolderBase retrievedFolder1
129 = UserInventoryHelpers.GetInventoryFolder(scene.InventoryService, user2.PrincipalID, "folder1"); 131 = UserInventoryHelpers.GetInventoryFolder(scene.InventoryService, user2.PrincipalID, "folder1");
@@ -131,7 +133,7 @@ namespace OpenSim.Region.Framework.Tests
131 Assert.That(retrievedFolder1, Is.Not.Null); 133 Assert.That(retrievedFolder1, Is.Not.Null);
132 134
133 // Try giving back the freshly received folder 135 // Try giving back the freshly received folder
134 scene.GiveInventoryFolder(user1.PrincipalID, user2.PrincipalID, retrievedFolder1.ID, UUID.Zero); 136 scene.GiveInventoryFolder(null, user1.PrincipalID, user2.PrincipalID, retrievedFolder1.ID, UUID.Zero);
135 137
136 List<InventoryFolderBase> reretrievedFolders 138 List<InventoryFolderBase> reretrievedFolders
137 = UserInventoryHelpers.GetInventoryFolders(scene.InventoryService, user1.PrincipalID, "folder1"); 139 = UserInventoryHelpers.GetInventoryFolders(scene.InventoryService, user1.PrincipalID, "folder1");
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
index fc8cae2..f34152c 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
@@ -560,12 +560,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
560 if (m_debugEnabled) 560 if (m_debugEnabled)
561 m_log.DebugFormat("[Groups]: Giving inventory from {0} to {1}", giver, remoteClient.AgentId); 561 m_log.DebugFormat("[Groups]: Giving inventory from {0} to {1}", giver, remoteClient.AgentId);
562 562
563 string message;
563 InventoryItemBase itemCopy = ((Scene)(remoteClient.Scene)).GiveInventoryItem(remoteClient.AgentId, 564 InventoryItemBase itemCopy = ((Scene)(remoteClient.Scene)).GiveInventoryItem(remoteClient.AgentId,
564 giver, attachmentUUID); 565 giver, attachmentUUID, out message);
565 566
566 if (itemCopy == null) 567 if (itemCopy == null)
567 { 568 {
568 remoteClient.SendAgentAlertMessage("Can't find item to give. Nothing given.", false); 569 remoteClient.SendAgentAlertMessage(message, false);
569 return; 570 return;
570 } 571 }
571 572
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 4d20e13..d169912 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -1884,9 +1884,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1884 part.Shape.LightColorR = Util.Clip((float)color.x, 0.0f, 1.0f); 1884 part.Shape.LightColorR = Util.Clip((float)color.x, 0.0f, 1.0f);
1885 part.Shape.LightColorG = Util.Clip((float)color.y, 0.0f, 1.0f); 1885 part.Shape.LightColorG = Util.Clip((float)color.y, 0.0f, 1.0f);
1886 part.Shape.LightColorB = Util.Clip((float)color.z, 0.0f, 1.0f); 1886 part.Shape.LightColorB = Util.Clip((float)color.z, 0.0f, 1.0f);
1887 part.Shape.LightIntensity = intensity; 1887 part.Shape.LightIntensity = Util.Clip((float)intensity, 0.0f, 1.0f);
1888 part.Shape.LightRadius = radius; 1888 part.Shape.LightRadius = Util.Clip((float)radius, 0.1f, 20.0f);
1889 part.Shape.LightFalloff = falloff; 1889 part.Shape.LightFalloff = Util.Clip((float)falloff, 0.01f, 2.0f);
1890 } 1890 }
1891 else 1891 else
1892 { 1892 {
@@ -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