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"); } }
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); }
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"); } }
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); }
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); } }
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); }
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); } }
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; }
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); } }
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); } }
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); }
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); } }
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); } } }
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); } }
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"); } }