예제 #1
0
            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);
            }