From 01b00ad0d57d828028379875a382965b44073497 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 5 May 2012 00:29:14 +0100 Subject: [PATCH 01/17] Fire the scripting changed event with CHANGED_OWNER when an object that has changed owners is rezzed. This needs to occur after the script is resumed rather than before, when the event is just dropped. Addresses http://opensimulator.org/mantis/view.php?id=5890 and http://opensimulator.org/mantis/view.php?id=5952 --- OpenSim/Framework/TaskInventoryItem.cs | 16 +++++++++++++--- .../Avatar/Attachments/AttachmentsModule.cs | 18 +++++++++--------- .../CoreModules/World/Land/PrimCountModule.cs | 1 - .../Scenes/SceneObjectPartInventory.cs | 10 ++++++++-- 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/OpenSim/Framework/TaskInventoryItem.cs b/OpenSim/Framework/TaskInventoryItem.cs index d4bbbfb7c9..362d3652b4 100644 --- a/OpenSim/Framework/TaskInventoryItem.cs +++ b/OpenSim/Framework/TaskInventoryItem.cs @@ -26,6 +26,8 @@ */ using System; +using System.Reflection; +using log4net; using OpenMetaverse; namespace OpenSim.Framework @@ -35,6 +37,8 @@ namespace OpenSim.Framework /// public class TaskInventoryItem : ICloneable { +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + /// /// XXX This should really be factored out into some constants class. /// @@ -331,12 +335,18 @@ namespace OpenSim.Framework } } - public bool OwnerChanged { - get { + public bool OwnerChanged + { + get + { return _ownerChanged; } - set { + set + { _ownerChanged = value; +// m_log.DebugFormat( +// "[TASK INVENTORY ITEM]: Owner changed set {0} for {1} {2} owned by {3}", +// _ownerChanged, Name, ItemID, OwnerID); } } diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 7200c4bc00..2e1948d231 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -527,9 +527,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments private void AttachToAgent( IScenePresence sp, SceneObjectGroup so, uint attachmentpoint, Vector3 attachOffset, bool silent) { - // m_log.DebugFormat( - // "[ATTACHMENTS MODULE]: Adding attachment {0} to avatar {1} in pt {2} pos {3} {4}", - // so.Name, avatar.Name, attachmentpoint, attachOffset, so.RootPart.AttachedPos); +// m_log.DebugFormat( +// "[ATTACHMENTS MODULE]: Adding attachment {0} to avatar {1} in pt {2} pos {3} {4}", +// so.Name, sp.Name, attachmentpoint, attachOffset, so.RootPart.AttachedPos); so.DetachFromBackup(); @@ -788,9 +788,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments /// private void ShowAttachInUserInventory(IScenePresence sp, uint AttachmentPt, UUID itemID, SceneObjectGroup att) { - // m_log.DebugFormat( - // "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}", - // att.Name, sp.Name, AttachmentPt, itemID); +// m_log.DebugFormat( +// "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}", +// att.Name, sp.Name, AttachmentPt, itemID); if (UUID.Zero == itemID) { @@ -853,9 +853,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments private void Client_OnObjectAttach(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, bool silent) { - // m_log.DebugFormat( - // "[ATTACHMENTS MODULE]: Attaching object local id {0} to {1} point {2} from ground (silent = {3})", - // objectLocalID, remoteClient.Name, AttachmentPt, silent); +// m_log.DebugFormat( +// "[ATTACHMENTS MODULE]: Attaching object local id {0} to {1} point {2} from ground (silent = {3})", +// objectLocalID, remoteClient.Name, AttachmentPt, silent); if (!Enabled) return; diff --git a/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs b/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs index efede5ca42..b2f71d1250 100644 --- a/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs @@ -126,7 +126,6 @@ namespace OpenSim.Region.CoreModules.World.Land // m_log.DebugFormat( // "[PRIM COUNT MODULE]: Ignoring OnParcelPrimCountAdd() for {0} on {1} since count is tainted", // obj.Name, m_Scene.RegionInfo.RegionName); - } } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index aacad98369..3734e03994 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -1219,13 +1219,19 @@ namespace OpenSim.Region.Framework.Scenes { if (engine != null) { +// m_log.DebugFormat( +// "[PRIM INVENTORY]: Resuming script {0} {1} for {2}, OwnerChanged {3}", +// item.Name, item.ItemID, item.OwnerID, item.OwnerChanged); + + engine.ResumeScript(item.ItemID); + if (item.OwnerChanged) engine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.OWNER }); + item.OwnerChanged = false; - engine.ResumeScript(item.ItemID); } } } } } -} +} \ No newline at end of file From 9317b888f99257ba2612cc8700ffa4055f25369e Mon Sep 17 00:00:00 2001 From: nebadon Date: Sat, 5 May 2012 13:49:10 -0700 Subject: [PATCH 02/17] testing new opensimulator.org hardware out to make sure git still works! --- CONTRIBUTORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 8a1141fd11..cb61931e33 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -205,3 +205,4 @@ In addition, we would like to thank: * The Mono Project * The NANT Developers * Microsoft (.NET, MSSQL-Adapters) +- From 531c52abe3e7397141f423d2617351d97cf3aa09 Mon Sep 17 00:00:00 2001 From: nebadon Date: Sat, 5 May 2012 13:59:40 -0700 Subject: [PATCH 03/17] test #2 --- CONTRIBUTORS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index cb61931e33..d80ead8e99 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -205,4 +205,4 @@ In addition, we would like to thank: * The Mono Project * The NANT Developers * Microsoft (.NET, MSSQL-Adapters) -- +-- From 8d070cf47babb947fce4d938f820452d4bfb7ca2 Mon Sep 17 00:00:00 2001 From: nebadon Date: Sat, 5 May 2012 14:32:40 -0700 Subject: [PATCH 04/17] last test clean up the mess.. --- CONTRIBUTORS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index d80ead8e99..1d20dffc27 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -205,4 +205,4 @@ In addition, we would like to thank: * The Mono Project * The NANT Developers * Microsoft (.NET, MSSQL-Adapters) --- + From 86dd5adceb08d6044471b85e4982f01f9318403d Mon Sep 17 00:00:00 2001 From: nebadon Date: Sat, 5 May 2012 14:42:33 -0700 Subject: [PATCH 05/17] one last test.. --- CONTRIBUTORS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 1d20dffc27..49e6478b5e 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -205,4 +205,4 @@ In addition, we would like to thank: * The Mono Project * The NANT Developers * Microsoft (.NET, MSSQL-Adapters) - +* From f19fe50629bfee151286da487ba58e0f35f78329 Mon Sep 17 00:00:00 2001 From: nebadon Date: Sat, 5 May 2012 14:45:53 -0700 Subject: [PATCH 06/17] never say last test!! --- CONTRIBUTORS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 49e6478b5e..1d20dffc27 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -205,4 +205,4 @@ In addition, we would like to thank: * The Mono Project * The NANT Developers * Microsoft (.NET, MSSQL-Adapters) -* + From c11b3760daee51ac32c78d7787771ec800573d3c Mon Sep 17 00:00:00 2001 From: nebadon Date: Sat, 5 May 2012 14:49:10 -0700 Subject: [PATCH 07/17] just another test :) --- CONTRIBUTORS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 1d20dffc27..8350802a8b 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -205,4 +205,4 @@ In addition, we would like to thank: * The Mono Project * The NANT Developers * Microsoft (.NET, MSSQL-Adapters) - +*x From b60f51dafc364435796718807d211a17bfc35e12 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sun, 6 May 2012 19:21:54 +0100 Subject: [PATCH 08/17] Stop llSetPos from sending one update per child prim --- OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 268600409f..05bea8dd88 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -2771,7 +2771,7 @@ namespace OpenSim.Region.Framework.Scenes //we need to do a terse update even if the move wasn't allowed // so that the position is reset in the client (the object snaps back) - ScheduleGroupForTerseUpdate(); + RootPart.ScheduleTerseUpdate(); } /// From b697d0e895dc7670e160188501da88a780455500 Mon Sep 17 00:00:00 2001 From: dahlia Date: Sun, 6 May 2012 23:54:50 -0700 Subject: [PATCH 09/17] add OS_NPC_RUNNING option to osNpcMoveToTarget() to allow running speed for moving NPCs --- OpenSim/Region/Framework/Interfaces/INPCModule.cs | 6 ++++-- OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs | 3 ++- .../ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | 3 ++- .../Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs | 1 + 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/Framework/Interfaces/INPCModule.cs b/OpenSim/Region/Framework/Interfaces/INPCModule.cs index b4dc3c3c11..e071ea3e9e 100644 --- a/OpenSim/Region/Framework/Interfaces/INPCModule.cs +++ b/OpenSim/Region/Framework/Interfaces/INPCModule.cs @@ -113,9 +113,11 @@ namespace OpenSim.Region.Framework.Interfaces /// /// /// If true and the avatar is flying when it reaches the target, land. - /// + /// name="running"> + /// If true, NPC moves with running speed. /// True if the operation succeeded, false if there was no such agent or the agent was not an NPC - bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget); + /// + bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget, bool running = false); /// /// Stop the NPC's current movement. diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index 3ac1eb102d..541ad7d78c 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -169,7 +169,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC } } - public bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget) + public bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget, bool running = false) { lock (m_avatars) { @@ -183,6 +183,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC sp.Name, pos, scene.RegionInfo.RegionName, noFly, landAtTarget); sp.MoveToTarget(pos, noFly, landAtTarget); + sp.SetAlwaysRun = running; return true; } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 0d4ea198e9..3659687f08 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -2474,7 +2474,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api World, pos, (options & ScriptBaseClass.OS_NPC_NO_FLY) != 0, - (options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0); + (options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0, + (options & ScriptBaseClass.OS_NPC_RUNNING) != 0); } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index fd7c41e682..2a28542a96 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs @@ -626,6 +626,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase public const int OS_NPC_FLY = 0; public const int OS_NPC_NO_FLY = 1; public const int OS_NPC_LAND_AT_TARGET = 2; + public const int OS_NPC_RUNNING = 4; public const int OS_NPC_SIT_NOW = 0; From 4186fa10f0eba3628ef8222db2e4b0e2b69df5cd Mon Sep 17 00:00:00 2001 From: dahlia Date: Mon, 7 May 2012 00:08:56 -0700 Subject: [PATCH 10/17] remove default values from prior commit since mono cant deal with them --- .../Region/Framework/Interfaces/INPCModule.cs | 2 +- .../OptionalModules/World/NPC/NPCModule.cs | 2 +- .../World/NPC/Tests/NPCModuleTests.cs | 4 ++-- .../Shared/Api/Implementation/OSSL_Api.cs | 2 +- bin/PrimMesher.dll | Bin 37376 -> 46592 bytes 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/Framework/Interfaces/INPCModule.cs b/OpenSim/Region/Framework/Interfaces/INPCModule.cs index e071ea3e9e..860483d461 100644 --- a/OpenSim/Region/Framework/Interfaces/INPCModule.cs +++ b/OpenSim/Region/Framework/Interfaces/INPCModule.cs @@ -117,7 +117,7 @@ namespace OpenSim.Region.Framework.Interfaces /// If true, NPC moves with running speed. /// True if the operation succeeded, false if there was no such agent or the agent was not an NPC /// - bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget, bool running = false); + bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget, bool running); /// /// Stop the NPC's current movement. diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index 541ad7d78c..d3456ab61a 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -169,7 +169,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC } } - public bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget, bool running = false) + public bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget, bool running) { lock (m_avatars) { diff --git a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs index a39257e1d0..65dad2d62f 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs @@ -242,7 +242,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos)); Vector3 targetPos = startPos + new Vector3(0, 10, 0); - m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false); + m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false, false); Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos)); //Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0.7071068f, 0.7071068f))); @@ -267,7 +267,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests // Try a second movement startPos = npc.AbsolutePosition; targetPos = startPos + new Vector3(10, 0, 0); - m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false); + m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false, false); Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos)); // Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0, 1))); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 3659687f08..ed9a4e00aa 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -2449,7 +2449,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; Vector3 pos = new Vector3((float) position.x, (float) position.y, (float) position.z); - module.MoveToTarget(npcId, World, pos, false, true); + module.MoveToTarget(npcId, World, pos, false, true, false); } } diff --git a/bin/PrimMesher.dll b/bin/PrimMesher.dll index 249e91c0a5bdb6485e6f937a932aa1887fa28b4e..87022b7cfc21c202beaecb9cf3f26932338f0932 100755 GIT binary patch literal 46592 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 From 40324553322d1cf211eec32041bad5a2dc197f6d Mon Sep 17 00:00:00 2001 From: dahlia Date: Mon, 7 May 2012 00:33:50 -0700 Subject: [PATCH 11/17] add a null check for Primitive.Sculpt in PrimitiveBaseShape constructor for OpenMetaverse.Primitive object --- OpenSim/Framework/PrimitiveBaseShape.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/OpenSim/Framework/PrimitiveBaseShape.cs b/OpenSim/Framework/PrimitiveBaseShape.cs index 1b6a1d2e58..76dcfca726 100644 --- a/OpenSim/Framework/PrimitiveBaseShape.cs +++ b/OpenSim/Framework/PrimitiveBaseShape.cs @@ -241,10 +241,14 @@ namespace OpenSim.Framework m_textureEntry = prim.Textures.GetBytes(); - SculptEntry = (prim.Sculpt.Type != OpenMetaverse.SculptType.None); - SculptData = prim.Sculpt.GetBytes(); - SculptTexture = prim.Sculpt.SculptTexture; - SculptType = (byte)prim.Sculpt.Type; + if (prim.Sculpt != null) + { + SculptEntry = (prim.Sculpt.Type != OpenMetaverse.SculptType.None); + SculptData = prim.Sculpt.GetBytes(); + SculptTexture = prim.Sculpt.SculptTexture; + SculptType = (byte)prim.Sculpt.Type; + } + else SculptType = (byte)OpenMetaverse.SculptType.None; } [XmlIgnore] From cdf97ab3a654581fe5c3f29b1b3a6459c8c73378 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 7 May 2012 17:21:45 +0100 Subject: [PATCH 12/17] Fix a bug in FriendsModule.StatusNotify() where all subsequent friends would not be notified once a non-local friend was found. --- .../Region/CoreModules/Avatar/Friends/FriendsModule.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs index fc6325dc3d..98afbc9159 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs @@ -498,7 +498,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends Util.FireAndForget( delegate { - m_log.DebugFormat("[FRIENDS MODULE]: Notifying {0} friends", friendList.Count); + m_log.DebugFormat( + "[FRIENDS MODULE]: Notifying {0} friends of {1} of online status {2}", + friendList.Count, agentID, online); + // Notify about this user status StatusNotify(friendList, agentID, online); } @@ -515,7 +518,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends { // Try local if (LocalStatusNotification(userID, friendID, online)) - return; + continue; // The friend is not here [as root]. Let's forward. PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { friendID.ToString() }); @@ -523,11 +526,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends { PresenceInfo friendSession = null; foreach (PresenceInfo pinfo in friendSessions) + { if (pinfo.RegionID != UUID.Zero) // let's guard against sessions-gone-bad { friendSession = pinfo; break; } + } if (friendSession != null) { From 5053506d88ac8b06be27ffb404bcc120e3f48241 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 7 May 2012 18:27:33 +0100 Subject: [PATCH 13/17] refactor: Instead of performing a ScenePresence lookup twice over LocateClientObject() and GetClientScene(), do the lookup just once in LocateClientObject() --- .../Avatar/Friends/FriendsModule.cs | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs index 98afbc9159..24ec435d17 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs @@ -448,30 +448,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends /// Find the client for a ID /// public IClientAPI LocateClientObject(UUID agentID) - { - Scene scene = GetClientScene(agentID); - if (scene != null) - { - ScenePresence presence = scene.GetScenePresence(agentID); - if (presence != null) - return presence.ControllingClient; - } - - return null; - } - - /// - /// Find the scene for an agent - /// - private Scene GetClientScene(UUID agentId) { lock (m_Scenes) { foreach (Scene scene in m_Scenes) { - ScenePresence presence = scene.GetScenePresence(agentId); + ScenePresence presence = scene.GetScenePresence(agentID); if (presence != null && !presence.IsChildAgent) - return scene; + return presence.ControllingClient; } } From a82dc263abe5ef2a7221609da14f75d7026f9fbe Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 7 May 2012 19:05:21 +0100 Subject: [PATCH 14/17] For osGetGridNick(), osGetGridName(), osGetGridLoginURI() and osGetGridCustom(), try to read from the [GridInfoService] section on standalone rather than [GridInfo] [GridInfoService] is the section that's actually in bin/config-include/StandaloneCommon.ini.example --- .../Shared/Api/Implementation/OSSL_Api.cs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index ed9a4e00aa..3b67966a1a 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -128,6 +128,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + public const string GridInfoServiceConfigSectionName = "GridInfoService"; + internal IScriptEngine m_ScriptEngine; internal ILSL_Api m_LSL_Api = null; // get a reference to the LSL API so we can call methods housed there internal SceneObjectPart m_host; @@ -2032,8 +2034,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api string nick = String.Empty; IConfigSource config = m_ScriptEngine.ConfigSource; - if (config.Configs["GridInfo"] != null) - nick = config.Configs["GridInfo"].GetString("gridnick", nick); + if (config.Configs[GridInfoServiceConfigSectionName] != null) + nick = config.Configs[GridInfoServiceConfigSectionName].GetString("gridnick", nick); if (String.IsNullOrEmpty(nick)) nick = GridUserInfo(InfoType.Nick); @@ -2049,8 +2051,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api string name = String.Empty; IConfigSource config = m_ScriptEngine.ConfigSource; - if (config.Configs["GridInfo"] != null) - name = config.Configs["GridInfo"].GetString("gridname", name); + if (config.Configs[GridInfoServiceConfigSectionName] != null) + name = config.Configs[GridInfoServiceConfigSectionName].GetString("gridname", name); if (String.IsNullOrEmpty(name)) name = GridUserInfo(InfoType.Name); @@ -2066,8 +2068,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api string loginURI = String.Empty; IConfigSource config = m_ScriptEngine.ConfigSource; - if (config.Configs["GridInfo"] != null) - loginURI = config.Configs["GridInfo"].GetString("login", loginURI); + if (config.Configs[GridInfoServiceConfigSectionName] != null) + loginURI = config.Configs[GridInfoServiceConfigSectionName].GetString("login", loginURI); if (String.IsNullOrEmpty(loginURI)) loginURI = GridUserInfo(InfoType.Login); @@ -2114,8 +2116,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api string retval = String.Empty; IConfigSource config = m_ScriptEngine.ConfigSource; - if (config.Configs["GridInfo"] != null) - retval = config.Configs["GridInfo"].GetString(key, retval); + if (config.Configs[GridInfoServiceConfigSectionName] != null) + retval = config.Configs[GridInfoServiceConfigSectionName].GetString(key, retval); if (String.IsNullOrEmpty(retval)) retval = GridUserInfo(InfoType.Custom, key); From 65c88b2ff4e2616fa5c1d4c5e75298ed1eb1c0d8 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Sun, 29 Apr 2012 08:53:33 +0300 Subject: [PATCH 15/17] Better error handling if Load OAR or Save OAR fail --- .../World/Archiver/ArchiveReadRequest.cs | 20 +++++++++++++++---- .../Archiver/ArchiveWriteRequestExecution.cs | 7 ++++++- .../ArchiveWriteRequestPreparation.cs | 11 +++++++++- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index a6dbaba7d7..e360f938db 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs @@ -200,8 +200,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver } catch (Exception e) { - m_log.ErrorFormat( - "[ARCHIVER]: Aborting load with error in archive file {0}. {1}", filePath, e); + m_log.Error( + String.Format("[ARCHIVER]: Aborting load with error in archive file {0} ", filePath), e); m_errorMessage += e.ToString(); m_scene.EventManager.TriggerOarFileLoaded(m_requestId, m_errorMessage); return; @@ -219,6 +219,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver { m_log.ErrorFormat("[ARCHIVER]: Failed to load {0} assets", failedAssetRestores); m_errorMessage += String.Format("Failed to load {0} assets", failedAssetRestores); + // Continue, because we allow the OAR to be loaded even if some assets fail } } @@ -228,8 +229,19 @@ namespace OpenSim.Region.CoreModules.World.Archiver m_scene.DeleteAllSceneObjects(); } - LoadParcels(serialisedParcels); - LoadObjects(serialisedSceneObjects); + try + { + LoadParcels(serialisedParcels); + LoadObjects(serialisedSceneObjects); + } + catch (Exception e) + { + m_log.Error("[ARCHIVER]: Error loading parcels or objects ", e); + m_errorMessage += e.ToString(); + m_scene.EventManager.TriggerOarFileLoaded(m_requestId, m_errorMessage); + return; + } + m_log.InfoFormat("[ARCHIVER]: Successfully loaded archive"); diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs index c179a34b38..2b40a9eded 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs @@ -87,6 +87,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver { Save(assetsFoundUuids, assetsNotFoundUuids); } + catch (Exception e) + { + m_scene.EventManager.TriggerOarFileSaved(m_requestId, e.ToString()); + throw; + } finally { m_archiveWriter.Close(); @@ -150,4 +155,4 @@ namespace OpenSim.Region.CoreModules.World.Archiver } } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs index eabe46e936..384d81b285 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs @@ -124,6 +124,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver if (options.ContainsKey("noassets") && (bool)options["noassets"]) SaveAssets = false; + // Whether someone else (i.e., ReceivedAllAssets()) is responsible for calling TriggerOarFileSaved() when we're done + bool eventHandled = false; + try { Dictionary assetUuids = new Dictionary(); @@ -230,15 +233,21 @@ namespace OpenSim.Region.CoreModules.World.Archiver m_scene.RegionInfo.ScopeID, options, awre.ReceivedAllAssets); Util.FireAndForget(o => ar.Execute()); + eventHandled = true; } else { awre.ReceivedAllAssets(new List(), new List()); + eventHandled = true; } } - catch (Exception) + catch (Exception e) { m_saveStream.Close(); + + if (!eventHandled) + m_scene.EventManager.TriggerOarFileSaved(m_requestId, e.ToString()); + throw; } } From 15844da3af92fc6e874d6b2df8f5da3b490179ec Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 23 Apr 2012 15:27:04 +0300 Subject: [PATCH 16/17] Log the full exception when errors occur in BaseHttpServer --- .../Servers/HttpServer/BaseHttpServer.cs | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 6fa36b5d15..d0463c8121 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -356,7 +356,7 @@ namespace OpenSim.Framework.Servers.HttpServer } catch (Exception e) { - m_log.ErrorFormat("[BASE HTTP SERVER]: OnRequest() failed with {0}{1}", e.Message, e.StackTrace); + m_log.Error(String.Format("[BASE HTTP SERVER]: OnRequest() failed: {0} ", e.Message), e); } } @@ -551,11 +551,11 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); } catch (IOException e) { - m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}. ", e.Message), e); } return; @@ -658,15 +658,15 @@ namespace OpenSim.Framework.Servers.HttpServer // // An alternative may be to turn off all response write exceptions on the HttpListener, but let's go // with the minimum first - m_log.WarnFormat("[BASE HTTP SERVER]: HandleRequest threw {0}.\nNOTE: this may be spurious on Linux", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: HandleRequest threw {0}.\nNOTE: this may be spurious on Linux ", e.Message), e); } catch (IOException e) { - m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}{1}", e.Message, e.StackTrace); + m_log.Error(String.Format("[BASE HTTP SERVER]: HandleRequest() threw {0} ", e.Message), e); } catch (Exception e) { - m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}{1}", e.Message, e.StackTrace); + m_log.Error(String.Format("[BASE HTTP SERVER]: HandleRequest() threw {0} ", e.Message), e); SendHTML500(response); } finally @@ -933,11 +933,11 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); } catch (IOException e) { - m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0} ", e.Message), e); } } return; @@ -970,11 +970,11 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); } catch (IOException e) { - m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0} ", e.Message), e); } } } @@ -1085,12 +1085,12 @@ namespace OpenSim.Framework.Servers.HttpServer } catch (IOException e) { - m_log.WarnFormat("[BASE HTTP SERVER]: LLSD IOException {0}.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: LLSD IOException {0} ", e.Message), e); } catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER]: LLSD issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: LLSD issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); } } } @@ -1342,8 +1342,8 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException f) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat( - "[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", f); + m_log.Warn( + String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", f.Message), f); } } catch(Exception) @@ -1638,11 +1638,11 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); } catch (IOException e) { - m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0} ", e.Message), e); } } } @@ -1679,7 +1679,7 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); } } } @@ -1715,7 +1715,7 @@ namespace OpenSim.Framework.Servers.HttpServer catch (SocketException e) { // This has to be here to prevent a Linux/Mono crash - m_log.WarnFormat("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); + m_log.Warn(String.Format("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); } } } @@ -1794,7 +1794,7 @@ namespace OpenSim.Framework.Servers.HttpServer public void httpServerException(object source, Exception exception) { - m_log.ErrorFormat("[BASE HTTP SERVER]: {0} had an exception {1}", source.ToString(), exception.ToString()); + m_log.Error(String.Format("[BASE HTTP SERVER]: {0} had an exception: {1} ", source.ToString(), exception.Message), exception); /* if (HTTPDRunning)// && NotSocketErrors > 5) { From 5d1d47e1f9327c29ba26d231c8d18680d06cb1d9 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 7 May 2012 20:01:17 +0100 Subject: [PATCH 17/17] Revert "Better error handling if Load OAR or Save OAR fail" This reverts commit 65c88b2ff4e2616fa5c1d4c5e75298ed1eb1c0d8. Yet again I accidentally committed something whilst evaluating it. --- .../World/Archiver/ArchiveReadRequest.cs | 20 ++++--------------- .../Archiver/ArchiveWriteRequestExecution.cs | 7 +------ .../ArchiveWriteRequestPreparation.cs | 11 +--------- 3 files changed, 6 insertions(+), 32 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index e360f938db..a6dbaba7d7 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs @@ -200,8 +200,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver } catch (Exception e) { - m_log.Error( - String.Format("[ARCHIVER]: Aborting load with error in archive file {0} ", filePath), e); + m_log.ErrorFormat( + "[ARCHIVER]: Aborting load with error in archive file {0}. {1}", filePath, e); m_errorMessage += e.ToString(); m_scene.EventManager.TriggerOarFileLoaded(m_requestId, m_errorMessage); return; @@ -219,7 +219,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver { m_log.ErrorFormat("[ARCHIVER]: Failed to load {0} assets", failedAssetRestores); m_errorMessage += String.Format("Failed to load {0} assets", failedAssetRestores); - // Continue, because we allow the OAR to be loaded even if some assets fail } } @@ -229,19 +228,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver m_scene.DeleteAllSceneObjects(); } - try - { - LoadParcels(serialisedParcels); - LoadObjects(serialisedSceneObjects); - } - catch (Exception e) - { - m_log.Error("[ARCHIVER]: Error loading parcels or objects ", e); - m_errorMessage += e.ToString(); - m_scene.EventManager.TriggerOarFileLoaded(m_requestId, m_errorMessage); - return; - } - + LoadParcels(serialisedParcels); + LoadObjects(serialisedSceneObjects); m_log.InfoFormat("[ARCHIVER]: Successfully loaded archive"); diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs index 2b40a9eded..c179a34b38 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs @@ -87,11 +87,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver { Save(assetsFoundUuids, assetsNotFoundUuids); } - catch (Exception e) - { - m_scene.EventManager.TriggerOarFileSaved(m_requestId, e.ToString()); - throw; - } finally { m_archiveWriter.Close(); @@ -155,4 +150,4 @@ namespace OpenSim.Region.CoreModules.World.Archiver } } } -} +} \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs index 384d81b285..eabe46e936 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs @@ -124,9 +124,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver if (options.ContainsKey("noassets") && (bool)options["noassets"]) SaveAssets = false; - // Whether someone else (i.e., ReceivedAllAssets()) is responsible for calling TriggerOarFileSaved() when we're done - bool eventHandled = false; - try { Dictionary assetUuids = new Dictionary(); @@ -233,21 +230,15 @@ namespace OpenSim.Region.CoreModules.World.Archiver m_scene.RegionInfo.ScopeID, options, awre.ReceivedAllAssets); Util.FireAndForget(o => ar.Execute()); - eventHandled = true; } else { awre.ReceivedAllAssets(new List(), new List()); - eventHandled = true; } } - catch (Exception e) + catch (Exception) { m_saveStream.Close(); - - if (!eventHandled) - m_scene.EventManager.TriggerOarFileSaved(m_requestId, e.ToString()); - throw; } }