コード例 #1
0
ファイル: TaskInventory.cs プロジェクト: jhurliman/simian
        private void MoveTaskInventoryHandler(Packet packet, LLAgent agent)
        {
            MoveTaskInventoryPacket move = (MoveTaskInventoryPacket)packet;

            if (m_inventory != null)
            {
                LLInventoryTaskItem item;
                ISceneEntity        sourceObj;

                if (m_scene.TryGetEntity(move.InventoryData.LocalID, out sourceObj) && sourceObj is LLPrimitive)
                {
                    LLPrimitive sourcePrim = (LLPrimitive)sourceObj;

                    if (sourcePrim.Inventory.TryGetItem(move.InventoryData.ItemID, out item))
                    {
                        InventoryBase obj;
                        if (m_inventory.TryGetInventory(agent.ID, move.AgentData.FolderID, out obj) && obj is InventoryFolder)
                        {
                            LLInventoryItem invItem = new LLInventoryItem
                            {
                                AssetID      = item.AssetID,
                                ContentType  = item.ContentType,
                                CreationDate = item.CreationDate,
                                CreatorID    = item.CreatorID,
                                Description  = item.Description,
                                ExtraData    = item.ExtraData,
                                ID           = UUID.Random(),
                                Name         = item.Name,
                                OwnerID      = agent.ID,
                                ParentID     = move.AgentData.FolderID
                            };

                            if (m_inventory.TryCreateItem(agent.ID, invItem))
                            {
                                RemoveTaskInventory(agent, sourcePrim, item.ID);
                                SendItemCreatedPacket(agent, invItem, UUID.Zero, 0);
                                m_log.Debug(agent.Name + " moved task inventory item " + item.Name + " to agent inventory folder " + invItem.ParentID);
                            }
                            else
                            {
                                m_log.Warn(agent.Name + "attempted to move item " + move.InventoryData.ItemID +
                                           " to agent inventory folder " + move.AgentData.FolderID + " but item creation failed");
                            }
                        }
                        else
                        {
                            m_log.Warn(agent.Name + "attempted to move item " + move.InventoryData.ItemID +
                                       " to unknown agent inventory folder " + move.AgentData.FolderID);
                        }
                    }
                }
            }
            else
            {
                m_log.Warn(agent.Name + "attempted to move item " + move.InventoryData.ItemID +
                           " to agent inventory, but we have no IInventoryClient");
            }
        }
コード例 #2
0
ファイル: TaskInventory.cs プロジェクト: jhurliman/simian
        private void SendItemCreatedPacket(LLAgent agent, LLInventoryItem item, UUID transactionID, uint callbackID)
        {
            UpdateCreateInventoryItemPacket update = new UpdateCreateInventoryItemPacket();

            update.AgentData.AgentID     = agent.ID;
            update.AgentData.SimApproved = true;
            if (transactionID != UUID.Zero)
            {
                update.AgentData.TransactionID = transactionID;
            }
            else
            {
                update.AgentData.TransactionID = UUID.Random();
            }

            Permissions perms = item.Permissions;

            UpdateCreateInventoryItemPacket.InventoryDataBlock invData = new UpdateCreateInventoryItemPacket.InventoryDataBlock();
            invData.AssetID       = item.AssetID;
            invData.BaseMask      = (uint)perms.BaseMask;
            invData.CallbackID    = callbackID;
            invData.CreationDate  = (int)Utils.DateTimeToUnixTime(item.CreationDate);
            invData.CRC           = item.CRC();
            invData.CreatorID     = item.CreatorID;
            invData.Description   = Utils.StringToBytes(item.Description);
            invData.EveryoneMask  = (uint)perms.EveryoneMask;
            invData.Flags         = item.Flags;
            invData.FolderID      = item.ParentID;
            invData.GroupID       = item.GroupID;
            invData.GroupMask     = (uint)perms.GroupMask;
            invData.GroupOwned    = item.GroupOwned;
            invData.InvType       = (sbyte)item.InventoryType;
            invData.ItemID        = item.ID;
            invData.Name          = Utils.StringToBytes(item.Name);
            invData.NextOwnerMask = (uint)perms.NextOwnerMask;
            invData.OwnerID       = item.OwnerID;
            invData.OwnerMask     = (uint)perms.OwnerMask;
            invData.SalePrice     = item.SalePrice;
            invData.SaleType      = (byte)item.SaleType;
            invData.Type          = (sbyte)item.AssetType;

            update.InventoryData    = new UpdateCreateInventoryItemPacket.InventoryDataBlock[1];
            update.InventoryData[0] = invData;

            m_log.DebugFormat("Created inventory item {0}. ItemID: {1}, AssetID: {2}, ParentID: {3}, TransactionID: {4}, CallbackID: {5}",
                              item.Name, item.ID, item.AssetID, item.ParentID, transactionID, callbackID);

            m_udp.SendPacket(agent, update, ThrottleCategory.Task, false);
        }
コード例 #3
0
ファイル: TaskInventory.cs プロジェクト: osgrid/openmetaverse
        private void UpdateTaskInventoryHandler(Packet packet, LLAgent agent)
        {
            UpdateTaskInventoryPacket update = (UpdateTaskInventoryPacket)packet;

            LLInventoryTaskItem item;
            ISceneEntity targetObj;

            if (update.UpdateData.Key != 0)
            {
                m_log.Warn("Got an UpdateTaskInventory packet with a Key of " + update.UpdateData.Key);
                return;
            }

            if (m_scene.TryGetEntity(update.UpdateData.LocalID, out targetObj) && targetObj is LLPrimitive)
            {
                LLPrimitive targetPrim = (LLPrimitive)targetObj;

                // Updating an existing item in the task inventory
                if (targetPrim.Inventory.TryGetItem(update.InventoryData.ItemID, out item))
                {
                    if (update.InventoryData.TransactionID != UUID.Zero)
                        item.AssetID = UUID.Combine(update.InventoryData.TransactionID, agent.SecureSessionID);

                    item.Description = Utils.BytesToString(update.InventoryData.Description);
                    item.Flags = update.InventoryData.Flags;
                    item.GroupID = update.InventoryData.GroupID;
                    item.GroupOwned = update.InventoryData.GroupOwned;
                    item.Name = Utils.BytesToString(update.InventoryData.Name);
                    item.Permissions = new Permissions(update.InventoryData.BaseMask, update.InventoryData.EveryoneMask,
                        update.InventoryData.GroupMask, update.InventoryData.NextOwnerMask, update.InventoryData.OwnerMask);
                    item.SalePrice = update.InventoryData.SalePrice;
                    item.SaleType = (SaleType)update.InventoryData.SaleType;

                    targetPrim.Inventory.AddOrUpdateItem(item, true);
                    m_log.Debug(agent.Name + " updated task inventory item: " + item.Name);

                    SignalTaskInventoryChange(agent, targetPrim);
                }
                else if (m_inventory != null)
                {
                    // Copying from agent inventory to task inventory
                    InventoryBase obj;
                    if (m_inventory.TryGetInventory(agent.ID, update.InventoryData.ItemID, out obj))
                    {
                        if (obj is InventoryItem)
                        {
                            // Create a new item in the task inventory
                            LLInventoryItem fromItem = new LLInventoryItem((InventoryItem)obj);

                            item = new LLInventoryTaskItem();
                            //item.ID will be assigned in AddOrUpdateItem
                            item.AssetID = fromItem.AssetID;
                            item.ContentType = fromItem.ContentType;
                            item.CreationDate = fromItem.CreationDate;
                            item.CreatorID = fromItem.CreatorID;
                            item.Description = fromItem.Description;
                            item.Flags = fromItem.ExtraData["Flags"].AsUInteger();
                            item.GrantedPermissions = 0;
                            item.GroupID = fromItem.ExtraData["group_id"].AsUUID();
                            item.GroupOwned = fromItem.ExtraData["group_owned"].AsBoolean();
                            item.Name = fromItem.Name;
                            item.OwnerID = agent.ID;
                            item.ParentID = update.InventoryData.FolderID;
                            item.ParentObjectID = targetPrim.ID;
                            item.PermissionGranter = UUID.Zero;
                            item.Permissions = fromItem.Permissions;
                            item.SalePrice = fromItem.ExtraData["sale_price"].AsInteger();
                            item.SaleType = (SaleType)fromItem.ExtraData["sale_type"].AsInteger();

                            targetPrim.Inventory.AddOrUpdateItem(item, false);
                            m_log.Debug(agent.Name + " created new task inventory item: " + item.Name);

                            SignalTaskInventoryChange(agent, targetPrim);
                        }
                        else
                        {
                            m_log.Error("[TODO] Handle dropping folders in task inventory");
                        }
                    }
                    else
                    {
                        m_log.Warn(agent.Name + " sent an UpdateTaskInventory packet requesting unknown " +
                            "(or failed to fetch) inventory item " + update.InventoryData.ItemID);
                    }
                }
                else
                {
                    m_log.Warn(agent.Name + "attempted to copy inventory item " + update.InventoryData.ItemID +
                        " to task inventory, but we have no IInventoryClient");
                }
            }
            else
            {
                m_log.Warn(agent.Name + " attempted to update task inventory for prim " + update.UpdateData.LocalID +
                    " that does not exist in this scene");
            }
        }
コード例 #4
0
ファイル: TaskInventory.cs プロジェクト: osgrid/openmetaverse
        private void SendItemCreatedPacket(LLAgent agent, LLInventoryItem item, UUID transactionID, uint callbackID)
        {
            UpdateCreateInventoryItemPacket update = new UpdateCreateInventoryItemPacket();
            update.AgentData.AgentID = agent.ID;
            update.AgentData.SimApproved = true;
            if (transactionID != UUID.Zero)
                update.AgentData.TransactionID = transactionID;
            else
                update.AgentData.TransactionID = UUID.Random();

            Permissions perms = item.Permissions;

            UpdateCreateInventoryItemPacket.InventoryDataBlock invData = new UpdateCreateInventoryItemPacket.InventoryDataBlock();
            invData.AssetID = item.AssetID;
            invData.BaseMask = (uint)perms.BaseMask;
            invData.CallbackID = callbackID;
            invData.CreationDate = (int)Utils.DateTimeToUnixTime(item.CreationDate);
            invData.CRC = item.CRC();
            invData.CreatorID = item.CreatorID;
            invData.Description = Utils.StringToBytes(item.Description);
            invData.EveryoneMask = (uint)perms.EveryoneMask;
            invData.Flags = item.Flags;
            invData.FolderID = item.ParentID;
            invData.GroupID = item.GroupID;
            invData.GroupMask = (uint)perms.GroupMask;
            invData.GroupOwned = item.GroupOwned;
            invData.InvType = (sbyte)item.InventoryType;
            invData.ItemID = item.ID;
            invData.Name = Utils.StringToBytes(item.Name);
            invData.NextOwnerMask = (uint)perms.NextOwnerMask;
            invData.OwnerID = item.OwnerID;
            invData.OwnerMask = (uint)perms.OwnerMask;
            invData.SalePrice = item.SalePrice;
            invData.SaleType = (byte)item.SaleType;
            invData.Type = (sbyte)item.AssetType;

            update.InventoryData = new UpdateCreateInventoryItemPacket.InventoryDataBlock[1];
            update.InventoryData[0] = invData;

            m_log.DebugFormat("Created inventory item {0}. ItemID: {1}, AssetID: {2}, ParentID: {3}, TransactionID: {4}, CallbackID: {5}",
                item.Name, item.ID, item.AssetID, item.ParentID, transactionID, callbackID);

            m_udp.SendPacket(agent, update, ThrottleCategory.Task, false);
        }
コード例 #5
0
ファイル: TaskInventory.cs プロジェクト: osgrid/openmetaverse
        private void RezScriptHandler(Packet packet, LLAgent agent)
        {
            RezScriptPacket rez = (RezScriptPacket)packet;

            LLInventoryTaskItem scriptItem;
            ISceneEntity targetObj;

            if (m_scene.TryGetEntity(rez.UpdateBlock.ObjectLocalID, out targetObj) && targetObj is LLPrimitive)
            {
                LLPrimitive targetPrim = (LLPrimitive)targetObj;

                if (rez.InventoryBlock.ItemID != UUID.Zero)
                {
                    if (targetPrim.Inventory.TryGetItem(rez.InventoryBlock.ItemID, out scriptItem))
                    {
                        // Rezzing a script from task inventory
                        UUID assetID = UUID.Combine(rez.InventoryBlock.TransactionID, agent.SecureSessionID);

                        // Update task inventory with the new script source assetID
                        scriptItem.AssetID = assetID;
                        targetPrim.Inventory.AddOrUpdateItem(scriptItem, true);

                        // Run the script
                        if (m_scriptEngine != null)
                            m_scriptEngine.RezScript(scriptItem.ID, assetID, targetObj, 0);
                        else
                            m_log.Warn("Can't rez script in prim " + targetObj.ID + " without an ILSLScriptEngine");

                        SignalTaskInventoryChange(agent, targetPrim);
                    }
                    else if (m_inventory != null)
                    {
                        InventoryBase obj;
                        if (m_inventory.TryGetInventory(agent.ID, rez.InventoryBlock.ItemID, out obj) &&
                            obj is InventoryItem && ((InventoryItem)obj).ContentType == "application/vnd.ll.lsltext")
                        {
                            LLInventoryItem sourceItem = new LLInventoryItem((InventoryItem)obj);

                            // Rezzing a script from agent inventory
                            scriptItem = new LLInventoryTaskItem();
                            scriptItem.AssetID = sourceItem.AssetID;
                            scriptItem.ContentType = "application/vnd.ll.lsltext";
                            scriptItem.CreationDate = DateTime.UtcNow;
                            scriptItem.CreatorID = agent.ID;
                            scriptItem.Description = sourceItem.Description;
                            scriptItem.ID = UUID.Random();
                            scriptItem.Name = sourceItem.Name;
                            scriptItem.OwnerID = sourceItem.OwnerID;
                            scriptItem.ParentID = sourceItem.ParentID;
                            scriptItem.ParentObjectID = targetPrim.ID;

                            scriptItem.Flags = sourceItem.Flags;
                            scriptItem.GroupID = sourceItem.GroupID;
                            scriptItem.GroupOwned = sourceItem.GroupOwned;
                            scriptItem.Permissions = sourceItem.Permissions;
                            scriptItem.SalePrice = sourceItem.SalePrice;
                            scriptItem.SaleType = sourceItem.SaleType;

                            targetPrim.Inventory.AddOrUpdateItem(scriptItem, false);
                            m_log.Info(agent.Name + " copied agent inventory script to task inventory: " + scriptItem.Name);

                            // Run the script
                            if (m_scriptEngine != null)
                                m_scriptEngine.RezScript(scriptItem.ID, scriptItem.AssetID, targetObj, 0);
                            else
                                m_log.Warn("Can't rez script in prim " + targetObj.ID + " without an ILSLScriptEngine");

                            SignalTaskInventoryChange(agent, targetPrim);
                        }
                        else
                        {
                            m_log.Warn(agent.Name + " called RezScript for unknown inventory script " + rez.InventoryBlock.ItemID);
                        }
                    }
                    else
                    {
                        m_log.Warn(agent.Name + "attempted to copy (and rez) script " + rez.InventoryBlock.ItemID +
                            " to task inventory, but we have no IInventoryClient");
                    }
                }
                else
                {
                    // Rezzing a new script
                    scriptItem = new LLInventoryTaskItem();
                    scriptItem.AssetID = DEFAULT_SCRIPT;
                    scriptItem.ContentType = "application/vnd.ll.lsltext";
                    scriptItem.CreationDate = DateTime.UtcNow;
                    scriptItem.CreatorID = agent.ID;
                    scriptItem.Description = String.Empty;
                    scriptItem.ID = UUID.Random();
                    scriptItem.Name = "New script";
                    scriptItem.OwnerID = agent.ID;
                    scriptItem.ParentID = rez.InventoryBlock.FolderID;
                    scriptItem.ParentObjectID = targetPrim.ID;
                    scriptItem.Permissions = GetDefaultPermissions();
                    scriptItem.SalePrice = 10;
                    scriptItem.SaleType = SaleType.Not;

                    targetPrim.Inventory.AddOrUpdateItem(scriptItem, false);
                    m_log.Info(agent.Name + " created new task inventory script: " + scriptItem.Name);

                    // Run the script
                    if (m_scriptEngine != null)
                        m_scriptEngine.RezScript(scriptItem.ID, scriptItem.AssetID, targetObj, 0);
                    else
                        m_log.Warn("Can't rez script in prim " + targetObj.ID + " without an ILSLScriptEngine");

                    SignalTaskInventoryChange(agent, targetPrim);
                }
            }
            else
            {
                m_log.Warn(agent.Name + "sent a RezScript packet referencing unknown object " + rez.UpdateBlock.ObjectLocalID);
            }
        }
コード例 #6
0
ファイル: TaskInventory.cs プロジェクト: osgrid/openmetaverse
        private void MoveTaskInventoryHandler(Packet packet, LLAgent agent)
        {
            MoveTaskInventoryPacket move = (MoveTaskInventoryPacket)packet;

            if (m_inventory != null)
            {
                LLInventoryTaskItem item;
                ISceneEntity sourceObj;

                if (m_scene.TryGetEntity(move.InventoryData.LocalID, out sourceObj) && sourceObj is LLPrimitive)
                {
                    LLPrimitive sourcePrim = (LLPrimitive)sourceObj;

                    if (sourcePrim.Inventory.TryGetItem(move.InventoryData.ItemID, out item))
                    {
                        InventoryBase obj;
                        if (m_inventory.TryGetInventory(agent.ID, move.AgentData.FolderID, out obj) && obj is InventoryFolder)
                        {
                            LLInventoryItem invItem = new LLInventoryItem
                            {
                                AssetID = item.AssetID,
                                ContentType = item.ContentType,
                                CreationDate = item.CreationDate,
                                CreatorID = item.CreatorID,
                                Description = item.Description,
                                ExtraData = item.ExtraData,
                                ID = UUID.Random(),
                                Name = item.Name,
                                OwnerID = agent.ID,
                                ParentID = move.AgentData.FolderID
                            };

                            if (m_inventory.TryCreateItem(agent.ID, invItem))
                            {
                                RemoveTaskInventory(agent, sourcePrim, item.ID);
                                SendItemCreatedPacket(agent, invItem, UUID.Zero, 0);
                                m_log.Debug(agent.Name + " moved task inventory item " + item.Name + " to agent inventory folder " + invItem.ParentID);
                            }
                            else
                            {
                                m_log.Warn(agent.Name + "attempted to move item " + move.InventoryData.ItemID +
                                    " to agent inventory folder " + move.AgentData.FolderID + " but item creation failed");
                            }
                        }
                        else
                        {
                            m_log.Warn(agent.Name + "attempted to move item " + move.InventoryData.ItemID +
                                " to unknown agent inventory folder " + move.AgentData.FolderID);
                        }
                    }
                }
            }
            else
            {
                m_log.Warn(agent.Name + "attempted to move item " + move.InventoryData.ItemID +
                    " to agent inventory, but we have no IInventoryClient");
            }
        }
コード例 #7
0
ファイル: Inventory.cs プロジェクト: thoys/simian
        private void SendBulkUpdate(LLAgent agent, List<InventoryBase> objs, UUID transactionID, uint callbackID)
        {
            BulkUpdateInventoryPacket update = new BulkUpdateInventoryPacket();
            update.AgentData.AgentID = agent.ID;
            update.AgentData.TransactionID = transactionID;

            // Count the number of folders and items
            int items = 0;
            int folders = 0;
            for (int i = 0; i < objs.Count; i++)
            {
                if (objs[i] is InventoryItem)
                    ++items;
                else
                    ++folders;
            }

            update.FolderData = new BulkUpdateInventoryPacket.FolderDataBlock[folders];
            update.ItemData = new BulkUpdateInventoryPacket.ItemDataBlock[items];

            items = 0;
            folders = 0;

            for (int i = 0; i < objs.Count; i++)
            {
                InventoryBase obj = objs[i];

                if (obj is InventoryItem)
                {
                    LLInventoryItem item = new LLInventoryItem((InventoryItem)obj);
                    BulkUpdateInventoryPacket.ItemDataBlock itemData = new BulkUpdateInventoryPacket.ItemDataBlock();

                    Permissions perms = item.Permissions;

                    itemData.AssetID = item.AssetID;
                    itemData.BaseMask = (uint)perms.BaseMask;
                    itemData.CallbackID = callbackID;
                    itemData.CRC = item.CRC();
                    itemData.CreationDate = (int)Utils.DateTimeToUnixTime(item.CreationDate);
                    itemData.CreatorID = item.CreatorID;
                    itemData.Description = Utils.StringToBytes(item.Description);
                    itemData.EveryoneMask = (uint)perms.EveryoneMask;
                    itemData.Flags = item.Flags;
                    itemData.FolderID = item.ParentID;
                    itemData.GroupID = item.GroupID;
                    itemData.GroupMask = (uint)perms.GroupMask;
                    itemData.GroupOwned = item.GroupOwned;
                    itemData.InvType = (sbyte)item.InventoryType;
                    itemData.ItemID = item.ID;
                    itemData.Name = Utils.StringToBytes(item.Name);
                    itemData.NextOwnerMask = (uint)perms.NextOwnerMask;
                    itemData.OwnerID = item.OwnerID;
                    itemData.OwnerMask = (uint)perms.OwnerMask;
                    itemData.SalePrice = item.SalePrice;
                    itemData.SaleType = (byte)item.SaleType;
                    itemData.Type = (sbyte)item.AssetType;

                    // Handle inventory links
                    InventoryType linkedInvType = item.LinkedInventoryType;
                    if (linkedInvType != InventoryType.Unknown)
                        itemData.InvType = (sbyte)linkedInvType;

                    update.ItemData[items] = itemData;
                    ++items;
                }
                else
                {
                    InventoryFolder folder = (InventoryFolder)obj;
                    BulkUpdateInventoryPacket.FolderDataBlock folderData = new BulkUpdateInventoryPacket.FolderDataBlock();

                    folderData.FolderID = folder.ID;
                    folderData.Name = Utils.StringToBytes(folder.Name);
                    folderData.ParentID = folder.ParentID;
                    folderData.Type = LLUtil.ContentTypeToLLAssetType(folder.PreferredContentType);

                    update.FolderData[folders] = folderData;
                    ++folders;
                }
            }

            m_udp.SendPacket(agent, update, ThrottleCategory.Task, true);
        }
コード例 #8
0
ファイル: Inventory.cs プロジェクト: thoys/simian
        void LinkInventoryItemHandler(Packet packet, LLAgent agent)
        {
            LinkInventoryItemPacket link = (LinkInventoryItemPacket)packet;

            // Try to fetch the inventory item we're linking to
            InventoryBase linkedObj;
            if (m_inventoryClient.TryGetInventory(agent.ID, link.InventoryBlock.OldItemID, out linkedObj) && linkedObj is InventoryItem)
            {
                LLInventoryItem linkedItem = new LLInventoryItem((InventoryItem)linkedObj);

                // Create the inventory item
                LLInventoryItem item = new LLInventoryItem();
                item.AssetID = link.InventoryBlock.OldItemID;
                item.ContentType = LLUtil.LLAssetTypeToContentType(link.InventoryBlock.Type);
                item.LinkedContentType = linkedItem.ContentType;
                item.CreationDate = DateTime.UtcNow;
                item.CreatorID = linkedItem.CreatorID;
                item.Description = Utils.BytesToString(link.InventoryBlock.Description);
                item.Flags = linkedItem.Flags;
                item.GroupID = linkedItem.GroupID;
                item.GroupOwned = linkedItem.GroupOwned;
                item.ID = UUID.Zero; // Set on the server side
                item.Name = Utils.BytesToString(link.InventoryBlock.Name);
                item.OwnerID = agent.ID;
                item.ParentID = link.InventoryBlock.FolderID;
                item.Permissions = linkedItem.Permissions;
                item.SalePrice = linkedItem.SalePrice;
                item.SaleType = linkedItem.SaleType;

                if (m_inventoryClient.TryCreateItem(agent.ID, item))
                    SendItemCreatedPacket(agent, new LLInventoryItem(item), link.InventoryBlock.TransactionID, link.InventoryBlock.CallbackID);
                else
                    m_log.Warn("Failed to create new inventory link " + item.Name + " in folder " + item.ParentID + " for " + agent.Name);
            }
            else
            {
                m_log.Warn(agent.Name + " tried to create inventory link to missing item " + link.InventoryBlock.OldItemID);
            }
        }
コード例 #9
0
ファイル: Inventory.cs プロジェクト: thoys/simian
        public LLInventoryItem ObjectToInventory(UUID agentID, ISceneEntity obj, byte[] assetData, string contentType, uint flags, bool isAttachment,
            UUID destinationID, UUID transactionID, bool derez, uint callbackID)
        {
            // Create the asset
            UUID assetID;
            if (m_assetClient.StoreAsset(contentType, false, false, assetData, obj.CreatorID, out assetID))
            {
                // Create the inventory item
                LLInventoryItem item = new LLInventoryItem();
                item.AssetID = assetID;
                item.ContentType = LLUtil.LLAssetTypeToContentType((int)AssetType.Object);
                item.CreationDate = DateTime.UtcNow;
                item.CreatorID = obj.CreatorID;
                item.Description = String.Empty;
                item.Flags = flags;
                item.GroupOwned = false;
                item.ID = UUID.Random();
                item.IsAttachment = isAttachment;
                item.Name = obj.Name;
                item.OwnerID = agentID;
                item.ParentID = destinationID;
                item.Permissions = GetDefaultPermissions();
                item.SalePrice = 10;
                item.SaleType = SaleType.Not;

                if (obj is LLPrimitive)
                {
                    LLPrimitive prim = (LLPrimitive)obj;
                    item.Description = prim.Prim.Properties.Description ?? String.Empty;
                    item.GroupID = prim.Prim.Properties.GroupID;
                    item.Permissions = prim.Prim.Properties.Permissions;
                    item.SalePrice = prim.Prim.Properties.SalePrice;
                    item.SaleType = prim.Prim.Properties.SaleType;
                }

                if (m_inventoryClient.TryCreateItem(agentID, item))
                {
                    if (derez)
                    {
                        // Remove the object from the scene
                        m_scene.EntityRemove(this, obj);
                    }

                    ISceneEntity entity;
                    if (m_scene.TryGetEntity(agentID, out entity) && entity is LLAgent)
                        SendItemCreatedPacket((LLAgent)entity, item, transactionID, callbackID);

                    m_log.DebugFormat("Serialized prim {0} ({1}) to agent inventory", obj.ID, obj.LocalID);
                    return item;
                }
                else
                {
                    m_log.Warn("Failed to create an inventory item for serialized object " + obj.LocalID);
                }
            }
            else
            {
                m_log.Warn("Failed to store asset for object " + obj.LocalID);
            }

            return null;
        }
コード例 #10
0
ファイル: Inventory.cs プロジェクト: thoys/simian
        void FetchInventoryHandler(Packet packet, LLAgent agent)
        {
            FetchInventoryPacket fetch = (FetchInventoryPacket)packet;

            // Fetch all of the items from the inventory server
            Dictionary<UUID, InventoryBase> items = FetchInventoryItems(agent, fetch.InventoryData);

            FetchInventoryReplyPacket reply = new FetchInventoryReplyPacket();
            reply.AgentData.AgentID = agent.ID;
            List<FetchInventoryReplyPacket.InventoryDataBlock> replies = new List<FetchInventoryReplyPacket.InventoryDataBlock>();

            for (int i = 0; i < fetch.InventoryData.Length; i++)
            {
                UUID itemID = fetch.InventoryData[i].ItemID;
                InventoryBase obj;

                if (itemID != UUID.Zero)
                {
                    FetchInventoryReplyPacket.InventoryDataBlock block = new FetchInventoryReplyPacket.InventoryDataBlock();
                    block.ItemID = itemID;

                    if (items.TryGetValue(itemID, out obj) && obj is InventoryItem)
                    {
                        LLInventoryItem item = new LLInventoryItem((InventoryItem)obj);

                        Permissions perms = item.Permissions;

                        block.AssetID = item.AssetID;
                        block.BaseMask = (uint)perms.BaseMask;
                        block.CRC = item.CRC();
                        block.CreationDate = (int)Utils.DateTimeToUnixTime(item.CreationDate);
                        block.CreatorID = item.CreatorID;
                        block.Description = Utils.StringToBytes(item.Description);
                        block.EveryoneMask = (uint)perms.EveryoneMask;
                        block.Flags = item.Flags;
                        block.FolderID = item.ParentID;
                        block.GroupID = item.GroupID;
                        block.GroupMask = (uint)perms.GroupMask;
                        block.GroupOwned = item.GroupOwned;
                        block.InvType = (sbyte)item.InventoryType;
                        block.Name = Utils.StringToBytes(item.Name);
                        block.NextOwnerMask = (uint)perms.NextOwnerMask;
                        block.OwnerID = item.OwnerID;
                        block.OwnerMask = (uint)perms.OwnerMask;
                        block.SalePrice = item.SalePrice;
                        block.SaleType = (byte)item.SaleType;
                        block.Type = (sbyte)item.AssetType;
                    }
                    else
                    {
                        m_log.Warn("FetchInventory failed for item " + itemID);

                        block.Name = Utils.EmptyBytes;
                        block.Description = Utils.EmptyBytes;
                    }

                    replies.Add(block);
                }
            }

            if (replies.Count > 0)
            {
                reply.InventoryData = replies.ToArray();

                m_udp.SendPacket(agent, reply, ThrottleCategory.Task, true);
            }
        }
コード例 #11
0
ファイル: Inventory.cs プロジェクト: thoys/simian
        void FetchInventoryDescendentsHandler(Packet packet, LLAgent agent)
        {
            FetchInventoryDescendentsPacket fetch = (FetchInventoryDescendentsPacket)packet;
            bool sendFolders = fetch.InventoryData.FetchFolders;
            bool sendItems = fetch.InventoryData.FetchItems;
            // TODO: Obey SortOrder
            InventorySortOrder order = (InventorySortOrder)fetch.InventoryData.SortOrder;
            // TODO: Use OwnerID, for library access only

            InventoryBase invObject;
            if (m_inventoryClient.TryGetInventory(agent.ID, fetch.InventoryData.FolderID, out invObject) && invObject is InventoryFolder)
            {
                InventoryFolder folder = (InventoryFolder)invObject;

                List<InventoryItem> items = new List<InventoryItem>();
                List<InventoryFolder> folders = new List<InventoryFolder>();
                int descendCount = folder.Children.Count;
                int version = folder.Version;

                InventoryDescendentsPacket descendents = new InventoryDescendentsPacket();
                descendents.AgentData.AgentID = agent.ID;
                descendents.AgentData.FolderID = folder.ID;
                descendents.AgentData.OwnerID = folder.OwnerID;
                descendents.AgentData.Descendents = descendCount;
                descendents.AgentData.Version = version;

                if (sendItems || sendFolders)
                {
                    // Create a list of all of the folders and items under this folder
                    lock (folder.Children)
                    {
                        foreach (InventoryBase obj in folder.Children.Values)
                        {
                            if (obj is InventoryItem)
                                items.Add((InventoryItem)obj);
                            else
                                folders.Add((InventoryFolder)obj);
                        }
                    }
                }

                if (sendFolders)
                {
                    descendents.FolderData = new InventoryDescendentsPacket.FolderDataBlock[folders.Count];
                    for (int i = 0; i < folders.Count; i++)
                    {
                        InventoryFolder currentFolder = folders[i];

                        descendents.FolderData[i] = new InventoryDescendentsPacket.FolderDataBlock();
                        descendents.FolderData[i].FolderID = currentFolder.ID;
                        descendents.FolderData[i].Name = Utils.StringToBytes(currentFolder.Name);
                        descendents.FolderData[i].ParentID = currentFolder.ParentID;
                        descendents.FolderData[i].Type = LLUtil.ContentTypeToLLAssetType(currentFolder.PreferredContentType);
                    }
                }
                else
                {
                    descendents.FolderData = new InventoryDescendentsPacket.FolderDataBlock[0];

                    /*descendents.FolderData = new InventoryDescendentsPacket.FolderDataBlock[1];
                    descendents.FolderData[0] = new InventoryDescendentsPacket.FolderDataBlock();
                    descendents.FolderData[0].FolderID = folder.ID;
                    descendents.FolderData[0].Name = Utils.StringToBytes(folder.Name);
                    descendents.FolderData[0].ParentID = folder.ParentID;
                    descendents.FolderData[0].Type = Util.ContentTypeToLLAssetType(folder.PreferredContentType);*/
                }

                if (sendItems)
                {
                    descendents.ItemData = new InventoryDescendentsPacket.ItemDataBlock[items.Count];
                    for (int i = 0; i < items.Count; i++)
                    {
                        LLInventoryItem currentItem = new LLInventoryItem(items[i]);

                        InventoryDescendentsPacket.ItemDataBlock block = new InventoryDescendentsPacket.ItemDataBlock();
                        block.AssetID = currentItem.AssetID;
                        block.BaseMask = (uint)currentItem.Permissions.BaseMask;
                        block.CRC = currentItem.CRC();
                        block.CreationDate = (int)Utils.DateTimeToUnixTime(currentItem.CreationDate);
                        block.CreatorID = currentItem.CreatorID;
                        block.Description = Utils.StringToBytes(currentItem.Description);
                        block.EveryoneMask = (uint)currentItem.Permissions.EveryoneMask;
                        block.Flags = currentItem.Flags;
                        block.FolderID = currentItem.ParentID;
                        block.GroupID = currentItem.GroupID;
                        block.GroupMask = (uint)currentItem.Permissions.GroupMask;
                        block.GroupOwned = currentItem.GroupOwned;
                        block.InvType = (sbyte)currentItem.InventoryType;
                        block.ItemID = currentItem.ID;
                        block.Name = Utils.StringToBytes(currentItem.Name);
                        block.NextOwnerMask = (uint)currentItem.Permissions.NextOwnerMask;
                        block.OwnerID = currentItem.OwnerID;
                        block.OwnerMask = (uint)currentItem.Permissions.OwnerMask;
                        block.SalePrice = currentItem.SalePrice;
                        block.SaleType = (byte)currentItem.SaleType;
                        block.Type = (sbyte)currentItem.AssetType;

                        // Handle inventory links
                        InventoryType linkedInvType = currentItem.LinkedInventoryType;
                        if (linkedInvType != InventoryType.Unknown)
                            block.InvType = (sbyte)linkedInvType;

                        descendents.ItemData[i] = block;
                    }
                }
                else
                {
                    descendents.ItemData = new InventoryDescendentsPacket.ItemDataBlock[0];
                }

                m_udp.SendPacket(agent, descendents, ThrottleCategory.Task, false);
            }
            else
            {
                m_log.Warn("FetchInventoryDescendents called for an unknown folder " + fetch.InventoryData.FolderID);
            }
        }
コード例 #12
0
ファイル: Inventory.cs プロジェクト: thoys/simian
        void CreateInventoryItemHandler(Packet packet, LLAgent agent)
        {
            CreateInventoryItemPacket create = (CreateInventoryItemPacket)packet;

            AssetType type = (AssetType)create.InventoryBlock.Type;

            UUID assetID = create.InventoryBlock.TransactionID;
            if (assetID != UUID.Zero)
                assetID = UUID.Combine(assetID, agent.SecureSessionID);

            if (assetID == UUID.Zero)
            {
                if (type == AssetType.LSLText)
                    assetID = TaskInventory.DEFAULT_SCRIPT;
                else
                    m_log.Warn("Creating a " + type + " inventory item with a null AssetID");
            }

            Permissions itemPerms = GetDefaultPermissions();
            itemPerms.NextOwnerMask = (PermissionMask)create.InventoryBlock.NextOwnerMask;

            // Create the inventory item
            LLInventoryItem item = new LLInventoryItem();
            item.AssetID = assetID;
            item.ContentType = LLUtil.LLAssetTypeToContentType((int)type);
            item.CreationDate = DateTime.UtcNow;
            item.CreatorID = agent.ID;
            item.Description = String.Empty;
            item.Flags = create.InventoryBlock.WearableType;
            item.GroupID = UUID.Zero;
            item.GroupOwned = false;
            item.ID = UUID.Zero; // Set on the server side
            item.Name = Utils.BytesToString(create.InventoryBlock.Name);
            item.OwnerID = agent.ID;
            item.ParentID = create.InventoryBlock.FolderID;
            item.Permissions = itemPerms;
            item.SalePrice = 10;
            item.SaleType = SaleType.Not;

            if (m_inventoryClient.TryCreateItem(agent.ID, item))
                SendItemCreatedPacket(agent, new LLInventoryItem(item), create.InventoryBlock.TransactionID, create.InventoryBlock.CallbackID);
            else
                m_log.Warn("Failed to create new inventory item " + item.Name + " in folder " + item.ParentID + " for " + agent.Name);
        }
コード例 #13
0
ファイル: Inventory.cs プロジェクト: thoys/simian
        private void CopyItem(LLAgent agent, UUID itemID, string newName, UUID targetFolderID, UUID transactionID, uint callbackID)
        {
            // Get the original object
            InventoryBase obj;
            if (m_inventoryClient.TryGetInventory(agent.ID, itemID, out obj) && obj is InventoryItem)
            {
                InventoryItem oldItem = (InventoryItem)obj;

                // The client will send an empty name for the item to be copied if the item name is not changing
                if (String.IsNullOrEmpty(newName))
                    newName = oldItem.Name;

                // Get the new folder
                InventoryBase folderObj;
                if (m_inventoryClient.TryGetInventory(agent.ID, targetFolderID, out folderObj) && folderObj is InventoryFolder)
                {
                    InventoryFolder targetFolder = (InventoryFolder)folderObj;

                    // Create the copy
                    LLInventoryItem newItem = new LLInventoryItem();
                    newItem.AssetID = oldItem.AssetID;
                    newItem.ContentType = oldItem.ContentType;
                    newItem.CreationDate = oldItem.CreationDate;
                    newItem.CreatorID = oldItem.CreatorID;
                    newItem.Description = oldItem.Description;
                    newItem.Flags = oldItem.ExtraData["flags"].AsUInteger();
                    newItem.GroupID = oldItem.ExtraData["group_id"].AsUUID();
                    newItem.GroupOwned = oldItem.ExtraData["group_owned"].AsBoolean();
                    newItem.ID = UUID.Random();
                    newItem.Name = oldItem.Name;
                    newItem.OwnerID = oldItem.OwnerID;
                    newItem.ParentID = targetFolder.ID;
                    newItem.Permissions = Permissions.FromOSD(oldItem.ExtraData["permissions"]);
                    if (newItem.Permissions == Permissions.NoPermissions)
                        newItem.Permissions = GetDefaultPermissions();
                    newItem.SalePrice = oldItem.ExtraData["sale_price"].AsInteger();
                    newItem.SaleType = (SaleType)oldItem.ExtraData["sale_type"].AsInteger();

                    if (m_inventoryClient.TryCreateItem(agent.ID, newItem))
                        SendItemCreatedPacket(agent, newItem, transactionID, callbackID);
                    else
                        m_log.Warn(agent.Name + " failed to create new inventory item " + newItem.ID + ", copied from " + oldItem.ID);
                }
                else
                {
                    m_log.Warn("CopyInventoryItem called with an unknown target folder " + targetFolderID);
                }
            }
            else
            {
                m_log.Warn(agent.Name + " sent CopyInventoryItem called for an unknown item " + itemID);
            }
        }
コード例 #14
0
ファイル: Inventory.cs プロジェクト: thoys/simian
        void UpdateInventoryItemHandler(Packet packet, LLAgent agent)
        {
            UpdateInventoryItemPacket update = (UpdateInventoryItemPacket)packet;

            // No packet is sent back to the client, we just need to update the
            // inventory item locally
            for (int i = 0; i < update.InventoryData.Length; i++)
            {
                UpdateInventoryItemPacket.InventoryDataBlock block = update.InventoryData[i];

                UUID assetID = block.TransactionID;
                if (assetID != UUID.Zero)
                    assetID = UUID.Combine(assetID, agent.SecureSessionID);
                string itemName = Utils.BytesToString(block.Name);
                AssetType assetType = (AssetType)block.Type;

                InventoryBase invObject;
                if (m_inventoryClient.TryGetInventory(agent.ID, block.ItemID, out invObject) && invObject is InventoryItem)
                {
                    LLInventoryItem item = new LLInventoryItem((InventoryItem)invObject);

                    // SECURITY TODO: Check if we have permission to modify this item and its permissions

                    //item.AssetID = assetID; // This is not shared with the client, so the client sends it as UUID.Zero
                    item.ContentType = LLUtil.LLAssetTypeToContentType(block.Type);
                    //item.CreationDate = Utils.UnixTimeToDateTime(block.CreationDate); // Do not trust the client
                    //item.CreatorID = block.CreatorID; // Do not trust the client
                    item.Description = Utils.BytesToString(block.Description);
                    item.Flags = block.Flags; // TODO: Probably should not be trusting the client for this

                    if (m_permissions != null && m_permissions.IsInGroup(agent, block.GroupID))
                        item.GroupID = block.GroupID;
                    item.GroupOwned = (item.GroupID != UUID.Zero) ? block.GroupOwned : false;

                    //item.ID = block.ItemID; // Do not trust the client
                    item.Name = itemName;
                    //item.OwnerID = block.OwnerID; // Do not trust the client
                    item.ParentID = block.FolderID;

                    Permissions perms = item.Permissions;
                    perms.BaseMask = (PermissionMask)block.BaseMask;
                    perms.EveryoneMask = (PermissionMask)block.EveryoneMask;
                    perms.GroupMask = (PermissionMask)block.GroupMask;
                    perms.NextOwnerMask = (PermissionMask)block.NextOwnerMask;
                    perms.OwnerMask = (PermissionMask)block.OwnerMask;
                    item.Permissions = perms;
                    item.SalePrice = block.SalePrice;
                    item.SaleType = (SaleType)block.SaleType;

                    if (!m_inventoryClient.TryCreateItem(agent.ID, item))
                        m_log.Warn(agent.Name + "'s UpdateInventoryItem failed for " + item.Name);
                }
                else
                {
                    m_log.Warn(agent.Name + " sent UpdateInventoryItem for missing item " + block.ItemID);
                }
            }
        }
コード例 #15
0
ファイル: TaskInventory.cs プロジェクト: jhurliman/simian
        private void RezScriptHandler(Packet packet, LLAgent agent)
        {
            RezScriptPacket rez = (RezScriptPacket)packet;

            LLInventoryTaskItem scriptItem;
            ISceneEntity        targetObj;

            if (m_scene.TryGetEntity(rez.UpdateBlock.ObjectLocalID, out targetObj) && targetObj is LLPrimitive)
            {
                LLPrimitive targetPrim = (LLPrimitive)targetObj;

                if (rez.InventoryBlock.ItemID != UUID.Zero)
                {
                    if (targetPrim.Inventory.TryGetItem(rez.InventoryBlock.ItemID, out scriptItem))
                    {
                        // Rezzing a script from task inventory
                        UUID assetID = UUID.Combine(rez.InventoryBlock.TransactionID, agent.SecureSessionID);

                        // Update task inventory with the new script source assetID
                        scriptItem.AssetID = assetID;
                        targetPrim.Inventory.AddOrUpdateItem(scriptItem, true);

                        // Run the script
                        if (m_scriptEngine != null)
                        {
                            m_scriptEngine.RezScript(scriptItem.ID, assetID, targetObj, 0);
                        }
                        else
                        {
                            m_log.Warn("Can't rez script in prim " + targetObj.ID + " without an ILSLScriptEngine");
                        }

                        SignalTaskInventoryChange(agent, targetPrim);
                    }
                    else if (m_inventory != null)
                    {
                        InventoryBase obj;
                        if (m_inventory.TryGetInventory(agent.ID, rez.InventoryBlock.ItemID, out obj) &&
                            obj is InventoryItem && ((InventoryItem)obj).ContentType == "application/vnd.ll.lsltext")
                        {
                            LLInventoryItem sourceItem = new LLInventoryItem((InventoryItem)obj);

                            // Rezzing a script from agent inventory
                            scriptItem                = new LLInventoryTaskItem();
                            scriptItem.AssetID        = sourceItem.AssetID;
                            scriptItem.ContentType    = "application/vnd.ll.lsltext";
                            scriptItem.CreationDate   = DateTime.UtcNow;
                            scriptItem.CreatorID      = agent.ID;
                            scriptItem.Description    = sourceItem.Description;
                            scriptItem.ID             = UUID.Random();
                            scriptItem.Name           = sourceItem.Name;
                            scriptItem.OwnerID        = sourceItem.OwnerID;
                            scriptItem.ParentID       = sourceItem.ParentID;
                            scriptItem.ParentObjectID = targetPrim.ID;

                            scriptItem.Flags       = sourceItem.Flags;
                            scriptItem.GroupID     = sourceItem.GroupID;
                            scriptItem.GroupOwned  = sourceItem.GroupOwned;
                            scriptItem.Permissions = sourceItem.Permissions;
                            scriptItem.SalePrice   = sourceItem.SalePrice;
                            scriptItem.SaleType    = sourceItem.SaleType;

                            targetPrim.Inventory.AddOrUpdateItem(scriptItem, false);
                            m_log.Info(agent.Name + " copied agent inventory script to task inventory: " + scriptItem.Name);

                            // Run the script
                            if (m_scriptEngine != null)
                            {
                                m_scriptEngine.RezScript(scriptItem.ID, scriptItem.AssetID, targetObj, 0);
                            }
                            else
                            {
                                m_log.Warn("Can't rez script in prim " + targetObj.ID + " without an ILSLScriptEngine");
                            }

                            SignalTaskInventoryChange(agent, targetPrim);
                        }
                        else
                        {
                            m_log.Warn(agent.Name + " called RezScript for unknown inventory script " + rez.InventoryBlock.ItemID);
                        }
                    }
                    else
                    {
                        m_log.Warn(agent.Name + "attempted to copy (and rez) script " + rez.InventoryBlock.ItemID +
                                   " to task inventory, but we have no IInventoryClient");
                    }
                }
                else
                {
                    // Rezzing a new script
                    scriptItem                = new LLInventoryTaskItem();
                    scriptItem.AssetID        = DEFAULT_SCRIPT;
                    scriptItem.ContentType    = "application/vnd.ll.lsltext";
                    scriptItem.CreationDate   = DateTime.UtcNow;
                    scriptItem.CreatorID      = agent.ID;
                    scriptItem.Description    = String.Empty;
                    scriptItem.ID             = UUID.Random();
                    scriptItem.Name           = "New script";
                    scriptItem.OwnerID        = agent.ID;
                    scriptItem.ParentID       = rez.InventoryBlock.FolderID;
                    scriptItem.ParentObjectID = targetPrim.ID;
                    scriptItem.Permissions    = GetDefaultPermissions();
                    scriptItem.SalePrice      = 10;
                    scriptItem.SaleType       = SaleType.Not;

                    targetPrim.Inventory.AddOrUpdateItem(scriptItem, false);
                    m_log.Info(agent.Name + " created new task inventory script: " + scriptItem.Name);

                    // Run the script
                    if (m_scriptEngine != null)
                    {
                        m_scriptEngine.RezScript(scriptItem.ID, scriptItem.AssetID, targetObj, 0);
                    }
                    else
                    {
                        m_log.Warn("Can't rez script in prim " + targetObj.ID + " without an ILSLScriptEngine");
                    }

                    SignalTaskInventoryChange(agent, targetPrim);
                }
            }
            else
            {
                m_log.Warn(agent.Name + "sent a RezScript packet referencing unknown object " + rez.UpdateBlock.ObjectLocalID);
            }
        }
コード例 #16
0
ファイル: TaskInventory.cs プロジェクト: jhurliman/simian
        private void UpdateTaskInventoryHandler(Packet packet, LLAgent agent)
        {
            UpdateTaskInventoryPacket update = (UpdateTaskInventoryPacket)packet;

            LLInventoryTaskItem item;
            ISceneEntity        targetObj;

            if (update.UpdateData.Key != 0)
            {
                m_log.Warn("Got an UpdateTaskInventory packet with a Key of " + update.UpdateData.Key);
                return;
            }

            if (m_scene.TryGetEntity(update.UpdateData.LocalID, out targetObj) && targetObj is LLPrimitive)
            {
                LLPrimitive targetPrim = (LLPrimitive)targetObj;

                // Updating an existing item in the task inventory
                if (targetPrim.Inventory.TryGetItem(update.InventoryData.ItemID, out item))
                {
                    if (update.InventoryData.TransactionID != UUID.Zero)
                    {
                        item.AssetID = UUID.Combine(update.InventoryData.TransactionID, agent.SecureSessionID);
                    }

                    item.Description = Utils.BytesToString(update.InventoryData.Description);
                    item.Flags       = update.InventoryData.Flags;
                    item.GroupID     = update.InventoryData.GroupID;
                    item.GroupOwned  = update.InventoryData.GroupOwned;
                    item.Name        = Utils.BytesToString(update.InventoryData.Name);
                    item.Permissions = new Permissions(update.InventoryData.BaseMask, update.InventoryData.EveryoneMask,
                                                       update.InventoryData.GroupMask, update.InventoryData.NextOwnerMask, update.InventoryData.OwnerMask);
                    item.SalePrice = update.InventoryData.SalePrice;
                    item.SaleType  = (SaleType)update.InventoryData.SaleType;

                    targetPrim.Inventory.AddOrUpdateItem(item, true);
                    m_log.Debug(agent.Name + " updated task inventory item: " + item.Name);

                    SignalTaskInventoryChange(agent, targetPrim);
                }
                else if (m_inventory != null)
                {
                    // Copying from agent inventory to task inventory
                    InventoryBase obj;
                    if (m_inventory.TryGetInventory(agent.ID, update.InventoryData.ItemID, out obj))
                    {
                        if (obj is InventoryItem)
                        {
                            // Create a new item in the task inventory
                            LLInventoryItem fromItem = new LLInventoryItem((InventoryItem)obj);

                            item = new LLInventoryTaskItem();
                            //item.ID will be assigned in AddOrUpdateItem
                            item.AssetID            = fromItem.AssetID;
                            item.ContentType        = fromItem.ContentType;
                            item.CreationDate       = fromItem.CreationDate;
                            item.CreatorID          = fromItem.CreatorID;
                            item.Description        = fromItem.Description;
                            item.Flags              = fromItem.ExtraData["Flags"].AsUInteger();
                            item.GrantedPermissions = 0;
                            item.GroupID            = fromItem.ExtraData["group_id"].AsUUID();
                            item.GroupOwned         = fromItem.ExtraData["group_owned"].AsBoolean();
                            item.Name              = fromItem.Name;
                            item.OwnerID           = agent.ID;
                            item.ParentID          = update.InventoryData.FolderID;
                            item.ParentObjectID    = targetPrim.ID;
                            item.PermissionGranter = UUID.Zero;
                            item.Permissions       = fromItem.Permissions;
                            item.SalePrice         = fromItem.ExtraData["sale_price"].AsInteger();
                            item.SaleType          = (SaleType)fromItem.ExtraData["sale_type"].AsInteger();

                            targetPrim.Inventory.AddOrUpdateItem(item, false);
                            m_log.Debug(agent.Name + " created new task inventory item: " + item.Name);

                            SignalTaskInventoryChange(agent, targetPrim);
                        }
                        else
                        {
                            m_log.Error("[TODO] Handle dropping folders in task inventory");
                        }
                    }
                    else
                    {
                        m_log.Warn(agent.Name + " sent an UpdateTaskInventory packet requesting unknown " +
                                   "(or failed to fetch) inventory item " + update.InventoryData.ItemID);
                    }
                }
                else
                {
                    m_log.Warn(agent.Name + "attempted to copy inventory item " + update.InventoryData.ItemID +
                               " to task inventory, but we have no IInventoryClient");
                }
            }
            else
            {
                m_log.Warn(agent.Name + " attempted to update task inventory for prim " + update.UpdateData.LocalID +
                           " that does not exist in this scene");
            }
        }