diff options
Diffstat (limited to 'OpenSim')
19 files changed, 441 insertions, 86 deletions
diff --git a/OpenSim/Framework/Console/ConsoleUtil.cs b/OpenSim/Framework/Console/ConsoleUtil.cs new file mode 100644 index 0000000..2612a50 --- /dev/null +++ b/OpenSim/Framework/Console/ConsoleUtil.cs | |||
@@ -0,0 +1,114 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Linq; | ||
31 | using System.Reflection; | ||
32 | using log4net; | ||
33 | using OpenMetaverse; | ||
34 | |||
35 | public class ConsoleUtil | ||
36 | { | ||
37 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
38 | |||
39 | public const string MinRawConsoleVectorValue = "-~"; | ||
40 | public const string MaxRawConsoleVectorValue = "~"; | ||
41 | |||
42 | public const string VectorSeparator = ","; | ||
43 | public static char[] VectorSeparatorChars = VectorSeparator.ToCharArray(); | ||
44 | |||
45 | /// <summary> | ||
46 | /// Convert a minimum vector input from the console to an OpenMetaverse.Vector3 | ||
47 | /// </summary> | ||
48 | /// <param name='rawConsoleVector'>/param> | ||
49 | /// <param name='vector'></param> | ||
50 | /// <returns></returns> | ||
51 | public static bool TryParseConsoleMinVector(string rawConsoleVector, out Vector3 vector) | ||
52 | { | ||
53 | return TryParseConsoleVector(rawConsoleVector, c => float.MinValue.ToString(), out vector); | ||
54 | } | ||
55 | |||
56 | /// <summary> | ||
57 | /// Convert a maximum vector input from the console to an OpenMetaverse.Vector3 | ||
58 | /// </summary> | ||
59 | /// <param name='rawConsoleVector'>/param> | ||
60 | /// <param name='vector'></param> | ||
61 | /// <returns></returns> | ||
62 | public static bool TryParseConsoleMaxVector(string rawConsoleVector, out Vector3 vector) | ||
63 | { | ||
64 | return TryParseConsoleVector(rawConsoleVector, c => float.MaxValue.ToString(), out vector); | ||
65 | } | ||
66 | |||
67 | /// <summary> | ||
68 | /// Convert a vector input from the console to an OpenMetaverse.Vector3 | ||
69 | /// </summary> | ||
70 | /// <param name='rawConsoleVector'> | ||
71 | /// A string in the form <x>,<y>,<z> where there is no space between values. | ||
72 | /// Any component can be missing (e.g. ,,40). blankComponentFunc is invoked to replace the blank with a suitable value | ||
73 | /// Also, if the blank component is at the end, then the comma can be missed off entirely (e.g. 40,30 or 40) | ||
74 | /// The strings "~" and "-~" are valid in components. The first substitutes float.MaxValue whilst the second is float.MinValue | ||
75 | /// Other than that, component values must be numeric. | ||
76 | /// </param> | ||
77 | /// <param name='blankComponentFunc'></param> | ||
78 | /// <param name='vector'></param> | ||
79 | /// <returns></returns> | ||
80 | public static bool TryParseConsoleVector( | ||
81 | string rawConsoleVector, Func<string, string> blankComponentFunc, out Vector3 vector) | ||
82 | { | ||
83 | List<string> components = rawConsoleVector.Split(VectorSeparatorChars).ToList(); | ||
84 | |||
85 | if (components.Count < 1 || components.Count > 3) | ||
86 | { | ||
87 | vector = Vector3.Zero; | ||
88 | return false; | ||
89 | } | ||
90 | |||
91 | for (int i = components.Count; i < 3; i++) | ||
92 | components.Add(""); | ||
93 | |||
94 | List<string> semiDigestedComponents | ||
95 | = components.ConvertAll<string>( | ||
96 | c => | ||
97 | { | ||
98 | if (c == "") | ||
99 | return blankComponentFunc.Invoke(c); | ||
100 | else if (c == MaxRawConsoleVectorValue) | ||
101 | return float.MaxValue.ToString(); | ||
102 | else if (c == MinRawConsoleVectorValue) | ||
103 | return float.MinValue.ToString(); | ||
104 | else | ||
105 | return c; | ||
106 | }); | ||
107 | |||
108 | string semiDigestedConsoleVector = string.Join(VectorSeparator, semiDigestedComponents.ToArray()); | ||
109 | |||
110 | m_log.DebugFormat("[CONSOLE UTIL]: Parsing {0} into OpenMetaverse.Vector3", semiDigestedConsoleVector); | ||
111 | |||
112 | return Vector3.TryParse(semiDigestedConsoleVector, out vector); | ||
113 | } | ||
114 | } \ No newline at end of file | ||
diff --git a/OpenSim/Framework/GridInstantMessage.cs b/OpenSim/Framework/GridInstantMessage.cs index a6bf6e3..6ae0488 100644 --- a/OpenSim/Framework/GridInstantMessage.cs +++ b/OpenSim/Framework/GridInstantMessage.cs | |||
@@ -44,7 +44,6 @@ namespace OpenSim.Framework | |||
44 | public Vector3 Position; | 44 | public Vector3 Position; |
45 | public byte[] binaryBucket; | 45 | public byte[] binaryBucket; |
46 | 46 | ||
47 | |||
48 | public uint ParentEstateID; | 47 | public uint ParentEstateID; |
49 | public Guid RegionID; | 48 | public Guid RegionID; |
50 | public uint timestamp; | 49 | public uint timestamp; |
@@ -58,7 +57,7 @@ namespace OpenSim.Framework | |||
58 | string _fromAgentName, UUID _toAgentID, | 57 | string _fromAgentName, UUID _toAgentID, |
59 | byte _dialog, bool _fromGroup, string _message, | 58 | byte _dialog, bool _fromGroup, string _message, |
60 | UUID _imSessionID, bool _offline, Vector3 _position, | 59 | UUID _imSessionID, bool _offline, Vector3 _position, |
61 | byte[] _binaryBucket) | 60 | byte[] _binaryBucket, bool addTimestamp) |
62 | { | 61 | { |
63 | fromAgentID = _fromAgentID.Guid; | 62 | fromAgentID = _fromAgentID.Guid; |
64 | fromAgentName = _fromAgentName; | 63 | fromAgentName = _fromAgentName; |
@@ -79,7 +78,9 @@ namespace OpenSim.Framework | |||
79 | ParentEstateID = scene.RegionInfo.EstateSettings.ParentEstateID; | 78 | ParentEstateID = scene.RegionInfo.EstateSettings.ParentEstateID; |
80 | RegionID = scene.RegionInfo.RegionSettings.RegionUUID.Guid; | 79 | RegionID = scene.RegionInfo.RegionSettings.RegionUUID.Guid; |
81 | } | 80 | } |
82 | timestamp = (uint)Util.UnixTimeSinceEpoch(); | 81 | |
82 | if (addTimestamp) | ||
83 | timestamp = (uint)Util.UnixTimeSinceEpoch(); | ||
83 | } | 84 | } |
84 | 85 | ||
85 | public GridInstantMessage(IScene scene, UUID _fromAgentID, | 86 | public GridInstantMessage(IScene scene, UUID _fromAgentID, |
@@ -87,7 +88,7 @@ namespace OpenSim.Framework | |||
87 | string _message, bool _offline, | 88 | string _message, bool _offline, |
88 | Vector3 _position) : this(scene, _fromAgentID, _fromAgentName, | 89 | Vector3 _position) : this(scene, _fromAgentID, _fromAgentName, |
89 | _toAgentID, _dialog, false, _message, | 90 | _toAgentID, _dialog, false, _message, |
90 | _fromAgentID ^ _toAgentID, _offline, _position, new byte[0]) | 91 | _fromAgentID ^ _toAgentID, _offline, _position, new byte[0], true) |
91 | { | 92 | { |
92 | } | 93 | } |
93 | } | 94 | } |
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index a26e930..74551ea 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs | |||
@@ -546,6 +546,19 @@ namespace OpenSim.Framework | |||
546 | } | 546 | } |
547 | 547 | ||
548 | /// <summary> | 548 | /// <summary> |
549 | /// Determines whether a point is inside a bounding box. | ||
550 | /// </summary> | ||
551 | /// <param name='v'>/param> | ||
552 | /// <param name='min'></param> | ||
553 | /// <param name='max'></param> | ||
554 | /// <returns></returns> | ||
555 | public static bool IsInsideBox(Vector3 v, Vector3 min, Vector3 max) | ||
556 | { | ||
557 | return v.X >= min.X & v.Y >= min.Y && v.Z >= min.Z | ||
558 | && v.X <= max.X && v.Y <= max.Y && v.Z <= max.Z; | ||
559 | } | ||
560 | |||
561 | /// <summary> | ||
549 | /// Are the co-ordinates of the new region visible from the old region? | 562 | /// Are the co-ordinates of the new region visible from the old region? |
550 | /// </summary> | 563 | /// </summary> |
551 | /// <param name="oldx">Old region x-coord</param> | 564 | /// <param name="oldx">Old region x-coord</param> |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 6f00957..6ccabf1 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | |||
@@ -5962,7 +5962,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5962 | msgpack.MessageBlock.ID, | 5962 | msgpack.MessageBlock.ID, |
5963 | msgpack.MessageBlock.Offline != 0 ? true : false, | 5963 | msgpack.MessageBlock.Offline != 0 ? true : false, |
5964 | msgpack.MessageBlock.Position, | 5964 | msgpack.MessageBlock.Position, |
5965 | msgpack.MessageBlock.BinaryBucket); | 5965 | msgpack.MessageBlock.BinaryBucket, |
5966 | true); | ||
5966 | 5967 | ||
5967 | handlerInstantMessage(this, im); | 5968 | handlerInstantMessage(this, im); |
5968 | } | 5969 | } |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index 60ab70e..b3db064 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | |||
@@ -227,6 +227,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
227 | m_pausedAckTimeout = 1000 * 300; // 5 minutes | 227 | m_pausedAckTimeout = 1000 * 300; // 5 minutes |
228 | } | 228 | } |
229 | 229 | ||
230 | // FIXME: This actually only needs to be done once since the PacketPool is shared across all servers. | ||
231 | // However, there is no harm in temporarily doing it multiple times. | ||
232 | IConfig packetConfig = configSource.Configs["PacketPool"]; | ||
233 | if (packetConfig != null) | ||
234 | { | ||
235 | PacketPool.Instance.RecyclePackets = packetConfig.GetBoolean("RecyclePackets", true); | ||
236 | PacketPool.Instance.RecycleDataBlocks = packetConfig.GetBoolean("RecycleDataBlocks", true); | ||
237 | } | ||
238 | |||
230 | #region BinaryStats | 239 | #region BinaryStats |
231 | config = configSource.Configs["Statistics.Binary"]; | 240 | config = configSource.Configs["Statistics.Binary"]; |
232 | m_shouldCollectStats = false; | 241 | m_shouldCollectStats = false; |
diff --git a/OpenSim/Framework/PacketPool.cs b/OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs index 41d17c5..fc9406b 100644 --- a/OpenSim/Framework/PacketPool.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs | |||
@@ -32,9 +32,8 @@ using OpenMetaverse; | |||
32 | using OpenMetaverse.Packets; | 32 | using OpenMetaverse.Packets; |
33 | using log4net; | 33 | using log4net; |
34 | 34 | ||
35 | namespace OpenSim.Framework | 35 | namespace OpenSim.Region.ClientStack.LindenUDP |
36 | { | 36 | { |
37 | |||
38 | public sealed class PacketPool | 37 | public sealed class PacketPool |
39 | { | 38 | { |
40 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 39 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
@@ -44,6 +43,9 @@ namespace OpenSim.Framework | |||
44 | private bool packetPoolEnabled = true; | 43 | private bool packetPoolEnabled = true; |
45 | private bool dataBlockPoolEnabled = true; | 44 | private bool dataBlockPoolEnabled = true; |
46 | 45 | ||
46 | /// <summary> | ||
47 | /// Pool of packets available for reuse. | ||
48 | /// </summary> | ||
47 | private readonly Dictionary<PacketType, Stack<Packet>> pool = new Dictionary<PacketType, Stack<Packet>>(); | 49 | private readonly Dictionary<PacketType, Stack<Packet>> pool = new Dictionary<PacketType, Stack<Packet>>(); |
48 | 50 | ||
49 | private static Dictionary<Type, Stack<Object>> DataBlocks = | 51 | private static Dictionary<Type, Stack<Object>> DataBlocks = |
@@ -244,4 +246,4 @@ namespace OpenSim.Framework | |||
244 | } | 246 | } |
245 | } | 247 | } |
246 | } | 248 | } |
247 | } | 249 | } \ No newline at end of file |
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/CallingCardModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/CallingCardModule.cs index d942e87..5ec0ea9 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/CallingCardModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/CallingCardModule.cs | |||
@@ -141,7 +141,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
141 | client.FirstName+" "+client.LastName, | 141 | client.FirstName+" "+client.LastName, |
142 | destID, (byte)211, false, | 142 | destID, (byte)211, false, |
143 | String.Empty, | 143 | String.Empty, |
144 | transactionID, false, new Vector3(), new byte[0]), | 144 | transactionID, false, new Vector3(), new byte[0], true), |
145 | delegate(bool success) {} ); | 145 | delegate(bool success) {} ); |
146 | } | 146 | } |
147 | } | 147 | } |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs index c14cb17..21dff4b 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs | |||
@@ -313,6 +313,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
313 | m_TransferModule.SendInstantMessage(im, delegate(bool success) {}); | 313 | m_TransferModule.SendInstantMessage(im, delegate(bool success) {}); |
314 | } | 314 | } |
315 | } | 315 | } |
316 | |||
317 | // XXX: This code was placed here to try and accomdate RLV which moves given folders named #RLV/~<name> | ||
318 | // to a folder called name in #RLV. However, this approach may not be ultimately correct - from analysis | ||
319 | // of Firestorm 4.2.2 on sending an InventoryOffered instead of TaskInventoryOffered (as was previously | ||
320 | // done), the viewer itself would appear to move and rename the folder, rather than the simulator doing it here. | ||
316 | else if (im.dialog == (byte) InstantMessageDialog.TaskInventoryAccepted) | 321 | else if (im.dialog == (byte) InstantMessageDialog.TaskInventoryAccepted) |
317 | { | 322 | { |
318 | UUID destinationFolderID = UUID.Zero; | 323 | UUID destinationFolderID = UUID.Zero; |
@@ -324,6 +329,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
324 | 329 | ||
325 | if (destinationFolderID != UUID.Zero) | 330 | if (destinationFolderID != UUID.Zero) |
326 | { | 331 | { |
332 | InventoryFolderBase destinationFolder = new InventoryFolderBase(destinationFolderID, client.AgentId); | ||
333 | if (destinationFolder == null) | ||
334 | { | ||
335 | m_log.WarnFormat( | ||
336 | "[INVENTORY TRANSFER]: TaskInventoryAccepted message from {0} in {1} specified folder {2} which does not exist", | ||
337 | client.Name, scene.Name, destinationFolderID); | ||
338 | |||
339 | return; | ||
340 | } | ||
341 | |||
327 | IInventoryService invService = scene.InventoryService; | 342 | IInventoryService invService = scene.InventoryService; |
328 | 343 | ||
329 | UUID inventoryID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip | 344 | UUID inventoryID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip |
@@ -331,9 +346,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
331 | InventoryItemBase item = new InventoryItemBase(inventoryID, client.AgentId); | 346 | InventoryItemBase item = new InventoryItemBase(inventoryID, client.AgentId); |
332 | item = invService.GetItem(item); | 347 | item = invService.GetItem(item); |
333 | InventoryFolderBase folder = null; | 348 | InventoryFolderBase folder = null; |
349 | UUID? previousParentFolderID = null; | ||
334 | 350 | ||
335 | if (item != null) // It's an item | 351 | if (item != null) // It's an item |
336 | { | 352 | { |
353 | previousParentFolderID = item.Folder; | ||
337 | item.Folder = destinationFolderID; | 354 | item.Folder = destinationFolderID; |
338 | 355 | ||
339 | invService.DeleteItems(item.Owner, new List<UUID>() { item.ID }); | 356 | invService.DeleteItems(item.Owner, new List<UUID>() { item.ID }); |
@@ -346,10 +363,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
346 | 363 | ||
347 | if (folder != null) // It's a folder | 364 | if (folder != null) // It's a folder |
348 | { | 365 | { |
366 | previousParentFolderID = folder.ParentID; | ||
349 | folder.ParentID = destinationFolderID; | 367 | folder.ParentID = destinationFolderID; |
350 | invService.MoveFolder(folder); | 368 | invService.MoveFolder(folder); |
351 | } | 369 | } |
352 | } | 370 | } |
371 | |||
372 | // Tell client about updates to original parent and new parent (this should probably be factored with existing move item/folder code). | ||
373 | if (previousParentFolderID != null) | ||
374 | { | ||
375 | InventoryFolderBase previousParentFolder | ||
376 | = new InventoryFolderBase((UUID)previousParentFolderID, client.AgentId); | ||
377 | previousParentFolder = invService.GetFolder(previousParentFolder); | ||
378 | scene.SendInventoryUpdate(client, previousParentFolder, true, true); | ||
379 | |||
380 | scene.SendInventoryUpdate(client, destinationFolder, true, true); | ||
381 | } | ||
353 | } | 382 | } |
354 | } | 383 | } |
355 | else if ( | 384 | else if ( |
@@ -370,9 +399,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
370 | InventoryItemBase item = new InventoryItemBase(inventoryID, client.AgentId); | 399 | InventoryItemBase item = new InventoryItemBase(inventoryID, client.AgentId); |
371 | item = invService.GetItem(item); | 400 | item = invService.GetItem(item); |
372 | InventoryFolderBase folder = null; | 401 | InventoryFolderBase folder = null; |
402 | UUID? previousParentFolderID = null; | ||
373 | 403 | ||
374 | if (item != null && trashFolder != null) | 404 | if (item != null && trashFolder != null) |
375 | { | 405 | { |
406 | previousParentFolderID = item.Folder; | ||
376 | item.Folder = trashFolder.ID; | 407 | item.Folder = trashFolder.ID; |
377 | 408 | ||
378 | // Diva comment: can't we just update this item??? | 409 | // Diva comment: can't we just update this item??? |
@@ -388,6 +419,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
388 | 419 | ||
389 | if (folder != null & trashFolder != null) | 420 | if (folder != null & trashFolder != null) |
390 | { | 421 | { |
422 | previousParentFolderID = folder.ParentID; | ||
391 | folder.ParentID = trashFolder.ID; | 423 | folder.ParentID = trashFolder.ID; |
392 | invService.MoveFolder(folder); | 424 | invService.MoveFolder(folder); |
393 | client.SendBulkUpdateInventory(folder); | 425 | client.SendBulkUpdateInventory(folder); |
@@ -408,6 +440,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
408 | client.SendAgentAlertMessage("Unable to delete "+ | 440 | client.SendAgentAlertMessage("Unable to delete "+ |
409 | "received inventory" + reason, false); | 441 | "received inventory" + reason, false); |
410 | } | 442 | } |
443 | // Tell client about updates to original parent and new parent (this should probably be factored with existing move item/folder code). | ||
444 | else if (previousParentFolderID != null) | ||
445 | { | ||
446 | InventoryFolderBase previousParentFolder | ||
447 | = new InventoryFolderBase((UUID)previousParentFolderID, client.AgentId); | ||
448 | previousParentFolder = invService.GetFolder(previousParentFolder); | ||
449 | scene.SendInventoryUpdate(client, previousParentFolder, true, true); | ||
450 | |||
451 | scene.SendInventoryUpdate(client, trashFolder, true, true); | ||
452 | } | ||
411 | 453 | ||
412 | ScenePresence user = scene.GetScenePresence(new UUID(im.toAgentID)); | 454 | ScenePresence user = scene.GetScenePresence(new UUID(im.toAgentID)); |
413 | 455 | ||
diff --git a/OpenSim/Region/CoreModules/Avatar/Lure/HGLureModule.cs b/OpenSim/Region/CoreModules/Avatar/Lure/HGLureModule.cs index 92cf9d1..9c369f6 100644 --- a/OpenSim/Region/CoreModules/Avatar/Lure/HGLureModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Lure/HGLureModule.cs | |||
@@ -186,7 +186,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Lure | |||
186 | client.FirstName+" "+client.LastName, targetid, | 186 | client.FirstName+" "+client.LastName, targetid, |
187 | (byte)InstantMessageDialog.RequestTeleport, false, | 187 | (byte)InstantMessageDialog.RequestTeleport, false, |
188 | message, sessionID, false, presence.AbsolutePosition, | 188 | message, sessionID, false, presence.AbsolutePosition, |
189 | new Byte[0]); | 189 | new Byte[0], true); |
190 | m.RegionID = client.Scene.RegionInfo.RegionID.Guid; | 190 | m.RegionID = client.Scene.RegionInfo.RegionID.Guid; |
191 | 191 | ||
192 | m_log.DebugFormat("[HG LURE MODULE]: RequestTeleport sessionID={0}, regionID={1}, message={2}", m.imSessionID, m.RegionID, m.message); | 192 | m_log.DebugFormat("[HG LURE MODULE]: RequestTeleport sessionID={0}, regionID={1}, message={2}", m.imSessionID, m.RegionID, m.message); |
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index c5bb9a5..e355ebf 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | |||
@@ -1028,6 +1028,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1028 | Scene initiatingScene) | 1028 | Scene initiatingScene) |
1029 | { | 1029 | { |
1030 | Thread.Sleep(10000); | 1030 | Thread.Sleep(10000); |
1031 | |||
1031 | IMessageTransferModule im = initiatingScene.RequestModuleInterface<IMessageTransferModule>(); | 1032 | IMessageTransferModule im = initiatingScene.RequestModuleInterface<IMessageTransferModule>(); |
1032 | if (im != null) | 1033 | if (im != null) |
1033 | { | 1034 | { |
@@ -1040,11 +1041,22 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1040 | (uint)(int)position.X, | 1041 | (uint)(int)position.X, |
1041 | (uint)(int)position.Y, | 1042 | (uint)(int)position.Y, |
1042 | (uint)(int)position.Z); | 1043 | (uint)(int)position.Z); |
1043 | GridInstantMessage m = new GridInstantMessage(initiatingScene, UUID.Zero, | 1044 | |
1044 | "Region", agent.UUID, | 1045 | GridInstantMessage m |
1045 | (byte)InstantMessageDialog.GodLikeRequestTeleport, false, | 1046 | = new GridInstantMessage( |
1046 | "", gotoLocation, false, new Vector3(127, 0, 0), | 1047 | initiatingScene, |
1047 | new Byte[0]); | 1048 | UUID.Zero, |
1049 | "Region", | ||
1050 | agent.UUID, | ||
1051 | (byte)InstantMessageDialog.GodLikeRequestTeleport, | ||
1052 | false, | ||
1053 | "", | ||
1054 | gotoLocation, | ||
1055 | false, | ||
1056 | new Vector3(127, 0, 0), | ||
1057 | new Byte[0], | ||
1058 | false); | ||
1059 | |||
1048 | im.SendInstantMessage(m, delegate(bool success) | 1060 | im.SendInstantMessage(m, delegate(bool success) |
1049 | { | 1061 | { |
1050 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Client Initiating Teleport sending IM success = {0}", success); | 1062 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Client Initiating Teleport sending IM success = {0}", success); |
diff --git a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs index 36c84c7..b4811da 100644 --- a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs +++ b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs | |||
@@ -31,6 +31,7 @@ using System.Reflection; | |||
31 | 31 | ||
32 | using OpenSim.Framework; | 32 | using OpenSim.Framework; |
33 | using OpenSim.Framework.Console; | 33 | using OpenSim.Framework.Console; |
34 | using OpenSim.Region.ClientStack.LindenUDP; | ||
34 | using OpenSim.Region.Framework; | 35 | using OpenSim.Region.Framework; |
35 | using OpenSim.Region.Framework.Interfaces; | 36 | using OpenSim.Region.Framework.Interfaces; |
36 | using OpenSim.Region.Framework.Scenes; | 37 | using OpenSim.Region.Framework.Scenes; |
diff --git a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs index 09f6758..6e39e9a 100644 --- a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs +++ b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs | |||
@@ -126,6 +126,25 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
126 | m_console.Commands.AddCommand( | 126 | m_console.Commands.AddCommand( |
127 | "Objects", | 127 | "Objects", |
128 | false, | 128 | false, |
129 | "show object pos", | ||
130 | "show object pos <start-coord> to <end-coord>", | ||
131 | "Show details of scene objects within the given area.", | ||
132 | "Each component of the coord is comma separated. There must be no spaces between the commas.\n" | ||
133 | + "If you don't care about the z component you can simply omit it.\n" | ||
134 | + "If you don't care about the x or y components then you can leave them blank (though a comma is still required)\n" | ||
135 | + "If you want to specify the maxmimum value of a component then you can use ~ instead of a number\n" | ||
136 | + "If you want to specify the minimum value of a component then you can use -~ instead of a number\n" | ||
137 | + "e.g.\n" | ||
138 | + "show object pos 20,20,20 to 40,40,40\n" | ||
139 | + "show object pos 20,20 to 40,40\n" | ||
140 | + "show object pos ,20,20 to ,40,40\n" | ||
141 | + "show object pos ,,30 to ,,~\n" | ||
142 | + "show object pos ,,-~ to ,,30", | ||
143 | HandleShowObjectByPos); | ||
144 | |||
145 | m_console.Commands.AddCommand( | ||
146 | "Objects", | ||
147 | false, | ||
129 | "show part uuid", | 148 | "show part uuid", |
130 | "show part uuid <UUID>", | 149 | "show part uuid <UUID>", |
131 | "Show details of a scene object parts with the given UUID", HandleShowPartByUuid); | 150 | "Show details of a scene object parts with the given UUID", HandleShowPartByUuid); |
@@ -138,6 +157,25 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
138 | "Show details of scene object parts with the given name.", | 157 | "Show details of scene object parts with the given name.", |
139 | "If --regex is specified then the name is treatead as a regular expression", | 158 | "If --regex is specified then the name is treatead as a regular expression", |
140 | HandleShowPartByName); | 159 | HandleShowPartByName); |
160 | |||
161 | m_console.Commands.AddCommand( | ||
162 | "Objects", | ||
163 | false, | ||
164 | "show part pos", | ||
165 | "show part pos <start-coord> to <end-coord>", | ||
166 | "Show details of scene object parts within the given area.", | ||
167 | "Each component of the coord is comma separated. There must be no spaces between the commas.\n" | ||
168 | + "If you don't care about the z component you can simply omit it.\n" | ||
169 | + "If you don't care about the x or y components then you can leave them blank (though a comma is still required)\n" | ||
170 | + "If you want to specify the maxmimum value of a component then you can use ~ instead of a number\n" | ||
171 | + "If you want to specify the minimum value of a component then you can use -~ instead of a number\n" | ||
172 | + "e.g.\n" | ||
173 | + "show object pos 20,20,20 to 40,40,40\n" | ||
174 | + "show object pos 20,20 to 40,40\n" | ||
175 | + "show object pos ,20,20 to ,40,40\n" | ||
176 | + "show object pos ,,30 to ,,~\n" | ||
177 | + "show object pos ,,-~ to ,,30", | ||
178 | HandleShowPartByPos); | ||
141 | } | 179 | } |
142 | 180 | ||
143 | public void RemoveRegion(Scene scene) | 181 | public void RemoveRegion(Scene scene) |
@@ -150,6 +188,43 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
150 | // m_log.DebugFormat("[OBJECTS COMMANDS MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); | 188 | // m_log.DebugFormat("[OBJECTS COMMANDS MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); |
151 | } | 189 | } |
152 | 190 | ||
191 | private void OutputSogsToConsole(Predicate<SceneObjectGroup> searchPredicate) | ||
192 | { | ||
193 | List<SceneObjectGroup> sceneObjects = m_scene.GetSceneObjectGroups().FindAll(searchPredicate); | ||
194 | |||
195 | StringBuilder sb = new StringBuilder(); | ||
196 | |||
197 | foreach (SceneObjectGroup so in sceneObjects) | ||
198 | { | ||
199 | AddSceneObjectReport(sb, so); | ||
200 | sb.Append("\n"); | ||
201 | } | ||
202 | |||
203 | sb.AppendFormat("{0} object(s) found in {1}\n", sceneObjects.Count, m_scene.Name); | ||
204 | |||
205 | m_console.OutputFormat(sb.ToString()); | ||
206 | } | ||
207 | |||
208 | private void OutputSopsToConsole(Predicate<SceneObjectPart> searchPredicate) | ||
209 | { | ||
210 | List<SceneObjectGroup> sceneObjects = m_scene.GetSceneObjectGroups(); | ||
211 | List<SceneObjectPart> parts = new List<SceneObjectPart>(); | ||
212 | |||
213 | sceneObjects.ForEach(so => parts.AddRange(Array.FindAll<SceneObjectPart>(so.Parts, searchPredicate))); | ||
214 | |||
215 | StringBuilder sb = new StringBuilder(); | ||
216 | |||
217 | foreach (SceneObjectPart part in parts) | ||
218 | { | ||
219 | AddScenePartReport(sb, part); | ||
220 | sb.Append("\n"); | ||
221 | } | ||
222 | |||
223 | sb.AppendFormat("{0} parts found in {1}\n", parts.Count, m_scene.Name); | ||
224 | |||
225 | m_console.OutputFormat(sb.ToString()); | ||
226 | } | ||
227 | |||
153 | private void HandleShowObjectByUuid(string module, string[] cmd) | 228 | private void HandleShowObjectByUuid(string module, string[] cmd) |
154 | { | 229 | { |
155 | if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) | 230 | if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) |
@@ -200,36 +275,54 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
200 | 275 | ||
201 | string name = mainParams[3]; | 276 | string name = mainParams[3]; |
202 | 277 | ||
203 | List<SceneObjectGroup> sceneObjects = new List<SceneObjectGroup>(); | 278 | Predicate<SceneObjectGroup> searchPredicate; |
204 | Action<SceneObjectGroup> searchAction; | ||
205 | 279 | ||
206 | if (useRegex) | 280 | if (useRegex) |
207 | { | 281 | { |
208 | Regex nameRegex = new Regex(name); | 282 | Regex nameRegex = new Regex(name); |
209 | searchAction = so => { if (nameRegex.IsMatch(so.Name)) { sceneObjects.Add(so); }}; | 283 | searchPredicate = so => nameRegex.IsMatch(so.Name); |
210 | } | 284 | } |
211 | else | 285 | else |
212 | { | 286 | { |
213 | searchAction = so => { if (so.Name == name) { sceneObjects.Add(so); }}; | 287 | searchPredicate = so => so.Name == name; |
214 | } | 288 | } |
215 | 289 | ||
216 | m_scene.ForEachSOG(searchAction); | 290 | OutputSogsToConsole(searchPredicate); |
291 | } | ||
217 | 292 | ||
218 | if (sceneObjects.Count == 0) | 293 | private void HandleShowObjectByPos(string module, string[] cmdparams) |
294 | { | ||
295 | if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) | ||
296 | return; | ||
297 | |||
298 | if (cmdparams.Length < 5) | ||
219 | { | 299 | { |
220 | m_console.OutputFormat("No objects with name {0} found in {1}", name, m_scene.RegionInfo.RegionName); | 300 | m_console.OutputFormat("Usage: show object pos <start-coord> to <end-coord>"); |
221 | return; | 301 | return; |
222 | } | 302 | } |
223 | 303 | ||
224 | StringBuilder sb = new StringBuilder(); | 304 | string rawConsoleStartVector = cmdparams[3]; |
305 | Vector3 startVector; | ||
225 | 306 | ||
226 | foreach (SceneObjectGroup so in sceneObjects) | 307 | if (!ConsoleUtil.TryParseConsoleMinVector(rawConsoleStartVector, out startVector)) |
227 | { | 308 | { |
228 | AddSceneObjectReport(sb, so); | 309 | m_console.OutputFormat("Error: Start vector {0} does not have a valid format", rawConsoleStartVector); |
229 | sb.Append("\n"); | 310 | return; |
230 | } | 311 | } |
231 | 312 | ||
232 | m_console.OutputFormat(sb.ToString()); | 313 | string rawConsoleEndVector = cmdparams[5]; |
314 | Vector3 endVector; | ||
315 | |||
316 | if (!ConsoleUtil.TryParseConsoleMaxVector(rawConsoleEndVector, out endVector)) | ||
317 | { | ||
318 | m_console.OutputFormat("Error: End vector {0} does not have a valid format", rawConsoleEndVector); | ||
319 | return; | ||
320 | } | ||
321 | |||
322 | Predicate<SceneObjectGroup> searchPredicate | ||
323 | = so => Util.IsInsideBox(so.AbsolutePosition, startVector, endVector); | ||
324 | |||
325 | OutputSogsToConsole(searchPredicate); | ||
233 | } | 326 | } |
234 | 327 | ||
235 | private void HandleShowPartByUuid(string module, string[] cmd) | 328 | private void HandleShowPartByUuid(string module, string[] cmd) |
@@ -264,6 +357,38 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
264 | m_console.OutputFormat(sb.ToString()); | 357 | m_console.OutputFormat(sb.ToString()); |
265 | } | 358 | } |
266 | 359 | ||
360 | private void HandleShowPartByPos(string module, string[] cmdparams) | ||
361 | { | ||
362 | if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) | ||
363 | return; | ||
364 | |||
365 | if (cmdparams.Length < 5) | ||
366 | { | ||
367 | m_console.OutputFormat("Usage: show part pos <start-coord> to <end-coord>"); | ||
368 | return; | ||
369 | } | ||
370 | |||
371 | string rawConsoleStartVector = cmdparams[3]; | ||
372 | Vector3 startVector; | ||
373 | |||
374 | if (!ConsoleUtil.TryParseConsoleMinVector(rawConsoleStartVector, out startVector)) | ||
375 | { | ||
376 | m_console.OutputFormat("Error: Start vector {0} does not have a valid format", rawConsoleStartVector); | ||
377 | return; | ||
378 | } | ||
379 | |||
380 | string rawConsoleEndVector = cmdparams[5]; | ||
381 | Vector3 endVector; | ||
382 | |||
383 | if (!ConsoleUtil.TryParseConsoleMaxVector(rawConsoleEndVector, out endVector)) | ||
384 | { | ||
385 | m_console.OutputFormat("Error: End vector {0} does not have a valid format", rawConsoleEndVector); | ||
386 | return; | ||
387 | } | ||
388 | |||
389 | OutputSopsToConsole(sop => Util.IsInsideBox(sop.AbsolutePosition, startVector, endVector)); | ||
390 | } | ||
391 | |||
267 | private void HandleShowPartByName(string module, string[] cmdparams) | 392 | private void HandleShowPartByName(string module, string[] cmdparams) |
268 | { | 393 | { |
269 | if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) | 394 | if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) |
@@ -282,37 +407,19 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
282 | 407 | ||
283 | string name = mainParams[3]; | 408 | string name = mainParams[3]; |
284 | 409 | ||
285 | List<SceneObjectPart> parts = new List<SceneObjectPart>(); | 410 | Predicate<SceneObjectPart> searchPredicate; |
286 | |||
287 | Action<SceneObjectGroup> searchAction; | ||
288 | 411 | ||
289 | if (useRegex) | 412 | if (useRegex) |
290 | { | 413 | { |
291 | Regex nameRegex = new Regex(name); | 414 | Regex nameRegex = new Regex(name); |
292 | searchAction = so => so.ForEachPart(sop => { if (nameRegex.IsMatch(sop.Name)) { parts.Add(sop); } }); | 415 | searchPredicate = sop => nameRegex.IsMatch(sop.Name); |
293 | } | 416 | } |
294 | else | 417 | else |
295 | { | 418 | { |
296 | searchAction = so => so.ForEachPart(sop => { if (sop.Name == name) { parts.Add(sop); } }); | 419 | searchPredicate = sop => sop.Name == name; |
297 | } | 420 | } |
298 | 421 | ||
299 | m_scene.ForEachSOG(searchAction); | 422 | OutputSopsToConsole(searchPredicate); |
300 | |||
301 | if (parts.Count == 0) | ||
302 | { | ||
303 | m_console.OutputFormat("No parts with name {0} found in {1}", name, m_scene.RegionInfo.RegionName); | ||
304 | return; | ||
305 | } | ||
306 | |||
307 | StringBuilder sb = new StringBuilder(); | ||
308 | |||
309 | foreach (SceneObjectPart part in parts) | ||
310 | { | ||
311 | AddScenePartReport(sb, part); | ||
312 | sb.Append("\n"); | ||
313 | } | ||
314 | |||
315 | m_console.OutputFormat(sb.ToString()); | ||
316 | } | 423 | } |
317 | 424 | ||
318 | private StringBuilder AddSceneObjectReport(StringBuilder sb, SceneObjectGroup so) | 425 | private StringBuilder AddSceneObjectReport(StringBuilder sb, SceneObjectGroup so) |
diff --git a/OpenSim/Region/Framework/Interfaces/IUserManagement.cs b/OpenSim/Region/Framework/Interfaces/IUserManagement.cs index 24cd069..f8088c3 100644 --- a/OpenSim/Region/Framework/Interfaces/IUserManagement.cs +++ b/OpenSim/Region/Framework/Interfaces/IUserManagement.cs | |||
@@ -1,4 +1,31 @@ | |||
1 | using System; | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
2 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
3 | 30 | ||
4 | using OpenMetaverse; | 31 | using OpenMetaverse; |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 35df85c..30bf744 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -1469,7 +1469,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1469 | return newFolderID; | 1469 | return newFolderID; |
1470 | } | 1470 | } |
1471 | 1471 | ||
1472 | private void SendInventoryUpdate(IClientAPI client, InventoryFolderBase folder, bool fetchFolders, bool fetchItems) | 1472 | public void SendInventoryUpdate(IClientAPI client, InventoryFolderBase folder, bool fetchFolders, bool fetchItems) |
1473 | { | 1473 | { |
1474 | if (folder == null) | 1474 | if (folder == null) |
1475 | return; | 1475 | return; |
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index bb3748e..66fc216 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs | |||
@@ -148,7 +148,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
148 | OnInstantMessage(this, new GridInstantMessage(m_scene, | 148 | OnInstantMessage(this, new GridInstantMessage(m_scene, |
149 | m_uuid, m_firstname + " " + m_lastname, | 149 | m_uuid, m_firstname + " " + m_lastname, |
150 | target, 0, false, message, | 150 | target, 0, false, message, |
151 | UUID.Zero, false, Position, new byte[0])); | 151 | UUID.Zero, false, Position, new byte[0], true)); |
152 | } | 152 | } |
153 | 153 | ||
154 | public void SendAgentOffline(UUID[] agentIDs) | 154 | public void SendAgentOffline(UUID[] agentIDs) |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index d8da173..49f0ef7 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -4326,7 +4326,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4326 | World.RegionInfo.RegionName+" "+ | 4326 | World.RegionInfo.RegionName+" "+ |
4327 | m_host.AbsolutePosition.ToString(), | 4327 | m_host.AbsolutePosition.ToString(), |
4328 | agentItem.ID, true, m_host.AbsolutePosition, | 4328 | agentItem.ID, true, m_host.AbsolutePosition, |
4329 | bucket); | 4329 | bucket, true); |
4330 | 4330 | ||
4331 | ScenePresence sp; | 4331 | ScenePresence sp; |
4332 | 4332 | ||
@@ -6912,16 +6912,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6912 | if (m_TransferModule != null) | 6912 | if (m_TransferModule != null) |
6913 | { | 6913 | { |
6914 | byte[] bucket = new byte[] { (byte)AssetType.Folder }; | 6914 | byte[] bucket = new byte[] { (byte)AssetType.Folder }; |
6915 | 6915 | ||
6916 | Vector3 pos = m_host.AbsolutePosition; | ||
6917 | |||
6916 | GridInstantMessage msg = new GridInstantMessage(World, | 6918 | GridInstantMessage msg = new GridInstantMessage(World, |
6917 | m_host.UUID, m_host.Name + ", an object owned by " + | 6919 | m_host.OwnerID, m_host.Name, destID, |
6918 | resolveName(m_host.OwnerID) + ",", destID, | ||
6919 | (byte)InstantMessageDialog.TaskInventoryOffered, | 6920 | (byte)InstantMessageDialog.TaskInventoryOffered, |
6920 | false, category + "\n" + m_host.Name + " is located at " + | 6921 | false, string.Format("'{0}'"), |
6921 | World.RegionInfo.RegionName + " " + | 6922 | // We won't go so far as to add a SLURL, but this is the format used by LL as of 2012-10-06 |
6922 | m_host.AbsolutePosition.ToString(), | 6923 | // false, string.Format("'{0}' ( http://slurl.com/secondlife/{1}/{2}/{3}/{4} )", category, World.Name, (int)pos.X, (int)pos.Y, (int)pos.Z), |
6923 | folderID, true, m_host.AbsolutePosition, | 6924 | folderID, false, pos, |
6924 | bucket); | 6925 | bucket, false); |
6925 | 6926 | ||
6926 | m_TransferModule.SendInstantMessage(msg, delegate(bool success) {}); | 6927 | m_TransferModule.SendInstantMessage(msg, delegate(bool success) {}); |
6927 | } | 6928 | } |
diff --git a/OpenSim/Region/UserStatistics/WebStatsModule.cs b/OpenSim/Region/UserStatistics/WebStatsModule.cs index c11ea02..625eba4 100644 --- a/OpenSim/Region/UserStatistics/WebStatsModule.cs +++ b/OpenSim/Region/UserStatistics/WebStatsModule.cs | |||
@@ -61,7 +61,7 @@ namespace OpenSim.Region.UserStatistics | |||
61 | /// <summary> | 61 | /// <summary> |
62 | /// User statistics sessions keyed by agent ID | 62 | /// User statistics sessions keyed by agent ID |
63 | /// </summary> | 63 | /// </summary> |
64 | private Dictionary<UUID, UserSessionID> m_sessions = new Dictionary<UUID, UserSessionID>(); | 64 | private Dictionary<UUID, UserSession> m_sessions = new Dictionary<UUID, UserSession>(); |
65 | 65 | ||
66 | private List<Scene> m_scenes = new List<Scene>(); | 66 | private List<Scene> m_scenes = new List<Scene>(); |
67 | private Dictionary<string, IStatsController> reports = new Dictionary<string, IStatsController>(); | 67 | private Dictionary<string, IStatsController> reports = new Dictionary<string, IStatsController>(); |
@@ -319,14 +319,18 @@ namespace OpenSim.Region.UserStatistics | |||
319 | 319 | ||
320 | private void OnMakeRootAgent(ScenePresence agent) | 320 | private void OnMakeRootAgent(ScenePresence agent) |
321 | { | 321 | { |
322 | // m_log.DebugFormat( | ||
323 | // "[WEB STATS MODULE]: Looking for session {0} for {1} in {2}", | ||
324 | // agent.ControllingClient.SessionId, agent.Name, agent.Scene.Name); | ||
325 | |||
322 | lock (m_sessions) | 326 | lock (m_sessions) |
323 | { | 327 | { |
324 | UserSessionID uid; | 328 | UserSession uid; |
325 | 329 | ||
326 | if (!m_sessions.ContainsKey(agent.UUID)) | 330 | if (!m_sessions.ContainsKey(agent.UUID)) |
327 | { | 331 | { |
328 | UserSessionData usd = UserSessionUtil.newUserSessionData(); | 332 | UserSessionData usd = UserSessionUtil.newUserSessionData(); |
329 | uid = new UserSessionID(); | 333 | uid = new UserSession(); |
330 | uid.name_f = agent.Firstname; | 334 | uid.name_f = agent.Firstname; |
331 | uid.name_l = agent.Lastname; | 335 | uid.name_l = agent.Lastname; |
332 | uid.session_data = usd; | 336 | uid.session_data = usd; |
@@ -411,9 +415,9 @@ namespace OpenSim.Region.UserStatistics | |||
411 | return String.Empty; | 415 | return String.Empty; |
412 | } | 416 | } |
413 | 417 | ||
414 | private UserSessionID ParseViewerStats(string request, UUID agentID) | 418 | private UserSession ParseViewerStats(string request, UUID agentID) |
415 | { | 419 | { |
416 | UserSessionID uid = new UserSessionID(); | 420 | UserSession uid = new UserSession(); |
417 | UserSessionData usd; | 421 | UserSessionData usd; |
418 | OSD message = OSDParser.DeserializeLLSDXml(request); | 422 | OSD message = OSDParser.DeserializeLLSDXml(request); |
419 | OSDMap mmap; | 423 | OSDMap mmap; |
@@ -425,22 +429,25 @@ namespace OpenSim.Region.UserStatistics | |||
425 | if (!m_sessions.ContainsKey(agentID)) | 429 | if (!m_sessions.ContainsKey(agentID)) |
426 | { | 430 | { |
427 | m_log.WarnFormat("[WEB STATS MODULE]: no session for stat disclosure for agent {0}", agentID); | 431 | m_log.WarnFormat("[WEB STATS MODULE]: no session for stat disclosure for agent {0}", agentID); |
428 | return new UserSessionID(); | 432 | return new UserSession(); |
429 | } | 433 | } |
434 | |||
430 | uid = m_sessions[agentID]; | 435 | uid = m_sessions[agentID]; |
436 | |||
437 | // m_log.DebugFormat("[WEB STATS MODULE]: Got session {0} for {1}", uid.session_id, agentID); | ||
431 | } | 438 | } |
432 | else | 439 | else |
433 | { | 440 | { |
434 | // parse through the beginning to locate the session | 441 | // parse through the beginning to locate the session |
435 | if (message.Type != OSDType.Map) | 442 | if (message.Type != OSDType.Map) |
436 | return new UserSessionID(); | 443 | return new UserSession(); |
437 | 444 | ||
438 | mmap = (OSDMap)message; | 445 | mmap = (OSDMap)message; |
439 | { | 446 | { |
440 | UUID sessionID = mmap["session_id"].AsUUID(); | 447 | UUID sessionID = mmap["session_id"].AsUUID(); |
441 | 448 | ||
442 | if (sessionID == UUID.Zero) | 449 | if (sessionID == UUID.Zero) |
443 | return new UserSessionID(); | 450 | return new UserSession(); |
444 | 451 | ||
445 | 452 | ||
446 | // search through each session looking for the owner | 453 | // search through each session looking for the owner |
@@ -459,7 +466,7 @@ namespace OpenSim.Region.UserStatistics | |||
459 | // can't find a session | 466 | // can't find a session |
460 | if (agentID == UUID.Zero) | 467 | if (agentID == UUID.Zero) |
461 | { | 468 | { |
462 | return new UserSessionID(); | 469 | return new UserSession(); |
463 | } | 470 | } |
464 | } | 471 | } |
465 | } | 472 | } |
@@ -468,12 +475,12 @@ namespace OpenSim.Region.UserStatistics | |||
468 | usd = uid.session_data; | 475 | usd = uid.session_data; |
469 | 476 | ||
470 | if (message.Type != OSDType.Map) | 477 | if (message.Type != OSDType.Map) |
471 | return new UserSessionID(); | 478 | return new UserSession(); |
472 | 479 | ||
473 | mmap = (OSDMap)message; | 480 | mmap = (OSDMap)message; |
474 | { | 481 | { |
475 | if (mmap["agent"].Type != OSDType.Map) | 482 | if (mmap["agent"].Type != OSDType.Map) |
476 | return new UserSessionID(); | 483 | return new UserSession(); |
477 | OSDMap agent_map = (OSDMap)mmap["agent"]; | 484 | OSDMap agent_map = (OSDMap)mmap["agent"]; |
478 | usd.agent_id = agentID; | 485 | usd.agent_id = agentID; |
479 | usd.name_f = uid.name_f; | 486 | usd.name_f = uid.name_f; |
@@ -493,17 +500,18 @@ namespace OpenSim.Region.UserStatistics | |||
493 | (float)agent_map["fps"].AsReal()); | 500 | (float)agent_map["fps"].AsReal()); |
494 | 501 | ||
495 | if (mmap["downloads"].Type != OSDType.Map) | 502 | if (mmap["downloads"].Type != OSDType.Map) |
496 | return new UserSessionID(); | 503 | return new UserSession(); |
497 | OSDMap downloads_map = (OSDMap)mmap["downloads"]; | 504 | OSDMap downloads_map = (OSDMap)mmap["downloads"]; |
498 | usd.d_object_kb = (float)downloads_map["object_kbytes"].AsReal(); | 505 | usd.d_object_kb = (float)downloads_map["object_kbytes"].AsReal(); |
499 | usd.d_texture_kb = (float)downloads_map["texture_kbytes"].AsReal(); | 506 | usd.d_texture_kb = (float)downloads_map["texture_kbytes"].AsReal(); |
500 | usd.d_world_kb = (float)downloads_map["workd_kbytes"].AsReal(); | 507 | usd.d_world_kb = (float)downloads_map["workd_kbytes"].AsReal(); |
501 | 508 | ||
509 | // m_log.DebugFormat("[WEB STATS MODULE]: mmap[\"session_id\"] = [{0}]", mmap["session_id"].AsUUID()); | ||
502 | 510 | ||
503 | usd.session_id = mmap["session_id"].AsUUID(); | 511 | usd.session_id = mmap["session_id"].AsUUID(); |
504 | 512 | ||
505 | if (mmap["system"].Type != OSDType.Map) | 513 | if (mmap["system"].Type != OSDType.Map) |
506 | return new UserSessionID(); | 514 | return new UserSession(); |
507 | OSDMap system_map = (OSDMap)mmap["system"]; | 515 | OSDMap system_map = (OSDMap)mmap["system"]; |
508 | 516 | ||
509 | usd.s_cpu = system_map["cpu"].AsString(); | 517 | usd.s_cpu = system_map["cpu"].AsString(); |
@@ -512,13 +520,13 @@ namespace OpenSim.Region.UserStatistics | |||
512 | usd.s_ram = system_map["ram"].AsInteger(); | 520 | usd.s_ram = system_map["ram"].AsInteger(); |
513 | 521 | ||
514 | if (mmap["stats"].Type != OSDType.Map) | 522 | if (mmap["stats"].Type != OSDType.Map) |
515 | return new UserSessionID(); | 523 | return new UserSession(); |
516 | 524 | ||
517 | OSDMap stats_map = (OSDMap)mmap["stats"]; | 525 | OSDMap stats_map = (OSDMap)mmap["stats"]; |
518 | { | 526 | { |
519 | 527 | ||
520 | if (stats_map["failures"].Type != OSDType.Map) | 528 | if (stats_map["failures"].Type != OSDType.Map) |
521 | return new UserSessionID(); | 529 | return new UserSession(); |
522 | OSDMap stats_failures = (OSDMap)stats_map["failures"]; | 530 | OSDMap stats_failures = (OSDMap)stats_map["failures"]; |
523 | usd.f_dropped = stats_failures["dropped"].AsInteger(); | 531 | usd.f_dropped = stats_failures["dropped"].AsInteger(); |
524 | usd.f_failed_resends = stats_failures["failed_resends"].AsInteger(); | 532 | usd.f_failed_resends = stats_failures["failed_resends"].AsInteger(); |
@@ -527,18 +535,18 @@ namespace OpenSim.Region.UserStatistics | |||
527 | usd.f_send_packet = stats_failures["send_packet"].AsInteger(); | 535 | usd.f_send_packet = stats_failures["send_packet"].AsInteger(); |
528 | 536 | ||
529 | if (stats_map["net"].Type != OSDType.Map) | 537 | if (stats_map["net"].Type != OSDType.Map) |
530 | return new UserSessionID(); | 538 | return new UserSession(); |
531 | OSDMap stats_net = (OSDMap)stats_map["net"]; | 539 | OSDMap stats_net = (OSDMap)stats_map["net"]; |
532 | { | 540 | { |
533 | if (stats_net["in"].Type != OSDType.Map) | 541 | if (stats_net["in"].Type != OSDType.Map) |
534 | return new UserSessionID(); | 542 | return new UserSession(); |
535 | 543 | ||
536 | OSDMap net_in = (OSDMap)stats_net["in"]; | 544 | OSDMap net_in = (OSDMap)stats_net["in"]; |
537 | usd.n_in_kb = (float)net_in["kbytes"].AsReal(); | 545 | usd.n_in_kb = (float)net_in["kbytes"].AsReal(); |
538 | usd.n_in_pk = net_in["packets"].AsInteger(); | 546 | usd.n_in_pk = net_in["packets"].AsInteger(); |
539 | 547 | ||
540 | if (stats_net["out"].Type != OSDType.Map) | 548 | if (stats_net["out"].Type != OSDType.Map) |
541 | return new UserSessionID(); | 549 | return new UserSession(); |
542 | OSDMap net_out = (OSDMap)stats_net["out"]; | 550 | OSDMap net_out = (OSDMap)stats_net["out"]; |
543 | 551 | ||
544 | usd.n_out_kb = (float)net_out["kbytes"].AsReal(); | 552 | usd.n_out_kb = (float)net_out["kbytes"].AsReal(); |
@@ -549,11 +557,18 @@ namespace OpenSim.Region.UserStatistics | |||
549 | 557 | ||
550 | uid.session_data = usd; | 558 | uid.session_data = usd; |
551 | m_sessions[agentID] = uid; | 559 | m_sessions[agentID] = uid; |
560 | |||
561 | // m_log.DebugFormat( | ||
562 | // "[WEB STATS MODULE]: Parse data for {0} {1}, session {2}", uid.name_f, uid.name_l, uid.session_id); | ||
563 | |||
552 | return uid; | 564 | return uid; |
553 | } | 565 | } |
554 | 566 | ||
555 | private void UpdateUserStats(UserSessionID uid, SqliteConnection db) | 567 | private void UpdateUserStats(UserSession uid, SqliteConnection db) |
556 | { | 568 | { |
569 | // m_log.DebugFormat( | ||
570 | // "[WEB STATS MODULE]: Updating user stats for {0} {1}, session {2}", uid.name_f, uid.name_l, uid.session_id); | ||
571 | |||
557 | if (uid.session_id == UUID.Zero) | 572 | if (uid.session_id == UUID.Zero) |
558 | return; | 573 | return; |
559 | 574 | ||
@@ -740,7 +755,6 @@ VALUES | |||
740 | s.min_ping = ArrayMin_f(__ping); | 755 | s.min_ping = ArrayMin_f(__ping); |
741 | s.max_ping = ArrayMax_f(__ping); | 756 | s.max_ping = ArrayMax_f(__ping); |
742 | s.mode_ping = ArrayMode_f(__ping); | 757 | s.mode_ping = ArrayMode_f(__ping); |
743 | |||
744 | } | 758 | } |
745 | 759 | ||
746 | #region Statistics | 760 | #region Statistics |
@@ -985,7 +999,7 @@ VALUES | |||
985 | } | 999 | } |
986 | #region structs | 1000 | #region structs |
987 | 1001 | ||
988 | public struct UserSessionID | 1002 | public class UserSession |
989 | { | 1003 | { |
990 | public UUID session_id; | 1004 | public UUID session_id; |
991 | public UUID region_id; | 1005 | public UUID region_id; |
diff --git a/OpenSim/Services/Connectors/Asset/AssetServicesConnector.cs b/OpenSim/Services/Connectors/Asset/AssetServicesConnector.cs index 9d6d9ad..88a3026 100644 --- a/OpenSim/Services/Connectors/Asset/AssetServicesConnector.cs +++ b/OpenSim/Services/Connectors/Asset/AssetServicesConnector.cs | |||
@@ -52,6 +52,8 @@ namespace OpenSim.Services.Connectors | |||
52 | private int m_retryCounter; | 52 | private int m_retryCounter; |
53 | private Dictionary<int, List<AssetBase>> m_retryQueue = new Dictionary<int, List<AssetBase>>(); | 53 | private Dictionary<int, List<AssetBase>> m_retryQueue = new Dictionary<int, List<AssetBase>>(); |
54 | private System.Timers.Timer m_retryTimer; | 54 | private System.Timers.Timer m_retryTimer; |
55 | private int m_maxAssetRequestConcurrency = 30; | ||
56 | |||
55 | private delegate void AssetRetrievedEx(AssetBase asset); | 57 | private delegate void AssetRetrievedEx(AssetBase asset); |
56 | 58 | ||
57 | // Keeps track of concurrent requests for the same asset, so that it's only loaded once. | 59 | // Keeps track of concurrent requests for the same asset, so that it's only loaded once. |
@@ -80,6 +82,10 @@ namespace OpenSim.Services.Connectors | |||
80 | 82 | ||
81 | public virtual void Initialise(IConfigSource source) | 83 | public virtual void Initialise(IConfigSource source) |
82 | { | 84 | { |
85 | IConfig netconfig = source.Configs["Network"]; | ||
86 | if (netconfig != null) | ||
87 | m_maxAssetRequestConcurrency = netconfig.GetInt("MaxRequestConcurrency",m_maxAssetRequestConcurrency); | ||
88 | |||
83 | IConfig assetConfig = source.Configs["AssetService"]; | 89 | IConfig assetConfig = source.Configs["AssetService"]; |
84 | if (assetConfig == null) | 90 | if (assetConfig == null) |
85 | { | 91 | { |
@@ -204,7 +210,7 @@ namespace OpenSim.Services.Connectors | |||
204 | if (asset == null || asset.Data == null || asset.Data.Length == 0) | 210 | if (asset == null || asset.Data == null || asset.Data.Length == 0) |
205 | { | 211 | { |
206 | asset = SynchronousRestObjectRequester. | 212 | asset = SynchronousRestObjectRequester. |
207 | MakeRequest<int, AssetBase>("GET", uri, 0, 30); | 213 | MakeRequest<int, AssetBase>("GET", uri, 0, m_maxAssetRequestConcurrency); |
208 | 214 | ||
209 | if (m_Cache != null) | 215 | if (m_Cache != null) |
210 | m_Cache.Cache(asset); | 216 | m_Cache.Cache(asset); |
@@ -311,7 +317,7 @@ namespace OpenSim.Services.Connectors | |||
311 | h.Invoke(a); | 317 | h.Invoke(a); |
312 | if (handlers != null) | 318 | if (handlers != null) |
313 | handlers.Clear(); | 319 | handlers.Clear(); |
314 | }, 30); | 320 | }, m_maxAssetRequestConcurrency); |
315 | 321 | ||
316 | success = true; | 322 | success = true; |
317 | } | 323 | } |
diff --git a/OpenSim/Services/Connectors/GridUser/GridUserServicesConnector.cs b/OpenSim/Services/Connectors/GridUser/GridUserServicesConnector.cs index 20d7eaf..94bda82 100644 --- a/OpenSim/Services/Connectors/GridUser/GridUserServicesConnector.cs +++ b/OpenSim/Services/Connectors/GridUser/GridUserServicesConnector.cs | |||
@@ -207,7 +207,7 @@ namespace OpenSim.Services.Connectors | |||
207 | if ((replyData != null) && replyData.ContainsKey("result") && (replyData["result"] != null)) | 207 | if ((replyData != null) && replyData.ContainsKey("result") && (replyData["result"] != null)) |
208 | { | 208 | { |
209 | if (replyData["result"] is Dictionary<string, object>) | 209 | if (replyData["result"] is Dictionary<string, object>) |
210 | guinfo = new GridUserInfo((Dictionary<string, object>)replyData["result"]); | 210 | guinfo = Create((Dictionary<string, object>)replyData["result"]); |
211 | } | 211 | } |
212 | 212 | ||
213 | return guinfo; | 213 | return guinfo; |
@@ -273,7 +273,7 @@ namespace OpenSim.Services.Connectors | |||
273 | { | 273 | { |
274 | if (griduser is Dictionary<string, object>) | 274 | if (griduser is Dictionary<string, object>) |
275 | { | 275 | { |
276 | GridUserInfo pinfo = new GridUserInfo((Dictionary<string, object>)griduser); | 276 | GridUserInfo pinfo = Create((Dictionary<string, object>)griduser); |
277 | rinfos.Add(pinfo); | 277 | rinfos.Add(pinfo); |
278 | } | 278 | } |
279 | else | 279 | else |
@@ -286,5 +286,10 @@ namespace OpenSim.Services.Connectors | |||
286 | 286 | ||
287 | return rinfos.ToArray(); | 287 | return rinfos.ToArray(); |
288 | } | 288 | } |
289 | |||
290 | protected virtual GridUserInfo Create(Dictionary<string, object> griduser) | ||
291 | { | ||
292 | return new GridUserInfo(griduser); | ||
293 | } | ||
289 | } | 294 | } |
290 | } | 295 | } |