Set svn:eol-style.

afrisby
Jeff Ames 2008-01-03 13:44:52 +00:00
parent 1d098aa84c
commit 119f9b0d80
2 changed files with 232 additions and 232 deletions

View File

@ -1,136 +1,136 @@
using System; using System;
using libsecondlife; using libsecondlife;
using libsecondlife.Packets; using libsecondlife.Packets;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Framework.Console; using OpenSim.Framework.Console;
namespace OpenSim.Region.Environment.Modules namespace OpenSim.Region.Environment.Modules
{ {
public class TextureSender public class TextureSender
{ {
public int counter = 0; public int counter = 0;
private AssetBase m_asset; private AssetBase m_asset;
public long DataPointer = 0; public long DataPointer = 0;
public int NumPackets = 0; public int NumPackets = 0;
public int PacketCounter = 0; public int PacketCounter = 0;
public bool Cancel = false; public bool Cancel = false;
public bool ImageLoaded = false; public bool ImageLoaded = false;
public bool Sending = false; public bool Sending = false;
public IClientAPI RequestUser; public IClientAPI RequestUser;
public LLUUID RequestedAssetID; public LLUUID RequestedAssetID;
public int RequestedDiscardLevel = -1; public int RequestedDiscardLevel = -1;
public uint StartPacketNumber = 0; public uint StartPacketNumber = 0;
// private int m_sentDiscardLevel = -1; // private int m_sentDiscardLevel = -1;
public TextureSender(IClientAPI client, LLUUID textureID, int discardLevel, uint packetNumber) public TextureSender(IClientAPI client, LLUUID textureID, int discardLevel, uint packetNumber)
{ {
RequestUser = client; RequestUser = client;
RequestedAssetID = textureID; RequestedAssetID = textureID;
RequestedDiscardLevel = discardLevel; RequestedDiscardLevel = discardLevel;
StartPacketNumber = packetNumber; StartPacketNumber = packetNumber;
} }
public void TextureReceived(AssetBase asset) public void TextureReceived(AssetBase asset)
{ {
m_asset = asset; m_asset = asset;
NumPackets = CalculateNumPackets(asset.Data.Length); NumPackets = CalculateNumPackets(asset.Data.Length);
PacketCounter = (int) StartPacketNumber; PacketCounter = (int) StartPacketNumber;
ImageLoaded = true; ImageLoaded = true;
} }
public void UpdateRequest(int discardLevel, uint packetNumber) public void UpdateRequest(int discardLevel, uint packetNumber)
{ {
RequestedDiscardLevel = discardLevel; RequestedDiscardLevel = discardLevel;
StartPacketNumber = packetNumber; StartPacketNumber = packetNumber;
PacketCounter = (int) StartPacketNumber; PacketCounter = (int) StartPacketNumber;
} }
public bool SendTexturePacket() public bool SendTexturePacket()
{ {
SendPacket(); SendPacket();
counter++; counter++;
if ((NumPackets == 0) || (RequestedDiscardLevel == -1) || (PacketCounter > NumPackets) || if ((NumPackets == 0) || (RequestedDiscardLevel == -1) || (PacketCounter > NumPackets) ||
((RequestedDiscardLevel > 0) && (counter > 50 + (NumPackets/(RequestedDiscardLevel + 1))))) ((RequestedDiscardLevel > 0) && (counter > 50 + (NumPackets/(RequestedDiscardLevel + 1)))))
{ {
return true; return true;
} }
return false; return false;
} }
private void SendPacket() private void SendPacket()
{ {
if (PacketCounter <= NumPackets) if (PacketCounter <= NumPackets)
{ {
if (PacketCounter == 0) if (PacketCounter == 0)
{ {
if (NumPackets == 0) if (NumPackets == 0)
{ {
ImageDataPacket im = new ImageDataPacket(); ImageDataPacket im = new ImageDataPacket();
im.Header.Reliable = false; im.Header.Reliable = false;
im.ImageID.Packets = 1; im.ImageID.Packets = 1;
im.ImageID.ID = m_asset.FullID; im.ImageID.ID = m_asset.FullID;
im.ImageID.Size = (uint) m_asset.Data.Length; im.ImageID.Size = (uint) m_asset.Data.Length;
im.ImageData.Data = m_asset.Data; im.ImageData.Data = m_asset.Data;
im.ImageID.Codec = 2; im.ImageID.Codec = 2;
RequestUser.OutPacket(im, ThrottleOutPacketType.Texture); RequestUser.OutPacket(im, ThrottleOutPacketType.Texture);
PacketCounter++; PacketCounter++;
} }
else else
{ {
ImageDataPacket im = new ImageDataPacket(); ImageDataPacket im = new ImageDataPacket();
im.Header.Reliable = false; im.Header.Reliable = false;
im.ImageID.Packets = (ushort) (NumPackets); im.ImageID.Packets = (ushort) (NumPackets);
im.ImageID.ID = m_asset.FullID; im.ImageID.ID = m_asset.FullID;
im.ImageID.Size = (uint) m_asset.Data.Length; im.ImageID.Size = (uint) m_asset.Data.Length;
im.ImageData.Data = new byte[600]; im.ImageData.Data = new byte[600];
Array.Copy(m_asset.Data, 0, im.ImageData.Data, 0, 600); Array.Copy(m_asset.Data, 0, im.ImageData.Data, 0, 600);
im.ImageID.Codec = 2; im.ImageID.Codec = 2;
RequestUser.OutPacket(im, ThrottleOutPacketType.Texture); RequestUser.OutPacket(im, ThrottleOutPacketType.Texture);
PacketCounter++; PacketCounter++;
} }
} }
else else
{ {
ImagePacketPacket im = new ImagePacketPacket(); ImagePacketPacket im = new ImagePacketPacket();
im.Header.Reliable = false; im.Header.Reliable = false;
im.ImageID.Packet = (ushort) (PacketCounter); im.ImageID.Packet = (ushort) (PacketCounter);
im.ImageID.ID = m_asset.FullID; im.ImageID.ID = m_asset.FullID;
int size = m_asset.Data.Length - 600 - (1000*(PacketCounter - 1)); int size = m_asset.Data.Length - 600 - (1000*(PacketCounter - 1));
if (size > 1000) size = 1000; if (size > 1000) size = 1000;
im.ImageData.Data = new byte[size]; im.ImageData.Data = new byte[size];
try try
{ {
Array.Copy(m_asset.Data, 600 + (1000*(PacketCounter - 1)), im.ImageData.Data, 0, size); Array.Copy(m_asset.Data, 600 + (1000*(PacketCounter - 1)), im.ImageData.Data, 0, size);
} }
catch (ArgumentOutOfRangeException) catch (ArgumentOutOfRangeException)
{ {
MainLog.Instance.Error("TEXTURE", MainLog.Instance.Error("TEXTURE",
"Unable to separate texture into multiple packets: Array bounds failure on asset:" + "Unable to separate texture into multiple packets: Array bounds failure on asset:" +
m_asset.FullID.ToString() ); m_asset.FullID.ToString() );
return; return;
} }
RequestUser.OutPacket(im, ThrottleOutPacketType.Texture); RequestUser.OutPacket(im, ThrottleOutPacketType.Texture);
PacketCounter++; PacketCounter++;
} }
} }
} }
private int CalculateNumPackets(int length) private int CalculateNumPackets(int length)
{ {
int numPackets = 0; int numPackets = 0;
if (length > 600) if (length > 600)
{ {
//over 600 bytes so split up file //over 600 bytes so split up file
int restData = (length - 600); int restData = (length - 600);
int restPackets = ((restData + 999)/1000); int restPackets = ((restData + 999)/1000);
numPackets = restPackets; numPackets = restPackets;
} }
return numPackets; return numPackets;
} }
} }
} }

View File

@ -1,98 +1,98 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using libsecondlife; using libsecondlife;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Framework.Console; using OpenSim.Framework.Console;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
namespace OpenSim.Region.Environment.Modules namespace OpenSim.Region.Environment.Modules
{ {
public class UserTextureDownloadService public class UserTextureDownloadService
{ {
private readonly Dictionary<LLUUID, TextureSender> m_textureSenders = new Dictionary<LLUUID, TextureSender>(); private readonly Dictionary<LLUUID, TextureSender> m_textureSenders = new Dictionary<LLUUID, TextureSender>();
private readonly BlockingQueue<TextureSender> m_sharedSendersQueue; private readonly BlockingQueue<TextureSender> m_sharedSendersQueue;
private readonly Scene m_scene; private readonly Scene m_scene;
public UserTextureDownloadService(Scene scene, BlockingQueue<TextureSender> sharedQueue) public UserTextureDownloadService(Scene scene, BlockingQueue<TextureSender> sharedQueue)
{ {
m_scene = scene; m_scene = scene;
m_sharedSendersQueue = sharedQueue; m_sharedSendersQueue = sharedQueue;
} }
public void HandleTextureRequest(IClientAPI client, TextureRequestArgs e) public void HandleTextureRequest(IClientAPI client, TextureRequestArgs e)
{ {
TextureSender textureSender; TextureSender textureSender;
//TODO: should be working out the data size/ number of packets to be sent for each discard level //TODO: should be working out the data size/ number of packets to be sent for each discard level
if ((e.DiscardLevel >= 0) || (e.Priority != 0)) if ((e.DiscardLevel >= 0) || (e.Priority != 0))
{ {
lock (m_textureSenders) lock (m_textureSenders)
{ {
if (m_textureSenders.TryGetValue(e.RequestedAssetID, out textureSender)) if (m_textureSenders.TryGetValue(e.RequestedAssetID, out textureSender))
{ {
textureSender.UpdateRequest(e.DiscardLevel, e.PacketNumber); textureSender.UpdateRequest(e.DiscardLevel, e.PacketNumber);
if ((textureSender.ImageLoaded) && if ((textureSender.ImageLoaded) &&
(textureSender.Sending == false)) (textureSender.Sending == false))
{ {
EnqueueTextureSender(textureSender); EnqueueTextureSender(textureSender);
} }
} }
else else
{ {
TextureSender requestHandler = TextureSender requestHandler =
new TextureSender(client, e.RequestedAssetID, e.DiscardLevel, e.PacketNumber); new TextureSender(client, e.RequestedAssetID, e.DiscardLevel, e.PacketNumber);
m_textureSenders.Add(e.RequestedAssetID, requestHandler); m_textureSenders.Add(e.RequestedAssetID, requestHandler);
m_scene.AssetCache.GetAsset(e.RequestedAssetID, TextureCallback); m_scene.AssetCache.GetAsset(e.RequestedAssetID, TextureCallback);
} }
} }
} }
else else
{ {
lock (m_textureSenders) lock (m_textureSenders)
{ {
if (m_textureSenders.TryGetValue(e.RequestedAssetID, out textureSender)) if (m_textureSenders.TryGetValue(e.RequestedAssetID, out textureSender))
{ {
textureSender.Cancel = true; textureSender.Cancel = true;
} }
} }
} }
} }
public void TextureCallback(LLUUID textureID, AssetBase asset) public void TextureCallback(LLUUID textureID, AssetBase asset)
{ {
lock (m_textureSenders) lock (m_textureSenders)
{ {
TextureSender textureSender; TextureSender textureSender;
if (m_textureSenders.TryGetValue(textureID, out textureSender)) if (m_textureSenders.TryGetValue(textureID, out textureSender))
{ {
if (!textureSender.ImageLoaded) if (!textureSender.ImageLoaded)
{ {
textureSender.TextureReceived(asset); textureSender.TextureReceived(asset);
EnqueueTextureSender(textureSender); EnqueueTextureSender(textureSender);
} }
} }
else else
{ {
throw new Exception("Got a texture with no sender object to handle it, this shouldn't happen"); throw new Exception("Got a texture with no sender object to handle it, this shouldn't happen");
} }
} }
} }
private void EnqueueTextureSender(TextureSender textureSender) private void EnqueueTextureSender(TextureSender textureSender)
{ {
MainLog.Instance.Debug( "TEXTUREDOWNLOAD", "Start: ["+textureSender.RequestedAssetID+"] to ["+textureSender.RequestUser.Name+"]"); MainLog.Instance.Debug( "TEXTUREDOWNLOAD", "Start: ["+textureSender.RequestedAssetID+"] to ["+textureSender.RequestUser.Name+"]");
textureSender.Cancel = false; textureSender.Cancel = false;
textureSender.Sending = true; textureSender.Sending = true;
textureSender.counter = 0; textureSender.counter = 0;
if (!m_sharedSendersQueue.Contains(textureSender)) if (!m_sharedSendersQueue.Contains(textureSender))
{ {
m_sharedSendersQueue.Enqueue(textureSender); m_sharedSendersQueue.Enqueue(textureSender);
} }
} }
} }
} }