Exemple #1
0
        private Hashtable CopyInventoryFromNotecard(Hashtable mDhttpMethod, UUID agentID)
        {
            OSDMap rm       = (OSDMap)OSDParser.DeserializeLLSDXml((string)mDhttpMethod["requestbody"]);
            UUID   FolderID = rm["folder-id"].AsUUID();
            UUID   ItemID   = rm["item-id"].AsUUID();
            //UUID NotecardID = rm["notecard-id"].AsUUID();
            //There is an object-id as well, but objects arn't handled through this currently as of Sept. 2010

            //TODO: Check notecard for this
            //SLUtil.ParseNotecardToList
            InventoryItemBase  item            = null;
            ILLClientInventory inventoryModule = m_scene.RequestModuleInterface <ILLClientInventory>();

            if (inventoryModule != null)
            {
                item = inventoryModule.GiveInventoryItem(agentID, agentID, ItemID, FolderID);
            }

            IClientAPI client;

            m_scene.TryGetClient(agentID, out client);
            client.SendBulkUpdateInventory(item);

            //Send back data
            Hashtable responsedata = new Hashtable();

            responsedata["int_response_code"]   = 200; //501; //410; //404;
            responsedata["content_type"]        = "text/plain";
            responsedata["keepalive"]           = false;
            responsedata["str_response_string"] = "";
            return(responsedata);
        }
        private Hashtable CopyInventoryFromNotecard(Hashtable mDhttpMethod, UUID agentID)
        {
            OSDMap            rm           = (OSDMap)OSDParser.DeserializeLLSDXml((string)mDhttpMethod["requestbody"]);
            UUID              FolderID     = rm["folder-id"].AsUUID();
            UUID              ItemID       = rm["item-id"].AsUUID();
            UUID              NotecardID   = rm["notecard-id"].AsUUID();
            UUID              ObjectID     = rm["object-id"].AsUUID();
            InventoryItemBase notecardItem = null;

            if (ObjectID != UUID.Zero)
            {
                ISceneChildEntity part = m_scene.GetSceneObjectPart(ObjectID);
                if (part != null)
                {
                    TaskInventoryItem item = part.Inventory.GetInventoryItem(NotecardID);
                    if (m_scene.Permissions.CanCopyObjectInventory(NotecardID, ObjectID, agentID))
                    {
                        notecardItem = new InventoryItemBase(NotecardID, agentID)
                        {
                            AssetID = item.AssetID
                        };
                    }
                }
            }
            else
            {
                notecardItem = m_scene.InventoryService.GetItem(new InventoryItemBase(NotecardID));
            }
            if (notecardItem != null && notecardItem.Owner == agentID)
            {
                AssetBase asset = m_scene.AssetService.Get(notecardItem.AssetID.ToString());
                if (asset != null)
                {
                    UTF8Encoding enc =
                        new UTF8Encoding();
                    List <string> notecardData  = SLUtil.ParseNotecardToList(enc.GetString(asset.Data));
                    AssetNotecard noteCardAsset = new AssetNotecard(UUID.Zero, asset.Data);
                    noteCardAsset.Decode();
                    bool found       = false;
                    UUID lastOwnerID = UUID.Zero;
#if (!ISWIN)
                    foreach (InventoryItem notecardObjectItem in noteCardAsset.EmbeddedItems)
                    {
                        if (notecardObjectItem.UUID == ItemID)
                        {
                            //Make sure that it exists
                            found       = true;
                            lastOwnerID = notecardObjectItem.OwnerID;
                            break;
                        }
                    }
#else
                    foreach (InventoryItem notecardObjectItem in noteCardAsset.EmbeddedItems.Where(notecardObjectItem => notecardObjectItem.UUID == ItemID))
                    {
                        //Make sure that it exists
                        found       = true;
                        lastOwnerID = notecardObjectItem.OwnerID;
                        break;
                    }
#endif
                    if (found)
                    {
                        InventoryItemBase  item            = null;
                        ILLClientInventory inventoryModule = m_scene.RequestModuleInterface <ILLClientInventory>();
                        if (inventoryModule != null)
                        {
                            item = inventoryModule.GiveInventoryItem(agentID, lastOwnerID, ItemID, FolderID);
                        }

                        IClientAPI client;
                        m_scene.ClientManager.TryGetValue(agentID, out client);
                        if (item != null)
                        {
                            client.SendBulkUpdateInventory(item);
                        }
                        else
                        {
                            client.SendAlertMessage("Failed to retrieve item");
                        }
                    }
                }
            }

            //Send back data
            Hashtable responsedata = new Hashtable();
            responsedata["int_response_code"]   = 200; //501; //410; //404;
            responsedata["content_type"]        = "text/plain";
            responsedata["keepalive"]           = false;
            responsedata["str_response_string"] = "";
            return(responsedata);
        }
        private void OnInstantMessage(IClientAPI client, GridInstantMessage im)
        {
            //MainConsole.Instance.InfoFormat("[INVENTORY TRANSFER]: OnInstantMessage {0}", im.dialog);

            IScene scene = FindClientScene(client.AgentId);

            if (scene == null) // Something seriously wrong here.
            {
                return;
            }

            if (im.dialog == (byte)InstantMessageDialog.InventoryOffered)
            {
                //MainConsole.Instance.DebugFormat("Asset type {0}", ((AssetType)im.binaryBucket[0]));

                if (im.binaryBucket.Length < 17) // Invalid
                {
                    return;
                }

                UUID           receipientID = im.toAgentID;
                IScenePresence user         = scene.GetScenePresence(receipientID);
                UUID           copyID;

                // Send the IM to the recipient. The item is already
                // in their inventory, so it will not be lost if
                // they are offline.
                //
                if (user != null)
                {
                    // First byte is the asset type
                    AssetType assetType = (AssetType)im.binaryBucket[0];

                    if (AssetType.Folder == assetType)
                    {
                        UUID folderID = new UUID(im.binaryBucket, 1);

                        MainConsole.Instance.DebugFormat("[INVENTORY TRANSFER]: Inserting original folder {0} " +
                                                         "into agent {1}'s inventory",
                                                         folderID, im.toAgentID);

                        InventoryFolderBase folderCopy      = null;
                        ILLClientInventory  inventoryModule = scene.RequestModuleInterface <ILLClientInventory>();
                        if (inventoryModule != null)
                        {
                            folderCopy = inventoryModule.GiveInventoryFolder(receipientID, client.AgentId, folderID,
                                                                             UUID.Zero);
                        }

                        if (folderCopy == null)
                        {
                            client.SendAgentAlertMessage("Can't find folder to give. Nothing given.", false);
                            return;
                        }

                        // The outgoing binary bucket should contain only the byte which signals an asset folder is
                        // being copied and the following bytes for the copied folder's UUID
                        copyID = folderCopy.ID;
                        byte[] copyIDBytes = copyID.GetBytes();
                        im.binaryBucket    = new byte[1 + copyIDBytes.Length];
                        im.binaryBucket[0] = (byte)AssetType.Folder;
                        Array.Copy(copyIDBytes, 0, im.binaryBucket, 1, copyIDBytes.Length);

                        if (user != null)
                        {
                            user.ControllingClient.SendBulkUpdateInventory(folderCopy);
                        }

                        im.imSessionID = folderID;
                    }
                    else
                    {
                        // First byte of the array is probably the item type
                        // Next 16 bytes are the UUID

                        UUID itemID = new UUID(im.binaryBucket, 1);

                        MainConsole.Instance.DebugFormat("[INVENTORY TRANSFER]: (giving) Inserting item {0} " +
                                                         "into agent {1}'s inventory",
                                                         itemID, im.toAgentID);

                        InventoryItemBase  itemCopy        = null;
                        ILLClientInventory inventoryModule = scene.RequestModuleInterface <ILLClientInventory>();
                        if (inventoryModule != null)
                        {
                            itemCopy = inventoryModule.GiveInventoryItem(
                                im.toAgentID,
                                im.fromAgentID, itemID, UUID.Zero);
                        }

                        if (itemCopy == null)
                        {
                            client.SendAgentAlertMessage("Can't find item to give. Nothing given.", false);
                            return;
                        }

                        copyID = itemCopy.ID;
                        Array.Copy(copyID.GetBytes(), 0, im.binaryBucket, 1, 16);

                        if (user != null)
                        {
                            user.ControllingClient.SendBulkUpdateInventory(itemCopy);
                        }

                        im.imSessionID = itemID;
                    }

                    user.ControllingClient.SendInstantMessage(im);
                    return;
                }
                else
                {
                    if (m_TransferModule != null)
                    {
                        m_TransferModule.SendInstantMessage(im);
                    }
                }
            }
            else if (im.dialog == (byte)InstantMessageDialog.InventoryAccepted)
            {
                IScenePresence user = scene.GetScenePresence(im.toAgentID);

                if (user != null) // Local
                {
                    user.ControllingClient.SendInstantMessage(im);
                }
                else
                {
                    if (m_TransferModule != null)
                    {
                        m_TransferModule.SendInstantMessage(im);
                    }
                }
            }
            else if (im.dialog == (byte)InstantMessageDialog.InventoryDeclined)
            {
                // Here, the recipient is local and we can assume that the
                // inventory is loaded. Courtesy of the above bulk update,
                // It will have been pushed to the client, too
                //
                IInventoryService invService = scene.InventoryService;

                InventoryFolderBase trashFolder =
                    invService.GetFolderForType(client.AgentId, InventoryType.Unknown, AssetType.TrashFolder);

                UUID inventoryID = im.imSessionID; // The inventory item/folder, back from it's trip

                InventoryItemBase item = new InventoryItemBase(inventoryID, client.AgentId);
                item = invService.GetItem(item);
                InventoryFolderBase folder = null;

                if (item != null && trashFolder != null)
                {
                    item.Folder = trashFolder.ID;

                    // Diva comment: can't we just update this item???
                    List <UUID> uuids = new List <UUID> {
                        item.ID
                    };
                    invService.DeleteItems(item.Owner, uuids);
                    ILLClientInventory inventory = client.Scene.RequestModuleInterface <ILLClientInventory>();
                    if (inventory != null)
                    {
                        inventory.AddInventoryItem(client, item);
                    }
                }
                else
                {
                    folder = new InventoryFolderBase(inventoryID, client.AgentId);
                    folder = invService.GetFolder(folder);

                    if (folder != null & trashFolder != null)
                    {
                        folder.ParentID = trashFolder.ID;
                        invService.MoveFolder(folder);
                    }
                }

                if ((null == item && null == folder) | null == trashFolder)
                {
                    string reason = String.Empty;

                    if (trashFolder == null)
                    {
                        reason += " Trash folder not found.";
                    }
                    if (item == null)
                    {
                        reason += " Item not found.";
                    }
                    if (folder == null)
                    {
                        reason += " Folder not found.";
                    }

                    client.SendAgentAlertMessage("Unable to delete " +
                                                 "received inventory" + reason, false);
                }

                IScenePresence user = scene.GetScenePresence(im.toAgentID);

                if (user != null) // Local
                {
                    user.ControllingClient.SendInstantMessage(im);
                }
                else
                {
                    if (m_TransferModule != null)
                    {
                        m_TransferModule.SendInstantMessage(im);
                    }
                }
            }
        }