From a38624baab9c8024c248d8bf7dea7966c04bbbca Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 21 Aug 2020 18:44:19 +0100 Subject: [PATCH] let viewer filters on inventory offer work --- .../Transfer/InventoryTransferModule.cs | 15 ++- .../Framework/Scenes/Scene.Inventory.cs | 108 ++++++++++++++++-- 2 files changed, 110 insertions(+), 13 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs index bb69351404..f5527cde74 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs @@ -187,11 +187,20 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer return; } - m_log.DebugFormat( - "[INVENTORY TRANSFER]: offering folder {0} to agent {1}'s inventory", + Dictionary ids = new Dictionary(); + ids[folderID] = assetType; + + if (im.binaryBucket.Length >= 34 && im.binaryBucket.Length % 17 == 0) + { + byte[] iddata = im.binaryBucket; + for (int i = 17; i < im.binaryBucket.Length - 17; i += 17) + ids[new UUID(iddata, i + 1)] = (AssetType)im.binaryBucket[i]; + } + + m_log.DebugFormat("[INVENTORY TRANSFER]: offering folder {0} to agent {1}'s inventory", folderID, recipientID); - InventoryFolderBase folderCopy = scene.GiveInventoryFolder(client, recipientID, agentID, folderID, UUID.Zero); + InventoryFolderBase folderCopy = scene.GiveInventoryFolder(client, recipientID, agentID, folderID, UUID.Zero, ids); if (folderCopy == null) { diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index de71ac0491..1b3d708cc1 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -673,6 +673,12 @@ namespace OpenSim.Region.Framework.Scenes return null; } + if (item.AssetType == (int)AssetType.Link || item.AssetType == (int)AssetType.LinkFolder) + { + message = "inventory links not supported."; + return null; + } + if (item.Owner != senderId) { m_log.WarnFormat( @@ -889,6 +895,16 @@ namespace OpenSim.Region.Framework.Scenes return itemCopy; } + private readonly HashSet denyGiveFolderTypes = new HashSet() + { + (short)FolderType.Trash, + (short)FolderType.LostAndFound, + (short)FolderType.CurrentOutfit, + (short)FolderType.Inbox, + (short)FolderType.Outbox, + (short)FolderType.Suitcase, + (short)FolderType.Root + }; /// /// Give an entire inventory folder from one user to another. The entire contents (including all descendent /// folders) is given. @@ -908,11 +924,15 @@ namespace OpenSim.Region.Framework.Scenes { //// Retrieve the folder from the sender InventoryFolderBase folder = InventoryService.GetFolder(senderId, folderId); - if (null == folder) + if (folder == null) { - m_log.ErrorFormat( - "[AGENT INVENTORY]: Could not find inventory folder {0} to give", folderId); + m_log.ErrorFormat("[AGENT INVENTORY]: Could not find inventory folder {0} to give", folderId); + return null; + } + if (denyGiveFolderTypes.Contains(folder.Type)) + { + m_log.ErrorFormat("[AGENT INVENTORY]: can not give inventory folder {0}", folderId); return null; } @@ -929,19 +949,14 @@ namespace OpenSim.Region.Framework.Scenes } UUID newFolderId = UUID.Random(); - InventoryFolderBase newFolder - = new InventoryFolderBase( + InventoryFolderBase newFolder = new InventoryFolderBase( newFolderId, folder.Name, recipientId, folder.Type, recipientParentFolderId, folder.Version); InventoryService.AddFolder(newFolder); // Give all the subfolders InventoryCollection contents = InventoryService.GetFolderContent(senderId, folderId); - foreach (InventoryFolderBase childFolder in contents.Folders) - { - GiveInventoryFolder(client, recipientId, senderId, childFolder.ID, newFolder.ID); - } - // Give all the items + // Give all the items (first, this is recursive call) foreach (InventoryItemBase item in contents.Items) { string message; @@ -951,6 +966,79 @@ namespace OpenSim.Region.Framework.Scenes client.SendAgentAlertMessage(message, false); } } + contents.Items = null; + + foreach (InventoryFolderBase childFolder in contents.Folders) + { + GiveInventoryFolder(client, recipientId, senderId, childFolder.ID, newFolder.ID); + } + + return newFolder; + } + + public virtual InventoryFolderBase GiveInventoryFolder(IClientAPI client, + UUID recipientId, UUID senderId, UUID folderId, UUID recipientParentFolderId, Dictionary ids) + { + //// Retrieve the folder from the sender + InventoryFolderBase folder = InventoryService.GetFolder(senderId, folderId); + if (folder == null) + { + m_log.ErrorFormat("[AGENT INVENTORY]: Could not find inventory folder {0} to give", folderId); + return null; + } + + if(!ids.Remove(folder.ID)) + return null; + + if (denyGiveFolderTypes.Contains(folder.Type)) + { + m_log.ErrorFormat("[AGENT INVENTORY]: can not give inventory folder {0}", folderId); + return null; + } + + if (recipientParentFolderId == UUID.Zero) + { + InventoryFolderBase recipientRootFolder = InventoryService.GetRootFolder(recipientId); + if (recipientRootFolder != null) + recipientParentFolderId = recipientRootFolder.ID; + else + { + m_log.WarnFormat("[AGENT INVENTORY]: Unable to find root folder for receiving agent"); + return null; + } + } + + UUID newFolderId = UUID.Random(); + InventoryFolderBase newFolder = new InventoryFolderBase( + newFolderId, folder.Name, recipientId, folder.Type, recipientParentFolderId, folder.Version); + InventoryService.AddFolder(newFolder); + + InventoryCollection contents = InventoryService.GetFolderContent(senderId, folderId); + if(client == null) + { + foreach (InventoryItemBase item in contents.Items) + { + if (ids.Remove(item.ID)) + GiveInventoryItem(recipientId, senderId, item.ID, newFolder.ID, out string message); + } + } + else + { + foreach (InventoryItemBase item in contents.Items) + { + if (ids.Remove(item.ID)) + { + if (GiveInventoryItem(recipientId, senderId, item.ID, newFolder.ID, out string message) == null) + client.SendAgentAlertMessage(message, false); + } + } + } + contents.Items = null; + + foreach (InventoryFolderBase childFolder in contents.Folders) + { + GiveInventoryFolder(client, recipientId, senderId, childFolder.ID, newFolder.ID); + } return newFolder; }