diff options
Diffstat (limited to 'OpenSim/Region/Environment')
35 files changed, 2149 insertions, 2060 deletions
diff --git a/OpenSim/Region/Environment/Modules/Agent/AssetDownload/AssetDownloadModule.cs b/OpenSim/Region/Environment/Modules/Agent/AssetDownload/AssetDownloadModule.cs index 47c1479..33e917a 100644 --- a/OpenSim/Region/Environment/Modules/Agent/AssetDownload/AssetDownloadModule.cs +++ b/OpenSim/Region/Environment/Modules/Agent/AssetDownload/AssetDownloadModule.cs | |||
@@ -37,17 +37,18 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetDownload | |||
37 | { | 37 | { |
38 | public class AssetDownloadModule : IRegionModule | 38 | public class AssetDownloadModule : IRegionModule |
39 | { | 39 | { |
40 | /// <summary> | ||
41 | /// Asset requests with data which are ready to be sent back to requesters. This includes textures. | ||
42 | /// </summary> | ||
43 | private List<AssetRequest> AssetRequests; | ||
44 | |||
40 | private Scene m_scene; | 45 | private Scene m_scene; |
41 | private Dictionary<LLUUID, Scene> RegisteredScenes = new Dictionary<LLUUID, Scene>(); | 46 | private Dictionary<LLUUID, Scene> RegisteredScenes = new Dictionary<LLUUID, Scene>(); |
47 | |||
42 | /// | 48 | /// |
43 | /// Assets requests (for each user) which are waiting for asset server data. This includes texture requests | 49 | /// Assets requests (for each user) which are waiting for asset server data. This includes texture requests |
44 | /// </summary> | 50 | /// </summary> |
45 | private Dictionary<LLUUID, Dictionary<LLUUID,AssetRequest>> RequestedAssets; | 51 | private Dictionary<LLUUID, Dictionary<LLUUID, AssetRequest>> RequestedAssets; |
46 | |||
47 | /// <summary> | ||
48 | /// Asset requests with data which are ready to be sent back to requesters. This includes textures. | ||
49 | /// </summary> | ||
50 | private List<AssetRequest> AssetRequests; | ||
51 | 52 | ||
52 | public AssetDownloadModule() | 53 | public AssetDownloadModule() |
53 | { | 54 | { |
@@ -55,6 +56,8 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetDownload | |||
55 | AssetRequests = new List<AssetRequest>(); | 56 | AssetRequests = new List<AssetRequest>(); |
56 | } | 57 | } |
57 | 58 | ||
59 | #region IRegionModule Members | ||
60 | |||
58 | public void Initialise(Scene scene, IConfigSource config) | 61 | public void Initialise(Scene scene, IConfigSource config) |
59 | { | 62 | { |
60 | if (!RegisteredScenes.ContainsKey(scene.RegionInfo.RegionID)) | 63 | if (!RegisteredScenes.ContainsKey(scene.RegionInfo.RegionID)) |
@@ -92,6 +95,8 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetDownload | |||
92 | get { return true; } | 95 | get { return true; } |
93 | } | 96 | } |
94 | 97 | ||
98 | #endregion | ||
99 | |||
95 | public void NewClient(IClientAPI client) | 100 | public void NewClient(IClientAPI client) |
96 | { | 101 | { |
97 | // client.OnRequestAsset += AddAssetRequest; | 102 | // client.OnRequestAsset += AddAssetRequest; |
@@ -301,33 +306,37 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetDownload | |||
301 | { | 306 | { |
302 | // over max number of bytes so split up file | 307 | // over max number of bytes so split up file |
303 | long restData = data.LongLength - m_maxPacketSize; | 308 | long restData = data.LongLength - m_maxPacketSize; |
304 | int restPackets = (int)((restData + m_maxPacketSize - 1) / m_maxPacketSize); | 309 | int restPackets = (int) ((restData + m_maxPacketSize - 1) / m_maxPacketSize); |
305 | numPackets += restPackets; | 310 | numPackets += restPackets; |
306 | } | 311 | } |
307 | 312 | ||
308 | return numPackets; | 313 | return numPackets; |
309 | } | 314 | } |
310 | 315 | ||
316 | #region Nested type: AssetRequest | ||
317 | |||
311 | public class AssetRequest | 318 | public class AssetRequest |
312 | { | 319 | { |
313 | public IClientAPI RequestUser; | ||
314 | public LLUUID RequestAssetID; | ||
315 | public AssetBase AssetInf; | 320 | public AssetBase AssetInf; |
316 | public AssetBase ImageInfo; | 321 | public byte AssetRequestSource = 2; |
317 | public LLUUID TransferRequestID; | ||
318 | public long DataPointer = 0; | 322 | public long DataPointer = 0; |
323 | public int DiscardLevel = -1; | ||
324 | public AssetBase ImageInfo; | ||
325 | public bool IsTextureRequest; | ||
319 | public int NumPackets = 0; | 326 | public int NumPackets = 0; |
320 | public int PacketCounter = 0; | 327 | public int PacketCounter = 0; |
321 | public bool IsTextureRequest; | ||
322 | public byte AssetRequestSource = 2; | ||
323 | public byte[] Params = null; | 328 | public byte[] Params = null; |
329 | public LLUUID RequestAssetID; | ||
330 | public IClientAPI RequestUser; | ||
331 | public LLUUID TransferRequestID; | ||
324 | //public bool AssetInCache; | 332 | //public bool AssetInCache; |
325 | //public int TimeRequested; | 333 | //public int TimeRequested; |
326 | public int DiscardLevel = -1; | ||
327 | 334 | ||
328 | public AssetRequest() | 335 | public AssetRequest() |
329 | { | 336 | { |
330 | } | 337 | } |
331 | } | 338 | } |
339 | |||
340 | #endregion | ||
332 | } | 341 | } |
333 | } \ No newline at end of file | 342 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AgentAssetsTransactions.cs b/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AgentAssetsTransactions.cs index 74bb247..8192be4 100644 --- a/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AgentAssetsTransactions.cs +++ b/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AgentAssetsTransactions.cs | |||
@@ -42,12 +42,12 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
42 | { | 42 | { |
43 | //private static readonly log4net.ILog m_log | 43 | //private static readonly log4net.ILog m_log |
44 | // = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | 44 | // = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); |
45 | 45 | ||
46 | // Fields | 46 | // Fields |
47 | private bool m_dumpAssetsToFile; | ||
48 | public AgentAssetTransactionsManager Manager; | ||
47 | public LLUUID UserID; | 49 | public LLUUID UserID; |
48 | public Dictionary<LLUUID, AssetXferUploader> XferUploaders = new Dictionary<LLUUID, AssetXferUploader>(); | 50 | public Dictionary<LLUUID, AssetXferUploader> XferUploaders = new Dictionary<LLUUID, AssetXferUploader>(); |
49 | public AgentAssetTransactionsManager Manager; | ||
50 | private bool m_dumpAssetsToFile; | ||
51 | 51 | ||
52 | // Methods | 52 | // Methods |
53 | public AgentAssetTransactions(LLUUID agentID, AgentAssetTransactionsManager manager, bool dumpAssetsToFile) | 53 | public AgentAssetTransactions(LLUUID agentID, AgentAssetTransactionsManager manager, bool dumpAssetsToFile) |
@@ -67,7 +67,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
67 | { | 67 | { |
68 | XferUploaders.Add(transactionID, uploader); | 68 | XferUploaders.Add(transactionID, uploader); |
69 | } | 69 | } |
70 | 70 | ||
71 | return uploader; | 71 | return uploader; |
72 | } | 72 | } |
73 | return null; | 73 | return null; |
@@ -76,7 +76,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
76 | public void HandleXfer(ulong xferID, uint packetID, byte[] data) | 76 | public void HandleXfer(ulong xferID, uint packetID, byte[] data) |
77 | { | 77 | { |
78 | // AssetXferUploader uploaderFound = null; | 78 | // AssetXferUploader uploaderFound = null; |
79 | 79 | ||
80 | lock (XferUploaders) | 80 | lock (XferUploaders) |
81 | { | 81 | { |
82 | foreach (AssetXferUploader uploader in XferUploaders.Values) | 82 | foreach (AssetXferUploader uploader in XferUploaders.Values) |
@@ -86,7 +86,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
86 | uploader.HandleXferPacket(xferID, packetID, data); | 86 | uploader.HandleXferPacket(xferID, packetID, data); |
87 | break; | 87 | break; |
88 | } | 88 | } |
89 | } | 89 | } |
90 | } | 90 | } |
91 | } | 91 | } |
92 | 92 | ||
@@ -101,15 +101,15 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
101 | wearableType, nextOwnerMask); | 101 | wearableType, nextOwnerMask); |
102 | } | 102 | } |
103 | } | 103 | } |
104 | 104 | ||
105 | public void RequestUpdateInventoryItem(IClientAPI remoteClient, LLUUID transactionID, | 105 | public void RequestUpdateInventoryItem(IClientAPI remoteClient, LLUUID transactionID, |
106 | InventoryItemBase item) | 106 | InventoryItemBase item) |
107 | { | 107 | { |
108 | if (XferUploaders.ContainsKey(transactionID)) | 108 | if (XferUploaders.ContainsKey(transactionID)) |
109 | { | 109 | { |
110 | XferUploaders[transactionID].RequestUpdateInventoryItem(remoteClient, transactionID, item); | 110 | XferUploaders[transactionID].RequestUpdateInventoryItem(remoteClient, transactionID, item); |
111 | } | 111 | } |
112 | } | 112 | } |
113 | 113 | ||
114 | /// <summary> | 114 | /// <summary> |
115 | /// Get an uploaded asset. If the data is successfully retrieved, the transaction will be removed. | 115 | /// Get an uploaded asset. If the data is successfully retrieved, the transaction will be removed. |
@@ -122,40 +122,43 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
122 | { | 122 | { |
123 | AssetXferUploader uploader = XferUploaders[transactionID]; | 123 | AssetXferUploader uploader = XferUploaders[transactionID]; |
124 | AssetBase asset = uploader.GetAssetData(); | 124 | AssetBase asset = uploader.GetAssetData(); |
125 | 125 | ||
126 | lock (XferUploaders) | 126 | lock (XferUploaders) |
127 | { | 127 | { |
128 | XferUploaders.Remove(transactionID); | 128 | XferUploaders.Remove(transactionID); |
129 | } | 129 | } |
130 | 130 | ||
131 | return asset; | 131 | return asset; |
132 | } | 132 | } |
133 | 133 | ||
134 | return null; | 134 | return null; |
135 | } | 135 | } |
136 | 136 | ||
137 | // Nested Types | 137 | // Nested Types |
138 | |||
139 | #region Nested type: AssetXferUploader | ||
140 | |||
138 | public class AssetXferUploader | 141 | public class AssetXferUploader |
139 | { | 142 | { |
140 | // Fields | 143 | // Fields |
141 | public bool AddToInventory; | 144 | public bool AddToInventory; |
142 | public AssetBase Asset; | 145 | public AssetBase Asset; |
143 | public LLUUID InventFolder = LLUUID.Zero; | 146 | public LLUUID InventFolder = LLUUID.Zero; |
147 | private sbyte invType = 0; | ||
148 | private bool m_createItem = false; | ||
149 | private string m_description = String.Empty; | ||
150 | private bool m_dumpAssetToFile; | ||
151 | private bool m_finished = false; | ||
152 | private string m_name = String.Empty; | ||
153 | private bool m_storeLocal; | ||
154 | private AgentAssetTransactions m_userTransactions; | ||
155 | private uint nextPerm = 0; | ||
144 | private IClientAPI ourClient; | 156 | private IClientAPI ourClient; |
145 | public LLUUID TransactionID = LLUUID.Zero; | 157 | public LLUUID TransactionID = LLUUID.Zero; |
146 | public bool UploadComplete; | ||
147 | public ulong XferID; | ||
148 | private string m_name = String.Empty; | ||
149 | private string m_description = String.Empty; | ||
150 | private sbyte type = 0; | 158 | private sbyte type = 0; |
151 | private sbyte invType = 0; | 159 | public bool UploadComplete; |
152 | private byte wearableType = 0; | 160 | private byte wearableType = 0; |
153 | private uint nextPerm = 0; | 161 | public ulong XferID; |
154 | private bool m_finished = false; | ||
155 | private bool m_createItem = false; | ||
156 | private AgentAssetTransactions m_userTransactions; | ||
157 | private bool m_storeLocal; | ||
158 | private bool m_dumpAssetToFile; | ||
159 | 162 | ||
160 | public AssetXferUploader(AgentAssetTransactions transactions, bool dumpAssetToFile) | 163 | public AssetXferUploader(AgentAssetTransactions transactions, bool dumpAssetToFile) |
161 | { | 164 | { |
@@ -197,7 +200,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
197 | return true; | 200 | return true; |
198 | } | 201 | } |
199 | } | 202 | } |
200 | 203 | ||
201 | return false; | 204 | return false; |
202 | } | 205 | } |
203 | 206 | ||
@@ -233,7 +236,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
233 | { | 236 | { |
234 | RequestStartXfer(); | 237 | RequestStartXfer(); |
235 | } | 238 | } |
236 | 239 | ||
237 | return false; | 240 | return false; |
238 | } | 241 | } |
239 | 242 | ||
@@ -279,7 +282,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
279 | SaveAssetToFile(filename, Asset.Data); | 282 | SaveAssetToFile(filename, Asset.Data); |
280 | } | 283 | } |
281 | } | 284 | } |
282 | 285 | ||
283 | ///Left this in and commented in case there are unforseen issues | 286 | ///Left this in and commented in case there are unforseen issues |
284 | //private void SaveAssetToFile(string filename, byte[] data) | 287 | //private void SaveAssetToFile(string filename, byte[] data) |
285 | //{ | 288 | //{ |
@@ -327,28 +330,28 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
327 | } | 330 | } |
328 | } | 331 | } |
329 | } | 332 | } |
330 | 333 | ||
331 | public void RequestUpdateInventoryItem(IClientAPI remoteClient, LLUUID transactionID, | 334 | public void RequestUpdateInventoryItem(IClientAPI remoteClient, LLUUID transactionID, |
332 | InventoryItemBase item) | 335 | InventoryItemBase item) |
333 | { | 336 | { |
334 | if (TransactionID == transactionID) | 337 | if (TransactionID == transactionID) |
335 | { | 338 | { |
336 | CachedUserInfo userInfo = | 339 | CachedUserInfo userInfo = |
337 | m_userTransactions.Manager.MyScene.CommsManager.UserProfileCacheService.GetUserDetails( | 340 | m_userTransactions.Manager.MyScene.CommsManager.UserProfileCacheService.GetUserDetails( |
338 | remoteClient.AgentId); | 341 | remoteClient.AgentId); |
339 | 342 | ||
340 | if (userInfo != null) | 343 | if (userInfo != null) |
341 | { | 344 | { |
342 | LLUUID assetID = LLUUID.Combine(transactionID, remoteClient.SecureSessionId); | 345 | LLUUID assetID = LLUUID.Combine(transactionID, remoteClient.SecureSessionId); |
343 | 346 | ||
344 | AssetBase asset | 347 | AssetBase asset |
345 | = m_userTransactions.Manager.MyScene.CommsManager.AssetCache.GetAsset( | 348 | = m_userTransactions.Manager.MyScene.CommsManager.AssetCache.GetAsset( |
346 | assetID, (item.AssetType == (int) AssetType.Texture ? true : false)); | 349 | assetID, (item.AssetType == (int) AssetType.Texture ? true : false)); |
347 | 350 | ||
348 | if (asset == null) | 351 | if (asset == null) |
349 | { | 352 | { |
350 | asset = m_userTransactions.GetTransactionAsset(transactionID); | 353 | asset = m_userTransactions.GetTransactionAsset(transactionID); |
351 | } | 354 | } |
352 | 355 | ||
353 | if (asset != null && asset.FullID == assetID) | 356 | if (asset != null && asset.FullID == assetID) |
354 | { | 357 | { |
@@ -359,10 +362,10 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
359 | item.AssetID = asset.FullID; | 362 | item.AssetID = asset.FullID; |
360 | 363 | ||
361 | m_userTransactions.Manager.MyScene.CommsManager.AssetCache.AddAsset(Asset); | 364 | m_userTransactions.Manager.MyScene.CommsManager.AssetCache.AddAsset(Asset); |
362 | } | 365 | } |
363 | 366 | ||
364 | userInfo.UpdateItem(remoteClient.AgentId, item); | 367 | userInfo.UpdateItem(remoteClient.AgentId, item); |
365 | } | 368 | } |
366 | } | 369 | } |
367 | } | 370 | } |
368 | 371 | ||
@@ -387,7 +390,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
387 | item.BasePermissions = 2147483647; | 390 | item.BasePermissions = 2147483647; |
388 | item.CurrentPermissions = 2147483647; | 391 | item.CurrentPermissions = 2147483647; |
389 | item.NextPermissions = nextPerm; | 392 | item.NextPermissions = nextPerm; |
390 | item.Flags = (uint)wearableType; | 393 | item.Flags = (uint) wearableType; |
391 | 394 | ||
392 | userInfo.AddItem(ourClient.AgentId, item); | 395 | userInfo.AddItem(ourClient.AgentId, item); |
393 | ourClient.SendInventoryItemCreateUpdate(item); | 396 | ourClient.SendInventoryItemCreateUpdate(item); |
@@ -403,5 +406,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
403 | return null; | 406 | return null; |
404 | } | 407 | } |
405 | } | 408 | } |
409 | |||
410 | #endregion | ||
406 | } | 411 | } |
407 | } \ No newline at end of file | 412 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AssetTransactionModule.cs b/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AssetTransactionModule.cs index ef81625..b264c8a 100644 --- a/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AssetTransactionModule.cs +++ b/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AssetTransactionModule.cs | |||
@@ -33,7 +33,6 @@ using log4net; | |||
33 | using Nini.Config; | 33 | using Nini.Config; |
34 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
35 | using OpenSim.Region.Environment.Interfaces; | 35 | using OpenSim.Region.Environment.Interfaces; |
36 | using OpenSim.Region.Environment.Modules.Agent.AssetTransaction; | ||
37 | using OpenSim.Region.Environment.Scenes; | 36 | using OpenSim.Region.Environment.Scenes; |
38 | 37 | ||
39 | namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | 38 | namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction |
@@ -41,8 +40,8 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
41 | public class AssetTransactionModule : IRegionModule, IAgentAssetTransactions | 40 | public class AssetTransactionModule : IRegionModule, IAgentAssetTransactions |
42 | { | 41 | { |
43 | private readonly Dictionary<LLUUID, Scene> RegisteredScenes = new Dictionary<LLUUID, Scene>(); | 42 | private readonly Dictionary<LLUUID, Scene> RegisteredScenes = new Dictionary<LLUUID, Scene>(); |
44 | private Scene m_scene = null; | ||
45 | private bool m_dumpAssetsToFile = false; | 43 | private bool m_dumpAssetsToFile = false; |
44 | private Scene m_scene = null; | ||
46 | 45 | ||
47 | private AgentAssetTransactionsManager m_transactionManager; | 46 | private AgentAssetTransactionsManager m_transactionManager; |
48 | 47 | ||
@@ -51,6 +50,31 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
51 | // System.Console.WriteLine("creating AgentAssetTransactionModule"); | 50 | // System.Console.WriteLine("creating AgentAssetTransactionModule"); |
52 | } | 51 | } |
53 | 52 | ||
53 | #region IAgentAssetTransactions Members | ||
54 | |||
55 | public void HandleItemCreationFromTransaction(IClientAPI remoteClient, LLUUID transactionID, LLUUID folderID, | ||
56 | uint callbackID, string description, string name, sbyte invType, | ||
57 | sbyte type, byte wearableType, uint nextOwnerMask) | ||
58 | { | ||
59 | m_transactionManager.HandleItemCreationFromTransaction(remoteClient, transactionID, folderID, callbackID, description, name, invType, type, | ||
60 | wearableType, nextOwnerMask); | ||
61 | } | ||
62 | |||
63 | public void HandleItemUpdateFromTransaction(IClientAPI remoteClient, LLUUID transactionID, | ||
64 | InventoryItemBase item) | ||
65 | { | ||
66 | m_transactionManager.HandleItemUpdateFromTransaction(remoteClient, transactionID, item); | ||
67 | } | ||
68 | |||
69 | public void RemoveAgentAssetTransactions(LLUUID userID) | ||
70 | { | ||
71 | m_transactionManager.RemoveAgentAssetTransactions(userID); | ||
72 | } | ||
73 | |||
74 | #endregion | ||
75 | |||
76 | #region IRegionModule Members | ||
77 | |||
54 | public void Initialise(Scene scene, IConfigSource config) | 78 | public void Initialise(Scene scene, IConfigSource config) |
55 | { | 79 | { |
56 | if (!RegisteredScenes.ContainsKey(scene.RegionInfo.RegionID)) | 80 | if (!RegisteredScenes.ContainsKey(scene.RegionInfo.RegionID)) |
@@ -81,13 +105,11 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
81 | { | 105 | { |
82 | m_transactionManager = new AgentAssetTransactionsManager(m_scene, false); | 106 | m_transactionManager = new AgentAssetTransactionsManager(m_scene, false); |
83 | } | 107 | } |
84 | |||
85 | } | 108 | } |
86 | } | 109 | } |
87 | 110 | ||
88 | public void PostInitialise() | 111 | public void PostInitialise() |
89 | { | 112 | { |
90 | |||
91 | } | 113 | } |
92 | 114 | ||
93 | public void Close() | 115 | public void Close() |
@@ -104,29 +126,13 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
104 | get { return true; } | 126 | get { return true; } |
105 | } | 127 | } |
106 | 128 | ||
129 | #endregion | ||
130 | |||
107 | public void NewClient(IClientAPI client) | 131 | public void NewClient(IClientAPI client) |
108 | { | 132 | { |
109 | client.OnAssetUploadRequest += m_transactionManager.HandleUDPUploadRequest; | 133 | client.OnAssetUploadRequest += m_transactionManager.HandleUDPUploadRequest; |
110 | client.OnXferReceive += m_transactionManager.HandleXfer; | 134 | client.OnXferReceive += m_transactionManager.HandleXfer; |
111 | } | 135 | } |
112 | |||
113 | public void HandleItemCreationFromTransaction(IClientAPI remoteClient, LLUUID transactionID, LLUUID folderID, | ||
114 | uint callbackID, string description, string name, sbyte invType, | ||
115 | sbyte type, byte wearableType, uint nextOwnerMask) | ||
116 | { | ||
117 | m_transactionManager.HandleItemCreationFromTransaction(remoteClient, transactionID, folderID, callbackID, description, name, invType, type, wearableType, nextOwnerMask); | ||
118 | } | ||
119 | |||
120 | public void HandleItemUpdateFromTransaction(IClientAPI remoteClient, LLUUID transactionID, | ||
121 | InventoryItemBase item) | ||
122 | { | ||
123 | m_transactionManager.HandleItemUpdateFromTransaction(remoteClient, transactionID, item); | ||
124 | } | ||
125 | |||
126 | public void RemoveAgentAssetTransactions(LLUUID userID) | ||
127 | { | ||
128 | m_transactionManager.RemoveAgentAssetTransactions(userID); | ||
129 | } | ||
130 | } | 136 | } |
131 | 137 | ||
132 | public class AgentAssetTransactionsManager | 138 | public class AgentAssetTransactionsManager |
@@ -135,7 +141,6 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
135 | = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 141 | = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
136 | 142 | ||
137 | // Fields | 143 | // Fields |
138 | public Scene MyScene; | ||
139 | 144 | ||
140 | /// <summary> | 145 | /// <summary> |
141 | /// Each agent has its own singleton collection of transactions | 146 | /// Each agent has its own singleton collection of transactions |
@@ -148,6 +153,8 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
148 | /// </summary> | 153 | /// </summary> |
149 | private bool m_dumpAssetsToFile; | 154 | private bool m_dumpAssetsToFile; |
150 | 155 | ||
156 | public Scene MyScene; | ||
157 | |||
151 | public AgentAssetTransactionsManager(Scene scene, bool dumpAssetsToFile) | 158 | public AgentAssetTransactionsManager(Scene scene, bool dumpAssetsToFile) |
152 | { | 159 | { |
153 | MyScene = scene; | 160 | MyScene = scene; |
@@ -260,10 +267,8 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction | |||
260 | AgentAssetTransactions.AssetXferUploader uploader = transactions.RequestXferUploader(transaction); | 267 | AgentAssetTransactions.AssetXferUploader uploader = transactions.RequestXferUploader(transaction); |
261 | if (uploader != null) | 268 | if (uploader != null) |
262 | { | 269 | { |
263 | |||
264 | if (uploader.Initialise(remoteClient, assetID, transaction, type, data, storeLocal, tempFile)) | 270 | if (uploader.Initialise(remoteClient, assetID, transaction, type, data, storeLocal, tempFile)) |
265 | { | 271 | { |
266 | |||
267 | } | 272 | } |
268 | } | 273 | } |
269 | } | 274 | } |
diff --git a/OpenSim/Region/Environment/Modules/Agent/TextureDownload/TextureDownloadModule.cs b/OpenSim/Region/Environment/Modules/Agent/TextureDownload/TextureDownloadModule.cs index b8899d2..ae2df69 100644 --- a/OpenSim/Region/Environment/Modules/Agent/TextureDownload/TextureDownloadModule.cs +++ b/OpenSim/Region/Environment/Modules/Agent/TextureDownload/TextureDownloadModule.cs | |||
@@ -40,14 +40,11 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload | |||
40 | { | 40 | { |
41 | //private static readonly log4net.ILog m_log | 41 | //private static readonly log4net.ILog m_log |
42 | // = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | 42 | // = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); |
43 | |||
44 | private Scene m_scene; | ||
45 | private List<Scene> m_scenes = new List<Scene>(); | ||
46 | 43 | ||
47 | /// <summary> | 44 | /// <summary> |
48 | /// There is one queue for all textures waiting to be sent, regardless of the requesting user. | 45 | /// There is one queue for all textures waiting to be sent, regardless of the requesting user. |
49 | /// </summary> | 46 | /// </summary> |
50 | private readonly BlockingQueue<ITextureSender> m_queueSenders | 47 | private readonly BlockingQueue<ITextureSender> m_queueSenders |
51 | = new BlockingQueue<ITextureSender>(); | 48 | = new BlockingQueue<ITextureSender>(); |
52 | 49 | ||
53 | /// <summary> | 50 | /// <summary> |
@@ -56,12 +53,17 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload | |||
56 | private readonly Dictionary<LLUUID, UserTextureDownloadService> m_userTextureServices = | 53 | private readonly Dictionary<LLUUID, UserTextureDownloadService> m_userTextureServices = |
57 | new Dictionary<LLUUID, UserTextureDownloadService>(); | 54 | new Dictionary<LLUUID, UserTextureDownloadService>(); |
58 | 55 | ||
56 | private Scene m_scene; | ||
57 | private List<Scene> m_scenes = new List<Scene>(); | ||
58 | |||
59 | private Thread m_thread; | 59 | private Thread m_thread; |
60 | 60 | ||
61 | public TextureDownloadModule() | 61 | public TextureDownloadModule() |
62 | { | 62 | { |
63 | } | 63 | } |
64 | 64 | ||
65 | #region IRegionModule Members | ||
66 | |||
65 | public void Initialise(Scene scene, IConfigSource config) | 67 | public void Initialise(Scene scene, IConfigSource config) |
66 | { | 68 | { |
67 | if (m_scene == null) | 69 | if (m_scene == null) |
@@ -83,6 +85,26 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload | |||
83 | } | 85 | } |
84 | } | 86 | } |
85 | 87 | ||
88 | public void PostInitialise() | ||
89 | { | ||
90 | } | ||
91 | |||
92 | public void Close() | ||
93 | { | ||
94 | } | ||
95 | |||
96 | public string Name | ||
97 | { | ||
98 | get { return "TextureDownloadModule"; } | ||
99 | } | ||
100 | |||
101 | public bool IsSharedModule | ||
102 | { | ||
103 | get { return false; } | ||
104 | } | ||
105 | |||
106 | #endregion | ||
107 | |||
86 | /// <summary> | 108 | /// <summary> |
87 | /// Cleanup the texture service related objects for the removed presence. | 109 | /// Cleanup the texture service related objects for the removed presence. |
88 | /// </summary> | 110 | /// </summary> |
@@ -102,24 +124,6 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload | |||
102 | } | 124 | } |
103 | } | 125 | } |
104 | 126 | ||
105 | public void PostInitialise() | ||
106 | { | ||
107 | } | ||
108 | |||
109 | public void Close() | ||
110 | { | ||
111 | } | ||
112 | |||
113 | public string Name | ||
114 | { | ||
115 | get { return "TextureDownloadModule"; } | ||
116 | } | ||
117 | |||
118 | public bool IsSharedModule | ||
119 | { | ||
120 | get { return false; } | ||
121 | } | ||
122 | |||
123 | public void NewClient(IClientAPI client) | 127 | public void NewClient(IClientAPI client) |
124 | { | 128 | { |
125 | client.OnRequestTexture += TextureRequest; | 129 | client.OnRequestTexture += TextureRequest; |
@@ -143,7 +147,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload | |||
143 | 147 | ||
144 | textureService = new UserTextureDownloadService(client, m_scene, m_queueSenders); | 148 | textureService = new UserTextureDownloadService(client, m_scene, m_queueSenders); |
145 | m_userTextureServices.Add(client.AgentId, textureService); | 149 | m_userTextureServices.Add(client.AgentId, textureService); |
146 | 150 | ||
147 | return true; | 151 | return true; |
148 | } | 152 | } |
149 | } | 153 | } |
@@ -157,11 +161,11 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload | |||
157 | { | 161 | { |
158 | IClientAPI client = (IClientAPI) sender; | 162 | IClientAPI client = (IClientAPI) sender; |
159 | UserTextureDownloadService textureService; | 163 | UserTextureDownloadService textureService; |
160 | 164 | ||
161 | if (TryGetUserTextureService(client, out textureService)) | 165 | if (TryGetUserTextureService(client, out textureService)) |
162 | { | 166 | { |
163 | textureService.HandleTextureRequest(e); | 167 | textureService.HandleTextureRequest(e); |
164 | } | 168 | } |
165 | } | 169 | } |
166 | 170 | ||
167 | /// <summary> | 171 | /// <summary> |
@@ -170,11 +174,11 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload | |||
170 | public void ProcessTextureSenders() | 174 | public void ProcessTextureSenders() |
171 | { | 175 | { |
172 | ITextureSender sender = null; | 176 | ITextureSender sender = null; |
173 | 177 | ||
174 | while (true) | 178 | while (true) |
175 | { | 179 | { |
176 | sender = m_queueSenders.Dequeue(); | 180 | sender = m_queueSenders.Dequeue(); |
177 | 181 | ||
178 | if (sender.Cancel) | 182 | if (sender.Cancel) |
179 | { | 183 | { |
180 | TextureSent(sender); | 184 | TextureSent(sender); |
@@ -193,10 +197,10 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload | |||
193 | m_queueSenders.Enqueue(sender); | 197 | m_queueSenders.Enqueue(sender); |
194 | } | 198 | } |
195 | } | 199 | } |
196 | 200 | ||
197 | // Make sure that any sender we currently have can get garbage collected | 201 | // Make sure that any sender we currently have can get garbage collected |
198 | sender = null; | 202 | sender = null; |
199 | 203 | ||
200 | //m_log.InfoFormat("[TEXTURE DOWNLOAD] Texture sender queue size: {0}", m_queueSenders.Count()); | 204 | //m_log.InfoFormat("[TEXTURE DOWNLOAD] Texture sender queue size: {0}", m_queueSenders.Count()); |
201 | } | 205 | } |
202 | } | 206 | } |
@@ -207,9 +211,9 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload | |||
207 | /// <param name="sender"></param> | 211 | /// <param name="sender"></param> |
208 | private void TextureSent(ITextureSender sender) | 212 | private void TextureSent(ITextureSender sender) |
209 | { | 213 | { |
210 | sender.Sending = false; | 214 | sender.Sending = false; |
211 | //m_log.DebugFormat("[TEXTURE DOWNLOAD]: Removing download stat for {0}", sender.assetID); | 215 | //m_log.DebugFormat("[TEXTURE DOWNLOAD]: Removing download stat for {0}", sender.assetID); |
212 | m_scene.AddPendingDownloads(-1); | 216 | m_scene.AddPendingDownloads(-1); |
213 | } | 217 | } |
214 | } | 218 | } |
215 | } \ No newline at end of file | 219 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Environment/Modules/Agent/TextureDownload/TextureNotFoundSender.cs b/OpenSim/Region/Environment/Modules/Agent/TextureDownload/TextureNotFoundSender.cs index 6f11f73..b181d20 100644 --- a/OpenSim/Region/Environment/Modules/Agent/TextureDownload/TextureNotFoundSender.cs +++ b/OpenSim/Region/Environment/Modules/Agent/TextureDownload/TextureNotFoundSender.cs | |||
@@ -39,55 +39,60 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload | |||
39 | { | 39 | { |
40 | //private static readonly log4net.ILog m_log | 40 | //private static readonly log4net.ILog m_log |
41 | // = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | 41 | // = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); |
42 | 42 | ||
43 | private LLUUID m_textureId; | 43 | private bool m_cancel = false; |
44 | private IClientAPI m_client; | 44 | private IClientAPI m_client; |
45 | 45 | ||
46 | // See ITextureSender | 46 | // See ITextureSender |
47 | public bool Sending | 47 | |
48 | { | 48 | private bool m_sending = false; |
49 | get { return false; } | 49 | private LLUUID m_textureId; |
50 | set { m_sending = value; } | ||
51 | } | ||
52 | |||
53 | private bool m_sending = false; | ||
54 | 50 | ||
55 | // See ITextureSender | 51 | // See ITextureSender |
56 | public bool Cancel | 52 | |
57 | { | ||
58 | get { return false; } | ||
59 | set { m_cancel = value; } | ||
60 | } | ||
61 | |||
62 | private bool m_cancel = false; | ||
63 | |||
64 | public TextureNotFoundSender(IClientAPI client, LLUUID textureID) | 53 | public TextureNotFoundSender(IClientAPI client, LLUUID textureID) |
65 | { | 54 | { |
66 | m_client = client; | 55 | m_client = client; |
67 | m_textureId = textureID; | 56 | m_textureId = textureID; |
68 | } | 57 | } |
69 | 58 | ||
59 | #region ITextureSender Members | ||
60 | |||
61 | public bool Sending | ||
62 | { | ||
63 | get { return false; } | ||
64 | set { m_sending = value; } | ||
65 | } | ||
66 | |||
67 | public bool Cancel | ||
68 | { | ||
69 | get { return false; } | ||
70 | set { m_cancel = value; } | ||
71 | } | ||
72 | |||
70 | // See ITextureSender | 73 | // See ITextureSender |
71 | public void UpdateRequest(int discardLevel, uint packetNumber) | 74 | public void UpdateRequest(int discardLevel, uint packetNumber) |
72 | { | 75 | { |
73 | // Not need to implement since priority changes don't affect this operation | 76 | // Not need to implement since priority changes don't affect this operation |
74 | } | 77 | } |
75 | 78 | ||
76 | // See ITextureSender | 79 | // See ITextureSender |
77 | public bool SendTexturePacket() | 80 | public bool SendTexturePacket() |
78 | { | 81 | { |
79 | //m_log.InfoFormat( | 82 | //m_log.InfoFormat( |
80 | // "[TEXTURE NOT FOUND SENDER]: Informing the client that texture {0} cannot be found", | 83 | // "[TEXTURE NOT FOUND SENDER]: Informing the client that texture {0} cannot be found", |
81 | // m_textureId); | 84 | // m_textureId); |
82 | 85 | ||
83 | ImageNotInDatabasePacket notFound = new ImageNotInDatabasePacket(); | 86 | ImageNotInDatabasePacket notFound = new ImageNotInDatabasePacket(); |
84 | notFound.ImageID.ID = m_textureId; | 87 | notFound.ImageID.ID = m_textureId; |
85 | 88 | ||
86 | // XXX Temporarily disabling as this appears to be causing client crashes on at least | 89 | // XXX Temporarily disabling as this appears to be causing client crashes on at least |
87 | // 1.19.0(5) of the Linden Second Life client. | 90 | // 1.19.0(5) of the Linden Second Life client. |
88 | // m_client.OutPacket(notFound, ThrottleOutPacketType.Texture); | 91 | // m_client.OutPacket(notFound, ThrottleOutPacketType.Texture); |
89 | 92 | ||
90 | return true; | 93 | return true; |
91 | } | 94 | } |
95 | |||
96 | #endregion | ||
92 | } | 97 | } |
93 | } \ No newline at end of file | 98 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Environment/Modules/Agent/TextureDownload/UserTextureDownloadService.cs b/OpenSim/Region/Environment/Modules/Agent/TextureDownload/UserTextureDownloadService.cs index 08a22d6..4f63fd0 100644 --- a/OpenSim/Region/Environment/Modules/Agent/TextureDownload/UserTextureDownloadService.cs +++ b/OpenSim/Region/Environment/Modules/Agent/TextureDownload/UserTextureDownloadService.cs | |||
@@ -32,8 +32,6 @@ using log4net; | |||
32 | using OpenSim.Framework; | 32 | using OpenSim.Framework; |
33 | using OpenSim.Framework.Communications.Limit; | 33 | using OpenSim.Framework.Communications.Limit; |
34 | using OpenSim.Region.Environment.Interfaces; | 34 | using OpenSim.Region.Environment.Interfaces; |
35 | using OpenSim.Region.Environment.Modules.Agent.TextureDownload; | ||
36 | using OpenSim.Region.Environment.Modules.Agent.TextureSender; | ||
37 | using OpenSim.Region.Environment.Scenes; | 35 | using OpenSim.Region.Environment.Scenes; |
38 | 36 | ||
39 | namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload | 37 | namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload |
@@ -45,7 +43,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload | |||
45 | /// </summary> | 43 | /// </summary> |
46 | public class UserTextureDownloadService | 44 | public class UserTextureDownloadService |
47 | { | 45 | { |
48 | private static readonly ILog m_log | 46 | private static readonly ILog m_log |
49 | = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 47 | = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
50 | 48 | ||
51 | /// <summary> | 49 | /// <summary> |
@@ -56,35 +54,34 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload | |||
56 | /// sophisticated way. | 54 | /// sophisticated way. |
57 | /// </summary> | 55 | /// </summary> |
58 | private static readonly int MAX_ALLOWED_TEXTURE_REQUESTS = 5; | 56 | private static readonly int MAX_ALLOWED_TEXTURE_REQUESTS = 5; |
59 | 57 | ||
60 | /// <summary> | ||
61 | /// We're going to limit requests for the same missing texture. | ||
62 | /// XXX This is really a temporary solution to deal with the situation where a client continually requests | ||
63 | /// the same missing textures | ||
64 | /// </summary> | ||
65 | private readonly IRequestLimitStrategy<LLUUID> missingTextureLimitStrategy | ||
66 | = new RepeatLimitStrategy<LLUUID>(MAX_ALLOWED_TEXTURE_REQUESTS); | ||
67 | |||
68 | /// <summary> | 58 | /// <summary> |
69 | /// XXX Also going to limit requests for found textures. | 59 | /// XXX Also going to limit requests for found textures. |
70 | /// </summary> | 60 | /// </summary> |
71 | private readonly IRequestLimitStrategy<LLUUID> foundTextureLimitStrategy | 61 | private readonly IRequestLimitStrategy<LLUUID> foundTextureLimitStrategy |
72 | = new RepeatLimitStrategy<LLUUID>(MAX_ALLOWED_TEXTURE_REQUESTS); | 62 | = new RepeatLimitStrategy<LLUUID>(MAX_ALLOWED_TEXTURE_REQUESTS); |
73 | 63 | ||
74 | /// <summary> | 64 | private readonly IClientAPI m_client; |
75 | /// Holds texture senders before they have received the appropriate texture from the asset cache. | 65 | private readonly Scene m_scene; |
76 | /// </summary> | 66 | |
77 | private readonly Dictionary<LLUUID, TextureSender.TextureSender> m_textureSenders = new Dictionary<LLUUID, TextureSender.TextureSender>(); | ||
78 | |||
79 | /// <summary> | 67 | /// <summary> |
80 | /// Texture Senders are placed in this queue once they have received their texture from the asset | 68 | /// Texture Senders are placed in this queue once they have received their texture from the asset |
81 | /// cache. Another module actually invokes the send. | 69 | /// cache. Another module actually invokes the send. |
82 | /// </summary> | 70 | /// </summary> |
83 | private readonly BlockingQueue<ITextureSender> m_sharedSendersQueue; | 71 | private readonly BlockingQueue<ITextureSender> m_sharedSendersQueue; |
84 | 72 | ||
85 | private readonly Scene m_scene; | 73 | /// <summary> |
86 | 74 | /// Holds texture senders before they have received the appropriate texture from the asset cache. | |
87 | private readonly IClientAPI m_client; | 75 | /// </summary> |
76 | private readonly Dictionary<LLUUID, TextureSender.TextureSender> m_textureSenders = new Dictionary<LLUUID, TextureSender.TextureSender>(); | ||
77 | |||
78 | /// <summary> | ||
79 | /// We're going to limit requests for the same missing texture. | ||
80 | /// XXX This is really a temporary solution to deal with the situation where a client continually requests | ||
81 | /// the same missing textures | ||
82 | /// </summary> | ||
83 | private readonly IRequestLimitStrategy<LLUUID> missingTextureLimitStrategy | ||
84 | = new RepeatLimitStrategy<LLUUID>(MAX_ALLOWED_TEXTURE_REQUESTS); | ||
88 | 85 | ||
89 | public UserTextureDownloadService( | 86 | public UserTextureDownloadService( |
90 | IClientAPI client, Scene scene, BlockingQueue<ITextureSender> sharedQueue) | 87 | IClientAPI client, Scene scene, BlockingQueue<ITextureSender> sharedQueue) |
@@ -112,19 +109,19 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload | |||
112 | { | 109 | { |
113 | // If we've received new non UUID information for this request and it hasn't dispatched | 110 | // If we've received new non UUID information for this request and it hasn't dispatched |
114 | // yet, then update the request accordingly. | 111 | // yet, then update the request accordingly. |
115 | textureSender.UpdateRequest(e.DiscardLevel, e.PacketNumber); | 112 | textureSender.UpdateRequest(e.DiscardLevel, e.PacketNumber); |
116 | } | 113 | } |
117 | else | 114 | else |
118 | { | 115 | { |
119 | if (!foundTextureLimitStrategy.AllowRequest(e.RequestedAssetID)) | 116 | if (!foundTextureLimitStrategy.AllowRequest(e.RequestedAssetID)) |
120 | { | 117 | { |
121 | // m_log.DebugFormat( | 118 | // m_log.DebugFormat( |
122 | // "[USER TEXTURE DOWNLOAD SERVICE]: Refusing request for {0} from client {1}", | 119 | // "[USER TEXTURE DOWNLOAD SERVICE]: Refusing request for {0} from client {1}", |
123 | // e.RequestedAssetID, m_client.AgentId); | 120 | // e.RequestedAssetID, m_client.AgentId); |
124 | 121 | ||
125 | return; | 122 | return; |
126 | } | 123 | } |
127 | else if (!missingTextureLimitStrategy.AllowRequest(e.RequestedAssetID)) | 124 | else if (!missingTextureLimitStrategy.AllowRequest(e.RequestedAssetID)) |
128 | { | 125 | { |
129 | if (missingTextureLimitStrategy.IsFirstRefusal(e.RequestedAssetID)) | 126 | if (missingTextureLimitStrategy.IsFirstRefusal(e.RequestedAssetID)) |
130 | { | 127 | { |
@@ -135,17 +132,17 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload | |||
135 | // m_log.DebugFormat( | 132 | // m_log.DebugFormat( |
136 | // "[USER TEXTURE DOWNLOAD SERVICE]: Dropping requests for notified missing texture {0} for client {1} since we have received more than {2} requests", | 133 | // "[USER TEXTURE DOWNLOAD SERVICE]: Dropping requests for notified missing texture {0} for client {1} since we have received more than {2} requests", |
137 | // e.RequestedAssetID, m_client.AgentId, MAX_ALLOWED_TEXTURE_REQUESTS); | 134 | // e.RequestedAssetID, m_client.AgentId, MAX_ALLOWED_TEXTURE_REQUESTS); |
138 | } | 135 | } |
139 | 136 | ||
140 | return; | 137 | return; |
141 | } | 138 | } |
142 | 139 | ||
143 | m_scene.AddPendingDownloads(1); | 140 | m_scene.AddPendingDownloads(1); |
144 | 141 | ||
145 | TextureSender.TextureSender requestHandler = new TextureSender.TextureSender(m_client, e.DiscardLevel, e.PacketNumber); | 142 | TextureSender.TextureSender requestHandler = new TextureSender.TextureSender(m_client, e.DiscardLevel, e.PacketNumber); |
146 | m_textureSenders.Add(e.RequestedAssetID, requestHandler); | 143 | m_textureSenders.Add(e.RequestedAssetID, requestHandler); |
147 | 144 | ||
148 | m_scene.AssetCache.GetAsset(e.RequestedAssetID, TextureCallback, true); | 145 | m_scene.AssetCache.GetAsset(e.RequestedAssetID, TextureCallback, true); |
149 | } | 146 | } |
150 | } | 147 | } |
151 | } | 148 | } |
@@ -170,7 +167,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload | |||
170 | public void TextureCallback(LLUUID textureID, AssetBase texture) | 167 | public void TextureCallback(LLUUID textureID, AssetBase texture) |
171 | { | 168 | { |
172 | //m_log.DebugFormat("[USER TEXTURE DOWNLOAD SERVICE]: Calling TextureCallback with {0}, texture == null is {1}", textureID, (texture == null ? true : false)); | 169 | //m_log.DebugFormat("[USER TEXTURE DOWNLOAD SERVICE]: Calling TextureCallback with {0}, texture == null is {1}", textureID, (texture == null ? true : false)); |
173 | 170 | ||
174 | lock (m_textureSenders) | 171 | lock (m_textureSenders) |
175 | { | 172 | { |
176 | TextureSender.TextureSender textureSender; | 173 | TextureSender.TextureSender textureSender; |
@@ -181,18 +178,18 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload | |||
181 | // this on to the TextureSender it will blow up, so just discard for now. | 178 | // this on to the TextureSender it will blow up, so just discard for now. |
182 | // Needs investigation. | 179 | // Needs investigation. |
183 | if (texture == null || texture.Data == null) | 180 | if (texture == null || texture.Data == null) |
184 | { | 181 | { |
185 | if (!missingTextureLimitStrategy.IsMonitoringRequests(textureID)) | 182 | if (!missingTextureLimitStrategy.IsMonitoringRequests(textureID)) |
186 | { | 183 | { |
187 | missingTextureLimitStrategy.MonitorRequests(textureID); | 184 | missingTextureLimitStrategy.MonitorRequests(textureID); |
188 | 185 | ||
189 | m_log.DebugFormat( | 186 | m_log.DebugFormat( |
190 | "[USER TEXTURE DOWNLOAD SERVICE]: Queueing first TextureNotFoundSender for {0}, client {1}", | 187 | "[USER TEXTURE DOWNLOAD SERVICE]: Queueing first TextureNotFoundSender for {0}, client {1}", |
191 | textureID, m_client.AgentId); | 188 | textureID, m_client.AgentId); |
192 | } | 189 | } |
193 | 190 | ||
194 | ITextureSender textureNotFoundSender = new TextureNotFoundSender(m_client, textureID); | 191 | ITextureSender textureNotFoundSender = new TextureNotFoundSender(m_client, textureID); |
195 | EnqueueTextureSender(textureNotFoundSender); | 192 | EnqueueTextureSender(textureNotFoundSender); |
196 | } | 193 | } |
197 | else | 194 | else |
198 | { | 195 | { |
@@ -200,13 +197,13 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload | |||
200 | { | 197 | { |
201 | textureSender.TextureReceived(texture); | 198 | textureSender.TextureReceived(texture); |
202 | EnqueueTextureSender(textureSender); | 199 | EnqueueTextureSender(textureSender); |
203 | 200 | ||
204 | foundTextureLimitStrategy.MonitorRequests(textureID); | 201 | foundTextureLimitStrategy.MonitorRequests(textureID); |
205 | } | 202 | } |
206 | } | 203 | } |
207 | 204 | ||
208 | //m_log.InfoFormat("[TEXTURE SENDER] Removing texture sender with uuid {0}", textureID); | 205 | //m_log.InfoFormat("[TEXTURE SENDER] Removing texture sender with uuid {0}", textureID); |
209 | m_textureSenders.Remove(textureID); | 206 | m_textureSenders.Remove(textureID); |
210 | //m_log.InfoFormat("[TEXTURE SENDER] Current texture senders in dictionary: {0}", m_textureSenders.Count); | 207 | //m_log.InfoFormat("[TEXTURE SENDER] Current texture senders in dictionary: {0}", m_textureSenders.Count); |
211 | } | 208 | } |
212 | else | 209 | else |
@@ -240,7 +237,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload | |||
240 | { | 237 | { |
241 | lock (m_textureSenders) | 238 | lock (m_textureSenders) |
242 | { | 239 | { |
243 | foreach( TextureSender.TextureSender textureSender in m_textureSenders.Values ) | 240 | foreach (TextureSender.TextureSender textureSender in m_textureSenders.Values) |
244 | { | 241 | { |
245 | textureSender.Cancel = true; | 242 | textureSender.Cancel = true; |
246 | } | 243 | } |
diff --git a/OpenSim/Region/Environment/Modules/Agent/TextureSender/TextureSender.cs b/OpenSim/Region/Environment/Modules/Agent/TextureSender/TextureSender.cs index 37b0652..b6f7095 100644 --- a/OpenSim/Region/Environment/Modules/Agent/TextureSender/TextureSender.cs +++ b/OpenSim/Region/Environment/Modules/Agent/TextureSender/TextureSender.cs | |||
@@ -40,56 +40,43 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureSender | |||
40 | /// </summary> | 40 | /// </summary> |
41 | public class TextureSender : ITextureSender | 41 | public class TextureSender : ITextureSender |
42 | { | 42 | { |
43 | private static readonly ILog m_log | 43 | private static readonly ILog m_log |
44 | = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 44 | = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
45 | 45 | ||
46 | /// <summary> | 46 | /// <summary> |
47 | /// Records the number of times texture send has been called. | 47 | /// Records the number of times texture send has been called. |
48 | /// </summary> | 48 | /// </summary> |
49 | public int counter = 0; | 49 | public int counter = 0; |
50 | 50 | ||
51 | public bool ImageLoaded = false; | ||
52 | |||
51 | /// <summary> | 53 | /// <summary> |
52 | /// Holds the texture asset to send. | 54 | /// Holds the texture asset to send. |
53 | /// </summary> | 55 | /// </summary> |
54 | private AssetBase m_asset; | 56 | private AssetBase m_asset; |
55 | 57 | ||
56 | //public LLUUID assetID { get { return m_asset.FullID; } } | 58 | //public LLUUID assetID { get { return m_asset.FullID; } } |
57 | 59 | ||
60 | private bool m_cancel = false; | ||
61 | |||
62 | // See ITextureSender | ||
63 | |||
64 | private bool m_sending = false; | ||
65 | |||
58 | /// <summary> | 66 | /// <summary> |
59 | /// This is actually the number of extra packets required to send the texture data! We always assume | 67 | /// This is actually the number of extra packets required to send the texture data! We always assume |
60 | /// at least one is required. | 68 | /// at least one is required. |
61 | /// </summary> | 69 | /// </summary> |
62 | private int NumPackets = 0; | 70 | private int NumPackets = 0; |
63 | 71 | ||
64 | /// <summary> | 72 | /// <summary> |
65 | /// Holds the packet number to send next. In this case, each packet is 1000 bytes long and starts | 73 | /// Holds the packet number to send next. In this case, each packet is 1000 bytes long and starts |
66 | /// at the 600th byte (0th indexed). | 74 | /// at the 600th byte (0th indexed). |
67 | /// </summary> | 75 | /// </summary> |
68 | private int PacketCounter = 0; | 76 | private int PacketCounter = 0; |
69 | |||
70 | // See ITextureSender | ||
71 | public bool Cancel | ||
72 | { | ||
73 | get { return false; } | ||
74 | set { m_cancel = value; } | ||
75 | } | ||
76 | |||
77 | private bool m_cancel = false; | ||
78 | |||
79 | // See ITextureSender | ||
80 | public bool Sending | ||
81 | { | ||
82 | get { return false; } | ||
83 | set { m_sending = value; } | ||
84 | } | ||
85 | |||
86 | private bool m_sending = false; | ||
87 | |||
88 | public bool ImageLoaded = false; | ||
89 | |||
90 | private IClientAPI RequestUser; | ||
91 | 77 | ||
92 | private int RequestedDiscardLevel = -1; | 78 | private int RequestedDiscardLevel = -1; |
79 | private IClientAPI RequestUser; | ||
93 | private uint StartPacketNumber = 0; | 80 | private uint StartPacketNumber = 0; |
94 | 81 | ||
95 | public TextureSender(IClientAPI client, int discardLevel, uint packetNumber) | 82 | public TextureSender(IClientAPI client, int discardLevel, uint packetNumber) |
@@ -99,18 +86,18 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureSender | |||
99 | StartPacketNumber = packetNumber; | 86 | StartPacketNumber = packetNumber; |
100 | } | 87 | } |
101 | 88 | ||
102 | /// <summary> | 89 | #region ITextureSender Members |
103 | /// Load up the texture data to send. | 90 | |
104 | /// </summary> | 91 | public bool Cancel |
105 | /// <param name="asset"> | ||
106 | /// A <see cref="AssetBase"/> | ||
107 | /// </param> | ||
108 | public void TextureReceived(AssetBase asset) | ||
109 | { | 92 | { |
110 | m_asset = asset; | 93 | get { return false; } |
111 | NumPackets = CalculateNumPackets(asset.Data.Length); | 94 | set { m_cancel = value; } |
112 | PacketCounter = (int) StartPacketNumber; | 95 | } |
113 | ImageLoaded = true; | 96 | |
97 | public bool Sending | ||
98 | { | ||
99 | get { return false; } | ||
100 | set { m_sending = value; } | ||
114 | } | 101 | } |
115 | 102 | ||
116 | // See ITextureSender | 103 | // See ITextureSender |
@@ -125,17 +112,33 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureSender | |||
125 | public bool SendTexturePacket() | 112 | public bool SendTexturePacket() |
126 | { | 113 | { |
127 | //m_log.DebugFormat("[TEXTURE SENDER]: Sending packet for {0}", m_asset.FullID); | 114 | //m_log.DebugFormat("[TEXTURE SENDER]: Sending packet for {0}", m_asset.FullID); |
128 | 115 | ||
129 | SendPacket(); | 116 | SendPacket(); |
130 | counter++; | 117 | counter++; |
131 | if ((NumPackets == 0) || (RequestedDiscardLevel == -1) || (PacketCounter > NumPackets) || | 118 | if ((NumPackets == 0) || (RequestedDiscardLevel == -1) || (PacketCounter > NumPackets) || |
132 | ((RequestedDiscardLevel > 0) && (counter > 50 + (NumPackets/(RequestedDiscardLevel + 1))))) | 119 | ((RequestedDiscardLevel > 0) && (counter > 50 + (NumPackets / (RequestedDiscardLevel + 1))))) |
133 | { | 120 | { |
134 | return true; | 121 | return true; |
135 | } | 122 | } |
136 | return false; | 123 | return false; |
137 | } | 124 | } |
138 | 125 | ||
126 | #endregion | ||
127 | |||
128 | /// <summary> | ||
129 | /// Load up the texture data to send. | ||
130 | /// </summary> | ||
131 | /// <param name="asset"> | ||
132 | /// A <see cref="AssetBase"/> | ||
133 | /// </param> | ||
134 | public void TextureReceived(AssetBase asset) | ||
135 | { | ||
136 | m_asset = asset; | ||
137 | NumPackets = CalculateNumPackets(asset.Data.Length); | ||
138 | PacketCounter = (int) StartPacketNumber; | ||
139 | ImageLoaded = true; | ||
140 | } | ||
141 | |||
139 | /// <summary> | 142 | /// <summary> |
140 | /// Sends a texture packet to the client. | 143 | /// Sends a texture packet to the client. |
141 | /// </summary> | 144 | /// </summary> |
@@ -177,17 +180,17 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureSender | |||
177 | im.Header.Reliable = false; | 180 | im.Header.Reliable = false; |
178 | im.ImageID.Packet = (ushort) (PacketCounter); | 181 | im.ImageID.Packet = (ushort) (PacketCounter); |
179 | im.ImageID.ID = m_asset.FullID; | 182 | im.ImageID.ID = m_asset.FullID; |
180 | int size = m_asset.Data.Length - 600 - (1000*(PacketCounter - 1)); | 183 | int size = m_asset.Data.Length - 600 - (1000 * (PacketCounter - 1)); |
181 | if (size > 1000) size = 1000; | 184 | if (size > 1000) size = 1000; |
182 | im.ImageData.Data = new byte[size]; | 185 | im.ImageData.Data = new byte[size]; |
183 | try | 186 | try |
184 | { | 187 | { |
185 | Array.Copy(m_asset.Data, 600 + (1000*(PacketCounter - 1)), im.ImageData.Data, 0, size); | 188 | Array.Copy(m_asset.Data, 600 + (1000 * (PacketCounter - 1)), im.ImageData.Data, 0, size); |
186 | } | 189 | } |
187 | catch (ArgumentOutOfRangeException) | 190 | catch (ArgumentOutOfRangeException) |
188 | { | 191 | { |
189 | m_log.Error("[TEXTURE SENDER]: Unable to separate texture into multiple packets: Array bounds failure on asset:" + | 192 | m_log.Error("[TEXTURE SENDER]: Unable to separate texture into multiple packets: Array bounds failure on asset:" + |
190 | m_asset.FullID.ToString() ); | 193 | m_asset.FullID.ToString()); |
191 | return; | 194 | return; |
192 | } | 195 | } |
193 | RequestUser.OutPacket(im, ThrottleOutPacketType.Texture); | 196 | RequestUser.OutPacket(im, ThrottleOutPacketType.Texture); |
@@ -210,7 +213,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureSender | |||
210 | { | 213 | { |
211 | //over 600 bytes so split up file | 214 | //over 600 bytes so split up file |
212 | int restData = (length - 600); | 215 | int restData = (length - 600); |
213 | int restPackets = ((restData + 999)/1000); | 216 | int restPackets = ((restData + 999) / 1000); |
214 | numPackets = restPackets; | 217 | numPackets = restPackets; |
215 | } | 218 | } |
216 | 219 | ||
diff --git a/OpenSim/Region/Environment/Modules/Agent/Xfer/XferModule.cs b/OpenSim/Region/Environment/Modules/Agent/Xfer/XferModule.cs index b609f93..e35b6f5 100644 --- a/OpenSim/Region/Environment/Modules/Agent/Xfer/XferModule.cs +++ b/OpenSim/Region/Environment/Modules/Agent/Xfer/XferModule.cs | |||
@@ -37,15 +37,16 @@ namespace OpenSim.Region.Environment.Modules.Agent.Xfer | |||
37 | { | 37 | { |
38 | public class XferModule : IRegionModule, IXfer | 38 | public class XferModule : IRegionModule, IXfer |
39 | { | 39 | { |
40 | private Scene m_scene; | ||
40 | public Dictionary<string, byte[]> NewFiles = new Dictionary<string, byte[]>(); | 41 | public Dictionary<string, byte[]> NewFiles = new Dictionary<string, byte[]>(); |
41 | public Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>(); | 42 | public Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>(); |
42 | 43 | ||
43 | private Scene m_scene; | ||
44 | |||
45 | public XferModule() | 44 | public XferModule() |
46 | { | 45 | { |
47 | } | 46 | } |
48 | 47 | ||
48 | #region IRegionModule Members | ||
49 | |||
49 | public void Initialise(Scene scene, IConfigSource config) | 50 | public void Initialise(Scene scene, IConfigSource config) |
50 | { | 51 | { |
51 | m_scene = scene; | 52 | m_scene = scene; |
@@ -72,6 +73,28 @@ namespace OpenSim.Region.Environment.Modules.Agent.Xfer | |||
72 | get { return false; } | 73 | get { return false; } |
73 | } | 74 | } |
74 | 75 | ||
76 | #endregion | ||
77 | |||
78 | #region IXfer Members | ||
79 | |||
80 | public bool AddNewFile(string fileName, byte[] data) | ||
81 | { | ||
82 | lock (NewFiles) | ||
83 | { | ||
84 | if (NewFiles.ContainsKey(fileName)) | ||
85 | { | ||
86 | NewFiles[fileName] = data; | ||
87 | } | ||
88 | else | ||
89 | { | ||
90 | NewFiles.Add(fileName, data); | ||
91 | } | ||
92 | } | ||
93 | return true; | ||
94 | } | ||
95 | |||
96 | #endregion | ||
97 | |||
75 | public void NewClient(IClientAPI client) | 98 | public void NewClient(IClientAPI client) |
76 | { | 99 | { |
77 | client.OnRequestXfer += RequestXfer; | 100 | client.OnRequestXfer += RequestXfer; |
@@ -96,7 +119,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.Xfer | |||
96 | XferDownLoad transaction = new XferDownLoad(fileName, fileData, xferID, remoteClient); | 119 | XferDownLoad transaction = new XferDownLoad(fileName, fileData, xferID, remoteClient); |
97 | Transfers.Add(xferID, transaction); | 120 | Transfers.Add(xferID, transaction); |
98 | NewFiles.Remove(fileName); | 121 | NewFiles.Remove(fileName); |
99 | 122 | ||
100 | if (transaction.StartSend()) | 123 | if (transaction.StartSend()) |
101 | { | 124 | { |
102 | Transfers.Remove(xferID); | 125 | Transfers.Remove(xferID); |
@@ -119,33 +142,18 @@ namespace OpenSim.Region.Environment.Modules.Agent.Xfer | |||
119 | } | 142 | } |
120 | } | 143 | } |
121 | 144 | ||
122 | public bool AddNewFile(string fileName, byte[] data) | 145 | #region Nested type: XferDownLoad |
123 | { | ||
124 | lock (NewFiles) | ||
125 | { | ||
126 | if (NewFiles.ContainsKey(fileName)) | ||
127 | { | ||
128 | NewFiles[fileName] = data; | ||
129 | } | ||
130 | else | ||
131 | { | ||
132 | NewFiles.Add(fileName, data); | ||
133 | } | ||
134 | } | ||
135 | return true; | ||
136 | } | ||
137 | |||
138 | 146 | ||
139 | public class XferDownLoad | 147 | public class XferDownLoad |
140 | { | 148 | { |
149 | public IClientAPI Client; | ||
150 | private bool complete; | ||
141 | public byte[] Data = new byte[0]; | 151 | public byte[] Data = new byte[0]; |
142 | public string FileName = String.Empty; | ||
143 | public ulong XferID = 0; | ||
144 | public int DataPointer = 0; | 152 | public int DataPointer = 0; |
153 | public string FileName = String.Empty; | ||
145 | public uint Packet = 0; | 154 | public uint Packet = 0; |
146 | public IClientAPI Client; | ||
147 | public uint Serial = 1; | 155 | public uint Serial = 1; |
148 | private bool complete; | 156 | public ulong XferID = 0; |
149 | 157 | ||
150 | public XferDownLoad(string fileName, byte[] data, ulong xferID, IClientAPI client) | 158 | public XferDownLoad(string fileName, byte[] data, ulong xferID, IClientAPI client) |
151 | { | 159 | { |
@@ -172,7 +180,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.Xfer | |||
172 | Array.Copy(Helpers.IntToBytes(Data.Length), 0, transferData, 0, 4); | 180 | Array.Copy(Helpers.IntToBytes(Data.Length), 0, transferData, 0, 4); |
173 | Array.Copy(Data, 0, transferData, 4, Data.Length); | 181 | Array.Copy(Data, 0, transferData, 4, Data.Length); |
174 | Client.SendXferPacket(XferID, 0 + 0x80000000, transferData); | 182 | Client.SendXferPacket(XferID, 0 + 0x80000000, transferData); |
175 | 183 | ||
176 | complete = true; | 184 | complete = true; |
177 | } | 185 | } |
178 | else | 186 | else |
@@ -182,10 +190,10 @@ namespace OpenSim.Region.Environment.Modules.Agent.Xfer | |||
182 | Array.Copy(Data, 0, transferData, 4, 1000); | 190 | Array.Copy(Data, 0, transferData, 4, 1000); |
183 | Client.SendXferPacket(XferID, 0, transferData); | 191 | Client.SendXferPacket(XferID, 0, transferData); |
184 | Packet++; | 192 | Packet++; |
185 | DataPointer = 1000; | 193 | DataPointer = 1000; |
186 | } | 194 | } |
187 | 195 | ||
188 | return complete; | 196 | return complete; |
189 | } | 197 | } |
190 | 198 | ||
191 | /// <summary> | 199 | /// <summary> |
@@ -213,13 +221,15 @@ namespace OpenSim.Region.Environment.Modules.Agent.Xfer | |||
213 | Client.SendXferPacket(XferID, endPacket, transferData); | 221 | Client.SendXferPacket(XferID, endPacket, transferData); |
214 | Packet++; | 222 | Packet++; |
215 | DataPointer += (Data.Length - DataPointer); | 223 | DataPointer += (Data.Length - DataPointer); |
216 | 224 | ||
217 | complete = true; | 225 | complete = true; |
218 | } | 226 | } |
219 | } | 227 | } |
220 | 228 | ||
221 | return complete; | 229 | return complete; |
222 | } | 230 | } |
223 | } | 231 | } |
232 | |||
233 | #endregion | ||
224 | } | 234 | } |
225 | } \ No newline at end of file | 235 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Environment/Modules/Avatar/Chat/ChatModule.cs b/OpenSim/Region/Environment/Modules/Avatar/Chat/ChatModule.cs index 1281873..966f5f3 100644 --- a/OpenSim/Region/Environment/Modules/Avatar/Chat/ChatModule.cs +++ b/OpenSim/Region/Environment/Modules/Avatar/Chat/ChatModule.cs | |||
@@ -44,21 +44,21 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
44 | public class ChatModule : IRegionModule, ISimChat | 44 | public class ChatModule : IRegionModule, ISimChat |
45 | { | 45 | { |
46 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 46 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
47 | 47 | private string m_defaultzone = null; | |
48 | private List<Scene> m_scenes = new List<Scene>(); | ||
49 | |||
50 | private int m_whisperdistance = 10; | ||
51 | private int m_saydistance = 30; | ||
52 | private int m_shoutdistance = 100; | ||
53 | 48 | ||
54 | private IRCChatModule m_irc = null; | 49 | private IRCChatModule m_irc = null; |
50 | private Thread m_irc_connector = null; | ||
55 | 51 | ||
56 | private string m_last_new_user = null; | ||
57 | private string m_last_leaving_user = null; | 52 | private string m_last_leaving_user = null; |
58 | private string m_defaultzone = null; | 53 | private string m_last_new_user = null; |
54 | private int m_saydistance = 30; | ||
55 | private List<Scene> m_scenes = new List<Scene>(); | ||
56 | private int m_shoutdistance = 100; | ||
59 | internal object m_syncInit = new object(); | 57 | internal object m_syncInit = new object(); |
60 | internal object m_syncLogout = new object(); | 58 | internal object m_syncLogout = new object(); |
61 | private Thread m_irc_connector=null; | 59 | private int m_whisperdistance = 10; |
60 | |||
61 | #region IRegionModule Members | ||
62 | 62 | ||
63 | public void Initialise(Scene scene, IConfigSource config) | 63 | public void Initialise(Scene scene, IConfigSource config) |
64 | { | 64 | { |
@@ -85,14 +85,17 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
85 | 85 | ||
86 | try | 86 | try |
87 | { | 87 | { |
88 | m_defaultzone = config.Configs["IRC"].GetString("nick","Sim"); | 88 | m_defaultzone = config.Configs["IRC"].GetString("nick", "Sim"); |
89 | } | 89 | } |
90 | catch (Exception) | 90 | catch (Exception) |
91 | { | 91 | { |
92 | } | 92 | } |
93 | 93 | ||
94 | // setup IRC Relay | 94 | // setup IRC Relay |
95 | if (m_irc == null) { m_irc = new IRCChatModule(config); } | 95 | if (m_irc == null) |
96 | { | ||
97 | m_irc = new IRCChatModule(config); | ||
98 | } | ||
96 | if (m_irc_connector == null) | 99 | if (m_irc_connector == null) |
97 | { | 100 | { |
98 | m_irc_connector = new Thread(IRCConnectRun); | 101 | m_irc_connector = new Thread(IRCConnectRun); |
@@ -142,83 +145,9 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
142 | get { return true; } | 145 | get { return true; } |
143 | } | 146 | } |
144 | 147 | ||
145 | public void NewClient(IClientAPI client) | 148 | #endregion |
146 | { | ||
147 | try | ||
148 | { | ||
149 | client.OnChatFromViewer += SimChat; | ||
150 | 149 | ||
151 | if ((m_irc.Enabled) && (m_irc.Connected)) | 150 | #region ISimChat Members |
152 | { | ||
153 | string clientName = client.FirstName + " " + client.LastName; | ||
154 | // handles simple case. May not work for hundred connecting in per second. | ||
155 | // and the NewClients calles getting interleved | ||
156 | // but filters out multiple reports | ||
157 | if (clientName != m_last_new_user) | ||
158 | { | ||
159 | m_last_new_user = clientName; | ||
160 | string clientRegion = FindClientRegion(client.FirstName, client.LastName); | ||
161 | m_irc.PrivMsg(m_irc.Nick, "Sim", "notices " + clientName + " in "+clientRegion); | ||
162 | } | ||
163 | } | ||
164 | client.OnLogout += ClientLoggedOut; | ||
165 | client.OnConnectionClosed += ClientLoggedOut; | ||
166 | client.OnLogout += ClientLoggedOut; | ||
167 | } | ||
168 | catch (Exception ex) | ||
169 | { | ||
170 | m_log.Error("[IRC]: NewClient exception trap:" + ex.ToString()); | ||
171 | } | ||
172 | } | ||
173 | |||
174 | public void ClientLoggedOut(IClientAPI client) | ||
175 | { | ||
176 | lock (m_syncLogout) | ||
177 | { | ||
178 | try | ||
179 | { | ||
180 | if ((m_irc.Enabled) && (m_irc.Connected)) | ||
181 | { | ||
182 | string clientName = client.FirstName + " " + client.LastName; | ||
183 | string clientRegion = FindClientRegion(client.FirstName, client.LastName); | ||
184 | // handles simple case. May not work for hundred connecting in per second. | ||
185 | // and the NewClients calles getting interleved | ||
186 | // but filters out multiple reports | ||
187 | if (clientName != m_last_leaving_user) | ||
188 | { | ||
189 | m_last_leaving_user = clientName; | ||
190 | m_irc.PrivMsg(m_irc.Nick, "Sim", "notices " + clientName + " left " + clientRegion); | ||
191 | m_log.Info("[IRC]: IRC watcher notices " + clientName + " left " + clientRegion); | ||
192 | } | ||
193 | } | ||
194 | } | ||
195 | catch (Exception ex) | ||
196 | { | ||
197 | m_log.Error("[IRC]: ClientLoggedOut exception trap:" + ex.ToString()); | ||
198 | } | ||
199 | } | ||
200 | } | ||
201 | |||
202 | private void TrySendChatMessage(ScenePresence presence, LLVector3 fromPos, LLVector3 regionPos, | ||
203 | LLUUID fromAgentID, string fromName, ChatTypeEnum type, string message) | ||
204 | { | ||
205 | if (!presence.IsChildAgent) | ||
206 | { | ||
207 | LLVector3 fromRegionPos = fromPos + regionPos; | ||
208 | LLVector3 toRegionPos = presence.AbsolutePosition + regionPos; | ||
209 | int dis = Math.Abs((int) Util.GetDistanceTo(toRegionPos, fromRegionPos)); | ||
210 | |||
211 | if (type == ChatTypeEnum.Whisper && dis > m_whisperdistance || | ||
212 | type == ChatTypeEnum.Say && dis > m_saydistance || | ||
213 | type == ChatTypeEnum.Shout && dis > m_shoutdistance) | ||
214 | { | ||
215 | return; | ||
216 | } | ||
217 | |||
218 | // TODO: should change so the message is sent through the avatar rather than direct to the ClientView | ||
219 | presence.ControllingClient.SendChatMessage(message, (byte) type, fromPos, fromName, fromAgentID); | ||
220 | } | ||
221 | } | ||
222 | 151 | ||
223 | public void SimChat(Object sender, ChatFromViewerArgs e) | 152 | public void SimChat(Object sender, ChatFromViewerArgs e) |
224 | { | 153 | { |
@@ -289,7 +218,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
289 | m_irc.PrivMsg(fromName, scene.RegionInfo.RegionName, e.Message); | 218 | m_irc.PrivMsg(fromName, scene.RegionInfo.RegionName, e.Message); |
290 | } | 219 | } |
291 | } | 220 | } |
292 | 221 | ||
293 | foreach (Scene s in m_scenes) | 222 | foreach (Scene s in m_scenes) |
294 | { | 223 | { |
295 | s.ForEachScenePresence(delegate(ScenePresence presence) | 224 | s.ForEachScenePresence(delegate(ScenePresence presence) |
@@ -301,12 +230,92 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
301 | } | 230 | } |
302 | } | 231 | } |
303 | 232 | ||
233 | #endregion | ||
234 | |||
235 | public void NewClient(IClientAPI client) | ||
236 | { | ||
237 | try | ||
238 | { | ||
239 | client.OnChatFromViewer += SimChat; | ||
240 | |||
241 | if ((m_irc.Enabled) && (m_irc.Connected)) | ||
242 | { | ||
243 | string clientName = client.FirstName + " " + client.LastName; | ||
244 | // handles simple case. May not work for hundred connecting in per second. | ||
245 | // and the NewClients calles getting interleved | ||
246 | // but filters out multiple reports | ||
247 | if (clientName != m_last_new_user) | ||
248 | { | ||
249 | m_last_new_user = clientName; | ||
250 | string clientRegion = FindClientRegion(client.FirstName, client.LastName); | ||
251 | m_irc.PrivMsg(m_irc.Nick, "Sim", "notices " + clientName + " in " + clientRegion); | ||
252 | } | ||
253 | } | ||
254 | client.OnLogout += ClientLoggedOut; | ||
255 | client.OnConnectionClosed += ClientLoggedOut; | ||
256 | client.OnLogout += ClientLoggedOut; | ||
257 | } | ||
258 | catch (Exception ex) | ||
259 | { | ||
260 | m_log.Error("[IRC]: NewClient exception trap:" + ex.ToString()); | ||
261 | } | ||
262 | } | ||
263 | |||
264 | public void ClientLoggedOut(IClientAPI client) | ||
265 | { | ||
266 | lock (m_syncLogout) | ||
267 | { | ||
268 | try | ||
269 | { | ||
270 | if ((m_irc.Enabled) && (m_irc.Connected)) | ||
271 | { | ||
272 | string clientName = client.FirstName + " " + client.LastName; | ||
273 | string clientRegion = FindClientRegion(client.FirstName, client.LastName); | ||
274 | // handles simple case. May not work for hundred connecting in per second. | ||
275 | // and the NewClients calles getting interleved | ||
276 | // but filters out multiple reports | ||
277 | if (clientName != m_last_leaving_user) | ||
278 | { | ||
279 | m_last_leaving_user = clientName; | ||
280 | m_irc.PrivMsg(m_irc.Nick, "Sim", "notices " + clientName + " left " + clientRegion); | ||
281 | m_log.Info("[IRC]: IRC watcher notices " + clientName + " left " + clientRegion); | ||
282 | } | ||
283 | } | ||
284 | } | ||
285 | catch (Exception ex) | ||
286 | { | ||
287 | m_log.Error("[IRC]: ClientLoggedOut exception trap:" + ex.ToString()); | ||
288 | } | ||
289 | } | ||
290 | } | ||
291 | |||
292 | private void TrySendChatMessage(ScenePresence presence, LLVector3 fromPos, LLVector3 regionPos, | ||
293 | LLUUID fromAgentID, string fromName, ChatTypeEnum type, string message) | ||
294 | { | ||
295 | if (!presence.IsChildAgent) | ||
296 | { | ||
297 | LLVector3 fromRegionPos = fromPos + regionPos; | ||
298 | LLVector3 toRegionPos = presence.AbsolutePosition + regionPos; | ||
299 | int dis = Math.Abs((int) Util.GetDistanceTo(toRegionPos, fromRegionPos)); | ||
300 | |||
301 | if (type == ChatTypeEnum.Whisper && dis > m_whisperdistance || | ||
302 | type == ChatTypeEnum.Say && dis > m_saydistance || | ||
303 | type == ChatTypeEnum.Shout && dis > m_shoutdistance) | ||
304 | { | ||
305 | return; | ||
306 | } | ||
307 | |||
308 | // TODO: should change so the message is sent through the avatar rather than direct to the ClientView | ||
309 | presence.ControllingClient.SendChatMessage(message, (byte) type, fromPos, fromName, fromAgentID); | ||
310 | } | ||
311 | } | ||
312 | |||
304 | // if IRC is enabled then just keep trying using a monitor thread | 313 | // if IRC is enabled then just keep trying using a monitor thread |
305 | public void IRCConnectRun() | 314 | public void IRCConnectRun() |
306 | { | 315 | { |
307 | while(true) | 316 | while (true) |
308 | { | 317 | { |
309 | if ((m_irc.Enabled)&&(!m_irc.Connected)) | 318 | if ((m_irc.Enabled) && (!m_irc.Connected)) |
310 | { | 319 | { |
311 | m_irc.Connect(m_scenes); | 320 | m_irc.Connect(m_scenes); |
312 | } | 321 | } |
@@ -314,54 +323,76 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
314 | } | 323 | } |
315 | } | 324 | } |
316 | 325 | ||
317 | public string FindClientRegion(string client_FirstName,string client_LastName) | 326 | public string FindClientRegion(string client_FirstName, string client_LastName) |
318 | { | 327 | { |
319 | string sourceRegion = null; | 328 | string sourceRegion = null; |
320 | foreach (Scene s in m_scenes) | 329 | foreach (Scene s in m_scenes) |
321 | { | 330 | { |
322 | s.ForEachScenePresence(delegate(ScenePresence presence) | 331 | s.ForEachScenePresence(delegate(ScenePresence presence) |
323 | { | 332 | { |
324 | if ((presence.IsChildAgent==false) | 333 | if ((presence.IsChildAgent == false) |
325 | &&(presence.Firstname==client_FirstName) | 334 | && (presence.Firstname == client_FirstName) |
326 | &&(presence.Lastname==client_LastName)) | 335 | && (presence.Lastname == client_LastName)) |
327 | { | 336 | { |
328 | sourceRegion = presence.Scene.RegionInfo.RegionName; | 337 | sourceRegion = presence.Scene.RegionInfo.RegionName; |
329 | //sourceRegion= s.RegionInfo.RegionName; | 338 | //sourceRegion= s.RegionInfo.RegionName; |
330 | } | 339 | } |
331 | }); | 340 | }); |
332 | if (sourceRegion != null) return sourceRegion; | 341 | if (sourceRegion != null) return sourceRegion; |
342 | } | ||
343 | if (m_defaultzone == null) | ||
344 | { | ||
345 | m_defaultzone = "Sim"; | ||
333 | } | 346 | } |
334 | if (m_defaultzone == null) { m_defaultzone = "Sim"; } | ||
335 | return m_defaultzone; | 347 | return m_defaultzone; |
336 | } | 348 | } |
337 | } | 349 | } |
338 | 350 | ||
339 | internal class IRCChatModule | 351 | internal class IRCChatModule |
340 | { | 352 | { |
353 | #region ErrorReplies enum | ||
354 | |||
355 | public enum ErrorReplies | ||
356 | { | ||
357 | NotRegistered = 451, // ":You have not registered" | ||
358 | NicknameInUse = 433 // "<nick> :Nickname is already in use" | ||
359 | } | ||
360 | |||
361 | #endregion | ||
362 | |||
363 | #region Replies enum | ||
364 | |||
365 | public enum Replies | ||
366 | { | ||
367 | MotdStart = 375, // ":- <server> Message of the day - " | ||
368 | Motd = 372, // ":- <text>" | ||
369 | EndOfMotd = 376 // ":End of /MOTD command" | ||
370 | } | ||
371 | |||
372 | #endregion | ||
373 | |||
341 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 374 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
375 | private Thread listener; | ||
342 | 376 | ||
343 | private string m_server = null; | ||
344 | private uint m_port = 6668; | ||
345 | private string m_user = "USER OpenSimBot 8 * :I'm a OpenSim to irc bot"; | ||
346 | private string m_nick = null; | ||
347 | private string m_basenick = null; | 377 | private string m_basenick = null; |
348 | private string m_channel = null; | 378 | private string m_channel = null; |
379 | private bool m_connected = false; | ||
380 | private bool m_enabled = false; | ||
381 | private List<Scene> m_last_scenes = null; | ||
382 | private string m_nick = null; | ||
383 | private uint m_port = 6668; | ||
349 | private string m_privmsgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"; | 384 | private string m_privmsgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"; |
385 | private StreamReader m_reader; | ||
386 | private List<Scene> m_scenes = null; | ||
387 | private string m_server = null; | ||
350 | 388 | ||
351 | private NetworkStream m_stream; | 389 | private NetworkStream m_stream; |
390 | internal object m_syncConnect = new object(); | ||
352 | private TcpClient m_tcp; | 391 | private TcpClient m_tcp; |
392 | private string m_user = "USER OpenSimBot 8 * :I'm a OpenSim to irc bot"; | ||
353 | private StreamWriter m_writer; | 393 | private StreamWriter m_writer; |
354 | private StreamReader m_reader; | ||
355 | 394 | ||
356 | private Thread pingSender; | 395 | private Thread pingSender; |
357 | private Thread listener; | ||
358 | internal object m_syncConnect = new object(); | ||
359 | |||
360 | private bool m_enabled = false; | ||
361 | private bool m_connected = false; | ||
362 | |||
363 | private List<Scene> m_scenes = null; | ||
364 | private List<Scene> m_last_scenes = null; | ||
365 | 396 | ||
366 | public IRCChatModule(IConfigSource config) | 397 | public IRCChatModule(IConfigSource config) |
367 | { | 398 | { |
@@ -412,6 +443,21 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
412 | } | 443 | } |
413 | } | 444 | } |
414 | 445 | ||
446 | public bool Enabled | ||
447 | { | ||
448 | get { return m_enabled; } | ||
449 | } | ||
450 | |||
451 | public bool Connected | ||
452 | { | ||
453 | get { return m_connected; } | ||
454 | } | ||
455 | |||
456 | public string Nick | ||
457 | { | ||
458 | get { return m_nick; } | ||
459 | } | ||
460 | |||
415 | public bool Connect(List<Scene> scenes) | 461 | public bool Connect(List<Scene> scenes) |
416 | { | 462 | { |
417 | lock (m_syncConnect) | 463 | lock (m_syncConnect) |
@@ -420,9 +466,12 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
420 | { | 466 | { |
421 | if (m_connected) return true; | 467 | if (m_connected) return true; |
422 | m_scenes = scenes; | 468 | m_scenes = scenes; |
423 | if (m_last_scenes == null) { m_last_scenes = scenes; } | 469 | if (m_last_scenes == null) |
470 | { | ||
471 | m_last_scenes = scenes; | ||
472 | } | ||
424 | 473 | ||
425 | m_tcp = new TcpClient(m_server, (int)m_port); | 474 | m_tcp = new TcpClient(m_server, (int) m_port); |
426 | m_log.Info("[IRC]: Connecting..."); | 475 | m_log.Info("[IRC]: Connecting..."); |
427 | m_stream = m_tcp.GetStream(); | 476 | m_stream = m_tcp.GetStream(); |
428 | m_log.Info("[IRC]: Connected to " + m_server); | 477 | m_log.Info("[IRC]: Connected to " + m_server); |
@@ -458,21 +507,6 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
458 | } | 507 | } |
459 | } | 508 | } |
460 | 509 | ||
461 | public bool Enabled | ||
462 | { | ||
463 | get { return m_enabled; } | ||
464 | } | ||
465 | |||
466 | public bool Connected | ||
467 | { | ||
468 | get { return m_connected; } | ||
469 | } | ||
470 | |||
471 | public string Nick | ||
472 | { | ||
473 | get { return m_nick; } | ||
474 | } | ||
475 | |||
476 | public void Reconnect() | 510 | public void Reconnect() |
477 | { | 511 | { |
478 | m_connected = false; | 512 | m_connected = false; |
@@ -481,7 +515,10 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
481 | m_writer.Close(); | 515 | m_writer.Close(); |
482 | m_reader.Close(); | 516 | m_reader.Close(); |
483 | m_tcp.Close(); | 517 | m_tcp.Close(); |
484 | if (m_enabled) { Connect(m_last_scenes); } | 518 | if (m_enabled) |
519 | { | ||
520 | Connect(m_last_scenes); | ||
521 | } | ||
485 | } | 522 | } |
486 | 523 | ||
487 | public void PrivMsg(string from, string region, string msg) | 524 | public void PrivMsg(string from, string region, string msg) |
@@ -627,7 +664,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
627 | } | 664 | } |
628 | } | 665 | } |
629 | 666 | ||
630 | public void BroadcastSim(string message,string sender) | 667 | public void BroadcastSim(string message, string sender) |
631 | { | 668 | { |
632 | LLVector3 pos = new LLVector3(128, 128, 20); | 669 | LLVector3 pos = new LLVector3(128, 128, 20); |
633 | try | 670 | try |
@@ -652,23 +689,10 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
652 | } | 689 | } |
653 | } | 690 | } |
654 | 691 | ||
655 | public enum ErrorReplies | ||
656 | { | ||
657 | NotRegistered = 451, // ":You have not registered" | ||
658 | NicknameInUse = 433 // "<nick> :Nickname is already in use" | ||
659 | } | ||
660 | |||
661 | public enum Replies | ||
662 | { | ||
663 | MotdStart = 375, // ":- <server> Message of the day - " | ||
664 | Motd = 372, // ":- <text>" | ||
665 | EndOfMotd = 376 // ":End of /MOTD command" | ||
666 | } | ||
667 | |||
668 | public void ProcessIRCCommand(string command) | 692 | public void ProcessIRCCommand(string command) |
669 | { | 693 | { |
670 | //m_log.Info("[IRC]: ProcessIRCCommand:" + command); | 694 | //m_log.Info("[IRC]: ProcessIRCCommand:" + command); |
671 | 695 | ||
672 | string[] commArgs = new string[command.Split(' ').Length]; | 696 | string[] commArgs = new string[command.Split(' ').Length]; |
673 | string c_server = m_server; | 697 | string c_server = m_server; |
674 | 698 | ||
@@ -690,7 +714,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
690 | 714 | ||
691 | if (commArgs[0] == "ERROR") | 715 | if (commArgs[0] == "ERROR") |
692 | { | 716 | { |
693 | m_log.Error("[IRC]: IRC SERVER ERROR:" + command); | 717 | m_log.Error("[IRC]: IRC SERVER ERROR:" + command); |
694 | } | 718 | } |
695 | 719 | ||
696 | if (commArgs[0] == "PING") | 720 | if (commArgs[0] == "PING") |
@@ -713,7 +737,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
713 | Int32 commandCode = Int32.Parse(commArgs[1]); | 737 | Int32 commandCode = Int32.Parse(commArgs[1]); |
714 | switch (commandCode) | 738 | switch (commandCode) |
715 | { | 739 | { |
716 | case (int)ErrorReplies.NicknameInUse: | 740 | case (int) ErrorReplies.NicknameInUse: |
717 | // Gen a new name | 741 | // Gen a new name |
718 | m_nick = m_basenick + Util.RandomClass.Next(1, 99); | 742 | m_nick = m_basenick + Util.RandomClass.Next(1, 99); |
719 | m_log.Error("[IRC]: IRC SERVER reports NicknameInUse, trying " + m_nick); | 743 | m_log.Error("[IRC]: IRC SERVER reports NicknameInUse, trying " + m_nick); |
@@ -723,9 +747,9 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
723 | m_writer.WriteLine("JOIN " + m_channel); | 747 | m_writer.WriteLine("JOIN " + m_channel); |
724 | m_writer.Flush(); | 748 | m_writer.Flush(); |
725 | break; | 749 | break; |
726 | case (int)ErrorReplies.NotRegistered: | 750 | case (int) ErrorReplies.NotRegistered: |
727 | break; | 751 | break; |
728 | case (int)Replies.EndOfMotd: | 752 | case (int) Replies.EndOfMotd: |
729 | break; | 753 | break; |
730 | } | 754 | } |
731 | } | 755 | } |
@@ -733,19 +757,32 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
733 | { | 757 | { |
734 | } | 758 | } |
735 | } | 759 | } |
736 | else | 760 | else |
737 | { | 761 | { |
738 | // Normal message | 762 | // Normal message |
739 | string commAct = commArgs[1]; | 763 | string commAct = commArgs[1]; |
740 | switch (commAct) | 764 | switch (commAct) |
741 | { | 765 | { |
742 | case "JOIN": eventIrcJoin(commArgs); break; | 766 | case "JOIN": |
743 | case "PART": eventIrcPart(commArgs); break; | 767 | eventIrcJoin(commArgs); |
744 | case "MODE": eventIrcMode(commArgs); break; | 768 | break; |
745 | case "NICK": eventIrcNickChange(commArgs); break; | 769 | case "PART": |
746 | case "KICK": eventIrcKick(commArgs); break; | 770 | eventIrcPart(commArgs); |
747 | case "QUIT": eventIrcQuit(commArgs); break; | 771 | break; |
748 | case "PONG": break; // that's nice | 772 | case "MODE": |
773 | eventIrcMode(commArgs); | ||
774 | break; | ||
775 | case "NICK": | ||
776 | eventIrcNickChange(commArgs); | ||
777 | break; | ||
778 | case "KICK": | ||
779 | eventIrcKick(commArgs); | ||
780 | break; | ||
781 | case "QUIT": | ||
782 | eventIrcQuit(commArgs); | ||
783 | break; | ||
784 | case "PONG": | ||
785 | break; // that's nice | ||
749 | } | 786 | } |
750 | } | 787 | } |
751 | } | 788 | } |
@@ -797,7 +834,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat | |||
797 | { | 834 | { |
798 | KickMessage += commArgs[i] + " "; | 835 | KickMessage += commArgs[i] + " "; |
799 | } | 836 | } |
800 | BroadcastSim(UserKicker + " kicked " + UserKicked +" on "+IrcChannel+" saying "+KickMessage, m_nick); | 837 | BroadcastSim(UserKicker + " kicked " + UserKicked + " on " + IrcChannel + " saying " + KickMessage, m_nick); |
801 | if (UserKicked == m_nick) | 838 | if (UserKicked == m_nick) |
802 | { | 839 | { |
803 | BroadcastSim("Hey, that was me!!!", m_nick); | 840 | BroadcastSim("Hey, that was me!!!", m_nick); |
diff --git a/OpenSim/Region/Environment/Modules/Avatar/Currency/SampleMoney/SampleMoneyModule.cs b/OpenSim/Region/Environment/Modules/Avatar/Currency/SampleMoney/SampleMoneyModule.cs index 0e058ec..181984e 100644 --- a/OpenSim/Region/Environment/Modules/Avatar/Currency/SampleMoney/SampleMoneyModule.cs +++ b/OpenSim/Region/Environment/Modules/Avatar/Currency/SampleMoney/SampleMoneyModule.cs | |||
@@ -53,7 +53,6 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
53 | /// Centralized grid structure example using OpenSimWi Redux revision 9+ | 53 | /// Centralized grid structure example using OpenSimWi Redux revision 9+ |
54 | /// svn co https://opensimwiredux.svn.sourceforge.net/svnroot/opensimwiredux | 54 | /// svn co https://opensimwiredux.svn.sourceforge.net/svnroot/opensimwiredux |
55 | /// </summary> | 55 | /// </summary> |
56 | |||
57 | public delegate void ObjectPaid(LLUUID objectID, LLUUID agentID, int amount); | 56 | public delegate void ObjectPaid(LLUUID objectID, LLUUID agentID, int amount); |
58 | 57 | ||
59 | public interface IMoneyModule : IRegionModule | 58 | public interface IMoneyModule : IRegionModule |
@@ -65,37 +64,39 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
65 | 64 | ||
66 | public class SampleMoneyModule : IMoneyModule | 65 | public class SampleMoneyModule : IMoneyModule |
67 | { | 66 | { |
68 | public event ObjectPaid OnObjectPaid; | ||
69 | |||
70 | private ObjectPaid handerOnObjectPaid; | ||
71 | |||
72 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 67 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
73 | 68 | ||
74 | /// <summary> | ||
75 | /// Region UUIDS indexed by AgentID | ||
76 | /// </summary> | ||
77 | Dictionary<LLUUID, LLUUID> m_rootAgents = new Dictionary<LLUUID, LLUUID>(); | ||
78 | |||
79 | /// <summary> | 69 | /// <summary> |
80 | /// Scenes by Region Handle | 70 | /// Where Stipends come from and Fees go to. |
81 | /// </summary> | 71 | /// </summary> |
82 | private Dictionary<ulong,Scene> m_scenel = new Dictionary<ulong,Scene>(); | 72 | private LLUUID EconomyBaseAccount = LLUUID.Zero; |
73 | |||
74 | private float EnergyEfficiency = 0f; | ||
75 | private bool gridmode = false; | ||
76 | private ObjectPaid handerOnObjectPaid; | ||
77 | private bool m_enabled = true; | ||
83 | 78 | ||
84 | private IConfigSource m_gConfig; | 79 | private IConfigSource m_gConfig; |
85 | 80 | ||
86 | private bool m_keepMoneyAcrossLogins = true; | 81 | private bool m_keepMoneyAcrossLogins = true; |
82 | private Dictionary<LLUUID, int> m_KnownClientFunds = new Dictionary<LLUUID, int>(); | ||
83 | private string m_LandAddress = String.Empty; | ||
87 | 84 | ||
88 | private int m_minFundsBeforeRefresh = 100; | 85 | private int m_minFundsBeforeRefresh = 100; |
86 | private string m_MoneyAddress = String.Empty; | ||
89 | 87 | ||
90 | private int m_stipend = 1000; | 88 | /// <summary> |
89 | /// Region UUIDS indexed by AgentID | ||
90 | /// </summary> | ||
91 | private Dictionary<LLUUID, LLUUID> m_rootAgents = new Dictionary<LLUUID, LLUUID>(); | ||
91 | 92 | ||
92 | private bool m_enabled = true; | 93 | /// <summary> |
94 | /// Scenes by Region Handle | ||
95 | /// </summary> | ||
96 | private Dictionary<ulong, Scene> m_scenel = new Dictionary<ulong, Scene>(); | ||
93 | 97 | ||
94 | private Dictionary<LLUUID, int> m_KnownClientFunds = new Dictionary<LLUUID, int>(); | 98 | private int m_stipend = 1000; |
95 | 99 | ||
96 | private bool gridmode = false; | ||
97 | private Scene XMLRPCHandler; | ||
98 | private float EnergyEfficiency = 0f; | ||
99 | private int ObjectCapacity = 45000; | 100 | private int ObjectCapacity = 45000; |
100 | private int ObjectCount = 0; | 101 | private int ObjectCount = 0; |
101 | private int PriceEnergyUnit = 0; | 102 | private int PriceEnergyUnit = 0; |
@@ -111,16 +112,14 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
111 | private int PriceRentLight = 0; | 112 | private int PriceRentLight = 0; |
112 | private int PriceUpload = 0; | 113 | private int PriceUpload = 0; |
113 | private int TeleportMinPrice = 0; | 114 | private int TeleportMinPrice = 0; |
115 | |||
116 | private float TeleportPriceExponent = 0f; | ||
114 | private int UserLevelPaysFees = 2; | 117 | private int UserLevelPaysFees = 2; |
115 | private string m_MoneyAddress = String.Empty; | 118 | private Scene XMLRPCHandler; |
116 | private string m_LandAddress = String.Empty; | ||
117 | 119 | ||
118 | float TeleportPriceExponent = 0f; | 120 | #region IMoneyModule Members |
119 | 121 | ||
120 | /// <summary> | 122 | public event ObjectPaid OnObjectPaid; |
121 | /// Where Stipends come from and Fees go to. | ||
122 | /// </summary> | ||
123 | LLUUID EconomyBaseAccount = LLUUID.Zero; | ||
124 | 123 | ||
125 | /// <summary> | 124 | /// <summary> |
126 | /// Startup | 125 | /// Startup |
@@ -130,12 +129,12 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
130 | public void Initialise(Scene scene, IConfigSource config) | 129 | public void Initialise(Scene scene, IConfigSource config) |
131 | { | 130 | { |
132 | m_gConfig = config; | 131 | m_gConfig = config; |
133 | 132 | ||
134 | IConfig startupConfig = m_gConfig.Configs["Startup"]; | 133 | IConfig startupConfig = m_gConfig.Configs["Startup"]; |
135 | IConfig economyConfig = m_gConfig.Configs["Economy"]; | 134 | IConfig economyConfig = m_gConfig.Configs["Economy"]; |
136 | 135 | ||
137 | scene.RegisterModuleInterface<IMoneyModule>(this); | 136 | scene.RegisterModuleInterface<IMoneyModule>(this); |
138 | 137 | ||
139 | ReadConfigAndPopulate(scene, startupConfig, "Startup"); | 138 | ReadConfigAndPopulate(scene, startupConfig, "Startup"); |
140 | ReadConfigAndPopulate(scene, economyConfig, "Economy"); | 139 | ReadConfigAndPopulate(scene, economyConfig, "Economy"); |
141 | 140 | ||
@@ -167,8 +166,6 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
167 | scene.AddXmlRPCHandler("preflightBuyLandPrep", preflightBuyLandPrep_func); | 166 | scene.AddXmlRPCHandler("preflightBuyLandPrep", preflightBuyLandPrep_func); |
168 | scene.AddXmlRPCHandler("buyLandPrep", landBuy_func); | 167 | scene.AddXmlRPCHandler("buyLandPrep", landBuy_func); |
169 | } | 168 | } |
170 | |||
171 | |||
172 | } | 169 | } |
173 | 170 | ||
174 | if (m_scenel.ContainsKey(scene.RegionInfo.RegionHandle)) | 171 | if (m_scenel.ContainsKey(scene.RegionInfo.RegionHandle)) |
@@ -180,7 +177,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
180 | m_scenel.Add(scene.RegionInfo.RegionHandle, scene); | 177 | m_scenel.Add(scene.RegionInfo.RegionHandle, scene); |
181 | } | 178 | } |
182 | } | 179 | } |
183 | 180 | ||
184 | scene.EventManager.OnNewClient += OnNewClient; | 181 | scene.EventManager.OnNewClient += OnNewClient; |
185 | scene.EventManager.OnMoneyTransfer += MoneyTransferAction; | 182 | scene.EventManager.OnMoneyTransfer += MoneyTransferAction; |
186 | scene.EventManager.OnClientClosed += ClientClosed; | 183 | scene.EventManager.OnClientClosed += ClientClosed; |
@@ -189,9 +186,41 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
189 | scene.EventManager.OnClientClosed += ClientLoggedOut; | 186 | scene.EventManager.OnClientClosed += ClientLoggedOut; |
190 | scene.EventManager.OnValidateLandBuy += ValidateLandBuy; | 187 | scene.EventManager.OnValidateLandBuy += ValidateLandBuy; |
191 | scene.EventManager.OnLandBuy += processLandBuy; | 188 | scene.EventManager.OnLandBuy += processLandBuy; |
192 | |||
193 | } | 189 | } |
194 | } | 190 | } |
191 | |||
192 | public bool ObjectGiveMoney(LLUUID objectID, LLUUID fromID, LLUUID toID, int amount) | ||
193 | { | ||
194 | string description = String.Format("Object {0} pays {1}", resolveObjectName(objectID), resolveAgentName(toID)); | ||
195 | |||
196 | bool give_result = doMoneyTransfer(fromID, toID, amount, 2, description); | ||
197 | |||
198 | if (m_MoneyAddress.Length == 0) | ||
199 | BalanceUpdate(fromID, toID, give_result, description); | ||
200 | |||
201 | return give_result; | ||
202 | } | ||
203 | |||
204 | public void PostInitialise() | ||
205 | { | ||
206 | } | ||
207 | |||
208 | public void Close() | ||
209 | { | ||
210 | } | ||
211 | |||
212 | public string Name | ||
213 | { | ||
214 | get { return "BetaGridLikeMoneyModule"; } | ||
215 | } | ||
216 | |||
217 | public bool IsSharedModule | ||
218 | { | ||
219 | get { return true; } | ||
220 | } | ||
221 | |||
222 | #endregion | ||
223 | |||
195 | /// <summary> | 224 | /// <summary> |
196 | /// Parse Configuration | 225 | /// Parse Configuration |
197 | /// </summary> | 226 | /// </summary> |
@@ -207,7 +236,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
207 | } | 236 | } |
208 | 237 | ||
209 | if (config == "Economy" && startupConfig != null) | 238 | if (config == "Economy" && startupConfig != null) |
210 | { | 239 | { |
211 | ObjectCapacity = startupConfig.GetInt("ObjectCapacity", 45000); | 240 | ObjectCapacity = startupConfig.GetInt("ObjectCapacity", 45000); |
212 | PriceEnergyUnit = startupConfig.GetInt("PriceEnergyUnit", 100); | 241 | PriceEnergyUnit = startupConfig.GetInt("PriceEnergyUnit", 100); |
213 | PriceObjectClaim = startupConfig.GetInt("PriceObjectClaim", 10); | 242 | PriceObjectClaim = startupConfig.GetInt("PriceObjectClaim", 10); |
@@ -225,7 +254,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
225 | PriceParcelRent = startupConfig.GetInt("PriceParcelRent", 1); | 254 | PriceParcelRent = startupConfig.GetInt("PriceParcelRent", 1); |
226 | PriceGroupCreate = startupConfig.GetInt("PriceGroupCreate", -1); | 255 | PriceGroupCreate = startupConfig.GetInt("PriceGroupCreate", -1); |
227 | string EBA = startupConfig.GetString("EconomyBaseAccount", LLUUID.Zero.ToString()); | 256 | string EBA = startupConfig.GetString("EconomyBaseAccount", LLUUID.Zero.ToString()); |
228 | Helpers.TryParse(EBA,out EconomyBaseAccount); | 257 | Helpers.TryParse(EBA, out EconomyBaseAccount); |
229 | 258 | ||
230 | UserLevelPaysFees = startupConfig.GetInt("UserLevelPaysFees", -1); | 259 | UserLevelPaysFees = startupConfig.GetInt("UserLevelPaysFees", -1); |
231 | m_stipend = startupConfig.GetInt("UserStipend", 500); | 260 | m_stipend = startupConfig.GetInt("UserStipend", 500); |
@@ -234,7 +263,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
234 | m_MoneyAddress = startupConfig.GetString("CurrencyServer", String.Empty); | 263 | m_MoneyAddress = startupConfig.GetString("CurrencyServer", String.Empty); |
235 | m_LandAddress = startupConfig.GetString("LandServer", String.Empty); | 264 | m_LandAddress = startupConfig.GetString("LandServer", String.Empty); |
236 | } | 265 | } |
237 | 266 | ||
238 | // Send ObjectCapacity to Scene.. Which sends it to the SimStatsReporter. | 267 | // Send ObjectCapacity to Scene.. Which sends it to the SimStatsReporter. |
239 | scene.SetObjectCapacity(ObjectCapacity); | 268 | scene.SetObjectCapacity(ObjectCapacity); |
240 | } | 269 | } |
@@ -253,7 +282,6 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
253 | { | 282 | { |
254 | if (m_MoneyAddress.Length == 0) | 283 | if (m_MoneyAddress.Length == 0) |
255 | { | 284 | { |
256 | |||
257 | CheckExistAndRefreshFunds(client.AgentId); | 285 | CheckExistAndRefreshFunds(client.AgentId); |
258 | } | 286 | } |
259 | else | 287 | else |
@@ -273,15 +301,16 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
273 | //s.RegionInfo.RegionHandle; | 301 | //s.RegionInfo.RegionHandle; |
274 | LLUUID agentID = LLUUID.Zero; | 302 | LLUUID agentID = LLUUID.Zero; |
275 | int funds = 0; | 303 | int funds = 0; |
276 | |||
277 | Hashtable hbinfo = GetBalanceForUserFromMoneyServer(client.AgentId, client.SecureSessionId, s.RegionInfo.originRegionID.ToString(), s.RegionInfo.regionSecret); | ||
278 | if ((bool)hbinfo["success"] == true) | ||
279 | { | ||
280 | 304 | ||
281 | Helpers.TryParse((string)hbinfo["agentId"], out agentID); | 305 | Hashtable hbinfo = |
306 | GetBalanceForUserFromMoneyServer(client.AgentId, client.SecureSessionId, s.RegionInfo.originRegionID.ToString(), | ||
307 | s.RegionInfo.regionSecret); | ||
308 | if ((bool) hbinfo["success"] == true) | ||
309 | { | ||
310 | Helpers.TryParse((string) hbinfo["agentId"], out agentID); | ||
282 | try | 311 | try |
283 | { | 312 | { |
284 | funds = (Int32)hbinfo["funds"]; | 313 | funds = (Int32) hbinfo["funds"]; |
285 | } | 314 | } |
286 | catch (ArgumentException) | 315 | catch (ArgumentException) |
287 | { | 316 | { |
@@ -303,340 +332,27 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
303 | } | 332 | } |
304 | else | 333 | else |
305 | { | 334 | { |
306 | m_log.WarnFormat("[MONEY]: Getting Money for user {0} failed with the following message:{1}", agentID, (string)hbinfo["errorMessage"]); | 335 | m_log.WarnFormat("[MONEY]: Getting Money for user {0} failed with the following message:{1}", agentID, |
307 | client.SendAlertMessage((string)hbinfo["errorMessage"]); | 336 | (string) hbinfo["errorMessage"]); |
337 | client.SendAlertMessage((string) hbinfo["errorMessage"]); | ||
308 | } | 338 | } |
309 | SendMoneyBalance(client, agentID, client.SessionId, LLUUID.Zero); | 339 | SendMoneyBalance(client, agentID, client.SessionId, LLUUID.Zero); |
310 | |||
311 | } | 340 | } |
312 | } | 341 | } |
313 | |||
314 | } | 342 | } |
315 | else | 343 | else |
316 | { | 344 | { |
317 | CheckExistAndRefreshFunds(client.AgentId); | 345 | CheckExistAndRefreshFunds(client.AgentId); |
318 | } | 346 | } |
319 | 347 | ||
320 | // Subscribe to Money messages | 348 | // Subscribe to Money messages |
321 | client.OnEconomyDataRequest += EconomyDataRequestHandler; | 349 | client.OnEconomyDataRequest += EconomyDataRequestHandler; |
322 | client.OnMoneyBalanceRequest += SendMoneyBalance; | 350 | client.OnMoneyBalanceRequest += SendMoneyBalance; |
323 | client.OnRequestPayPrice += requestPayPrice; | 351 | client.OnRequestPayPrice += requestPayPrice; |
324 | client.OnLogout += ClientClosed; | 352 | client.OnLogout += ClientClosed; |
325 | |||
326 | |||
327 | } | ||
328 | |||
329 | #region event Handlers | ||
330 | |||
331 | public void requestPayPrice(IClientAPI client, LLUUID objectID) | ||
332 | { | ||
333 | Scene scene=LocateSceneClientIn(client.AgentId); | ||
334 | if(scene == null) | ||
335 | return; | ||
336 | |||
337 | SceneObjectPart task=scene.GetSceneObjectPart(objectID); | ||
338 | if(task == null) | ||
339 | return; | ||
340 | SceneObjectGroup group=task.ParentGroup; | ||
341 | SceneObjectPart root=group.RootPart; | ||
342 | |||
343 | client.SendPayPrice(objectID, root.PayPrice); | ||
344 | } | ||
345 | |||
346 | /// <summary> | ||
347 | /// When the client closes the connection we remove their accounting info from memory to free up resources. | ||
348 | /// </summary> | ||
349 | /// <param name="AgentID"></param> | ||
350 | public void ClientClosed(LLUUID AgentID) | ||
351 | { | ||
352 | lock (m_KnownClientFunds) | ||
353 | { | ||
354 | if (m_keepMoneyAcrossLogins && m_MoneyAddress.Length == 0) | ||
355 | { | ||
356 | } | ||
357 | else | ||
358 | { | ||
359 | m_KnownClientFunds.Remove(AgentID); | ||
360 | } | ||
361 | } | ||
362 | } | ||
363 | |||
364 | /// <summary> | ||
365 | /// Event called Economy Data Request handler. | ||
366 | /// </summary> | ||
367 | /// <param name="agentId"></param> | ||
368 | public void EconomyDataRequestHandler(LLUUID agentId) | ||
369 | { | ||
370 | IClientAPI user = LocateClientObject(agentId); | ||
371 | |||
372 | if (user != null) | ||
373 | { | ||
374 | user.SendEconomyData(EnergyEfficiency, ObjectCapacity, ObjectCount, PriceEnergyUnit, PriceGroupCreate, | ||
375 | PriceObjectClaim, PriceObjectRent, PriceObjectScaleFactor, PriceParcelClaim, PriceParcelClaimFactor, | ||
376 | PriceParcelRent, PricePublicObjectDecay, PricePublicObjectDelete, PriceRentLight, PriceUpload, | ||
377 | TeleportMinPrice, TeleportPriceExponent); | ||
378 | } | ||
379 | } | ||
380 | |||
381 | private void ValidateLandBuy (Object osender, EventManager.LandBuyArgs e) | ||
382 | { | ||
383 | if (m_MoneyAddress.Length == 0) | ||
384 | { | ||
385 | lock (m_KnownClientFunds) | ||
386 | { | ||
387 | if (m_KnownClientFunds.ContainsKey(e.agentId)) | ||
388 | { | ||
389 | // Does the sender have enough funds to give? | ||
390 | if (m_KnownClientFunds[e.agentId] >= e.parcelPrice) | ||
391 | { | ||
392 | lock(e) | ||
393 | { | ||
394 | e.economyValidated=true; | ||
395 | } | ||
396 | } | ||
397 | } | ||
398 | } | ||
399 | } | ||
400 | else | ||
401 | { | ||
402 | if(GetRemoteBalance(e.agentId) >= e.parcelPrice) | ||
403 | { | ||
404 | lock(e) | ||
405 | { | ||
406 | e.economyValidated=true; | ||
407 | } | ||
408 | } | ||
409 | } | ||
410 | } | ||
411 | |||
412 | private void processLandBuy(Object osender, EventManager.LandBuyArgs e) | ||
413 | { | ||
414 | lock(e) | ||
415 | { | ||
416 | if(e.economyValidated == true && e.transactionID == 0) | ||
417 | { | ||
418 | e.transactionID=Util.UnixTimeSinceEpoch(); | ||
419 | |||
420 | if(doMoneyTransfer(e.agentId, e.parcelOwnerID, e.parcelPrice, 0, "Land purchase")) | ||
421 | { | ||
422 | lock (e) | ||
423 | { | ||
424 | e.amountDebited = e.parcelPrice; | ||
425 | } | ||
426 | } | ||
427 | } | ||
428 | } | ||
429 | } | 353 | } |
430 | 354 | ||
431 | /// <summary> | 355 | /// <summary> |
432 | /// THis method gets called when someone pays someone else as a gift. | ||
433 | /// </summary> | ||
434 | /// <param name="osender"></param> | ||
435 | /// <param name="e"></param> | ||
436 | private void MoneyTransferAction (Object osender, EventManager.MoneyTransferArgs e) | ||
437 | { | ||
438 | IClientAPI sender = null; | ||
439 | IClientAPI receiver = null; | ||
440 | |||
441 | if(m_MoneyAddress.Length > 0) // Handled on server | ||
442 | e.description=String.Empty; | ||
443 | |||
444 | if(e.transactiontype == 5008) // Object gets paid | ||
445 | { | ||
446 | sender = LocateClientObject(e.sender); | ||
447 | if (sender != null) | ||
448 | { | ||
449 | SceneObjectPart part=findPrim(e.receiver); | ||
450 | if(part == null) | ||
451 | return; | ||
452 | |||
453 | string name=resolveAgentName(part.OwnerID); | ||
454 | if(name == String.Empty) | ||
455 | name="(hippos)"; | ||
456 | |||
457 | receiver = LocateClientObject(part.OwnerID); | ||
458 | |||
459 | string description=String.Format("Paid {0} via object {1}", name, e.description); | ||
460 | bool transactionresult = doMoneyTransfer(e.sender, part.OwnerID, e.amount, e.transactiontype, description); | ||
461 | |||
462 | if(transactionresult) | ||
463 | { | ||
464 | ObjectPaid handlerOnObjectPaid = OnObjectPaid; | ||
465 | if(handlerOnObjectPaid != null) | ||
466 | { | ||
467 | handlerOnObjectPaid(e.receiver, e.sender, e.amount); | ||
468 | } | ||
469 | } | ||
470 | |||
471 | if (e.sender != e.receiver) | ||
472 | { | ||
473 | sender.SendMoneyBalance(LLUUID.Random(), transactionresult, Helpers.StringToField(e.description), GetFundsForAgentID(e.sender)); | ||
474 | } | ||
475 | if(receiver != null) | ||
476 | { | ||
477 | receiver.SendMoneyBalance(LLUUID.Random(), transactionresult, Helpers.StringToField(e.description), GetFundsForAgentID(part.OwnerID)); | ||
478 | } | ||
479 | } | ||
480 | return; | ||
481 | } | ||
482 | |||
483 | sender = LocateClientObject(e.sender); | ||
484 | if (sender != null) | ||
485 | { | ||
486 | receiver = LocateClientObject(e.receiver); | ||
487 | |||
488 | bool transactionresult = doMoneyTransfer(e.sender, e.receiver, e.amount, e.transactiontype, e.description); | ||
489 | |||
490 | if (e.sender != e.receiver) | ||
491 | { | ||
492 | if (sender != null) | ||
493 | { | ||
494 | sender.SendMoneyBalance(LLUUID.Random(), transactionresult, Helpers.StringToField(e.description), GetFundsForAgentID(e.sender)); | ||
495 | } | ||
496 | } | ||
497 | |||
498 | if (receiver != null) | ||
499 | { | ||
500 | receiver.SendMoneyBalance(LLUUID.Random(), transactionresult, Helpers.StringToField(e.description), GetFundsForAgentID(e.receiver)); | ||
501 | } | ||
502 | } | ||
503 | else | ||
504 | { | ||
505 | m_log.Warn("[MONEY]: Potential Fraud Warning, got money transfer request for avatar that isn't in this simulator - Details; Sender:" + e.sender.ToString() + " Receiver: " + e.receiver.ToString() + " Amount: " + e.amount.ToString()); | ||
506 | } | ||
507 | } | ||
508 | |||
509 | /// <summary> | ||
510 | /// Event Handler for when a root agent becomes a child agent | ||
511 | /// </summary> | ||
512 | /// <param name="avatar"></param> | ||
513 | private void MakeChildAgent(ScenePresence avatar) | ||
514 | { | ||
515 | lock (m_rootAgents) | ||
516 | { | ||
517 | if (m_rootAgents.ContainsKey(avatar.UUID)) | ||
518 | { | ||
519 | if (m_rootAgents[avatar.UUID] == avatar.Scene.RegionInfo.originRegionID) | ||
520 | { | ||
521 | m_rootAgents.Remove(avatar.UUID); | ||
522 | m_log.Info("[MONEY]: Removing " + avatar.Firstname + " " + avatar.Lastname + " as a root agent"); | ||
523 | } | ||
524 | |||
525 | } | ||
526 | } | ||
527 | |||
528 | } | ||
529 | |||
530 | /// <summary> | ||
531 | /// Event Handler for when the client logs out. | ||
532 | /// </summary> | ||
533 | /// <param name="AgentId"></param> | ||
534 | private void ClientLoggedOut(LLUUID AgentId) | ||
535 | { | ||
536 | lock (m_rootAgents) | ||
537 | { | ||
538 | if (m_rootAgents.ContainsKey(AgentId)) | ||
539 | { | ||
540 | m_rootAgents.Remove(AgentId); | ||
541 | //m_log.Info("[MONEY]: Removing " + AgentId + ". Agent logged out."); | ||
542 | } | ||
543 | } | ||
544 | } | ||
545 | |||
546 | /// <summary> | ||
547 | /// Call this when the client disconnects. | ||
548 | /// </summary> | ||
549 | /// <param name="client"></param> | ||
550 | public void ClientClosed(IClientAPI client) | ||
551 | { | ||
552 | ClientClosed(client.AgentId); | ||
553 | } | ||
554 | |||
555 | /// <summary> | ||
556 | /// Event Handler for when an Avatar enters one of the parcels in the simulator. | ||
557 | /// </summary> | ||
558 | /// <param name="avatar"></param> | ||
559 | /// <param name="localLandID"></param> | ||
560 | /// <param name="regionID"></param> | ||
561 | private void AvatarEnteringParcel(ScenePresence avatar, int localLandID, LLUUID regionID) | ||
562 | { | ||
563 | lock (m_rootAgents) | ||
564 | { | ||
565 | if (m_rootAgents.ContainsKey(avatar.UUID)) | ||
566 | { | ||
567 | if (avatar.Scene.RegionInfo.originRegionID != m_rootAgents[avatar.UUID]) | ||
568 | { | ||
569 | m_rootAgents[avatar.UUID] = avatar.Scene.RegionInfo.originRegionID; | ||
570 | //m_log.Info("[MONEY]: Claiming " + avatar.Firstname + " " + avatar.Lastname + " in region:" + avatar.RegionHandle + "."); | ||
571 | // Claim User! my user! Mine mine mine! | ||
572 | if (m_MoneyAddress.Length > 0) | ||
573 | { | ||
574 | Scene RegionItem = GetSceneByUUID(regionID); | ||
575 | if (RegionItem != null) | ||
576 | { | ||
577 | Hashtable hresult = claim_user(avatar.UUID, avatar.ControllingClient.SecureSessionId, regionID, RegionItem.RegionInfo.regionSecret); | ||
578 | if ((bool)hresult["success"] == true) | ||
579 | { | ||
580 | int funds = 0; | ||
581 | try | ||
582 | { | ||
583 | funds = (Int32)hresult["funds"]; | ||
584 | } | ||
585 | catch (InvalidCastException) | ||
586 | { | ||
587 | |||
588 | } | ||
589 | SetLocalFundsForAgentID(avatar.UUID, funds); | ||
590 | } | ||
591 | else | ||
592 | { | ||
593 | avatar.ControllingClient.SendAgentAlertMessage((string)hresult["errorMessage"], true); | ||
594 | } | ||
595 | } | ||
596 | } | ||
597 | } | ||
598 | } | ||
599 | else | ||
600 | { | ||
601 | lock (m_rootAgents) | ||
602 | { | ||
603 | m_rootAgents.Add(avatar.UUID, avatar.Scene.RegionInfo.originRegionID); | ||
604 | } | ||
605 | if (m_MoneyAddress.Length > 0) | ||
606 | { | ||
607 | Scene RegionItem = GetSceneByUUID(regionID); | ||
608 | if (RegionItem != null) | ||
609 | { | ||
610 | Hashtable hresult = claim_user(avatar.UUID, avatar.ControllingClient.SecureSessionId, regionID, RegionItem.RegionInfo.regionSecret); | ||
611 | if ((bool)hresult["success"] == true) | ||
612 | { | ||
613 | int funds = 0; | ||
614 | try | ||
615 | { | ||
616 | funds = (Int32)hresult["funds"]; | ||
617 | } | ||
618 | catch (InvalidCastException) | ||
619 | { | ||
620 | |||
621 | } | ||
622 | SetLocalFundsForAgentID(avatar.UUID, funds); | ||
623 | } | ||
624 | else | ||
625 | { | ||
626 | avatar.ControllingClient.SendAgentAlertMessage((string)hresult["errorMessage"], true); | ||
627 | } | ||
628 | } | ||
629 | } | ||
630 | |||
631 | //m_log.Info("[MONEY]: Claiming " + avatar.Firstname + " " + avatar.Lastname + " in region:" + avatar.RegionHandle + "."); | ||
632 | } | ||
633 | } | ||
634 | //m_log.Info("[FRIEND]: " + avatar.Name + " status:" + (!avatar.IsChildAgent).ToString()); | ||
635 | } | ||
636 | |||
637 | #endregion | ||
638 | |||
639 | /// <summary> | ||
640 | /// Transfer money | 356 | /// Transfer money |
641 | /// </summary> | 357 | /// </summary> |
642 | /// <param name="Sender"></param> | 358 | /// <param name="Sender"></param> |
@@ -695,96 +411,6 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
695 | return result; | 411 | return result; |
696 | } | 412 | } |
697 | 413 | ||
698 | #region Utility Helpers | ||
699 | /// <summary> | ||
700 | /// Locates a IClientAPI for the client specified | ||
701 | /// </summary> | ||
702 | /// <param name="AgentID"></param> | ||
703 | /// <returns></returns> | ||
704 | private IClientAPI LocateClientObject(LLUUID AgentID) | ||
705 | { | ||
706 | ScenePresence tPresence = null; | ||
707 | IClientAPI rclient = null; | ||
708 | |||
709 | lock (m_scenel) | ||
710 | { | ||
711 | foreach (Scene _scene in m_scenel.Values) | ||
712 | { | ||
713 | tPresence = _scene.GetScenePresence(AgentID); | ||
714 | if (tPresence != null) | ||
715 | { | ||
716 | if (!tPresence.IsChildAgent) | ||
717 | { | ||
718 | rclient = tPresence.ControllingClient; | ||
719 | } | ||
720 | } | ||
721 | if (rclient != null) | ||
722 | { | ||
723 | return rclient; | ||
724 | } | ||
725 | } | ||
726 | |||
727 | } | ||
728 | return null; | ||
729 | } | ||
730 | |||
731 | private Scene LocateSceneClientIn(LLUUID AgentId) | ||
732 | { | ||
733 | lock (m_scenel) | ||
734 | { | ||
735 | foreach (Scene _scene in m_scenel.Values) | ||
736 | { | ||
737 | ScenePresence tPresence = _scene.GetScenePresence(AgentId); | ||
738 | if (tPresence != null) | ||
739 | { | ||
740 | if (!tPresence.IsChildAgent) | ||
741 | { | ||
742 | return _scene; | ||
743 | } | ||
744 | } | ||
745 | |||
746 | } | ||
747 | |||
748 | } | ||
749 | return null; | ||
750 | } | ||
751 | |||
752 | /// <summary> | ||
753 | /// Utility function Gets a Random scene in the instance. For when which scene exactly you're doing something with doesn't matter | ||
754 | /// </summary> | ||
755 | /// <returns></returns> | ||
756 | public Scene GetRandomScene() | ||
757 | { | ||
758 | lock (m_scenel) | ||
759 | { | ||
760 | foreach (Scene rs in m_scenel.Values) | ||
761 | return rs; | ||
762 | } | ||
763 | return null; | ||
764 | |||
765 | } | ||
766 | /// <summary> | ||
767 | /// Utility function to get a Scene by RegionID in a module | ||
768 | /// </summary> | ||
769 | /// <param name="RegionID"></param> | ||
770 | /// <returns></returns> | ||
771 | public Scene GetSceneByUUID(LLUUID RegionID) | ||
772 | { | ||
773 | lock (m_scenel) | ||
774 | { | ||
775 | foreach (Scene rs in m_scenel.Values) | ||
776 | { | ||
777 | if (rs.RegionInfo.originRegionID == RegionID) | ||
778 | { | ||
779 | return rs; | ||
780 | } | ||
781 | } | ||
782 | } | ||
783 | return null; | ||
784 | } | ||
785 | #endregion | ||
786 | |||
787 | |||
788 | 414 | ||
789 | /// <summary> | 415 | /// <summary> |
790 | /// Sends the the stored money balance to the client | 416 | /// Sends the the stored money balance to the client |
@@ -798,7 +424,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
798 | if (client.AgentId == agentID && client.SessionId == SessionID) | 424 | if (client.AgentId == agentID && client.SessionId == SessionID) |
799 | { | 425 | { |
800 | int returnfunds = 0; | 426 | int returnfunds = 0; |
801 | 427 | ||
802 | try | 428 | try |
803 | { | 429 | { |
804 | returnfunds = GetFundsForAgentID(agentID); | 430 | returnfunds = GetFundsForAgentID(agentID); |
@@ -807,7 +433,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
807 | { | 433 | { |
808 | client.SendAlertMessage(e.Message + " "); | 434 | client.SendAlertMessage(e.Message + " "); |
809 | } | 435 | } |
810 | 436 | ||
811 | client.SendMoneyBalance(TransactionID, true, new byte[0], returnfunds); | 437 | client.SendMoneyBalance(TransactionID, true, new byte[0], returnfunds); |
812 | } | 438 | } |
813 | else | 439 | else |
@@ -816,67 +442,6 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
816 | } | 442 | } |
817 | } | 443 | } |
818 | 444 | ||
819 | #region local Fund Management | ||
820 | /// <summary> | ||
821 | /// Ensures that the agent accounting data is set up in this instance. | ||
822 | /// </summary> | ||
823 | /// <param name="agentID"></param> | ||
824 | private void CheckExistAndRefreshFunds(LLUUID agentID) | ||
825 | { | ||
826 | lock (m_KnownClientFunds) | ||
827 | { | ||
828 | if (!m_KnownClientFunds.ContainsKey(agentID)) | ||
829 | { | ||
830 | m_KnownClientFunds.Add(agentID, m_stipend); | ||
831 | } | ||
832 | else | ||
833 | { | ||
834 | if (m_KnownClientFunds[agentID] <= m_minFundsBeforeRefresh) | ||
835 | { | ||
836 | m_KnownClientFunds[agentID] = m_stipend; | ||
837 | } | ||
838 | } | ||
839 | } | ||
840 | } | ||
841 | /// <summary> | ||
842 | /// Gets the amount of Funds for an agent | ||
843 | /// </summary> | ||
844 | /// <param name="AgentID"></param> | ||
845 | /// <returns></returns> | ||
846 | private int GetFundsForAgentID(LLUUID AgentID) | ||
847 | { | ||
848 | int returnfunds = 0; | ||
849 | lock (m_KnownClientFunds) | ||
850 | { | ||
851 | if (m_KnownClientFunds.ContainsKey(AgentID)) | ||
852 | { | ||
853 | returnfunds = m_KnownClientFunds[AgentID]; | ||
854 | } | ||
855 | else | ||
856 | { | ||
857 | //throw new Exception("Unable to get funds."); | ||
858 | } | ||
859 | } | ||
860 | return returnfunds; | ||
861 | } | ||
862 | private void SetLocalFundsForAgentID(LLUUID AgentID, int amount) | ||
863 | { | ||
864 | lock (m_KnownClientFunds) | ||
865 | { | ||
866 | if (m_KnownClientFunds.ContainsKey(AgentID)) | ||
867 | { | ||
868 | m_KnownClientFunds[AgentID] = amount; | ||
869 | } | ||
870 | else | ||
871 | { | ||
872 | m_KnownClientFunds.Add(AgentID, amount); | ||
873 | } | ||
874 | } | ||
875 | |||
876 | } | ||
877 | |||
878 | #endregion | ||
879 | |||
880 | /// <summary> | 445 | /// <summary> |
881 | /// Gets the current balance for the user from the Grid Money Server | 446 | /// Gets the current balance for the user from the Grid Money Server |
882 | /// </summary> | 447 | /// </summary> |
@@ -887,7 +452,6 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
887 | /// <returns></returns> | 452 | /// <returns></returns> |
888 | public Hashtable GetBalanceForUserFromMoneyServer(LLUUID agentId, LLUUID secureSessionID, LLUUID regionId, string regionSecret) | 453 | public Hashtable GetBalanceForUserFromMoneyServer(LLUUID agentId, LLUUID secureSessionID, LLUUID regionId, string regionSecret) |
889 | { | 454 | { |
890 | |||
891 | Hashtable MoneyBalanceRequestParams = new Hashtable(); | 455 | Hashtable MoneyBalanceRequestParams = new Hashtable(); |
892 | MoneyBalanceRequestParams["agentId"] = agentId.ToString(); | 456 | MoneyBalanceRequestParams["agentId"] = agentId.ToString(); |
893 | MoneyBalanceRequestParams["secureSessionId"] = secureSessionID.ToString(); | 457 | MoneyBalanceRequestParams["secureSessionId"] = secureSessionID.ToString(); |
@@ -899,8 +463,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
899 | 463 | ||
900 | return MoneyRespData; | 464 | return MoneyRespData; |
901 | } | 465 | } |
902 | 466 | ||
903 | |||
904 | 467 | ||
905 | /// <summary> | 468 | /// <summary> |
906 | /// Generic XMLRPC client abstraction | 469 | /// Generic XMLRPC client abstraction |
@@ -921,7 +484,6 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
921 | } | 484 | } |
922 | catch (WebException ex) | 485 | catch (WebException ex) |
923 | { | 486 | { |
924 | |||
925 | m_log.ErrorFormat( | 487 | m_log.ErrorFormat( |
926 | "[MONEY]: Unable to connect to Money Server {0}. Exception {1}", | 488 | "[MONEY]: Unable to connect to Money Server {0}. Exception {1}", |
927 | m_MoneyAddress, ex); | 489 | m_MoneyAddress, ex); |
@@ -936,7 +498,6 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
936 | } | 498 | } |
937 | catch (SocketException ex) | 499 | catch (SocketException ex) |
938 | { | 500 | { |
939 | |||
940 | m_log.ErrorFormat( | 501 | m_log.ErrorFormat( |
941 | "[MONEY]: Unable to connect to Money Server {0}. Exception {1}", | 502 | "[MONEY]: Unable to connect to Money Server {0}. Exception {1}", |
942 | m_MoneyAddress, ex); | 503 | m_MoneyAddress, ex); |
@@ -961,7 +522,6 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
961 | ErrorHash["errorURI"] = ""; | 522 | ErrorHash["errorURI"] = ""; |
962 | 523 | ||
963 | return ErrorHash; | 524 | return ErrorHash; |
964 | |||
965 | } | 525 | } |
966 | if (MoneyResp.IsFault) | 526 | if (MoneyResp.IsFault) |
967 | { | 527 | { |
@@ -971,12 +531,12 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
971 | ErrorHash["errorURI"] = ""; | 531 | ErrorHash["errorURI"] = ""; |
972 | 532 | ||
973 | return ErrorHash; | 533 | return ErrorHash; |
974 | |||
975 | } | 534 | } |
976 | Hashtable MoneyRespData = (Hashtable)MoneyResp.Value; | 535 | Hashtable MoneyRespData = (Hashtable) MoneyResp.Value; |
977 | 536 | ||
978 | return MoneyRespData; | 537 | return MoneyRespData; |
979 | } | 538 | } |
539 | |||
980 | /// <summary> | 540 | /// <summary> |
981 | /// This informs the Money Grid Server that the avatar is in this simulator | 541 | /// This informs the Money Grid Server that the avatar is in this simulator |
982 | /// </summary> | 542 | /// </summary> |
@@ -987,7 +547,6 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
987 | /// <returns></returns> | 547 | /// <returns></returns> |
988 | public Hashtable claim_user(LLUUID agentId, LLUUID secureSessionID, LLUUID regionId, string regionSecret) | 548 | public Hashtable claim_user(LLUUID agentId, LLUUID secureSessionID, LLUUID regionId, string regionSecret) |
989 | { | 549 | { |
990 | |||
991 | Hashtable MoneyBalanceRequestParams = new Hashtable(); | 550 | Hashtable MoneyBalanceRequestParams = new Hashtable(); |
992 | MoneyBalanceRequestParams["agentId"] = agentId.ToString(); | 551 | MoneyBalanceRequestParams["agentId"] = agentId.ToString(); |
993 | MoneyBalanceRequestParams["secureSessionId"] = secureSessionID.ToString(); | 552 | MoneyBalanceRequestParams["secureSessionId"] = secureSessionID.ToString(); |
@@ -1009,8 +568,8 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
1009 | { | 568 | { |
1010 | foreach (Scene s in m_scenel.Values) | 569 | foreach (Scene s in m_scenel.Values) |
1011 | { | 570 | { |
1012 | SceneObjectPart part=s.GetSceneObjectPart(objectID); | 571 | SceneObjectPart part = s.GetSceneObjectPart(objectID); |
1013 | if(part != null) | 572 | if (part != null) |
1014 | { | 573 | { |
1015 | return part; | 574 | return part; |
1016 | } | 575 | } |
@@ -1021,8 +580,8 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
1021 | 580 | ||
1022 | private string resolveObjectName(LLUUID objectID) | 581 | private string resolveObjectName(LLUUID objectID) |
1023 | { | 582 | { |
1024 | SceneObjectPart part=findPrim(objectID); | 583 | SceneObjectPart part = findPrim(objectID); |
1025 | if(part != null) | 584 | if (part != null) |
1026 | { | 585 | { |
1027 | return part.Name; | 586 | return part.Name; |
1028 | } | 587 | } |
@@ -1032,7 +591,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
1032 | private string resolveAgentName(LLUUID agentID) | 591 | private string resolveAgentName(LLUUID agentID) |
1033 | { | 592 | { |
1034 | // try avatar username surname | 593 | // try avatar username surname |
1035 | Scene scene=GetRandomScene(); | 594 | Scene scene = GetRandomScene(); |
1036 | UserProfileData profile = scene.CommsManager.UserService.GetUserProfile(agentID); | 595 | UserProfileData profile = scene.CommsManager.UserService.GetUserProfile(agentID); |
1037 | if (profile != null) | 596 | if (profile != null) |
1038 | { | 597 | { |
@@ -1042,19 +601,6 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
1042 | return String.Empty; | 601 | return String.Empty; |
1043 | } | 602 | } |
1044 | 603 | ||
1045 | public bool ObjectGiveMoney(LLUUID objectID, LLUUID fromID, LLUUID toID, int amount) | ||
1046 | { | ||
1047 | string description=String.Format("Object {0} pays {1}", resolveObjectName(objectID), resolveAgentName(toID)); | ||
1048 | |||
1049 | bool give_result = doMoneyTransfer(fromID, toID, amount, 2, description); | ||
1050 | |||
1051 | if (m_MoneyAddress.Length == 0) | ||
1052 | BalanceUpdate(fromID, toID, give_result, description); | ||
1053 | |||
1054 | return give_result; | ||
1055 | |||
1056 | |||
1057 | } | ||
1058 | private void BalanceUpdate(LLUUID senderID, LLUUID receiverID, bool transactionresult, string description) | 604 | private void BalanceUpdate(LLUUID senderID, LLUUID receiverID, bool transactionresult, string description) |
1059 | { | 605 | { |
1060 | IClientAPI sender = LocateClientObject(senderID); | 606 | IClientAPI sender = LocateClientObject(senderID); |
@@ -1091,7 +637,6 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
1091 | IClientAPI cli = LocateClientObject(sourceId); | 637 | IClientAPI cli = LocateClientObject(sourceId); |
1092 | if (cli != null) | 638 | if (cli != null) |
1093 | { | 639 | { |
1094 | |||
1095 | Scene userScene = null; | 640 | Scene userScene = null; |
1096 | lock (m_rootAgents) | 641 | lock (m_rootAgents) |
1097 | { | 642 | { |
@@ -1112,18 +657,18 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
1112 | ht["flags"] = flags; | 657 | ht["flags"] = flags; |
1113 | ht["transactionType"] = transactiontype; | 658 | ht["transactionType"] = transactiontype; |
1114 | ht["description"] = description; | 659 | ht["description"] = description; |
1115 | 660 | ||
1116 | Hashtable hresult = genericCurrencyXMLRPCRequest(ht, "regionMoveMoney"); | 661 | Hashtable hresult = genericCurrencyXMLRPCRequest(ht, "regionMoveMoney"); |
1117 | 662 | ||
1118 | if ((bool)hresult["success"] == true) | 663 | if ((bool) hresult["success"] == true) |
1119 | { | 664 | { |
1120 | int funds1 = 0; | 665 | int funds1 = 0; |
1121 | int funds2 = 0; | 666 | int funds2 = 0; |
1122 | try | 667 | try |
1123 | { | 668 | { |
1124 | funds1 = (Int32)hresult["funds"]; | 669 | funds1 = (Int32) hresult["funds"]; |
1125 | } | 670 | } |
1126 | catch(InvalidCastException) | 671 | catch (InvalidCastException) |
1127 | { | 672 | { |
1128 | funds1 = 0; | 673 | funds1 = 0; |
1129 | } | 674 | } |
@@ -1132,7 +677,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
1132 | { | 677 | { |
1133 | try | 678 | try |
1134 | { | 679 | { |
1135 | funds2 = (Int32)hresult["funds2"]; | 680 | funds2 = (Int32) hresult["funds2"]; |
1136 | } | 681 | } |
1137 | catch (InvalidCastException) | 682 | catch (InvalidCastException) |
1138 | { | 683 | { |
@@ -1146,9 +691,8 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
1146 | } | 691 | } |
1147 | else | 692 | else |
1148 | { | 693 | { |
1149 | cli.SendAgentAlertMessage((string)hresult["errorMessage"], true); | 694 | cli.SendAgentAlertMessage((string) hresult["errorMessage"], true); |
1150 | } | 695 | } |
1151 | |||
1152 | } | 696 | } |
1153 | } | 697 | } |
1154 | else | 698 | else |
@@ -1157,7 +701,6 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
1157 | } | 701 | } |
1158 | 702 | ||
1159 | return rvalue; | 703 | return rvalue; |
1160 | |||
1161 | } | 704 | } |
1162 | 705 | ||
1163 | public int GetRemoteBalance(LLUUID agentId) | 706 | public int GetRemoteBalance(LLUUID agentId) |
@@ -1172,12 +715,14 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
1172 | { | 715 | { |
1173 | if (m_MoneyAddress.Length > 0) | 716 | if (m_MoneyAddress.Length > 0) |
1174 | { | 717 | { |
1175 | Hashtable hbinfo = GetBalanceForUserFromMoneyServer(aClient.AgentId, aClient.SecureSessionId, s.RegionInfo.originRegionID.ToString(), s.RegionInfo.regionSecret); | 718 | Hashtable hbinfo = |
1176 | if ((bool)hbinfo["success"] == true) | 719 | GetBalanceForUserFromMoneyServer(aClient.AgentId, aClient.SecureSessionId, s.RegionInfo.originRegionID.ToString(), |
720 | s.RegionInfo.regionSecret); | ||
721 | if ((bool) hbinfo["success"] == true) | ||
1177 | { | 722 | { |
1178 | try | 723 | try |
1179 | { | 724 | { |
1180 | funds = (Int32)hbinfo["funds"]; | 725 | funds = (Int32) hbinfo["funds"]; |
1181 | } | 726 | } |
1182 | catch (ArgumentException) | 727 | catch (ArgumentException) |
1183 | { | 728 | { |
@@ -1194,12 +739,12 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
1194 | { | 739 | { |
1195 | funds = 0; | 740 | funds = 0; |
1196 | } | 741 | } |
1197 | |||
1198 | } | 742 | } |
1199 | else | 743 | else |
1200 | { | 744 | { |
1201 | m_log.WarnFormat("[MONEY]: Getting Money for user {0} failed with the following message:{1}", agentId, (string)hbinfo["errorMessage"]); | 745 | m_log.WarnFormat("[MONEY]: Getting Money for user {0} failed with the following message:{1}", agentId, |
1202 | aClient.SendAlertMessage((string)hbinfo["errorMessage"]); | 746 | (string) hbinfo["errorMessage"]); |
747 | aClient.SendAlertMessage((string) hbinfo["errorMessage"]); | ||
1203 | } | 748 | } |
1204 | } | 749 | } |
1205 | 750 | ||
@@ -1221,17 +766,16 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
1221 | public XmlRpcResponse GridMoneyUpdate(XmlRpcRequest request) | 766 | public XmlRpcResponse GridMoneyUpdate(XmlRpcRequest request) |
1222 | { | 767 | { |
1223 | m_log.Debug("[MONEY]: Dynamic balance update called."); | 768 | m_log.Debug("[MONEY]: Dynamic balance update called."); |
1224 | Hashtable requestData = (Hashtable)request.Params[0]; | 769 | Hashtable requestData = (Hashtable) request.Params[0]; |
1225 | 770 | ||
1226 | if (requestData.ContainsKey("agentId")) | 771 | if (requestData.ContainsKey("agentId")) |
1227 | { | 772 | { |
1228 | LLUUID agentId = LLUUID.Zero; | 773 | LLUUID agentId = LLUUID.Zero; |
1229 | 774 | ||
1230 | Helpers.TryParse((string)requestData["agentId"], out agentId); | 775 | Helpers.TryParse((string) requestData["agentId"], out agentId); |
1231 | if (agentId != LLUUID.Zero) | 776 | if (agentId != LLUUID.Zero) |
1232 | { | 777 | { |
1233 | GetRemoteBalance(agentId); | 778 | GetRemoteBalance(agentId); |
1234 | |||
1235 | } | 779 | } |
1236 | else | 780 | else |
1237 | { | 781 | { |
@@ -1245,7 +789,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
1245 | XmlRpcResponse r = new XmlRpcResponse(); | 789 | XmlRpcResponse r = new XmlRpcResponse(); |
1246 | Hashtable rparms = new Hashtable(); | 790 | Hashtable rparms = new Hashtable(); |
1247 | rparms["success"] = true; | 791 | rparms["success"] = true; |
1248 | 792 | ||
1249 | r.Value = rparms; | 793 | r.Value = rparms; |
1250 | return r; | 794 | return r; |
1251 | } | 795 | } |
@@ -1257,24 +801,24 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
1257 | { | 801 | { |
1258 | XmlRpcResponse ret = new XmlRpcResponse(); | 802 | XmlRpcResponse ret = new XmlRpcResponse(); |
1259 | Hashtable retparam = new Hashtable(); | 803 | Hashtable retparam = new Hashtable(); |
1260 | Hashtable requestData = (Hashtable)request.Params[0]; | 804 | Hashtable requestData = (Hashtable) request.Params[0]; |
1261 | 805 | ||
1262 | LLUUID agentId = LLUUID.Zero; | 806 | LLUUID agentId = LLUUID.Zero; |
1263 | LLUUID soundId = LLUUID.Zero; | 807 | LLUUID soundId = LLUUID.Zero; |
1264 | 808 | ||
1265 | Helpers.TryParse((string)requestData["agentId"], out agentId); | 809 | Helpers.TryParse((string) requestData["agentId"], out agentId); |
1266 | Helpers.TryParse((string)requestData["soundId"], out soundId); | 810 | Helpers.TryParse((string) requestData["soundId"], out soundId); |
1267 | string text=(string)requestData["text"]; | 811 | string text = (string) requestData["text"]; |
1268 | string secret=(string)requestData["secret"]; | 812 | string secret = (string) requestData["secret"]; |
1269 | 813 | ||
1270 | Scene userScene = GetRandomScene(); | 814 | Scene userScene = GetRandomScene(); |
1271 | if(userScene.RegionInfo.regionSecret.ToString() == secret) | 815 | if (userScene.RegionInfo.regionSecret.ToString() == secret) |
1272 | { | 816 | { |
1273 | IClientAPI client = LocateClientObject(agentId); | 817 | IClientAPI client = LocateClientObject(agentId); |
1274 | 818 | ||
1275 | if (client != null) | 819 | if (client != null) |
1276 | { | 820 | { |
1277 | if(soundId != LLUUID.Zero) | 821 | if (soundId != LLUUID.Zero) |
1278 | client.SendPlayAttachedSound(soundId, LLUUID.Zero, LLUUID.Zero, 1.0f, 0); | 822 | client.SendPlayAttachedSound(soundId, LLUUID.Zero, LLUUID.Zero, 1.0f, 0); |
1279 | client.SendBlueBoxMessage(LLUUID.Zero, LLUUID.Zero, "", text); | 823 | client.SendBlueBoxMessage(LLUUID.Zero, LLUUID.Zero, "", text); |
1280 | retparam.Add("success", true); | 824 | retparam.Add("success", true); |
@@ -1293,12 +837,11 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
1293 | return ret; | 837 | return ret; |
1294 | } | 838 | } |
1295 | 839 | ||
1296 | |||
1297 | # region Standalone box enablers only | 840 | # region Standalone box enablers only |
1298 | 841 | ||
1299 | public XmlRpcResponse quote_func(XmlRpcRequest request) | 842 | public XmlRpcResponse quote_func(XmlRpcRequest request) |
1300 | { | 843 | { |
1301 | Hashtable requestData = (Hashtable)request.Params[0]; | 844 | Hashtable requestData = (Hashtable) request.Params[0]; |
1302 | LLUUID agentId = LLUUID.Zero; | 845 | LLUUID agentId = LLUUID.Zero; |
1303 | int amount = 0; | 846 | int amount = 0; |
1304 | Hashtable quoteResponse = new Hashtable(); | 847 | Hashtable quoteResponse = new Hashtable(); |
@@ -1306,51 +849,48 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
1306 | 849 | ||
1307 | if (requestData.ContainsKey("agentId") && requestData.ContainsKey("currencyBuy")) | 850 | if (requestData.ContainsKey("agentId") && requestData.ContainsKey("currencyBuy")) |
1308 | { | 851 | { |
1309 | Helpers.TryParse((string)requestData["agentId"], out agentId); | 852 | Helpers.TryParse((string) requestData["agentId"], out agentId); |
1310 | try | 853 | try |
1311 | { | 854 | { |
1312 | amount = (Int32)requestData["currencyBuy"]; | 855 | amount = (Int32) requestData["currencyBuy"]; |
1313 | } | 856 | } |
1314 | catch (InvalidCastException) | 857 | catch (InvalidCastException) |
1315 | { | 858 | { |
1316 | |||
1317 | } | 859 | } |
1318 | Hashtable currencyResponse = new Hashtable(); | 860 | Hashtable currencyResponse = new Hashtable(); |
1319 | currencyResponse.Add("estimatedCost", 0); | 861 | currencyResponse.Add("estimatedCost", 0); |
1320 | currencyResponse.Add("currencyBuy", amount); | 862 | currencyResponse.Add("currencyBuy", amount); |
1321 | 863 | ||
1322 | quoteResponse.Add("success", true); | 864 | quoteResponse.Add("success", true); |
1323 | quoteResponse.Add("currency", currencyResponse); | 865 | quoteResponse.Add("currency", currencyResponse); |
1324 | quoteResponse.Add("confirm", "asdfad9fj39ma9fj"); | 866 | quoteResponse.Add("confirm", "asdfad9fj39ma9fj"); |
1325 | 867 | ||
1326 | returnval.Value = quoteResponse; | 868 | returnval.Value = quoteResponse; |
1327 | return returnval; | 869 | return returnval; |
1328 | } | 870 | } |
1329 | 871 | ||
1330 | 872 | ||
1331 | |||
1332 | quoteResponse.Add("success", false); | 873 | quoteResponse.Add("success", false); |
1333 | quoteResponse.Add("errorMessage", "Invalid parameters passed to the quote box"); | 874 | quoteResponse.Add("errorMessage", "Invalid parameters passed to the quote box"); |
1334 | quoteResponse.Add("errorURI", "http://www.opensimulator.org/wiki"); | 875 | quoteResponse.Add("errorURI", "http://www.opensimulator.org/wiki"); |
1335 | returnval.Value = quoteResponse; | 876 | returnval.Value = quoteResponse; |
1336 | return returnval; | 877 | return returnval; |
1337 | } | 878 | } |
879 | |||
1338 | public XmlRpcResponse buy_func(XmlRpcRequest request) | 880 | public XmlRpcResponse buy_func(XmlRpcRequest request) |
1339 | { | 881 | { |
1340 | 882 | Hashtable requestData = (Hashtable) request.Params[0]; | |
1341 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
1342 | LLUUID agentId = LLUUID.Zero; | 883 | LLUUID agentId = LLUUID.Zero; |
1343 | int amount = 0; | 884 | int amount = 0; |
1344 | if (requestData.ContainsKey("agentId") && requestData.ContainsKey("currencyBuy")) | 885 | if (requestData.ContainsKey("agentId") && requestData.ContainsKey("currencyBuy")) |
1345 | { | 886 | { |
1346 | Helpers.TryParse((string)requestData["agentId"], out agentId); | 887 | Helpers.TryParse((string) requestData["agentId"], out agentId); |
1347 | try | 888 | try |
1348 | { | 889 | { |
1349 | amount = (Int32)requestData["currencyBuy"]; | 890 | amount = (Int32) requestData["currencyBuy"]; |
1350 | } | 891 | } |
1351 | catch (InvalidCastException) | 892 | catch (InvalidCastException) |
1352 | { | 893 | { |
1353 | |||
1354 | } | 894 | } |
1355 | if (agentId != LLUUID.Zero) | 895 | if (agentId != LLUUID.Zero) |
1356 | { | 896 | { |
@@ -1412,26 +952,25 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
1412 | ret.Value = retparam; | 952 | ret.Value = retparam; |
1413 | 953 | ||
1414 | return ret; | 954 | return ret; |
1415 | |||
1416 | } | 955 | } |
956 | |||
1417 | public XmlRpcResponse landBuy_func(XmlRpcRequest request) | 957 | public XmlRpcResponse landBuy_func(XmlRpcRequest request) |
1418 | { | 958 | { |
1419 | XmlRpcResponse ret = new XmlRpcResponse(); | 959 | XmlRpcResponse ret = new XmlRpcResponse(); |
1420 | Hashtable retparam = new Hashtable(); | 960 | Hashtable retparam = new Hashtable(); |
1421 | Hashtable requestData = (Hashtable)request.Params[0]; | 961 | Hashtable requestData = (Hashtable) request.Params[0]; |
1422 | 962 | ||
1423 | LLUUID agentId = LLUUID.Zero; | 963 | LLUUID agentId = LLUUID.Zero; |
1424 | int amount = 0; | 964 | int amount = 0; |
1425 | if (requestData.ContainsKey("agentId") && requestData.ContainsKey("currencyBuy")) | 965 | if (requestData.ContainsKey("agentId") && requestData.ContainsKey("currencyBuy")) |
1426 | { | 966 | { |
1427 | Helpers.TryParse((string)requestData["agentId"], out agentId); | 967 | Helpers.TryParse((string) requestData["agentId"], out agentId); |
1428 | try | 968 | try |
1429 | { | 969 | { |
1430 | amount = (Int32)requestData["currencyBuy"]; | 970 | amount = (Int32) requestData["currencyBuy"]; |
1431 | } | 971 | } |
1432 | catch (InvalidCastException) | 972 | catch (InvalidCastException) |
1433 | { | 973 | { |
1434 | |||
1435 | } | 974 | } |
1436 | if (agentId != LLUUID.Zero) | 975 | if (agentId != LLUUID.Zero) |
1437 | { | 976 | { |
@@ -1457,35 +996,475 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney | |||
1457 | ret.Value = retparam; | 996 | ret.Value = retparam; |
1458 | 997 | ||
1459 | return ret; | 998 | return ret; |
999 | } | ||
1000 | |||
1001 | #endregion | ||
1002 | |||
1003 | #region local Fund Management | ||
1004 | |||
1005 | /// <summary> | ||
1006 | /// Ensures that the agent accounting data is set up in this instance. | ||
1007 | /// </summary> | ||
1008 | /// <param name="agentID"></param> | ||
1009 | private void CheckExistAndRefreshFunds(LLUUID agentID) | ||
1010 | { | ||
1011 | lock (m_KnownClientFunds) | ||
1012 | { | ||
1013 | if (!m_KnownClientFunds.ContainsKey(agentID)) | ||
1014 | { | ||
1015 | m_KnownClientFunds.Add(agentID, m_stipend); | ||
1016 | } | ||
1017 | else | ||
1018 | { | ||
1019 | if (m_KnownClientFunds[agentID] <= m_minFundsBeforeRefresh) | ||
1020 | { | ||
1021 | m_KnownClientFunds[agentID] = m_stipend; | ||
1022 | } | ||
1023 | } | ||
1024 | } | ||
1025 | } | ||
1460 | 1026 | ||
1027 | /// <summary> | ||
1028 | /// Gets the amount of Funds for an agent | ||
1029 | /// </summary> | ||
1030 | /// <param name="AgentID"></param> | ||
1031 | /// <returns></returns> | ||
1032 | private int GetFundsForAgentID(LLUUID AgentID) | ||
1033 | { | ||
1034 | int returnfunds = 0; | ||
1035 | lock (m_KnownClientFunds) | ||
1036 | { | ||
1037 | if (m_KnownClientFunds.ContainsKey(AgentID)) | ||
1038 | { | ||
1039 | returnfunds = m_KnownClientFunds[AgentID]; | ||
1040 | } | ||
1041 | else | ||
1042 | { | ||
1043 | //throw new Exception("Unable to get funds."); | ||
1044 | } | ||
1045 | } | ||
1046 | return returnfunds; | ||
1461 | } | 1047 | } |
1048 | |||
1049 | private void SetLocalFundsForAgentID(LLUUID AgentID, int amount) | ||
1050 | { | ||
1051 | lock (m_KnownClientFunds) | ||
1052 | { | ||
1053 | if (m_KnownClientFunds.ContainsKey(AgentID)) | ||
1054 | { | ||
1055 | m_KnownClientFunds[AgentID] = amount; | ||
1056 | } | ||
1057 | else | ||
1058 | { | ||
1059 | m_KnownClientFunds.Add(AgentID, amount); | ||
1060 | } | ||
1061 | } | ||
1062 | } | ||
1063 | |||
1462 | #endregion | 1064 | #endregion |
1463 | 1065 | ||
1464 | public void PostInitialise() | 1066 | #region Utility Helpers |
1067 | |||
1068 | /// <summary> | ||
1069 | /// Locates a IClientAPI for the client specified | ||
1070 | /// </summary> | ||
1071 | /// <param name="AgentID"></param> | ||
1072 | /// <returns></returns> | ||
1073 | private IClientAPI LocateClientObject(LLUUID AgentID) | ||
1465 | { | 1074 | { |
1075 | ScenePresence tPresence = null; | ||
1076 | IClientAPI rclient = null; | ||
1077 | |||
1078 | lock (m_scenel) | ||
1079 | { | ||
1080 | foreach (Scene _scene in m_scenel.Values) | ||
1081 | { | ||
1082 | tPresence = _scene.GetScenePresence(AgentID); | ||
1083 | if (tPresence != null) | ||
1084 | { | ||
1085 | if (!tPresence.IsChildAgent) | ||
1086 | { | ||
1087 | rclient = tPresence.ControllingClient; | ||
1088 | } | ||
1089 | } | ||
1090 | if (rclient != null) | ||
1091 | { | ||
1092 | return rclient; | ||
1093 | } | ||
1094 | } | ||
1095 | } | ||
1096 | return null; | ||
1466 | } | 1097 | } |
1467 | 1098 | ||
1468 | public void Close() | 1099 | private Scene LocateSceneClientIn(LLUUID AgentId) |
1469 | { | 1100 | { |
1101 | lock (m_scenel) | ||
1102 | { | ||
1103 | foreach (Scene _scene in m_scenel.Values) | ||
1104 | { | ||
1105 | ScenePresence tPresence = _scene.GetScenePresence(AgentId); | ||
1106 | if (tPresence != null) | ||
1107 | { | ||
1108 | if (!tPresence.IsChildAgent) | ||
1109 | { | ||
1110 | return _scene; | ||
1111 | } | ||
1112 | } | ||
1113 | } | ||
1114 | } | ||
1115 | return null; | ||
1470 | } | 1116 | } |
1471 | 1117 | ||
1472 | public string Name | 1118 | /// <summary> |
1119 | /// Utility function Gets a Random scene in the instance. For when which scene exactly you're doing something with doesn't matter | ||
1120 | /// </summary> | ||
1121 | /// <returns></returns> | ||
1122 | public Scene GetRandomScene() | ||
1473 | { | 1123 | { |
1474 | get { return "BetaGridLikeMoneyModule"; } | 1124 | lock (m_scenel) |
1125 | { | ||
1126 | foreach (Scene rs in m_scenel.Values) | ||
1127 | return rs; | ||
1128 | } | ||
1129 | return null; | ||
1475 | } | 1130 | } |
1476 | 1131 | ||
1477 | public bool IsSharedModule | 1132 | /// <summary> |
1133 | /// Utility function to get a Scene by RegionID in a module | ||
1134 | /// </summary> | ||
1135 | /// <param name="RegionID"></param> | ||
1136 | /// <returns></returns> | ||
1137 | public Scene GetSceneByUUID(LLUUID RegionID) | ||
1478 | { | 1138 | { |
1479 | get { return true; } | 1139 | lock (m_scenel) |
1140 | { | ||
1141 | foreach (Scene rs in m_scenel.Values) | ||
1142 | { | ||
1143 | if (rs.RegionInfo.originRegionID == RegionID) | ||
1144 | { | ||
1145 | return rs; | ||
1146 | } | ||
1147 | } | ||
1148 | } | ||
1149 | return null; | ||
1150 | } | ||
1151 | |||
1152 | #endregion | ||
1153 | |||
1154 | #region event Handlers | ||
1155 | |||
1156 | public void requestPayPrice(IClientAPI client, LLUUID objectID) | ||
1157 | { | ||
1158 | Scene scene = LocateSceneClientIn(client.AgentId); | ||
1159 | if (scene == null) | ||
1160 | return; | ||
1161 | |||
1162 | SceneObjectPart task = scene.GetSceneObjectPart(objectID); | ||
1163 | if (task == null) | ||
1164 | return; | ||
1165 | SceneObjectGroup group = task.ParentGroup; | ||
1166 | SceneObjectPart root = group.RootPart; | ||
1167 | |||
1168 | client.SendPayPrice(objectID, root.PayPrice); | ||
1169 | } | ||
1170 | |||
1171 | /// <summary> | ||
1172 | /// When the client closes the connection we remove their accounting info from memory to free up resources. | ||
1173 | /// </summary> | ||
1174 | /// <param name="AgentID"></param> | ||
1175 | public void ClientClosed(LLUUID AgentID) | ||
1176 | { | ||
1177 | lock (m_KnownClientFunds) | ||
1178 | { | ||
1179 | if (m_keepMoneyAcrossLogins && m_MoneyAddress.Length == 0) | ||
1180 | { | ||
1181 | } | ||
1182 | else | ||
1183 | { | ||
1184 | m_KnownClientFunds.Remove(AgentID); | ||
1185 | } | ||
1186 | } | ||
1480 | } | 1187 | } |
1188 | |||
1189 | /// <summary> | ||
1190 | /// Event called Economy Data Request handler. | ||
1191 | /// </summary> | ||
1192 | /// <param name="agentId"></param> | ||
1193 | public void EconomyDataRequestHandler(LLUUID agentId) | ||
1194 | { | ||
1195 | IClientAPI user = LocateClientObject(agentId); | ||
1196 | |||
1197 | if (user != null) | ||
1198 | { | ||
1199 | user.SendEconomyData(EnergyEfficiency, ObjectCapacity, ObjectCount, PriceEnergyUnit, PriceGroupCreate, | ||
1200 | PriceObjectClaim, PriceObjectRent, PriceObjectScaleFactor, PriceParcelClaim, PriceParcelClaimFactor, | ||
1201 | PriceParcelRent, PricePublicObjectDecay, PricePublicObjectDelete, PriceRentLight, PriceUpload, | ||
1202 | TeleportMinPrice, TeleportPriceExponent); | ||
1203 | } | ||
1204 | } | ||
1205 | |||
1206 | private void ValidateLandBuy(Object osender, EventManager.LandBuyArgs e) | ||
1207 | { | ||
1208 | if (m_MoneyAddress.Length == 0) | ||
1209 | { | ||
1210 | lock (m_KnownClientFunds) | ||
1211 | { | ||
1212 | if (m_KnownClientFunds.ContainsKey(e.agentId)) | ||
1213 | { | ||
1214 | // Does the sender have enough funds to give? | ||
1215 | if (m_KnownClientFunds[e.agentId] >= e.parcelPrice) | ||
1216 | { | ||
1217 | lock (e) | ||
1218 | { | ||
1219 | e.economyValidated = true; | ||
1220 | } | ||
1221 | } | ||
1222 | } | ||
1223 | } | ||
1224 | } | ||
1225 | else | ||
1226 | { | ||
1227 | if (GetRemoteBalance(e.agentId) >= e.parcelPrice) | ||
1228 | { | ||
1229 | lock (e) | ||
1230 | { | ||
1231 | e.economyValidated = true; | ||
1232 | } | ||
1233 | } | ||
1234 | } | ||
1235 | } | ||
1236 | |||
1237 | private void processLandBuy(Object osender, EventManager.LandBuyArgs e) | ||
1238 | { | ||
1239 | lock (e) | ||
1240 | { | ||
1241 | if (e.economyValidated == true && e.transactionID == 0) | ||
1242 | { | ||
1243 | e.transactionID = Util.UnixTimeSinceEpoch(); | ||
1244 | |||
1245 | if (doMoneyTransfer(e.agentId, e.parcelOwnerID, e.parcelPrice, 0, "Land purchase")) | ||
1246 | { | ||
1247 | lock (e) | ||
1248 | { | ||
1249 | e.amountDebited = e.parcelPrice; | ||
1250 | } | ||
1251 | } | ||
1252 | } | ||
1253 | } | ||
1254 | } | ||
1255 | |||
1256 | /// <summary> | ||
1257 | /// THis method gets called when someone pays someone else as a gift. | ||
1258 | /// </summary> | ||
1259 | /// <param name="osender"></param> | ||
1260 | /// <param name="e"></param> | ||
1261 | private void MoneyTransferAction(Object osender, EventManager.MoneyTransferArgs e) | ||
1262 | { | ||
1263 | IClientAPI sender = null; | ||
1264 | IClientAPI receiver = null; | ||
1265 | |||
1266 | if (m_MoneyAddress.Length > 0) // Handled on server | ||
1267 | e.description = String.Empty; | ||
1268 | |||
1269 | if (e.transactiontype == 5008) // Object gets paid | ||
1270 | { | ||
1271 | sender = LocateClientObject(e.sender); | ||
1272 | if (sender != null) | ||
1273 | { | ||
1274 | SceneObjectPart part = findPrim(e.receiver); | ||
1275 | if (part == null) | ||
1276 | return; | ||
1277 | |||
1278 | string name = resolveAgentName(part.OwnerID); | ||
1279 | if (name == String.Empty) | ||
1280 | name = "(hippos)"; | ||
1281 | |||
1282 | receiver = LocateClientObject(part.OwnerID); | ||
1283 | |||
1284 | string description = String.Format("Paid {0} via object {1}", name, e.description); | ||
1285 | bool transactionresult = doMoneyTransfer(e.sender, part.OwnerID, e.amount, e.transactiontype, description); | ||
1286 | |||
1287 | if (transactionresult) | ||
1288 | { | ||
1289 | ObjectPaid handlerOnObjectPaid = OnObjectPaid; | ||
1290 | if (handlerOnObjectPaid != null) | ||
1291 | { | ||
1292 | handlerOnObjectPaid(e.receiver, e.sender, e.amount); | ||
1293 | } | ||
1294 | } | ||
1295 | |||
1296 | if (e.sender != e.receiver) | ||
1297 | { | ||
1298 | sender.SendMoneyBalance(LLUUID.Random(), transactionresult, Helpers.StringToField(e.description), GetFundsForAgentID(e.sender)); | ||
1299 | } | ||
1300 | if (receiver != null) | ||
1301 | { | ||
1302 | receiver.SendMoneyBalance(LLUUID.Random(), transactionresult, Helpers.StringToField(e.description), GetFundsForAgentID(part.OwnerID)); | ||
1303 | } | ||
1304 | } | ||
1305 | return; | ||
1306 | } | ||
1307 | |||
1308 | sender = LocateClientObject(e.sender); | ||
1309 | if (sender != null) | ||
1310 | { | ||
1311 | receiver = LocateClientObject(e.receiver); | ||
1312 | |||
1313 | bool transactionresult = doMoneyTransfer(e.sender, e.receiver, e.amount, e.transactiontype, e.description); | ||
1314 | |||
1315 | if (e.sender != e.receiver) | ||
1316 | { | ||
1317 | if (sender != null) | ||
1318 | { | ||
1319 | sender.SendMoneyBalance(LLUUID.Random(), transactionresult, Helpers.StringToField(e.description), GetFundsForAgentID(e.sender)); | ||
1320 | } | ||
1321 | } | ||
1322 | |||
1323 | if (receiver != null) | ||
1324 | { | ||
1325 | receiver.SendMoneyBalance(LLUUID.Random(), transactionresult, Helpers.StringToField(e.description), GetFundsForAgentID(e.receiver)); | ||
1326 | } | ||
1327 | } | ||
1328 | else | ||
1329 | { | ||
1330 | m_log.Warn("[MONEY]: Potential Fraud Warning, got money transfer request for avatar that isn't in this simulator - Details; Sender:" + | ||
1331 | e.sender.ToString() + " Receiver: " + e.receiver.ToString() + " Amount: " + e.amount.ToString()); | ||
1332 | } | ||
1333 | } | ||
1334 | |||
1335 | /// <summary> | ||
1336 | /// Event Handler for when a root agent becomes a child agent | ||
1337 | /// </summary> | ||
1338 | /// <param name="avatar"></param> | ||
1339 | private void MakeChildAgent(ScenePresence avatar) | ||
1340 | { | ||
1341 | lock (m_rootAgents) | ||
1342 | { | ||
1343 | if (m_rootAgents.ContainsKey(avatar.UUID)) | ||
1344 | { | ||
1345 | if (m_rootAgents[avatar.UUID] == avatar.Scene.RegionInfo.originRegionID) | ||
1346 | { | ||
1347 | m_rootAgents.Remove(avatar.UUID); | ||
1348 | m_log.Info("[MONEY]: Removing " + avatar.Firstname + " " + avatar.Lastname + " as a root agent"); | ||
1349 | } | ||
1350 | } | ||
1351 | } | ||
1352 | } | ||
1353 | |||
1354 | /// <summary> | ||
1355 | /// Event Handler for when the client logs out. | ||
1356 | /// </summary> | ||
1357 | /// <param name="AgentId"></param> | ||
1358 | private void ClientLoggedOut(LLUUID AgentId) | ||
1359 | { | ||
1360 | lock (m_rootAgents) | ||
1361 | { | ||
1362 | if (m_rootAgents.ContainsKey(AgentId)) | ||
1363 | { | ||
1364 | m_rootAgents.Remove(AgentId); | ||
1365 | //m_log.Info("[MONEY]: Removing " + AgentId + ". Agent logged out."); | ||
1366 | } | ||
1367 | } | ||
1368 | } | ||
1369 | |||
1370 | /// <summary> | ||
1371 | /// Call this when the client disconnects. | ||
1372 | /// </summary> | ||
1373 | /// <param name="client"></param> | ||
1374 | public void ClientClosed(IClientAPI client) | ||
1375 | { | ||
1376 | ClientClosed(client.AgentId); | ||
1377 | } | ||
1378 | |||
1379 | /// <summary> | ||
1380 | /// Event Handler for when an Avatar enters one of the parcels in the simulator. | ||
1381 | /// </summary> | ||
1382 | /// <param name="avatar"></param> | ||
1383 | /// <param name="localLandID"></param> | ||
1384 | /// <param name="regionID"></param> | ||
1385 | private void AvatarEnteringParcel(ScenePresence avatar, int localLandID, LLUUID regionID) | ||
1386 | { | ||
1387 | lock (m_rootAgents) | ||
1388 | { | ||
1389 | if (m_rootAgents.ContainsKey(avatar.UUID)) | ||
1390 | { | ||
1391 | if (avatar.Scene.RegionInfo.originRegionID != m_rootAgents[avatar.UUID]) | ||
1392 | { | ||
1393 | m_rootAgents[avatar.UUID] = avatar.Scene.RegionInfo.originRegionID; | ||
1394 | //m_log.Info("[MONEY]: Claiming " + avatar.Firstname + " " + avatar.Lastname + " in region:" + avatar.RegionHandle + "."); | ||
1395 | // Claim User! my user! Mine mine mine! | ||
1396 | if (m_MoneyAddress.Length > 0) | ||
1397 | { | ||
1398 | Scene RegionItem = GetSceneByUUID(regionID); | ||
1399 | if (RegionItem != null) | ||
1400 | { | ||
1401 | Hashtable hresult = | ||
1402 | claim_user(avatar.UUID, avatar.ControllingClient.SecureSessionId, regionID, RegionItem.RegionInfo.regionSecret); | ||
1403 | if ((bool) hresult["success"] == true) | ||
1404 | { | ||
1405 | int funds = 0; | ||
1406 | try | ||
1407 | { | ||
1408 | funds = (Int32) hresult["funds"]; | ||
1409 | } | ||
1410 | catch (InvalidCastException) | ||
1411 | { | ||
1412 | } | ||
1413 | SetLocalFundsForAgentID(avatar.UUID, funds); | ||
1414 | } | ||
1415 | else | ||
1416 | { | ||
1417 | avatar.ControllingClient.SendAgentAlertMessage((string) hresult["errorMessage"], true); | ||
1418 | } | ||
1419 | } | ||
1420 | } | ||
1421 | } | ||
1422 | } | ||
1423 | else | ||
1424 | { | ||
1425 | lock (m_rootAgents) | ||
1426 | { | ||
1427 | m_rootAgents.Add(avatar.UUID, avatar.Scene.RegionInfo.originRegionID); | ||
1428 | } | ||
1429 | if (m_MoneyAddress.Length > 0) | ||
1430 | { | ||
1431 | Scene RegionItem = GetSceneByUUID(regionID); | ||
1432 | if (RegionItem != null) | ||
1433 | { | ||
1434 | Hashtable hresult = claim_user(avatar.UUID, avatar.ControllingClient.SecureSessionId, regionID, RegionItem.RegionInfo.regionSecret); | ||
1435 | if ((bool) hresult["success"] == true) | ||
1436 | { | ||
1437 | int funds = 0; | ||
1438 | try | ||
1439 | { | ||
1440 | funds = (Int32) hresult["funds"]; | ||
1441 | } | ||
1442 | catch (InvalidCastException) | ||
1443 | { | ||
1444 | } | ||
1445 | SetLocalFundsForAgentID(avatar.UUID, funds); | ||
1446 | } | ||
1447 | else | ||
1448 | { | ||
1449 | avatar.ControllingClient.SendAgentAlertMessage((string) hresult["errorMessage"], true); | ||
1450 | } | ||
1451 | } | ||
1452 | } | ||
1453 | |||
1454 | //m_log.Info("[MONEY]: Claiming " + avatar.Firstname + " " + avatar.Lastname + " in region:" + avatar.RegionHandle + "."); | ||
1455 | } | ||
1456 | } | ||
1457 | //m_log.Info("[FRIEND]: " + avatar.Name + " status:" + (!avatar.IsChildAgent).ToString()); | ||
1458 | } | ||
1459 | |||
1460 | #endregion | ||
1481 | } | 1461 | } |
1482 | 1462 | ||
1483 | public enum TransactionType : int | 1463 | public enum TransactionType : int |
1484 | { | 1464 | { |
1485 | SystemGenerated=0, | 1465 | SystemGenerated = 0, |
1486 | RegionMoneyRequest=1, | 1466 | RegionMoneyRequest = 1, |
1487 | Gift=2, | 1467 | Gift = 2, |
1488 | Purchase=3 | 1468 | Purchase = 3 |
1489 | |||
1490 | } | 1469 | } |
1491 | } \ No newline at end of file | 1470 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs index 3b0cc4c..db38d87 100644 --- a/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs | |||
@@ -42,13 +42,12 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
42 | { | 42 | { |
43 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 43 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
44 | 44 | ||
45 | private Dictionary<LLUUID, List<FriendListItem>> FriendLists = new Dictionary<LLUUID, List<FriendListItem>>(); | ||
46 | private Dictionary<LLUUID, LLUUID> m_pendingFriendRequests = new Dictionary<LLUUID, LLUUID>(); | ||
47 | private Dictionary<LLUUID, ulong> m_rootAgents = new Dictionary<LLUUID, ulong>(); | ||
45 | private List<Scene> m_scene = new List<Scene>(); | 48 | private List<Scene> m_scene = new List<Scene>(); |
46 | 49 | ||
47 | Dictionary<LLUUID, ulong> m_rootAgents = new Dictionary<LLUUID, ulong>(); | 50 | #region IRegionModule Members |
48 | |||
49 | Dictionary<LLUUID, LLUUID> m_pendingFriendRequests = new Dictionary<LLUUID, LLUUID>(); | ||
50 | |||
51 | Dictionary<LLUUID, List<FriendListItem>> FriendLists = new Dictionary<LLUUID, List<FriendListItem>>(); | ||
52 | 51 | ||
53 | public void Initialise(Scene scene, IConfigSource config) | 52 | public void Initialise(Scene scene, IConfigSource config) |
54 | { | 53 | { |
@@ -68,11 +67,33 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
68 | scene.EventManager.OnMakeChildAgent += MakeChildAgent; | 67 | scene.EventManager.OnMakeChildAgent += MakeChildAgent; |
69 | scene.EventManager.OnClientClosed += ClientLoggedOut; | 68 | scene.EventManager.OnClientClosed += ClientLoggedOut; |
70 | } | 69 | } |
70 | |||
71 | public void PostInitialise() | ||
72 | { | ||
73 | } | ||
74 | |||
75 | public void Close() | ||
76 | { | ||
77 | } | ||
78 | |||
79 | public string Name | ||
80 | { | ||
81 | get { return "FriendsModule"; } | ||
82 | } | ||
83 | |||
84 | public bool IsSharedModule | ||
85 | { | ||
86 | get { return true; } | ||
87 | } | ||
88 | |||
89 | #endregion | ||
90 | |||
71 | public XmlRpcResponse processPresenceUpdate(XmlRpcRequest req) | 91 | public XmlRpcResponse processPresenceUpdate(XmlRpcRequest req) |
72 | { | 92 | { |
73 | m_log.Info("[FRIENDS]: Got Notification about a user! OMG"); | 93 | m_log.Info("[FRIENDS]: Got Notification about a user! OMG"); |
74 | return new XmlRpcResponse(); | 94 | return new XmlRpcResponse(); |
75 | } | 95 | } |
96 | |||
76 | private void OnNewClient(IClientAPI client) | 97 | private void OnNewClient(IClientAPI client) |
77 | { | 98 | { |
78 | // All friends establishment protocol goes over instant message | 99 | // All friends establishment protocol goes over instant message |
@@ -83,7 +104,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
83 | // Generated by LoginService. The friends are retreived from the database by the UserManager | 104 | // Generated by LoginService. The friends are retreived from the database by the UserManager |
84 | 105 | ||
85 | // Subscribe to instant messages | 106 | // Subscribe to instant messages |
86 | 107 | ||
87 | client.OnInstantMessage += OnInstantMessage; | 108 | client.OnInstantMessage += OnInstantMessage; |
88 | client.OnApproveFriendRequest += OnApprovedFriendRequest; | 109 | client.OnApproveFriendRequest += OnApprovedFriendRequest; |
89 | client.OnDenyFriendRequest += OnDenyFriendRequest; | 110 | client.OnDenyFriendRequest += OnDenyFriendRequest; |
@@ -99,10 +120,10 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
99 | { | 120 | { |
100 | fl = FriendLists[client.AgentId]; | 121 | fl = FriendLists[client.AgentId]; |
101 | } | 122 | } |
102 | else | 123 | else |
103 | { | 124 | { |
104 | fl = m_scene[0].GetFriendList(client.AgentId); | 125 | fl = m_scene[0].GetFriendList(client.AgentId); |
105 | 126 | ||
106 | //lock (FriendLists) | 127 | //lock (FriendLists) |
107 | //{ | 128 | //{ |
108 | if (!FriendLists.ContainsKey(client.AgentId)) | 129 | if (!FriendLists.ContainsKey(client.AgentId)) |
@@ -110,11 +131,11 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
110 | //} | 131 | //} |
111 | } | 132 | } |
112 | } | 133 | } |
113 | 134 | ||
114 | List<LLUUID> UpdateUsers = new List<LLUUID>(); | 135 | List<LLUUID> UpdateUsers = new List<LLUUID>(); |
115 | 136 | ||
116 | foreach (FriendListItem f in fl) | 137 | foreach (FriendListItem f in fl) |
117 | { | 138 | { |
118 | if (m_rootAgents.ContainsKey(f.Friend)) | 139 | if (m_rootAgents.ContainsKey(f.Friend)) |
119 | { | 140 | { |
120 | if (f.onlinestatus == false) | 141 | if (f.onlinestatus == false) |
@@ -169,10 +190,6 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
169 | onp.AgentBlock = onpb; | 190 | onp.AgentBlock = onpb; |
170 | client.OutPacket(onp, ThrottleOutPacketType.Task); | 191 | client.OutPacket(onp, ThrottleOutPacketType.Task); |
171 | } | 192 | } |
172 | |||
173 | |||
174 | |||
175 | |||
176 | } | 193 | } |
177 | 194 | ||
178 | private void ClientLoggedOut(LLUUID AgentId) | 195 | private void ClientLoggedOut(LLUUID AgentId) |
@@ -182,7 +199,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
182 | if (m_rootAgents.ContainsKey(AgentId)) | 199 | if (m_rootAgents.ContainsKey(AgentId)) |
183 | { | 200 | { |
184 | m_rootAgents.Remove(AgentId); | 201 | m_rootAgents.Remove(AgentId); |
185 | m_log.Info("[FRIEND]: Removing " + AgentId + ". Agent logged out."); | 202 | m_log.Info("[FRIEND]: Removing " + AgentId + ". Agent logged out."); |
186 | } | 203 | } |
187 | } | 204 | } |
188 | List<FriendListItem> lfli = new List<FriendListItem>(); | 205 | List<FriendListItem> lfli = new List<FriendListItem>(); |
@@ -208,7 +225,6 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
208 | List<FriendListItem> flfli = new List<FriendListItem>(); | 225 | List<FriendListItem> flfli = new List<FriendListItem>(); |
209 | try | 226 | try |
210 | { | 227 | { |
211 | |||
212 | lock (FriendLists) | 228 | lock (FriendLists) |
213 | { | 229 | { |
214 | if (FriendLists.ContainsKey(updateUsers[i])) | 230 | if (FriendLists.ContainsKey(updateUsers[i])) |
@@ -231,9 +247,8 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
231 | { | 247 | { |
232 | flfli[i].onlinestatus = false; | 248 | flfli[i].onlinestatus = false; |
233 | } | 249 | } |
234 | |||
235 | } | 250 | } |
236 | 251 | ||
237 | catch (IndexOutOfRangeException) | 252 | catch (IndexOutOfRangeException) |
238 | { | 253 | { |
239 | // Ignore the index out of range exception. | 254 | // Ignore the index out of range exception. |
@@ -242,15 +257,13 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
242 | m_log.Info("[FRIEND]: Unable to enumerate last friendlist user. User logged off"); | 257 | m_log.Info("[FRIEND]: Unable to enumerate last friendlist user. User logged off"); |
243 | } | 258 | } |
244 | } | 259 | } |
245 | |||
246 | } | 260 | } |
247 | 261 | ||
248 | for (int i = 0; i < updateUsers.Count; i++) | 262 | for (int i = 0; i < updateUsers.Count; i++) |
249 | { | 263 | { |
250 | ScenePresence av = GetPresenceFromAgentID(updateUsers[i]); | 264 | ScenePresence av = GetPresenceFromAgentID(updateUsers[i]); |
251 | if (av != null) | 265 | if (av != null) |
252 | { | 266 | { |
253 | |||
254 | OfflineNotificationPacket onp = new OfflineNotificationPacket(); | 267 | OfflineNotificationPacket onp = new OfflineNotificationPacket(); |
255 | OfflineNotificationPacket.AgentBlockBlock[] onpb = new OfflineNotificationPacket.AgentBlockBlock[1]; | 268 | OfflineNotificationPacket.AgentBlockBlock[] onpb = new OfflineNotificationPacket.AgentBlockBlock[1]; |
256 | OfflineNotificationPacket.AgentBlockBlock onpbl = new OfflineNotificationPacket.AgentBlockBlock(); | 269 | OfflineNotificationPacket.AgentBlockBlock onpbl = new OfflineNotificationPacket.AgentBlockBlock(); |
@@ -265,7 +278,6 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
265 | { | 278 | { |
266 | FriendLists.Remove(AgentId); | 279 | FriendLists.Remove(AgentId); |
267 | } | 280 | } |
268 | |||
269 | } | 281 | } |
270 | 282 | ||
271 | private void AvatarEnteringParcel(ScenePresence avatar, int localLandID, LLUUID regionID) | 283 | private void AvatarEnteringParcel(ScenePresence avatar, int localLandID, LLUUID regionID) |
@@ -282,7 +294,6 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
282 | { | 294 | { |
283 | JId avatarID = new JId(avatar.JID); | 295 | JId avatarID = new JId(avatar.JID); |
284 | // REST Post XMPP Stanzas! | 296 | // REST Post XMPP Stanzas! |
285 | |||
286 | } | 297 | } |
287 | // Claim User! my user! Mine mine mine! | 298 | // Claim User! my user! Mine mine mine! |
288 | } | 299 | } |
@@ -295,9 +306,9 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
295 | } | 306 | } |
296 | //m_log.Info("[FRIEND]: " + avatar.Name + " status:" + (!avatar.IsChildAgent).ToString()); | 307 | //m_log.Info("[FRIEND]: " + avatar.Name + " status:" + (!avatar.IsChildAgent).ToString()); |
297 | } | 308 | } |
309 | |||
298 | private void MakeChildAgent(ScenePresence avatar) | 310 | private void MakeChildAgent(ScenePresence avatar) |
299 | { | 311 | { |
300 | |||
301 | lock (m_rootAgents) | 312 | lock (m_rootAgents) |
302 | { | 313 | { |
303 | if (m_rootAgents.ContainsKey(avatar.UUID)) | 314 | if (m_rootAgents.ContainsKey(avatar.UUID)) |
@@ -307,30 +318,53 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
307 | m_rootAgents.Remove(avatar.UUID); | 318 | m_rootAgents.Remove(avatar.UUID); |
308 | m_log.Info("[FRIEND]: Removing " + avatar.Firstname + " " + avatar.Lastname + " as a root agent"); | 319 | m_log.Info("[FRIEND]: Removing " + avatar.Firstname + " " + avatar.Lastname + " as a root agent"); |
309 | } | 320 | } |
310 | |||
311 | } | 321 | } |
312 | } | 322 | } |
323 | } | ||
313 | 324 | ||
325 | private ScenePresence GetPresenceFromAgentID(LLUUID AgentID) | ||
326 | { | ||
327 | ScenePresence returnAgent = null; | ||
328 | lock (m_scene) | ||
329 | { | ||
330 | ScenePresence queryagent = null; | ||
331 | for (int i = 0; i < m_scene.Count; i++) | ||
332 | { | ||
333 | queryagent = m_scene[i].GetScenePresence(AgentID); | ||
334 | if (queryagent != null) | ||
335 | { | ||
336 | if (!queryagent.IsChildAgent) | ||
337 | { | ||
338 | returnAgent = queryagent; | ||
339 | break; | ||
340 | } | ||
341 | } | ||
342 | } | ||
343 | } | ||
344 | return returnAgent; | ||
314 | } | 345 | } |
346 | |||
315 | #region FriendRequestHandling | 347 | #region FriendRequestHandling |
316 | private void OnInstantMessage(IClientAPI client,LLUUID fromAgentID, | 348 | |
349 | private void OnInstantMessage(IClientAPI client, LLUUID fromAgentID, | ||
317 | LLUUID fromAgentSession, LLUUID toAgentID, | 350 | LLUUID fromAgentSession, LLUUID toAgentID, |
318 | LLUUID imSessionID, uint timestamp, string fromAgentName, | 351 | LLUUID imSessionID, uint timestamp, string fromAgentName, |
319 | string message, byte dialog, bool fromGroup, byte offline, | 352 | string message, byte dialog, bool fromGroup, byte offline, |
320 | uint ParentEstateID, LLVector3 Position, LLUUID RegionID, | 353 | uint ParentEstateID, LLVector3 Position, LLUUID RegionID, |
321 | byte[] binaryBucket) | 354 | byte[] binaryBucket) |
322 | { | 355 | { |
323 | // Friend Requests go by Instant Message.. using the dialog param | 356 | // Friend Requests go by Instant Message.. using the dialog param |
324 | // https://wiki.secondlife.com/wiki/ImprovedInstantMessage | 357 | // https://wiki.secondlife.com/wiki/ImprovedInstantMessage |
325 | 358 | ||
326 | // 38 == Offer friendship | 359 | // 38 == Offer friendship |
327 | if (dialog == (byte)38) | 360 | if (dialog == (byte) 38) |
328 | { | 361 | { |
329 | LLUUID friendTransactionID = LLUUID.Random(); | 362 | LLUUID friendTransactionID = LLUUID.Random(); |
330 | 363 | ||
331 | m_pendingFriendRequests.Add(friendTransactionID, fromAgentID); | 364 | m_pendingFriendRequests.Add(friendTransactionID, fromAgentID); |
332 | 365 | ||
333 | m_log.Info("[FRIEND]: 38 - From:" + fromAgentID.ToString() + " To: " + toAgentID.ToString() + " Session:" + imSessionID.ToString() + " Message:" + message); | 366 | m_log.Info("[FRIEND]: 38 - From:" + fromAgentID.ToString() + " To: " + toAgentID.ToString() + " Session:" + imSessionID.ToString() + " Message:" + |
367 | message); | ||
334 | GridInstantMessage msg = new GridInstantMessage(); | 368 | GridInstantMessage msg = new GridInstantMessage(); |
335 | msg.fromAgentID = fromAgentID.UUID; | 369 | msg.fromAgentID = fromAgentID.UUID; |
336 | msg.fromAgentSession = fromAgentSession.UUID; | 370 | msg.fromAgentSession = fromAgentSession.UUID; |
@@ -340,11 +374,11 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
340 | msg.timestamp = timestamp; | 374 | msg.timestamp = timestamp; |
341 | if (client != null) | 375 | if (client != null) |
342 | { | 376 | { |
343 | msg.fromAgentName = client.FirstName + " " + client.LastName;// fromAgentName; | 377 | msg.fromAgentName = client.FirstName + " " + client.LastName; // fromAgentName; |
344 | } | 378 | } |
345 | else | 379 | else |
346 | { | 380 | { |
347 | msg.fromAgentName = "(hippos)";// Added for posterity. This means that we can't figure out who sent it | 381 | msg.fromAgentName = "(hippos)"; // Added for posterity. This means that we can't figure out who sent it |
348 | } | 382 | } |
349 | msg.message = message; | 383 | msg.message = message; |
350 | msg.dialog = dialog; | 384 | msg.dialog = dialog; |
@@ -359,15 +393,17 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
359 | } | 393 | } |
360 | 394 | ||
361 | // 39 == Accept Friendship | 395 | // 39 == Accept Friendship |
362 | if (dialog == (byte)39) | 396 | if (dialog == (byte) 39) |
363 | { | 397 | { |
364 | m_log.Info("[FRIEND]: 39 - From:" + fromAgentID.ToString() + " To: " + toAgentID.ToString() + " Session:" + imSessionID.ToString() + " Message:" + message); | 398 | m_log.Info("[FRIEND]: 39 - From:" + fromAgentID.ToString() + " To: " + toAgentID.ToString() + " Session:" + imSessionID.ToString() + " Message:" + |
399 | message); | ||
365 | } | 400 | } |
366 | 401 | ||
367 | // 40 == Decline Friendship | 402 | // 40 == Decline Friendship |
368 | if (dialog == (byte)40) | 403 | if (dialog == (byte) 40) |
369 | { | 404 | { |
370 | m_log.Info("[FRIEND]: 40 - From:" + fromAgentID.ToString() + " To: " + toAgentID.ToString() + " Session:" + imSessionID.ToString() + " Message:" + message); | 405 | m_log.Info("[FRIEND]: 40 - From:" + fromAgentID.ToString() + " To: " + toAgentID.ToString() + " Session:" + imSessionID.ToString() + " Message:" + |
406 | message); | ||
371 | } | 407 | } |
372 | } | 408 | } |
373 | 409 | ||
@@ -395,16 +431,16 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
395 | msg.imSessionID = transactionID.UUID; | 431 | msg.imSessionID = transactionID.UUID; |
396 | msg.message = agentID.UUID.ToString(); | 432 | msg.message = agentID.UUID.ToString(); |
397 | msg.ParentEstateID = 0; | 433 | msg.ParentEstateID = 0; |
398 | msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); | 434 | msg.timestamp = (uint) Util.UnixTimeSinceEpoch(); |
399 | msg.RegionID = SceneAgentIn.RegionInfo.RegionID.UUID; | 435 | msg.RegionID = SceneAgentIn.RegionInfo.RegionID.UUID; |
400 | msg.dialog = (byte)39;// Approved friend request | 436 | msg.dialog = (byte) 39; // Approved friend request |
401 | msg.Position = new sLLVector3(); | 437 | msg.Position = new sLLVector3(); |
402 | msg.offline = (byte)0; | 438 | msg.offline = (byte) 0; |
403 | msg.binaryBucket = new byte[0]; | 439 | msg.binaryBucket = new byte[0]; |
404 | // We don't really care which scene we pipe it through, it goes to the shared IM Module and/or the database | 440 | // We don't really care which scene we pipe it through, it goes to the shared IM Module and/or the database |
405 | 441 | ||
406 | SceneAgentIn.TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule); | 442 | SceneAgentIn.TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule); |
407 | SceneAgentIn.StoreAddFriendship(m_pendingFriendRequests[transactionID], agentID, (uint)1); | 443 | SceneAgentIn.StoreAddFriendship(m_pendingFriendRequests[transactionID], agentID, (uint) 1); |
408 | m_pendingFriendRequests.Remove(transactionID); | 444 | m_pendingFriendRequests.Remove(transactionID); |
409 | 445 | ||
410 | // TODO: Inform agent that the friend is online | 446 | // TODO: Inform agent that the friend is online |
@@ -433,11 +469,11 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
433 | msg.imSessionID = transactionID.UUID; | 469 | msg.imSessionID = transactionID.UUID; |
434 | msg.message = agentID.UUID.ToString(); | 470 | msg.message = agentID.UUID.ToString(); |
435 | msg.ParentEstateID = 0; | 471 | msg.ParentEstateID = 0; |
436 | msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); | 472 | msg.timestamp = (uint) Util.UnixTimeSinceEpoch(); |
437 | msg.RegionID = SceneAgentIn.RegionInfo.RegionID.UUID; | 473 | msg.RegionID = SceneAgentIn.RegionInfo.RegionID.UUID; |
438 | msg.dialog = (byte)40;// Deny friend request | 474 | msg.dialog = (byte) 40; // Deny friend request |
439 | msg.Position = new sLLVector3(); | 475 | msg.Position = new sLLVector3(); |
440 | msg.offline = (byte)0; | 476 | msg.offline = (byte) 0; |
441 | msg.binaryBucket = new byte[0]; | 477 | msg.binaryBucket = new byte[0]; |
442 | SceneAgentIn.TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule); | 478 | SceneAgentIn.TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule); |
443 | m_pendingFriendRequests.Remove(transactionID); | 479 | m_pendingFriendRequests.Remove(transactionID); |
@@ -453,52 +489,13 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
453 | private void OnGridInstantMessage(GridInstantMessage msg) | 489 | private void OnGridInstantMessage(GridInstantMessage msg) |
454 | { | 490 | { |
455 | // Trigger the above event handler | 491 | // Trigger the above event handler |
456 | OnInstantMessage(null,new LLUUID(msg.fromAgentID), new LLUUID(msg.fromAgentSession), | 492 | OnInstantMessage(null, new LLUUID(msg.fromAgentID), new LLUUID(msg.fromAgentSession), |
457 | new LLUUID(msg.toAgentID), new LLUUID(msg.imSessionID), msg.timestamp, msg.fromAgentName, | 493 | new LLUUID(msg.toAgentID), new LLUUID(msg.imSessionID), msg.timestamp, msg.fromAgentName, |
458 | msg.message, msg.dialog, msg.fromGroup, msg.offline, msg.ParentEstateID, | 494 | msg.message, msg.dialog, msg.fromGroup, msg.offline, msg.ParentEstateID, |
459 | new LLVector3(msg.Position.x, msg.Position.y, msg.Position.z), new LLUUID(msg.RegionID), | 495 | new LLVector3(msg.Position.x, msg.Position.y, msg.Position.z), new LLUUID(msg.RegionID), |
460 | msg.binaryBucket); | 496 | msg.binaryBucket); |
461 | } | 497 | } |
462 | #endregion | ||
463 | private ScenePresence GetPresenceFromAgentID(LLUUID AgentID) | ||
464 | { | ||
465 | ScenePresence returnAgent = null; | ||
466 | lock (m_scene) | ||
467 | { | ||
468 | ScenePresence queryagent = null; | ||
469 | for (int i = 0; i < m_scene.Count; i++) | ||
470 | { | ||
471 | queryagent = m_scene[i].GetScenePresence(AgentID); | ||
472 | if (queryagent != null) | ||
473 | { | ||
474 | if (!queryagent.IsChildAgent) | ||
475 | { | ||
476 | returnAgent = queryagent; | ||
477 | break; | ||
478 | } | ||
479 | } | ||
480 | } | ||
481 | } | ||
482 | return returnAgent; | ||
483 | |||
484 | } | ||
485 | |||
486 | public void PostInitialise() | ||
487 | { | ||
488 | } | ||
489 | |||
490 | public void Close() | ||
491 | { | ||
492 | } | ||
493 | 498 | ||
494 | public string Name | 499 | #endregion |
495 | { | ||
496 | get { return "FriendsModule"; } | ||
497 | } | ||
498 | |||
499 | public bool IsSharedModule | ||
500 | { | ||
501 | get { return true; } | ||
502 | } | ||
503 | } | 500 | } |
504 | } \ No newline at end of file | 501 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Environment/Modules/Avatar/Groups/GroupsModule.cs b/OpenSim/Region/Environment/Modules/Avatar/Groups/GroupsModule.cs index 4b28ad7..c4906d2 100644 --- a/OpenSim/Region/Environment/Modules/Avatar/Groups/GroupsModule.cs +++ b/OpenSim/Region/Environment/Modules/Avatar/Groups/GroupsModule.cs | |||
@@ -41,10 +41,12 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Groups | |||
41 | { | 41 | { |
42 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 42 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
43 | 43 | ||
44 | private List<Scene> m_scene = new List<Scene>(); | ||
45 | private Dictionary<LLUUID, IClientAPI> m_iclientmap = new Dictionary<LLUUID, IClientAPI>(); | ||
46 | private Dictionary<LLUUID, GroupData> m_groupmap = new Dictionary<LLUUID, GroupData>(); | ||
47 | private Dictionary<LLUUID, GroupList> m_grouplistmap = new Dictionary<LLUUID, GroupList>(); | 44 | private Dictionary<LLUUID, GroupList> m_grouplistmap = new Dictionary<LLUUID, GroupList>(); |
45 | private Dictionary<LLUUID, GroupData> m_groupmap = new Dictionary<LLUUID, GroupData>(); | ||
46 | private Dictionary<LLUUID, IClientAPI> m_iclientmap = new Dictionary<LLUUID, IClientAPI>(); | ||
47 | private List<Scene> m_scene = new List<Scene>(); | ||
48 | |||
49 | #region IRegionModule Members | ||
48 | 50 | ||
49 | public void Initialise(Scene scene, IConfigSource config) | 51 | public void Initialise(Scene scene, IConfigSource config) |
50 | { | 52 | { |
@@ -58,6 +60,42 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Groups | |||
58 | //scene.EventManager. | 60 | //scene.EventManager. |
59 | } | 61 | } |
60 | 62 | ||
63 | public void PostInitialise() | ||
64 | { | ||
65 | } | ||
66 | |||
67 | public void Close() | ||
68 | { | ||
69 | m_log.Info("[GROUP]: Shutting down group module."); | ||
70 | lock (m_iclientmap) | ||
71 | { | ||
72 | m_iclientmap.Clear(); | ||
73 | } | ||
74 | |||
75 | lock (m_groupmap) | ||
76 | { | ||
77 | m_groupmap.Clear(); | ||
78 | } | ||
79 | |||
80 | lock (m_grouplistmap) | ||
81 | { | ||
82 | m_grouplistmap.Clear(); | ||
83 | } | ||
84 | GC.Collect(); | ||
85 | } | ||
86 | |||
87 | public string Name | ||
88 | { | ||
89 | get { return "GroupsModule"; } | ||
90 | } | ||
91 | |||
92 | public bool IsSharedModule | ||
93 | { | ||
94 | get { return true; } | ||
95 | } | ||
96 | |||
97 | #endregion | ||
98 | |||
61 | private void OnNewClient(IClientAPI client) | 99 | private void OnNewClient(IClientAPI client) |
62 | { | 100 | { |
63 | // All friends establishment protocol goes over instant message | 101 | // All friends establishment protocol goes over instant message |
@@ -115,7 +153,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Groups | |||
115 | string ActiveGroupTitle = ""; | 153 | string ActiveGroupTitle = ""; |
116 | 154 | ||
117 | bool foundUser = false; | 155 | bool foundUser = false; |
118 | 156 | ||
119 | lock (m_iclientmap) | 157 | lock (m_iclientmap) |
120 | { | 158 | { |
121 | if (m_iclientmap.ContainsKey(remoteClient.AgentId)) | 159 | if (m_iclientmap.ContainsKey(remoteClient.AgentId)) |
@@ -139,11 +177,9 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Groups | |||
139 | } | 177 | } |
140 | 178 | ||
141 | //remoteClient.SendAgentDataUpdate(AgentID, ActiveGroupID, firstname, lastname, ActiveGroupPowers, ActiveGroupName, ActiveGroupTitle); | 179 | //remoteClient.SendAgentDataUpdate(AgentID, ActiveGroupID, firstname, lastname, ActiveGroupPowers, ActiveGroupName, ActiveGroupTitle); |
142 | |||
143 | } | 180 | } |
144 | } | 181 | } |
145 | } | 182 | } |
146 | |||
147 | } | 183 | } |
148 | 184 | ||
149 | private void OnInstantMessage(IClientAPI client, LLUUID fromAgentID, | 185 | private void OnInstantMessage(IClientAPI client, LLUUID fromAgentID, |
@@ -183,7 +219,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Groups | |||
183 | m_iclientmap.Remove(agentID); | 219 | m_iclientmap.Remove(agentID); |
184 | } | 220 | } |
185 | } | 221 | } |
186 | 222 | ||
187 | lock (m_groupmap) | 223 | lock (m_groupmap) |
188 | { | 224 | { |
189 | if (m_groupmap.ContainsKey(agentID)) | 225 | if (m_groupmap.ContainsKey(agentID)) |
@@ -191,7 +227,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Groups | |||
191 | m_groupmap.Remove(agentID); | 227 | m_groupmap.Remove(agentID); |
192 | } | 228 | } |
193 | } | 229 | } |
194 | 230 | ||
195 | lock (m_grouplistmap) | 231 | lock (m_grouplistmap) |
196 | { | 232 | { |
197 | if (m_grouplistmap.ContainsKey(agentID)) | 233 | if (m_grouplistmap.ContainsKey(agentID)) |
@@ -201,63 +237,16 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Groups | |||
201 | } | 237 | } |
202 | GC.Collect(); | 238 | GC.Collect(); |
203 | } | 239 | } |
204 | |||
205 | public void PostInitialise() | ||
206 | { | ||
207 | } | ||
208 | |||
209 | public void Close() | ||
210 | { | ||
211 | m_log.Info("[GROUP]: Shutting down group module."); | ||
212 | lock (m_iclientmap) | ||
213 | { | ||
214 | m_iclientmap.Clear(); | ||
215 | } | ||
216 | |||
217 | lock (m_groupmap) | ||
218 | { | ||
219 | m_groupmap.Clear(); | ||
220 | } | ||
221 | |||
222 | lock (m_grouplistmap) | ||
223 | { | ||
224 | m_grouplistmap.Clear(); | ||
225 | } | ||
226 | GC.Collect(); | ||
227 | } | ||
228 | |||
229 | public string Name | ||
230 | { | ||
231 | get { return "GroupsModule"; } | ||
232 | } | ||
233 | |||
234 | public bool IsSharedModule | ||
235 | { | ||
236 | get { return true; } | ||
237 | } | ||
238 | |||
239 | } | 240 | } |
240 | 241 | ||
241 | public class GroupData | 242 | public class GroupData |
242 | { | 243 | { |
244 | public string ActiveGroupTitle; | ||
243 | public LLUUID GroupID; | 245 | public LLUUID GroupID; |
246 | public List<LLUUID> GroupMembers; | ||
244 | public string groupName; | 247 | public string groupName; |
245 | public string ActiveGroupTitle; | 248 | public uint groupPowers = (uint) (GroupPowers.LandAllowLandmark | GroupPowers.LandAllowSetHome); |
246 | public List<string> GroupTitles; | 249 | public List<string> GroupTitles; |
247 | public List<LLUUID> GroupMembers; | ||
248 | public uint groupPowers = (uint)(GroupPowers.LandAllowLandmark | GroupPowers.LandAllowSetHome); | ||
249 | |||
250 | public GroupPowers ActiveGroupPowers | ||
251 | { | ||
252 | set | ||
253 | { | ||
254 | groupPowers = (uint) value; | ||
255 | } | ||
256 | get | ||
257 | { | ||
258 | return (GroupPowers)groupPowers; | ||
259 | } | ||
260 | } | ||
261 | 250 | ||
262 | public GroupData() | 251 | public GroupData() |
263 | { | 252 | { |
@@ -265,11 +254,17 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Groups | |||
265 | GroupMembers = new List<LLUUID>(); | 254 | GroupMembers = new List<LLUUID>(); |
266 | } | 255 | } |
267 | 256 | ||
257 | public GroupPowers ActiveGroupPowers | ||
258 | { | ||
259 | set { groupPowers = (uint) value; } | ||
260 | get { return (GroupPowers) groupPowers; } | ||
261 | } | ||
268 | } | 262 | } |
269 | 263 | ||
270 | public class GroupList | 264 | public class GroupList |
271 | { | 265 | { |
272 | public List<LLUUID> m_GroupList; | 266 | public List<LLUUID> m_GroupList; |
267 | |||
273 | public GroupList() | 268 | public GroupList() |
274 | { | 269 | { |
275 | m_GroupList = new List<LLUUID>(); | 270 | m_GroupList = new List<LLUUID>(); |
diff --git a/OpenSim/Region/Environment/Modules/Avatar/InstantMessage/InstantMessageModule.cs b/OpenSim/Region/Environment/Modules/Avatar/InstantMessage/InstantMessageModule.cs index 1b82837..cb58b4c 100644 --- a/OpenSim/Region/Environment/Modules/Avatar/InstantMessage/InstantMessageModule.cs +++ b/OpenSim/Region/Environment/Modules/Avatar/InstantMessage/InstantMessageModule.cs | |||
@@ -38,6 +38,8 @@ namespace OpenSim.Region.Environment.Modules.Avatar.InstantMessage | |||
38 | { | 38 | { |
39 | private readonly List<Scene> m_scenes = new List<Scene>(); | 39 | private readonly List<Scene> m_scenes = new List<Scene>(); |
40 | 40 | ||
41 | #region IRegionModule Members | ||
42 | |||
41 | public void Initialise(Scene scene, IConfigSource config) | 43 | public void Initialise(Scene scene, IConfigSource config) |
42 | { | 44 | { |
43 | lock (m_scenes) | 45 | lock (m_scenes) |
@@ -56,27 +58,47 @@ namespace OpenSim.Region.Environment.Modules.Avatar.InstantMessage | |||
56 | } | 58 | } |
57 | } | 59 | } |
58 | 60 | ||
61 | public void PostInitialise() | ||
62 | { | ||
63 | } | ||
64 | |||
65 | public void Close() | ||
66 | { | ||
67 | } | ||
68 | |||
69 | public string Name | ||
70 | { | ||
71 | get { return "InstantMessageModule"; } | ||
72 | } | ||
73 | |||
74 | public bool IsSharedModule | ||
75 | { | ||
76 | get { return true; } | ||
77 | } | ||
78 | |||
79 | #endregion | ||
80 | |||
59 | private void OnNewClient(IClientAPI client) | 81 | private void OnNewClient(IClientAPI client) |
60 | { | 82 | { |
61 | client.OnInstantMessage += OnInstantMessage; | 83 | client.OnInstantMessage += OnInstantMessage; |
62 | } | 84 | } |
63 | 85 | ||
64 | private void OnInstantMessage(IClientAPI client,LLUUID fromAgentID, | 86 | private void OnInstantMessage(IClientAPI client, LLUUID fromAgentID, |
65 | LLUUID fromAgentSession, LLUUID toAgentID, | 87 | LLUUID fromAgentSession, LLUUID toAgentID, |
66 | LLUUID imSessionID, uint timestamp, string fromAgentName, | 88 | LLUUID imSessionID, uint timestamp, string fromAgentName, |
67 | string message, byte dialog, bool fromGroup, byte offline, | 89 | string message, byte dialog, bool fromGroup, byte offline, |
68 | uint ParentEstateID, LLVector3 Position, LLUUID RegionID, | 90 | uint ParentEstateID, LLVector3 Position, LLUUID RegionID, |
69 | byte[] binaryBucket) | 91 | byte[] binaryBucket) |
70 | { | 92 | { |
71 | bool dialogHandledElsewhere | 93 | bool dialogHandledElsewhere |
72 | = ((dialog == 38) || (dialog == 39) || (dialog == 40) | 94 | = ((dialog == 38) || (dialog == 39) || (dialog == 40) |
73 | || dialog == (byte)InstantMessageDialog.InventoryOffered | 95 | || dialog == (byte) InstantMessageDialog.InventoryOffered |
74 | || dialog == (byte)InstantMessageDialog.InventoryAccepted | 96 | || dialog == (byte) InstantMessageDialog.InventoryAccepted |
75 | || dialog == (byte)InstantMessageDialog.InventoryDeclined); | 97 | || dialog == (byte) InstantMessageDialog.InventoryDeclined); |
76 | 98 | ||
77 | // IM dialogs need to be pre-processed and have their sessionID filled by the server | 99 | // IM dialogs need to be pre-processed and have their sessionID filled by the server |
78 | // so the sim can match the transaction on the return packet. | 100 | // so the sim can match the transaction on the return packet. |
79 | 101 | ||
80 | // Don't send a Friend Dialog IM with a LLUUID.Zero session. | 102 | // Don't send a Friend Dialog IM with a LLUUID.Zero session. |
81 | if (!(dialogHandledElsewhere && imSessionID == LLUUID.Zero)) | 103 | if (!(dialogHandledElsewhere && imSessionID == LLUUID.Zero)) |
82 | { | 104 | { |
@@ -86,7 +108,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.InstantMessage | |||
86 | if (scene.Entities.ContainsKey(toAgentID) && scene.Entities[toAgentID] is ScenePresence) | 108 | if (scene.Entities.ContainsKey(toAgentID) && scene.Entities[toAgentID] is ScenePresence) |
87 | { | 109 | { |
88 | // Local message | 110 | // Local message |
89 | ScenePresence user = (ScenePresence)scene.Entities[toAgentID]; | 111 | ScenePresence user = (ScenePresence) scene.Entities[toAgentID]; |
90 | if (!user.IsChildAgent) | 112 | if (!user.IsChildAgent) |
91 | { | 113 | { |
92 | user.ControllingClient.SendInstantMessage(fromAgentID, fromAgentSession, message, | 114 | user.ControllingClient.SendInstantMessage(fromAgentID, fromAgentSession, message, |
@@ -104,54 +126,33 @@ namespace OpenSim.Region.Environment.Modules.Avatar.InstantMessage | |||
104 | if (scene.Entities.ContainsKey(toAgentID) && scene.Entities[toAgentID] is ScenePresence) | 126 | if (scene.Entities.ContainsKey(toAgentID) && scene.Entities[toAgentID] is ScenePresence) |
105 | { | 127 | { |
106 | // Local message | 128 | // Local message |
107 | ScenePresence user = (ScenePresence)scene.Entities[toAgentID]; | 129 | ScenePresence user = (ScenePresence) scene.Entities[toAgentID]; |
108 | 130 | ||
109 | user.ControllingClient.SendInstantMessage(fromAgentID, fromAgentSession, message, | 131 | user.ControllingClient.SendInstantMessage(fromAgentID, fromAgentSession, message, |
110 | toAgentID, imSessionID, fromAgentName, dialog, | 132 | toAgentID, imSessionID, fromAgentName, dialog, |
111 | timestamp); | 133 | timestamp); |
112 | // Message sent | 134 | // Message sent |
113 | return; | 135 | return; |
114 | |||
115 | } | 136 | } |
116 | } | 137 | } |
117 | |||
118 | } | 138 | } |
119 | 139 | ||
120 | 140 | ||
121 | // Still here, try send via Grid | 141 | // Still here, try send via Grid |
122 | // TODO | 142 | // TODO |
123 | } | 143 | } |
124 | 144 | ||
125 | // Trusty OSG1 called method. This method also gets called from the FriendsModule | 145 | // Trusty OSG1 called method. This method also gets called from the FriendsModule |
126 | // Turns out the sim has to send an instant message to the user to get it to show an accepted friend. | 146 | // Turns out the sim has to send an instant message to the user to get it to show an accepted friend. |
127 | 147 | ||
128 | private void OnGridInstantMessage(GridInstantMessage msg) | 148 | private void OnGridInstantMessage(GridInstantMessage msg) |
129 | { | 149 | { |
130 | // Trigger the above event handler | 150 | // Trigger the above event handler |
131 | OnInstantMessage(null,new LLUUID(msg.fromAgentID), new LLUUID(msg.fromAgentSession), | 151 | OnInstantMessage(null, new LLUUID(msg.fromAgentID), new LLUUID(msg.fromAgentSession), |
132 | new LLUUID(msg.toAgentID), new LLUUID(msg.imSessionID), msg.timestamp, msg.fromAgentName, | 152 | new LLUUID(msg.toAgentID), new LLUUID(msg.imSessionID), msg.timestamp, msg.fromAgentName, |
133 | msg.message, msg.dialog, msg.fromGroup, msg.offline, msg.ParentEstateID, | 153 | msg.message, msg.dialog, msg.fromGroup, msg.offline, msg.ParentEstateID, |
134 | new LLVector3(msg.Position.x,msg.Position.y,msg.Position.z), new LLUUID(msg.RegionID), | 154 | new LLVector3(msg.Position.x, msg.Position.y, msg.Position.z), new LLUUID(msg.RegionID), |
135 | msg.binaryBucket); | 155 | msg.binaryBucket); |
136 | |||
137 | } | ||
138 | |||
139 | public void PostInitialise() | ||
140 | { | ||
141 | } | ||
142 | |||
143 | public void Close() | ||
144 | { | ||
145 | } | ||
146 | |||
147 | public string Name | ||
148 | { | ||
149 | get { return "InstantMessageModule"; } | ||
150 | } | ||
151 | |||
152 | public bool IsSharedModule | ||
153 | { | ||
154 | get { return true; } | ||
155 | } | 156 | } |
156 | } | 157 | } |
157 | } \ No newline at end of file | 158 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Environment/Modules/Avatar/Inventory/InventoryModule.cs b/OpenSim/Region/Environment/Modules/Avatar/Inventory/InventoryModule.cs index 42c6238..2844450 100644 --- a/OpenSim/Region/Environment/Modules/Avatar/Inventory/InventoryModule.cs +++ b/OpenSim/Region/Environment/Modules/Avatar/Inventory/InventoryModule.cs | |||
@@ -38,11 +38,9 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Inventory | |||
38 | { | 38 | { |
39 | public class InventoryModule : IRegionModule | 39 | public class InventoryModule : IRegionModule |
40 | { | 40 | { |
41 | private static readonly ILog m_log | 41 | private static readonly ILog m_log |
42 | = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 42 | = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
43 | 43 | ||
44 | private Scene m_scene; | ||
45 | |||
46 | /// <summary> | 44 | /// <summary> |
47 | /// We need to keep track of the pending item offers between clients since the itemId offered only | 45 | /// We need to keep track of the pending item offers between clients since the itemId offered only |
48 | /// occurs in the initial offer message, not the accept message. So this dictionary links | 46 | /// occurs in the initial offer message, not the accept message. So this dictionary links |
@@ -50,10 +48,14 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Inventory | |||
50 | /// </summary> | 48 | /// </summary> |
51 | private IDictionary<LLUUID, LLUUID> m_pendingOffers = new Dictionary<LLUUID, LLUUID>(); | 49 | private IDictionary<LLUUID, LLUUID> m_pendingOffers = new Dictionary<LLUUID, LLUUID>(); |
52 | 50 | ||
51 | private Scene m_scene; | ||
52 | |||
53 | #region IRegionModule Members | ||
54 | |||
53 | public void Initialise(Scene scene, IConfigSource config) | 55 | public void Initialise(Scene scene, IConfigSource config) |
54 | { | 56 | { |
55 | m_scene = scene; | 57 | m_scene = scene; |
56 | scene.EventManager.OnNewClient += OnNewClient; | 58 | scene.EventManager.OnNewClient += OnNewClient; |
57 | } | 59 | } |
58 | 60 | ||
59 | public void PostInitialise() | 61 | public void PostInitialise() |
@@ -73,59 +75,61 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Inventory | |||
73 | { | 75 | { |
74 | get { return false; } | 76 | get { return false; } |
75 | } | 77 | } |
76 | 78 | ||
79 | #endregion | ||
80 | |||
77 | private void OnNewClient(IClientAPI client) | 81 | private void OnNewClient(IClientAPI client) |
78 | { | 82 | { |
79 | // Inventory giving is conducted via instant message | 83 | // Inventory giving is conducted via instant message |
80 | client.OnInstantMessage += OnInstantMessage; | 84 | client.OnInstantMessage += OnInstantMessage; |
81 | } | 85 | } |
82 | 86 | ||
83 | private void OnInstantMessage(IClientAPI client, LLUUID fromAgentID, | 87 | private void OnInstantMessage(IClientAPI client, LLUUID fromAgentID, |
84 | LLUUID fromAgentSession, LLUUID toAgentID, | 88 | LLUUID fromAgentSession, LLUUID toAgentID, |
85 | LLUUID imSessionID, uint timestamp, string fromAgentName, | 89 | LLUUID imSessionID, uint timestamp, string fromAgentName, |
86 | string message, byte dialog, bool fromGroup, byte offline, | 90 | string message, byte dialog, bool fromGroup, byte offline, |
87 | uint ParentEstateID, LLVector3 Position, LLUUID RegionID, | 91 | uint ParentEstateID, LLVector3 Position, LLUUID RegionID, |
88 | byte[] binaryBucket) | 92 | byte[] binaryBucket) |
89 | { | 93 | { |
90 | if (dialog == (byte)InstantMessageDialog.InventoryOffered) | 94 | if (dialog == (byte) InstantMessageDialog.InventoryOffered) |
91 | { | 95 | { |
92 | m_log.DebugFormat( | 96 | m_log.DebugFormat( |
93 | "[AGENT INVENTORY]: Routing inventory offering message from {0}, {1} to {2}", | 97 | "[AGENT INVENTORY]: Routing inventory offering message from {0}, {1} to {2}", |
94 | client.AgentId, client.Name, toAgentID); | 98 | client.AgentId, client.Name, toAgentID); |
95 | 99 | ||
96 | if (m_scene.Entities.ContainsKey(toAgentID) && m_scene.Entities[toAgentID] is ScenePresence) | 100 | if (m_scene.Entities.ContainsKey(toAgentID) && m_scene.Entities[toAgentID] is ScenePresence) |
97 | { | 101 | { |
98 | ScenePresence user = (ScenePresence)m_scene.Entities[toAgentID]; | 102 | ScenePresence user = (ScenePresence) m_scene.Entities[toAgentID]; |
99 | 103 | ||
100 | if (!user.IsChildAgent) | 104 | if (!user.IsChildAgent) |
101 | { | 105 | { |
102 | //byte[] rawId = new byte[16]; | 106 | //byte[] rawId = new byte[16]; |
103 | 107 | ||
104 | // First byte of the array is probably the item type | 108 | // First byte of the array is probably the item type |
105 | // Next 16 bytes are the UUID | 109 | // Next 16 bytes are the UUID |
106 | //Array.Copy(binaryBucket, 1, rawId, 0, 16); | 110 | //Array.Copy(binaryBucket, 1, rawId, 0, 16); |
107 | 111 | ||
108 | //LLUUID itemId = new LLUUID(new Guid(rawId)); | 112 | //LLUUID itemId = new LLUUID(new Guid(rawId)); |
109 | LLUUID itemId = new LLUUID(binaryBucket, 1); | 113 | LLUUID itemId = new LLUUID(binaryBucket, 1); |
110 | 114 | ||
111 | m_log.DebugFormat( | 115 | m_log.DebugFormat( |
112 | "[AGENT INVENTORY]: ItemId for giving is {0}", itemId); | 116 | "[AGENT INVENTORY]: ItemId for giving is {0}", itemId); |
113 | 117 | ||
114 | m_pendingOffers[imSessionID] = itemId; | 118 | m_pendingOffers[imSessionID] = itemId; |
115 | 119 | ||
116 | user.ControllingClient.SendInstantMessage( | 120 | user.ControllingClient.SendInstantMessage( |
117 | fromAgentID, fromAgentSession, message, toAgentID, imSessionID, fromAgentName, | 121 | fromAgentID, fromAgentSession, message, toAgentID, imSessionID, fromAgentName, |
118 | dialog, timestamp, binaryBucket); | 122 | dialog, timestamp, binaryBucket); |
119 | 123 | ||
120 | return; | 124 | return; |
121 | } | 125 | } |
122 | else | 126 | else |
123 | { | 127 | { |
124 | m_log.WarnFormat( | 128 | m_log.WarnFormat( |
125 | "[AGENT INVENTORY]: Agent {0} targeted for inventory give by {1}, {2} of {3} was a child agent!", | 129 | "[AGENT INVENTORY]: Agent {0} targeted for inventory give by {1}, {2} of {3} was a child agent!", |
126 | toAgentID, client.AgentId, client.Name, message); | 130 | toAgentID, client.AgentId, client.Name, message); |
127 | } | 131 | } |
128 | } | 132 | } |
129 | else | 133 | else |
130 | { | 134 | { |
131 | m_log.WarnFormat( | 135 | m_log.WarnFormat( |
@@ -133,84 +137,84 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Inventory | |||
133 | toAgentID, client.AgentId, client.Name, message); | 137 | toAgentID, client.AgentId, client.Name, message); |
134 | } | 138 | } |
135 | } | 139 | } |
136 | else if (dialog == (byte)InstantMessageDialog.InventoryAccepted) | 140 | else if (dialog == (byte) InstantMessageDialog.InventoryAccepted) |
137 | { | 141 | { |
138 | m_log.DebugFormat( | 142 | m_log.DebugFormat( |
139 | "[AGENT INVENTORY]: Routing inventory accepted message from {0}, {1} to {2}", | 143 | "[AGENT INVENTORY]: Routing inventory accepted message from {0}, {1} to {2}", |
140 | client.AgentId, client.Name, toAgentID); | 144 | client.AgentId, client.Name, toAgentID); |
141 | 145 | ||
142 | if (m_scene.Entities.ContainsKey(toAgentID) && m_scene.Entities[toAgentID] is ScenePresence) | 146 | if (m_scene.Entities.ContainsKey(toAgentID) && m_scene.Entities[toAgentID] is ScenePresence) |
143 | { | 147 | { |
144 | ScenePresence user = (ScenePresence)m_scene.Entities[toAgentID]; | 148 | ScenePresence user = (ScenePresence) m_scene.Entities[toAgentID]; |
145 | 149 | ||
146 | if (!user.IsChildAgent) | 150 | if (!user.IsChildAgent) |
147 | { | 151 | { |
148 | user.ControllingClient.SendInstantMessage( | 152 | user.ControllingClient.SendInstantMessage( |
149 | fromAgentID, fromAgentSession, message, toAgentID, imSessionID, fromAgentName, | 153 | fromAgentID, fromAgentSession, message, toAgentID, imSessionID, fromAgentName, |
150 | dialog, timestamp, binaryBucket); | 154 | dialog, timestamp, binaryBucket); |
151 | 155 | ||
152 | if (m_pendingOffers.ContainsKey(imSessionID)) | 156 | if (m_pendingOffers.ContainsKey(imSessionID)) |
153 | { | 157 | { |
154 | m_log.DebugFormat( | 158 | m_log.DebugFormat( |
155 | "[AGENT INVENTORY]: Accepted item id {0}", m_pendingOffers[imSessionID]); | 159 | "[AGENT INVENTORY]: Accepted item id {0}", m_pendingOffers[imSessionID]); |
156 | 160 | ||
157 | // Since the message originates from the accepting client, the toAgentID is | 161 | // Since the message originates from the accepting client, the toAgentID is |
158 | // the agent giving the item. | 162 | // the agent giving the item. |
159 | m_scene.GiveInventoryItem(client, toAgentID, m_pendingOffers[imSessionID]); | 163 | m_scene.GiveInventoryItem(client, toAgentID, m_pendingOffers[imSessionID]); |
160 | 164 | ||
161 | m_pendingOffers.Remove(imSessionID); | 165 | m_pendingOffers.Remove(imSessionID); |
162 | } | 166 | } |
163 | else | 167 | else |
164 | { | 168 | { |
165 | m_log.ErrorFormat( | 169 | m_log.ErrorFormat( |
166 | "[AGENT INVENTORY]: Could not find an item associated with session id {0} to accept", | 170 | "[AGENT INVENTORY]: Could not find an item associated with session id {0} to accept", |
167 | imSessionID); | 171 | imSessionID); |
168 | } | 172 | } |
169 | 173 | ||
170 | return; | 174 | return; |
171 | } | 175 | } |
172 | else | 176 | else |
173 | { | 177 | { |
174 | m_log.WarnFormat( | 178 | m_log.WarnFormat( |
175 | "[AGENT INVENTORY]: Agent {0} targeted for inventory give by {1}, {2} of {3} was a child agent!", | 179 | "[AGENT INVENTORY]: Agent {0} targeted for inventory give by {1}, {2} of {3} was a child agent!", |
176 | toAgentID, client.AgentId, client.Name, message); | 180 | toAgentID, client.AgentId, client.Name, message); |
177 | } | 181 | } |
178 | } | 182 | } |
179 | else | 183 | else |
180 | { | 184 | { |
181 | m_log.WarnFormat( | 185 | m_log.WarnFormat( |
182 | "[AGENT INVENTORY]: Could not find agent {0} for user {1}, {2} to give {3}", | 186 | "[AGENT INVENTORY]: Could not find agent {0} for user {1}, {2} to give {3}", |
183 | toAgentID, client.AgentId, client.Name, message); | 187 | toAgentID, client.AgentId, client.Name, message); |
184 | } | 188 | } |
185 | } | 189 | } |
186 | else if (dialog == (byte)InstantMessageDialog.InventoryDeclined) | 190 | else if (dialog == (byte) InstantMessageDialog.InventoryDeclined) |
187 | { | 191 | { |
188 | if (m_scene.Entities.ContainsKey(toAgentID) && m_scene.Entities[toAgentID] is ScenePresence) | 192 | if (m_scene.Entities.ContainsKey(toAgentID) && m_scene.Entities[toAgentID] is ScenePresence) |
189 | { | 193 | { |
190 | ScenePresence user = (ScenePresence)m_scene.Entities[toAgentID]; | 194 | ScenePresence user = (ScenePresence) m_scene.Entities[toAgentID]; |
191 | 195 | ||
192 | if (!user.IsChildAgent) | 196 | if (!user.IsChildAgent) |
193 | { | 197 | { |
194 | user.ControllingClient.SendInstantMessage( | 198 | user.ControllingClient.SendInstantMessage( |
195 | fromAgentID, fromAgentSession, message, toAgentID, imSessionID, fromAgentName, | 199 | fromAgentID, fromAgentSession, message, toAgentID, imSessionID, fromAgentName, |
196 | dialog, timestamp, binaryBucket); | 200 | dialog, timestamp, binaryBucket); |
197 | 201 | ||
198 | if (m_pendingOffers.ContainsKey(imSessionID)) | 202 | if (m_pendingOffers.ContainsKey(imSessionID)) |
199 | { | 203 | { |
200 | m_log.DebugFormat( | 204 | m_log.DebugFormat( |
201 | "[AGENT INVENTORY]: Declined item id {0}", m_pendingOffers[imSessionID]); | 205 | "[AGENT INVENTORY]: Declined item id {0}", m_pendingOffers[imSessionID]); |
202 | 206 | ||
203 | m_pendingOffers.Remove(imSessionID); | 207 | m_pendingOffers.Remove(imSessionID); |
204 | } | 208 | } |
205 | else | 209 | else |
206 | { | 210 | { |
207 | m_log.ErrorFormat( | 211 | m_log.ErrorFormat( |
208 | "[AGENT INVENTORY]: Could not find an item associated with session id {0} to decline", | 212 | "[AGENT INVENTORY]: Could not find an item associated with session id {0} to decline", |
209 | imSessionID); | 213 | imSessionID); |
210 | } | 214 | } |
211 | } | 215 | } |
212 | } | 216 | } |
213 | } | 217 | } |
214 | } | 218 | } |
215 | } | 219 | } |
216 | } \ No newline at end of file | 220 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Environment/Modules/Avatar/Profiles/AvatarProfilesModule.cs b/OpenSim/Region/Environment/Modules/Avatar/Profiles/AvatarProfilesModule.cs index f8b14d3..1955d2a 100644 --- a/OpenSim/Region/Environment/Modules/Avatar/Profiles/AvatarProfilesModule.cs +++ b/OpenSim/Region/Environment/Modules/Avatar/Profiles/AvatarProfilesModule.cs | |||
@@ -45,6 +45,8 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Profiles | |||
45 | { | 45 | { |
46 | } | 46 | } |
47 | 47 | ||
48 | #region IRegionModule Members | ||
49 | |||
48 | public void Initialise(Scene scene, IConfigSource config) | 50 | public void Initialise(Scene scene, IConfigSource config) |
49 | { | 51 | { |
50 | m_scene = scene; | 52 | m_scene = scene; |
@@ -69,6 +71,8 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Profiles | |||
69 | get { return false; } | 71 | get { return false; } |
70 | } | 72 | } |
71 | 73 | ||
74 | #endregion | ||
75 | |||
72 | public void NewClient(IClientAPI client) | 76 | public void NewClient(IClientAPI client) |
73 | { | 77 | { |
74 | client.OnRequestAvatarProperties += RequestAvatarProperty; | 78 | client.OnRequestAvatarProperties += RequestAvatarProperty; |
@@ -107,7 +111,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Profiles | |||
107 | public void UpdateAvatarProperties(IClientAPI remoteClient, UserProfileData newProfile) | 111 | public void UpdateAvatarProperties(IClientAPI remoteClient, UserProfileData newProfile) |
108 | { | 112 | { |
109 | UserProfileData Profile = m_scene.CommsManager.UserService.GetUserProfile(newProfile.ID); | 113 | UserProfileData Profile = m_scene.CommsManager.UserService.GetUserProfile(newProfile.ID); |
110 | 114 | ||
111 | // if it's the profile of the user requesting the update, then we change only a few things. | 115 | // if it's the profile of the user requesting the update, then we change only a few things. |
112 | if (remoteClient.AgentId.CompareTo(Profile.ID) == 0) | 116 | if (remoteClient.AgentId.CompareTo(Profile.ID) == 0) |
113 | { | 117 | { |
diff --git a/OpenSim/Region/Environment/Modules/Avatar/Voice/AsterixVoice/AsteriskVoiceModule.cs b/OpenSim/Region/Environment/Modules/Avatar/Voice/AsterixVoice/AsteriskVoiceModule.cs index 0d7de78..44d67e6 100644 --- a/OpenSim/Region/Environment/Modules/Avatar/Voice/AsterixVoice/AsteriskVoiceModule.cs +++ b/OpenSim/Region/Environment/Modules/Avatar/Voice/AsterixVoice/AsteriskVoiceModule.cs | |||
@@ -44,40 +44,43 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Voice.AsterixVoice | |||
44 | { | 44 | { |
45 | public class AsteriskVoiceModule : IRegionModule | 45 | public class AsteriskVoiceModule : IRegionModule |
46 | { | 46 | { |
47 | private static readonly ILog m_log = | 47 | private static readonly ILog m_log = |
48 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 48 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
49 | 49 | ||
50 | private Scene m_scene; | 50 | private static readonly string m_parcelVoiceInfoRequestPath = "0007/"; |
51 | private IConfig m_config; | 51 | private static readonly string m_provisionVoiceAccountRequestPath = "0008/"; |
52 | |||
52 | private string m_asterisk; | 53 | private string m_asterisk; |
53 | private string m_asterisk_password; | 54 | private string m_asterisk_password; |
54 | private string m_asterisk_salt; | 55 | private string m_asterisk_salt; |
55 | private int m_asterisk_timeout; | 56 | private int m_asterisk_timeout; |
56 | private string m_sipDomain; | ||
57 | private string m_confDomain; | 57 | private string m_confDomain; |
58 | private IConfig m_config; | ||
59 | private Scene m_scene; | ||
60 | private string m_sipDomain; | ||
58 | 61 | ||
59 | private static readonly string m_parcelVoiceInfoRequestPath = "0007/"; | 62 | #region IRegionModule Members |
60 | private static readonly string m_provisionVoiceAccountRequestPath = "0008/"; | ||
61 | 63 | ||
62 | public void Initialise(Scene scene, IConfigSource config) | 64 | public void Initialise(Scene scene, IConfigSource config) |
63 | { | 65 | { |
64 | m_scene = scene; | 66 | m_scene = scene; |
65 | m_config = config.Configs["AsteriskVoice"]; | 67 | m_config = config.Configs["AsteriskVoice"]; |
66 | 68 | ||
67 | if (null == m_config) | 69 | if (null == m_config) |
68 | { | 70 | { |
69 | m_log.Info("[ASTERISKVOICE] no config found, plugin disabled"); | 71 | m_log.Info("[ASTERISKVOICE] no config found, plugin disabled"); |
70 | return; | 72 | return; |
71 | } | 73 | } |
72 | 74 | ||
73 | if (!m_config.GetBoolean("enabled", false)) | 75 | if (!m_config.GetBoolean("enabled", false)) |
74 | { | 76 | { |
75 | m_log.Info("[ASTERISKVOICE] plugin disabled by configuration"); | 77 | m_log.Info("[ASTERISKVOICE] plugin disabled by configuration"); |
76 | return; | 78 | return; |
77 | } | 79 | } |
78 | m_log.Info("[ASTERISKVOICE] plugin enabled"); | 80 | m_log.Info("[ASTERISKVOICE] plugin enabled"); |
79 | 81 | ||
80 | try { | 82 | try |
83 | { | ||
81 | m_sipDomain = m_config.GetString("sip_domain", String.Empty); | 84 | m_sipDomain = m_config.GetString("sip_domain", String.Empty); |
82 | m_log.InfoFormat("[ASTERISKVOICE] using SIP domain {0}", m_sipDomain); | 85 | m_log.InfoFormat("[ASTERISKVOICE] using SIP domain {0}", m_sipDomain); |
83 | 86 | ||
@@ -91,17 +94,17 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Voice.AsterixVoice | |||
91 | if (String.IsNullOrEmpty(m_asterisk)) throw new Exception("missing asterisk_frontend config parameter"); | 94 | if (String.IsNullOrEmpty(m_asterisk)) throw new Exception("missing asterisk_frontend config parameter"); |
92 | if (String.IsNullOrEmpty(m_asterisk_password)) throw new Exception("missing asterisk_password config parameter"); | 95 | if (String.IsNullOrEmpty(m_asterisk_password)) throw new Exception("missing asterisk_password config parameter"); |
93 | m_log.InfoFormat("[ASTERISKVOICE] using asterisk front end {0}", m_asterisk); | 96 | m_log.InfoFormat("[ASTERISKVOICE] using asterisk front end {0}", m_asterisk); |
94 | 97 | ||
95 | scene.EventManager.OnRegisterCaps += OnRegisterCaps; | 98 | scene.EventManager.OnRegisterCaps += OnRegisterCaps; |
96 | } | 99 | } |
97 | catch (Exception e) | 100 | catch (Exception e) |
98 | { | 101 | { |
99 | m_log.ErrorFormat("[ASTERISKVOICE] plugin initialization failed: {0}", e.Message); | 102 | m_log.ErrorFormat("[ASTERISKVOICE] plugin initialization failed: {0}", e.Message); |
100 | m_log.DebugFormat("[ASTERISKVOICE] plugin initialization failed: {0}", e.ToString()); | 103 | m_log.DebugFormat("[ASTERISKVOICE] plugin initialization failed: {0}", e.ToString()); |
101 | return; | 104 | return; |
102 | } | 105 | } |
103 | } | 106 | } |
104 | 107 | ||
105 | public void PostInitialise() | 108 | public void PostInitialise() |
106 | { | 109 | { |
107 | } | 110 | } |
@@ -120,15 +123,17 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Voice.AsterixVoice | |||
120 | get { return false; } | 123 | get { return false; } |
121 | } | 124 | } |
122 | 125 | ||
123 | public void OnRegisterCaps(LLUUID agentID, Caps caps) | 126 | #endregion |
127 | |||
128 | public void OnRegisterCaps(LLUUID agentID, Caps caps) | ||
124 | { | 129 | { |
125 | m_log.DebugFormat("[ASTERISKVOICE] OnRegisterCaps: agentID {0} caps {1}", agentID, caps); | 130 | m_log.DebugFormat("[ASTERISKVOICE] OnRegisterCaps: agentID {0} caps {1}", agentID, caps); |
126 | string capsBase = "/CAPS/" + caps.CapsObjectPath; | 131 | string capsBase = "/CAPS/" + caps.CapsObjectPath; |
127 | caps.RegisterHandler("ParcelVoiceInfoRequest", | 132 | caps.RegisterHandler("ParcelVoiceInfoRequest", |
128 | new RestStreamHandler("POST", capsBase + m_parcelVoiceInfoRequestPath, | 133 | new RestStreamHandler("POST", capsBase + m_parcelVoiceInfoRequestPath, |
129 | delegate(string request, string path, string param) | 134 | delegate(string request, string path, string param) |
130 | { | 135 | { |
131 | return ParcelVoiceInfoRequest(request, path, param, | 136 | return ParcelVoiceInfoRequest(request, path, param, |
132 | agentID, caps); | 137 | agentID, caps); |
133 | })); | 138 | })); |
134 | caps.RegisterHandler("ProvisionVoiceAccountRequest", | 139 | caps.RegisterHandler("ProvisionVoiceAccountRequest", |
@@ -139,7 +144,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Voice.AsterixVoice | |||
139 | agentID, caps); | 144 | agentID, caps); |
140 | })); | 145 | })); |
141 | } | 146 | } |
142 | 147 | ||
143 | /// <summary> | 148 | /// <summary> |
144 | /// Callback for a client request for ParcelVoiceInfo | 149 | /// Callback for a client request for ParcelVoiceInfo |
145 | /// </summary> | 150 | /// </summary> |
@@ -149,30 +154,30 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Voice.AsterixVoice | |||
149 | /// <param name="agentID"></param> | 154 | /// <param name="agentID"></param> |
150 | /// <param name="caps"></param> | 155 | /// <param name="caps"></param> |
151 | /// <returns></returns> | 156 | /// <returns></returns> |
152 | public string ParcelVoiceInfoRequest(string request, string path, string param, | 157 | public string ParcelVoiceInfoRequest(string request, string path, string param, |
153 | LLUUID agentID, Caps caps) | 158 | LLUUID agentID, Caps caps) |
154 | { | 159 | { |
155 | // we need to do: | 160 | // we need to do: |
156 | // - send channel_uri: as "sip:regionID@m_sipDomain" | 161 | // - send channel_uri: as "sip:regionID@m_sipDomain" |
157 | try | 162 | try |
158 | { | 163 | { |
159 | m_log.DebugFormat("[ASTERISKVOICE][PARCELVOICE]: request: {0}, path: {1}, param: {2}", | 164 | m_log.DebugFormat("[ASTERISKVOICE][PARCELVOICE]: request: {0}, path: {1}, param: {2}", |
160 | request, path, param); | 165 | request, path, param); |
161 | 166 | ||
162 | 167 | ||
163 | // setup response to client | 168 | // setup response to client |
164 | Hashtable creds = new Hashtable(); | 169 | Hashtable creds = new Hashtable(); |
165 | creds["channel_uri"] = String.Format("sip:{0}@{1}", | 170 | creds["channel_uri"] = String.Format("sip:{0}@{1}", |
166 | m_scene.RegionInfo.RegionID, m_sipDomain); | 171 | m_scene.RegionInfo.RegionID, m_sipDomain); |
167 | 172 | ||
168 | string regionName = m_scene.RegionInfo.RegionName; | 173 | string regionName = m_scene.RegionInfo.RegionName; |
169 | ScenePresence avatar = m_scene.GetScenePresence(agentID); | 174 | ScenePresence avatar = m_scene.GetScenePresence(agentID); |
170 | if (null == m_scene.LandChannel) throw new Exception("land data not yet available"); | 175 | if (null == m_scene.LandChannel) throw new Exception("land data not yet available"); |
171 | LandData land = m_scene.GetLandData(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); | 176 | LandData land = m_scene.GetLandData(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); |
172 | 177 | ||
173 | LLSDParcelVoiceInfoResponse parcelVoiceInfo = | 178 | LLSDParcelVoiceInfoResponse parcelVoiceInfo = |
174 | new LLSDParcelVoiceInfoResponse(regionName, land.localID, creds); | 179 | new LLSDParcelVoiceInfoResponse(regionName, land.localID, creds); |
175 | 180 | ||
176 | string r = LLSDHelpers.SerialiseLLSDReply(parcelVoiceInfo); | 181 | string r = LLSDHelpers.SerialiseLLSDReply(parcelVoiceInfo); |
177 | 182 | ||
178 | 183 | ||
@@ -183,17 +188,17 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Voice.AsterixVoice | |||
183 | if (!String.IsNullOrEmpty(m_confDomain)) | 188 | if (!String.IsNullOrEmpty(m_confDomain)) |
184 | { | 189 | { |
185 | requestData["region"] += String.Format("@{0}", m_confDomain); | 190 | requestData["region"] += String.Format("@{0}", m_confDomain); |
186 | } | 191 | } |
187 | 192 | ||
188 | ArrayList SendParams = new ArrayList(); | 193 | ArrayList SendParams = new ArrayList(); |
189 | SendParams.Add(requestData); | 194 | SendParams.Add(requestData); |
190 | XmlRpcRequest updateAccountRequest = new XmlRpcRequest("region_update", SendParams); | 195 | XmlRpcRequest updateAccountRequest = new XmlRpcRequest("region_update", SendParams); |
191 | XmlRpcResponse updateAccountResponse = updateAccountRequest.Send(m_asterisk, m_asterisk_timeout); | 196 | XmlRpcResponse updateAccountResponse = updateAccountRequest.Send(m_asterisk, m_asterisk_timeout); |
192 | Hashtable responseData = (Hashtable)updateAccountResponse.Value; | 197 | Hashtable responseData = (Hashtable) updateAccountResponse.Value; |
193 | 198 | ||
194 | if (!responseData.ContainsKey("success")) throw new Exception("region_update call failed"); | 199 | if (!responseData.ContainsKey("success")) throw new Exception("region_update call failed"); |
195 | 200 | ||
196 | bool success = Convert.ToBoolean((string)responseData["success"]); | 201 | bool success = Convert.ToBoolean((string) responseData["success"]); |
197 | if (!success) throw new Exception("region_update failed"); | 202 | if (!success) throw new Exception("region_update failed"); |
198 | 203 | ||
199 | 204 | ||
@@ -218,8 +223,8 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Voice.AsterixVoice | |||
218 | /// <param name="agentID"></param> | 223 | /// <param name="agentID"></param> |
219 | /// <param name="caps"></param> | 224 | /// <param name="caps"></param> |
220 | /// <returns></returns> | 225 | /// <returns></returns> |
221 | public string ProvisionVoiceAccountRequest(string request, string path, string param, | 226 | public string ProvisionVoiceAccountRequest(string request, string path, string param, |
222 | LLUUID agentID, Caps caps) | 227 | LLUUID agentID, Caps caps) |
223 | { | 228 | { |
224 | // we need to | 229 | // we need to |
225 | // - get user data from UserProfileCacheService | 230 | // - get user data from UserProfileCacheService |
@@ -232,7 +237,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Voice.AsterixVoice | |||
232 | // send account details back to client | 237 | // send account details back to client |
233 | try | 238 | try |
234 | { | 239 | { |
235 | m_log.DebugFormat("[ASTERISKVOICE][PROVISIONVOICE]: request: {0}, path: {1}, param: {2}", | 240 | m_log.DebugFormat("[ASTERISKVOICE][PROVISIONVOICE]: request: {0}, path: {1}, param: {2}", |
236 | request, path, param); | 241 | request, path, param); |
237 | 242 | ||
238 | // get user data & prepare voice account response | 243 | // get user data & prepare voice account response |
@@ -244,7 +249,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Voice.AsterixVoice | |||
244 | 249 | ||
245 | // we generate a nonce everytime | 250 | // we generate a nonce everytime |
246 | string voicePassword = "$1$" + Util.Md5Hash(DateTime.UtcNow.ToLongTimeString() + m_asterisk_salt); | 251 | string voicePassword = "$1$" + Util.Md5Hash(DateTime.UtcNow.ToLongTimeString() + m_asterisk_salt); |
247 | LLSDVoiceAccountResponse voiceAccountResponse = | 252 | LLSDVoiceAccountResponse voiceAccountResponse = |
248 | new LLSDVoiceAccountResponse(voiceUser, voicePassword); | 253 | new LLSDVoiceAccountResponse(voiceUser, voicePassword); |
249 | string r = LLSDHelpers.SerialiseLLSDReply(voiceAccountResponse); | 254 | string r = LLSDHelpers.SerialiseLLSDReply(voiceAccountResponse); |
250 | m_log.DebugFormat("[CAPS][PROVISIONVOICE]: {0}", r); | 255 | m_log.DebugFormat("[CAPS][PROVISIONVOICE]: {0}", r); |
@@ -257,18 +262,18 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Voice.AsterixVoice | |||
257 | if (!String.IsNullOrEmpty(m_sipDomain)) | 262 | if (!String.IsNullOrEmpty(m_sipDomain)) |
258 | { | 263 | { |
259 | requestData["username"] += String.Format("@{0}", m_sipDomain); | 264 | requestData["username"] += String.Format("@{0}", m_sipDomain); |
260 | } | 265 | } |
261 | requestData["password"] = voicePassword; | 266 | requestData["password"] = voicePassword; |
262 | 267 | ||
263 | ArrayList SendParams = new ArrayList(); | 268 | ArrayList SendParams = new ArrayList(); |
264 | SendParams.Add(requestData); | 269 | SendParams.Add(requestData); |
265 | XmlRpcRequest updateAccountRequest = new XmlRpcRequest("account_update", SendParams); | 270 | XmlRpcRequest updateAccountRequest = new XmlRpcRequest("account_update", SendParams); |
266 | XmlRpcResponse updateAccountResponse = updateAccountRequest.Send(m_asterisk, m_asterisk_timeout); | 271 | XmlRpcResponse updateAccountResponse = updateAccountRequest.Send(m_asterisk, m_asterisk_timeout); |
267 | Hashtable responseData = (Hashtable)updateAccountResponse.Value; | 272 | Hashtable responseData = (Hashtable) updateAccountResponse.Value; |
268 | 273 | ||
269 | if (!responseData.ContainsKey("success")) throw new Exception("account_update call failed"); | 274 | if (!responseData.ContainsKey("success")) throw new Exception("account_update call failed"); |
270 | 275 | ||
271 | bool success = Convert.ToBoolean((string)responseData["success"]); | 276 | bool success = Convert.ToBoolean((string) responseData["success"]); |
272 | if (!success) throw new Exception("account_update failed"); | 277 | if (!success) throw new Exception("account_update failed"); |
273 | 278 | ||
274 | return r; | 279 | return r; |
diff --git a/OpenSim/Region/Environment/Modules/Avatar/Voice/SIPVoice/SIPVoiceModule.cs b/OpenSim/Region/Environment/Modules/Avatar/Voice/SIPVoice/SIPVoiceModule.cs index 8b7c3d0..8d9ba6f 100644 --- a/OpenSim/Region/Environment/Modules/Avatar/Voice/SIPVoice/SIPVoiceModule.cs +++ b/OpenSim/Region/Environment/Modules/Avatar/Voice/SIPVoice/SIPVoiceModule.cs | |||
@@ -43,22 +43,23 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Voice.SIPVoice | |||
43 | { | 43 | { |
44 | public class SIPVoiceModule : IRegionModule | 44 | public class SIPVoiceModule : IRegionModule |
45 | { | 45 | { |
46 | private static readonly ILog m_log = | 46 | private static readonly ILog m_log = |
47 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 47 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
48 | 48 | ||
49 | private Scene m_scene; | 49 | private static readonly string m_parcelVoiceInfoRequestPath = "0007/"; |
50 | private static readonly string m_provisionVoiceAccountRequestPath = "0008/"; | ||
50 | private IConfig m_config; | 51 | private IConfig m_config; |
52 | private Scene m_scene; | ||
51 | private string m_sipDomain; | 53 | private string m_sipDomain; |
52 | 54 | ||
53 | private static readonly string m_parcelVoiceInfoRequestPath = "0007/"; | 55 | #region IRegionModule Members |
54 | private static readonly string m_provisionVoiceAccountRequestPath = "0008/"; | ||
55 | 56 | ||
56 | public void Initialise(Scene scene, IConfigSource config) | 57 | public void Initialise(Scene scene, IConfigSource config) |
57 | { | 58 | { |
58 | m_scene = scene; | 59 | m_scene = scene; |
59 | m_config = config.Configs["Voice"]; | 60 | m_config = config.Configs["Voice"]; |
60 | 61 | ||
61 | if (null == m_config || !m_config.GetBoolean("enabled", false)) | 62 | if (null == m_config || !m_config.GetBoolean("enabled", false)) |
62 | { | 63 | { |
63 | m_log.Info("[VOICE] plugin disabled"); | 64 | m_log.Info("[VOICE] plugin disabled"); |
64 | return; | 65 | return; |
@@ -95,15 +96,17 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Voice.SIPVoice | |||
95 | get { return false; } | 96 | get { return false; } |
96 | } | 97 | } |
97 | 98 | ||
98 | public void OnRegisterCaps(LLUUID agentID, Caps caps) | 99 | #endregion |
100 | |||
101 | public void OnRegisterCaps(LLUUID agentID, Caps caps) | ||
99 | { | 102 | { |
100 | m_log.DebugFormat("[VOICE] OnRegisterCaps: agentID {0} caps {1}", agentID, caps); | 103 | m_log.DebugFormat("[VOICE] OnRegisterCaps: agentID {0} caps {1}", agentID, caps); |
101 | string capsBase = "/CAPS/" + caps.CapsObjectPath; | 104 | string capsBase = "/CAPS/" + caps.CapsObjectPath; |
102 | caps.RegisterHandler("ParcelVoiceInfoRequest", | 105 | caps.RegisterHandler("ParcelVoiceInfoRequest", |
103 | new RestStreamHandler("POST", capsBase + m_parcelVoiceInfoRequestPath, | 106 | new RestStreamHandler("POST", capsBase + m_parcelVoiceInfoRequestPath, |
104 | delegate(string request, string path, string param) | 107 | delegate(string request, string path, string param) |
105 | { | 108 | { |
106 | return ParcelVoiceInfoRequest(request, path, param, | 109 | return ParcelVoiceInfoRequest(request, path, param, |
107 | agentID, caps); | 110 | agentID, caps); |
108 | })); | 111 | })); |
109 | caps.RegisterHandler("ProvisionVoiceAccountRequest", | 112 | caps.RegisterHandler("ProvisionVoiceAccountRequest", |
@@ -114,7 +117,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Voice.SIPVoice | |||
114 | agentID, caps); | 117 | agentID, caps); |
115 | })); | 118 | })); |
116 | } | 119 | } |
117 | 120 | ||
118 | /// <summary> | 121 | /// <summary> |
119 | /// Callback for a client request for ParcelVoiceInfo | 122 | /// Callback for a client request for ParcelVoiceInfo |
120 | /// </summary> | 123 | /// </summary> |
@@ -124,8 +127,8 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Voice.SIPVoice | |||
124 | /// <param name="agentID"></param> | 127 | /// <param name="agentID"></param> |
125 | /// <param name="caps"></param> | 128 | /// <param name="caps"></param> |
126 | /// <returns></returns> | 129 | /// <returns></returns> |
127 | public string ParcelVoiceInfoRequest(string request, string path, string param, | 130 | public string ParcelVoiceInfoRequest(string request, string path, string param, |
128 | LLUUID agentID, Caps caps) | 131 | LLUUID agentID, Caps caps) |
129 | { | 132 | { |
130 | try | 133 | try |
131 | { | 134 | { |
@@ -135,15 +138,15 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Voice.SIPVoice | |||
135 | Hashtable creds = new Hashtable(); | 138 | Hashtable creds = new Hashtable(); |
136 | 139 | ||
137 | creds["channel_uri"] = String.Format("sip:{0}@{1}", agentID, m_sipDomain); | 140 | creds["channel_uri"] = String.Format("sip:{0}@{1}", agentID, m_sipDomain); |
138 | 141 | ||
139 | string regionName = m_scene.RegionInfo.RegionName; | 142 | string regionName = m_scene.RegionInfo.RegionName; |
140 | ScenePresence avatar = m_scene.GetScenePresence(agentID); | 143 | ScenePresence avatar = m_scene.GetScenePresence(agentID); |
141 | if (null == m_scene.LandChannel) throw new Exception("land data not yet available"); | 144 | if (null == m_scene.LandChannel) throw new Exception("land data not yet available"); |
142 | LandData land = m_scene.GetLandData(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); | 145 | LandData land = m_scene.GetLandData(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); |
143 | 146 | ||
144 | LLSDParcelVoiceInfoResponse parcelVoiceInfo = | 147 | LLSDParcelVoiceInfoResponse parcelVoiceInfo = |
145 | new LLSDParcelVoiceInfoResponse(regionName, land.localID, creds); | 148 | new LLSDParcelVoiceInfoResponse(regionName, land.localID, creds); |
146 | 149 | ||
147 | string r = LLSDHelpers.SerialiseLLSDReply(parcelVoiceInfo); | 150 | string r = LLSDHelpers.SerialiseLLSDReply(parcelVoiceInfo); |
148 | m_log.DebugFormat("[VOICE][PARCELVOICE]: {0}", r); | 151 | m_log.DebugFormat("[VOICE][PARCELVOICE]: {0}", r); |
149 | 152 | ||
@@ -153,7 +156,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Voice.SIPVoice | |||
153 | { | 156 | { |
154 | m_log.ErrorFormat("[CAPS]: {0}, try again later", e.ToString()); | 157 | m_log.ErrorFormat("[CAPS]: {0}, try again later", e.ToString()); |
155 | } | 158 | } |
156 | 159 | ||
157 | return null; | 160 | return null; |
158 | } | 161 | } |
159 | 162 | ||
@@ -166,12 +169,12 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Voice.SIPVoice | |||
166 | /// <param name="agentID"></param> | 169 | /// <param name="agentID"></param> |
167 | /// <param name="caps"></param> | 170 | /// <param name="caps"></param> |
168 | /// <returns></returns> | 171 | /// <returns></returns> |
169 | public string ProvisionVoiceAccountRequest(string request, string path, string param, | 172 | public string ProvisionVoiceAccountRequest(string request, string path, string param, |
170 | LLUUID agentID, Caps caps) | 173 | LLUUID agentID, Caps caps) |
171 | { | 174 | { |
172 | try | 175 | try |
173 | { | 176 | { |
174 | m_log.DebugFormat("[VOICE][PROVISIONVOICE]: request: {0}, path: {1}, param: {2}", | 177 | m_log.DebugFormat("[VOICE][PROVISIONVOICE]: request: {0}, path: {1}, param: {2}", |
175 | request, path, param); | 178 | request, path, param); |
176 | 179 | ||
177 | string voiceUser = "x" + Convert.ToBase64String(agentID.GetBytes()); | 180 | string voiceUser = "x" + Convert.ToBase64String(agentID.GetBytes()); |
@@ -180,7 +183,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Voice.SIPVoice | |||
180 | CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(agentID); | 183 | CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(agentID); |
181 | if (null == userInfo) throw new Exception("cannot get user details"); | 184 | if (null == userInfo) throw new Exception("cannot get user details"); |
182 | 185 | ||
183 | LLSDVoiceAccountResponse voiceAccountResponse = | 186 | LLSDVoiceAccountResponse voiceAccountResponse = |
184 | new LLSDVoiceAccountResponse(voiceUser, "$1$" + userInfo.UserProfile.PasswordHash); | 187 | new LLSDVoiceAccountResponse(voiceUser, "$1$" + userInfo.UserProfile.PasswordHash); |
185 | string r = LLSDHelpers.SerialiseLLSDReply(voiceAccountResponse); | 188 | string r = LLSDHelpers.SerialiseLLSDReply(voiceAccountResponse); |
186 | m_log.DebugFormat("[CAPS][PROVISIONVOICE]: {0}", r); | 189 | m_log.DebugFormat("[CAPS][PROVISIONVOICE]: {0}", r); |
diff --git a/OpenSim/Region/Environment/Modules/Framework/CommanderTestModule.cs b/OpenSim/Region/Environment/Modules/Framework/CommanderTestModule.cs index 76bdae3..cf87021 100644 --- a/OpenSim/Region/Environment/Modules/Framework/CommanderTestModule.cs +++ b/OpenSim/Region/Environment/Modules/Framework/CommanderTestModule.cs | |||
@@ -28,26 +28,29 @@ | |||
28 | using System; | 28 | using System; |
29 | using Nini.Config; | 29 | using Nini.Config; |
30 | using OpenSim.Region.Environment.Interfaces; | 30 | using OpenSim.Region.Environment.Interfaces; |
31 | using OpenSim.Region.Environment.Modules.Framework; | ||
32 | using OpenSim.Region.Environment.Scenes; | 31 | using OpenSim.Region.Environment.Scenes; |
33 | 32 | ||
34 | namespace OpenSim.Region.Environment.Modules.Framework | 33 | namespace OpenSim.Region.Environment.Modules.Framework |
35 | { | 34 | { |
36 | public class CommanderTestModule : IRegionModule, ICommandableModule | 35 | public class CommanderTestModule : IRegionModule, ICommandableModule |
37 | { | 36 | { |
38 | Commander m_commander = new Commander("CommanderTest"); | 37 | private Commander m_commander = new Commander("CommanderTest"); |
39 | Scene m_scene; | 38 | private Scene m_scene; |
40 | 39 | ||
41 | #region IRegionModule Members | 40 | #region ICommandableModule Members |
42 | 41 | ||
43 | public void Initialise(Scene scene, IConfigSource source) | 42 | public ICommander CommandInterface |
44 | { | 43 | { |
45 | m_scene = scene; | 44 | get { throw new NotImplementedException(); } |
46 | } | 45 | } |
47 | 46 | ||
48 | private void InterfaceHelloWorld(Object[] args) | 47 | #endregion |
48 | |||
49 | #region IRegionModule Members | ||
50 | |||
51 | public void Initialise(Scene scene, IConfigSource source) | ||
49 | { | 52 | { |
50 | Console.WriteLine("Hello World"); | 53 | m_scene = scene; |
51 | } | 54 | } |
52 | 55 | ||
53 | public void PostInitialise() | 56 | public void PostInitialise() |
@@ -77,13 +80,9 @@ namespace OpenSim.Region.Environment.Modules.Framework | |||
77 | 80 | ||
78 | #endregion | 81 | #endregion |
79 | 82 | ||
80 | #region ICommandableModule Members | 83 | private void InterfaceHelloWorld(Object[] args) |
81 | |||
82 | public ICommander CommandInterface | ||
83 | { | 84 | { |
84 | get { throw new NotImplementedException(); } | 85 | Console.WriteLine("Hello World"); |
85 | } | 86 | } |
86 | |||
87 | #endregion | ||
88 | } | 87 | } |
89 | } \ No newline at end of file | 88 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Environment/Modules/Grid/Interregion/InterregionModule.cs b/OpenSim/Region/Environment/Modules/Grid/Interregion/InterregionModule.cs index 1a77ac8..8307e50 100644 --- a/OpenSim/Region/Environment/Modules/Grid/Interregion/InterregionModule.cs +++ b/OpenSim/Region/Environment/Modules/Grid/Interregion/InterregionModule.cs | |||
@@ -35,61 +35,14 @@ namespace OpenSim.Region.Environment.Modules.Communications.Interregion | |||
35 | private readonly Dictionary<Location, string[]> m_neighbourInterfaces = new Dictionary<Location, string[]>(); | 35 | private readonly Dictionary<Location, string[]> m_neighbourInterfaces = new Dictionary<Location, string[]>(); |
36 | private readonly Dictionary<Location, RemotingObject> m_neighbourRemote = new Dictionary<Location, RemotingObject>(); | 36 | private readonly Dictionary<Location, RemotingObject> m_neighbourRemote = new Dictionary<Location, RemotingObject>(); |
37 | private IConfigSource m_config; | 37 | private IConfigSource m_config; |
38 | private RemotingObject m_myRemote; | 38 | private bool m_enabled = false; |
39 | 39 | ||
40 | private Object m_lockObject = new object(); | 40 | private Object m_lockObject = new object(); |
41 | private RemotingObject m_myRemote; | ||
41 | private TcpChannel m_tcpChannel; | 42 | private TcpChannel m_tcpChannel; |
42 | private int m_tcpPort = 10101; | 43 | private int m_tcpPort = 10101; |
43 | private bool m_enabled = false; | ||
44 | |||
45 | #region IRegionModule Members | ||
46 | |||
47 | //TODO: This prevents us from registering new scenes after PostInitialise if we want comms updated. | ||
48 | public void Initialise(Scene scene, IConfigSource source) | ||
49 | { | ||
50 | if (m_enabled) | ||
51 | { | ||
52 | m_myLocations.Add(new Location((int) scene.RegionInfo.RegionLocX, | ||
53 | (int) scene.RegionInfo.RegionLocY)); | ||
54 | m_config = source; | ||
55 | |||
56 | scene.RegisterModuleInterface<IInterregionModule>(this); | ||
57 | } | ||
58 | } | ||
59 | |||
60 | //TODO: This prevents us from registering new scenes after PostInitialise if we want comms updated. | ||
61 | public void PostInitialise() | ||
62 | { | ||
63 | if (m_enabled) | ||
64 | { | ||
65 | try | ||
66 | { | ||
67 | m_tcpPort = m_config.Configs["Comms"].GetInt("remoting_port", m_tcpPort); | ||
68 | } | ||
69 | catch | ||
70 | { | ||
71 | } | ||
72 | |||
73 | internal_CreateRemotingObjects(); | ||
74 | } | ||
75 | } | ||
76 | |||
77 | public void Close() | ||
78 | { | ||
79 | ChannelServices.UnregisterChannel(m_tcpChannel); | ||
80 | } | ||
81 | |||
82 | public string Name | ||
83 | { | ||
84 | get { return "InterregionModule"; } | ||
85 | } | ||
86 | |||
87 | public bool IsSharedModule | ||
88 | { | ||
89 | get { return true; } | ||
90 | } | ||
91 | 44 | ||
92 | #endregion | 45 | #region IInterregionModule Members |
93 | 46 | ||
94 | public void internal_CreateRemotingObjects() | 47 | public void internal_CreateRemotingObjects() |
95 | { | 48 | { |
@@ -106,22 +59,6 @@ namespace OpenSim.Region.Environment.Modules.Communications.Interregion | |||
106 | } | 59 | } |
107 | } | 60 | } |
108 | 61 | ||
109 | public void RegisterRemoteRegion(string uri) | ||
110 | { | ||
111 | RegisterRemotingInterface((RemotingObject) Activator.GetObject(typeof (RemotingObject), uri)); | ||
112 | } | ||
113 | |||
114 | private void RegisterRemotingInterface(RemotingObject remote) | ||
115 | { | ||
116 | Location[] locs = remote.GetLocations(); | ||
117 | string[] interfaces = remote.GetInterfaces(); | ||
118 | foreach (Location loc in locs) | ||
119 | { | ||
120 | m_neighbourInterfaces[loc] = interfaces; | ||
121 | m_neighbourRemote[loc] = remote; | ||
122 | } | ||
123 | } | ||
124 | |||
125 | public void RegisterMethod<T>(T e) | 62 | public void RegisterMethod<T>(T e) |
126 | { | 63 | { |
127 | m_interfaces[typeof (T)] = e; | 64 | m_interfaces[typeof (T)] = e; |
@@ -171,5 +108,73 @@ namespace OpenSim.Region.Environment.Modules.Communications.Interregion | |||
171 | { | 108 | { |
172 | return new Location(0, 0); | 109 | return new Location(0, 0); |
173 | } | 110 | } |
111 | |||
112 | #endregion | ||
113 | |||
114 | //TODO: This prevents us from registering new scenes after PostInitialise if we want comms updated. | ||
115 | |||
116 | #region IRegionModule Members | ||
117 | |||
118 | public void Initialise(Scene scene, IConfigSource source) | ||
119 | { | ||
120 | if (m_enabled) | ||
121 | { | ||
122 | m_myLocations.Add(new Location((int) scene.RegionInfo.RegionLocX, | ||
123 | (int) scene.RegionInfo.RegionLocY)); | ||
124 | m_config = source; | ||
125 | |||
126 | scene.RegisterModuleInterface<IInterregionModule>(this); | ||
127 | } | ||
128 | } | ||
129 | |||
130 | //TODO: This prevents us from registering new scenes after PostInitialise if we want comms updated. | ||
131 | public void PostInitialise() | ||
132 | { | ||
133 | if (m_enabled) | ||
134 | { | ||
135 | try | ||
136 | { | ||
137 | m_tcpPort = m_config.Configs["Comms"].GetInt("remoting_port", m_tcpPort); | ||
138 | } | ||
139 | catch | ||
140 | { | ||
141 | } | ||
142 | |||
143 | internal_CreateRemotingObjects(); | ||
144 | } | ||
145 | } | ||
146 | |||
147 | public void Close() | ||
148 | { | ||
149 | ChannelServices.UnregisterChannel(m_tcpChannel); | ||
150 | } | ||
151 | |||
152 | public string Name | ||
153 | { | ||
154 | get { return "InterregionModule"; } | ||
155 | } | ||
156 | |||
157 | public bool IsSharedModule | ||
158 | { | ||
159 | get { return true; } | ||
160 | } | ||
161 | |||
162 | #endregion | ||
163 | |||
164 | public void RegisterRemoteRegion(string uri) | ||
165 | { | ||
166 | RegisterRemotingInterface((RemotingObject) Activator.GetObject(typeof (RemotingObject), uri)); | ||
167 | } | ||
168 | |||
169 | private void RegisterRemotingInterface(RemotingObject remote) | ||
170 | { | ||
171 | Location[] locs = remote.GetLocations(); | ||
172 | string[] interfaces = remote.GetInterfaces(); | ||
173 | foreach (Location loc in locs) | ||
174 | { | ||
175 | m_neighbourInterfaces[loc] = interfaces; | ||
176 | m_neighbourRemote[loc] = remote; | ||
177 | } | ||
178 | } | ||
174 | } | 179 | } |
175 | } \ No newline at end of file | 180 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Environment/Modules/Scripting/DynamicTexture/DynamicTextureModule.cs b/OpenSim/Region/Environment/Modules/Scripting/DynamicTexture/DynamicTextureModule.cs index 63eee97..735a3cf 100644 --- a/OpenSim/Region/Environment/Modules/Scripting/DynamicTexture/DynamicTextureModule.cs +++ b/OpenSim/Region/Environment/Modules/Scripting/DynamicTexture/DynamicTextureModule.cs | |||
@@ -47,32 +47,7 @@ namespace OpenSim.Region.Environment.Modules.Scripting.DynamicTexture | |||
47 | 47 | ||
48 | private Dictionary<LLUUID, DynamicTextureUpdater> Updaters = new Dictionary<LLUUID, DynamicTextureUpdater>(); | 48 | private Dictionary<LLUUID, DynamicTextureUpdater> Updaters = new Dictionary<LLUUID, DynamicTextureUpdater>(); |
49 | 49 | ||
50 | public void Initialise(Scene scene, IConfigSource config) | 50 | #region IDynamicTextureManager Members |
51 | { | ||
52 | if (!RegisteredScenes.ContainsKey(scene.RegionInfo.RegionID)) | ||
53 | { | ||
54 | RegisteredScenes.Add(scene.RegionInfo.RegionID, scene); | ||
55 | scene.RegisterModuleInterface<IDynamicTextureManager>(this); | ||
56 | } | ||
57 | } | ||
58 | |||
59 | public void PostInitialise() | ||
60 | { | ||
61 | } | ||
62 | |||
63 | public void Close() | ||
64 | { | ||
65 | } | ||
66 | |||
67 | public string Name | ||
68 | { | ||
69 | get { return "DynamicTextureModule"; } | ||
70 | } | ||
71 | |||
72 | public bool IsSharedModule | ||
73 | { | ||
74 | get { return true; } | ||
75 | } | ||
76 | 51 | ||
77 | public void RegisterRender(string handleType, IDynamicTextureRender render) | 52 | public void RegisterRender(string handleType, IDynamicTextureRender render) |
78 | { | 53 | { |
@@ -164,20 +139,55 @@ namespace OpenSim.Region.Environment.Modules.Scripting.DynamicTexture | |||
164 | return LLUUID.Zero; | 139 | return LLUUID.Zero; |
165 | } | 140 | } |
166 | 141 | ||
142 | #endregion | ||
143 | |||
144 | #region IRegionModule Members | ||
145 | |||
146 | public void Initialise(Scene scene, IConfigSource config) | ||
147 | { | ||
148 | if (!RegisteredScenes.ContainsKey(scene.RegionInfo.RegionID)) | ||
149 | { | ||
150 | RegisteredScenes.Add(scene.RegionInfo.RegionID, scene); | ||
151 | scene.RegisterModuleInterface<IDynamicTextureManager>(this); | ||
152 | } | ||
153 | } | ||
154 | |||
155 | public void PostInitialise() | ||
156 | { | ||
157 | } | ||
158 | |||
159 | public void Close() | ||
160 | { | ||
161 | } | ||
162 | |||
163 | public string Name | ||
164 | { | ||
165 | get { return "DynamicTextureModule"; } | ||
166 | } | ||
167 | |||
168 | public bool IsSharedModule | ||
169 | { | ||
170 | get { return true; } | ||
171 | } | ||
172 | |||
173 | #endregion | ||
174 | |||
175 | #region Nested type: DynamicTextureUpdater | ||
176 | |||
167 | public class DynamicTextureUpdater | 177 | public class DynamicTextureUpdater |
168 | { | 178 | { |
169 | public LLUUID SimUUID; | 179 | public bool BlendWithOldTexture = false; |
170 | public LLUUID UpdaterID; | ||
171 | public string ContentType; | ||
172 | public string Url; | ||
173 | public string BodyData; | 180 | public string BodyData; |
174 | public LLUUID PrimID; | 181 | public string ContentType; |
175 | public int UpdateTimer; | 182 | public byte FrontAlpha = 255; |
176 | public LLUUID LastAssetID; | 183 | public LLUUID LastAssetID; |
177 | public string Params; | 184 | public string Params; |
178 | public bool BlendWithOldTexture = false; | 185 | public LLUUID PrimID; |
179 | public bool SetNewFrontAlpha = false; | 186 | public bool SetNewFrontAlpha = false; |
180 | public byte FrontAlpha = 255; | 187 | public LLUUID SimUUID; |
188 | public LLUUID UpdaterID; | ||
189 | public int UpdateTimer; | ||
190 | public string Url; | ||
181 | 191 | ||
182 | public DynamicTextureUpdater() | 192 | public DynamicTextureUpdater() |
183 | { | 193 | { |
@@ -224,7 +234,7 @@ namespace OpenSim.Region.Environment.Modules.Scripting.DynamicTexture | |||
224 | 234 | ||
225 | LastAssetID = asset.FullID; | 235 | LastAssetID = asset.FullID; |
226 | 236 | ||
227 | 237 | ||
228 | part.Shape.Textures = new LLObject.TextureEntry(asset.FullID); | 238 | part.Shape.Textures = new LLObject.TextureEntry(asset.FullID); |
229 | part.ScheduleFullUpdate(); | 239 | part.ScheduleFullUpdate(); |
230 | } | 240 | } |
@@ -273,5 +283,7 @@ namespace OpenSim.Region.Environment.Modules.Scripting.DynamicTexture | |||
273 | } | 283 | } |
274 | } | 284 | } |
275 | } | 285 | } |
286 | |||
287 | #endregion | ||
276 | } | 288 | } |
277 | } \ No newline at end of file | 289 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Environment/Modules/Scripting/HttpRequest/ScriptsHttpRequests.cs b/OpenSim/Region/Environment/Modules/Scripting/HttpRequest/ScriptsHttpRequests.cs index 4977a86..184e026 100644 --- a/OpenSim/Region/Environment/Modules/Scripting/HttpRequest/ScriptsHttpRequests.cs +++ b/OpenSim/Region/Environment/Modules/Scripting/HttpRequest/ScriptsHttpRequests.cs | |||
@@ -84,45 +84,20 @@ namespace OpenSim.Region.Environment.Modules.Scripting.HttpRequest | |||
84 | { | 84 | { |
85 | public class HttpRequestModule : IRegionModule, IHttpRequests | 85 | public class HttpRequestModule : IRegionModule, IHttpRequests |
86 | { | 86 | { |
87 | private Scene m_scene; | ||
88 | private Queue<HttpRequestClass> rpcQueue = new Queue<HttpRequestClass>(); | ||
89 | private object HttpListLock = new object(); | 87 | private object HttpListLock = new object(); |
90 | private string m_name = "HttpScriptRequests"; | ||
91 | private int httpTimeout = 30000; | 88 | private int httpTimeout = 30000; |
89 | private string m_name = "HttpScriptRequests"; | ||
92 | 90 | ||
93 | // <request id, HttpRequestClass> | 91 | // <request id, HttpRequestClass> |
94 | private Dictionary<LLUUID, HttpRequestClass> m_pendingRequests; | 92 | private Dictionary<LLUUID, HttpRequestClass> m_pendingRequests; |
93 | private Scene m_scene; | ||
94 | private Queue<HttpRequestClass> rpcQueue = new Queue<HttpRequestClass>(); | ||
95 | 95 | ||
96 | public HttpRequestModule() | 96 | public HttpRequestModule() |
97 | { | 97 | { |
98 | } | 98 | } |
99 | 99 | ||
100 | public void Initialise(Scene scene, IConfigSource config) | 100 | #region IHttpRequests Members |
101 | { | ||
102 | m_scene = scene; | ||
103 | |||
104 | m_scene.RegisterModuleInterface<IHttpRequests>(this); | ||
105 | |||
106 | m_pendingRequests = new Dictionary<LLUUID, HttpRequestClass>(); | ||
107 | } | ||
108 | |||
109 | public void PostInitialise() | ||
110 | { | ||
111 | } | ||
112 | |||
113 | public void Close() | ||
114 | { | ||
115 | } | ||
116 | |||
117 | public string Name | ||
118 | { | ||
119 | get { return m_name; } | ||
120 | } | ||
121 | |||
122 | public bool IsSharedModule | ||
123 | { | ||
124 | get { return true; } | ||
125 | } | ||
126 | 101 | ||
127 | public LLUUID MakeHttpRequest(string url, string parameters, string body) | 102 | public LLUUID MakeHttpRequest(string url, string parameters, string body) |
128 | { | 103 | { |
@@ -141,7 +116,7 @@ namespace OpenSim.Region.Environment.Modules.Scripting.HttpRequest | |||
141 | if (parameters != null) | 116 | if (parameters != null) |
142 | { | 117 | { |
143 | string[] parms = parameters.ToArray(); | 118 | string[] parms = parameters.ToArray(); |
144 | for (int i = 0; i < parms.Length/2; i += 2) | 119 | for (int i = 0; i < parms.Length / 2; i += 2) |
145 | { | 120 | { |
146 | switch (Int32.Parse(parms[i])) | 121 | switch (Int32.Parse(parms[i])) |
147 | { | 122 | { |
@@ -187,7 +162,8 @@ namespace OpenSim.Region.Environment.Modules.Scripting.HttpRequest | |||
187 | 162 | ||
188 | public void StopHttpRequest(uint m_localID, LLUUID m_itemID) | 163 | public void StopHttpRequest(uint m_localID, LLUUID m_itemID) |
189 | { | 164 | { |
190 | if(m_pendingRequests != null) { | 165 | if (m_pendingRequests != null) |
166 | { | ||
191 | lock (HttpListLock) | 167 | lock (HttpListLock) |
192 | { | 168 | { |
193 | HttpRequestClass tmpReq; | 169 | HttpRequestClass tmpReq; |
@@ -243,36 +219,68 @@ namespace OpenSim.Region.Environment.Modules.Scripting.HttpRequest | |||
243 | } | 219 | } |
244 | } | 220 | } |
245 | 221 | ||
222 | #endregion | ||
223 | |||
224 | #region IRegionModule Members | ||
225 | |||
226 | public void Initialise(Scene scene, IConfigSource config) | ||
227 | { | ||
228 | m_scene = scene; | ||
229 | |||
230 | m_scene.RegisterModuleInterface<IHttpRequests>(this); | ||
231 | |||
232 | m_pendingRequests = new Dictionary<LLUUID, HttpRequestClass>(); | ||
233 | } | ||
234 | |||
235 | public void PostInitialise() | ||
236 | { | ||
237 | } | ||
238 | |||
239 | public void Close() | ||
240 | { | ||
241 | } | ||
242 | |||
243 | public string Name | ||
244 | { | ||
245 | get { return m_name; } | ||
246 | } | ||
247 | |||
248 | public bool IsSharedModule | ||
249 | { | ||
250 | get { return true; } | ||
251 | } | ||
252 | |||
253 | #endregion | ||
246 | } | 254 | } |
247 | 255 | ||
248 | public class HttpRequestClass | 256 | public class HttpRequestClass |
249 | { | 257 | { |
250 | // Constants for parameters | 258 | // Constants for parameters |
259 | public const int HTTP_BODY_MAXLENGTH = 2; | ||
251 | public const int HTTP_METHOD = 0; | 260 | public const int HTTP_METHOD = 0; |
252 | public const int HTTP_MIMETYPE = 1; | 261 | public const int HTTP_MIMETYPE = 1; |
253 | public const int HTTP_BODY_MAXLENGTH = 2; | ||
254 | public const int HTTP_VERIFY_CERT = 3; | 262 | public const int HTTP_VERIFY_CERT = 3; |
263 | public bool finished; | ||
264 | public int httpBodyMaxLen = 2048; // not implemented | ||
255 | 265 | ||
256 | // Parameter members and default values | 266 | // Parameter members and default values |
257 | public string httpMethod = "GET"; | 267 | public string httpMethod = "GET"; |
258 | public string httpMIMEType = "text/plain;charset=utf-8"; | 268 | public string httpMIMEType = "text/plain;charset=utf-8"; |
259 | public int httpBodyMaxLen = 2048; // not implemented | 269 | private Thread httpThread; |
270 | public int httpTimeout; | ||
260 | public bool httpVerifyCert = true; // not implemented | 271 | public bool httpVerifyCert = true; // not implemented |
261 | 272 | ||
262 | // Request info | 273 | // Request info |
263 | public uint localID; | ||
264 | public LLUUID itemID; | 274 | public LLUUID itemID; |
265 | public LLUUID reqID; | 275 | public uint localID; |
266 | public int httpTimeout; | ||
267 | public string url; | ||
268 | public string outbound_body; | ||
269 | public DateTime next; | 276 | public DateTime next; |
270 | public int status; | 277 | public string outbound_body; |
271 | public bool finished; | 278 | public LLUUID reqID; |
272 | public List<string> response_metadata; | ||
273 | public string response_body; | ||
274 | public HttpWebRequest request; | 279 | public HttpWebRequest request; |
275 | private Thread httpThread; | 280 | public string response_body; |
281 | public List<string> response_metadata; | ||
282 | public int status; | ||
283 | public string url; | ||
276 | 284 | ||
277 | public void process() | 285 | public void process() |
278 | { | 286 | { |
diff --git a/OpenSim/Region/Environment/Modules/Scripting/LoadImageURL/LoadImageURLModule.cs b/OpenSim/Region/Environment/Modules/Scripting/LoadImageURL/LoadImageURLModule.cs index eaf9d36..a0408cd 100644 --- a/OpenSim/Region/Environment/Modules/Scripting/LoadImageURL/LoadImageURLModule.cs +++ b/OpenSim/Region/Environment/Modules/Scripting/LoadImageURL/LoadImageURLModule.cs | |||
@@ -40,39 +40,10 @@ namespace OpenSim.Region.Environment.Modules.Scripting.LoadImageURL | |||
40 | public class LoadImageURLModule : IRegionModule, IDynamicTextureRender | 40 | public class LoadImageURLModule : IRegionModule, IDynamicTextureRender |
41 | { | 41 | { |
42 | private string m_name = "LoadImageURL"; | 42 | private string m_name = "LoadImageURL"; |
43 | private IDynamicTextureManager m_textureManager; | ||
44 | private Scene m_scene; | 43 | private Scene m_scene; |
44 | private IDynamicTextureManager m_textureManager; | ||
45 | 45 | ||
46 | public void Initialise(Scene scene, IConfigSource config) | 46 | #region IDynamicTextureRender Members |
47 | { | ||
48 | if (m_scene == null) | ||
49 | { | ||
50 | m_scene = scene; | ||
51 | } | ||
52 | } | ||
53 | |||
54 | public void PostInitialise() | ||
55 | { | ||
56 | m_textureManager = m_scene.RequestModuleInterface<IDynamicTextureManager>(); | ||
57 | if (m_textureManager != null) | ||
58 | { | ||
59 | m_textureManager.RegisterRender(GetContentType(), this); | ||
60 | } | ||
61 | } | ||
62 | |||
63 | public void Close() | ||
64 | { | ||
65 | } | ||
66 | |||
67 | public string Name | ||
68 | { | ||
69 | get { return m_name; } | ||
70 | } | ||
71 | |||
72 | public bool IsSharedModule | ||
73 | { | ||
74 | get { return true; } | ||
75 | } | ||
76 | 47 | ||
77 | public string GetName() | 48 | public string GetName() |
78 | { | 49 | { |
@@ -110,6 +81,43 @@ namespace OpenSim.Region.Environment.Modules.Scripting.LoadImageURL | |||
110 | return false; | 81 | return false; |
111 | } | 82 | } |
112 | 83 | ||
84 | #endregion | ||
85 | |||
86 | #region IRegionModule Members | ||
87 | |||
88 | public void Initialise(Scene scene, IConfigSource config) | ||
89 | { | ||
90 | if (m_scene == null) | ||
91 | { | ||
92 | m_scene = scene; | ||
93 | } | ||
94 | } | ||
95 | |||
96 | public void PostInitialise() | ||
97 | { | ||
98 | m_textureManager = m_scene.RequestModuleInterface<IDynamicTextureManager>(); | ||
99 | if (m_textureManager != null) | ||
100 | { | ||
101 | m_textureManager.RegisterRender(GetContentType(), this); | ||
102 | } | ||
103 | } | ||
104 | |||
105 | public void Close() | ||
106 | { | ||
107 | } | ||
108 | |||
109 | public string Name | ||
110 | { | ||
111 | get { return m_name; } | ||
112 | } | ||
113 | |||
114 | public bool IsSharedModule | ||
115 | { | ||
116 | get { return true; } | ||
117 | } | ||
118 | |||
119 | #endregion | ||
120 | |||
113 | private void MakeHttpRequest(string url, LLUUID requestID) | 121 | private void MakeHttpRequest(string url, LLUUID requestID) |
114 | { | 122 | { |
115 | WebRequest request = HttpWebRequest.Create(url); | 123 | WebRequest request = HttpWebRequest.Create(url); |
@@ -138,8 +146,8 @@ namespace OpenSim.Region.Environment.Modules.Scripting.LoadImageURL | |||
138 | else if ((image.Height < 128) && (image.Width < 128)) | 146 | else if ((image.Height < 128) && (image.Width < 128)) |
139 | { | 147 | { |
140 | newsize = new Size(64, 64); | 148 | newsize = new Size(64, 64); |
141 | } | 149 | } |
142 | else if ((image.Height <256) && (image.Width < 256)) | 150 | else if ((image.Height < 256) && (image.Width < 256)) |
143 | { | 151 | { |
144 | newsize = new Size(128, 128); | 152 | newsize = new Size(128, 128); |
145 | } | 153 | } |
@@ -153,8 +161,8 @@ namespace OpenSim.Region.Environment.Modules.Scripting.LoadImageURL | |||
153 | } | 161 | } |
154 | else | 162 | else |
155 | { | 163 | { |
156 | newsize = new Size(1024,1024); | 164 | newsize = new Size(1024, 1024); |
157 | } | 165 | } |
158 | 166 | ||
159 | Bitmap resize = new Bitmap(image, newsize); | 167 | Bitmap resize = new Bitmap(image, newsize); |
160 | byte[] imageJ2000 = OpenJPEG.EncodeFromImage(resize, true); | 168 | byte[] imageJ2000 = OpenJPEG.EncodeFromImage(resize, true); |
@@ -163,6 +171,8 @@ namespace OpenSim.Region.Environment.Modules.Scripting.LoadImageURL | |||
163 | } | 171 | } |
164 | } | 172 | } |
165 | 173 | ||
174 | #region Nested type: RequestState | ||
175 | |||
166 | public class RequestState | 176 | public class RequestState |
167 | { | 177 | { |
168 | public HttpWebRequest Request = null; | 178 | public HttpWebRequest Request = null; |
@@ -175,5 +185,7 @@ namespace OpenSim.Region.Environment.Modules.Scripting.LoadImageURL | |||
175 | RequestID = requestID; | 185 | RequestID = requestID; |
176 | } | 186 | } |
177 | } | 187 | } |
188 | |||
189 | #endregion | ||
178 | } | 190 | } |
179 | } \ No newline at end of file | 191 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Environment/Modules/Scripting/VectorRender/VectorRenderModule.cs b/OpenSim/Region/Environment/Modules/Scripting/VectorRender/VectorRenderModule.cs index 4fba5b9..386c2b5 100644 --- a/OpenSim/Region/Environment/Modules/Scripting/VectorRender/VectorRenderModule.cs +++ b/OpenSim/Region/Environment/Modules/Scripting/VectorRender/VectorRenderModule.cs | |||
@@ -44,14 +44,56 @@ namespace OpenSim.Region.Environment.Modules.Scripting.VectorRender | |||
44 | { | 44 | { |
45 | public class VectorRenderModule : IRegionModule, IDynamicTextureRender | 45 | public class VectorRenderModule : IRegionModule, IDynamicTextureRender |
46 | { | 46 | { |
47 | private Scene m_scene; | ||
48 | private string m_name = "VectorRenderModule"; | 47 | private string m_name = "VectorRenderModule"; |
48 | private Scene m_scene; | ||
49 | private IDynamicTextureManager m_textureManager; | 49 | private IDynamicTextureManager m_textureManager; |
50 | 50 | ||
51 | public VectorRenderModule() | 51 | public VectorRenderModule() |
52 | { | 52 | { |
53 | } | 53 | } |
54 | 54 | ||
55 | #region IDynamicTextureRender Members | ||
56 | |||
57 | public string GetContentType() | ||
58 | { | ||
59 | return ("vector"); | ||
60 | } | ||
61 | |||
62 | public string GetName() | ||
63 | { | ||
64 | return m_name; | ||
65 | } | ||
66 | |||
67 | public bool SupportsAsynchronous() | ||
68 | { | ||
69 | return true; | ||
70 | } | ||
71 | |||
72 | public byte[] ConvertUrl(string url, string extraParams) | ||
73 | { | ||
74 | return null; | ||
75 | } | ||
76 | |||
77 | public byte[] ConvertStream(Stream data, string extraParams) | ||
78 | { | ||
79 | return null; | ||
80 | } | ||
81 | |||
82 | public bool AsyncConvertUrl(LLUUID id, string url, string extraParams) | ||
83 | { | ||
84 | return false; | ||
85 | } | ||
86 | |||
87 | public bool AsyncConvertData(LLUUID id, string bodyData, string extraParams) | ||
88 | { | ||
89 | Draw(bodyData, id, extraParams); | ||
90 | return true; | ||
91 | } | ||
92 | |||
93 | #endregion | ||
94 | |||
95 | #region IRegionModule Members | ||
96 | |||
55 | public void Initialise(Scene scene, IConfigSource config) | 97 | public void Initialise(Scene scene, IConfigSource config) |
56 | { | 98 | { |
57 | if (m_scene == null) | 99 | if (m_scene == null) |
@@ -83,21 +125,25 @@ namespace OpenSim.Region.Environment.Modules.Scripting.VectorRender | |||
83 | get { return true; } | 125 | get { return true; } |
84 | } | 126 | } |
85 | 127 | ||
128 | #endregion | ||
129 | |||
86 | private void Draw(string data, LLUUID id, string extraParams) | 130 | private void Draw(string data, LLUUID id, string extraParams) |
87 | { | 131 | { |
88 | // TODO: this is a brutal hack. extraParams should actually be parsed reasonably. | 132 | // TODO: this is a brutal hack. extraParams should actually be parsed reasonably. |
89 | int size = 256; | 133 | int size = 256; |
90 | try { | 134 | try |
135 | { | ||
91 | size = Convert.ToInt32(extraParams); | 136 | size = Convert.ToInt32(extraParams); |
92 | } catch (Exception e) { | 137 | } |
93 | 138 | catch (Exception e) | |
139 | { | ||
94 | //Ckrinke: Add a WriteLine to remove the warning about 'e' defined but not used | 140 | //Ckrinke: Add a WriteLine to remove the warning about 'e' defined but not used |
95 | Console.WriteLine("Problem with Draw. Please verify parameters." + e.ToString()); | 141 | Console.WriteLine("Problem with Draw. Please verify parameters." + e.ToString()); |
96 | } | 142 | } |
97 | 143 | ||
98 | if ((size < 128) || (size > 1024)) | 144 | if ((size < 128) || (size > 1024)) |
99 | size = 256; | 145 | size = 256; |
100 | 146 | ||
101 | Bitmap bitmap = new Bitmap(size, size, PixelFormat.Format32bppArgb); | 147 | Bitmap bitmap = new Bitmap(size, size, PixelFormat.Format32bppArgb); |
102 | 148 | ||
103 | Graphics graph = Graphics.FromImage(bitmap); | 149 | Graphics graph = Graphics.FromImage(bitmap); |
@@ -121,13 +167,11 @@ namespace OpenSim.Region.Environment.Modules.Scripting.VectorRender | |||
121 | } | 167 | } |
122 | } | 168 | } |
123 | 169 | ||
124 | |||
125 | 170 | ||
126 | GDIDraw(data, graph); | 171 | GDIDraw(data, graph); |
127 | 172 | ||
128 | byte[] imageJ2000 = OpenJPEG.EncodeFromImage(bitmap, true); | 173 | byte[] imageJ2000 = OpenJPEG.EncodeFromImage(bitmap, true); |
129 | m_textureManager.ReturnData(id, imageJ2000); | 174 | m_textureManager.ReturnData(id, imageJ2000); |
130 | |||
131 | } | 175 | } |
132 | 176 | ||
133 | /* | 177 | /* |
@@ -175,10 +219,10 @@ namespace OpenSim.Region.Environment.Modules.Scripting.VectorRender | |||
175 | Pen drawPen = new Pen(Color.Black, 7); | 219 | Pen drawPen = new Pen(Color.Black, 7); |
176 | Font myFont = new Font("Times New Roman", 14); | 220 | Font myFont = new Font("Times New Roman", 14); |
177 | SolidBrush myBrush = new SolidBrush(Color.Black); | 221 | SolidBrush myBrush = new SolidBrush(Color.Black); |
178 | char[] lineDelimiter = { ';' }; | 222 | char[] lineDelimiter = {';'}; |
179 | char[] partsDelimiter = { ',' }; | 223 | char[] partsDelimiter = {','}; |
180 | string[] lines = data.Split(lineDelimiter); | 224 | string[] lines = data.Split(lineDelimiter); |
181 | 225 | ||
182 | foreach (string line in lines) | 226 | foreach (string line in lines) |
183 | { | 227 | { |
184 | string nextLine = line.Trim(); | 228 | string nextLine = line.Trim(); |
@@ -188,16 +232,16 @@ namespace OpenSim.Region.Environment.Modules.Scripting.VectorRender | |||
188 | float x = 0; | 232 | float x = 0; |
189 | float y = 0; | 233 | float y = 0; |
190 | GetParams(partsDelimiter, ref nextLine, 6, ref x, ref y); | 234 | GetParams(partsDelimiter, ref nextLine, 6, ref x, ref y); |
191 | startPoint.X = (int)x; | 235 | startPoint.X = (int) x; |
192 | startPoint.Y = (int)y; | 236 | startPoint.Y = (int) y; |
193 | } | 237 | } |
194 | else if (nextLine.StartsWith("LineTo")) | 238 | else if (nextLine.StartsWith("LineTo")) |
195 | { | 239 | { |
196 | float x = 0; | 240 | float x = 0; |
197 | float y = 0; | 241 | float y = 0; |
198 | GetParams(partsDelimiter, ref nextLine, 6, ref x, ref y); | 242 | GetParams(partsDelimiter, ref nextLine, 6, ref x, ref y); |
199 | endPoint.X = (int)x; | 243 | endPoint.X = (int) x; |
200 | endPoint.Y = (int)y; | 244 | endPoint.Y = (int) y; |
201 | graph.DrawLine(drawPen, startPoint, endPoint); | 245 | graph.DrawLine(drawPen, startPoint, endPoint); |
202 | startPoint.X = endPoint.X; | 246 | startPoint.X = endPoint.X; |
203 | startPoint.Y = endPoint.Y; | 247 | startPoint.Y = endPoint.Y; |
@@ -213,10 +257,10 @@ namespace OpenSim.Region.Environment.Modules.Scripting.VectorRender | |||
213 | float x = 0; | 257 | float x = 0; |
214 | float y = 0; | 258 | float y = 0; |
215 | GetParams(partsDelimiter, ref nextLine, 5, ref x, ref y); | 259 | GetParams(partsDelimiter, ref nextLine, 5, ref x, ref y); |
216 | endPoint.X = (int)x; | 260 | endPoint.X = (int) x; |
217 | endPoint.Y = (int)y; | 261 | endPoint.Y = (int) y; |
218 | Image image = ImageHttpRequest(nextLine); | 262 | Image image = ImageHttpRequest(nextLine); |
219 | graph.DrawImage(image, (float)startPoint.X, (float)startPoint.Y, x, y); | 263 | graph.DrawImage(image, (float) startPoint.X, (float) startPoint.Y, x, y); |
220 | startPoint.X += endPoint.X; | 264 | startPoint.X += endPoint.X; |
221 | startPoint.Y += endPoint.Y; | 265 | startPoint.Y += endPoint.Y; |
222 | } | 266 | } |
@@ -225,8 +269,8 @@ namespace OpenSim.Region.Environment.Modules.Scripting.VectorRender | |||
225 | float x = 0; | 269 | float x = 0; |
226 | float y = 0; | 270 | float y = 0; |
227 | GetParams(partsDelimiter, ref nextLine, 9, ref x, ref y); | 271 | GetParams(partsDelimiter, ref nextLine, 9, ref x, ref y); |
228 | endPoint.X = (int)x; | 272 | endPoint.X = (int) x; |
229 | endPoint.Y = (int)y; | 273 | endPoint.Y = (int) y; |
230 | graph.DrawRectangle(drawPen, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y); | 274 | graph.DrawRectangle(drawPen, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y); |
231 | startPoint.X += endPoint.X; | 275 | startPoint.X += endPoint.X; |
232 | startPoint.Y += endPoint.Y; | 276 | startPoint.Y += endPoint.Y; |
@@ -236,8 +280,8 @@ namespace OpenSim.Region.Environment.Modules.Scripting.VectorRender | |||
236 | float x = 0; | 280 | float x = 0; |
237 | float y = 0; | 281 | float y = 0; |
238 | GetParams(partsDelimiter, ref nextLine, 13, ref x, ref y); | 282 | GetParams(partsDelimiter, ref nextLine, 13, ref x, ref y); |
239 | endPoint.X = (int)x; | 283 | endPoint.X = (int) x; |
240 | endPoint.Y = (int)y; | 284 | endPoint.Y = (int) y; |
241 | graph.FillRectangle(myBrush, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y); | 285 | graph.FillRectangle(myBrush, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y); |
242 | startPoint.X += endPoint.X; | 286 | startPoint.X += endPoint.X; |
243 | startPoint.Y += endPoint.Y; | 287 | startPoint.Y += endPoint.Y; |
@@ -247,8 +291,8 @@ namespace OpenSim.Region.Environment.Modules.Scripting.VectorRender | |||
247 | float x = 0; | 291 | float x = 0; |
248 | float y = 0; | 292 | float y = 0; |
249 | GetParams(partsDelimiter, ref nextLine, 7, ref x, ref y); | 293 | GetParams(partsDelimiter, ref nextLine, 7, ref x, ref y); |
250 | endPoint.X = (int)x; | 294 | endPoint.X = (int) x; |
251 | endPoint.Y = (int)y; | 295 | endPoint.Y = (int) y; |
252 | graph.DrawEllipse(drawPen, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y); | 296 | graph.DrawEllipse(drawPen, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y); |
253 | startPoint.X += endPoint.X; | 297 | startPoint.X += endPoint.X; |
254 | startPoint.Y += endPoint.Y; | 298 | startPoint.Y += endPoint.Y; |
@@ -271,7 +315,7 @@ namespace OpenSim.Region.Environment.Modules.Scripting.VectorRender | |||
271 | { | 315 | { |
272 | nextLine = nextLine.Remove(0, 9); | 316 | nextLine = nextLine.Remove(0, 9); |
273 | nextLine = nextLine.Trim(); | 317 | nextLine = nextLine.Trim(); |
274 | 318 | ||
275 | Color newColour = Color.FromName(nextLine); | 319 | Color newColour = Color.FromName(nextLine); |
276 | 320 | ||
277 | myBrush.Color = newColour; | 321 | myBrush.Color = newColour; |
@@ -312,7 +356,7 @@ namespace OpenSim.Region.Environment.Modules.Scripting.VectorRender | |||
312 | WebRequest request = HttpWebRequest.Create(url); | 356 | WebRequest request = HttpWebRequest.Create(url); |
313 | //Ckrinke: Comment out for now as 'str' is unused. Bring it back into play later when it is used. | 357 | //Ckrinke: Comment out for now as 'str' is unused. Bring it back into play later when it is used. |
314 | //Ckrinke Stream str = null; | 358 | //Ckrinke Stream str = null; |
315 | HttpWebResponse response = (HttpWebResponse)(request).GetResponse(); | 359 | HttpWebResponse response = (HttpWebResponse) (request).GetResponse(); |
316 | if (response.StatusCode == HttpStatusCode.OK) | 360 | if (response.StatusCode == HttpStatusCode.OK) |
317 | { | 361 | { |
318 | Bitmap image = new Bitmap(response.GetResponseStream()); | 362 | Bitmap image = new Bitmap(response.GetResponseStream()); |
@@ -321,41 +365,5 @@ namespace OpenSim.Region.Environment.Modules.Scripting.VectorRender | |||
321 | 365 | ||
322 | return null; | 366 | return null; |
323 | } | 367 | } |
324 | |||
325 | public string GetContentType() | ||
326 | { | ||
327 | return ("vector"); | ||
328 | } | ||
329 | |||
330 | public string GetName() | ||
331 | { | ||
332 | return m_name; | ||
333 | } | ||
334 | |||
335 | public bool SupportsAsynchronous() | ||
336 | { | ||
337 | return true; | ||
338 | } | ||
339 | |||
340 | public byte[] ConvertUrl(string url, string extraParams) | ||
341 | { | ||
342 | return null; | ||
343 | } | ||
344 | |||
345 | public byte[] ConvertStream(Stream data, string extraParams) | ||
346 | { | ||
347 | return null; | ||
348 | } | ||
349 | |||
350 | public bool AsyncConvertUrl(LLUUID id, string url, string extraParams) | ||
351 | { | ||
352 | return false; | ||
353 | } | ||
354 | |||
355 | public bool AsyncConvertData(LLUUID id, string bodyData, string extraParams) | ||
356 | { | ||
357 | Draw(bodyData, id, extraParams); | ||
358 | return true; | ||
359 | } | ||
360 | } | 368 | } |
361 | } \ No newline at end of file | 369 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Environment/Modules/Scripting/WorldComm/WorldCommModule.cs b/OpenSim/Region/Environment/Modules/Scripting/WorldComm/WorldCommModule.cs index a949fb6..ff3b31e 100644 --- a/OpenSim/Region/Environment/Modules/Scripting/WorldComm/WorldCommModule.cs +++ b/OpenSim/Region/Environment/Modules/Scripting/WorldComm/WorldCommModule.cs | |||
@@ -67,18 +67,20 @@ namespace OpenSim.Region.Environment.Modules.Scripting.WorldComm | |||
67 | { | 67 | { |
68 | public class WorldCommModule : IRegionModule, IWorldComm | 68 | public class WorldCommModule : IRegionModule, IWorldComm |
69 | { | 69 | { |
70 | private Scene m_scene; | ||
71 | private object CommListLock = new object(); | 70 | private object CommListLock = new object(); |
72 | private object ListLock = new object(); | 71 | private object ListLock = new object(); |
73 | private string m_name = "WorldCommModule"; | ||
74 | private ListenerManager m_listenerManager; | 72 | private ListenerManager m_listenerManager; |
75 | private Queue m_pendingQ; | 73 | private string m_name = "WorldCommModule"; |
76 | private Queue m_pending; | 74 | private Queue m_pending; |
75 | private Queue m_pendingQ; | ||
76 | private Scene m_scene; | ||
77 | 77 | ||
78 | public WorldCommModule() | 78 | public WorldCommModule() |
79 | { | 79 | { |
80 | } | 80 | } |
81 | 81 | ||
82 | #region IRegionModule Members | ||
83 | |||
82 | public void Initialise(Scene scene, IConfigSource config) | 84 | public void Initialise(Scene scene, IConfigSource config) |
83 | { | 85 | { |
84 | m_scene = scene; | 86 | m_scene = scene; |
@@ -107,23 +109,9 @@ namespace OpenSim.Region.Environment.Modules.Scripting.WorldComm | |||
107 | get { return false; } | 109 | get { return false; } |
108 | } | 110 | } |
109 | 111 | ||
110 | public void NewClient(IClientAPI client) | 112 | #endregion |
111 | { | ||
112 | client.OnChatFromViewer += DeliverClientMessage; | ||
113 | } | ||
114 | 113 | ||
115 | /******************************************************************** | 114 | #region IWorldComm Members |
116 | * | ||
117 | * Listener Stuff | ||
118 | * | ||
119 | * *****************************************************************/ | ||
120 | private void DeliverClientMessage(Object sender, ChatFromViewerArgs e) | ||
121 | { | ||
122 | DeliverMessage(e.Sender.AgentId.ToString(), | ||
123 | e.Type, e.Channel, | ||
124 | e.Sender.FirstName + " " + e.Sender.LastName, | ||
125 | e.Message); | ||
126 | } | ||
127 | 115 | ||
128 | public int Listen(uint localID, LLUUID itemID, LLUUID hostID, int channel, string name, string id, string msg) | 116 | public int Listen(uint localID, LLUUID itemID, LLUUID hostID, int channel, string name, string id, string msg) |
129 | { | 117 | { |
@@ -295,7 +283,7 @@ namespace OpenSim.Region.Environment.Modules.Scripting.WorldComm | |||
295 | 283 | ||
296 | lock (m_pending.SyncRoot) | 284 | lock (m_pending.SyncRoot) |
297 | { | 285 | { |
298 | li = (ListenerInfo)m_pending.Dequeue(); | 286 | li = (ListenerInfo) m_pending.Dequeue(); |
299 | } | 287 | } |
300 | 288 | ||
301 | return li; | 289 | return li; |
@@ -303,20 +291,41 @@ namespace OpenSim.Region.Environment.Modules.Scripting.WorldComm | |||
303 | 291 | ||
304 | public uint PeekNextMessageLocalID() | 292 | public uint PeekNextMessageLocalID() |
305 | { | 293 | { |
306 | return ((ListenerInfo)m_pending.Peek()).GetLocalID(); | 294 | return ((ListenerInfo) m_pending.Peek()).GetLocalID(); |
307 | } | 295 | } |
308 | 296 | ||
309 | public LLUUID PeekNextMessageItemID() | 297 | public LLUUID PeekNextMessageItemID() |
310 | { | 298 | { |
311 | return ((ListenerInfo)m_pending.Peek()).GetItemID(); | 299 | return ((ListenerInfo) m_pending.Peek()).GetItemID(); |
300 | } | ||
301 | |||
302 | #endregion | ||
303 | |||
304 | public void NewClient(IClientAPI client) | ||
305 | { | ||
306 | client.OnChatFromViewer += DeliverClientMessage; | ||
307 | } | ||
308 | |||
309 | /******************************************************************** | ||
310 | * | ||
311 | * Listener Stuff | ||
312 | * | ||
313 | * *****************************************************************/ | ||
314 | |||
315 | private void DeliverClientMessage(Object sender, ChatFromViewerArgs e) | ||
316 | { | ||
317 | DeliverMessage(e.Sender.AgentId.ToString(), | ||
318 | e.Type, e.Channel, | ||
319 | e.Sender.FirstName + " " + e.Sender.LastName, | ||
320 | e.Message); | ||
312 | } | 321 | } |
313 | } | 322 | } |
314 | 323 | ||
315 | public class ListenerManager | 324 | public class ListenerManager |
316 | { | 325 | { |
317 | //private Dictionary<int, ListenerInfo> m_listeners; | 326 | //private Dictionary<int, ListenerInfo> m_listeners; |
318 | private Hashtable m_listeners = Hashtable.Synchronized(new Hashtable()); | ||
319 | private object ListenersLock = new object(); | 327 | private object ListenersLock = new object(); |
328 | private Hashtable m_listeners = Hashtable.Synchronized(new Hashtable()); | ||
320 | private int m_MaxListeners = 100; | 329 | private int m_MaxListeners = 100; |
321 | 330 | ||
322 | public int AddListener(uint localID, LLUUID itemID, LLUUID hostID, int channel, string name, string id, string msg) | 331 | public int AddListener(uint localID, LLUUID itemID, LLUUID hostID, int channel, string name, string id, string msg) |
@@ -363,7 +372,7 @@ namespace OpenSim.Region.Environment.Modules.Scripting.WorldComm | |||
363 | IDictionaryEnumerator en = m_listeners.GetEnumerator(); | 372 | IDictionaryEnumerator en = m_listeners.GetEnumerator(); |
364 | while (en.MoveNext()) | 373 | while (en.MoveNext()) |
365 | { | 374 | { |
366 | ListenerInfo li = (ListenerInfo)en.Value; | 375 | ListenerInfo li = (ListenerInfo) en.Value; |
367 | if (li.GetItemID().Equals(itemID)) | 376 | if (li.GetItemID().Equals(itemID)) |
368 | { | 377 | { |
369 | removedListeners.Add(li.GetHandle()); | 378 | removedListeners.Add(li.GetHandle()); |
@@ -400,12 +409,11 @@ namespace OpenSim.Region.Environment.Modules.Scripting.WorldComm | |||
400 | 409 | ||
401 | public void Activate(int handle) | 410 | public void Activate(int handle) |
402 | { | 411 | { |
403 | |||
404 | if (m_listeners.ContainsKey(handle)) | 412 | if (m_listeners.ContainsKey(handle)) |
405 | { | 413 | { |
406 | lock (m_listeners.SyncRoot) | 414 | lock (m_listeners.SyncRoot) |
407 | { | 415 | { |
408 | ListenerInfo li = (ListenerInfo)m_listeners[handle]; | 416 | ListenerInfo li = (ListenerInfo) m_listeners[handle]; |
409 | li.Activate(); | 417 | li.Activate(); |
410 | } | 418 | } |
411 | } | 419 | } |
@@ -413,10 +421,9 @@ namespace OpenSim.Region.Environment.Modules.Scripting.WorldComm | |||
413 | 421 | ||
414 | public void Dectivate(int handle) | 422 | public void Dectivate(int handle) |
415 | { | 423 | { |
416 | |||
417 | if (m_listeners.ContainsKey(handle)) | 424 | if (m_listeners.ContainsKey(handle)) |
418 | { | 425 | { |
419 | ListenerInfo li = (ListenerInfo)m_listeners[handle]; | 426 | ListenerInfo li = (ListenerInfo) m_listeners[handle]; |
420 | li.Deactivate(); | 427 | li.Deactivate(); |
421 | } | 428 | } |
422 | } | 429 | } |
@@ -432,9 +439,9 @@ namespace OpenSim.Region.Environment.Modules.Scripting.WorldComm | |||
432 | IDictionaryEnumerator en = m_listeners.GetEnumerator(); | 439 | IDictionaryEnumerator en = m_listeners.GetEnumerator(); |
433 | while (en.MoveNext()) | 440 | while (en.MoveNext()) |
434 | { | 441 | { |
435 | ListenerInfo li = (ListenerInfo)en.Value; | 442 | ListenerInfo li = (ListenerInfo) en.Value; |
436 | 443 | ||
437 | if (li.IsActive()) | 444 | if (li.IsActive()) |
438 | { | 445 | { |
439 | if (li.GetHostID().Equals(listenerKey)) | 446 | if (li.GetHostID().Equals(listenerKey)) |
440 | { | 447 | { |
@@ -478,16 +485,16 @@ namespace OpenSim.Region.Environment.Modules.Scripting.WorldComm | |||
478 | 485 | ||
479 | public class ListenerInfo | 486 | public class ListenerInfo |
480 | { | 487 | { |
481 | private LLUUID m_itemID; // ID of the host script engine | 488 | private bool m_active; // Listener is active or not |
482 | private LLUUID m_hostID; // ID of the host/scene part | ||
483 | private LLUUID m_sourceItemID; // ID of the scenePart or avatar source of the message | ||
484 | private int m_channel; // Channel | 489 | private int m_channel; // Channel |
485 | private int m_handle; // Assigned handle of this listener | 490 | private int m_handle; // Assigned handle of this listener |
486 | private uint m_localID; // Local ID from script engine | 491 | private LLUUID m_hostID; // ID of the host/scene part |
487 | private string m_name; // Object name to filter messages from | ||
488 | private LLUUID m_id; // ID to filter messages from | 492 | private LLUUID m_id; // ID to filter messages from |
493 | private LLUUID m_itemID; // ID of the host script engine | ||
494 | private uint m_localID; // Local ID from script engine | ||
489 | private string m_message; // The message | 495 | private string m_message; // The message |
490 | private bool m_active; // Listener is active or not | 496 | private string m_name; // Object name to filter messages from |
497 | private LLUUID m_sourceItemID; // ID of the scenePart or avatar source of the message | ||
491 | 498 | ||
492 | public ListenerInfo(uint localID, int handle, LLUUID ItemID, LLUUID hostID, int channel, string name, LLUUID id, string message) | 499 | public ListenerInfo(uint localID, int handle, LLUUID ItemID, LLUUID hostID, int channel, string name, LLUUID id, string message) |
493 | { | 500 | { |
diff --git a/OpenSim/Region/Environment/Modules/Scripting/XMLRPC/XMLRPCModule.cs b/OpenSim/Region/Environment/Modules/Scripting/XMLRPC/XMLRPCModule.cs index 1139b4b..6ca8136 100644 --- a/OpenSim/Region/Environment/Modules/Scripting/XMLRPC/XMLRPCModule.cs +++ b/OpenSim/Region/Environment/Modules/Scripting/XMLRPC/XMLRPCModule.cs | |||
@@ -79,20 +79,21 @@ namespace OpenSim.Region.Environment.Modules.Scripting.XMLRPC | |||
79 | { | 79 | { |
80 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 80 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
81 | 81 | ||
82 | private object XMLRPCListLock = new object(); | ||
83 | private string m_name = "XMLRPCModule"; | 82 | private string m_name = "XMLRPCModule"; |
84 | private int RemoteReplyScriptWait = 300; | ||
85 | private int RemoteReplyScriptTimeout = 9000; | ||
86 | private int m_remoteDataPort = 0; | ||
87 | private List<Scene> m_scenes = new List<Scene>(); | ||
88 | 83 | ||
89 | // <channel id, RPCChannelInfo> | 84 | // <channel id, RPCChannelInfo> |
90 | private Dictionary<LLUUID, RPCChannelInfo> m_openChannels; | 85 | private Dictionary<LLUUID, RPCChannelInfo> m_openChannels; |
86 | private Dictionary<LLUUID, SendRemoteDataRequest> m_pendingSRDResponses; | ||
87 | private int m_remoteDataPort = 0; | ||
91 | 88 | ||
92 | private Dictionary<LLUUID, RPCRequestInfo> m_rpcPending; | 89 | private Dictionary<LLUUID, RPCRequestInfo> m_rpcPending; |
93 | private Dictionary<LLUUID, RPCRequestInfo> m_rpcPendingResponses; | 90 | private Dictionary<LLUUID, RPCRequestInfo> m_rpcPendingResponses; |
91 | private List<Scene> m_scenes = new List<Scene>(); | ||
92 | private int RemoteReplyScriptTimeout = 9000; | ||
93 | private int RemoteReplyScriptWait = 300; | ||
94 | private object XMLRPCListLock = new object(); | ||
94 | 95 | ||
95 | private Dictionary<LLUUID, SendRemoteDataRequest> m_pendingSRDResponses; | 96 | #region IRegionModule Members |
96 | 97 | ||
97 | public void Initialise(Scene scene, IConfigSource config) | 98 | public void Initialise(Scene scene, IConfigSource config) |
98 | { | 99 | { |
@@ -125,7 +126,7 @@ namespace OpenSim.Region.Environment.Modules.Scripting.XMLRPC | |||
125 | // Attach xmlrpc handlers | 126 | // Attach xmlrpc handlers |
126 | m_log.Info("[REMOTE_DATA]: " + | 127 | m_log.Info("[REMOTE_DATA]: " + |
127 | "Starting XMLRPC Server on port " + m_remoteDataPort + " for llRemoteData commands."); | 128 | "Starting XMLRPC Server on port " + m_remoteDataPort + " for llRemoteData commands."); |
128 | BaseHttpServer httpServer = new BaseHttpServer((uint)m_remoteDataPort); | 129 | BaseHttpServer httpServer = new BaseHttpServer((uint) m_remoteDataPort); |
129 | httpServer.AddXmlRPCHandler("llRemoteData", XmlRpcRemoteData); | 130 | httpServer.AddXmlRPCHandler("llRemoteData", XmlRpcRemoteData); |
130 | httpServer.Start(); | 131 | httpServer.Start(); |
131 | } | 132 | } |
@@ -145,6 +146,10 @@ namespace OpenSim.Region.Environment.Modules.Scripting.XMLRPC | |||
145 | get { return true; } | 146 | get { return true; } |
146 | } | 147 | } |
147 | 148 | ||
149 | #endregion | ||
150 | |||
151 | #region IXMLRPC Members | ||
152 | |||
148 | public bool IsEnabled() | 153 | public bool IsEnabled() |
149 | { | 154 | { |
150 | return (m_remoteDataPort > 0); | 155 | return (m_remoteDataPort > 0); |
@@ -196,7 +201,6 @@ namespace OpenSim.Region.Environment.Modules.Scripting.XMLRPC | |||
196 | // for when a script is deleted | 201 | // for when a script is deleted |
197 | public void DeleteChannels(LLUUID itemID) | 202 | public void DeleteChannels(LLUUID itemID) |
198 | { | 203 | { |
199 | |||
200 | if (m_openChannels != null) | 204 | if (m_openChannels != null) |
201 | { | 205 | { |
202 | ArrayList tmp = new ArrayList(); | 206 | ArrayList tmp = new ArrayList(); |
@@ -212,12 +216,10 @@ namespace OpenSim.Region.Environment.Modules.Scripting.XMLRPC | |||
212 | } | 216 | } |
213 | 217 | ||
214 | IEnumerator tmpEnumerator = tmp.GetEnumerator(); | 218 | IEnumerator tmpEnumerator = tmp.GetEnumerator(); |
215 | while ( tmpEnumerator.MoveNext() ) | 219 | while (tmpEnumerator.MoveNext()) |
216 | m_openChannels.Remove((LLUUID)tmpEnumerator.Current); | 220 | m_openChannels.Remove((LLUUID) tmpEnumerator.Current); |
217 | } | 221 | } |
218 | |||
219 | } | 222 | } |
220 | |||
221 | } | 223 | } |
222 | 224 | ||
223 | /********************************************** | 225 | /********************************************** |
@@ -255,67 +257,6 @@ namespace OpenSim.Region.Environment.Modules.Scripting.XMLRPC | |||
255 | } | 257 | } |
256 | 258 | ||
257 | 259 | ||
258 | public XmlRpcResponse XmlRpcRemoteData(XmlRpcRequest request) | ||
259 | { | ||
260 | XmlRpcResponse response = new XmlRpcResponse(); | ||
261 | |||
262 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
263 | bool GoodXML = (requestData.Contains("Channel") && requestData.Contains("IntValue") && | ||
264 | requestData.Contains("StringValue")); | ||
265 | |||
266 | if (GoodXML) | ||
267 | { | ||
268 | LLUUID channel = new LLUUID((string)requestData["Channel"]); | ||
269 | RPCChannelInfo rpcChanInfo; | ||
270 | if (m_openChannels.TryGetValue(channel, out rpcChanInfo)) | ||
271 | { | ||
272 | string intVal = (string)requestData["IntValue"]; | ||
273 | string strVal = (string)requestData["StringValue"]; | ||
274 | |||
275 | RPCRequestInfo rpcInfo; | ||
276 | |||
277 | lock (XMLRPCListLock) | ||
278 | { | ||
279 | rpcInfo = | ||
280 | new RPCRequestInfo(rpcChanInfo.GetLocalID(), rpcChanInfo.GetItemID(), channel, strVal, | ||
281 | intVal); | ||
282 | m_rpcPending.Add(rpcInfo.GetMessageID(), rpcInfo); | ||
283 | } | ||
284 | |||
285 | int timeoutCtr = 0; | ||
286 | |||
287 | while (!rpcInfo.IsProcessed() && (timeoutCtr < RemoteReplyScriptTimeout)) | ||
288 | { | ||
289 | Thread.Sleep(RemoteReplyScriptWait); | ||
290 | timeoutCtr += RemoteReplyScriptWait; | ||
291 | } | ||
292 | if (rpcInfo.IsProcessed()) | ||
293 | { | ||
294 | Hashtable param = new Hashtable(); | ||
295 | param["StringValue"] = rpcInfo.GetStrRetval(); | ||
296 | param["IntValue"] = Convert.ToString(rpcInfo.GetIntRetval()); | ||
297 | |||
298 | ArrayList parameters = new ArrayList(); | ||
299 | parameters.Add(param); | ||
300 | |||
301 | response.Value = parameters; | ||
302 | rpcInfo = null; | ||
303 | } | ||
304 | else | ||
305 | { | ||
306 | response.SetFault(-1, "Script timeout"); | ||
307 | rpcInfo = null; | ||
308 | } | ||
309 | } | ||
310 | else | ||
311 | { | ||
312 | response.SetFault(-1, "Invalid channel"); | ||
313 | } | ||
314 | } | ||
315 | |||
316 | return response; | ||
317 | } | ||
318 | |||
319 | public bool hasRequests() | 260 | public bool hasRequests() |
320 | { | 261 | { |
321 | lock (XMLRPCListLock) | 262 | lock (XMLRPCListLock) |
@@ -339,7 +280,6 @@ namespace OpenSim.Region.Environment.Modules.Scripting.XMLRPC | |||
339 | 280 | ||
340 | if (m_rpcPending.TryGetValue(luid, out tmpReq)) | 281 | if (m_rpcPending.TryGetValue(luid, out tmpReq)) |
341 | { | 282 | { |
342 | |||
343 | if (!tmpReq.IsProcessed()) return tmpReq; | 283 | if (!tmpReq.IsProcessed()) return tmpReq; |
344 | } | 284 | } |
345 | } | 285 | } |
@@ -367,13 +307,11 @@ namespace OpenSim.Region.Environment.Modules.Scripting.XMLRPC | |||
367 | 307 | ||
368 | public LLUUID SendRemoteData(uint localID, LLUUID itemID, string channel, string dest, int idata, string sdata) | 308 | public LLUUID SendRemoteData(uint localID, LLUUID itemID, string channel, string dest, int idata, string sdata) |
369 | { | 309 | { |
370 | |||
371 | SendRemoteDataRequest req = new SendRemoteDataRequest( | 310 | SendRemoteDataRequest req = new SendRemoteDataRequest( |
372 | localID, itemID, channel, dest, idata, sdata | 311 | localID, itemID, channel, dest, idata, sdata |
373 | ); | 312 | ); |
374 | m_pendingSRDResponses.Add(req.GetReqID(), req); | 313 | m_pendingSRDResponses.Add(req.GetReqID(), req); |
375 | return req.process(); | 314 | return req.process(); |
376 | |||
377 | } | 315 | } |
378 | 316 | ||
379 | public SendRemoteDataRequest GetNextCompletedSRDRequest() | 317 | public SendRemoteDataRequest GetNextCompletedSRDRequest() |
@@ -423,19 +361,82 @@ namespace OpenSim.Region.Environment.Modules.Scripting.XMLRPC | |||
423 | } | 361 | } |
424 | } | 362 | } |
425 | } | 363 | } |
364 | |||
365 | #endregion | ||
366 | |||
367 | public XmlRpcResponse XmlRpcRemoteData(XmlRpcRequest request) | ||
368 | { | ||
369 | XmlRpcResponse response = new XmlRpcResponse(); | ||
370 | |||
371 | Hashtable requestData = (Hashtable) request.Params[0]; | ||
372 | bool GoodXML = (requestData.Contains("Channel") && requestData.Contains("IntValue") && | ||
373 | requestData.Contains("StringValue")); | ||
374 | |||
375 | if (GoodXML) | ||
376 | { | ||
377 | LLUUID channel = new LLUUID((string) requestData["Channel"]); | ||
378 | RPCChannelInfo rpcChanInfo; | ||
379 | if (m_openChannels.TryGetValue(channel, out rpcChanInfo)) | ||
380 | { | ||
381 | string intVal = (string) requestData["IntValue"]; | ||
382 | string strVal = (string) requestData["StringValue"]; | ||
383 | |||
384 | RPCRequestInfo rpcInfo; | ||
385 | |||
386 | lock (XMLRPCListLock) | ||
387 | { | ||
388 | rpcInfo = | ||
389 | new RPCRequestInfo(rpcChanInfo.GetLocalID(), rpcChanInfo.GetItemID(), channel, strVal, | ||
390 | intVal); | ||
391 | m_rpcPending.Add(rpcInfo.GetMessageID(), rpcInfo); | ||
392 | } | ||
393 | |||
394 | int timeoutCtr = 0; | ||
395 | |||
396 | while (!rpcInfo.IsProcessed() && (timeoutCtr < RemoteReplyScriptTimeout)) | ||
397 | { | ||
398 | Thread.Sleep(RemoteReplyScriptWait); | ||
399 | timeoutCtr += RemoteReplyScriptWait; | ||
400 | } | ||
401 | if (rpcInfo.IsProcessed()) | ||
402 | { | ||
403 | Hashtable param = new Hashtable(); | ||
404 | param["StringValue"] = rpcInfo.GetStrRetval(); | ||
405 | param["IntValue"] = Convert.ToString(rpcInfo.GetIntRetval()); | ||
406 | |||
407 | ArrayList parameters = new ArrayList(); | ||
408 | parameters.Add(param); | ||
409 | |||
410 | response.Value = parameters; | ||
411 | rpcInfo = null; | ||
412 | } | ||
413 | else | ||
414 | { | ||
415 | response.SetFault(-1, "Script timeout"); | ||
416 | rpcInfo = null; | ||
417 | } | ||
418 | } | ||
419 | else | ||
420 | { | ||
421 | response.SetFault(-1, "Invalid channel"); | ||
422 | } | ||
423 | } | ||
424 | |||
425 | return response; | ||
426 | } | ||
426 | } | 427 | } |
427 | 428 | ||
428 | public class RPCRequestInfo | 429 | public class RPCRequestInfo |
429 | { | 430 | { |
430 | private string m_StrVal; | 431 | private LLUUID m_ChannelKey; |
431 | private string m_IntVal; | 432 | private string m_IntVal; |
432 | private bool m_processed; | ||
433 | private string m_respStr; | ||
434 | private int m_respInt; | ||
435 | private uint m_localID; | ||
436 | private LLUUID m_ItemID; | 433 | private LLUUID m_ItemID; |
434 | private uint m_localID; | ||
437 | private LLUUID m_MessageID; | 435 | private LLUUID m_MessageID; |
438 | private LLUUID m_ChannelKey; | 436 | private bool m_processed; |
437 | private int m_respInt; | ||
438 | private string m_respStr; | ||
439 | private string m_StrVal; | ||
439 | 440 | ||
440 | public RPCRequestInfo(uint localID, LLUUID itemID, LLUUID channelKey, string strVal, string intVal) | 441 | public RPCRequestInfo(uint localID, LLUUID itemID, LLUUID channelKey, string strVal, string intVal) |
441 | { | 442 | { |
@@ -474,6 +475,7 @@ namespace OpenSim.Region.Environment.Modules.Scripting.XMLRPC | |||
474 | { | 475 | { |
475 | return m_respStr; | 476 | return m_respStr; |
476 | } | 477 | } |
478 | |||
477 | public void SetIntRetval(int resp) | 479 | public void SetIntRetval(int resp) |
478 | { | 480 | { |
479 | m_respInt = resp; | 481 | m_respInt = resp; |
@@ -483,6 +485,7 @@ namespace OpenSim.Region.Environment.Modules.Scripting.XMLRPC | |||
483 | { | 485 | { |
484 | return m_respInt; | 486 | return m_respInt; |
485 | } | 487 | } |
488 | |||
486 | public uint GetLocalID() | 489 | public uint GetLocalID() |
487 | { | 490 | { |
488 | return m_localID; | 491 | return m_localID; |
@@ -511,9 +514,9 @@ namespace OpenSim.Region.Environment.Modules.Scripting.XMLRPC | |||
511 | 514 | ||
512 | public class RPCChannelInfo | 515 | public class RPCChannelInfo |
513 | { | 516 | { |
517 | private LLUUID m_ChannelKey; | ||
514 | private LLUUID m_itemID; | 518 | private LLUUID m_itemID; |
515 | private uint m_localID; | 519 | private uint m_localID; |
516 | private LLUUID m_ChannelKey; | ||
517 | 520 | ||
518 | public RPCChannelInfo(uint localID, LLUUID itemID, LLUUID channelID) | 521 | public RPCChannelInfo(uint localID, LLUUID itemID, LLUUID channelID) |
519 | { | 522 | { |
@@ -536,38 +539,34 @@ namespace OpenSim.Region.Environment.Modules.Scripting.XMLRPC | |||
536 | { | 539 | { |
537 | return m_localID; | 540 | return m_localID; |
538 | } | 541 | } |
539 | |||
540 | } | 542 | } |
541 | 543 | ||
542 | public class SendRemoteDataRequest | 544 | public class SendRemoteDataRequest |
543 | { | 545 | { |
544 | 546 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | |
545 | public LLUUID reqID; | ||
546 | public string destURL; | ||
547 | public string channel; | 547 | public string channel; |
548 | public string sdata; | 548 | public string destURL; |
549 | public int idata; | ||
550 | public bool finished; | 549 | public bool finished; |
551 | public string response_sdata; | ||
552 | public int response_idata; | ||
553 | public XmlRpcRequest request; | ||
554 | private Thread httpThread; | 550 | private Thread httpThread; |
551 | public int idata; | ||
555 | public LLUUID m_itemID; | 552 | public LLUUID m_itemID; |
556 | public uint m_localID; | 553 | public uint m_localID; |
557 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 554 | public LLUUID reqID; |
555 | public XmlRpcRequest request; | ||
556 | public int response_idata; | ||
557 | public string response_sdata; | ||
558 | public string sdata; | ||
558 | 559 | ||
559 | public SendRemoteDataRequest(uint localID, LLUUID itemID, string channel, string dest, int idata, string sdata) | 560 | public SendRemoteDataRequest(uint localID, LLUUID itemID, string channel, string dest, int idata, string sdata) |
560 | { | 561 | { |
561 | |||
562 | this.channel = channel; | 562 | this.channel = channel; |
563 | this.destURL = dest; | 563 | destURL = dest; |
564 | this.idata = idata; | 564 | this.idata = idata; |
565 | this.sdata = sdata; | 565 | this.sdata = sdata; |
566 | m_itemID = itemID; | 566 | m_itemID = itemID; |
567 | m_localID = localID; | 567 | m_localID = localID; |
568 | 568 | ||
569 | reqID = LLUUID.Random(); | 569 | reqID = LLUUID.Random(); |
570 | |||
571 | } | 570 | } |
572 | 571 | ||
573 | public LLUUID process() | 572 | public LLUUID process() |
@@ -581,7 +580,6 @@ namespace OpenSim.Region.Environment.Modules.Scripting.XMLRPC | |||
581 | ThreadTracker.Add(httpThread); | 580 | ThreadTracker.Add(httpThread); |
582 | 581 | ||
583 | return reqID; | 582 | return reqID; |
584 | |||
585 | } | 583 | } |
586 | 584 | ||
587 | /* | 585 | /* |
@@ -597,8 +595,8 @@ namespace OpenSim.Region.Environment.Modules.Scripting.XMLRPC | |||
597 | // if not, use as method name | 595 | // if not, use as method name |
598 | LLUUID parseUID; | 596 | LLUUID parseUID; |
599 | string mName = "llRemoteData"; | 597 | string mName = "llRemoteData"; |
600 | if( (channel != null) && (channel != "") ) | 598 | if ((channel != null) && (channel != "")) |
601 | if( !LLUUID.TryParse(channel, out parseUID) ) | 599 | if (!LLUUID.TryParse(channel, out parseUID)) |
602 | mName = channel; | 600 | mName = channel; |
603 | else | 601 | else |
604 | param["Channel"] = channel; | 602 | param["Channel"] = channel; |
@@ -615,26 +613,28 @@ namespace OpenSim.Region.Environment.Modules.Scripting.XMLRPC | |||
615 | if (resp != null) | 613 | if (resp != null) |
616 | { | 614 | { |
617 | Hashtable respParms; | 615 | Hashtable respParms; |
618 | if(resp.Value.GetType().Equals(Type.GetType("System.Collections.Hashtable"))) { | 616 | if (resp.Value.GetType().Equals(Type.GetType("System.Collections.Hashtable"))) |
619 | respParms = (Hashtable)resp.Value; | 617 | { |
618 | respParms = (Hashtable) resp.Value; | ||
620 | } | 619 | } |
621 | else { | 620 | else |
622 | ArrayList respData = (ArrayList)resp.Value; | 621 | { |
623 | respParms = (Hashtable)respData[0]; | 622 | ArrayList respData = (ArrayList) resp.Value; |
623 | respParms = (Hashtable) respData[0]; | ||
624 | } | 624 | } |
625 | if (respParms != null) | 625 | if (respParms != null) |
626 | { | 626 | { |
627 | if (respParms.Contains("StringValue")) | 627 | if (respParms.Contains("StringValue")) |
628 | { | 628 | { |
629 | sdata = (string)respParms["StringValue"]; | 629 | sdata = (string) respParms["StringValue"]; |
630 | } | 630 | } |
631 | if (respParms.Contains("IntValue")) | 631 | if (respParms.Contains("IntValue")) |
632 | { | 632 | { |
633 | idata = Convert.ToInt32((string)respParms["IntValue"]); | 633 | idata = Convert.ToInt32((string) respParms["IntValue"]); |
634 | } | 634 | } |
635 | if (respParms.Contains("faultString")) | 635 | if (respParms.Contains("faultString")) |
636 | { | 636 | { |
637 | sdata = (string)respParms["faultString"]; | 637 | sdata = (string) respParms["faultString"]; |
638 | } | 638 | } |
639 | if (respParms.Contains("faultCode")) | 639 | if (respParms.Contains("faultCode")) |
640 | { | 640 | { |
diff --git a/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs b/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs index cbea07a..efc5234 100644 --- a/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs +++ b/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs | |||
@@ -43,61 +43,45 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
43 | 43 | ||
44 | //Land types set with flags in ParcelOverlay. | 44 | //Land types set with flags in ParcelOverlay. |
45 | //Only one of these can be used. | 45 | //Only one of these can be used. |
46 | public const byte LAND_TYPE_PUBLIC = (byte)0; //Equals 00000000 | 46 | public const float BAN_LINE_SAFETY_HIEGHT = 100; |
47 | public const byte LAND_TYPE_OWNED_BY_OTHER = (byte)1; //Equals 00000001 | 47 | public const byte LAND_FLAG_PROPERTY_BORDER_SOUTH = (byte) 128; //Equals 10000000 |
48 | public const byte LAND_TYPE_OWNED_BY_GROUP = (byte)2; //Equals 00000010 | 48 | public const byte LAND_FLAG_PROPERTY_BORDER_WEST = (byte) 64; //Equals 01000000 |
49 | public const byte LAND_TYPE_OWNED_BY_REQUESTER = (byte)3; //Equals 00000011 | ||
50 | public const byte LAND_TYPE_IS_FOR_SALE = (byte)4; //Equals 00000100 | ||
51 | public const byte LAND_TYPE_IS_BEING_AUCTIONED = (byte)5; //Equals 00000101 | ||
52 | |||
53 | //Flags that when set, a border on the given side will be placed | ||
54 | //NOTE: North and East is assumable by the west and south sides (if land to east has a west border, then I have an east border; etc) | ||
55 | //This took forever to figure out -- jeesh. /blame LL for even having to send these | ||
56 | public const byte LAND_FLAG_PROPERTY_BORDER_WEST = (byte)64; //Equals 01000000 | ||
57 | public const byte LAND_FLAG_PROPERTY_BORDER_SOUTH = (byte)128; //Equals 10000000 | ||
58 | 49 | ||
59 | //RequestResults (I think these are right, they seem to work): | 50 | //RequestResults (I think these are right, they seem to work): |
60 | public const int LAND_RESULT_SINGLE = 0; // The request they made contained only a single piece of land | ||
61 | public const int LAND_RESULT_MULTIPLE = 1; // The request they made contained more than a single peice of land | 51 | public const int LAND_RESULT_MULTIPLE = 1; // The request they made contained more than a single peice of land |
52 | public const int LAND_RESULT_SINGLE = 0; // The request they made contained only a single piece of land | ||
62 | 53 | ||
63 | //ParcelSelectObjects | 54 | //ParcelSelectObjects |
64 | public const int LAND_SELECT_OBJECTS_OWNER = 2; | ||
65 | public const int LAND_SELECT_OBJECTS_GROUP = 4; | 55 | public const int LAND_SELECT_OBJECTS_GROUP = 4; |
66 | public const int LAND_SELECT_OBJECTS_OTHER = 8; | 56 | public const int LAND_SELECT_OBJECTS_OTHER = 8; |
57 | public const int LAND_SELECT_OBJECTS_OWNER = 2; | ||
58 | public const byte LAND_TYPE_IS_BEING_AUCTIONED = (byte) 5; //Equals 00000101 | ||
59 | public const byte LAND_TYPE_IS_FOR_SALE = (byte) 4; //Equals 00000100 | ||
60 | public const byte LAND_TYPE_OWNED_BY_GROUP = (byte) 2; //Equals 00000010 | ||
61 | public const byte LAND_TYPE_OWNED_BY_OTHER = (byte) 1; //Equals 00000001 | ||
62 | public const byte LAND_TYPE_OWNED_BY_REQUESTER = (byte) 3; //Equals 00000011 | ||
63 | public const byte LAND_TYPE_PUBLIC = (byte) 0; //Equals 00000000 | ||
67 | 64 | ||
68 | //These are other constants. Yay! | 65 | //These are other constants. Yay! |
69 | public const int START_LAND_LOCAL_ID = 1; | 66 | public const int START_LAND_LOCAL_ID = 1; |
70 | 67 | ||
71 | public const float BAN_LINE_SAFETY_HIEGHT = 100; | ||
72 | |||
73 | #endregion | 68 | #endregion |
74 | 69 | ||
75 | private Scene m_scene; | 70 | private int[,] landIDList = new int[64,64]; |
76 | |||
77 | private Dictionary<int, ILandObject> landList = new Dictionary<int, ILandObject>(); | 71 | private Dictionary<int, ILandObject> landList = new Dictionary<int, ILandObject>(); |
78 | private int lastLandLocalID = START_LAND_LOCAL_ID - 1; | ||
79 | private int[,] landIDList = new int[64, 64]; | ||
80 | 72 | ||
81 | private bool landPrimCountTainted = false; | 73 | private bool landPrimCountTainted = false; |
74 | private int lastLandLocalID = START_LAND_LOCAL_ID - 1; | ||
82 | 75 | ||
83 | private bool m_allowedForcefulBans = true; | 76 | private bool m_allowedForcefulBans = true; |
84 | public bool allowedForcefulBans | 77 | private Scene m_scene; |
85 | { | ||
86 | get | ||
87 | { | ||
88 | return m_allowedForcefulBans; | ||
89 | } | ||
90 | set | ||
91 | { | ||
92 | m_allowedForcefulBans = value; | ||
93 | } | ||
94 | } | ||
95 | 78 | ||
96 | public LandChannel(Scene scene) | 79 | public LandChannel(Scene scene) |
97 | { | 80 | { |
98 | m_scene = scene; | 81 | m_scene = scene; |
99 | landIDList.Initialize(); | 82 | landIDList.Initialize(); |
100 | } | 83 | } |
84 | |||
101 | #region Land Object From Storage Functions | 85 | #region Land Object From Storage Functions |
102 | 86 | ||
103 | public void IncomingLandObjectsFromStorage(List<LandData> data) | 87 | public void IncomingLandObjectsFromStorage(List<LandData> data) |
@@ -133,10 +117,64 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
133 | resetSimLandObjects(); | 117 | resetSimLandObjects(); |
134 | } | 118 | } |
135 | 119 | ||
136 | #endregion | 120 | #endregion |
137 | 121 | ||
138 | #region Parcel Add/Remove/Get/Create | 122 | #region Parcel Add/Remove/Get/Create |
139 | 123 | ||
124 | public void updateLandObject(int local_id, LandData newData) | ||
125 | { | ||
126 | if (landList.ContainsKey(local_id)) | ||
127 | { | ||
128 | landList[local_id].landData = newData.Copy(); | ||
129 | m_scene.EventManager.TriggerLandObjectUpdated((uint) local_id, landList[local_id]); | ||
130 | } | ||
131 | } | ||
132 | |||
133 | /// <summary> | ||
134 | /// Get the land object at the specified point | ||
135 | /// </summary> | ||
136 | /// <param name="x">Value between 0 - 256 on the x axis of the point</param> | ||
137 | /// <param name="y">Value between 0 - 256 on the y axis of the point</param> | ||
138 | /// <returns>Land object at the point supplied</returns> | ||
139 | public ILandObject getLandObject(float x_float, float y_float) | ||
140 | { | ||
141 | int x; | ||
142 | int y; | ||
143 | |||
144 | try | ||
145 | { | ||
146 | x = Convert.ToInt32(Math.Floor(Convert.ToDouble(x_float) / Convert.ToDouble(4.0))); | ||
147 | y = Convert.ToInt32(Math.Floor(Convert.ToDouble(y_float) / Convert.ToDouble(4.0))); | ||
148 | } | ||
149 | catch (OverflowException) | ||
150 | { | ||
151 | return null; | ||
152 | } | ||
153 | |||
154 | if (x >= 64 || y >= 64 || x < 0 || y < 0) | ||
155 | { | ||
156 | return null; | ||
157 | } | ||
158 | else | ||
159 | { | ||
160 | return landList[landIDList[x, y]]; | ||
161 | } | ||
162 | } | ||
163 | |||
164 | public ILandObject getLandObject(int x, int y) | ||
165 | { | ||
166 | if (x >= Convert.ToInt32(Constants.RegionSize) || y >= Convert.ToInt32(Constants.RegionSize) || x < 0 || y < 0) | ||
167 | { | ||
168 | // These exceptions here will cause a lot of complaints from the users specifically because | ||
169 | // they happen every time at border crossings | ||
170 | throw new Exception("Error: Parcel not found at point " + x + ", " + y); | ||
171 | } | ||
172 | else | ||
173 | { | ||
174 | return landList[landIDList[x / 4, y / 4]]; | ||
175 | } | ||
176 | } | ||
177 | |||
140 | /// <summary> | 178 | /// <summary> |
141 | /// Creates a basic Parcel object without an owner (a zeroed key) | 179 | /// Creates a basic Parcel object without an owner (a zeroed key) |
142 | /// </summary> | 180 | /// </summary> |
@@ -154,7 +192,7 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
154 | { | 192 | { |
155 | lastLandLocalID++; | 193 | lastLandLocalID++; |
156 | new_land.landData.localID = lastLandLocalID; | 194 | new_land.landData.localID = lastLandLocalID; |
157 | landList.Add(lastLandLocalID, (LandObject)new_land.Copy()); | 195 | landList.Add(lastLandLocalID, (LandObject) new_land.Copy()); |
158 | 196 | ||
159 | 197 | ||
160 | bool[,] landBitmap = new_land.getLandBitmap(); | 198 | bool[,] landBitmap = new_land.getLandBitmap(); |
@@ -197,15 +235,6 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
197 | landList.Remove(local_id); | 235 | landList.Remove(local_id); |
198 | } | 236 | } |
199 | 237 | ||
200 | public void updateLandObject(int local_id, LandData newData) | ||
201 | { | ||
202 | if (landList.ContainsKey(local_id)) | ||
203 | { | ||
204 | landList[local_id].landData = newData.Copy(); | ||
205 | m_scene.EventManager.TriggerLandObjectUpdated((uint)local_id, landList[local_id]); | ||
206 | } | ||
207 | } | ||
208 | |||
209 | private void performFinalLandJoin(ILandObject master, ILandObject slave) | 238 | private void performFinalLandJoin(ILandObject master, ILandObject slave) |
210 | { | 239 | { |
211 | int x, y; | 240 | int x, y; |
@@ -225,66 +254,113 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
225 | updateLandObject(master.landData.localID, master.landData); | 254 | updateLandObject(master.landData.localID, master.landData); |
226 | } | 255 | } |
227 | 256 | ||
228 | /// <summary> | 257 | public ILandObject getLandObject(int parcelLocalID) |
229 | /// Get the land object at the specified point | ||
230 | /// </summary> | ||
231 | /// <param name="x">Value between 0 - 256 on the x axis of the point</param> | ||
232 | /// <param name="y">Value between 0 - 256 on the y axis of the point</param> | ||
233 | /// <returns>Land object at the point supplied</returns> | ||
234 | public ILandObject getLandObject(float x_float, float y_float) | ||
235 | { | 258 | { |
236 | int x; | 259 | lock (landList) |
237 | int y; | ||
238 | |||
239 | try | ||
240 | { | 260 | { |
241 | x = Convert.ToInt32(Math.Floor(Convert.ToDouble(x_float) / Convert.ToDouble(4.0))); | 261 | if (landList.ContainsKey(parcelLocalID)) |
242 | y = Convert.ToInt32(Math.Floor(Convert.ToDouble(y_float) / Convert.ToDouble(4.0))); | 262 | { |
263 | return landList[parcelLocalID]; | ||
264 | } | ||
243 | } | 265 | } |
244 | catch (OverflowException) | 266 | return null; |
267 | } | ||
268 | |||
269 | #endregion | ||
270 | |||
271 | #region Parcel Modification | ||
272 | |||
273 | public void resetAllLandPrimCounts() | ||
274 | { | ||
275 | foreach (LandObject p in landList.Values) | ||
245 | { | 276 | { |
246 | return null; | 277 | p.resetLandPrimCounts(); |
247 | } | 278 | } |
279 | } | ||
248 | 280 | ||
249 | if (x >= 64 || y >= 64 || x < 0 || y < 0) | 281 | public void setPrimsTainted() |
282 | { | ||
283 | landPrimCountTainted = true; | ||
284 | } | ||
285 | |||
286 | public bool isLandPrimCountTainted() | ||
287 | { | ||
288 | return landPrimCountTainted; | ||
289 | } | ||
290 | |||
291 | public void addPrimToLandPrimCounts(SceneObjectGroup obj) | ||
292 | { | ||
293 | LLVector3 position = obj.AbsolutePosition; | ||
294 | ILandObject landUnderPrim = getLandObject(position.X, position.Y); | ||
295 | if (landUnderPrim != null) | ||
250 | { | 296 | { |
251 | return null; | 297 | landUnderPrim.addPrimToCount(obj); |
252 | } | 298 | } |
253 | else | 299 | } |
300 | |||
301 | public void removePrimFromLandPrimCounts(SceneObjectGroup obj) | ||
302 | { | ||
303 | foreach (LandObject p in landList.Values) | ||
254 | { | 304 | { |
255 | return landList[landIDList[x, y]]; | 305 | p.removePrimFromCount(obj); |
256 | } | 306 | } |
257 | } | 307 | } |
258 | 308 | ||
259 | public ILandObject getLandObject(int parcelLocalID) | 309 | public void finalizeLandPrimCountUpdate() |
260 | { | 310 | { |
261 | lock (landList) | 311 | //Get Simwide prim count for owner |
312 | Dictionary<LLUUID, List<LandObject>> landOwnersAndParcels = new Dictionary<LLUUID, List<LandObject>>(); | ||
313 | foreach (LandObject p in landList.Values) | ||
262 | { | 314 | { |
263 | if (landList.ContainsKey(parcelLocalID)) | 315 | if (!landOwnersAndParcels.ContainsKey(p.landData.ownerID)) |
264 | { | 316 | { |
265 | return landList[parcelLocalID]; | 317 | List<LandObject> tempList = new List<LandObject>(); |
318 | tempList.Add(p); | ||
319 | landOwnersAndParcels.Add(p.landData.ownerID, tempList); | ||
320 | } | ||
321 | else | ||
322 | { | ||
323 | landOwnersAndParcels[p.landData.ownerID].Add(p); | ||
266 | } | 324 | } |
267 | } | 325 | } |
268 | return null; | ||
269 | } | ||
270 | 326 | ||
271 | public ILandObject getLandObject(int x, int y) | 327 | foreach (LLUUID owner in landOwnersAndParcels.Keys) |
272 | { | ||
273 | if (x >= Convert.ToInt32(Constants.RegionSize) || y >= Convert.ToInt32(Constants.RegionSize) || x < 0 || y < 0) | ||
274 | { | 328 | { |
275 | // These exceptions here will cause a lot of complaints from the users specifically because | 329 | int simArea = 0; |
276 | // they happen every time at border crossings | 330 | int simPrims = 0; |
277 | throw new Exception("Error: Parcel not found at point " + x + ", " + y); | 331 | foreach (LandObject p in landOwnersAndParcels[owner]) |
332 | { | ||
333 | simArea += p.landData.area; | ||
334 | simPrims += p.landData.ownerPrims + p.landData.otherPrims + p.landData.groupPrims + | ||
335 | p.landData.selectedPrims; | ||
336 | } | ||
337 | |||
338 | foreach (LandObject p in landOwnersAndParcels[owner]) | ||
339 | { | ||
340 | p.landData.simwideArea = simArea; | ||
341 | p.landData.simwidePrims = simPrims; | ||
342 | } | ||
278 | } | 343 | } |
279 | else | 344 | } |
345 | |||
346 | public void updateLandPrimCounts() | ||
347 | { | ||
348 | foreach (EntityBase obj in m_scene.Entities.Values) | ||
280 | { | 349 | { |
281 | return landList[landIDList[x / 4, y / 4]]; | 350 | if (obj is SceneObjectGroup) |
351 | { | ||
352 | m_scene.EventManager.TriggerParcelPrimCountAdd((SceneObjectGroup) obj); | ||
353 | } | ||
282 | } | 354 | } |
283 | } | 355 | } |
284 | 356 | ||
285 | #endregion | 357 | public void performParcelPrimCountUpdate() |
286 | 358 | { | |
287 | #region Parcel Modification | 359 | resetAllLandPrimCounts(); |
360 | m_scene.EventManager.TriggerParcelPrimCountUpdate(); | ||
361 | finalizeLandPrimCountUpdate(); | ||
362 | landPrimCountTainted = false; | ||
363 | } | ||
288 | 364 | ||
289 | /// <summary> | 365 | /// <summary> |
290 | /// Subdivides a piece of land | 366 | /// Subdivides a piece of land |
@@ -435,97 +511,6 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
435 | return true; | 511 | return true; |
436 | } | 512 | } |
437 | 513 | ||
438 | public void resetAllLandPrimCounts() | ||
439 | { | ||
440 | foreach (LandObject p in landList.Values) | ||
441 | { | ||
442 | p.resetLandPrimCounts(); | ||
443 | } | ||
444 | } | ||
445 | |||
446 | public void setPrimsTainted() | ||
447 | { | ||
448 | landPrimCountTainted = true; | ||
449 | } | ||
450 | |||
451 | public bool isLandPrimCountTainted() | ||
452 | { | ||
453 | return landPrimCountTainted; | ||
454 | } | ||
455 | |||
456 | public void addPrimToLandPrimCounts(SceneObjectGroup obj) | ||
457 | { | ||
458 | LLVector3 position = obj.AbsolutePosition; | ||
459 | ILandObject landUnderPrim = getLandObject(position.X, position.Y); | ||
460 | if (landUnderPrim != null) | ||
461 | { | ||
462 | landUnderPrim.addPrimToCount(obj); | ||
463 | } | ||
464 | } | ||
465 | |||
466 | public void removePrimFromLandPrimCounts(SceneObjectGroup obj) | ||
467 | { | ||
468 | foreach (LandObject p in landList.Values) | ||
469 | { | ||
470 | p.removePrimFromCount(obj); | ||
471 | } | ||
472 | } | ||
473 | |||
474 | public void finalizeLandPrimCountUpdate() | ||
475 | { | ||
476 | //Get Simwide prim count for owner | ||
477 | Dictionary<LLUUID, List<LandObject>> landOwnersAndParcels = new Dictionary<LLUUID, List<LandObject>>(); | ||
478 | foreach (LandObject p in landList.Values) | ||
479 | { | ||
480 | if (!landOwnersAndParcels.ContainsKey(p.landData.ownerID)) | ||
481 | { | ||
482 | List<LandObject> tempList = new List<LandObject>(); | ||
483 | tempList.Add(p); | ||
484 | landOwnersAndParcels.Add(p.landData.ownerID, tempList); | ||
485 | } | ||
486 | else | ||
487 | { | ||
488 | landOwnersAndParcels[p.landData.ownerID].Add(p); | ||
489 | } | ||
490 | } | ||
491 | |||
492 | foreach (LLUUID owner in landOwnersAndParcels.Keys) | ||
493 | { | ||
494 | int simArea = 0; | ||
495 | int simPrims = 0; | ||
496 | foreach (LandObject p in landOwnersAndParcels[owner]) | ||
497 | { | ||
498 | simArea += p.landData.area; | ||
499 | simPrims += p.landData.ownerPrims + p.landData.otherPrims + p.landData.groupPrims + | ||
500 | p.landData.selectedPrims; | ||
501 | } | ||
502 | |||
503 | foreach (LandObject p in landOwnersAndParcels[owner]) | ||
504 | { | ||
505 | p.landData.simwideArea = simArea; | ||
506 | p.landData.simwidePrims = simPrims; | ||
507 | } | ||
508 | } | ||
509 | } | ||
510 | |||
511 | public void updateLandPrimCounts() | ||
512 | { | ||
513 | foreach (EntityBase obj in m_scene.Entities.Values) | ||
514 | { | ||
515 | if (obj is SceneObjectGroup) | ||
516 | { | ||
517 | m_scene.EventManager.TriggerParcelPrimCountAdd((SceneObjectGroup)obj); | ||
518 | } | ||
519 | } | ||
520 | } | ||
521 | |||
522 | public void performParcelPrimCountUpdate() | ||
523 | { | ||
524 | resetAllLandPrimCounts(); | ||
525 | m_scene.EventManager.TriggerParcelPrimCountUpdate(); | ||
526 | finalizeLandPrimCountUpdate(); | ||
527 | landPrimCountTainted = false; | ||
528 | } | ||
529 | #endregion | 514 | #endregion |
530 | 515 | ||
531 | #region Parcel Updating | 516 | #region Parcel Updating |
@@ -547,7 +532,7 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
547 | { | 532 | { |
548 | for (x = 0; x < 64; x++) | 533 | for (x = 0; x < 64; x++) |
549 | { | 534 | { |
550 | byte tempByte = (byte)0; //This represents the byte for the current 4x4 | 535 | byte tempByte = (byte) 0; //This represents the byte for the current 4x4 |
551 | ILandObject currentParcelBlock = null; | 536 | ILandObject currentParcelBlock = null; |
552 | 537 | ||
553 | try | 538 | try |
@@ -623,10 +608,10 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
623 | if (byteArrayCount >= LAND_BLOCKS_PER_PACKET) | 608 | if (byteArrayCount >= LAND_BLOCKS_PER_PACKET) |
624 | { | 609 | { |
625 | byteArrayCount = 0; | 610 | byteArrayCount = 0; |
626 | packet = (ParcelOverlayPacket)PacketPool.Instance.GetPacket(PacketType.ParcelOverlay); | 611 | packet = (ParcelOverlayPacket) PacketPool.Instance.GetPacket(PacketType.ParcelOverlay); |
627 | packet.ParcelData.Data = byteArray; | 612 | packet.ParcelData.Data = byteArray; |
628 | packet.ParcelData.SequenceID = sequenceID; | 613 | packet.ParcelData.SequenceID = sequenceID; |
629 | remote_client.OutPacket((Packet)packet, ThrottleOutPacketType.Task); | 614 | remote_client.OutPacket((Packet) packet, ThrottleOutPacketType.Task); |
630 | sequenceID++; | 615 | sequenceID++; |
631 | byteArray = new byte[LAND_BLOCKS_PER_PACKET]; | 616 | byteArray = new byte[LAND_BLOCKS_PER_PACKET]; |
632 | } | 617 | } |
@@ -652,7 +637,6 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
652 | { | 637 | { |
653 | for (y = 0; y < inc_y; y++) | 638 | for (y = 0; y < inc_y; y++) |
654 | { | 639 | { |
655 | |||
656 | ILandObject currentParcel = null; | 640 | ILandObject currentParcel = null; |
657 | try | 641 | try |
658 | { | 642 | { |
@@ -693,7 +677,6 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
693 | if (landList.ContainsKey(packet.ParcelData.LocalID)) | 677 | if (landList.ContainsKey(packet.ParcelData.LocalID)) |
694 | { | 678 | { |
695 | landList[packet.ParcelData.LocalID].updateLandProperties(packet, remote_client); | 679 | landList[packet.ParcelData.LocalID].updateLandProperties(packet, remote_client); |
696 | |||
697 | } | 680 | } |
698 | } | 681 | } |
699 | 682 | ||
@@ -719,6 +702,14 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
719 | 702 | ||
720 | #endregion | 703 | #endregion |
721 | 704 | ||
705 | #region ILandChannel Members | ||
706 | |||
707 | public bool allowedForcefulBans | ||
708 | { | ||
709 | get { return m_allowedForcefulBans; } | ||
710 | set { m_allowedForcefulBans = value; } | ||
711 | } | ||
712 | |||
722 | /// <summary> | 713 | /// <summary> |
723 | /// Resets the sim to the default land object (full sim piece of land owned by the default user) | 714 | /// Resets the sim to the default land object (full sim piece of land owned by the default user) |
724 | /// </summary> | 715 | /// </summary> |
@@ -731,7 +722,7 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
731 | 722 | ||
732 | ILandObject fullSimParcel = new LandObject(LLUUID.Zero, false, m_scene); | 723 | ILandObject fullSimParcel = new LandObject(LLUUID.Zero, false, m_scene); |
733 | 724 | ||
734 | fullSimParcel.setLandBitmap(fullSimParcel.getSquareLandBitmap(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize)); | 725 | fullSimParcel.setLandBitmap(fullSimParcel.getSquareLandBitmap(0, 0, (int) Constants.RegionSize, (int) Constants.RegionSize)); |
735 | fullSimParcel.landData.ownerID = m_scene.RegionInfo.MasterAvatarAssignedUUID; | 726 | fullSimParcel.landData.ownerID = m_scene.RegionInfo.MasterAvatarAssignedUUID; |
736 | 727 | ||
737 | addLandObject(fullSimParcel); | 728 | addLandObject(fullSimParcel); |
@@ -816,18 +807,17 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
816 | { | 807 | { |
817 | if (presence.UUID == avatar.AgentId) | 808 | if (presence.UUID == avatar.AgentId) |
818 | { | 809 | { |
819 | |||
820 | List<ILandObject> checkLandParcels = parcelsNearPoint(presence.AbsolutePosition); | 810 | List<ILandObject> checkLandParcels = parcelsNearPoint(presence.AbsolutePosition); |
821 | foreach (ILandObject checkBan in checkLandParcels) | 811 | foreach (ILandObject checkBan in checkLandParcels) |
822 | { | 812 | { |
823 | if (checkBan.isBannedFromLand(avatar.AgentId)) | 813 | if (checkBan.isBannedFromLand(avatar.AgentId)) |
824 | { | 814 | { |
825 | checkBan.sendLandProperties(-30000, false, (int)ParcelManager.ParcelResult.Single, avatar); | 815 | checkBan.sendLandProperties(-30000, false, (int) ParcelManager.ParcelResult.Single, avatar); |
826 | return; //Only send one | 816 | return; //Only send one |
827 | } | 817 | } |
828 | else if (checkBan.isRestrictedFromLand(avatar.AgentId)) | 818 | else if (checkBan.isRestrictedFromLand(avatar.AgentId)) |
829 | { | 819 | { |
830 | checkBan.sendLandProperties(-40000, false, (int)ParcelManager.ParcelResult.Single, avatar); | 820 | checkBan.sendLandProperties(-40000, false, (int) ParcelManager.ParcelResult.Single, avatar); |
831 | return; //Only send one | 821 | return; //Only send one |
832 | } | 822 | } |
833 | } | 823 | } |
@@ -841,8 +831,8 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
841 | ILandObject over = null; | 831 | ILandObject over = null; |
842 | try | 832 | try |
843 | { | 833 | { |
844 | over = getLandObject((int)Math.Min(255, Math.Max(0, Math.Round(avatar.AbsolutePosition.X))), | 834 | over = getLandObject((int) Math.Min(255, Math.Max(0, Math.Round(avatar.AbsolutePosition.X))), |
845 | (int)Math.Min(255, Math.Max(0, Math.Round(avatar.AbsolutePosition.Y)))); | 835 | (int) Math.Min(255, Math.Max(0, Math.Round(avatar.AbsolutePosition.Y)))); |
846 | } | 836 | } |
847 | catch (Exception) | 837 | catch (Exception) |
848 | { | 838 | { |
@@ -873,11 +863,12 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
873 | } | 863 | } |
874 | } | 864 | } |
875 | } | 865 | } |
866 | |||
876 | public void sendLandUpdate(ScenePresence avatar) | 867 | public void sendLandUpdate(ScenePresence avatar) |
877 | { | 868 | { |
878 | sendLandUpdate(avatar, false); | 869 | sendLandUpdate(avatar, false); |
879 | |||
880 | } | 870 | } |
871 | |||
881 | public void handleSignificantClientMovement(IClientAPI remote_client) | 872 | public void handleSignificantClientMovement(IClientAPI remote_client) |
882 | { | 873 | { |
883 | ScenePresence clientAvatar = m_scene.GetScenePresence(remote_client.AgentId); | 874 | ScenePresence clientAvatar = m_scene.GetScenePresence(remote_client.AgentId); |
@@ -949,6 +940,8 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
949 | } | 940 | } |
950 | } | 941 | } |
951 | 942 | ||
943 | #endregion | ||
944 | |||
952 | // If the economy has been validated by the economy module, | 945 | // If the economy has been validated by the economy module, |
953 | // and land has been validated as well, this method transfers | 946 | // and land has been validated as well, this method transfers |
954 | // the land ownership | 947 | // the land ownership |
@@ -961,7 +954,7 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
961 | { | 954 | { |
962 | if (landList.ContainsKey(e.parcelLocalID)) | 955 | if (landList.ContainsKey(e.parcelLocalID)) |
963 | { | 956 | { |
964 | landList[e.parcelLocalID].updateLandSold(e.agentId, e.groupId, e.groupOwned, (uint)e.transactionID, e.parcelPrice, e.parcelArea); | 957 | landList[e.parcelLocalID].updateLandSold(e.agentId, e.groupId, e.groupOwned, (uint) e.transactionID, e.parcelPrice, e.parcelArea); |
965 | return; | 958 | return; |
966 | } | 959 | } |
967 | } | 960 | } |
@@ -989,17 +982,16 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
989 | LLUUID AuthorizedID = lob.landData.authBuyerID; | 982 | LLUUID AuthorizedID = lob.landData.authBuyerID; |
990 | int saleprice = lob.landData.salePrice; | 983 | int saleprice = lob.landData.salePrice; |
991 | LLUUID pOwnerID = lob.landData.ownerID; | 984 | LLUUID pOwnerID = lob.landData.ownerID; |
992 | 985 | ||
993 | bool landforsale = ((lob.landData.landFlags & (uint)(Parcel.ParcelFlags.ForSale | Parcel.ParcelFlags.ForSaleObjects | Parcel.ParcelFlags.SellParcelObjects)) != 0); | 986 | bool landforsale = ((lob.landData.landFlags & |
987 | (uint) (Parcel.ParcelFlags.ForSale | Parcel.ParcelFlags.ForSaleObjects | Parcel.ParcelFlags.SellParcelObjects)) != 0); | ||
994 | if ((AuthorizedID == LLUUID.Zero || AuthorizedID == e.agentId) && e.parcelPrice >= saleprice && landforsale) | 988 | if ((AuthorizedID == LLUUID.Zero || AuthorizedID == e.agentId) && e.parcelPrice >= saleprice && landforsale) |
995 | { | 989 | { |
996 | lock (e) | 990 | lock (e) |
997 | { | 991 | { |
998 | e.parcelOwnerID = pOwnerID; | 992 | e.parcelOwnerID = pOwnerID; |
999 | e.landValidated = true; | 993 | e.landValidated = true; |
1000 | |||
1001 | } | 994 | } |
1002 | |||
1003 | } | 995 | } |
1004 | } | 996 | } |
1005 | } | 997 | } |
diff --git a/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs b/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs index c5ffdca..3f09bd5 100644 --- a/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs | |||
@@ -27,7 +27,6 @@ | |||
27 | 27 | ||
28 | using Nini.Config; | 28 | using Nini.Config; |
29 | using OpenSim.Region.Environment.Interfaces; | 29 | using OpenSim.Region.Environment.Interfaces; |
30 | using OpenSim.Region.Environment.Modules.World.Land; | ||
31 | using OpenSim.Region.Environment.Scenes; | 30 | using OpenSim.Region.Environment.Scenes; |
32 | 31 | ||
33 | namespace OpenSim.Region.Environment.Modules.World.Land | 32 | namespace OpenSim.Region.Environment.Modules.World.Land |
@@ -43,7 +42,7 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
43 | { | 42 | { |
44 | m_scene = scene; | 43 | m_scene = scene; |
45 | landChannel = new LandChannel(scene); | 44 | landChannel = new LandChannel(scene); |
46 | 45 | ||
47 | m_scene.EventManager.OnParcelPrimCountAdd += landChannel.addPrimToLandPrimCounts; | 46 | m_scene.EventManager.OnParcelPrimCountAdd += landChannel.addPrimToLandPrimCounts; |
48 | m_scene.EventManager.OnParcelPrimCountUpdate += landChannel.updateLandPrimCounts; | 47 | m_scene.EventManager.OnParcelPrimCountUpdate += landChannel.updateLandPrimCounts; |
49 | m_scene.EventManager.OnAvatarEnteringNewParcel += new EventManager.AvatarEnteringNewParcel(landChannel.handleAvatarChangingParcel); | 48 | m_scene.EventManager.OnAvatarEnteringNewParcel += new EventManager.AvatarEnteringNewParcel(landChannel.handleAvatarChangingParcel); |
@@ -53,18 +52,16 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
53 | 52 | ||
54 | lock (m_scene) | 53 | lock (m_scene) |
55 | { | 54 | { |
56 | m_scene.LandChannel = (ILandChannel)landChannel; | 55 | m_scene.LandChannel = (ILandChannel) landChannel; |
57 | } | 56 | } |
58 | } | 57 | } |
59 | 58 | ||
60 | public void PostInitialise() | 59 | public void PostInitialise() |
61 | { | 60 | { |
62 | |||
63 | } | 61 | } |
64 | 62 | ||
65 | public void Close() | 63 | public void Close() |
66 | { | 64 | { |
67 | |||
68 | } | 65 | } |
69 | 66 | ||
70 | public string Name | 67 | public string Name |
@@ -77,10 +74,6 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
77 | get { return false; } | 74 | get { return false; } |
78 | } | 75 | } |
79 | 76 | ||
80 | |||
81 | |||
82 | |||
83 | |||
84 | #endregion | 77 | #endregion |
85 | } | 78 | } |
86 | } \ No newline at end of file | 79 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Environment/Modules/World/Land/LandObject.cs b/OpenSim/Region/Environment/Modules/World/Land/LandObject.cs index 693c55d..368e113 100644 --- a/OpenSim/Region/Environment/Modules/World/Land/LandObject.cs +++ b/OpenSim/Region/Environment/Modules/World/Land/LandObject.cs | |||
@@ -33,7 +33,6 @@ using libsecondlife.Packets; | |||
33 | using log4net; | 33 | using log4net; |
34 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
35 | using OpenSim.Region.Environment.Interfaces; | 35 | using OpenSim.Region.Environment.Interfaces; |
36 | using OpenSim.Region.Environment.Modules.World.Land; | ||
37 | using OpenSim.Region.Environment.Scenes; | 36 | using OpenSim.Region.Environment.Scenes; |
38 | 37 | ||
39 | namespace OpenSim.Region.Environment.Modules.World.Land | 38 | namespace OpenSim.Region.Environment.Modules.World.Land |
@@ -46,23 +45,16 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
46 | #region Member Variables | 45 | #region Member Variables |
47 | 46 | ||
48 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
48 | private bool[,] m_landBitmap = new bool[64,64]; | ||
49 | 49 | ||
50 | protected LandData m_landData = new LandData(); | 50 | protected LandData m_landData = new LandData(); |
51 | protected List<SceneObjectGroup> primsOverMe = new List<SceneObjectGroup>(); | ||
52 | protected Scene m_scene; | 51 | protected Scene m_scene; |
53 | 52 | protected List<SceneObjectGroup> primsOverMe = new List<SceneObjectGroup>(); | |
54 | private bool[,] m_landBitmap = new bool[64,64]; | ||
55 | 53 | ||
56 | public bool[,] landBitmap | 54 | public bool[,] landBitmap |
57 | { | 55 | { |
58 | get | 56 | get { return m_landBitmap; } |
59 | { | 57 | set { m_landBitmap = value; } |
60 | return m_landBitmap; | ||
61 | } | ||
62 | set | ||
63 | { | ||
64 | m_landBitmap = value; | ||
65 | } | ||
66 | } | 58 | } |
67 | 59 | ||
68 | #endregion | 60 | #endregion |
@@ -71,25 +63,16 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
71 | 63 | ||
72 | public LandData landData | 64 | public LandData landData |
73 | { | 65 | { |
74 | get | 66 | get { return m_landData; } |
75 | { | ||
76 | return m_landData; | ||
77 | } | ||
78 | 67 | ||
79 | set | 68 | set { m_landData = value; } |
80 | { | ||
81 | m_landData = value; | ||
82 | } | ||
83 | } | 69 | } |
84 | 70 | ||
85 | public LLUUID regionUUID | 71 | public LLUUID regionUUID |
86 | { | 72 | { |
87 | get { return m_scene.RegionInfo.RegionID; } | 73 | get { return m_scene.RegionInfo.RegionID; } |
88 | } | 74 | } |
89 | 75 | ||
90 | #endregion | ||
91 | |||
92 | |||
93 | #region Constructors | 76 | #region Constructors |
94 | 77 | ||
95 | public LandObject(LLUUID owner_id, bool is_group_owned, Scene scene) | 78 | public LandObject(LLUUID owner_id, bool is_group_owned, Scene scene) |
@@ -115,7 +98,7 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
115 | { | 98 | { |
116 | if (x >= 0 && y >= 0 && x <= Constants.RegionSize && x <= Constants.RegionSize) | 99 | if (x >= 0 && y >= 0 && x <= Constants.RegionSize && x <= Constants.RegionSize) |
117 | { | 100 | { |
118 | return (landBitmap[x/4, y/4] == true); | 101 | return (landBitmap[x / 4, y / 4] == true); |
119 | } | 102 | } |
120 | else | 103 | else |
121 | { | 104 | { |
@@ -149,7 +132,7 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
149 | { | 132 | { |
150 | ParcelPropertiesPacket updatePacket = (ParcelPropertiesPacket) PacketPool.Instance.GetPacket(PacketType.ParcelProperties); | 133 | ParcelPropertiesPacket updatePacket = (ParcelPropertiesPacket) PacketPool.Instance.GetPacket(PacketType.ParcelProperties); |
151 | // TODO: don't create new blocks if recycling an old packet | 134 | // TODO: don't create new blocks if recycling an old packet |
152 | 135 | ||
153 | updatePacket.ParcelData.AABBMax = landData.AABBMax; | 136 | updatePacket.ParcelData.AABBMax = landData.AABBMax; |
154 | updatePacket.ParcelData.AABBMin = landData.AABBMin; | 137 | updatePacket.ParcelData.AABBMin = landData.AABBMin; |
155 | updatePacket.ParcelData.Area = landData.area; | 138 | updatePacket.ParcelData.Area = landData.area; |
@@ -171,7 +154,7 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
171 | { | 154 | { |
172 | updatePacket.ParcelData.MaxPrims = | 155 | updatePacket.ParcelData.MaxPrims = |
173 | Convert.ToInt32( | 156 | Convert.ToInt32( |
174 | Math.Round((Convert.ToDecimal(landData.area)/Convert.ToDecimal(65536))*m_scene.objectCapacity* | 157 | Math.Round((Convert.ToDecimal(landData.area) / Convert.ToDecimal(65536)) * m_scene.objectCapacity * |
175 | Convert.ToDecimal(m_scene.RegionInfo.EstateSettings.objectBonusFactor))); | 158 | Convert.ToDecimal(m_scene.RegionInfo.EstateSettings.objectBonusFactor))); |
176 | } | 159 | } |
177 | else | 160 | else |
@@ -193,7 +176,7 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
193 | updatePacket.ParcelData.PassHours = landData.passHours; | 176 | updatePacket.ParcelData.PassHours = landData.passHours; |
194 | updatePacket.ParcelData.PassPrice = landData.passPrice; | 177 | updatePacket.ParcelData.PassPrice = landData.passPrice; |
195 | updatePacket.ParcelData.PublicCount = 0; //unemplemented | 178 | updatePacket.ParcelData.PublicCount = 0; //unemplemented |
196 | 179 | ||
197 | uint regionFlags = (uint) m_scene.RegionInfo.EstateSettings.regionFlags; | 180 | uint regionFlags = (uint) m_scene.RegionInfo.EstateSettings.regionFlags; |
198 | updatePacket.ParcelData.RegionDenyAnonymous = ((regionFlags & (uint) Simulator.RegionFlags.DenyAnonymous) > | 181 | updatePacket.ParcelData.RegionDenyAnonymous = ((regionFlags & (uint) Simulator.RegionFlags.DenyAnonymous) > |
199 | 0); | 182 | 0); |
@@ -255,12 +238,13 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
255 | newData.snapshotID = packet.ParcelData.SnapshotID; | 238 | newData.snapshotID = packet.ParcelData.SnapshotID; |
256 | newData.userLocation = packet.ParcelData.UserLocation; | 239 | newData.userLocation = packet.ParcelData.UserLocation; |
257 | newData.userLookAt = packet.ParcelData.UserLookAt; | 240 | newData.userLookAt = packet.ParcelData.UserLookAt; |
258 | 241 | ||
259 | m_scene.LandChannel.updateLandObject(landData.localID, newData); | 242 | m_scene.LandChannel.updateLandObject(landData.localID, newData); |
260 | 243 | ||
261 | sendLandUpdateToAvatarsOverMe(); | 244 | sendLandUpdateToAvatarsOverMe(); |
262 | } | 245 | } |
263 | } | 246 | } |
247 | |||
264 | public void updateLandSold(LLUUID avatarID, LLUUID groupID, bool groupOwned, uint AuctionID, int claimprice, int area) | 248 | public void updateLandSold(LLUUID avatarID, LLUUID groupID, bool groupOwned, uint AuctionID, int claimprice, int area) |
265 | { | 249 | { |
266 | LandData newData = landData.Copy(); | 250 | LandData newData = landData.Copy(); |
@@ -272,7 +256,7 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
272 | newData.claimPrice = claimprice; | 256 | newData.claimPrice = claimprice; |
273 | newData.salePrice = 0; | 257 | newData.salePrice = 0; |
274 | newData.authBuyerID = LLUUID.Zero; | 258 | newData.authBuyerID = LLUUID.Zero; |
275 | newData.landFlags &= ~(uint)(Parcel.ParcelFlags.ForSale | Parcel.ParcelFlags.ForSaleObjects | Parcel.ParcelFlags.SellParcelObjects); | 259 | newData.landFlags &= ~(uint) (Parcel.ParcelFlags.ForSale | Parcel.ParcelFlags.ForSaleObjects | Parcel.ParcelFlags.SellParcelObjects); |
276 | m_scene.LandChannel.updateLandObject(landData.localID, newData); | 260 | m_scene.LandChannel.updateLandObject(landData.localID, newData); |
277 | 261 | ||
278 | sendLandUpdateToAvatarsOverMe(); | 262 | sendLandUpdateToAvatarsOverMe(); |
@@ -339,12 +323,13 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
339 | try | 323 | try |
340 | { | 324 | { |
341 | over = | 325 | over = |
342 | m_scene.LandChannel.getLandObject((int)Math.Max(255,Math.Min(0,Math.Round(avatars[i].AbsolutePosition.X))), | 326 | m_scene.LandChannel.getLandObject((int) Math.Max(255, Math.Min(0, Math.Round(avatars[i].AbsolutePosition.X))), |
343 | (int)Math.Max(255,Math.Min(0,Math.Round(avatars[i].AbsolutePosition.Y)))); | 327 | (int) Math.Max(255, Math.Min(0, Math.Round(avatars[i].AbsolutePosition.Y)))); |
344 | } | 328 | } |
345 | catch (Exception) | 329 | catch (Exception) |
346 | { | 330 | { |
347 | m_log.Warn("[LAND]: " + "unable to get land at x: " + Math.Round(avatars[i].AbsolutePosition.X) + " y: " + Math.Round(avatars[i].AbsolutePosition.Y)); | 331 | m_log.Warn("[LAND]: " + "unable to get land at x: " + Math.Round(avatars[i].AbsolutePosition.X) + " y: " + |
332 | Math.Round(avatars[i].AbsolutePosition.Y)); | ||
348 | } | 333 | } |
349 | 334 | ||
350 | if (over != null) | 335 | if (over != null) |
@@ -463,6 +448,25 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
463 | 448 | ||
464 | #region Update Functions | 449 | #region Update Functions |
465 | 450 | ||
451 | public void updateLandBitmapByteArray() | ||
452 | { | ||
453 | landData.landBitmapByteArray = convertLandBitmapToBytes(); | ||
454 | } | ||
455 | |||
456 | /// <summary> | ||
457 | /// Update all settings in land such as area, bitmap byte array, etc | ||
458 | /// </summary> | ||
459 | public void forceUpdateLandInfo() | ||
460 | { | ||
461 | updateAABBAndAreaValues(); | ||
462 | updateLandBitmapByteArray(); | ||
463 | } | ||
464 | |||
465 | public void setLandBitmapFromByteArray() | ||
466 | { | ||
467 | landBitmap = convertBytesToLandBitmap(); | ||
468 | } | ||
469 | |||
466 | /// <summary> | 470 | /// <summary> |
467 | /// Updates the AABBMin and AABBMax values after area/shape modification of the land object | 471 | /// Updates the AABBMin and AABBMax values after area/shape modification of the land object |
468 | /// </summary> | 472 | /// </summary> |
@@ -495,8 +499,8 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
495 | if (ty > 255) | 499 | if (ty > 255) |
496 | ty = 255; | 500 | ty = 255; |
497 | landData.AABBMin = | 501 | landData.AABBMin = |
498 | new LLVector3((float)(min_x * 4), (float)(min_y * 4), | 502 | new LLVector3((float) (min_x * 4), (float) (min_y * 4), |
499 | (float)m_scene.Heightmap[tx, ty]); | 503 | (float) m_scene.Heightmap[tx, ty]); |
500 | 504 | ||
501 | tx = max_x * 4; | 505 | tx = max_x * 4; |
502 | if (tx > 255) | 506 | if (tx > 255) |
@@ -505,30 +509,11 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
505 | if (ty > 255) | 509 | if (ty > 255) |
506 | ty = 255; | 510 | ty = 255; |
507 | landData.AABBMax = | 511 | landData.AABBMax = |
508 | new LLVector3((float)(max_x * 4), (float)(max_y * 4), | 512 | new LLVector3((float) (max_x * 4), (float) (max_y * 4), |
509 | (float)m_scene.Heightmap[tx, ty]); | 513 | (float) m_scene.Heightmap[tx, ty]); |
510 | landData.area = tempArea; | 514 | landData.area = tempArea; |
511 | } | 515 | } |
512 | 516 | ||
513 | public void updateLandBitmapByteArray() | ||
514 | { | ||
515 | landData.landBitmapByteArray = convertLandBitmapToBytes(); | ||
516 | } | ||
517 | |||
518 | /// <summary> | ||
519 | /// Update all settings in land such as area, bitmap byte array, etc | ||
520 | /// </summary> | ||
521 | public void forceUpdateLandInfo() | ||
522 | { | ||
523 | updateAABBAndAreaValues(); | ||
524 | updateLandBitmapByteArray(); | ||
525 | } | ||
526 | |||
527 | public void setLandBitmapFromByteArray() | ||
528 | { | ||
529 | landBitmap = convertBytesToLandBitmap(); | ||
530 | } | ||
531 | |||
532 | #endregion | 517 | #endregion |
533 | 518 | ||
534 | #region Land Bitmap Functions | 519 | #region Land Bitmap Functions |
@@ -562,63 +547,12 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
562 | } | 547 | } |
563 | 548 | ||
564 | /// <summary> | 549 | /// <summary> |
565 | /// Converts the land bitmap to a packet friendly byte array | ||
566 | /// </summary> | ||
567 | /// <returns></returns> | ||
568 | private byte[] convertLandBitmapToBytes() | ||
569 | { | ||
570 | byte[] tempConvertArr = new byte[512]; | ||
571 | byte tempByte = 0; | ||
572 | int x, y, i, byteNum = 0; | ||
573 | i = 0; | ||
574 | for (y = 0; y < 64; y++) | ||
575 | { | ||
576 | for (x = 0; x < 64; x++) | ||
577 | { | ||
578 | tempByte = Convert.ToByte(tempByte | Convert.ToByte(landBitmap[x, y]) << (i++%8)); | ||
579 | if (i%8 == 0) | ||
580 | { | ||
581 | tempConvertArr[byteNum] = tempByte; | ||
582 | tempByte = (byte) 0; | ||
583 | i = 0; | ||
584 | byteNum++; | ||
585 | } | ||
586 | } | ||
587 | } | ||
588 | return tempConvertArr; | ||
589 | } | ||
590 | |||
591 | private bool[,] convertBytesToLandBitmap() | ||
592 | { | ||
593 | bool[,] tempConvertMap = new bool[64,64]; | ||
594 | tempConvertMap.Initialize(); | ||
595 | byte tempByte = 0; | ||
596 | int x = 0, y = 0, i = 0, bitNum = 0; | ||
597 | for (i = 0; i < 512; i++) | ||
598 | { | ||
599 | tempByte = landData.landBitmapByteArray[i]; | ||
600 | for (bitNum = 0; bitNum < 8; bitNum++) | ||
601 | { | ||
602 | bool bit = Convert.ToBoolean(Convert.ToByte(tempByte >> bitNum) & (byte) 1); | ||
603 | tempConvertMap[x, y] = bit; | ||
604 | x++; | ||
605 | if (x > 63) | ||
606 | { | ||
607 | x = 0; | ||
608 | y++; | ||
609 | } | ||
610 | } | ||
611 | } | ||
612 | return tempConvertMap; | ||
613 | } | ||
614 | |||
615 | /// <summary> | ||
616 | /// Full sim land object creation | 550 | /// Full sim land object creation |
617 | /// </summary> | 551 | /// </summary> |
618 | /// <returns></returns> | 552 | /// <returns></returns> |
619 | public bool[,] basicFullRegionLandBitmap() | 553 | public bool[,] basicFullRegionLandBitmap() |
620 | { | 554 | { |
621 | return getSquareLandBitmap(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize); | 555 | return getSquareLandBitmap(0, 0, (int) Constants.RegionSize, (int) Constants.RegionSize); |
622 | } | 556 | } |
623 | 557 | ||
624 | /// <summary> | 558 | /// <summary> |
@@ -662,8 +596,8 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
662 | { | 596 | { |
663 | for (x = 0; x < 64; x++) | 597 | for (x = 0; x < 64; x++) |
664 | { | 598 | { |
665 | if (x >= start_x/4 && x < end_x/4 | 599 | if (x >= start_x / 4 && x < end_x / 4 |
666 | && y >= start_y/4 && y < end_y/4) | 600 | && y >= start_y / 4 && y < end_y / 4) |
667 | { | 601 | { |
668 | land_bitmap[x, y] = set_value; | 602 | land_bitmap[x, y] = set_value; |
669 | } | 603 | } |
@@ -705,6 +639,57 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
705 | return bitmap_base; | 639 | return bitmap_base; |
706 | } | 640 | } |
707 | 641 | ||
642 | /// <summary> | ||
643 | /// Converts the land bitmap to a packet friendly byte array | ||
644 | /// </summary> | ||
645 | /// <returns></returns> | ||
646 | private byte[] convertLandBitmapToBytes() | ||
647 | { | ||
648 | byte[] tempConvertArr = new byte[512]; | ||
649 | byte tempByte = 0; | ||
650 | int x, y, i, byteNum = 0; | ||
651 | i = 0; | ||
652 | for (y = 0; y < 64; y++) | ||
653 | { | ||
654 | for (x = 0; x < 64; x++) | ||
655 | { | ||
656 | tempByte = Convert.ToByte(tempByte | Convert.ToByte(landBitmap[x, y]) << (i++ % 8)); | ||
657 | if (i % 8 == 0) | ||
658 | { | ||
659 | tempConvertArr[byteNum] = tempByte; | ||
660 | tempByte = (byte) 0; | ||
661 | i = 0; | ||
662 | byteNum++; | ||
663 | } | ||
664 | } | ||
665 | } | ||
666 | return tempConvertArr; | ||
667 | } | ||
668 | |||
669 | private bool[,] convertBytesToLandBitmap() | ||
670 | { | ||
671 | bool[,] tempConvertMap = new bool[64,64]; | ||
672 | tempConvertMap.Initialize(); | ||
673 | byte tempByte = 0; | ||
674 | int x = 0, y = 0, i = 0, bitNum = 0; | ||
675 | for (i = 0; i < 512; i++) | ||
676 | { | ||
677 | tempByte = landData.landBitmapByteArray[i]; | ||
678 | for (bitNum = 0; bitNum < 8; bitNum++) | ||
679 | { | ||
680 | bool bit = Convert.ToBoolean(Convert.ToByte(tempByte >> bitNum) & (byte) 1); | ||
681 | tempConvertMap[x, y] = bit; | ||
682 | x++; | ||
683 | if (x > 63) | ||
684 | { | ||
685 | x = 0; | ||
686 | y++; | ||
687 | } | ||
688 | } | ||
689 | } | ||
690 | return tempConvertMap; | ||
691 | } | ||
692 | |||
708 | #endregion | 693 | #endregion |
709 | 694 | ||
710 | #region Object Select and Object Owner Listing | 695 | #region Object Select and Object Owner Listing |
@@ -781,7 +766,7 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
781 | public void sendLandObjectOwners(IClientAPI remote_client) | 766 | public void sendLandObjectOwners(IClientAPI remote_client) |
782 | { | 767 | { |
783 | Dictionary<LLUUID, int> primCount = new Dictionary<LLUUID, int>(); | 768 | Dictionary<LLUUID, int> primCount = new Dictionary<LLUUID, int>(); |
784 | ParcelObjectOwnersReplyPacket pack | 769 | ParcelObjectOwnersReplyPacket pack |
785 | = (ParcelObjectOwnersReplyPacket) PacketPool.Instance.GetPacket(PacketType.ParcelObjectOwnersReply); | 770 | = (ParcelObjectOwnersReplyPacket) PacketPool.Instance.GetPacket(PacketType.ParcelObjectOwnersReply); |
786 | // TODO: don't create new blocks if recycling an old packet | 771 | // TODO: don't create new blocks if recycling an old packet |
787 | 772 | ||
@@ -807,21 +792,21 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
807 | m_log.Error("[LAND]: Unable to match a prim with it's owner."); | 792 | m_log.Error("[LAND]: Unable to match a prim with it's owner."); |
808 | } | 793 | } |
809 | } | 794 | } |
810 | 795 | ||
811 | int notifyCount = primCount.Count; | 796 | int notifyCount = primCount.Count; |
812 | 797 | ||
813 | if (notifyCount > 0) | 798 | if (notifyCount > 0) |
814 | { | 799 | { |
815 | if (notifyCount > 32) | 800 | if (notifyCount > 32) |
816 | { | 801 | { |
817 | m_log.InfoFormat( | 802 | m_log.InfoFormat( |
818 | "[LAND]: More than {0} avatars own prims on this parcel. Only sending back details of first {0}" | 803 | "[LAND]: More than {0} avatars own prims on this parcel. Only sending back details of first {0}" |
819 | + " - a developer might want to investigate whether this is a hard limit", 32); | 804 | + " - a developer might want to investigate whether this is a hard limit", 32); |
820 | 805 | ||
821 | notifyCount = 32; | 806 | notifyCount = 32; |
822 | } | 807 | } |
823 | 808 | ||
824 | ParcelObjectOwnersReplyPacket.DataBlock[] dataBlock | 809 | ParcelObjectOwnersReplyPacket.DataBlock[] dataBlock |
825 | = new ParcelObjectOwnersReplyPacket.DataBlock[notifyCount]; | 810 | = new ParcelObjectOwnersReplyPacket.DataBlock[notifyCount]; |
826 | 811 | ||
827 | int num = 0; | 812 | int num = 0; |
@@ -834,16 +819,16 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
834 | dataBlock[num].OwnerID = owner; | 819 | dataBlock[num].OwnerID = owner; |
835 | 820 | ||
836 | num++; | 821 | num++; |
837 | 822 | ||
838 | if (num >= notifyCount) | 823 | if (num >= notifyCount) |
839 | { | 824 | { |
840 | break; | 825 | break; |
841 | } | 826 | } |
842 | } | 827 | } |
843 | 828 | ||
844 | pack.Data = dataBlock; | 829 | pack.Data = dataBlock; |
845 | } | 830 | } |
846 | 831 | ||
847 | remote_client.OutPacket(pack, ThrottleOutPacketType.Task); | 832 | remote_client.OutPacket(pack, ThrottleOutPacketType.Task); |
848 | } | 833 | } |
849 | 834 | ||
@@ -937,7 +922,7 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
937 | #endregion | 922 | #endregion |
938 | 923 | ||
939 | #endregion | 924 | #endregion |
940 | |||
941 | 925 | ||
926 | #endregion | ||
942 | } | 927 | } |
943 | } \ No newline at end of file | 928 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Environment/Modules/World/Serialiser/SerialiseObjects.cs b/OpenSim/Region/Environment/Modules/World/Serialiser/SerialiseObjects.cs index c14ae57..ef90fd4 100644 --- a/OpenSim/Region/Environment/Modules/World/Serialiser/SerialiseObjects.cs +++ b/OpenSim/Region/Environment/Modules/World/Serialiser/SerialiseObjects.cs | |||
@@ -110,6 +110,7 @@ namespace OpenSim.Region.Environment.Modules.ExportSerialiser | |||
110 | private static void CreateCompressedXmlFile(MemoryStream xmlStream, string fileName) | 110 | private static void CreateCompressedXmlFile(MemoryStream xmlStream, string fileName) |
111 | { | 111 | { |
112 | #region GZip Compressed Version | 112 | #region GZip Compressed Version |
113 | |||
113 | FileStream objectsFileCompressed = new FileStream(fileName + ".gzs", FileMode.Create); | 114 | FileStream objectsFileCompressed = new FileStream(fileName + ".gzs", FileMode.Create); |
114 | MemoryStream gzipMSStream = new MemoryStream(); | 115 | MemoryStream gzipMSStream = new MemoryStream(); |
115 | GZipStream gzipStream = new GZipStream(gzipMSStream, CompressionMode.Compress); | 116 | GZipStream gzipStream = new GZipStream(gzipMSStream, CompressionMode.Compress); |
@@ -117,6 +118,7 @@ namespace OpenSim.Region.Environment.Modules.ExportSerialiser | |||
117 | gzipMSStream.WriteTo(objectsFileCompressed); | 118 | gzipMSStream.WriteTo(objectsFileCompressed); |
118 | objectsFileCompressed.Flush(); | 119 | objectsFileCompressed.Flush(); |
119 | objectsFileCompressed.Close(); | 120 | objectsFileCompressed.Close(); |
121 | |||
120 | #endregion | 122 | #endregion |
121 | } | 123 | } |
122 | } | 124 | } |
diff --git a/OpenSim/Region/Environment/Modules/World/Sun/SunModule.cs b/OpenSim/Region/Environment/Modules/World/Sun/SunModule.cs index a465a60..a12118e 100644 --- a/OpenSim/Region/Environment/Modules/World/Sun/SunModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Sun/SunModule.cs | |||
@@ -39,15 +39,17 @@ namespace OpenSim.Region.Environment.Modules | |||
39 | { | 39 | { |
40 | //private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | 40 | //private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); |
41 | 41 | ||
42 | private const double m_real_day = 24.0; | ||
43 | private const int m_default_frame = 100; | 42 | private const int m_default_frame = 100; |
44 | private int m_frame_mod; | 43 | private const double m_real_day = 24.0; |
45 | private double m_day_length; | 44 | private double m_day_length; |
46 | private int m_dilation; | 45 | private int m_dilation; |
47 | private int m_frame; | 46 | private int m_frame; |
48 | private long m_start; | 47 | private int m_frame_mod; |
49 | 48 | ||
50 | private Scene m_scene; | 49 | private Scene m_scene; |
50 | private long m_start; | ||
51 | |||
52 | #region IRegionModule Members | ||
51 | 53 | ||
52 | public void Initialise(Scene scene, IConfigSource config) | 54 | public void Initialise(Scene scene, IConfigSource config) |
53 | { | 55 | { |
@@ -66,7 +68,7 @@ namespace OpenSim.Region.Environment.Modules | |||
66 | m_frame_mod = m_default_frame; | 68 | m_frame_mod = m_default_frame; |
67 | } | 69 | } |
68 | 70 | ||
69 | m_dilation = (int) (m_real_day/m_day_length); | 71 | m_dilation = (int) (m_real_day / m_day_length); |
70 | m_scene = scene; | 72 | m_scene = scene; |
71 | scene.EventManager.OnFrame += SunUpdate; | 73 | scene.EventManager.OnFrame += SunUpdate; |
72 | scene.EventManager.OnNewClient += SunToClient; | 74 | scene.EventManager.OnNewClient += SunToClient; |
@@ -90,6 +92,8 @@ namespace OpenSim.Region.Environment.Modules | |||
90 | get { return false; } | 92 | get { return false; } |
91 | } | 93 | } |
92 | 94 | ||
95 | #endregion | ||
96 | |||
93 | public void SunToClient(IClientAPI client) | 97 | public void SunToClient(IClientAPI client) |
94 | { | 98 | { |
95 | client.SendSunPos(SunPos(HourOfTheDay()), new LLVector3(0, 0.0f, 10.0f)); | 99 | client.SendSunPos(SunPos(HourOfTheDay()), new LLVector3(0, 0.0f, 10.0f)); |
@@ -121,15 +125,15 @@ namespace OpenSim.Region.Environment.Modules | |||
121 | // ticks don't get out of hand | 125 | // ticks don't get out of hand |
122 | private double HourOfTheDay() | 126 | private double HourOfTheDay() |
123 | { | 127 | { |
124 | long m_addticks = (DateTime.Now.Ticks - m_start)*m_dilation; | 128 | long m_addticks = (DateTime.Now.Ticks - m_start) * m_dilation; |
125 | DateTime dt = new DateTime(m_start + m_addticks); | 129 | DateTime dt = new DateTime(m_start + m_addticks); |
126 | return (double) dt.Hour + ((double) dt.Minute/60.0); | 130 | return (double) dt.Hour + ((double) dt.Minute / 60.0); |
127 | } | 131 | } |
128 | 132 | ||
129 | private LLVector3 SunPos(double hour) | 133 | private LLVector3 SunPos(double hour) |
130 | { | 134 | { |
131 | // now we have our radian position | 135 | // now we have our radian position |
132 | double rad = (hour/m_real_day)*2*Math.PI - (Math.PI/2.0); | 136 | double rad = (hour / m_real_day) * 2 * Math.PI - (Math.PI / 2.0); |
133 | double z = Math.Sin(rad); | 137 | double z = Math.Sin(rad); |
134 | double x = Math.Cos(rad); | 138 | double x = Math.Cos(rad); |
135 | return new LLVector3((float) x, 0f, (float) z); | 139 | return new LLVector3((float) x, 0f, (float) z); |
@@ -192,4 +196,4 @@ namespace OpenSim.Region.Environment.Modules | |||
192 | // // OutPacket(viewertime); | 196 | // // OutPacket(viewertime); |
193 | // } | 197 | // } |
194 | } | 198 | } |
195 | } | 199 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Environment/Modules/World/Terrain/FileLoaders/GIF.cs b/OpenSim/Region/Environment/Modules/World/Terrain/FileLoaders/GIF.cs index 1dd923a..9c2fedc 100644 --- a/OpenSim/Region/Environment/Modules/World/Terrain/FileLoaders/GIF.cs +++ b/OpenSim/Region/Environment/Modules/World/Terrain/FileLoaders/GIF.cs | |||
@@ -27,7 +27,6 @@ | |||
27 | using System.Drawing; | 27 | using System.Drawing; |
28 | using System.Drawing.Imaging; | 28 | using System.Drawing.Imaging; |
29 | using OpenSim.Region.Environment.Interfaces; | 29 | using OpenSim.Region.Environment.Interfaces; |
30 | using OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders; | ||
31 | 30 | ||
32 | namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders | 31 | namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders |
33 | { | 32 | { |
diff --git a/OpenSim/Region/Environment/Modules/World/Terrain/FileLoaders/PNG.cs b/OpenSim/Region/Environment/Modules/World/Terrain/FileLoaders/PNG.cs index 07072be..2925c7d 100644 --- a/OpenSim/Region/Environment/Modules/World/Terrain/FileLoaders/PNG.cs +++ b/OpenSim/Region/Environment/Modules/World/Terrain/FileLoaders/PNG.cs | |||
@@ -27,7 +27,6 @@ | |||
27 | using System.Drawing; | 27 | using System.Drawing; |
28 | using System.Drawing.Imaging; | 28 | using System.Drawing.Imaging; |
29 | using OpenSim.Region.Environment.Interfaces; | 29 | using OpenSim.Region.Environment.Interfaces; |
30 | using OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders; | ||
31 | 30 | ||
32 | namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders | 31 | namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders |
33 | { | 32 | { |
diff --git a/OpenSim/Region/Environment/Modules/World/Terrain/FileLoaders/TIFF.cs b/OpenSim/Region/Environment/Modules/World/Terrain/FileLoaders/TIFF.cs index d206763..3a137ae 100644 --- a/OpenSim/Region/Environment/Modules/World/Terrain/FileLoaders/TIFF.cs +++ b/OpenSim/Region/Environment/Modules/World/Terrain/FileLoaders/TIFF.cs | |||
@@ -27,7 +27,6 @@ | |||
27 | using System.Drawing; | 27 | using System.Drawing; |
28 | using System.Drawing.Imaging; | 28 | using System.Drawing.Imaging; |
29 | using OpenSim.Region.Environment.Interfaces; | 29 | using OpenSim.Region.Environment.Interfaces; |
30 | using OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders; | ||
31 | 30 | ||
32 | namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders | 31 | namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders |
33 | { | 32 | { |
diff --git a/OpenSim/Region/Environment/Modules/World/Terrain/TerrainModule.cs b/OpenSim/Region/Environment/Modules/World/Terrain/TerrainModule.cs index cf85aa4..09c3117 100644 --- a/OpenSim/Region/Environment/Modules/World/Terrain/TerrainModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Terrain/TerrainModule.cs | |||
@@ -35,7 +35,6 @@ using Nini.Config; | |||
35 | using OpenSim.Framework; | 35 | using OpenSim.Framework; |
36 | using OpenSim.Region.Environment.Interfaces; | 36 | using OpenSim.Region.Environment.Interfaces; |
37 | using OpenSim.Region.Environment.Modules.Framework; | 37 | using OpenSim.Region.Environment.Modules.Framework; |
38 | using OpenSim.Region.Environment.Modules.World.Terrain; | ||
39 | using OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders; | 38 | using OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders; |
40 | using OpenSim.Region.Environment.Modules.World.Terrain.FloodBrushes; | 39 | using OpenSim.Region.Environment.Modules.World.Terrain.FloodBrushes; |
41 | using OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes; | 40 | using OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes; |
@@ -79,9 +78,8 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain | |||
79 | private readonly Dictionary<StandardTerrainEffects, ITerrainPaintableEffect> m_painteffects = | 78 | private readonly Dictionary<StandardTerrainEffects, ITerrainPaintableEffect> m_painteffects = |
80 | new Dictionary<StandardTerrainEffects, ITerrainPaintableEffect>(); | 79 | new Dictionary<StandardTerrainEffects, ITerrainPaintableEffect>(); |
81 | 80 | ||
82 | private Dictionary<Location, ITerrainChannel> m_channels; | ||
83 | |||
84 | private ITerrainChannel m_channel; | 81 | private ITerrainChannel m_channel; |
82 | private Dictionary<Location, ITerrainChannel> m_channels; | ||
85 | private Dictionary<string, ITerrainEffect> m_plugineffects; | 83 | private Dictionary<string, ITerrainEffect> m_plugineffects; |
86 | private ITerrainChannel m_revert; | 84 | private ITerrainChannel m_revert; |
87 | private Scene m_scene; | 85 | private Scene m_scene; |
@@ -252,7 +250,8 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain | |||
252 | { | 250 | { |
253 | m_plugineffects.Add(pluginType.Name, terEffect); | 251 | m_plugineffects.Add(pluginType.Name, terEffect); |
254 | m_log.Info("E ... " + pluginType.Name); | 252 | m_log.Info("E ... " + pluginType.Name); |
255 | } else | 253 | } |
254 | else | ||
256 | { | 255 | { |
257 | m_log.Warn("E ... " + pluginType.Name + " (Already added)"); | 256 | m_log.Warn("E ... " + pluginType.Name + " (Already added)"); |
258 | } | 257 | } |
diff --git a/OpenSim/Region/Environment/Modules/World/TreePopulator/TreePopulatorModule.cs b/OpenSim/Region/Environment/Modules/World/TreePopulator/TreePopulatorModule.cs index ce93060..f144444 100644 --- a/OpenSim/Region/Environment/Modules/World/TreePopulator/TreePopulatorModule.cs +++ b/OpenSim/Region/Environment/Modules/World/TreePopulator/TreePopulatorModule.cs | |||
@@ -44,13 +44,14 @@ namespace OpenSim.Region.Environment.Modules | |||
44 | /// </summary> | 44 | /// </summary> |
45 | public class TreePopulatorModule : IRegionModule | 45 | public class TreePopulatorModule : IRegionModule |
46 | { | 46 | { |
47 | private Scene m_scene; | ||
48 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
49 | 48 | private Scene m_scene; | |
50 | private List<LLUUID> m_trees; | ||
51 | 49 | ||
52 | public double m_tree_density = 50.0; // Aim for this many per region | 50 | public double m_tree_density = 50.0; // Aim for this many per region |
53 | public double m_tree_updates = 1000.0; // MS between updates | 51 | public double m_tree_updates = 1000.0; // MS between updates |
52 | private List<LLUUID> m_trees; | ||
53 | |||
54 | #region IRegionModule Members | ||
54 | 55 | ||
55 | public void Initialise(Scene scene, IConfigSource config) | 56 | public void Initialise(Scene scene, IConfigSource config) |
56 | { | 57 | { |
@@ -59,7 +60,8 @@ namespace OpenSim.Region.Environment.Modules | |||
59 | m_tree_density = config.Configs["Trees"].GetDouble("tree_density", m_tree_density); | 60 | m_tree_density = config.Configs["Trees"].GetDouble("tree_density", m_tree_density); |
60 | } | 61 | } |
61 | catch (Exception) | 62 | catch (Exception) |
62 | { } | 63 | { |
64 | } | ||
63 | 65 | ||
64 | m_trees = new List<LLUUID>(); | 66 | m_trees = new List<LLUUID>(); |
65 | m_scene = scene; | 67 | m_scene = scene; |
@@ -72,7 +74,27 @@ namespace OpenSim.Region.Environment.Modules | |||
72 | m_log.Debug("[TREES]: Initialised tree module"); | 74 | m_log.Debug("[TREES]: Initialised tree module"); |
73 | } | 75 | } |
74 | 76 | ||
75 | void EventManager_OnPluginConsole(string[] args) | 77 | public void PostInitialise() |
78 | { | ||
79 | } | ||
80 | |||
81 | public void Close() | ||
82 | { | ||
83 | } | ||
84 | |||
85 | public string Name | ||
86 | { | ||
87 | get { return "TreePopulatorModule"; } | ||
88 | } | ||
89 | |||
90 | public bool IsSharedModule | ||
91 | { | ||
92 | get { return false; } | ||
93 | } | ||
94 | |||
95 | #endregion | ||
96 | |||
97 | private void EventManager_OnPluginConsole(string[] args) | ||
76 | { | 98 | { |
77 | if (args[0] == "tree") | 99 | if (args[0] == "tree") |
78 | { | 100 | { |
@@ -81,13 +103,13 @@ namespace OpenSim.Region.Environment.Modules | |||
81 | } | 103 | } |
82 | } | 104 | } |
83 | 105 | ||
84 | void growTrees() | 106 | private void growTrees() |
85 | { | 107 | { |
86 | foreach (LLUUID tree in m_trees) | 108 | foreach (LLUUID tree in m_trees) |
87 | { | 109 | { |
88 | if (m_scene.Entities.ContainsKey(tree)) | 110 | if (m_scene.Entities.ContainsKey(tree)) |
89 | { | 111 | { |
90 | SceneObjectPart s_tree = ((SceneObjectGroup)m_scene.Entities[tree]).RootPart; | 112 | SceneObjectPart s_tree = ((SceneObjectGroup) m_scene.Entities[tree]).RootPart; |
91 | 113 | ||
92 | // 100 seconds to grow 1m | 114 | // 100 seconds to grow 1m |
93 | s_tree.Scale += new LLVector3(0.1f, 0.1f, 0.1f); | 115 | s_tree.Scale += new LLVector3(0.1f, 0.1f, 0.1f); |
@@ -101,13 +123,13 @@ namespace OpenSim.Region.Environment.Modules | |||
101 | } | 123 | } |
102 | } | 124 | } |
103 | 125 | ||
104 | void seedTrees() | 126 | private void seedTrees() |
105 | { | 127 | { |
106 | foreach (LLUUID tree in m_trees) | 128 | foreach (LLUUID tree in m_trees) |
107 | { | 129 | { |
108 | if (m_scene.Entities.ContainsKey(tree)) | 130 | if (m_scene.Entities.ContainsKey(tree)) |
109 | { | 131 | { |
110 | SceneObjectPart s_tree = ((SceneObjectGroup)m_scene.Entities[tree]).RootPart; | 132 | SceneObjectPart s_tree = ((SceneObjectGroup) m_scene.Entities[tree]).RootPart; |
111 | 133 | ||
112 | if (s_tree.Scale.X > 0.5) | 134 | if (s_tree.Scale.X > 0.5) |
113 | { | 135 | { |
@@ -116,7 +138,6 @@ namespace OpenSim.Region.Environment.Modules | |||
116 | SpawnChild(s_tree); | 138 | SpawnChild(s_tree); |
117 | } | 139 | } |
118 | } | 140 | } |
119 | |||
120 | } | 141 | } |
121 | else | 142 | else |
122 | { | 143 | { |
@@ -125,7 +146,7 @@ namespace OpenSim.Region.Environment.Modules | |||
125 | } | 146 | } |
126 | } | 147 | } |
127 | 148 | ||
128 | void killTrees() | 149 | private void killTrees() |
129 | { | 150 | { |
130 | foreach (LLUUID tree in m_trees) | 151 | foreach (LLUUID tree in m_trees) |
131 | { | 152 | { |
@@ -133,7 +154,7 @@ namespace OpenSim.Region.Environment.Modules | |||
133 | 154 | ||
134 | if (m_scene.Entities.ContainsKey(tree)) | 155 | if (m_scene.Entities.ContainsKey(tree)) |
135 | { | 156 | { |
136 | SceneObjectPart selectedTree = ((SceneObjectGroup)m_scene.Entities[tree]).RootPart; | 157 | SceneObjectPart selectedTree = ((SceneObjectGroup) m_scene.Entities[tree]).RootPart; |
137 | double selectedTreeScale = Math.Sqrt(Math.Pow(selectedTree.Scale.X, 2) + | 158 | double selectedTreeScale = Math.Sqrt(Math.Pow(selectedTree.Scale.X, 2) + |
138 | Math.Pow(selectedTree.Scale.Y, 2) + | 159 | Math.Pow(selectedTree.Scale.Y, 2) + |
139 | Math.Pow(selectedTree.Scale.Z, 2)); | 160 | Math.Pow(selectedTree.Scale.Z, 2)); |
@@ -142,7 +163,7 @@ namespace OpenSim.Region.Environment.Modules | |||
142 | { | 163 | { |
143 | if (picktree != tree) | 164 | if (picktree != tree) |
144 | { | 165 | { |
145 | SceneObjectPart pickedTree = ((SceneObjectGroup)m_scene.Entities[picktree]).RootPart; | 166 | SceneObjectPart pickedTree = ((SceneObjectGroup) m_scene.Entities[picktree]).RootPart; |
146 | 167 | ||
147 | double pickedTreeScale = Math.Sqrt(Math.Pow(pickedTree.Scale.X, 2) + | 168 | double pickedTreeScale = Math.Sqrt(Math.Pow(pickedTree.Scale.X, 2) + |
148 | Math.Pow(pickedTree.Scale.Y, 2) + | 169 | Math.Pow(pickedTree.Scale.Y, 2) + |
@@ -162,10 +183,10 @@ namespace OpenSim.Region.Environment.Modules | |||
162 | m_trees.Remove(selectedTree.ParentGroup.UUID); | 183 | m_trees.Remove(selectedTree.ParentGroup.UUID); |
163 | 184 | ||
164 | m_scene.ForEachClient(delegate(IClientAPI controller) | 185 | m_scene.ForEachClient(delegate(IClientAPI controller) |
165 | { | 186 | { |
166 | controller.SendKillObject(m_scene.RegionInfo.RegionHandle, | 187 | controller.SendKillObject(m_scene.RegionInfo.RegionHandle, |
167 | selectedTree.LocalId); | 188 | selectedTree.LocalId); |
168 | }); | 189 | }); |
169 | 190 | ||
170 | break; | 191 | break; |
171 | } | 192 | } |
@@ -199,15 +220,15 @@ namespace OpenSim.Region.Environment.Modules | |||
199 | double randX = ((Util.RandomClass.NextDouble() * 2.0) - 1.0) * (s_tree.Scale.X * 3); | 220 | double randX = ((Util.RandomClass.NextDouble() * 2.0) - 1.0) * (s_tree.Scale.X * 3); |
200 | double randY = ((Util.RandomClass.NextDouble() * 2.0) - 1.0) * (s_tree.Scale.X * 3); | 221 | double randY = ((Util.RandomClass.NextDouble() * 2.0) - 1.0) * (s_tree.Scale.X * 3); |
201 | 222 | ||
202 | position.X += (float)randX; | 223 | position.X += (float) randX; |
203 | position.Y += (float)randY; | 224 | position.Y += (float) randY; |
204 | 225 | ||
205 | CreateTree(position); | 226 | CreateTree(position); |
206 | } | 227 | } |
207 | 228 | ||
208 | private void CreateTree(LLVector3 position) | 229 | private void CreateTree(LLVector3 position) |
209 | { | 230 | { |
210 | position.Z = (float)m_scene.Heightmap[(int)position.X, (int)position.Y]; | 231 | position.Z = (float) m_scene.Heightmap[(int) position.X, (int) position.Y]; |
211 | 232 | ||
212 | SceneObjectGroup tree = | 233 | SceneObjectGroup tree = |
213 | m_scene.AddTree(new LLVector3(0.1f, 0.1f, 0.1f), | 234 | m_scene.AddTree(new LLVector3(0.1f, 0.1f, 0.1f), |
@@ -220,29 +241,11 @@ namespace OpenSim.Region.Environment.Modules | |||
220 | tree.SendGroupFullUpdate(); | 241 | tree.SendGroupFullUpdate(); |
221 | } | 242 | } |
222 | 243 | ||
223 | void CalculateTrees_Elapsed(object sender, ElapsedEventArgs e) | 244 | private void CalculateTrees_Elapsed(object sender, ElapsedEventArgs e) |
224 | { | 245 | { |
225 | growTrees(); | 246 | growTrees(); |
226 | seedTrees(); | 247 | seedTrees(); |
227 | killTrees(); | 248 | killTrees(); |
228 | } | 249 | } |
229 | |||
230 | public void PostInitialise() | ||
231 | { | ||
232 | } | ||
233 | |||
234 | public void Close() | ||
235 | { | ||
236 | } | ||
237 | |||
238 | public string Name | ||
239 | { | ||
240 | get { return "TreePopulatorModule"; } | ||
241 | } | ||
242 | |||
243 | public bool IsSharedModule | ||
244 | { | ||
245 | get { return false; } | ||
246 | } | ||
247 | } | 250 | } |
248 | } | 251 | } \ No newline at end of file |