aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/OpenSim.Caches/AssetCache.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/OpenSim.Caches/AssetCache.cs')
-rw-r--r--OpenSim/OpenSim.Caches/AssetCache.cs191
1 files changed, 119 insertions, 72 deletions
diff --git a/OpenSim/OpenSim.Caches/AssetCache.cs b/OpenSim/OpenSim.Caches/AssetCache.cs
index eae0f80..44d22a9 100644
--- a/OpenSim/OpenSim.Caches/AssetCache.cs
+++ b/OpenSim/OpenSim.Caches/AssetCache.cs
@@ -38,6 +38,7 @@ using OpenSim.Framework.Utilities;
38 38
39namespace OpenSim.Caches 39namespace OpenSim.Caches
40{ 40{
41 public delegate void DownloadComplete(AssetCache.TextureSender sender);
41 /// <summary> 42 /// <summary>
42 /// Manages local cache of assets and their sending to viewers. 43 /// Manages local cache of assets and their sending to viewers.
43 /// </summary> 44 /// </summary>
@@ -52,6 +53,7 @@ namespace OpenSim.Caches
52 public Dictionary<LLUUID, AssetRequest> RequestedAssets = new Dictionary<LLUUID, AssetRequest>(); //Assets requested from the asset server 53 public Dictionary<LLUUID, AssetRequest> RequestedAssets = new Dictionary<LLUUID, AssetRequest>(); //Assets requested from the asset server
53 public Dictionary<LLUUID, AssetRequest> RequestedTextures = new Dictionary<LLUUID, AssetRequest>(); //Textures requested from the asset server 54 public Dictionary<LLUUID, AssetRequest> RequestedTextures = new Dictionary<LLUUID, AssetRequest>(); //Textures requested from the asset server
54 55
56 public Dictionary<LLUUID, TextureSender> SendingTextures = new Dictionary<LLUUID, TextureSender>();
55 private IAssetServer _assetServer; 57 private IAssetServer _assetServer;
56 private Thread _assetCacheThread; 58 private Thread _assetCacheThread;
57 private LLUUID[] textureList = new LLUUID[5]; 59 private LLUUID[] textureList = new LLUUID[5];
@@ -155,8 +157,10 @@ namespace OpenSim.Caches
155 157
156 public void AddAsset(AssetBase asset) 158 public void AddAsset(AssetBase asset)
157 { 159 {
160 // Console.WriteLine("adding asset " + asset.FullID.ToStringHyphenated());
158 if (asset.Type == 0) 161 if (asset.Type == 0)
159 { 162 {
163 //Console.WriteLine("which is a texture");
160 if (!this.Textures.ContainsKey(asset.FullID)) 164 if (!this.Textures.ContainsKey(asset.FullID))
161 { //texture 165 { //texture
162 TextureImage textur = new TextureImage(asset); 166 TextureImage textur = new TextureImage(asset);
@@ -186,94 +190,42 @@ namespace OpenSim.Caches
186 return; 190 return;
187 } 191 }
188 int num; 192 int num;
193 num = this.TextureRequests.Count;
189 194
190 if (this.TextureRequests.Count < 5)
191 {
192 //lower than 5 so do all of them
193 num = this.TextureRequests.Count;
194 }
195 else
196 {
197 num = 5;
198 }
199 AssetRequest req; 195 AssetRequest req;
200 for (int i = 0; i < num; i++) 196 for (int i = 0; i < num; i++)
201 { 197 {
202 req = (AssetRequest)this.TextureRequests[i]; 198 req = (AssetRequest)this.TextureRequests[i];
203 if (req.PacketCounter != req.NumPackets) 199 if (!this.SendingTextures.ContainsKey(req.ImageInfo.FullID))
204 { 200 {
205 // if (req.ImageInfo.FullID == new LLUUID("00000000-0000-0000-5005-000000000005")) 201 TextureSender sender = new TextureSender(req);
206 if (req.PacketCounter == 0) 202 sender.OnComplete += this.TextureSent;
203 lock (this.SendingTextures)
207 { 204 {
208 //first time for this request so send imagedata packet 205 this.SendingTextures.Add(req.ImageInfo.FullID, sender);
209 if (req.NumPackets == 1)
210 {
211 //only one packet so send whole file
212 ImageDataPacket im = new ImageDataPacket();
213 im.ImageID.Packets = 1;
214 im.ImageID.ID = req.ImageInfo.FullID;
215 im.ImageID.Size = (uint)req.ImageInfo.Data.Length;
216 im.ImageData.Data = req.ImageInfo.Data;
217 im.ImageID.Codec = 2;
218 req.RequestUser.OutPacket(im);
219 req.PacketCounter++;
220 //req.ImageInfo.l= time;
221 //System.Console.WriteLine("sent texture: "+req.image_info.FullID);
222 }
223 else
224 {
225 //more than one packet so split file up
226 ImageDataPacket im = new ImageDataPacket();
227 im.ImageID.Packets = (ushort)req.NumPackets;
228 im.ImageID.ID = req.ImageInfo.FullID;
229 im.ImageID.Size = (uint)req.ImageInfo.Data.Length;
230 im.ImageData.Data = new byte[600];
231 Array.Copy(req.ImageInfo.Data, 0, im.ImageData.Data, 0, 600);
232 im.ImageID.Codec = 2;
233 req.RequestUser.OutPacket(im);
234 req.PacketCounter++;
235 //req.ImageInfo.last_used = time;
236 //System.Console.WriteLine("sent first packet of texture:
237 }
238 }
239 else
240 {
241 //send imagepacket
242 //more than one packet so split file up
243 ImagePacketPacket im = new ImagePacketPacket();
244 im.ImageID.Packet = (ushort)req.PacketCounter;
245 im.ImageID.ID = req.ImageInfo.FullID;
246 int size = req.ImageInfo.Data.Length - 600 - 1000 * (req.PacketCounter - 1);
247 if (size > 1000) size = 1000;
248 im.ImageData.Data = new byte[size];
249 Array.Copy(req.ImageInfo.Data, 600 + 1000 * (req.PacketCounter - 1), im.ImageData.Data, 0, size);
250 req.RequestUser.OutPacket(im);
251 req.PacketCounter++;
252 //req.ImageInfo.last_used = time;
253 //System.Console.WriteLine("sent a packet of texture: "+req.image_info.FullID);
254 } 206 }
255 } 207 }
208
256 } 209 }
257 210
258 //remove requests that have been completed 211 this.TextureRequests.Clear();
259 int count = 0; 212 }
260 for (int i = 0; i < num; i++) 213
214 /// <summary>
215 /// Event handler, called by a TextureSender object to say that texture has been sent
216 /// </summary>
217 /// <param name="sender"></param>
218 public void TextureSent(AssetCache.TextureSender sender)
219 {
220 if (this.SendingTextures.ContainsKey(sender.request.ImageInfo.FullID))
261 { 221 {
262 if (this.TextureRequests.Count > count) 222 lock (this.SendingTextures)
263 { 223 {
264 req = (AssetRequest)this.TextureRequests[count]; 224 this.SendingTextures.Remove(sender.request.ImageInfo.FullID);
265 if (req.PacketCounter == req.NumPackets)
266 {
267 this.TextureRequests.Remove(req);
268 }
269 else
270 {
271 count++;
272 }
273 } 225 }
274 } 226 }
275
276 } 227 }
228
277 public void AssetReceived(AssetBase asset, bool IsTexture) 229 public void AssetReceived(AssetBase asset, bool IsTexture)
278 { 230 {
279 if (asset.FullID != LLUUID.Zero) // if it is set to zero then the asset wasn't found by the server 231 if (asset.FullID != LLUUID.Zero) // if it is set to zero then the asset wasn't found by the server
@@ -343,6 +295,7 @@ namespace OpenSim.Caches
343 { 295 {
344 LLUUID requestID = new LLUUID(transferRequest.TransferInfo.Params, 0); 296 LLUUID requestID = new LLUUID(transferRequest.TransferInfo.Params, 0);
345 //check to see if asset is in local cache, if not we need to request it from asset server. 297 //check to see if asset is in local cache, if not we need to request it from asset server.
298
346 if (!this.Assets.ContainsKey(requestID)) 299 if (!this.Assets.ContainsKey(requestID))
347 { 300 {
348 //not found asset 301 //not found asset
@@ -481,6 +434,7 @@ namespace OpenSim.Caches
481 /// <param name="imageID"></param> 434 /// <param name="imageID"></param>
482 public void AddTextureRequest(IClientAPI userInfo, LLUUID imageID) 435 public void AddTextureRequest(IClientAPI userInfo, LLUUID imageID)
483 { 436 {
437 //Console.WriteLine("texture request for " + imageID.ToStringHyphenated());
484 //check to see if texture is in local cache, if not request from asset server 438 //check to see if texture is in local cache, if not request from asset server
485 if (!this.Textures.ContainsKey(imageID)) 439 if (!this.Textures.ContainsKey(imageID))
486 { 440 {
@@ -497,6 +451,7 @@ namespace OpenSim.Caches
497 return; 451 return;
498 } 452 }
499 453
454 //Console.WriteLine("texture already in cache");
500 TextureImage imag = this.Textures[imageID]; 455 TextureImage imag = this.Textures[imageID];
501 AssetRequest req = new AssetRequest(); 456 AssetRequest req = new AssetRequest();
502 req.RequestUser = userInfo; 457 req.RequestUser = userInfo;
@@ -611,6 +566,98 @@ namespace OpenSim.Caches
611 Description = aBase.Description; 566 Description = aBase.Description;
612 } 567 }
613 } 568 }
569
570 public class TextureSender
571 {
572 public AssetRequest request;
573 public event DownloadComplete OnComplete;
574
575 public TextureSender(AssetRequest req)
576 {
577 request = req;
578 //Console.WriteLine("creating worker thread for texture " + req.ImageInfo.FullID.ToStringHyphenated());
579 //Console.WriteLine("texture data length is " + req.ImageInfo.Data.Length);
580 // Console.WriteLine("in " + req.NumPackets + " packets");
581 ThreadPool.QueueUserWorkItem(new WaitCallback(SendTexture), new object());
582 }
583
584 public void SendTexture(Object obj)
585 {
586 //Console.WriteLine("starting to send sending texture " + request.ImageInfo.FullID.ToStringHyphenated());
587 while (request.PacketCounter != request.NumPackets)
588 {
589 SendPacket();
590 Thread.Sleep(500);
591 }
592
593 //Console.WriteLine("finished sending texture " + request.ImageInfo.FullID.ToStringHyphenated());
594 if (OnComplete != null)
595 {
596 OnComplete(this);
597 }
598 }
599
600 public void SendPacket()
601 {
602 AssetRequest req = request;
603 // Console.WriteLine("sending " + req.ImageInfo.FullID);
604
605 // if (req.ImageInfo.FullID == new LLUUID("00000000-0000-0000-5005-000000000005"))
606 if (req.PacketCounter == 0)
607 {
608 //first time for this request so send imagedata packet
609 if (req.NumPackets == 1)
610 {
611 //only one packet so send whole file
612 ImageDataPacket im = new ImageDataPacket();
613 im.ImageID.Packets = 1;
614 im.ImageID.ID = req.ImageInfo.FullID;
615 im.ImageID.Size = (uint)req.ImageInfo.Data.Length;
616 im.ImageData.Data = req.ImageInfo.Data;
617 im.ImageID.Codec = 2;
618 req.RequestUser.OutPacket(im);
619 req.PacketCounter++;
620 //req.ImageInfo.l= time;
621 //System.Console.WriteLine("sent texture: " + req.ImageInfo.FullID);
622 // Console.WriteLine("sending packet 1 for " + req.ImageInfo.FullID.ToStringHyphenated());
623 }
624 else
625 {
626 //more than one packet so split file up
627 ImageDataPacket im = new ImageDataPacket();
628 im.ImageID.Packets = (ushort)req.NumPackets;
629 im.ImageID.ID = req.ImageInfo.FullID;
630 im.ImageID.Size = (uint)req.ImageInfo.Data.Length;
631 im.ImageData.Data = new byte[600];
632 Array.Copy(req.ImageInfo.Data, 0, im.ImageData.Data, 0, 600);
633 im.ImageID.Codec = 2;
634 req.RequestUser.OutPacket(im);
635 req.PacketCounter++;
636 //req.ImageInfo.last_used = time;
637 //System.Console.WriteLine("sent first packet of texture:
638 // Console.WriteLine("sending packet 1 for " + req.ImageInfo.FullID.ToStringHyphenated());
639 }
640 }
641 else
642 {
643 //Console.WriteLine("sending packet" + req.PacketCounter + "for " + req.ImageInfo.FullID.ToStringHyphenated());
644 //send imagepacket
645 //more than one packet so split file up
646 ImagePacketPacket im = new ImagePacketPacket();
647 im.ImageID.Packet = (ushort)req.PacketCounter;
648 im.ImageID.ID = req.ImageInfo.FullID;
649 int size = req.ImageInfo.Data.Length - 600 - 1000 * (req.PacketCounter - 1);
650 if (size > 1000) size = 1000;
651 im.ImageData.Data = new byte[size];
652 Array.Copy(req.ImageInfo.Data, 600 + 1000 * (req.PacketCounter - 1), im.ImageData.Data, 0, size);
653 req.RequestUser.OutPacket(im);
654 req.PacketCounter++;
655 //req.ImageInfo.last_used = time;
656 //System.Console.WriteLine("sent a packet of texture: "+req.image_info.FullID);
657 }
658
659 }
660 }
614 } 661 }
615} 662}
616 663