diff --git a/Programs/Simian/Extensions/ImageDelivery.cs b/Programs/Simian/Extensions/ImageDelivery.cs index ff7d19b9..9e1b3d08 100644 --- a/Programs/Simian/Extensions/ImageDelivery.cs +++ b/Programs/Simian/Extensions/ImageDelivery.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Drawing; using System.Threading; using ExtensionLoader; using OpenMetaverse; @@ -85,8 +84,6 @@ namespace Simian.Extensions public class ImageDelivery : IExtension { Simian Server; - AssetTexture defaultJP2; - AssetTexture defaultBakedJP2; Dictionary CurrentDownloads = new Dictionary(); BlockingQueue CurrentDownloadQueue = new BlockingQueue(); @@ -98,24 +95,6 @@ namespace Simian.Extensions public void Start() { Server.UDP.RegisterPacketCallback(PacketType.RequestImage, new PacketCallback(RequestImageHandler)); - - // Create default textures for missing images and missing bakes - Bitmap defaultImage = new Bitmap(32, 32); - Graphics gfx = Graphics.FromImage(defaultImage); - gfx.Clear(Color.White); - gfx.FillRectangles(Brushes.LightGray, new Rectangle[] { new Rectangle(16, 16, 16, 16), new Rectangle(0, 0, 16, 16) }); - gfx.DrawImage(defaultImage, 0, 0, 32, 32); - - ManagedImage defaultManaged = new ManagedImage(defaultImage); - - ManagedImage defaultBaked = new ManagedImage(defaultImage); - defaultBaked.Channels = ManagedImage.ImageChannels.Color | ManagedImage.ImageChannels.Alpha | - ManagedImage.ImageChannels.Bump; - defaultBaked.Alpha = defaultBaked.Red; - defaultBaked.Bump = defaultBaked.Red; - - defaultJP2 = new AssetTexture(UUID.Zero, OpenJPEG.Encode(defaultManaged, true)); - defaultBakedJP2 = new AssetTexture(UUID.Zero, OpenJPEG.Encode(defaultBaked, true)); } public void Stop() @@ -247,27 +226,6 @@ namespace Simian.Extensions ImageNotInDatabasePacket notfound = new ImageNotInDatabasePacket(); notfound.ImageID.ID = block.Image; Server.UDP.SendPacket(agent.AgentID, notfound, PacketCategory.Texture); - - /* - // TODO: Technically we should return ImageNotInDatabasePacket, but for now return a default texture - ImageDataPacket imageData = new ImageDataPacket(); - imageData.ImageID.ID = block.Image; - imageData.ImageID.Codec = 1; - imageData.ImageID.Packets = 1; - if (bake) - { - Logger.DebugLog(String.Format("Sending default bake texture for {0}", block.Image)); - imageData.ImageData.Data = defaultBakedJP2.AssetData; - } - else - { - Logger.DebugLog(String.Format("Sending default texture for {0}", block.Image)); - imageData.ImageData.Data = defaultJP2.AssetData; - } - imageData.ImageID.Size = (uint)imageData.ImageData.Data.Length; - - Server.UDP.SendPacket(agent.AgentID, imageData, PacketCategory.Texture); - */ } } } diff --git a/Programs/Simian/Extensions/InventoryManager.cs b/Programs/Simian/Extensions/InventoryManager.cs index 36adbde4..d1310f0e 100644 --- a/Programs/Simian/Extensions/InventoryManager.cs +++ b/Programs/Simian/Extensions/InventoryManager.cs @@ -29,6 +29,7 @@ namespace Simian.Extensions Server.UDP.RegisterPacketCallback(PacketType.UpdateInventoryItem, new PacketCallback(UpdateInventoryItemHandler)); Server.UDP.RegisterPacketCallback(PacketType.FetchInventoryDescendents, new PacketCallback(FetchInventoryDescendentsHandler)); Server.UDP.RegisterPacketCallback(PacketType.FetchInventory, new PacketCallback(FetchInventoryHandler)); + Server.UDP.RegisterPacketCallback(PacketType.CopyInventoryItem, new PacketCallback(CopyInventoryItemHandler)); Server.UDP.RegisterPacketCallback(PacketType.MoveInventoryItem, new PacketCallback(MoveInventoryItemHandler)); Server.UDP.RegisterPacketCallback(PacketType.MoveInventoryFolder, new PacketCallback(MoveInventoryFolderHandler)); Server.UDP.RegisterPacketCallback(PacketType.PurgeInventoryDescendents, new PacketCallback(PurgeInventoryDescendentsHandler)); @@ -318,6 +319,53 @@ namespace Simian.Extensions Server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Inventory); } + void CopyInventoryItemHandler(Packet packet, Agent agent) + { + CopyInventoryItemPacket copy = (CopyInventoryItemPacket)packet; + + for (int i = 0; i < copy.InventoryData.Length; i++) + { + CopyInventoryItemPacket.InventoryDataBlock block = copy.InventoryData[i]; + + // TODO: This allows someone to copy objects from another + // agent's inventory. Should we allow that, or do any + // permission checks? + Dictionary agentInventory = GetAgentInventory(block.OldAgentID); + + // Get the original object + InventoryObject obj; + if (agentInventory.TryGetValue(block.OldItemID, out obj) && obj is InventoryItem) + { + InventoryItem item = (InventoryItem)obj; + + // Get the new folder + InventoryObject folderObj; + if (agentInventory.TryGetValue(block.NewFolderID, out folderObj) && folderObj is InventoryFolder) + { + string newName = Utils.BytesToString(block.NewName); + if (String.IsNullOrEmpty(newName)) + newName = item.Name; + + // Create the copy + CreateItem(agent.AgentID, newName, item.Description, item.InventoryType, item.AssetType, + item.AssetID, folderObj.ID, item.Permissions.OwnerMask, item.Permissions.NextOwnerMask, + agent.AgentID, item.CreatorID, UUID.Zero, block.CallbackID); + } + else + { + Logger.Log("CopyInventoryItem called with an unknown target folder " + block.NewFolderID, + Helpers.LogLevel.Warning); + } + + } + else + { + Logger.Log("CopyInventoryItem called for an unknown item " + block.OldItemID, + Helpers.LogLevel.Warning); + } + } + } + void MoveInventoryItemHandler(Packet packet, Agent agent) { MoveInventoryItemPacket move = (MoveInventoryItemPacket)packet; @@ -663,7 +711,7 @@ namespace Simian.Extensions } } - #region Persistance + #region Persistence LLSDMap SerializeItem(InventoryItem item) { @@ -838,6 +886,6 @@ namespace Simian.Extensions Helpers.LogLevel.Info); } - #endregion Persistance + #endregion Persistence } } diff --git a/Programs/Simian/Extensions/XMLPersistence.cs b/Programs/Simian/Extensions/XMLPersistence.cs index e9bb883c..996b92d7 100644 --- a/Programs/Simian/Extensions/XMLPersistence.cs +++ b/Programs/Simian/Extensions/XMLPersistence.cs @@ -74,6 +74,7 @@ namespace Simian.Extensions try { XmlTextWriter writer = new XmlTextWriter(server.DataDir + "simiandata.xml", System.Text.Encoding.UTF8); + writer.Formatting = Formatting.Indented; writer.WriteStartElement("llsd"); LLSDParser.SerializeXmlElement(writer, dictionary); writer.WriteEndElement(); diff --git a/Programs/Simian/Simian.cs b/Programs/Simian/Simian.cs index 921eecbd..208b0452 100644 --- a/Programs/Simian/Simian.cs +++ b/Programs/Simian/Simian.cs @@ -293,7 +293,8 @@ namespace Simian reader.Close(); LoginResponseData responseData = HandleLogin(firstName, lastName, password, start, version, channel); - responseData.InventorySkeleton = Inventory.CreateInventorySkeleton(responseData.AgentID); + if (responseData.Success) + responseData.InventorySkeleton = Inventory.CreateInventorySkeleton(responseData.AgentID); XmlWriter writer = XmlWriter.Create(context.Response.OutputStream); responseData.ToXmlRpc(writer); writer.Close();