From 2b42ea0a429c722bd7c5c67d3815c2ddc8399e78 Mon Sep 17 00:00:00 2001 From: MW Date: Wed, 25 Jul 2007 18:19:38 +0000 Subject: Start of the OpenSim library , for now only contains a few textures. --- .../Framework/Communications/Cache/AssetCache.cs | 1122 ++++++++++---------- .../Cache/AssetTransactionManager.cs | 162 +-- .../Communications/Cache/AssetTransactions.cs | 548 +++++----- .../Communications/Cache/CachedUserInfo.cs | 188 ++-- .../Communications/Cache/InventoryFolder.cs | 218 ++-- .../Communications/Cache/LibraryRootFolder.cs | 89 ++ .../Communications/Cache/UserProfileCache.cs | 386 ++++--- .../Communications/CommunicationsManager.cs | 25 +- 8 files changed, 1440 insertions(+), 1298 deletions(-) create mode 100644 OpenSim/Framework/Communications/Cache/LibraryRootFolder.cs (limited to 'OpenSim/Framework/Communications') diff --git a/OpenSim/Framework/Communications/Cache/AssetCache.cs b/OpenSim/Framework/Communications/Cache/AssetCache.cs index 3d0fd76..a3480ec 100644 --- a/OpenSim/Framework/Communications/Cache/AssetCache.cs +++ b/OpenSim/Framework/Communications/Cache/AssetCache.cs @@ -1,561 +1,561 @@ -/* -* Copyright (c) Contributors, http://www.openmetaverse.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Text; -using System.Reflection; -using System.Threading; -using libsecondlife; -using libsecondlife.Packets; -using OpenSim.Framework.Interfaces; -using OpenSim.Framework.Servers; -using OpenSim.Framework.Types; -using OpenSim.Framework.Utilities; - -namespace OpenSim.Framework.Communications.Caches -{ - public delegate void DownloadComplete(AssetCache.TextureSender sender); - - public class AssetCache : IAssetReceiver - { - // Fields - private Thread _assetCacheThread; - private IAssetServer _assetServer; - public List AssetRequests; - public Dictionary Assets; - public Dictionary RequestedAssets; - public Dictionary RequestedTextures; - public Dictionary SendingTextures; - private LLUUID[] textureList; - public List TextureRequests; - public Dictionary Textures; - - // Methods - public AssetCache(IAssetServer assetServer) - { - this.AssetRequests = new List(); - this.TextureRequests = new List(); - this.RequestedAssets = new Dictionary(); - this.RequestedTextures = new Dictionary(); - this.SendingTextures = new Dictionary(); - this.textureList = new LLUUID[5]; - Console.WriteLine("Creating Asset cache"); - this._assetServer = assetServer; - this._assetServer.SetReceiver(this); - this.Assets = new Dictionary(); - this.Textures = new Dictionary(); - this._assetCacheThread = new Thread(new ThreadStart(this.RunAssetManager)); - this._assetCacheThread.IsBackground = true; - this._assetCacheThread.Start(); - } - - public AssetCache(string assetServerDLLName, string assetServerURL, string assetServerKey) - { - this.AssetRequests = new List(); - this.TextureRequests = new List(); - this.RequestedAssets = new Dictionary(); - this.RequestedTextures = new Dictionary(); - this.SendingTextures = new Dictionary(); - this.textureList = new LLUUID[5]; - Console.WriteLine("Creating Asset cache"); - this._assetServer = this.LoadAssetDll(assetServerDLLName); - this._assetServer.SetServerInfo(assetServerURL, assetServerKey); - this._assetServer.SetReceiver(this); - this.Assets = new Dictionary(); - this.Textures = new Dictionary(); - this._assetCacheThread = new Thread(new ThreadStart(this.RunAssetManager)); - this._assetCacheThread.IsBackground = true; - this._assetCacheThread.Start(); - } - - public void AddAsset(AssetBase asset) - { - if (asset.Type == 0) - { - if (!this.Textures.ContainsKey(asset.FullID)) - { - TextureImage image = new TextureImage(asset); - this.Textures.Add(image.FullID, image); - this._assetServer.UploadNewAsset(asset); - } - } - else if (!this.Assets.ContainsKey(asset.FullID)) - { - AssetInfo info = new AssetInfo(asset); - this.Assets.Add(info.FullID, info); - this._assetServer.UploadNewAsset(asset); - } - } - - public void AddAssetRequest(IClientAPI userInfo, TransferRequestPacket transferRequest) - { - LLUUID assetID = new LLUUID(transferRequest.TransferInfo.Params, 0); - if (!this.Assets.ContainsKey(assetID)) - { - if (!this.RequestedAssets.ContainsKey(assetID)) - { - AssetRequest request = new AssetRequest(); - request.RequestUser = userInfo; - request.RequestAssetID = assetID; - request.TransferRequestID = transferRequest.TransferInfo.TransferID; - this.RequestedAssets.Add(assetID, request); - this._assetServer.RequestAsset(assetID, false); - } - } - else - { - AssetInfo info = this.Assets[assetID]; - AssetRequest request2 = new AssetRequest(); - request2.RequestUser = userInfo; - request2.RequestAssetID = assetID; - request2.TransferRequestID = transferRequest.TransferInfo.TransferID; - request2.AssetInf = info; - if (info.Data.LongLength > 600) - { - request2.NumPackets = 1 + (((info.Data.Length - 600) + 0x3e7) / 0x3e8); - } - else - { - request2.NumPackets = 1; - } - this.AssetRequests.Add(request2); - } - } - - public void AddTextureRequest(IClientAPI userInfo, LLUUID imageID) - { - if (!this.Textures.ContainsKey(imageID)) - { - if (!this.RequestedTextures.ContainsKey(imageID)) - { - AssetRequest request = new AssetRequest(); - request.RequestUser = userInfo; - request.RequestAssetID = imageID; - request.IsTextureRequest = true; - this.RequestedTextures.Add(imageID, request); - this._assetServer.RequestAsset(imageID, true); - } - } - else - { - TextureImage image = this.Textures[imageID]; - AssetRequest request2 = new AssetRequest(); - request2.RequestUser = userInfo; - request2.RequestAssetID = imageID; - request2.IsTextureRequest = true; - request2.ImageInfo = image; - if (image.Data.LongLength > 600) - { - request2.NumPackets = 1 + (((image.Data.Length - 600) + 0x3e7) / 0x3e8); - } - else - { - request2.NumPackets = 1; - } - this.TextureRequests.Add(request2); - } - } - - public void AssetNotFound(AssetBase asset) - { - } - - public void AssetReceived(AssetBase asset, bool IsTexture) - { - if (asset.FullID != LLUUID.Zero) - { - if (IsTexture) - { - TextureImage image = new TextureImage(asset); - this.Textures.Add(image.FullID, image); - if (this.RequestedTextures.ContainsKey(image.FullID)) - { - AssetRequest request = this.RequestedTextures[image.FullID]; - request.ImageInfo = image; - if (image.Data.LongLength > 600) - { - request.NumPackets = 1 + (((image.Data.Length - 600) + 0x3e7) / 0x3e8); - } - else - { - request.NumPackets = 1; - } - this.RequestedTextures.Remove(image.FullID); - this.TextureRequests.Add(request); - } - } - else - { - AssetInfo info = new AssetInfo(asset); - this.Assets.Add(info.FullID, info); - if (this.RequestedAssets.ContainsKey(info.FullID)) - { - AssetRequest request2 = this.RequestedAssets[info.FullID]; - request2.AssetInf = info; - if (info.Data.LongLength > 600) - { - request2.NumPackets = 1 + (((info.Data.Length - 600) + 0x3e7) / 0x3e8); - } - else - { - request2.NumPackets = 1; - } - this.RequestedAssets.Remove(info.FullID); - this.AssetRequests.Add(request2); - } - } - } - } - - public AssetInfo CloneAsset(LLUUID newOwner, AssetInfo sourceAsset) - { - AssetInfo info = new AssetInfo(); - info.Data = new byte[sourceAsset.Data.Length]; - Array.Copy(sourceAsset.Data, info.Data, sourceAsset.Data.Length); - info.FullID = LLUUID.Random(); - info.Type = sourceAsset.Type; - info.InvType = sourceAsset.InvType; - return info; - } - - public TextureImage CloneImage(LLUUID newOwner, TextureImage source) - { - TextureImage image = new TextureImage(); - image.Data = new byte[source.Data.Length]; - Array.Copy(source.Data, image.Data, source.Data.Length); - image.FullID = LLUUID.Random(); - image.Name = source.Name; - return image; - } - - public AssetBase[] CreateNewInventorySet(LLUUID agentID) - { - AssetBase[] baseArray = new AssetBase[this.textureList.Length]; - for (int i = 0; i < this.textureList.Length; i++) - { - if (this.Textures.ContainsKey(this.textureList[i])) - { - baseArray[i] = this.CloneImage(agentID, this.Textures[this.textureList[i]]); - TextureImage asset = new TextureImage(baseArray[i]); - this.Textures.Add(asset.FullID, asset); - this._assetServer.UploadNewAsset(asset); - } - } - return baseArray; - } - - public AssetBase GetAsset(LLUUID assetID) - { - AssetBase base2 = null; - if (this.Textures.ContainsKey(assetID)) - { - return this.Textures[assetID]; - } - if (this.Assets.ContainsKey(assetID)) - { - base2 = this.Assets[assetID]; - } - return base2; - } - - private IAssetServer LoadAssetDll(string dllName) - { - Assembly assembly = Assembly.LoadFrom(dllName); - IAssetServer assetServer = null; - foreach (Type type in assembly.GetTypes()) - { - if (type.IsPublic && !type.IsAbstract) - { - if (type.GetInterface("IAssetPlugin", true) != null) - { - assetServer = ((IAssetPlugin)Activator.CreateInstance(assembly.GetType(type.ToString()))).GetAssetServer(); - break; - } - } - } - assembly = null; - return assetServer; - } - - public void LoadDefaultTextureSet() - { - this.textureList[0] = new LLUUID("00000000-0000-0000-9999-000000000001"); - this.textureList[1] = new LLUUID("00000000-0000-0000-9999-000000000002"); - this.textureList[2] = new LLUUID("00000000-0000-0000-9999-000000000003"); - this.textureList[3] = new LLUUID("00000000-0000-0000-9999-000000000004"); - this.textureList[4] = new LLUUID("00000000-0000-0000-9999-000000000005"); - for (int i = 0; i < this.textureList.Length; i++) - { - this._assetServer.RequestAsset(this.textureList[i], true); - } - } - - private void ProcessAssetQueue() - { - if (this.AssetRequests.Count != 0) - { - int num; - if (this.AssetRequests.Count < 5) - { - num = this.AssetRequests.Count; - } - else - { - num = 5; - } - for (int i = 0; i < num; i++) - { - AssetRequest request = this.AssetRequests[i]; - TransferInfoPacket newPack = new TransferInfoPacket(); - newPack.TransferInfo.ChannelType = 2; - newPack.TransferInfo.Status = 0; - newPack.TransferInfo.TargetType = 0; - newPack.TransferInfo.Params = request.RequestAssetID.GetBytes(); - newPack.TransferInfo.Size = request.AssetInf.Data.Length; - newPack.TransferInfo.TransferID = request.TransferRequestID; - request.RequestUser.OutPacket(newPack); - if (request.NumPackets == 1) - { - TransferPacketPacket packet2 = new TransferPacketPacket(); - packet2.TransferData.Packet = 0; - packet2.TransferData.ChannelType = 2; - packet2.TransferData.TransferID = request.TransferRequestID; - packet2.TransferData.Data = request.AssetInf.Data; - packet2.TransferData.Status = 1; - request.RequestUser.OutPacket(packet2); - } - else - { - TransferPacketPacket packet3 = new TransferPacketPacket(); - packet3.TransferData.Packet = 0; - packet3.TransferData.ChannelType = 2; - packet3.TransferData.TransferID = request.TransferRequestID; - byte[] destinationArray = new byte[0x3e8]; - Array.Copy(request.AssetInf.Data, destinationArray, 0x3e8); - packet3.TransferData.Data = destinationArray; - packet3.TransferData.Status = 0; - request.RequestUser.OutPacket(packet3); - packet3 = new TransferPacketPacket(); - packet3.TransferData.Packet = 1; - packet3.TransferData.ChannelType = 2; - packet3.TransferData.TransferID = request.TransferRequestID; - byte[] buffer2 = new byte[request.AssetInf.Data.Length - 0x3e8]; - Array.Copy(request.AssetInf.Data, 0x3e8, buffer2, 0, buffer2.Length); - packet3.TransferData.Data = buffer2; - packet3.TransferData.Status = 1; - request.RequestUser.OutPacket(packet3); - } - } - for (int j = 0; j < num; j++) - { - this.AssetRequests.RemoveAt(0); - } - } - } - - private void ProcessTextureQueue() - { - if (this.TextureRequests.Count != 0) - { - int num = this.TextureRequests.Count; - for (int i = 0; i < num; i++) - { - AssetRequest req = this.TextureRequests[i]; - if (!this.SendingTextures.ContainsKey(req.ImageInfo.FullID)) - { - TextureSender sender = new TextureSender(req); - sender.OnComplete += new DownloadComplete(this.TextureSent); - lock (this.SendingTextures) - { - this.SendingTextures.Add(req.ImageInfo.FullID, sender); - } - } - } - this.TextureRequests.Clear(); - } - } - - public void RunAssetManager() - { - Label_0000: - try - { - this.ProcessAssetQueue(); - this.ProcessTextureQueue(); - Thread.Sleep(500); - goto Label_0000; - } - catch (Exception exception) - { - Console.WriteLine(exception.Message); - goto Label_0000; - } - } - - public void TextureSent(TextureSender sender) - { - if (this.SendingTextures.ContainsKey(sender.request.ImageInfo.FullID)) - { - lock (this.SendingTextures) - { - this.SendingTextures.Remove(sender.request.ImageInfo.FullID); - } - } - } - - // Nested Types - public class AssetInfo : AssetBase - { - // Methods - public AssetInfo() - { - } - - public AssetInfo(AssetBase aBase) - { - base.Data = aBase.Data; - base.FullID = aBase.FullID; - base.Type = aBase.Type; - base.InvType = aBase.InvType; - base.Name = aBase.Name; - base.Description = aBase.Description; - } - } - - public class AssetRequest - { - // Fields - public AssetCache.AssetInfo AssetInf; - public long DataPointer; - public AssetCache.TextureImage ImageInfo; - public bool IsTextureRequest; - public int NumPackets; - public int PacketCounter; - public LLUUID RequestAssetID; - public IClientAPI RequestUser; - public LLUUID TransferRequestID; - } - - public class TextureImage : AssetBase - { - // Methods - public TextureImage() - { - } - - public TextureImage(AssetBase aBase) - { - base.Data = aBase.Data; - base.FullID = aBase.FullID; - base.Type = aBase.Type; - base.InvType = aBase.InvType; - base.Name = aBase.Name; - base.Description = aBase.Description; - } - } - - public class TextureSender - { - // Fields - private Thread m_thread; - public AssetCache.AssetRequest request; - - // Events - public event DownloadComplete OnComplete; - - // Methods - public TextureSender(AssetCache.AssetRequest req) - { - this.request = req; - this.m_thread = new Thread(new ThreadStart(this.SendTexture)); - this.m_thread.IsBackground = true; - this.m_thread.Start(); - } - - public void SendPacket() - { - AssetCache.AssetRequest request = this.request; - if (request.PacketCounter == 0) - { - if (request.NumPackets == 1) - { - ImageDataPacket newPack = new ImageDataPacket(); - newPack.ImageID.Packets = 1; - newPack.ImageID.ID = request.ImageInfo.FullID; - newPack.ImageID.Size = (uint)request.ImageInfo.Data.Length; - newPack.ImageData.Data = request.ImageInfo.Data; - newPack.ImageID.Codec = 2; - request.RequestUser.OutPacket(newPack); - request.PacketCounter++; - } - else - { - ImageDataPacket packet2 = new ImageDataPacket(); - packet2.ImageID.Packets = (ushort)request.NumPackets; - packet2.ImageID.ID = request.ImageInfo.FullID; - packet2.ImageID.Size = (uint)request.ImageInfo.Data.Length; - packet2.ImageData.Data = new byte[600]; - Array.Copy(request.ImageInfo.Data, 0, packet2.ImageData.Data, 0, 600); - packet2.ImageID.Codec = 2; - request.RequestUser.OutPacket(packet2); - request.PacketCounter++; - } - } - else - { - ImagePacketPacket packet3 = new ImagePacketPacket(); - packet3.ImageID.Packet = (ushort)request.PacketCounter; - packet3.ImageID.ID = request.ImageInfo.FullID; - int length = (request.ImageInfo.Data.Length - 600) - (0x3e8 * (request.PacketCounter - 1)); - if (length > 0x3e8) - { - length = 0x3e8; - } - packet3.ImageData.Data = new byte[length]; - Array.Copy(request.ImageInfo.Data, 600 + (0x3e8 * (request.PacketCounter - 1)), packet3.ImageData.Data, 0, length); - request.RequestUser.OutPacket(packet3); - request.PacketCounter++; - } - } - - public void SendTexture() - { - while (this.request.PacketCounter != this.request.NumPackets) - { - this.SendPacket(); - Thread.Sleep(500); - } - if (this.OnComplete != null) - { - this.OnComplete(this); - } - } - } - } -} +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.Reflection; +using System.Threading; +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Servers; +using OpenSim.Framework.Types; +using OpenSim.Framework.Utilities; + +namespace OpenSim.Framework.Communications.Caches +{ + public delegate void DownloadComplete(AssetCache.TextureSender sender); + + public class AssetCache : IAssetReceiver + { + // Fields + private Thread _assetCacheThread; + private IAssetServer _assetServer; + public List AssetRequests; + public Dictionary Assets; + public Dictionary RequestedAssets; + public Dictionary RequestedTextures; + public Dictionary SendingTextures; + private LLUUID[] textureList; + public List TextureRequests; + public Dictionary Textures; + + // Methods + public AssetCache(IAssetServer assetServer) + { + this.AssetRequests = new List(); + this.TextureRequests = new List(); + this.RequestedAssets = new Dictionary(); + this.RequestedTextures = new Dictionary(); + this.SendingTextures = new Dictionary(); + this.textureList = new LLUUID[5]; + Console.WriteLine("Creating Asset cache"); + this._assetServer = assetServer; + this._assetServer.SetReceiver(this); + this.Assets = new Dictionary(); + this.Textures = new Dictionary(); + this._assetCacheThread = new Thread(new ThreadStart(this.RunAssetManager)); + this._assetCacheThread.IsBackground = true; + this._assetCacheThread.Start(); + } + + public AssetCache(string assetServerDLLName, string assetServerURL, string assetServerKey) + { + this.AssetRequests = new List(); + this.TextureRequests = new List(); + this.RequestedAssets = new Dictionary(); + this.RequestedTextures = new Dictionary(); + this.SendingTextures = new Dictionary(); + this.textureList = new LLUUID[5]; + Console.WriteLine("Creating Asset cache"); + this._assetServer = this.LoadAssetDll(assetServerDLLName); + this._assetServer.SetServerInfo(assetServerURL, assetServerKey); + this._assetServer.SetReceiver(this); + this.Assets = new Dictionary(); + this.Textures = new Dictionary(); + this._assetCacheThread = new Thread(new ThreadStart(this.RunAssetManager)); + this._assetCacheThread.IsBackground = true; + this._assetCacheThread.Start(); + } + + public void AddAsset(AssetBase asset) + { + if (asset.Type == 0) + { + if (!this.Textures.ContainsKey(asset.FullID)) + { + TextureImage image = new TextureImage(asset); + this.Textures.Add(image.FullID, image); + this._assetServer.UploadNewAsset(asset); + } + } + else if (!this.Assets.ContainsKey(asset.FullID)) + { + AssetInfo info = new AssetInfo(asset); + this.Assets.Add(info.FullID, info); + this._assetServer.UploadNewAsset(asset); + } + } + + public void AddAssetRequest(IClientAPI userInfo, TransferRequestPacket transferRequest) + { + LLUUID assetID = new LLUUID(transferRequest.TransferInfo.Params, 0); + if (!this.Assets.ContainsKey(assetID)) + { + if (!this.RequestedAssets.ContainsKey(assetID)) + { + AssetRequest request = new AssetRequest(); + request.RequestUser = userInfo; + request.RequestAssetID = assetID; + request.TransferRequestID = transferRequest.TransferInfo.TransferID; + this.RequestedAssets.Add(assetID, request); + this._assetServer.RequestAsset(assetID, false); + } + } + else + { + AssetInfo info = this.Assets[assetID]; + AssetRequest request2 = new AssetRequest(); + request2.RequestUser = userInfo; + request2.RequestAssetID = assetID; + request2.TransferRequestID = transferRequest.TransferInfo.TransferID; + request2.AssetInf = info; + if (info.Data.LongLength > 600) + { + request2.NumPackets = 1 + (((info.Data.Length - 600) + 0x3e7) / 0x3e8); + } + else + { + request2.NumPackets = 1; + } + this.AssetRequests.Add(request2); + } + } + + public void AddTextureRequest(IClientAPI userInfo, LLUUID imageID) + { + if (!this.Textures.ContainsKey(imageID)) + { + if (!this.RequestedTextures.ContainsKey(imageID)) + { + AssetRequest request = new AssetRequest(); + request.RequestUser = userInfo; + request.RequestAssetID = imageID; + request.IsTextureRequest = true; + this.RequestedTextures.Add(imageID, request); + this._assetServer.RequestAsset(imageID, true); + } + } + else + { + TextureImage image = this.Textures[imageID]; + AssetRequest request2 = new AssetRequest(); + request2.RequestUser = userInfo; + request2.RequestAssetID = imageID; + request2.IsTextureRequest = true; + request2.ImageInfo = image; + if (image.Data.LongLength > 600) + { + request2.NumPackets = 1 + (((image.Data.Length - 600) + 0x3e7) / 0x3e8); + } + else + { + request2.NumPackets = 1; + } + this.TextureRequests.Add(request2); + } + } + + public void AssetNotFound(AssetBase asset) + { + } + + public void AssetReceived(AssetBase asset, bool IsTexture) + { + if (asset.FullID != LLUUID.Zero) + { + if (IsTexture) + { + TextureImage image = new TextureImage(asset); + this.Textures.Add(image.FullID, image); + if (this.RequestedTextures.ContainsKey(image.FullID)) + { + AssetRequest request = this.RequestedTextures[image.FullID]; + request.ImageInfo = image; + if (image.Data.LongLength > 600) + { + request.NumPackets = 1 + (((image.Data.Length - 600) + 0x3e7) / 0x3e8); + } + else + { + request.NumPackets = 1; + } + this.RequestedTextures.Remove(image.FullID); + this.TextureRequests.Add(request); + } + } + else + { + AssetInfo info = new AssetInfo(asset); + this.Assets.Add(info.FullID, info); + if (this.RequestedAssets.ContainsKey(info.FullID)) + { + AssetRequest request2 = this.RequestedAssets[info.FullID]; + request2.AssetInf = info; + if (info.Data.LongLength > 600) + { + request2.NumPackets = 1 + (((info.Data.Length - 600) + 0x3e7) / 0x3e8); + } + else + { + request2.NumPackets = 1; + } + this.RequestedAssets.Remove(info.FullID); + this.AssetRequests.Add(request2); + } + } + } + } + + public AssetInfo CloneAsset(LLUUID newOwner, AssetInfo sourceAsset) + { + AssetInfo info = new AssetInfo(); + info.Data = new byte[sourceAsset.Data.Length]; + Array.Copy(sourceAsset.Data, info.Data, sourceAsset.Data.Length); + info.FullID = LLUUID.Random(); + info.Type = sourceAsset.Type; + info.InvType = sourceAsset.InvType; + return info; + } + + public TextureImage CloneImage(LLUUID newOwner, TextureImage source) + { + TextureImage image = new TextureImage(); + image.Data = new byte[source.Data.Length]; + Array.Copy(source.Data, image.Data, source.Data.Length); + image.FullID = LLUUID.Random(); + image.Name = source.Name; + return image; + } + + public AssetBase[] CreateNewInventorySet(LLUUID agentID) + { + AssetBase[] baseArray = new AssetBase[this.textureList.Length]; + for (int i = 0; i < this.textureList.Length; i++) + { + if (this.Textures.ContainsKey(this.textureList[i])) + { + baseArray[i] = this.CloneImage(agentID, this.Textures[this.textureList[i]]); + TextureImage asset = new TextureImage(baseArray[i]); + this.Textures.Add(asset.FullID, asset); + this._assetServer.UploadNewAsset(asset); + } + } + return baseArray; + } + + public AssetBase GetAsset(LLUUID assetID) + { + AssetBase base2 = null; + if (this.Textures.ContainsKey(assetID)) + { + return this.Textures[assetID]; + } + if (this.Assets.ContainsKey(assetID)) + { + base2 = this.Assets[assetID]; + } + return base2; + } + + private IAssetServer LoadAssetDll(string dllName) + { + Assembly assembly = Assembly.LoadFrom(dllName); + IAssetServer assetServer = null; + foreach (Type type in assembly.GetTypes()) + { + if (type.IsPublic && !type.IsAbstract) + { + if (type.GetInterface("IAssetPlugin", true) != null) + { + assetServer = ((IAssetPlugin)Activator.CreateInstance(assembly.GetType(type.ToString()))).GetAssetServer(); + break; + } + } + } + assembly = null; + return assetServer; + } + + public void LoadDefaultTextureSet() + { + this.textureList[0] = new LLUUID("00000000-0000-0000-9999-000000000001"); + this.textureList[1] = new LLUUID("00000000-0000-0000-9999-000000000002"); + this.textureList[2] = new LLUUID("00000000-0000-0000-9999-000000000003"); + this.textureList[3] = new LLUUID("00000000-0000-0000-9999-000000000004"); + this.textureList[4] = new LLUUID("00000000-0000-0000-9999-000000000005"); + for (int i = 0; i < this.textureList.Length; i++) + { + this._assetServer.RequestAsset(this.textureList[i], true); + } + } + + private void ProcessAssetQueue() + { + if (this.AssetRequests.Count != 0) + { + int num; + if (this.AssetRequests.Count < 5) + { + num = this.AssetRequests.Count; + } + else + { + num = 5; + } + for (int i = 0; i < num; i++) + { + AssetRequest request = this.AssetRequests[i]; + TransferInfoPacket newPack = new TransferInfoPacket(); + newPack.TransferInfo.ChannelType = 2; + newPack.TransferInfo.Status = 0; + newPack.TransferInfo.TargetType = 0; + newPack.TransferInfo.Params = request.RequestAssetID.GetBytes(); + newPack.TransferInfo.Size = request.AssetInf.Data.Length; + newPack.TransferInfo.TransferID = request.TransferRequestID; + request.RequestUser.OutPacket(newPack); + if (request.NumPackets == 1) + { + TransferPacketPacket packet2 = new TransferPacketPacket(); + packet2.TransferData.Packet = 0; + packet2.TransferData.ChannelType = 2; + packet2.TransferData.TransferID = request.TransferRequestID; + packet2.TransferData.Data = request.AssetInf.Data; + packet2.TransferData.Status = 1; + request.RequestUser.OutPacket(packet2); + } + else + { + TransferPacketPacket packet3 = new TransferPacketPacket(); + packet3.TransferData.Packet = 0; + packet3.TransferData.ChannelType = 2; + packet3.TransferData.TransferID = request.TransferRequestID; + byte[] destinationArray = new byte[0x3e8]; + Array.Copy(request.AssetInf.Data, destinationArray, 0x3e8); + packet3.TransferData.Data = destinationArray; + packet3.TransferData.Status = 0; + request.RequestUser.OutPacket(packet3); + packet3 = new TransferPacketPacket(); + packet3.TransferData.Packet = 1; + packet3.TransferData.ChannelType = 2; + packet3.TransferData.TransferID = request.TransferRequestID; + byte[] buffer2 = new byte[request.AssetInf.Data.Length - 0x3e8]; + Array.Copy(request.AssetInf.Data, 0x3e8, buffer2, 0, buffer2.Length); + packet3.TransferData.Data = buffer2; + packet3.TransferData.Status = 1; + request.RequestUser.OutPacket(packet3); + } + } + for (int j = 0; j < num; j++) + { + this.AssetRequests.RemoveAt(0); + } + } + } + + private void ProcessTextureQueue() + { + if (this.TextureRequests.Count != 0) + { + int num = this.TextureRequests.Count; + for (int i = 0; i < num; i++) + { + AssetRequest req = this.TextureRequests[i]; + if (!this.SendingTextures.ContainsKey(req.ImageInfo.FullID)) + { + TextureSender sender = new TextureSender(req); + sender.OnComplete += new DownloadComplete(this.TextureSent); + lock (this.SendingTextures) + { + this.SendingTextures.Add(req.ImageInfo.FullID, sender); + } + } + } + this.TextureRequests.Clear(); + } + } + + public void RunAssetManager() + { + Label_0000: + try + { + this.ProcessAssetQueue(); + this.ProcessTextureQueue(); + Thread.Sleep(500); + goto Label_0000; + } + catch (Exception exception) + { + Console.WriteLine(exception.Message); + goto Label_0000; + } + } + + public void TextureSent(TextureSender sender) + { + if (this.SendingTextures.ContainsKey(sender.request.ImageInfo.FullID)) + { + lock (this.SendingTextures) + { + this.SendingTextures.Remove(sender.request.ImageInfo.FullID); + } + } + } + + // Nested Types + public class AssetInfo : AssetBase + { + // Methods + public AssetInfo() + { + } + + public AssetInfo(AssetBase aBase) + { + base.Data = aBase.Data; + base.FullID = aBase.FullID; + base.Type = aBase.Type; + base.InvType = aBase.InvType; + base.Name = aBase.Name; + base.Description = aBase.Description; + } + } + + public class AssetRequest + { + // Fields + public AssetCache.AssetInfo AssetInf; + public long DataPointer; + public AssetCache.TextureImage ImageInfo; + public bool IsTextureRequest; + public int NumPackets; + public int PacketCounter; + public LLUUID RequestAssetID; + public IClientAPI RequestUser; + public LLUUID TransferRequestID; + } + + public class TextureImage : AssetBase + { + // Methods + public TextureImage() + { + } + + public TextureImage(AssetBase aBase) + { + base.Data = aBase.Data; + base.FullID = aBase.FullID; + base.Type = aBase.Type; + base.InvType = aBase.InvType; + base.Name = aBase.Name; + base.Description = aBase.Description; + } + } + + public class TextureSender + { + // Fields + private Thread m_thread; + public AssetCache.AssetRequest request; + + // Events + public event DownloadComplete OnComplete; + + // Methods + public TextureSender(AssetCache.AssetRequest req) + { + this.request = req; + this.m_thread = new Thread(new ThreadStart(this.SendTexture)); + this.m_thread.IsBackground = true; + this.m_thread.Start(); + } + + public void SendPacket() + { + AssetCache.AssetRequest request = this.request; + if (request.PacketCounter == 0) + { + if (request.NumPackets == 1) + { + ImageDataPacket newPack = new ImageDataPacket(); + newPack.ImageID.Packets = 1; + newPack.ImageID.ID = request.ImageInfo.FullID; + newPack.ImageID.Size = (uint)request.ImageInfo.Data.Length; + newPack.ImageData.Data = request.ImageInfo.Data; + newPack.ImageID.Codec = 2; + request.RequestUser.OutPacket(newPack); + request.PacketCounter++; + } + else + { + ImageDataPacket packet2 = new ImageDataPacket(); + packet2.ImageID.Packets = (ushort)request.NumPackets; + packet2.ImageID.ID = request.ImageInfo.FullID; + packet2.ImageID.Size = (uint)request.ImageInfo.Data.Length; + packet2.ImageData.Data = new byte[600]; + Array.Copy(request.ImageInfo.Data, 0, packet2.ImageData.Data, 0, 600); + packet2.ImageID.Codec = 2; + request.RequestUser.OutPacket(packet2); + request.PacketCounter++; + } + } + else + { + ImagePacketPacket packet3 = new ImagePacketPacket(); + packet3.ImageID.Packet = (ushort)request.PacketCounter; + packet3.ImageID.ID = request.ImageInfo.FullID; + int length = (request.ImageInfo.Data.Length - 600) - (0x3e8 * (request.PacketCounter - 1)); + if (length > 0x3e8) + { + length = 0x3e8; + } + packet3.ImageData.Data = new byte[length]; + Array.Copy(request.ImageInfo.Data, 600 + (0x3e8 * (request.PacketCounter - 1)), packet3.ImageData.Data, 0, length); + request.RequestUser.OutPacket(packet3); + request.PacketCounter++; + } + } + + public void SendTexture() + { + while (this.request.PacketCounter != this.request.NumPackets) + { + this.SendPacket(); + Thread.Sleep(500); + } + if (this.OnComplete != null) + { + this.OnComplete(this); + } + } + } + } +} diff --git a/OpenSim/Framework/Communications/Cache/AssetTransactionManager.cs b/OpenSim/Framework/Communications/Cache/AssetTransactionManager.cs index 8b485af..f9f814a 100644 --- a/OpenSim/Framework/Communications/Cache/AssetTransactionManager.cs +++ b/OpenSim/Framework/Communications/Cache/AssetTransactionManager.cs @@ -1,81 +1,81 @@ -/* -* Copyright (c) Contributors, http://www.openmetaverse.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Text; -using System.IO; -using libsecondlife; -using OpenSim.Framework.Interfaces; -using OpenSim.Framework.Types; -using OpenSim.Framework.Utilities; -using OpenSim.Framework.Data; - -namespace OpenSim.Framework.Communications.Caches -{ - public class AssetTransactionManager - { - // Fields - public Dictionary AgentTransactions = new Dictionary(); - - // Methods - public AgentAssetTransactions AddUser(LLUUID userID) - { - if (!this.AgentTransactions.ContainsKey(userID)) - { - AgentAssetTransactions transactions = new AgentAssetTransactions(userID); - this.AgentTransactions.Add(userID, transactions); - return transactions; - } - return null; - } - - public AgentAssetTransactions GetUserTransActions(LLUUID userID) - { - if (this.AgentTransactions.ContainsKey(userID)) - { - return this.AgentTransactions[userID]; - } - return null; - } - - public void HandleInventoryFromTransaction() - { - } - - public void HandleUDPUploadRequest() - { - } - - public void HandleXfer(IClientAPI remoteClient, uint xferID, uint packetID, byte[] data) - { - } - } -} - - +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.IO; +using libsecondlife; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; +using OpenSim.Framework.Utilities; +using OpenSim.Framework.Data; + +namespace OpenSim.Framework.Communications.Caches +{ + public class AssetTransactionManager + { + // Fields + public Dictionary AgentTransactions = new Dictionary(); + + // Methods + public AgentAssetTransactions AddUser(LLUUID userID) + { + if (!this.AgentTransactions.ContainsKey(userID)) + { + AgentAssetTransactions transactions = new AgentAssetTransactions(userID); + this.AgentTransactions.Add(userID, transactions); + return transactions; + } + return null; + } + + public AgentAssetTransactions GetUserTransActions(LLUUID userID) + { + if (this.AgentTransactions.ContainsKey(userID)) + { + return this.AgentTransactions[userID]; + } + return null; + } + + public void HandleInventoryFromTransaction() + { + } + + public void HandleUDPUploadRequest() + { + } + + public void HandleXfer(IClientAPI remoteClient, uint xferID, uint packetID, byte[] data) + { + } + } +} + + diff --git a/OpenSim/Framework/Communications/Cache/AssetTransactions.cs b/OpenSim/Framework/Communications/Cache/AssetTransactions.cs index 6741969..c906b76 100644 --- a/OpenSim/Framework/Communications/Cache/AssetTransactions.cs +++ b/OpenSim/Framework/Communications/Cache/AssetTransactions.cs @@ -1,275 +1,275 @@ -/* -* Copyright (c) Contributors, http://www.openmetaverse.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Text; -using System.IO; -using libsecondlife; -using libsecondlife.Packets; -using OpenSim.Framework.Interfaces; -using OpenSim.Framework.Types; -using OpenSim.Framework.Utilities; -using OpenSim.Region.Capabilities; -using OpenSim.Framework.Servers; - -namespace OpenSim.Framework.Communications.Caches -{ - public class AgentAssetTransactions - { - // Fields - public List CapsUploaders = new List(); - public List NotecardUpdaters = new List(); - public LLUUID UserID; - public Dictionary XferUploaders = new Dictionary(); - - // Methods - public AgentAssetTransactions(LLUUID agentID) - { - this.UserID = agentID; - } - - public AssetCapsUploader RequestCapsUploader() - { - AssetCapsUploader uploader = new AssetCapsUploader(); - this.CapsUploaders.Add(uploader); - return uploader; - } - - public NoteCardCapsUpdate RequestNoteCardUpdater() - { - NoteCardCapsUpdate update = new NoteCardCapsUpdate(); - this.NotecardUpdaters.Add(update); - return update; - } - - public AssetXferUploader RequestXferUploader(LLUUID transactionID) - { - AssetXferUploader uploader = new AssetXferUploader(); - this.XferUploaders.Add(transactionID, uploader); - return uploader; - } - - // Nested Types - public class AssetCapsUploader - { - // Fields - private BaseHttpServer httpListener; - private LLUUID inventoryItemID; - private string m_assetDescription = ""; - private string m_assetName = ""; - private LLUUID m_folderID; - private LLUUID newAssetID; - private bool SaveImages = false; - private string uploaderPath = ""; - - // Events - public event UpLoadedTexture OnUpLoad; - - // Methods - public void Initialise(string assetName, string assetDescription, LLUUID assetID, LLUUID inventoryItem, LLUUID folderID, string path, BaseHttpServer httpServer) - { - this.m_assetName = assetName; - this.m_assetDescription = assetDescription; - this.m_folderID = folderID; - this.newAssetID = assetID; - this.inventoryItemID = inventoryItem; - this.uploaderPath = path; - this.httpListener = httpServer; - } - - private void SaveImageToFile(string filename, byte[] data) - { - FileStream output = File.Create(filename); - BinaryWriter writer = new BinaryWriter(output); - writer.Write(data); - writer.Close(); - output.Close(); - } - - public string uploaderCaps(byte[] data, string path, string param) - { - LLUUID inventoryItemID = this.inventoryItemID; - string text = ""; - LLSDAssetUploadComplete complete = new LLSDAssetUploadComplete(); - complete.new_asset = this.newAssetID.ToStringHyphenated(); - complete.new_inventory_item = inventoryItemID; - complete.state = "complete"; - text = LLSDHelpers.SerialiseLLSDReply(complete); - this.httpListener.RemoveStreamHandler("POST", this.uploaderPath); - if (this.SaveImages) - { - this.SaveImageToFile(this.m_assetName + ".jp2", data); - } - if (this.OnUpLoad != null) - { - this.OnUpLoad(this.m_assetName, this.newAssetID, inventoryItemID, data); - } - return text; - } - } - - public class AssetXferUploader - { - // Fields - public bool AddToInventory; - public AssetBase Asset; - public LLUUID InventFolder = LLUUID.Zero; - private IClientAPI ourClient; - public LLUUID TransactionID = LLUUID.Zero; - public bool UploadComplete; - public uint XferID; - - // Methods - public void HandleXferPacket(uint xferID, uint packetID, byte[] data) - { - if (this.XferID == xferID) - { - if (this.Asset.Data.Length > 1) - { - byte[] destinationArray = new byte[this.Asset.Data.Length + data.Length]; - Array.Copy(this.Asset.Data, 0, destinationArray, 0, this.Asset.Data.Length); - Array.Copy(data, 0, destinationArray, this.Asset.Data.Length, data.Length); - this.Asset.Data = destinationArray; - } - else - { - byte[] buffer2 = new byte[data.Length - 4]; - Array.Copy(data, 4, buffer2, 0, data.Length - 4); - this.Asset.Data = buffer2; - } - ConfirmXferPacketPacket newPack = new ConfirmXferPacketPacket(); - newPack.XferID.ID = xferID; - newPack.XferID.Packet = packetID; - this.ourClient.OutPacket(newPack); - if ((packetID & 0x80000000) != 0) - { - this.SendCompleteMessage(); - } - } - } - - public void Initialise(IClientAPI remoteClient, LLUUID assetID, LLUUID transaction, sbyte type, byte[] data) - { - this.ourClient = remoteClient; - this.Asset = new AssetBase(); - this.Asset.FullID = assetID; - this.Asset.InvType = type; - this.Asset.Type = type; - this.Asset.Data = data; - this.Asset.Name = "blank"; - this.Asset.Description = "empty"; - this.TransactionID = transaction; - if (this.Asset.Data.Length > 2) - { - this.SendCompleteMessage(); - } - else - { - this.ReqestStartXfer(); - } - } - - protected void ReqestStartXfer() - { - this.UploadComplete = false; - this.XferID = Util.GetNextXferID(); - RequestXferPacket newPack = new RequestXferPacket(); - newPack.XferID.ID = this.XferID; - newPack.XferID.VFileType = this.Asset.Type; - newPack.XferID.VFileID = this.Asset.FullID; - newPack.XferID.FilePath = 0; - newPack.XferID.Filename = new byte[0]; - this.ourClient.OutPacket(newPack); - } - - protected void SendCompleteMessage() - { - this.UploadComplete = true; - AssetUploadCompletePacket newPack = new AssetUploadCompletePacket(); - newPack.AssetBlock.Type = this.Asset.Type; - newPack.AssetBlock.Success = true; - newPack.AssetBlock.UUID = this.Asset.FullID; - this.ourClient.OutPacket(newPack); - } - } - - public class NoteCardCapsUpdate - { - // Fields - private BaseHttpServer httpListener; - private LLUUID inventoryItemID; - private string m_assetName = ""; - private LLUUID newAssetID; - private bool SaveImages = false; - private string uploaderPath = ""; - - // Events - public event UpLoadedTexture OnUpLoad; - - // Methods - public void Initialise(LLUUID inventoryItem, string path, BaseHttpServer httpServer) - { - this.inventoryItemID = inventoryItem; - this.uploaderPath = path; - this.httpListener = httpServer; - this.newAssetID = LLUUID.Random(); - } - - private void SaveImageToFile(string filename, byte[] data) - { - FileStream output = File.Create(filename); - BinaryWriter writer = new BinaryWriter(output); - writer.Write(data); - writer.Close(); - output.Close(); - } - - public string uploaderCaps(byte[] data, string path, string param) - { - LLUUID inventoryItemID = this.inventoryItemID; - string text = ""; - LLSDAssetUploadComplete complete = new LLSDAssetUploadComplete(); - complete.new_asset = this.newAssetID.ToStringHyphenated(); - complete.new_inventory_item = inventoryItemID; - complete.state = "complete"; - text = LLSDHelpers.SerialiseLLSDReply(complete); - this.httpListener.RemoveStreamHandler("POST", this.uploaderPath); - if (this.SaveImages) - { - this.SaveImageToFile(this.m_assetName + "notecard.txt", data); - } - if (this.OnUpLoad != null) - { - this.OnUpLoad(this.m_assetName, this.newAssetID, inventoryItemID, data); - } - return text; - } - } - } +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.IO; +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; +using OpenSim.Framework.Utilities; +using OpenSim.Region.Capabilities; +using OpenSim.Framework.Servers; + +namespace OpenSim.Framework.Communications.Caches +{ + public class AgentAssetTransactions + { + // Fields + public List CapsUploaders = new List(); + public List NotecardUpdaters = new List(); + public LLUUID UserID; + public Dictionary XferUploaders = new Dictionary(); + + // Methods + public AgentAssetTransactions(LLUUID agentID) + { + this.UserID = agentID; + } + + public AssetCapsUploader RequestCapsUploader() + { + AssetCapsUploader uploader = new AssetCapsUploader(); + this.CapsUploaders.Add(uploader); + return uploader; + } + + public NoteCardCapsUpdate RequestNoteCardUpdater() + { + NoteCardCapsUpdate update = new NoteCardCapsUpdate(); + this.NotecardUpdaters.Add(update); + return update; + } + + public AssetXferUploader RequestXferUploader(LLUUID transactionID) + { + AssetXferUploader uploader = new AssetXferUploader(); + this.XferUploaders.Add(transactionID, uploader); + return uploader; + } + + // Nested Types + public class AssetCapsUploader + { + // Fields + private BaseHttpServer httpListener; + private LLUUID inventoryItemID; + private string m_assetDescription = ""; + private string m_assetName = ""; + private LLUUID m_folderID; + private LLUUID newAssetID; + private bool SaveImages = false; + private string uploaderPath = ""; + + // Events + public event UpLoadedTexture OnUpLoad; + + // Methods + public void Initialise(string assetName, string assetDescription, LLUUID assetID, LLUUID inventoryItem, LLUUID folderID, string path, BaseHttpServer httpServer) + { + this.m_assetName = assetName; + this.m_assetDescription = assetDescription; + this.m_folderID = folderID; + this.newAssetID = assetID; + this.inventoryItemID = inventoryItem; + this.uploaderPath = path; + this.httpListener = httpServer; + } + + private void SaveImageToFile(string filename, byte[] data) + { + FileStream output = File.Create(filename); + BinaryWriter writer = new BinaryWriter(output); + writer.Write(data); + writer.Close(); + output.Close(); + } + + public string uploaderCaps(byte[] data, string path, string param) + { + LLUUID inventoryItemID = this.inventoryItemID; + string text = ""; + LLSDAssetUploadComplete complete = new LLSDAssetUploadComplete(); + complete.new_asset = this.newAssetID.ToStringHyphenated(); + complete.new_inventory_item = inventoryItemID; + complete.state = "complete"; + text = LLSDHelpers.SerialiseLLSDReply(complete); + this.httpListener.RemoveStreamHandler("POST", this.uploaderPath); + if (this.SaveImages) + { + this.SaveImageToFile(this.m_assetName + ".jp2", data); + } + if (this.OnUpLoad != null) + { + this.OnUpLoad(this.m_assetName, this.newAssetID, inventoryItemID, data); + } + return text; + } + } + + public class AssetXferUploader + { + // Fields + public bool AddToInventory; + public AssetBase Asset; + public LLUUID InventFolder = LLUUID.Zero; + private IClientAPI ourClient; + public LLUUID TransactionID = LLUUID.Zero; + public bool UploadComplete; + public uint XferID; + + // Methods + public void HandleXferPacket(uint xferID, uint packetID, byte[] data) + { + if (this.XferID == xferID) + { + if (this.Asset.Data.Length > 1) + { + byte[] destinationArray = new byte[this.Asset.Data.Length + data.Length]; + Array.Copy(this.Asset.Data, 0, destinationArray, 0, this.Asset.Data.Length); + Array.Copy(data, 0, destinationArray, this.Asset.Data.Length, data.Length); + this.Asset.Data = destinationArray; + } + else + { + byte[] buffer2 = new byte[data.Length - 4]; + Array.Copy(data, 4, buffer2, 0, data.Length - 4); + this.Asset.Data = buffer2; + } + ConfirmXferPacketPacket newPack = new ConfirmXferPacketPacket(); + newPack.XferID.ID = xferID; + newPack.XferID.Packet = packetID; + this.ourClient.OutPacket(newPack); + if ((packetID & 0x80000000) != 0) + { + this.SendCompleteMessage(); + } + } + } + + public void Initialise(IClientAPI remoteClient, LLUUID assetID, LLUUID transaction, sbyte type, byte[] data) + { + this.ourClient = remoteClient; + this.Asset = new AssetBase(); + this.Asset.FullID = assetID; + this.Asset.InvType = type; + this.Asset.Type = type; + this.Asset.Data = data; + this.Asset.Name = "blank"; + this.Asset.Description = "empty"; + this.TransactionID = transaction; + if (this.Asset.Data.Length > 2) + { + this.SendCompleteMessage(); + } + else + { + this.ReqestStartXfer(); + } + } + + protected void ReqestStartXfer() + { + this.UploadComplete = false; + this.XferID = Util.GetNextXferID(); + RequestXferPacket newPack = new RequestXferPacket(); + newPack.XferID.ID = this.XferID; + newPack.XferID.VFileType = this.Asset.Type; + newPack.XferID.VFileID = this.Asset.FullID; + newPack.XferID.FilePath = 0; + newPack.XferID.Filename = new byte[0]; + this.ourClient.OutPacket(newPack); + } + + protected void SendCompleteMessage() + { + this.UploadComplete = true; + AssetUploadCompletePacket newPack = new AssetUploadCompletePacket(); + newPack.AssetBlock.Type = this.Asset.Type; + newPack.AssetBlock.Success = true; + newPack.AssetBlock.UUID = this.Asset.FullID; + this.ourClient.OutPacket(newPack); + } + } + + public class NoteCardCapsUpdate + { + // Fields + private BaseHttpServer httpListener; + private LLUUID inventoryItemID; + private string m_assetName = ""; + private LLUUID newAssetID; + private bool SaveImages = false; + private string uploaderPath = ""; + + // Events + public event UpLoadedTexture OnUpLoad; + + // Methods + public void Initialise(LLUUID inventoryItem, string path, BaseHttpServer httpServer) + { + this.inventoryItemID = inventoryItem; + this.uploaderPath = path; + this.httpListener = httpServer; + this.newAssetID = LLUUID.Random(); + } + + private void SaveImageToFile(string filename, byte[] data) + { + FileStream output = File.Create(filename); + BinaryWriter writer = new BinaryWriter(output); + writer.Write(data); + writer.Close(); + output.Close(); + } + + public string uploaderCaps(byte[] data, string path, string param) + { + LLUUID inventoryItemID = this.inventoryItemID; + string text = ""; + LLSDAssetUploadComplete complete = new LLSDAssetUploadComplete(); + complete.new_asset = this.newAssetID.ToStringHyphenated(); + complete.new_inventory_item = inventoryItemID; + complete.state = "complete"; + text = LLSDHelpers.SerialiseLLSDReply(complete); + this.httpListener.RemoveStreamHandler("POST", this.uploaderPath); + if (this.SaveImages) + { + this.SaveImageToFile(this.m_assetName + "notecard.txt", data); + } + if (this.OnUpLoad != null) + { + this.OnUpLoad(this.m_assetName, this.newAssetID, inventoryItemID, data); + } + return text; + } + } + } } \ No newline at end of file diff --git a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs index 2660df3..d850305 100644 --- a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs +++ b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs @@ -1,94 +1,94 @@ -/* -* Copyright (c) Contributors, http://www.openmetaverse.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Text; -using System.IO; -using libsecondlife; -using OpenSim.Framework.Interfaces; -using OpenSim.Framework.Types; -using OpenSim.Framework.Data; -using OpenSim.Framework.Utilities; - -namespace OpenSim.Framework.Communications.Caches -{ - public class CachedUserInfo - { - // Fields - public InventoryFolder RootFolder; - public UserProfileData UserProfile; - - // Methods - public void FolderReceive(LLUUID userID, InventoryFolder folderInfo) - { - if (userID == this.UserProfile.UUID) - { - if (this.RootFolder == null) - { - if (folderInfo.parentID == LLUUID.Zero) - { - this.RootFolder = folderInfo; - } - } - else if (this.RootFolder.folderID == folderInfo.parentID) - { - this.RootFolder.SubFolders.Add(folderInfo.folderID, folderInfo); - } - else - { - InventoryFolder folder = this.RootFolder.HasSubFolder(folderInfo.parentID); - if (folder != null) - { - folder.SubFolders.Add(folderInfo.folderID, folderInfo); - } - } - } - } - - public void ItemReceive(LLUUID userID, InventoryItemBase itemInfo) - { - if ((userID == this.UserProfile.UUID) && (this.RootFolder != null)) - { - if (itemInfo.parentFolderID == this.RootFolder.folderID) - { - this.RootFolder.Items.Add(itemInfo.inventoryID, itemInfo); - } - else - { - InventoryFolder folder = this.RootFolder.HasSubFolder(itemInfo.parentFolderID); - if (folder != null) - { - folder.Items.Add(itemInfo.inventoryID, itemInfo); - } - } - } - } - } -} - +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.IO; +using libsecondlife; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; +using OpenSim.Framework.Data; +using OpenSim.Framework.Utilities; + +namespace OpenSim.Framework.Communications.Caches +{ + public class CachedUserInfo + { + // Fields + public InventoryFolder RootFolder; + public UserProfileData UserProfile; + + // Methods + public void FolderReceive(LLUUID userID, InventoryFolder folderInfo) + { + if (userID == this.UserProfile.UUID) + { + if (this.RootFolder == null) + { + if (folderInfo.parentID == LLUUID.Zero) + { + this.RootFolder = folderInfo; + } + } + else if (this.RootFolder.folderID == folderInfo.parentID) + { + this.RootFolder.SubFolders.Add(folderInfo.folderID, folderInfo); + } + else + { + InventoryFolder folder = this.RootFolder.HasSubFolder(folderInfo.parentID); + if (folder != null) + { + folder.SubFolders.Add(folderInfo.folderID, folderInfo); + } + } + } + } + + public void ItemReceive(LLUUID userID, InventoryItemBase itemInfo) + { + if ((userID == this.UserProfile.UUID) && (this.RootFolder != null)) + { + if (itemInfo.parentFolderID == this.RootFolder.folderID) + { + this.RootFolder.Items.Add(itemInfo.inventoryID, itemInfo); + } + else + { + InventoryFolder folder = this.RootFolder.HasSubFolder(itemInfo.parentFolderID); + if (folder != null) + { + folder.Items.Add(itemInfo.inventoryID, itemInfo); + } + } + } + } + } +} + diff --git a/OpenSim/Framework/Communications/Cache/InventoryFolder.cs b/OpenSim/Framework/Communications/Cache/InventoryFolder.cs index 8670eb0..300a6e3 100644 --- a/OpenSim/Framework/Communications/Cache/InventoryFolder.cs +++ b/OpenSim/Framework/Communications/Cache/InventoryFolder.cs @@ -1,109 +1,109 @@ -/* -* Copyright (c) Contributors, http://www.openmetaverse.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Text; -using System.IO; -using libsecondlife; -using OpenSim.Framework.Interfaces; -using OpenSim.Framework.Data; -using OpenSim.Framework.Types; -using OpenSim.Framework.Utilities; - -namespace OpenSim.Framework.Communications.Caches -{ - public class InventoryFolder : InventoryFolderBase - { - // Fields - public Dictionary Items = new Dictionary(); - public Dictionary SubFolders = new Dictionary(); - - // Methods - public InventoryFolder CreateNewSubFolder(LLUUID folderID, string folderName, ushort type) - { - InventoryFolder subFold = new InventoryFolder(); - subFold.name = folderName; - subFold.folderID = folderID; - subFold.type = type; - subFold.parentID = this.folderID; - subFold.agentID = this.agentID; - this.SubFolders.Add(subFold.folderID, subFold); - return subFold; - } - - public InventoryItemBase HasItem(LLUUID itemID) - { - InventoryItemBase base2 = null; - if (this.Items.ContainsKey(itemID)) - { - return this.Items[itemID]; - } - foreach (InventoryFolder folder in this.SubFolders.Values) - { - base2 = folder.HasItem(itemID); - if (base2 != null) - { - break; - } - } - return base2; - } - - public InventoryFolder HasSubFolder(LLUUID folderID) - { - InventoryFolder returnFolder = null; - if (this.SubFolders.ContainsKey(folderID)) - { - returnFolder = this.SubFolders[folderID]; - } - else - { - foreach (InventoryFolder folder in this.SubFolders.Values) - { - returnFolder = folder.HasSubFolder(folderID); - if (returnFolder != null) - { - break; - } - } - } - return returnFolder; - } - - public List RequestListOfItems() - { - List itemList = new List(); - foreach (InventoryItemBase item in this.Items.Values) - { - itemList.Add(item); - } - return itemList; - } - } -} +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.IO; +using libsecondlife; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Data; +using OpenSim.Framework.Types; +using OpenSim.Framework.Utilities; + +namespace OpenSim.Framework.Communications.Caches +{ + public class InventoryFolder : InventoryFolderBase + { + // Fields + public Dictionary Items = new Dictionary(); + public Dictionary SubFolders = new Dictionary(); + + // Methods + public InventoryFolder CreateNewSubFolder(LLUUID folderID, string folderName, ushort type) + { + InventoryFolder subFold = new InventoryFolder(); + subFold.name = folderName; + subFold.folderID = folderID; + subFold.type = (short) type; + subFold.parentID = this.folderID; + subFold.agentID = this.agentID; + this.SubFolders.Add(subFold.folderID, subFold); + return subFold; + } + + public InventoryItemBase HasItem(LLUUID itemID) + { + InventoryItemBase base2 = null; + if (this.Items.ContainsKey(itemID)) + { + return this.Items[itemID]; + } + foreach (InventoryFolder folder in this.SubFolders.Values) + { + base2 = folder.HasItem(itemID); + if (base2 != null) + { + break; + } + } + return base2; + } + + public InventoryFolder HasSubFolder(LLUUID folderID) + { + InventoryFolder returnFolder = null; + if (this.SubFolders.ContainsKey(folderID)) + { + returnFolder = this.SubFolders[folderID]; + } + else + { + foreach (InventoryFolder folder in this.SubFolders.Values) + { + returnFolder = folder.HasSubFolder(folderID); + if (returnFolder != null) + { + break; + } + } + } + return returnFolder; + } + + public List RequestListOfItems() + { + List itemList = new List(); + foreach (InventoryItemBase item in this.Items.Values) + { + itemList.Add(item); + } + return itemList; + } + } +} diff --git a/OpenSim/Framework/Communications/Cache/LibraryRootFolder.cs b/OpenSim/Framework/Communications/Cache/LibraryRootFolder.cs new file mode 100644 index 0000000..2608145 --- /dev/null +++ b/OpenSim/Framework/Communications/Cache/LibraryRootFolder.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.Text; +using libsecondlife; +using OpenSim.Framework.Data; + +namespace OpenSim.Framework.Communications.Caches +{ + public class LibraryRootFolder : InventoryFolder + { + private LLUUID libOwner = new LLUUID("11111111-1111-0000-0000-000100bba000"); + + public LibraryRootFolder() + { + this.agentID = libOwner; + this.folderID = new LLUUID("00000112-000f-0000-0000-000100bba000"); + this.name = "OpenSim Library"; + this.parentID = LLUUID.Zero; + this.type = (short)-1; + this.version = (ushort) 1; + + InventoryItemBase item = new InventoryItemBase(); + item.avatarID = libOwner; + item.creatorsID = libOwner; + item.inventoryID = LLUUID.Random(); + item.assetID = new LLUUID("00000000-0000-0000-9999-000000000002"); + item.inventoryDescription = "Plywood texture"; + item.inventoryName = "Plywood"; + item.type =0; + item.parentFolderID = this.folderID; + item.inventoryCurrentPermissions = 2147483647; + item.inventoryNextPermissions = 2147483647; + this.Items.Add(item.inventoryID, item); + + item = new InventoryItemBase(); + item.avatarID = libOwner; + item.creatorsID = libOwner; + item.inventoryID = LLUUID.Random(); + item.assetID = new LLUUID("00000000-0000-0000-9999-000000000003"); + item.inventoryDescription = "Rocks texture"; + item.inventoryName = "Rocks"; + item.type = 0; + item.parentFolderID = this.folderID; + item.inventoryCurrentPermissions = 2147483647; + item.inventoryNextPermissions = 2147483647; + this.Items.Add(item.inventoryID, item); + + item = new InventoryItemBase(); + item.avatarID = libOwner; + item.creatorsID = libOwner; + item.inventoryID = LLUUID.Random(); + item.assetID = new LLUUID("00000000-0000-0000-9999-000000000001"); + item.inventoryDescription = "Bricks texture"; + item.inventoryName = "Bricks"; + item.type = 0; + item.parentFolderID = this.folderID; + item.inventoryCurrentPermissions = 2147483647; + item.inventoryNextPermissions = 2147483647; + this.Items.Add(item.inventoryID, item); + + item = new InventoryItemBase(); + item.avatarID = libOwner; + item.creatorsID = libOwner; + item.inventoryID = LLUUID.Random(); + item.assetID = new LLUUID("00000000-0000-0000-9999-000000000004"); + item.inventoryDescription = "Granite texture"; + item.inventoryName = "Granite"; + item.type = 0; + item.parentFolderID = this.folderID; + item.inventoryCurrentPermissions = 2147483647; + item.inventoryNextPermissions = 2147483647; + this.Items.Add(item.inventoryID, item); + + item = new InventoryItemBase(); + item.avatarID = libOwner; + item.creatorsID = libOwner; + item.inventoryID = LLUUID.Random(); + item.assetID = new LLUUID("00000000-0000-0000-9999-000000000005"); + item.inventoryDescription = "Hardwood texture"; + item.inventoryName = "Hardwood"; + item.type = 0; + item.parentFolderID = this.folderID; + item.inventoryCurrentPermissions = 2147483647; + item.inventoryNextPermissions = 2147483647; + this.Items.Add(item.inventoryID, item); + } + + } +} diff --git a/OpenSim/Framework/Communications/Cache/UserProfileCache.cs b/OpenSim/Framework/Communications/Cache/UserProfileCache.cs index 8210702..7b4f6a5 100644 --- a/OpenSim/Framework/Communications/Cache/UserProfileCache.cs +++ b/OpenSim/Framework/Communications/Cache/UserProfileCache.cs @@ -1,170 +1,216 @@ -/* -* Copyright (c) Contributors, http://www.openmetaverse.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Text; -using System.IO; -using libsecondlife; -using OpenSim.Framework.Interfaces; -using OpenSim.Framework.Types; -using OpenSim.Framework.Utilities; -using OpenSim.Framework.Data; - -namespace OpenSim.Framework.Communications.Caches -{ - - public class UserProfileCache - { - // Fields - private CommunicationsManager m_parent; - public Dictionary UserProfiles = new Dictionary(); - - // Methods - public UserProfileCache(CommunicationsManager parent) - { - this.m_parent = parent; - } - - public void AddNewUser(LLUUID userID) - { - if (!this.UserProfiles.ContainsKey(userID)) - { - CachedUserInfo userInfo = new CachedUserInfo(); - userInfo.UserProfile = this.RequestUserProfileForUser(userID); - if (userInfo.UserProfile != null) - { - this.RequestInventoryForUser(userID, userInfo); - this.UserProfiles.Add(userID, userInfo); - } - else - { - Console.WriteLine("UserProfileCache.cs: user profile for user not found"); - } - } - } - - public void AddNewUser(string firstName, string lastName) - { - } - - public CachedUserInfo GetUserDetails(LLUUID userID) - { - if (this.UserProfiles.ContainsKey(userID)) - { - return this.UserProfiles[userID]; - } - return null; - } - - public void HandleCreateInventoryFolder(IClientAPI remoteClient, LLUUID folderID, ushort folderType, string folderName, LLUUID parentID) - { - if (this.UserProfiles.ContainsKey(remoteClient.AgentId)) - { - CachedUserInfo info = this.UserProfiles[remoteClient.AgentId]; - if (info.RootFolder.folderID == parentID) - { - info.RootFolder.CreateNewSubFolder(folderID, folderName, folderType); - } - else - { - InventoryFolder folder = info.RootFolder.HasSubFolder(parentID); - if (folder != null) - { - folder.CreateNewSubFolder(folderID, folderName, folderType); - } - } - } - } - - public void HandleFecthInventoryDescendents(IClientAPI remoteClient, LLUUID folderID, LLUUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder) - { - if (this.UserProfiles.ContainsKey(remoteClient.AgentId)) - { - CachedUserInfo info = this.UserProfiles[remoteClient.AgentId]; - if (info.RootFolder.folderID == folderID) - { - if (fetchItems) - { - remoteClient.SendInventoryFolderDetails(remoteClient.AgentId, folderID, info.RootFolder.RequestListOfItems()); - } - } - else - { - InventoryFolder folder = info.RootFolder.HasSubFolder(folderID); - if ((folder != null) && fetchItems) - { - remoteClient.SendInventoryFolderDetails(remoteClient.AgentId, folderID, folder.RequestListOfItems()); - } - } - } - } - - public void HandleFetchInventory(IClientAPI remoteClient, LLUUID itemID, LLUUID ownerID) - { - if (this.UserProfiles.ContainsKey(remoteClient.AgentId)) - { - InventoryItemBase item = this.UserProfiles[remoteClient.AgentId].RootFolder.HasItem(itemID); - if (item != null) - { - remoteClient.SendInventoryItemDetails(ownerID, item); - } - } - } - - private void RequestInventoryForUser(LLUUID userID, CachedUserInfo userInfo) - { - InventoryFolder folderInfo = new InventoryFolder(); - folderInfo.agentID = userID; - folderInfo.folderID = userInfo.UserProfile.rootInventoryFolderID; - folderInfo.name = "My Inventory"; - folderInfo.parentID = LLUUID.Zero; - folderInfo.type = 8; - folderInfo.version = 1; - userInfo.FolderReceive(userID, folderInfo); - } - - private UserProfileData RequestUserProfileForUser(LLUUID userID) - { - return this.m_parent.UserServer.GetUserProfile(userID); - } - - private void UpdateInventoryToServer(LLUUID userID) - { - } - - private void UpdateUserProfileToServer(LLUUID userID) - { - } - - public void UserLogOut(LLUUID userID) - { - } - } -} - +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.IO; +using libsecondlife; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; +using OpenSim.Framework.Utilities; +using OpenSim.Framework.Data; + +namespace OpenSim.Framework.Communications.Caches +{ + public class UserProfileCache + { + // Fields + private CommunicationsManager m_parent; + public Dictionary UserProfiles = new Dictionary(); + + public LibraryRootFolder libraryRoot = new LibraryRootFolder(); + + // Methods + public UserProfileCache(CommunicationsManager parent) + { + this.m_parent = parent; + } + + /// + /// A new user has moved into a region in this instance + /// so get info from servers + /// + /// + public void AddNewUser(LLUUID userID) + { + if (!this.UserProfiles.ContainsKey(userID)) + { + CachedUserInfo userInfo = new CachedUserInfo(); + userInfo.UserProfile = this.RequestUserProfileForUser(userID); + if (userInfo.UserProfile != null) + { + this.RequestInventoryForUser(userID, userInfo); + this.UserProfiles.Add(userID, userInfo); + } + else + { + Console.WriteLine("UserProfileCache.cs: user profile for user not found"); + } + } + } + + /// + /// A new user has moved into a region in this instance + /// so get info from servers + /// + /// + /// + public void AddNewUser(string firstName, string lastName) + { + } + + public CachedUserInfo GetUserDetails(LLUUID userID) + { + if (this.UserProfiles.ContainsKey(userID)) + { + return this.UserProfiles[userID]; + } + return null; + } + + public void HandleCreateInventoryFolder(IClientAPI remoteClient, LLUUID folderID, ushort folderType, string folderName, LLUUID parentID) + { + if (this.UserProfiles.ContainsKey(remoteClient.AgentId)) + { + CachedUserInfo info = this.UserProfiles[remoteClient.AgentId]; + if (info.RootFolder.folderID == parentID) + { + info.RootFolder.CreateNewSubFolder(folderID, folderName, folderType); + } + else + { + InventoryFolder folder = info.RootFolder.HasSubFolder(parentID); + if (folder != null) + { + folder.CreateNewSubFolder(folderID, folderName, folderType); + } + } + } + } + + public void HandleFecthInventoryDescendents(IClientAPI remoteClient, LLUUID folderID, LLUUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder) + { + if (folderID == libraryRoot.folderID ) + { + remoteClient.SendInventoryFolderDetails(libraryRoot.agentID, libraryRoot.folderID, libraryRoot.RequestListOfItems()); + } + else if (this.UserProfiles.ContainsKey(remoteClient.AgentId)) + { + CachedUserInfo info = this.UserProfiles[remoteClient.AgentId]; + if (info.RootFolder.folderID == folderID) + { + if (fetchItems) + { + remoteClient.SendInventoryFolderDetails(remoteClient.AgentId, folderID, info.RootFolder.RequestListOfItems()); + } + } + else + { + InventoryFolder folder = info.RootFolder.HasSubFolder(folderID); + if ((folder != null) && fetchItems) + { + remoteClient.SendInventoryFolderDetails(remoteClient.AgentId, folderID, folder.RequestListOfItems()); + } + } + } + } + + public void HandleFetchInventory(IClientAPI remoteClient, LLUUID itemID, LLUUID ownerID) + { + if (ownerID == libraryRoot.agentID) + { + //Console.WriteLine("request info for library item"); + } + else if (this.UserProfiles.ContainsKey(remoteClient.AgentId)) + { + InventoryItemBase item = this.UserProfiles[remoteClient.AgentId].RootFolder.HasItem(itemID); + if (item != null) + { + remoteClient.SendInventoryItemDetails(ownerID, item); + } + } + } + + /// + /// Request Iventory Info from Inventory server + /// + /// + private void RequestInventoryForUser(LLUUID userID, CachedUserInfo userInfo) + { + // this.m_parent.InventoryServer.RequestInventoryForUser(userID, userInfo.FolderReceive, userInfo.ItemReceive); + + //for now we manually create the root folder, + // but should be requesting all inventory from inventory server. + InventoryFolder folderInfo = new InventoryFolder(); + folderInfo.agentID = userID; + folderInfo.folderID = userInfo.UserProfile.rootInventoryFolderID; + folderInfo.name = "My Inventory"; + folderInfo.parentID = LLUUID.Zero; + folderInfo.type = 8; + folderInfo.version = 1; + userInfo.FolderReceive(userID, folderInfo); + } + + /// + /// Request the user profile from User server + /// + /// + private UserProfileData RequestUserProfileForUser(LLUUID userID) + { + return this.m_parent.UserServer.GetUserProfile(userID); + } + + /// + /// Update Inventory data to Inventory server + /// + /// + private void UpdateInventoryToServer(LLUUID userID) + { + } + + /// + /// Make sure UserProfile is updated on user server + /// + /// + private void UpdateUserProfileToServer(LLUUID userID) + { + } + + /// + /// A user has left this instance + /// so make sure servers have been updated + /// Then remove cached info + /// + /// + public void UserLogOut(LLUUID userID) + { + } + } +} + diff --git a/OpenSim/Framework/Communications/CommunicationsManager.cs b/OpenSim/Framework/Communications/CommunicationsManager.cs index e220e17..ac882ba 100644 --- a/OpenSim/Framework/Communications/CommunicationsManager.cs +++ b/OpenSim/Framework/Communications/CommunicationsManager.cs @@ -44,7 +44,7 @@ namespace OpenSim.Framework.Communications public IGridServices GridServer; public IInventoryServices InventoryServer; public IInterRegionCommunications InterRegion; - public UserProfileCache UserProfilesCache; + public UserProfileCache UserProfiles; public AssetCache AssetCache; public NetworkServersInfo ServersInfo; @@ -52,21 +52,28 @@ namespace OpenSim.Framework.Communications { ServersInfo = serversInfo; this.AssetCache = assetCache; - UserProfilesCache = new UserProfileCache(this); + UserProfiles = new UserProfileCache(this); } #region Packet Handlers public void HandleUUIDNameRequest(LLUUID uuid, IClientAPI remote_client) { - UserProfileData profileData = this.UserServer.GetUserProfile(uuid); - if (profileData != null) + if (uuid == UserProfiles.libraryRoot.agentID) { - LLUUID profileId = profileData.UUID; - string firstname = profileData.username; - string lastname = profileData.surname; + remote_client.SendNameReply(uuid , "Mr" , "OpenSim"); + } + else + { + UserProfileData profileData = this.UserServer.GetUserProfile(uuid); + if (profileData != null) + { + LLUUID profileId = profileData.UUID; + string firstname = profileData.username; + string lastname = profileData.surname; - remote_client.SendNameReply(profileId, firstname, lastname); - } + remote_client.SendNameReply(profileId, firstname, lastname); + } + } } #endregion -- cgit v1.1