diff --git a/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs b/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs
index 976d6f93e8..474d2a5476 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs
@@ -377,6 +377,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
private void AssetReceived(string id, Object sender, AssetBase asset)
{
+// m_log.DebugFormat(
+// "[J2KIMAGE]: Received asset {0} ({1} bytes)", id, asset != null ? asset.Data.Length.ToString() : "n/a");
+
UUID assetID = UUID.Zero;
if (asset != null)
{
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs
index 7bfb844b8e..a48251f9c0 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs
@@ -55,18 +55,29 @@ namespace OpenSim.Region.ClientStack.LindenUDP
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private bool m_shuttingdown;
private AssetBase m_missingImage;
- private IClientAPI m_client; //Client we're assigned to
- private IAssetService m_assetCache; //Asset Cache
- private IJ2KDecoder m_j2kDecodeModule; //Our J2K module
+ private IAssetService m_assetCache;
+ private IJ2KDecoder m_j2kDecodeModule;
+
+ ///
+ /// Priority queue for determining which image to send first.
+ ///
private C5.IntervalHeap m_priorityQueue = new C5.IntervalHeap(10, new J2KImageComparer());
+
+ ///
+ /// Used to control thread access to the priority queue.
+ ///
private object m_syncRoot = new object();
- public IClientAPI Client { get { return m_client; } }
+ ///
+ /// Client served by this image manager
+ ///
+ public IClientAPI Client { get; private set; }
+
public AssetBase MissingImage { get { return m_missingImage; } }
public LLImageManager(IClientAPI client, IAssetService pAssetCache, IJ2KDecoder pJ2kDecodeModule)
{
- m_client = client;
+ Client = client;
m_assetCache = pAssetCache;
if (pAssetCache != null)
@@ -90,7 +101,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// Do a linear search for this texture download
lock (m_syncRoot)
+ {
m_priorityQueue.Find(delegate(J2KImage img) { return img.TextureID == newRequest.RequestedAssetID; }, out imgrequest);
+ }
if (imgrequest != null)
{
@@ -178,8 +191,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
imgrequest = new J2KImage(this);
imgrequest.J2KDecoder = m_j2kDecodeModule;
imgrequest.AssetService = m_assetCache;
- imgrequest.AgentID = m_client.AgentId;
- imgrequest.InventoryAccessModule = m_client.Scene.RequestModuleInterface();
+ imgrequest.AgentID = Client.AgentId;
+ imgrequest.InventoryAccessModule = Client.Scene.RequestModuleInterface();
imgrequest.DiscardLevel = newRequest.DiscardLevel;
imgrequest.StartPacket = Math.Max(1, newRequest.PacketNumber);
imgrequest.Priority = newRequest.Priority;
@@ -210,7 +223,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (image.IsDecoded)
{
int sent;
- bool imageDone = image.SendPackets(m_client, packetsToSend - packetsSent, out sent);
+ bool imageDone = image.SendPackets(Client, packetsToSend - packetsSent, out sent);
packetsSent += sent;
// If the send is complete, destroy any knowledge of this transfer
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs b/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs
index f176964ae4..1b68d68765 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs
@@ -46,6 +46,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
public class LLImageManagerTests
{
private AssetBase m_testImageAsset;
+ private Scene scene;
private LLImageManager llim;
private TestClient tc;
@@ -78,21 +79,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
J2KDecoderModule j2kdm = new J2KDecoderModule();
- Scene scene = SceneHelpers.SetupScene();
+ scene = SceneHelpers.SetupScene();
SceneHelpers.SetupSceneModules(scene, j2kdm);
- scene.AssetService.Store(m_testImageAsset);
-
tc = new TestClient(SceneHelpers.GenerateAgentData(userId), scene);
llim = new LLImageManager(tc, scene.AssetService, j2kdm);
}
[Test]
- public void TestRequestAndSendImage()
+ public void TestSendImage()
{
TestHelpers.InMethod();
// XmlConfigurator.Configure();
+ scene.AssetService.Store(m_testImageAsset);
+
TextureRequestArgs args = new TextureRequestArgs();
args.RequestedAssetID = m_testImageAsset.FullID;
args.DiscardLevel = 0;
@@ -107,11 +108,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
}
[Test]
- public void TestRequestAndDiscardImage()
+ public void TestDiscardImage()
{
TestHelpers.InMethod();
// XmlConfigurator.Configure();
+ scene.AssetService.Store(m_testImageAsset);
+
TextureRequestArgs args = new TextureRequestArgs();
args.RequestedAssetID = m_testImageAsset.FullID;
args.DiscardLevel = 0;
@@ -133,5 +136,25 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
Assert.That(tc.SentImageDataPackets.Count, Is.EqualTo(0));
}
+
+ [Test]
+ public void TestMissingImage()
+ {
+ TestHelpers.InMethod();
+// XmlConfigurator.Configure();
+
+ TextureRequestArgs args = new TextureRequestArgs();
+ args.RequestedAssetID = m_testImageAsset.FullID;
+ args.DiscardLevel = 0;
+ args.PacketNumber = 1;
+ args.Priority = 5;
+ args.requestSequence = 1;
+
+ llim.EnqueueReq(args);
+ llim.ProcessImageQueue(20);
+
+ Assert.That(tc.SentImageDataPackets.Count, Is.EqualTo(0));
+ Assert.That(tc.SentImageNotInDatabasePackets.Count, Is.EqualTo(1));
+ }
}
}
\ No newline at end of file
diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs
index fcfa43a7d6..6dbb2cd7f1 100644
--- a/OpenSim/Tests/Common/Mock/TestClient.cs
+++ b/OpenSim/Tests/Common/Mock/TestClient.cs
@@ -60,6 +60,7 @@ namespace OpenSim.Tests.Common.Mock
public List SentImageDataPackets { get; private set; }
public List SentImagePacketPackets { get; private set; }
+ public List SentImageNotInDatabasePackets { get; private set; }
// disable warning: public events, part of the public API
#pragma warning disable 67
@@ -454,6 +455,7 @@ namespace OpenSim.Tests.Common.Mock
SentImageDataPackets = new List();
SentImagePacketPackets = new List();
+ SentImageNotInDatabasePackets = new List();
}
///
@@ -821,6 +823,10 @@ namespace OpenSim.Tests.Common.Mock
public void SendImageNotFound(UUID imageid)
{
+ ImageNotInDatabasePacket p = new ImageNotInDatabasePacket();
+ p.ImageID.ID = imageid;
+
+ SentImageNotInDatabasePackets.Add(p);
}
public void SendShutdownConnectionNotice()