* Refactors call to OutPacket out of AssetCache and into LLClientView
parent
6753578465
commit
cb29926e3c
|
@ -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
|
||||
{
|
||||
/// <summary>
|
||||
/// 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
|
||||
/// </summary>
|
||||
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()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
||||
|
|
|
@ -6242,6 +6242,82 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
OutPacket(lsrp, ThrottleOutPacketType.Task);
|
||||
}
|
||||
|
||||
public void SendAsset(AssetRequestToClient req)
|
||||
{
|
||||
|
||||
//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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
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;
|
||||
OutPacket(Transfer, ThrottleOutPacketType.Asset);
|
||||
|
||||
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;
|
||||
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;
|
||||
OutPacket(TransferPacket, ThrottleOutPacketType.Asset);
|
||||
|
||||
processedLength += chunkSize;
|
||||
packetNumber++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public ClientInfo GetClientInfo()
|
||||
{
|
||||
//MainLog.Instance.Verbose("CLIENT", "GetClientInfo BGN");
|
||||
|
|
|
@ -684,6 +684,10 @@ namespace OpenSim.Region.Environment.Modules.World.NPC
|
|||
{
|
||||
}
|
||||
|
||||
public void SendAsset(AssetRequestToClient req)
|
||||
{
|
||||
}
|
||||
|
||||
public void SetDebug(int newDebug)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -767,7 +767,10 @@ namespace OpenSim.Region.Examples.SimpleModule
|
|||
|
||||
public void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia)
|
||||
{
|
||||
}
|
||||
|
||||
public void SendAsset(AssetRequestToClient req)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue