From cb29926e3cefedd9bea3c26b1b7f079c8209f6fa Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Wed, 18 Jun 2008 23:04:15 +0000 Subject: * Refactors call to OutPacket out of AssetCache and into LLClientView --- OpenSim/Framework/AssetRequestToClient.cs | 63 ++++++++++++++++ .../Framework/Communications/Cache/AssetCache.cs | 85 +++++----------------- OpenSim/Framework/IClientAPI.cs | 2 + 3 files changed, 82 insertions(+), 68 deletions(-) create mode 100644 OpenSim/Framework/AssetRequestToClient.cs (limited to 'OpenSim/Framework') diff --git a/OpenSim/Framework/AssetRequestToClient.cs b/OpenSim/Framework/AssetRequestToClient.cs new file mode 100644 index 0000000..916b9f5 --- /dev/null +++ b/OpenSim/Framework/AssetRequestToClient.cs @@ -0,0 +1,63 @@ +/* + * Copyright (c) Contributors, http://opensimulator.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.Generic; +using System.Text; +using libsecondlife; + +namespace OpenSim.Framework +{ + /// + /// This class was created to refactor OutPacket out of AssetCache + /// There is a conflict between + /// OpenSim.Framework.Communications.Cache.AssetRequest and OpenSim.Framework.AssetRequest + /// and unifying them results in a prebuild chicken and egg problem with OpenSim.Framework requiring + /// OpenSim.Framework.Communications.Cache while OpenSim.Framework.Communications.Cache + /// requiring OpenSim.Framework + /// + public class AssetRequestToClient + { + public LLUUID RequestAssetID; + public AssetBase AssetInf; + public AssetBase ImageInfo; + public LLUUID TransferRequestID; + public long DataPointer = 0; + public int NumPackets = 0; + public int PacketCounter = 0; + public bool IsTextureRequest; + public byte AssetRequestSource = 2; + public byte[] Params = null; + //public bool AssetInCache; + //public int TimeRequested; + public int DiscardLevel = -1; + + public AssetRequestToClient() + { + } + } +} diff --git a/OpenSim/Framework/Communications/Cache/AssetCache.cs b/OpenSim/Framework/Communications/Cache/AssetCache.cs index a1d9c73..2c51160 100644 --- a/OpenSim/Framework/Communications/Cache/AssetCache.cs +++ b/OpenSim/Framework/Communications/Cache/AssetCache.cs @@ -612,80 +612,29 @@ namespace OpenSim.Framework.Communications.Cache int num = Math.Min(5, AssetRequests.Count); AssetRequest req; + AssetRequestToClient req2 = null; for (int i = 0; i < num; i++) { req = (AssetRequest)AssetRequests[i]; - //Console.WriteLine("sending asset " + req.RequestAssetID); - TransferInfoPacket Transfer = new TransferInfoPacket(); - Transfer.TransferInfo.ChannelType = 2; - Transfer.TransferInfo.Status = 0; - Transfer.TransferInfo.TargetType = 0; - if (req.AssetRequestSource == 2) + if (req2 == null) { - Transfer.TransferInfo.Params = new byte[20]; - Array.Copy(req.RequestAssetID.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16); - int assType = (int)req.AssetInf.Type; - Array.Copy(Helpers.IntToBytes(assType), 0, Transfer.TransferInfo.Params, 16, 4); + req2 = new AssetRequestToClient(); } - else if (req.AssetRequestSource == 3) - { - Transfer.TransferInfo.Params = req.Params; - // Transfer.TransferInfo.Params = new byte[100]; - //Array.Copy(req.RequestUser.AgentId.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16); - //Array.Copy(req.RequestUser.SessionId.GetBytes(), 0, Transfer.TransferInfo.Params, 16, 16); - } - Transfer.TransferInfo.Size = (int)req.AssetInf.Data.Length; - Transfer.TransferInfo.TransferID = req.TransferRequestID; - Transfer.Header.Zerocoded = true; - req.RequestUser.OutPacket(Transfer, ThrottleOutPacketType.Asset); + // Trying to limit memory usage by only creating AssetRequestToClient if needed + //req2 = new AssetRequestToClient(); + req2.AssetInf = (AssetBase)req.AssetInf; + req2.AssetRequestSource = req.AssetRequestSource; + req2.DataPointer = req.DataPointer; + req2.DiscardLevel = req.DiscardLevel; + req2.ImageInfo = (AssetBase)req.ImageInfo; + req2.IsTextureRequest = req.IsTextureRequest; + req2.NumPackets = req.NumPackets; + req2.PacketCounter = req.PacketCounter; + req2.Params = req.Params; + req2.RequestAssetID = req.RequestAssetID; + req2.TransferRequestID = req.TransferRequestID; + req.RequestUser.SendAsset(req2); - if (req.NumPackets == 1) - { - TransferPacketPacket TransferPacket = new TransferPacketPacket(); - TransferPacket.TransferData.Packet = 0; - TransferPacket.TransferData.ChannelType = 2; - TransferPacket.TransferData.TransferID = req.TransferRequestID; - TransferPacket.TransferData.Data = req.AssetInf.Data; - TransferPacket.TransferData.Status = 1; - TransferPacket.Header.Zerocoded = true; - req.RequestUser.OutPacket(TransferPacket, ThrottleOutPacketType.Asset); - } - else - { - int processedLength = 0; - // libsecondlife hardcodes 1500 as the maximum data chunk size - int maxChunkSize = 1250; - int packetNumber = 0; - - while (processedLength < req.AssetInf.Data.Length) - { - TransferPacketPacket TransferPacket = new TransferPacketPacket(); - TransferPacket.TransferData.Packet = packetNumber; - TransferPacket.TransferData.ChannelType = 2; - TransferPacket.TransferData.TransferID = req.TransferRequestID; - - int chunkSize = Math.Min(req.AssetInf.Data.Length - processedLength, maxChunkSize); - byte[] chunk = new byte[chunkSize]; - Array.Copy(req.AssetInf.Data, processedLength, chunk, 0, chunk.Length); - - TransferPacket.TransferData.Data = chunk; - - // 0 indicates more packets to come, 1 indicates last packet - if (req.AssetInf.Data.Length - processedLength > maxChunkSize) - { - TransferPacket.TransferData.Status = 0; - } - else - { - TransferPacket.TransferData.Status = 1; - } - TransferPacket.Header.Zerocoded = true; - req.RequestUser.OutPacket(TransferPacket, ThrottleOutPacketType.Asset); - - processedLength += chunkSize; - packetNumber++; - } - } } //remove requests that have been completed diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 11cc166..fafd31d 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -1011,6 +1011,8 @@ namespace OpenSim.Framework void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia); + void SendAsset(AssetRequestToClient req); + byte[] GetThrottlesPacked(float multiplier); -- cgit v1.1