public override void AssetTransferComplete() { #if DEBUG m_Log.DebugFormat("Finished transfer {0} to {1}", m_SrcAgent, m_DestinationAgent); #endif AssetType assetType = AssetType.Folder; UUID givenID; string givenName; if (m_InventoryTree != null) { InventoryFolder folder; if (!m_DstInventoryService.Folder.TryGetValue(m_DestinationAgent.ID, AssetType.RootFolder, out folder)) { return; } var folderCreator = new List <TransferInventoryFolder> { m_InventoryTree }; m_InventoryTree.ParentFolderID = folder.ID; m_InventoryTree.Owner = m_DestinationAgent; m_InventoryTree.Version = 1; givenID = m_InventoryTree.ID; givenName = m_InventoryTree.Name; List <UUID> noCopyItems = new List <UUID>(); while (folderCreator.Count != 0) { TransferInventoryFolder transferFolder = folderCreator[0]; m_DstInventoryService.Folder.Add(transferFolder); foreach (InventoryItem item in transferFolder.Items) { if (!item.CheckPermissions(m_SrcAgent, UGI.Unknown, InventoryPermissionsMask.Copy)) { noCopyItems.Add(item.ID); } item.SetNewID(UUID.Random); item.LastOwner = item.Owner; item.Owner = m_DestinationAgent; item.AdjustToNextOwner(); m_DstInventoryService.Item.Add(item); } foreach (TransferInventoryFolder childfolder in transferFolder.Folders) { childfolder.Owner = m_DestinationAgent; childfolder.ParentFolderID = transferFolder.ID; childfolder.Version = 1; folderCreator.Add(childfolder); } } if (noCopyItems.Count != 0) { m_SrcInventoryService.Item.Delete(m_SrcAgent.ID, noCopyItems); } } else { InventoryFolder folder; if (!m_DstInventoryService.Folder.TryGetDefaultFolderOrFallback(m_DestinationAgent.ID, m_Item.AssetType, out folder)) { #if DEBUG m_Log.DebugFormat("Folder not found for {0} of {1}", m_Item.AssetType, m_DestinationAgent); #endif return; } UUID oldItemID = m_Item.ID; bool noCopyItem = !m_Item.CheckPermissions(m_SrcAgent, UGI.Unknown, InventoryPermissionsMask.Copy); m_Item.SetNewID(UUID.Random); assetType = m_Item.AssetType; m_Item.AdjustToNextOwner(); m_Item.LastOwner = m_Item.Owner; m_Item.Owner = m_DestinationAgent; m_Item.ParentFolderID = folder.ID; givenName = m_Item.Name; m_DstInventoryService.Item.Add(m_Item); givenID = m_Item.ID; if (noCopyItem) { m_SrcInventoryService.Item.Delete(m_SrcAgent.ID, oldItemID); } } var binbuck = new byte[17]; binbuck[0] = (byte)assetType; givenID.ToBytes(binbuck, 1); m_InventoryCreate?.Invoke(givenID); var im = new GridInstantMessage { ToAgent = m_DestinationAgent, FromAgent = m_SrcAgent, Message = givenName, IMSessionID = m_DstUserAgentService.RequiresInventoryIDAsIMSessionID ? givenID : m_TransactionID, Dialog = GridInstantMessageDialog.InventoryOffered, BinaryBucket = binbuck, }; m_IMService.Send(im); }