aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Framework/Communications/Cache/AssetCache.cs168
-rw-r--r--OpenSim/Framework/General/Interfaces/IClientAPI.cs28
-rw-r--r--OpenSim/Region/Application/OpenSimMain.cs6
-rw-r--r--OpenSim/Region/ClientStack/ClientView.API.cs1
-rw-r--r--OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs14
-rw-r--r--OpenSim/Region/Environment/ModuleLoader.cs3
-rw-r--r--OpenSim/Region/Environment/Modules/AssetDownloadModule.cs2
-rw-r--r--OpenSim/Region/Environment/Modules/InstantMessageModule.cs17
-rw-r--r--OpenSim/Region/Environment/Modules/TextureDownloadModule.cs197
-rw-r--r--OpenSim/Region/Environment/Modules/WorldCommModule.cs2
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneManager.cs17
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectPart.cs4
-rw-r--r--OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs1
13 files changed, 360 insertions, 100 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}
diff --git a/OpenSim/Framework/General/Interfaces/IClientAPI.cs b/OpenSim/Framework/General/Interfaces/IClientAPI.cs
index 7cb18e5..8aae3c2 100644
--- a/OpenSim/Framework/General/Interfaces/IClientAPI.cs
+++ b/OpenSim/Framework/General/Interfaces/IClientAPI.cs
@@ -136,6 +136,33 @@ namespace OpenSim.Framework.Interfaces
136 } 136 }
137 } 137 }
138 138
139 public class TextureRequestArgs : EventArgs
140 {
141 protected LLUUID m_requestedAssetID;
142 private sbyte m_discardLevel;
143 private uint m_packetNumber;
144
145 public uint PacketNumber
146 {
147 get { return m_packetNumber; }
148 set { m_packetNumber = value; }
149 }
150
151 public sbyte DiscardLevel
152 {
153 get { return m_discardLevel; }
154 set { m_discardLevel = value; }
155 }
156
157 public LLUUID RequestedAssetID
158 {
159 get { return m_requestedAssetID; }
160 set { m_requestedAssetID = value; }
161 }
162 }
163
164 public delegate void TextureRequest(Object sender, TextureRequestArgs e);
165
139 public delegate void ImprovedInstantMessage(LLUUID fromAgentID, LLUUID fromAgentSession, LLUUID toAgentID, LLUUID imSessionID, uint timestamp, string fromAgentName, string message, byte dialog); // Cut down from full list 166 public delegate void ImprovedInstantMessage(LLUUID fromAgentID, LLUUID fromAgentSession, LLUUID toAgentID, LLUUID imSessionID, uint timestamp, string fromAgentName, string message, byte dialog); // Cut down from full list
140 public delegate void RezObject(IClientAPI remoteClient, LLUUID itemID, LLVector3 pos); 167 public delegate void RezObject(IClientAPI remoteClient, LLUUID itemID, LLVector3 pos);
141 public delegate void ModifyTerrain(float height, float seconds, byte size, byte action, float north, float west, IClientAPI remoteClient); 168 public delegate void ModifyTerrain(float height, float seconds, byte size, byte action, float north, float west, IClientAPI remoteClient);
@@ -204,6 +231,7 @@ namespace OpenSim.Framework.Interfaces
204 { 231 {
205 event ImprovedInstantMessage OnInstantMessage; 232 event ImprovedInstantMessage OnInstantMessage;
206 event ChatFromViewer OnChatFromViewer; 233 event ChatFromViewer OnChatFromViewer;
234 event TextureRequest OnRequestTexture;
207 event RezObject OnRezObject; 235 event RezObject OnRezObject;
208 event ModifyTerrain OnModifyTerrain; 236 event ModifyTerrain OnModifyTerrain;
209 event SetAppearance OnSetAppearance; 237 event SetAppearance OnSetAppearance;
diff --git a/OpenSim/Region/Application/OpenSimMain.cs b/OpenSim/Region/Application/OpenSimMain.cs
index bb26cae..8ea9347 100644
--- a/OpenSim/Region/Application/OpenSimMain.cs
+++ b/OpenSim/Region/Application/OpenSimMain.cs
@@ -149,11 +149,6 @@ namespace OpenSim
149 149
150 config.Set("asset_database", "sqlite"); 150 config.Set("asset_database", "sqlite");
151 151
152 // wtf?
153 config.Set("default_modules", true);
154 config.Set("default_shared_modules", true);
155 config.Set("except_modules", "");
156 config.Set("except_shared_modules", "");
157 } 152 }
158 153
159 if (m_config.Configs["StandAlone"] == null) 154 if (m_config.Configs["StandAlone"] == null)
@@ -195,6 +190,7 @@ namespace OpenSim
195 m_networkServersInfo = new NetworkServersInfo(); 190 m_networkServersInfo = new NetworkServersInfo();
196 191
197 IConfig startupConfig = m_config.Configs["Startup"]; 192 IConfig startupConfig = m_config.Configs["Startup"];
193
198 if (startupConfig != null) 194 if (startupConfig != null)
199 { 195 {
200 m_sandbox = !startupConfig.GetBoolean("gridmode", false); 196 m_sandbox = !startupConfig.GetBoolean("gridmode", false);
diff --git a/OpenSim/Region/ClientStack/ClientView.API.cs b/OpenSim/Region/ClientStack/ClientView.API.cs
index 74f1824..ba8bf02 100644
--- a/OpenSim/Region/ClientStack/ClientView.API.cs
+++ b/OpenSim/Region/ClientStack/ClientView.API.cs
@@ -46,6 +46,7 @@ namespace OpenSim.Region.ClientStack
46 public event ViewerEffectEventHandler OnViewerEffect; 46 public event ViewerEffectEventHandler OnViewerEffect;
47 public event ImprovedInstantMessage OnInstantMessage; 47 public event ImprovedInstantMessage OnInstantMessage;
48 public event ChatFromViewer OnChatFromViewer; 48 public event ChatFromViewer OnChatFromViewer;
49 public event TextureRequest OnRequestTexture;
49 public event RezObject OnRezObject; 50 public event RezObject OnRezObject;
50 public event GenericCall4 OnDeRezObject; 51 public event GenericCall4 OnDeRezObject;
51 public event ModifyTerrain OnModifyTerrain; 52 public event ModifyTerrain OnModifyTerrain;
diff --git a/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
index 65a0e44..8a1a520 100644
--- a/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
+++ b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
@@ -210,7 +210,7 @@ namespace OpenSim.Region.ClientStack
210 case PacketType.AgentSit: 210 case PacketType.AgentSit:
211 if (OnAgentSit != null) 211 if (OnAgentSit != null)
212 { 212 {
213 AgentSitPacket agentSit = (AgentSitPacket) Pack; 213 AgentSitPacket agentSit = (AgentSitPacket)Pack;
214 OnAgentSit(this, agentSit.AgentData.AgentID); 214 OnAgentSit(this, agentSit.AgentData.AgentID);
215 } 215 }
216 break; 216 break;
@@ -364,7 +364,17 @@ namespace OpenSim.Region.ClientStack
364 for (int i = 0; i < imageRequest.RequestImage.Length; i++) 364 for (int i = 0; i < imageRequest.RequestImage.Length; i++)
365 { 365 {
366 366
367 // Console.WriteLine("image request of "+ imageRequest.RequestImage[i].Image+ " at discard level " + imageRequest.RequestImage[i].DiscardLevel); 367 // still working on the Texture download module so for now using old method
368 // TextureRequestArgs args = new TextureRequestArgs();
369 // args.RequestedAssetID = imageRequest.RequestImage[i].Image;
370 // args.DiscardLevel = imageRequest.RequestImage[i].DiscardLevel;
371 // args.PacketNumber = imageRequest.RequestImage[i].Packet;
372
373 // if (OnRequestTexture != null)
374 // {
375 // OnRequestTexture(this, args);
376 // }
377
368 m_assetCache.AddTextureRequest(this, imageRequest.RequestImage[i].Image, imageRequest.RequestImage[i].Packet, imageRequest.RequestImage[i].DiscardLevel); 378 m_assetCache.AddTextureRequest(this, imageRequest.RequestImage[i].Image, imageRequest.RequestImage[i].Packet, imageRequest.RequestImage[i].DiscardLevel);
369 } 379 }
370 break; 380 break;
diff --git a/OpenSim/Region/Environment/ModuleLoader.cs b/OpenSim/Region/Environment/ModuleLoader.cs
index 160b740..442ee77 100644
--- a/OpenSim/Region/Environment/ModuleLoader.cs
+++ b/OpenSim/Region/Environment/ModuleLoader.cs
@@ -79,6 +79,9 @@ namespace OpenSim.Region.Environment
79 79
80 AvatarFactoryModule avatarFactory = new AvatarFactoryModule(); 80 AvatarFactoryModule avatarFactory = new AvatarFactoryModule();
81 LoadedSharedModules.Add(avatarFactory.Name, avatarFactory); 81 LoadedSharedModules.Add(avatarFactory.Name, avatarFactory);
82
83 //TextureDownloadModule textureModule = new TextureDownloadModule();
84 //LoadedSharedModules.Add(textureModule.Name, textureModule);
82 } 85 }
83 86
84 public void InitialiseSharedModules(Scene scene) 87 public void InitialiseSharedModules(Scene scene)
diff --git a/OpenSim/Region/Environment/Modules/AssetDownloadModule.cs b/OpenSim/Region/Environment/Modules/AssetDownloadModule.cs
index 440d948..3ce3e4e 100644
--- a/OpenSim/Region/Environment/Modules/AssetDownloadModule.cs
+++ b/OpenSim/Region/Environment/Modules/AssetDownloadModule.cs
@@ -62,7 +62,7 @@ namespace OpenSim.Region.Environment.Modules
62 62
63 public bool IsSharedModule 63 public bool IsSharedModule
64 { 64 {
65 get { return false; } 65 get { return true; }
66 } 66 }
67 67
68 public void NewClient(IClientAPI client) 68 public void NewClient(IClientAPI client)
diff --git a/OpenSim/Region/Environment/Modules/InstantMessageModule.cs b/OpenSim/Region/Environment/Modules/InstantMessageModule.cs
index 7c4e2c8..77ff24b 100644
--- a/OpenSim/Region/Environment/Modules/InstantMessageModule.cs
+++ b/OpenSim/Region/Environment/Modules/InstantMessageModule.cs
@@ -39,14 +39,17 @@ namespace OpenSim.Region.Environment.Modules
39 private List<Scene> m_scenes = new List<Scene>(); 39 private List<Scene> m_scenes = new List<Scene>();
40 private LogBase m_log; 40 private LogBase m_log;
41 41
42 public InstantMessageModule()
43 {
44 m_log = OpenSim.Framework.Console.MainLog.Instance;
45 }
46
42 public void Initialise(Scene scene, IConfigSource config) 47 public void Initialise(Scene scene, IConfigSource config)
43 { 48 {
44 if (!m_scenes.Contains(scene)) 49 if (!m_scenes.Contains(scene))
45 { 50 {
46 m_scenes.Add(scene); 51 m_scenes.Add(scene);
47 52 scene.EventManager.OnNewClient += OnNewClient;
48 scene.EventManager.OnNewClient += OnNewClient;
49 m_log = OpenSim.Framework.Console.MainLog.Instance;
50 } 53 }
51 } 54 }
52 55
@@ -69,9 +72,11 @@ namespace OpenSim.Region.Environment.Modules
69 { 72 {
70 // Local Message 73 // Local Message
71 ScenePresence user = (ScenePresence)m_scene.Entities[toAgentID]; 74 ScenePresence user = (ScenePresence)m_scene.Entities[toAgentID];
72 user.ControllingClient.SendInstantMessage(fromAgentID, fromAgentSession, message, 75 if (!user.IsChildAgent)
73 toAgentID, imSessionID, user.Firstname + " " + user.Lastname, dialog, timestamp); 76 {
74 77 user.ControllingClient.SendInstantMessage(fromAgentID, fromAgentSession, message,
78 toAgentID, imSessionID, fromAgentName, dialog, timestamp);
79 }
75 // Message sent 80 // Message sent
76 return; 81 return;
77 } 82 }
diff --git a/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs b/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs
index d3297c8..56e20d1 100644
--- a/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs
+++ b/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs
@@ -25,9 +25,14 @@
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26* 26*
27*/ 27*/
28 28using System;
29using System.Collections.Generic;
30using System.Threading;
29using libsecondlife; 31using libsecondlife;
32using libsecondlife.Packets;
30using OpenSim.Framework.Interfaces; 33using OpenSim.Framework.Interfaces;
34using OpenSim.Framework.Types;
35using OpenSim.Framework.Utilities;
31using OpenSim.Region.Environment.Interfaces; 36using OpenSim.Region.Environment.Interfaces;
32using OpenSim.Region.Environment.Scenes; 37using OpenSim.Region.Environment.Scenes;
33using Nini.Config; 38using Nini.Config;
@@ -37,15 +42,28 @@ namespace OpenSim.Region.Environment.Modules
37 public class TextureDownloadModule : IRegionModule 42 public class TextureDownloadModule : IRegionModule
38 { 43 {
39 private Scene m_scene; 44 private Scene m_scene;
45 private List<Scene> m_scenes = new List<Scene>();
46 private Dictionary<LLUUID, Dictionary<LLUUID, AssetRequest>> ClientRequests = new Dictionary<LLUUID, Dictionary<LLUUID, AssetRequest>>();
47
48 private BlockingQueue<TextureSender> QueueSenders = new BlockingQueue<TextureSender>();
49 private Dictionary<LLUUID, List<LLUUID>> InProcess = new Dictionary<LLUUID, List<LLUUID>>();
50 // private Thread m_thread;
40 51
41 public TextureDownloadModule() 52 public TextureDownloadModule()
42 { 53 {
54 // m_thread = new Thread(new ThreadStart(ProcessTextureSenders));
55 // m_thread.IsBackground = true;
56 // m_thread.Start();
43 } 57 }
44 58
45 public void Initialise(Scene scene, IConfigSource config) 59 public void Initialise(Scene scene, IConfigSource config)
46 { 60 {
47 m_scene = scene; 61 if (!m_scenes.Contains(scene))
48 m_scene.EventManager.OnNewClient += NewClient; 62 {
63 m_scenes.Add(scene);
64 m_scene = scene;
65 m_scene.EventManager.OnNewClient += NewClient;
66 }
49 } 67 }
50 68
51 public void PostInitialise() 69 public void PostInitialise()
@@ -63,15 +81,184 @@ namespace OpenSim.Region.Environment.Modules
63 81
64 public bool IsSharedModule 82 public bool IsSharedModule
65 { 83 {
66 get { return false; } 84 get { return true; }
67 } 85 }
68 86
69 public void NewClient(IClientAPI client) 87 public void NewClient(IClientAPI client)
70 { 88 {
89 /* lock (ClientRequests)
90 {
91 if (!ClientRequests.ContainsKey(client.AgentId))
92 {
93 ClientRequests.Add(client.AgentId, new Dictionary<LLUUID, AssetRequest>());
94 InProcess.Add(client.AgentId, new List<LLUUID>());
95 }
96 }
97 client.OnRequestTexture += TextureRequest;
98 */
99 }
100
101 public void TextureCallback(LLUUID textureID, AssetBase asset)
102 {
103 lock (ClientRequests)
104 {
105 foreach (Dictionary<LLUUID, AssetRequest> reqList in ClientRequests.Values)
106 {
107 if (reqList.ContainsKey(textureID))
108 {
109 //check the texture isn't already in the process of being sent to the client.
110 if (!InProcess[reqList[textureID].RequestUser.AgentId].Contains(textureID))
111 {
112 TextureSender sender = new TextureSender(reqList[textureID], asset);
113 QueueSenders.Enqueue(sender);
114 InProcess[reqList[textureID].RequestUser.AgentId].Add(textureID);
115 reqList.Remove(textureID);
116 }
117 }
118 }
119 }
120 }
121
122 public void TextureRequest(Object sender, TextureRequestArgs e)
123 {
124 IClientAPI client = (IClientAPI)sender;
125 if (!ClientRequests[client.AgentId].ContainsKey(e.RequestedAssetID))
126 {
127 lock (ClientRequests)
128 {
129 AssetRequest request = new AssetRequest(client, e.RequestedAssetID, e.DiscardLevel, e.PacketNumber);
130 ClientRequests[client.AgentId].Add(e.RequestedAssetID, request);
131 }
132 m_scene.commsManager.AssetCache.GetAsset(e.RequestedAssetID, TextureCallback);
133 }
134 }
135
136 public void ProcessTextureSenders()
137 {
138 while (true)
139 {
140 TextureSender sender = this.QueueSenders.Dequeue();
141 bool finished = sender.SendTexture();
142 if (finished)
143 {
144 this.TextureSent(sender);
145 }
146 else
147 {
148 this.QueueSenders.Enqueue(sender);
149 }
150 }
151 }
152
153 private void TextureSent(TextureSender sender)
154 {
155 if (InProcess[sender.request.RequestUser.AgentId].Contains(sender.request.RequestAssetID))
156 {
157 InProcess[sender.request.RequestUser.AgentId].Remove(sender.request.RequestAssetID);
158 }
159 }
160
161 public class TextureSender
162 {
163 public AssetRequest request;
164 private int counter = 0;
165 private AssetBase m_asset;
166 public long DataPointer = 0;
167 public int NumPackets = 0;
168 public int PacketCounter = 0;
169
170 public TextureSender(AssetRequest req, AssetBase asset)
171 {
172 request = req;
173 m_asset = asset;
174
175 if (asset.Data.LongLength > 600)
176 {
177 NumPackets = 2 + (int)(asset.Data.Length - 601) / 1000;
178 }
179 else
180 {
181 NumPackets = 1;
182 }
183
184 PacketCounter = (int) req.PacketNumber;
185 }
186
187 public bool SendTexture()
188 {
189 SendPacket();
190 counter++;
191 if ((PacketCounter >= NumPackets) | counter > 100 | (NumPackets == 1) | (request.DiscardLevel == -1))
192 {
193 return true;
194 }
195 return false;
196 }
197
198 public void SendPacket()
199 {
200 AssetRequest req = request;
201 if (PacketCounter == 0)
202 {
203 if (NumPackets == 1)
204 {
205 ImageDataPacket im = new ImageDataPacket();
206 im.Header.Reliable = false;
207 im.ImageID.Packets = 1;
208 im.ImageID.ID = m_asset.FullID;
209 im.ImageID.Size = (uint)m_asset.Data.Length;
210 im.ImageData.Data = m_asset.Data;
211 im.ImageID.Codec = 2;
212 req.RequestUser.OutPacket(im);
213 PacketCounter++;
214 }
215 else
216 {
217 ImageDataPacket im = new ImageDataPacket();
218 im.Header.Reliable = false;
219 im.ImageID.Packets = (ushort)(NumPackets);
220 im.ImageID.ID = m_asset.FullID;
221 im.ImageID.Size = (uint)m_asset.Data.Length;
222 im.ImageData.Data = new byte[600];
223 Array.Copy(m_asset.Data, 0, im.ImageData.Data, 0, 600);
224 im.ImageID.Codec = 2;
225 req.RequestUser.OutPacket(im);
226 PacketCounter++;
227 }
228 }
229 else
230 {
231 ImagePacketPacket im = new ImagePacketPacket();
232 im.Header.Reliable = false;
233 im.ImageID.Packet = (ushort)(PacketCounter);
234 im.ImageID.ID = m_asset.FullID;
235 int size = m_asset.Data.Length - 600 - (1000 * (PacketCounter - 1));
236 if (size > 1000) size = 1000;
237 im.ImageData.Data = new byte[size];
238 Array.Copy(m_asset.Data, 600 + (1000 * (PacketCounter - 1)), im.ImageData.Data, 0, size);
239 req.RequestUser.OutPacket(im);
240 PacketCounter++;
241 }
242
243 }
244
71 } 245 }
72 246
73 public void TextureAssetCallback(LLUUID texture, byte[] data) 247 public class AssetRequest
74 { 248 {
249 public IClientAPI RequestUser;
250 public LLUUID RequestAssetID;
251 public int DiscardLevel = -1;
252 public uint PacketNumber = 0;
253
254 public AssetRequest(IClientAPI client, LLUUID textureID, int discardLevel, uint packetNumber)
255 {
256 RequestUser = client;
257 RequestAssetID = textureID;
258 DiscardLevel = discardLevel;
259 PacketNumber = packetNumber;
260 }
75 } 261 }
262
76 } 263 }
77} 264}
diff --git a/OpenSim/Region/Environment/Modules/WorldCommModule.cs b/OpenSim/Region/Environment/Modules/WorldCommModule.cs
index cf5bba3..c7e0f8f 100644
--- a/OpenSim/Region/Environment/Modules/WorldCommModule.cs
+++ b/OpenSim/Region/Environment/Modules/WorldCommModule.cs
@@ -87,13 +87,11 @@ namespace OpenSim.Region.Environment.Modules
87 87
88 public void Initialise(Scene scene, IConfigSource config) 88 public void Initialise(Scene scene, IConfigSource config)
89 { 89 {
90
91 m_scene = scene; 90 m_scene = scene;
92 m_scene.RegisterModuleInterface<IWorldComm>(this); 91 m_scene.RegisterModuleInterface<IWorldComm>(this);
93 m_listenerManager = new ListenerManager(); 92 m_listenerManager = new ListenerManager();
94 m_pending = new Queue<ListenerInfo>(); 93 m_pending = new Queue<ListenerInfo>();
95 m_scene.EventManager.OnNewClient += NewClient; 94 m_scene.EventManager.OnNewClient += NewClient;
96
97 } 95 }
98 96
99 public void PostInitialise() 97 public void PostInitialise()
diff --git a/OpenSim/Region/Environment/Scenes/SceneManager.cs b/OpenSim/Region/Environment/Scenes/SceneManager.cs
index 7db6927..76ff6cf 100644
--- a/OpenSim/Region/Environment/Scenes/SceneManager.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneManager.cs
@@ -274,6 +274,23 @@ namespace OpenSim.Region.Environment.Scenes
274 return false; 274 return false;
275 } 275 }
276 276
277 public bool TryGetAvatarsScene(LLUUID avatarId, out Scene scene)
278 {
279 ScenePresence avatar = null;
280 foreach (Scene mScene in m_localScenes)
281 {
282 if (mScene.TryGetAvatar(avatarId, out avatar))
283 {
284 scene = mScene;
285 return true;
286 }
287 }
288
289 scene = null;
290 return false;
291 }
292
293
277 public void CloseScene(Scene scene) 294 public void CloseScene(Scene scene)
278 { 295 {
279 m_localScenes.Remove(scene); 296 m_localScenes.Remove(scene);
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
index 58d2157..a0d1d2a 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
@@ -125,7 +125,7 @@ namespace OpenSim.Region.Environment.Scenes
125 set { m_name = value; } 125 set { m_name = value; }
126 } 126 }
127 127
128 protected LLObject.ObjectFlags m_flags; 128 protected LLObject.ObjectFlags m_flags =0;
129 129
130 public uint ObjectFlags 130 public uint ObjectFlags
131 { 131 {
@@ -133,7 +133,7 @@ namespace OpenSim.Region.Environment.Scenes
133 set { m_flags = (LLObject.ObjectFlags) value; } 133 set { m_flags = (LLObject.ObjectFlags) value; }
134 } 134 }
135 135
136 protected LLObject.MaterialType m_material; 136 protected LLObject.MaterialType m_material =0;
137 137
138 public byte Material 138 public byte Material
139 { 139 {
diff --git a/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs
index 7962698..b935f24 100644
--- a/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs
+++ b/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs
@@ -53,6 +53,7 @@ namespace SimpleApp
53 53
54 public event ImprovedInstantMessage OnInstantMessage; 54 public event ImprovedInstantMessage OnInstantMessage;
55 public event ChatFromViewer OnChatFromViewer; 55 public event ChatFromViewer OnChatFromViewer;
56 public event TextureRequest OnRequestTexture;
56 public event RezObject OnRezObject; 57 public event RezObject OnRezObject;
57 public event ModifyTerrain OnModifyTerrain; 58 public event ModifyTerrain OnModifyTerrain;
58 public event SetAppearance OnSetAppearance; 59 public event SetAppearance OnSetAppearance;