* 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);
|
int num = Math.Min(5, AssetRequests.Count);
|
||||||
|
|
||||||
AssetRequest req;
|
AssetRequest req;
|
||||||
|
AssetRequestToClient req2 = null;
|
||||||
for (int i = 0; i < num; i++)
|
for (int i = 0; i < num; i++)
|
||||||
{
|
{
|
||||||
req = (AssetRequest)AssetRequests[i];
|
req = (AssetRequest)AssetRequests[i];
|
||||||
//Console.WriteLine("sending asset " + req.RequestAssetID);
|
if (req2 == null)
|
||||||
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];
|
req2 = new AssetRequestToClient();
|
||||||
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)
|
// Trying to limit memory usage by only creating AssetRequestToClient if needed
|
||||||
{
|
//req2 = new AssetRequestToClient();
|
||||||
Transfer.TransferInfo.Params = req.Params;
|
req2.AssetInf = (AssetBase)req.AssetInf;
|
||||||
// Transfer.TransferInfo.Params = new byte[100];
|
req2.AssetRequestSource = req.AssetRequestSource;
|
||||||
//Array.Copy(req.RequestUser.AgentId.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16);
|
req2.DataPointer = req.DataPointer;
|
||||||
//Array.Copy(req.RequestUser.SessionId.GetBytes(), 0, Transfer.TransferInfo.Params, 16, 16);
|
req2.DiscardLevel = req.DiscardLevel;
|
||||||
}
|
req2.ImageInfo = (AssetBase)req.ImageInfo;
|
||||||
Transfer.TransferInfo.Size = (int)req.AssetInf.Data.Length;
|
req2.IsTextureRequest = req.IsTextureRequest;
|
||||||
Transfer.TransferInfo.TransferID = req.TransferRequestID;
|
req2.NumPackets = req.NumPackets;
|
||||||
Transfer.Header.Zerocoded = true;
|
req2.PacketCounter = req.PacketCounter;
|
||||||
req.RequestUser.OutPacket(Transfer, ThrottleOutPacketType.Asset);
|
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
|
//remove requests that have been completed
|
||||||
|
|
|
@ -1011,6 +1011,8 @@ namespace OpenSim.Framework
|
||||||
|
|
||||||
void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia);
|
void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia);
|
||||||
|
|
||||||
|
void SendAsset(AssetRequestToClient req);
|
||||||
|
|
||||||
byte[] GetThrottlesPacked(float multiplier);
|
byte[] GetThrottlesPacked(float multiplier);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -6242,6 +6242,82 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
OutPacket(lsrp, ThrottleOutPacketType.Task);
|
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()
|
public ClientInfo GetClientInfo()
|
||||||
{
|
{
|
||||||
//MainLog.Instance.Verbose("CLIENT", "GetClientInfo BGN");
|
//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)
|
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 SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia)
|
||||||
{
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendAsset(AssetRequestToClient req)
|
||||||
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue