From 276011a0a149c5ea81dd106137889c840c10b738 Mon Sep 17 00:00:00 2001 From: MW Date: Sun, 22 Jul 2007 13:31:08 +0000 Subject: [PATCH] Think I've recovered my deleted files, so hopefully it works now. --- .../Communications/Cache/AssetCache.cs | 561 ++++++++++++++++++ .../Cache/AssetTransactionManager.cs | 81 +++ .../Communications/Cache/AssetTransactions.cs | 275 +++++++++ .../Communications/Cache/CachedUserInfo.cs | 94 +++ .../Communications/Cache/InventoryFolder.cs | 109 ++++ .../Communications/Cache/UserProfileCache.cs | 170 ++++++ ...penSim.Region.Physics.BulletXPlugin.csproj | 66 +++ 7 files changed, 1356 insertions(+) create mode 100644 OpenSim/Framework/Communications/Cache/AssetCache.cs create mode 100644 OpenSim/Framework/Communications/Cache/AssetTransactionManager.cs create mode 100644 OpenSim/Framework/Communications/Cache/AssetTransactions.cs create mode 100644 OpenSim/Framework/Communications/Cache/CachedUserInfo.cs create mode 100644 OpenSim/Framework/Communications/Cache/InventoryFolder.cs create mode 100644 OpenSim/Framework/Communications/Cache/UserProfileCache.cs create mode 100644 OpenSim/Region/Physics/BulletXPlugin/OpenSim.Region.Physics.BulletXPlugin.csproj diff --git a/OpenSim/Framework/Communications/Cache/AssetCache.cs b/OpenSim/Framework/Communications/Cache/AssetCache.cs new file mode 100644 index 0000000000..3d0fd76271 --- /dev/null +++ b/OpenSim/Framework/Communications/Cache/AssetCache.cs @@ -0,0 +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); + } + } + } + } +} diff --git a/OpenSim/Framework/Communications/Cache/AssetTransactionManager.cs b/OpenSim/Framework/Communications/Cache/AssetTransactionManager.cs new file mode 100644 index 0000000000..8b485afc3d --- /dev/null +++ b/OpenSim/Framework/Communications/Cache/AssetTransactionManager.cs @@ -0,0 +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) + { + } + } +} + + diff --git a/OpenSim/Framework/Communications/Cache/AssetTransactions.cs b/OpenSim/Framework/Communications/Cache/AssetTransactions.cs new file mode 100644 index 0000000000..bb9c0690b1 --- /dev/null +++ b/OpenSim/Framework/Communications/Cache/AssetTransactions.cs @@ -0,0 +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; + 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; + 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 new file mode 100644 index 0000000000..2660df350c --- /dev/null +++ b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs @@ -0,0 +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); + } + } + } + } + } +} + diff --git a/OpenSim/Framework/Communications/Cache/InventoryFolder.cs b/OpenSim/Framework/Communications/Cache/InventoryFolder.cs new file mode 100644 index 0000000000..8670eb0ca8 --- /dev/null +++ b/OpenSim/Framework/Communications/Cache/InventoryFolder.cs @@ -0,0 +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; + } + } +} diff --git a/OpenSim/Framework/Communications/Cache/UserProfileCache.cs b/OpenSim/Framework/Communications/Cache/UserProfileCache.cs new file mode 100644 index 0000000000..8210702358 --- /dev/null +++ b/OpenSim/Framework/Communications/Cache/UserProfileCache.cs @@ -0,0 +1,170 @@ +/* +* 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) + { + } + } +} + diff --git a/OpenSim/Region/Physics/BulletXPlugin/OpenSim.Region.Physics.BulletXPlugin.csproj b/OpenSim/Region/Physics/BulletXPlugin/OpenSim.Region.Physics.BulletXPlugin.csproj new file mode 100644 index 0000000000..fdb1d384a1 --- /dev/null +++ b/OpenSim/Region/Physics/BulletXPlugin/OpenSim.Region.Physics.BulletXPlugin.csproj @@ -0,0 +1,66 @@ + + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {2D3DE8E4-9202-46A4-857B-3579B70E8356} + Library + Properties + OpenSim.Region.Physics.BulletXPlugin + OpenSim.Region.Physics.BulletXPlugin + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\..\..\bin\Physics\ + TRACE + prompt + 4 + + + + + + + + + + ..\..\..\..\bin\Axiom.MathLib.dll + False + + + False + ..\..\..\..\bin\Modified.XnaDevRu.BulletX.dll + + + False + ..\..\..\..\bin\MonoXnaCompactMaths.dll + + + False + ..\..\..\..\bin\OpenSim.Region.Physics.Manager.dll + + + + + + \ No newline at end of file