diff options
4 files changed, 58 insertions, 13 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs b/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs index bbd2c43..8dd76d8 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 | |||
377 | 377 | ||
378 | private void AssetReceived(string id, Object sender, AssetBase asset) | 378 | private void AssetReceived(string id, Object sender, AssetBase asset) |
379 | { | 379 | { |
380 | // m_log.DebugFormat( | ||
381 | // "[J2KIMAGE]: Received asset {0} ({1} bytes)", id, asset != null ? asset.Data.Length.ToString() : "n/a"); | ||
382 | |||
380 | UUID assetID = UUID.Zero; | 383 | UUID assetID = UUID.Zero; |
381 | if (asset != null) | 384 | if (asset != null) |
382 | { | 385 | { |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs index 7bfb844..a48251f 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 | |||
55 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 55 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
56 | private bool m_shuttingdown; | 56 | private bool m_shuttingdown; |
57 | private AssetBase m_missingImage; | 57 | private AssetBase m_missingImage; |
58 | private IClientAPI m_client; //Client we're assigned to | 58 | private IAssetService m_assetCache; |
59 | private IAssetService m_assetCache; //Asset Cache | 59 | private IJ2KDecoder m_j2kDecodeModule; |
60 | private IJ2KDecoder m_j2kDecodeModule; //Our J2K module | 60 | |
61 | /// <summary> | ||
62 | /// Priority queue for determining which image to send first. | ||
63 | /// </summary> | ||
61 | private C5.IntervalHeap<J2KImage> m_priorityQueue = new C5.IntervalHeap<J2KImage>(10, new J2KImageComparer()); | 64 | private C5.IntervalHeap<J2KImage> m_priorityQueue = new C5.IntervalHeap<J2KImage>(10, new J2KImageComparer()); |
65 | |||
66 | /// <summary> | ||
67 | /// Used to control thread access to the priority queue. | ||
68 | /// </summary> | ||
62 | private object m_syncRoot = new object(); | 69 | private object m_syncRoot = new object(); |
63 | 70 | ||
64 | public IClientAPI Client { get { return m_client; } } | 71 | /// <summary> |
72 | /// Client served by this image manager | ||
73 | /// </summary> | ||
74 | public IClientAPI Client { get; private set; } | ||
75 | |||
65 | public AssetBase MissingImage { get { return m_missingImage; } } | 76 | public AssetBase MissingImage { get { return m_missingImage; } } |
66 | 77 | ||
67 | public LLImageManager(IClientAPI client, IAssetService pAssetCache, IJ2KDecoder pJ2kDecodeModule) | 78 | public LLImageManager(IClientAPI client, IAssetService pAssetCache, IJ2KDecoder pJ2kDecodeModule) |
68 | { | 79 | { |
69 | m_client = client; | 80 | Client = client; |
70 | m_assetCache = pAssetCache; | 81 | m_assetCache = pAssetCache; |
71 | 82 | ||
72 | if (pAssetCache != null) | 83 | if (pAssetCache != null) |
@@ -90,7 +101,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
90 | 101 | ||
91 | // Do a linear search for this texture download | 102 | // Do a linear search for this texture download |
92 | lock (m_syncRoot) | 103 | lock (m_syncRoot) |
104 | { | ||
93 | m_priorityQueue.Find(delegate(J2KImage img) { return img.TextureID == newRequest.RequestedAssetID; }, out imgrequest); | 105 | m_priorityQueue.Find(delegate(J2KImage img) { return img.TextureID == newRequest.RequestedAssetID; }, out imgrequest); |
106 | } | ||
94 | 107 | ||
95 | if (imgrequest != null) | 108 | if (imgrequest != null) |
96 | { | 109 | { |
@@ -178,8 +191,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
178 | imgrequest = new J2KImage(this); | 191 | imgrequest = new J2KImage(this); |
179 | imgrequest.J2KDecoder = m_j2kDecodeModule; | 192 | imgrequest.J2KDecoder = m_j2kDecodeModule; |
180 | imgrequest.AssetService = m_assetCache; | 193 | imgrequest.AssetService = m_assetCache; |
181 | imgrequest.AgentID = m_client.AgentId; | 194 | imgrequest.AgentID = Client.AgentId; |
182 | imgrequest.InventoryAccessModule = m_client.Scene.RequestModuleInterface<IInventoryAccessModule>(); | 195 | imgrequest.InventoryAccessModule = Client.Scene.RequestModuleInterface<IInventoryAccessModule>(); |
183 | imgrequest.DiscardLevel = newRequest.DiscardLevel; | 196 | imgrequest.DiscardLevel = newRequest.DiscardLevel; |
184 | imgrequest.StartPacket = Math.Max(1, newRequest.PacketNumber); | 197 | imgrequest.StartPacket = Math.Max(1, newRequest.PacketNumber); |
185 | imgrequest.Priority = newRequest.Priority; | 198 | imgrequest.Priority = newRequest.Priority; |
@@ -210,7 +223,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
210 | if (image.IsDecoded) | 223 | if (image.IsDecoded) |
211 | { | 224 | { |
212 | int sent; | 225 | int sent; |
213 | bool imageDone = image.SendPackets(m_client, packetsToSend - packetsSent, out sent); | 226 | bool imageDone = image.SendPackets(Client, packetsToSend - packetsSent, out sent); |
214 | packetsSent += sent; | 227 | packetsSent += sent; |
215 | 228 | ||
216 | // If the send is complete, destroy any knowledge of this transfer | 229 | // 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 f176964..1b68d68 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 | |||
46 | public class LLImageManagerTests | 46 | public class LLImageManagerTests |
47 | { | 47 | { |
48 | private AssetBase m_testImageAsset; | 48 | private AssetBase m_testImageAsset; |
49 | private Scene scene; | ||
49 | private LLImageManager llim; | 50 | private LLImageManager llim; |
50 | private TestClient tc; | 51 | private TestClient tc; |
51 | 52 | ||
@@ -78,21 +79,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests | |||
78 | 79 | ||
79 | J2KDecoderModule j2kdm = new J2KDecoderModule(); | 80 | J2KDecoderModule j2kdm = new J2KDecoderModule(); |
80 | 81 | ||
81 | Scene scene = SceneHelpers.SetupScene(); | 82 | scene = SceneHelpers.SetupScene(); |
82 | SceneHelpers.SetupSceneModules(scene, j2kdm); | 83 | SceneHelpers.SetupSceneModules(scene, j2kdm); |
83 | 84 | ||
84 | scene.AssetService.Store(m_testImageAsset); | ||
85 | |||
86 | tc = new TestClient(SceneHelpers.GenerateAgentData(userId), scene); | 85 | tc = new TestClient(SceneHelpers.GenerateAgentData(userId), scene); |
87 | llim = new LLImageManager(tc, scene.AssetService, j2kdm); | 86 | llim = new LLImageManager(tc, scene.AssetService, j2kdm); |
88 | } | 87 | } |
89 | 88 | ||
90 | [Test] | 89 | [Test] |
91 | public void TestRequestAndSendImage() | 90 | public void TestSendImage() |
92 | { | 91 | { |
93 | TestHelpers.InMethod(); | 92 | TestHelpers.InMethod(); |
94 | // XmlConfigurator.Configure(); | 93 | // XmlConfigurator.Configure(); |
95 | 94 | ||
95 | scene.AssetService.Store(m_testImageAsset); | ||
96 | |||
96 | TextureRequestArgs args = new TextureRequestArgs(); | 97 | TextureRequestArgs args = new TextureRequestArgs(); |
97 | args.RequestedAssetID = m_testImageAsset.FullID; | 98 | args.RequestedAssetID = m_testImageAsset.FullID; |
98 | args.DiscardLevel = 0; | 99 | args.DiscardLevel = 0; |
@@ -107,11 +108,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests | |||
107 | } | 108 | } |
108 | 109 | ||
109 | [Test] | 110 | [Test] |
110 | public void TestRequestAndDiscardImage() | 111 | public void TestDiscardImage() |
111 | { | 112 | { |
112 | TestHelpers.InMethod(); | 113 | TestHelpers.InMethod(); |
113 | // XmlConfigurator.Configure(); | 114 | // XmlConfigurator.Configure(); |
114 | 115 | ||
116 | scene.AssetService.Store(m_testImageAsset); | ||
117 | |||
115 | TextureRequestArgs args = new TextureRequestArgs(); | 118 | TextureRequestArgs args = new TextureRequestArgs(); |
116 | args.RequestedAssetID = m_testImageAsset.FullID; | 119 | args.RequestedAssetID = m_testImageAsset.FullID; |
117 | args.DiscardLevel = 0; | 120 | args.DiscardLevel = 0; |
@@ -133,5 +136,25 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests | |||
133 | 136 | ||
134 | Assert.That(tc.SentImageDataPackets.Count, Is.EqualTo(0)); | 137 | Assert.That(tc.SentImageDataPackets.Count, Is.EqualTo(0)); |
135 | } | 138 | } |
139 | |||
140 | [Test] | ||
141 | public void TestMissingImage() | ||
142 | { | ||
143 | TestHelpers.InMethod(); | ||
144 | // XmlConfigurator.Configure(); | ||
145 | |||
146 | TextureRequestArgs args = new TextureRequestArgs(); | ||
147 | args.RequestedAssetID = m_testImageAsset.FullID; | ||
148 | args.DiscardLevel = 0; | ||
149 | args.PacketNumber = 1; | ||
150 | args.Priority = 5; | ||
151 | args.requestSequence = 1; | ||
152 | |||
153 | llim.EnqueueReq(args); | ||
154 | llim.ProcessImageQueue(20); | ||
155 | |||
156 | Assert.That(tc.SentImageDataPackets.Count, Is.EqualTo(0)); | ||
157 | Assert.That(tc.SentImageNotInDatabasePackets.Count, Is.EqualTo(1)); | ||
158 | } | ||
136 | } | 159 | } |
137 | } \ No newline at end of file | 160 | } \ No newline at end of file |
diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs index 2fc6572..fad757a 100644 --- a/OpenSim/Tests/Common/Mock/TestClient.cs +++ b/OpenSim/Tests/Common/Mock/TestClient.cs | |||
@@ -60,6 +60,7 @@ namespace OpenSim.Tests.Common.Mock | |||
60 | 60 | ||
61 | public List<ImageDataPacket> SentImageDataPackets { get; private set; } | 61 | public List<ImageDataPacket> SentImageDataPackets { get; private set; } |
62 | public List<ImagePacketPacket> SentImagePacketPackets { get; private set; } | 62 | public List<ImagePacketPacket> SentImagePacketPackets { get; private set; } |
63 | public List<ImageNotInDatabasePacket> SentImageNotInDatabasePackets { get; private set; } | ||
63 | 64 | ||
64 | // disable warning: public events, part of the public API | 65 | // disable warning: public events, part of the public API |
65 | #pragma warning disable 67 | 66 | #pragma warning disable 67 |
@@ -455,6 +456,7 @@ namespace OpenSim.Tests.Common.Mock | |||
455 | 456 | ||
456 | SentImageDataPackets = new List<ImageDataPacket>(); | 457 | SentImageDataPackets = new List<ImageDataPacket>(); |
457 | SentImagePacketPackets = new List<ImagePacketPacket>(); | 458 | SentImagePacketPackets = new List<ImagePacketPacket>(); |
459 | SentImageNotInDatabasePackets = new List<ImageNotInDatabasePacket>(); | ||
458 | } | 460 | } |
459 | 461 | ||
460 | /// <summary> | 462 | /// <summary> |
@@ -822,6 +824,10 @@ namespace OpenSim.Tests.Common.Mock | |||
822 | 824 | ||
823 | public void SendImageNotFound(UUID imageid) | 825 | public void SendImageNotFound(UUID imageid) |
824 | { | 826 | { |
827 | ImageNotInDatabasePacket p = new ImageNotInDatabasePacket(); | ||
828 | p.ImageID.ID = imageid; | ||
829 | |||
830 | SentImageNotInDatabasePackets.Add(p); | ||
825 | } | 831 | } |
826 | 832 | ||
827 | public void SendShutdownConnectionNotice() | 833 | public void SendShutdownConnectionNotice() |