aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework/Communications/Cache/AssetCache.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Framework/Communications/Cache/AssetCache.cs')
-rw-r--r--OpenSim/Framework/Communications/Cache/AssetCache.cs168
1 files changed, 91 insertions, 77 deletions
diff --git a/OpenSim/Framework/Communications/Cache/AssetCache.cs b/OpenSim/Framework/Communications/Cache/AssetCache.cs
index a950f51..4c18744 100644
--- a/OpenSim/Framework/Communications/Cache/AssetCache.cs
+++ b/OpenSim/Framework/Communications/Cache/AssetCache.cs
@@ -42,6 +42,8 @@ namespace OpenSim.Framework.Communications.Cache
42{ 42{
43 public delegate void DownloadComplete(AssetCache.TextureSender sender); 43 public delegate void DownloadComplete(AssetCache.TextureSender sender);
44 44
45 public delegate void AssetRequestCallback(LLUUID assetID, AssetBase asset);
46
45 /// <summary> 47 /// <summary>
46 /// Manages local cache of assets and their sending to viewers. 48 /// Manages local cache of assets and their sending to viewers.
47 /// </summary> 49 /// </summary>
@@ -63,6 +65,8 @@ namespace OpenSim.Framework.Communications.Cache
63 65
64 private Dictionary<LLUUID, Dictionary<LLUUID, int>> TimesTextureSent = new Dictionary<LLUUID, Dictionary<LLUUID, int>>(); 66 private Dictionary<LLUUID, Dictionary<LLUUID, int>> TimesTextureSent = new Dictionary<LLUUID, Dictionary<LLUUID, int>>();
65 67
68 public Dictionary<LLUUID, AssetRequestsList> RequestLists = new Dictionary<LLUUID, AssetRequestsList>();
69
66 private IAssetServer _assetServer; 70 private IAssetServer _assetServer;
67 private Thread _assetCacheThread; 71 private Thread _assetCacheThread;
68 72
@@ -123,6 +127,46 @@ namespace OpenSim.Framework.Communications.Cache
123 return asset; 127 return asset;
124 } 128 }
125 129
130 public void GetAsset(LLUUID assetID, AssetRequestCallback callback)
131 {
132 AssetBase asset = null;
133 if (this.Textures.ContainsKey(assetID))
134 {
135 asset = this.Textures[assetID];
136 }
137 else if (this.Assets.ContainsKey(assetID))
138 {
139 asset = this.Assets[assetID];
140 }
141
142 if (asset != null)
143 {
144 callback(assetID, asset);
145 }
146 else
147 {
148 NewAssetRequest req = new NewAssetRequest(assetID, callback);
149 if (this.RequestLists.ContainsKey(assetID))
150 {
151 lock (RequestLists)
152 {
153 RequestLists[assetID].Requests.Add(req);
154 }
155 }
156 else
157 {
158 AssetRequestsList reqList = new AssetRequestsList(assetID);
159 reqList.Requests.Add(req);
160 lock (RequestLists)
161 {
162 RequestLists.Add(assetID, reqList);
163 }
164 }
165 this._assetServer.FetchAsset(assetID, false);
166 }
167 }
168
169
126 public AssetBase GetAsset(LLUUID assetID, bool isTexture) 170 public AssetBase GetAsset(LLUUID assetID, bool isTexture)
127 { 171 {
128 AssetBase asset = GetAsset(assetID); 172 AssetBase asset = GetAsset(assetID);
@@ -135,7 +179,7 @@ namespace OpenSim.Framework.Communications.Cache
135 179
136 public void AddAsset(AssetBase asset) 180 public void AddAsset(AssetBase asset)
137 { 181 {
138 // System.Console.WriteLine("adding asset " + asset.FullID.ToStringHyphenated()); 182 //System.Console.WriteLine("adding asset " + asset.FullID.ToStringHyphenated());
139 if (asset.Type == 0) 183 if (asset.Type == 0)
140 { 184 {
141 //Console.WriteLine("which is a texture"); 185 //Console.WriteLine("which is a texture");
@@ -207,26 +251,7 @@ namespace OpenSim.Framework.Communications.Cache
207 while (true) 251 while (true)
208 { 252 {
209 TextureSender sender = this.QueueTextures.Dequeue(); 253 TextureSender sender = this.QueueTextures.Dequeue();
210 /* if (TimesTextureSent.ContainsKey(sender.request.RequestUser.AgentId)) 254
211 {
212 if (TimesTextureSent[sender.request.RequestUser.AgentId].ContainsKey(sender.request.ImageInfo.FullID))
213 {
214 TimesTextureSent[sender.request.RequestUser.AgentId][sender.request.ImageInfo.FullID]++;
215 }
216 else
217 {
218 TimesTextureSent[sender.request.RequestUser.AgentId].Add(sender.request.ImageInfo.FullID, 1);
219 }
220 }
221 else
222 {
223 Dictionary<LLUUID, int> UsersSent = new Dictionary<LLUUID,int>();
224 TimesTextureSent.Add(sender.request.RequestUser.AgentId, UsersSent );
225 UsersSent.Add(sender.request.ImageInfo.FullID, 1);
226
227 }
228 if (TimesTextureSent[sender.request.RequestUser.AgentId][sender.request.ImageInfo.FullID] < 1000)
229 {*/
230 bool finished = sender.SendTexture(); 255 bool finished = sender.SendTexture();
231 if (finished) 256 if (finished)
232 { 257 {
@@ -237,11 +262,7 @@ namespace OpenSim.Framework.Communications.Cache
237 // Console.WriteLine("readding texture"); 262 // Console.WriteLine("readding texture");
238 this.QueueTextures.Enqueue(sender); 263 this.QueueTextures.Enqueue(sender);
239 } 264 }
240 /* } 265
241 else
242 {
243 this.TextureSent(sender);
244 }*/
245 } 266 }
246 } 267 }
247 268
@@ -317,6 +338,21 @@ namespace OpenSim.Framework.Communications.Cache
317 } 338 }
318 } 339 }
319 } 340 }
341
342 if (RequestLists.ContainsKey(asset.FullID))
343 {
344 AssetRequestsList reqList = RequestLists[asset.FullID];
345 foreach (NewAssetRequest req in reqList.Requests)
346 {
347 req.Callback(asset.FullID, asset);
348 }
349
350 lock (RequestLists)
351 {
352 RequestLists.Remove(asset.FullID);
353 reqList.Requests.Clear();
354 }
355 }
320 } 356 }
321 } 357 }
322 358
@@ -508,17 +544,6 @@ namespace OpenSim.Framework.Communications.Cache
508 } 544 }
509 545
510 } 546 }
511
512 public AssetInfo CloneAsset(LLUUID newOwner, AssetInfo sourceAsset)
513 {
514 AssetInfo newAsset = new AssetInfo();
515 newAsset.Data = new byte[sourceAsset.Data.Length];
516 Array.Copy(sourceAsset.Data, newAsset.Data, sourceAsset.Data.Length);
517 newAsset.FullID = LLUUID.Random();
518 newAsset.Type = sourceAsset.Type;
519 newAsset.InvType = sourceAsset.InvType;
520 return (newAsset);
521 }
522 #endregion 547 #endregion
523 548
524 #region Textures 549 #region Textures
@@ -529,7 +554,7 @@ namespace OpenSim.Framework.Communications.Cache
529 /// <param name="imageID"></param> 554 /// <param name="imageID"></param>
530 public void AddTextureRequest(IClientAPI userInfo, LLUUID imageID, uint packetNumber, int discard) 555 public void AddTextureRequest(IClientAPI userInfo, LLUUID imageID, uint packetNumber, int discard)
531 { 556 {
532 //Console.WriteLine("texture request for " + imageID.ToStringHyphenated() + " packetnumber= " + packetNumber); 557 // System.Console.WriteLine("texture request for " + imageID.ToStringHyphenated() + " packetnumber= " + packetNumber);
533 //check to see if texture is in local cache, if not request from asset server 558 //check to see if texture is in local cache, if not request from asset server
534 if (!this.AvatarRecievedTextures.ContainsKey(userInfo.AgentId)) 559 if (!this.AvatarRecievedTextures.ContainsKey(userInfo.AgentId))
535 { 560 {
@@ -540,6 +565,7 @@ namespace OpenSim.Framework.Communications.Cache
540 //Console.WriteLine(userInfo.AgentId +" is requesting a image( "+ imageID+" that has already been sent to them"); 565 //Console.WriteLine(userInfo.AgentId +" is requesting a image( "+ imageID+" that has already been sent to them");
541 return; 566 return;
542 }*/ 567 }*/
568
543 if (!this.Textures.ContainsKey(imageID)) 569 if (!this.Textures.ContainsKey(imageID))
544 { 570 {
545 if (!this.RequestedTextures.ContainsKey(imageID)) 571 if (!this.RequestedTextures.ContainsKey(imageID))
@@ -556,7 +582,7 @@ namespace OpenSim.Framework.Communications.Cache
556 return; 582 return;
557 } 583 }
558 584
559 //Console.WriteLine("texture already in cache"); 585 // System.Console.WriteLine("texture already in cache");
560 TextureImage imag = this.Textures[imageID]; 586 TextureImage imag = this.Textures[imageID];
561 AssetRequest req = new AssetRequest(); 587 AssetRequest req = new AssetRequest();
562 req.RequestUser = userInfo; 588 req.RequestUser = userInfo;
@@ -583,46 +609,9 @@ namespace OpenSim.Framework.Communications.Cache
583 this.TextureRequests.Add(req); 609 this.TextureRequests.Add(req);
584 } 610 }
585 611
586 public TextureImage CloneImage(LLUUID newOwner, TextureImage source) 612
587 {
588 TextureImage newImage = new TextureImage();
589 newImage.Data = new byte[source.Data.Length];
590 Array.Copy(source.Data, newImage.Data, source.Data.Length);
591 //newImage.filename = source.filename;
592 newImage.FullID = LLUUID.Random();
593 newImage.Name = source.Name;
594 return (newImage);
595 }
596 #endregion 613 #endregion
597 614
598 private IAssetServer LoadAssetDll(string dllName)
599 {
600 Assembly pluginAssembly = Assembly.LoadFrom(dllName);
601 IAssetServer server = null;
602
603 foreach (Type pluginType in pluginAssembly.GetTypes())
604 {
605 if (pluginType.IsPublic)
606 {
607 if (!pluginType.IsAbstract)
608 {
609 Type typeInterface = pluginType.GetInterface("IAssetPlugin", true);
610
611 if (typeInterface != null)
612 {
613 IAssetPlugin plug = (IAssetPlugin)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
614 server = plug.GetAssetServer();
615 break;
616 }
617
618 typeInterface = null;
619 }
620 }
621 }
622 pluginAssembly = null;
623 return server;
624 }
625
626 public class AssetRequest 615 public class AssetRequest
627 { 616 {
628 public IClientAPI RequestUser; 617 public IClientAPI RequestUser;
@@ -779,4 +768,29 @@ namespace OpenSim.Framework.Communications.Cache
779 } 768 }
780 } 769 }
781 } 770 }
771
772 public class AssetRequestsList
773 {
774 public LLUUID AssetID;
775 public List<NewAssetRequest> Requests = new List<NewAssetRequest>();
776
777 public AssetRequestsList(LLUUID assetID)
778 {
779 AssetID = assetID;
780 }
781 }
782
783 public class NewAssetRequest
784 {
785 public LLUUID AssetID;
786 public AssetRequestCallback Callback;
787
788 public NewAssetRequest(LLUUID assetID, AssetRequestCallback callback)
789 {
790 AssetID = assetID;
791 Callback = callback;
792 }
793
794
795 }
782} 796}