/// <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(); }