/// <summary>
        /// Capability originating call to update the asset of a script in a prim's (task's) inventory
        /// </summary>
        /// <param name="remoteClient"></param>
        /// <param name="itemID"></param>
        /// <param name="primID">The prim which contains the item to update</param>
        /// <param name="isScriptRunning">Indicates whether the script to update is currently running</param>
        /// <param name="data"></param>
        public UpdateItemResponse CapsUpdateTaskInventoryScriptAsset(IClientAPI remoteClient, UUID itemId,
                                                       UUID primId, bool isScriptRunning, byte[] data)
        {
            if (!Permissions.CanEditScript(itemId, primId, remoteClient.AgentId))
            {
                remoteClient.SendAgentAlertMessage("Insufficient permissions to edit script", false);
                return new UpdateItemResponse();
            }

            // Retrieve group
            SceneObjectPart part = GetSceneObjectPart(primId);
            SceneObjectGroup group = part.ParentGroup;
            if (null == group)
            {
                m_log.ErrorFormat(
                    "[PRIM INVENTORY]: " +
                    "Prim inventory update requested for item ID {0} in prim ID {1} but this prim does not exist",
                    itemId, primId);

                return new UpdateItemResponse();
            }

            // Retrieve item
            TaskInventoryItem item = group.GetInventoryItem(part.LocalId, itemId);

            if (null == item)
            {
                m_log.ErrorFormat(
                    "[PRIM INVENTORY]: Tried to retrieve item ID {0} from prim {1}, {2} for caps script update "
                        + " but the item does not exist in this inventory",
                    itemId, part.Name, part.UUID);

                return new UpdateItemResponse();
            }

            AssetBase asset = CreateAsset(item.Name, item.Description, (sbyte)AssetType.LSLText, data);
            m_log.InfoFormat("[ASSETS]: CapsUpdateTaskInventoryScriptAsset created new asset {0} -> {1} for {2}", item.AssetID, asset.FullID, item.Name);

            try
            {
                CommsManager.AssetCache.AddAsset(asset, AssetRequestInfo.GenericNetRequest());
            }
            catch (AssetServerException e)
            {
                m_log.ErrorFormat("[PRIM INVENTORY] Unable to update script: {0}", e);
                remoteClient.SendAgentAlertMessage("Unable to update script asset. Try again later.", false);
                return new UpdateItemResponse();
            }

            // Update item with new asset
            group.UpdateInventoryItemAsset(item.ParentPartID, item.ItemID, asset.FullID);
            part.GetProperties(remoteClient);

            using (MessageStoringCompilationListener storingListener = new MessageStoringCompilationListener())
            {
                // Trigger rerunning of script (use TriggerRezScript event, see RezScript)

                ScriptStartFlags startFlags = ScriptStartFlags.None;
                if (!isScriptRunning)
                {
                    startFlags |= ScriptStartFlags.StartGloballyDisabled;
                }

                part.Inventory.CreateScriptInstance(item.ItemID, 0, startFlags, DefaultScriptEngine, (int)ScriptStateSource.None, storingListener, true);
                storingListener.WaitForCompilation(MessageStoringCompilationListener.DEFAULT_TIMEOUT);

                if (storingListener.HasErrors())
                {
                    return new UpdateItemResponse(item.AssetID, AssetType.LSLText, storingListener.Messages);
                }
                else
                {
                    return new UpdateItemResponse(item.AssetID, AssetType.LSLText);
                }
            }
        }
        /// <summary>
        /// Capability originating call to update the asset of an item in an agent's inventory
        /// </summary>
        /// <param name="remoteClient"></param>
        /// <param name="itemID"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public virtual UpdateItemResponse CapsUpdateInventoryItemAsset(IClientAPI remoteClient, UUID itemID, byte[] data)
        {
            CachedUserInfo userInfo = CommsManager.UserService.GetUserDetails(remoteClient.AgentId);
            if (userInfo != null)
            {
                InventoryItemBase item = userInfo.FindItem(itemID);

                if (item != null)
                {
                    //does the item belong to this user?
                    if (item.Owner != remoteClient.AgentId)
                    {
                        m_log.ErrorFormat(
                            "[AGENT INVENTORY]: Not allowing CAPS update from user {0} that doesn't own item {1}",
                            remoteClient.AgentId, itemID);

                        return new UpdateItemResponse();
                    }

                    if ((InventoryType)item.InvType == InventoryType.Notecard)
                    {
                        if (!Permissions.CanEditNotecard(itemID, UUID.Zero, remoteClient.AgentId))
                        {
                            remoteClient.SendAgentAlertMessage("Insufficient permissions to edit notecard", false);
                            return new UpdateItemResponse();
                        }

                        remoteClient.SendAgentAlertMessage("Notecard saved", false);
                    }
                    else if ((InventoryType)item.InvType == InventoryType.LSL)
                    {
                        if (!Permissions.CanEditScript(itemID, UUID.Zero, remoteClient.AgentId))
                        {
                            remoteClient.SendAgentAlertMessage("Insufficient permissions to edit script", false);
                            return new UpdateItemResponse();
                        }
                    }

                    AssetBase asset =
                        CreateAsset(item.Name, item.Description, (sbyte)item.AssetType, data);

                    try
                    {
                        CommsManager.AssetCache.AddAsset(asset, AssetRequestInfo.GenericNetRequest());
                    }
                    catch (AssetServerException e)
                    {
                        m_log.ErrorFormat("[AGENT INVENTORY] Caps update failed due to asset write error {0}", e);
                        remoteClient.SendAgentAlertMessage("Asset server error, try again later", false);
                        return new UpdateItemResponse();
                    }

                    item.AssetID = asset.FullID;
                    userInfo.UpdateItem(item);

                        
                    if ((InventoryType)item.InvType == InventoryType.LSL)
                    {
                        //compile script and return results to the user
                        using (MessageStoringCompilationListener compListener = new MessageStoringCompilationListener())
                        {
                            EventManager.TriggerCompileScript(Utils.BytesToString(data), compListener);

                            if (compListener.HasErrors())
                            {
                                return new UpdateItemResponse(item.AssetID, AssetType.LSLText, compListener.Messages);
                            }
                        }
                    }

                    // remoteClient.SendInventoryItemCreateUpdate(item);
                    return new UpdateItemResponse(asset.FullID, (AssetType) item.AssetType);
                }
            }
            else
            {
                m_log.ErrorFormat(
                    "[AGENT INVENTORY]: Could not resolve user {0} for caps inventory update",
                    remoteClient.AgentId);
            }

            return new UpdateItemResponse();
        }