From 3d0778bcd6ca6711850257a7d666fc30919e7e66 Mon Sep 17 00:00:00 2001 From: Dev Random Date: Fri, 21 Mar 2014 20:43:26 -0400 Subject: [PATCH 01/40] Allow Mono Plugin Registry setting for Regions Signed-off-by: Melanie --- OpenSim/Framework/PluginLoader.cs | 13 +++++++------ OpenSim/Region/Application/OpenSimBase.cs | 5 ++++- bin/OpenSimDefaults.ini | 6 ++++++ 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/OpenSim/Framework/PluginLoader.cs b/OpenSim/Framework/PluginLoader.cs index 819cb7babb..a2bf9f34ef 100644 --- a/OpenSim/Framework/PluginLoader.cs +++ b/OpenSim/Framework/PluginLoader.cs @@ -215,7 +215,7 @@ namespace OpenSim.Framework AddinManager.AddinLoadError += on_addinloaderror_; AddinManager.AddinLoaded += on_addinloaded_; - clear_registry_(); + clear_registry_(dir); suppress_console_output_(true); AddinManager.Initialize(dir); @@ -239,18 +239,19 @@ namespace OpenSim.Framework + args.Exception.StackTrace); } - private void clear_registry_() + private void clear_registry_(string dir) { // The Mono addin manager (in Mono.Addins.dll version 0.2.0.0) // occasionally seems to corrupt its addin cache // Hence, as a temporary solution we'll remove it before each startup + try { - if (Directory.Exists("addin-db-000")) - Directory.Delete("addin-db-000", true); + if (Directory.Exists(dir + "/addin-db-000")) + Directory.Delete(dir + "/addin-db-000", true); - if (Directory.Exists("addin-db-001")) - Directory.Delete("addin-db-001", true); + if (Directory.Exists(dir + "/addin-db-001")) + Directory.Delete(dir + "/addin-db-001", true); } catch (IOException) { diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 0dc9306536..8a279675ff 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -158,7 +158,10 @@ namespace OpenSim protected virtual void LoadPlugins() { - using (PluginLoader loader = new PluginLoader(new ApplicationPluginInitialiser(this))) + IConfig startupConfig = Config.Configs["Startup"]; + string registryLocation = (startupConfig != null) ? startupConfig.GetString("RegistryLocation",".") : "."; + + using (PluginLoader loader = new PluginLoader(new ApplicationPluginInitialiser(this), registryLocation)) { loader.Load("/OpenSim/Startup"); m_plugins = loader.Plugins; diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index d8474d3d37..4f2563c297 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -57,6 +57,12 @@ ; when running with the SmartThreadPool option above MaxPoolThreads = 15 + ; Plugin Registry Location + ; Set path to directory for plugin registry. Information about the + ; registered repositories and installed plugins will be stored here. + ; The OpenSim.exe process must have R/W access to the location. + ; RegistryLocation = "." + ; ## ; ## CLIENTS ; ## From a4d322dcd1d7f7796180d63b9d9f7405332577c7 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sat, 22 Mar 2014 01:47:48 +0000 Subject: [PATCH 02/40] Allow the setting from the environment to take effect if no explicit setting is given. This is done by calling the constructor only with a directory if one is actually given. --- OpenSim/Region/Application/OpenSimBase.cs | 24 ++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 8a279675ff..9d36986e73 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -159,12 +159,26 @@ namespace OpenSim protected virtual void LoadPlugins() { IConfig startupConfig = Config.Configs["Startup"]; - string registryLocation = (startupConfig != null) ? startupConfig.GetString("RegistryLocation",".") : "."; + string registryLocation = (startupConfig != null) ? startupConfig.GetString("RegistryLocation", String.Empty) : String.Empty; - using (PluginLoader loader = new PluginLoader(new ApplicationPluginInitialiser(this), registryLocation)) + // The location can also be specified in the environment. If there + // is no location in the configuration, we must call the constructor + // without a location parameter to allow that to happen. + if (registryLocation == String.Empty) { - loader.Load("/OpenSim/Startup"); - m_plugins = loader.Plugins; + using (PluginLoader loader = new PluginLoader(new ApplicationPluginInitialiser(this))) + { + loader.Load("/OpenSim/Startup"); + m_plugins = loader.Plugins; + } + } + else + { + using (PluginLoader loader = new PluginLoader(new ApplicationPluginInitialiser(this), registryLocation)) + { + loader.Load("/OpenSim/Startup"); + m_plugins = loader.Plugins; + } } } @@ -1052,4 +1066,4 @@ namespace OpenSim { public IConfigSource Source; } -} \ No newline at end of file +} From d4dad75a3c73fdfd4f156e1684d04f13b92f2362 Mon Sep 17 00:00:00 2001 From: Vegaslon Date: Sat, 22 Mar 2014 15:03:13 -0400 Subject: [PATCH 03/40] BulletSim: Fix jumping while running. Was unintentional taking way all upward target motion for avatar when running. Signed-off-by: Michael Cerquoni --- OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs index fc1896027d..c9b134cc4e 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs @@ -426,7 +426,7 @@ public sealed class BSCharacter : BSPhysObject m_targetVelocity = value; OMV.Vector3 targetVel = value; if (_setAlwaysRun && !_flying) - targetVel *= new OMV.Vector3(BSParam.AvatarAlwaysRunFactor, BSParam.AvatarAlwaysRunFactor, 0f); + targetVel *= new OMV.Vector3(BSParam.AvatarAlwaysRunFactor, BSParam.AvatarAlwaysRunFactor, 1f); if (m_moveActor != null) m_moveActor.SetVelocityAndTarget(RawVelocity, targetVel, false /* inTaintTime */); From 58def34dbe01af970ca0cbd7362aa24cd85fc43d Mon Sep 17 00:00:00 2001 From: Kevin Cozens Date: Sun, 16 Jun 2013 12:00:58 -0400 Subject: [PATCH 04/40] Set default name for mute list module as shown in OpenSim.ini.example --- .../Region/CoreModules/Avatar/InstantMessage/MuteListModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MuteListModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MuteListModule.cs index 7ce2813139..a08756960d 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MuteListModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MuteListModule.cs @@ -58,7 +58,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage return; } - if (cnf != null && cnf.GetString("MuteListModule", "None") != + if (cnf != null && cnf.GetString("MuteListModule", "MuteListModule") != "MuteListModule") { enabled = false; From fe16a72a9a10c5b9057351f798d9098ada3002ae Mon Sep 17 00:00:00 2001 From: Kevin Cozens Date: Tue, 22 Oct 2013 15:43:18 -0400 Subject: [PATCH 05/40] Pass method to offline.php using ?blah instead of /blah/. Avoids issue with Apache web servers running PHP via CGI. --- .../CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs index 7f3d0a2584..5900e219ac 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs @@ -179,7 +179,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage List msglist = SynchronousRestObjectRequester.MakeRequest>( - "POST", m_RestURL + "/RetrieveMessages/", client.AgentId); + "POST", m_RestURL + "?RetrieveMessages", client.AgentId); if (msglist == null) { @@ -231,7 +231,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage scene = m_SceneList[0]; bool success = SynchronousRestObjectRequester.MakeRequest( - "POST", m_RestURL+"/SaveMessage/", im); + "POST", m_RestURL+"?SaveMessage", im); if (im.dialog == (byte)InstantMessageDialog.MessageFromAgent) { From 949139eb0b7260c3455cf84c6b8f760fab32736c Mon Sep 17 00:00:00 2001 From: Kevin Cozens Date: Sat, 22 Mar 2014 15:57:32 -0400 Subject: [PATCH 06/40] Moved Kevin Cozens to the core developers list. --- CONTRIBUTORS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 0d96ed6595..f6071f241f 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -17,6 +17,7 @@ people that make the day to day of OpenSim happen. * Snoopy Pfeffer * Robert Adams (Intel) * Oren Hurvitz (Kitely) +* Kevin Cozens = Core Developers Following the White Rabbit = Core developers who have temporarily (we hope) gone chasing the white rabbit. @@ -111,7 +112,6 @@ what it is today. * Jon Cundill * Junta Kohime * Kayne -* Kevin Cozens * kinoc (Daxtron Labs) * Kira * Kitto Flora From 58d7e3b8ed24b2f7c68c7943b2b7a7a96c6a1565 Mon Sep 17 00:00:00 2001 From: Kevin Cozens Date: Sat, 22 Mar 2014 16:22:36 -0400 Subject: [PATCH 07/40] Reverting "Pass method to offline.php" commit that was pushed by mistake. This reverts commit fe16a72a9a10c5b9057351f798d9098ada3002ae. --- .../CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs index 5900e219ac..7f3d0a2584 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs @@ -179,7 +179,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage List msglist = SynchronousRestObjectRequester.MakeRequest>( - "POST", m_RestURL + "?RetrieveMessages", client.AgentId); + "POST", m_RestURL + "/RetrieveMessages/", client.AgentId); if (msglist == null) { @@ -231,7 +231,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage scene = m_SceneList[0]; bool success = SynchronousRestObjectRequester.MakeRequest( - "POST", m_RestURL+"?SaveMessage", im); + "POST", m_RestURL+"/SaveMessage/", im); if (im.dialog == (byte)InstantMessageDialog.MessageFromAgent) { From ff5c38534d3bedbe10547409064f3410246bb9e6 Mon Sep 17 00:00:00 2001 From: Kevin Cozens Date: Sat, 22 Mar 2014 16:38:11 -0400 Subject: [PATCH 08/40] Reverting "Set default name for mute list" that was pushed by mistake. This reverts commit 58def34dbe01af970ca0cbd7362aa24cd85fc43d. --- .../Region/CoreModules/Avatar/InstantMessage/MuteListModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MuteListModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MuteListModule.cs index a08756960d..7ce2813139 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MuteListModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MuteListModule.cs @@ -58,7 +58,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage return; } - if (cnf != null && cnf.GetString("MuteListModule", "MuteListModule") != + if (cnf != null && cnf.GetString("MuteListModule", "None") != "MuteListModule") { enabled = false; From db83208794fe6bef3e2d7f0574739c48fd36edc5 Mon Sep 17 00:00:00 2001 From: Dev Random Date: Sat, 22 Mar 2014 21:47:23 -0400 Subject: [PATCH 09/40] Fix negative stat for Active Scripts Signed-off-by: Michael Cerquoni --- .../CoreModules/Avatar/Attachments/AttachmentsModule.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 1ca142e62c..c3846d9db6 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -245,8 +245,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments string state = sog.GetStateSnapshot(); ad.AttachmentObjectStates.Add(state); sp.InTransitScriptStates.Add(state); - // Let's remove the scripts of the original object here - sog.RemoveScriptInstances(true); + + // Scripts of the originals will be removed when the Agent is successfully removed. + // sog.RemoveScriptInstances(true); } } } From 81c9952e99d7647872649512d5a8564fb78f3baa Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Sun, 23 Mar 2014 16:40:09 +0200 Subject: [PATCH 10/40] Added missing quotes in Robust.HG.ini.example --- bin/Robust.HG.ini.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example index 245f363b38..91ea42a75d 100644 --- a/bin/Robust.HG.ini.example +++ b/bin/Robust.HG.ini.example @@ -634,7 +634,7 @@ HGAssetServiceConnector = "HGAssetService@8002/OpenSim.Server.Handlers.dll:Asset ;; ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=*****;Old Guids=true;" ;; Realm = UserProfiles UserAccountService = OpenSim.Services.UserAccountService.dll:UserAccountService - AuthenticationServiceModule = "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService + AuthenticationServiceModule = "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService" [BakedTextureService] LocalServiceModule = "OpenSim.Server.Handlers.dll:XBakes" From b0cb0ec02f5f567539b340727727bee1a43836e6 Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Sun, 23 Mar 2014 13:08:31 -0700 Subject: [PATCH 11/40] BulletSim: fix problem where axis constraints were also constraining linear motion. The code was limiting linear motion to be only in the positive direction for any axis that was constrained. --- OpenSim/Region/Physics/BulletSPlugin/BSActorLockAxis.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActorLockAxis.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActorLockAxis.cs index 8b0fdeb7f2..7e610075ee 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSActorLockAxis.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSActorLockAxis.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) Contributors, http://opensimulator.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * @@ -121,8 +121,10 @@ public class BSActorLockAxis : BSActor // The constraint is tied to the world and oriented to the prim. // Free to move linearly in the region - OMV.Vector3 linearLow = OMV.Vector3.Zero; - OMV.Vector3 linearHigh = m_physicsScene.TerrainManager.DefaultRegionSize; + // OMV.Vector3 linearLow = OMV.Vector3.Zero; + // OMV.Vector3 linearHigh = m_physicsScene.TerrainManager.DefaultRegionSize; + OMV.Vector3 linearLow = new OMV.Vector3(-10000f, -10000f, -10000f); + OMV.Vector3 linearHigh = new OMV.Vector3(10000f, 10000f, 10000f); if (m_controllingPrim.LockedLinearAxis.X != BSPhysObject.FreeAxis) { linearLow.X = m_controllingPrim.RawPosition.X; From 62b3bdf0fc7a64dd9b845eb27fa8e1a2a1866c2b Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Thu, 24 Oct 2013 11:18:15 +0300 Subject: [PATCH 12/40] When linking two groups, and then deleting the combined group: delete *all* of the combined group's prims, including those that came from the second subgroup This fixes http://opensimulator.org/mantis/view.php?id=6175 --- OpenSim/Region/Framework/Scenes/Scene.cs | 12 +++--- .../Framework/Scenes/SceneObjectGroup.cs | 38 +++++++++++++++---- .../Scenes/Tests/SceneObjectLinkingTests.cs | 8 ++-- 3 files changed, 41 insertions(+), 17 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index d16b73bbc0..08a230112c 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1757,6 +1757,7 @@ namespace OpenSim.Region.Framework.Scenes { if (group != null) { + group.HasGroupChanged = true; group.ProcessBackup(SimulationDataService, true); } } @@ -2345,13 +2346,12 @@ namespace OpenSim.Region.Framework.Scenes { if (!softDelete) { - // Force a database update so that the scene object group ID is accurate. It's possible that the - // group has recently been delinked from another group but that this change has not been persisted - // to the DB. + // If the group contains prims whose SceneGroupID is incorrect then force a + // database update, because RemoveObject() works by searching on the SceneGroupID. // This is an expensive thing to do so only do it if absolutely necessary. - if (so.HasGroupChangedDueToDelink) - ForceSceneObjectBackup(so); - + if (so.GroupContainsForeignPrims) + ForceSceneObjectBackup(so); + so.DetachFromBackup(); SimulationDataService.RemoveObject(so.UUID, RegionInfo.RegionID); } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 6f2617602e..a78a0cb027 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -150,12 +150,27 @@ namespace OpenSim.Region.Framework.Scenes get { return m_hasGroupChanged; } } + + private bool m_groupContainsForeignPrims = false; /// - /// Has the group changed due to an unlink operation? We record this in order to optimize deletion, since - /// an unlinked group currently has to be persisted to the database before we can perform an unlink operation. + /// Whether the group contains prims that came from a different group. This happens when + /// linking or delinking groups. The implication is that until the group is persisted, + /// the prims in the database still use the old SceneGroupID. That's a problem if the group + /// is deleted, because we delete groups by searching for prims by their SceneGroupID. /// - public bool HasGroupChangedDueToDelink { get; private set; } + public bool GroupContainsForeignPrims + { + private set + { + m_groupContainsForeignPrims = value; + if (m_groupContainsForeignPrims) + HasGroupChanged = true; + } + + get { return m_groupContainsForeignPrims; } + } + private bool isTimeToPersist() { @@ -1624,7 +1639,7 @@ namespace OpenSim.Region.Framework.Scenes backup_group.RootPart.AngularVelocity = RootPart.AngularVelocity; backup_group.RootPart.ParticleSystem = RootPart.ParticleSystem; HasGroupChanged = false; - HasGroupChangedDueToDelink = false; + GroupContainsForeignPrims = false; m_scene.EventManager.TriggerOnSceneObjectPreSave(backup_group, this); datastore.StoreObject(backup_group, m_scene.RegionInfo.RegionID); @@ -2388,6 +2403,8 @@ namespace OpenSim.Region.Framework.Scenes // If linking prims with different permissions, fix them AdjustChildPrimPermissions(); + GroupContainsForeignPrims = true; + AttachToBackup(); // Here's the deal, this is ABSOLUTELY CRITICAL so the physics scene gets the update about the @@ -2531,9 +2548,16 @@ namespace OpenSim.Region.Framework.Scenes linkPart.Rezzed = RootPart.Rezzed; - // When we delete a group, we currently have to force persist to the database if the object id has changed - // (since delete works by deleting all rows which have a given object id) - objectGroup.HasGroupChangedDueToDelink = true; + // We must persist the delinked group to the database immediately, for safety. The problem + // is that although in memory the new group has a new SceneGroupID, in the database it + // still has the parent group's SceneGroupID (until the next backup). This means that if the + // parent group is deleted then the delinked group will also be deleted from the database. + // This problem will disappear if the region remains alive long enough for another backup, + // since at that time the delinked group's new SceneGroupID will be written to the database. + // But if the region crashes before that then the prims will be permanently gone, and this must + // not happen. (We can't use a just-in-time trick like GroupContainsForeignPrims in this case + // because the delinked group doesn't know when the source group is deleted.) + m_scene.ForceSceneObjectBackup(objectGroup); return objectGroup; } diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs index 9378e2010d..fa8277cc7b 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs @@ -143,7 +143,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(grp1.Parts.Length, Is.EqualTo(1), "Group 1 still contained part2 after delink."); Assert.That(part2.AbsolutePosition == Vector3.Zero, "The absolute position should be zero"); - Assert.That(grp3.HasGroupChangedDueToDelink, Is.True); + Assert.That(grp3.GroupContainsForeignPrims, Is.True); } [Test] @@ -349,10 +349,10 @@ namespace OpenSim.Region.Framework.Scenes.Tests // These changes should occur immediately without waiting for a backup pass SceneObjectGroup groupToDelete = sog.DelinkFromGroup(linkPart, false); - - Assert.That(groupToDelete.HasGroupChangedDueToDelink, Is.True); + + Assert.That(groupToDelete.GroupContainsForeignPrims, Is.True); scene.DeleteSceneObject(groupToDelete, false); - Assert.That(groupToDelete.HasGroupChangedDueToDelink, Is.False); + Assert.That(groupToDelete.GroupContainsForeignPrims, Is.False); List storedObjects = scene.SimulationDataService.LoadObjects(scene.RegionInfo.RegionID); From 773ffcafc3dbbda29534b26d0a4813e1cf422a79 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Thu, 24 Oct 2013 12:21:20 +0300 Subject: [PATCH 13/40] Removed "hacktastic" code that is no longer needed. We no longer set the object's AbsolutePosition in this place, so the IsAttachment hack doesn't do anything anymore. This resolves http://opensimulator.org/mantis/view.php?id=6936 --- .../Framework/Scenes/SceneObjectGroup.cs | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index a78a0cb027..b70e9df0ac 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -1701,28 +1701,7 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectGroup dupe = (SceneObjectGroup)MemberwiseClone(); dupe.Backup = false; dupe.m_parts = new MapAndArray(); - - // Warning, The following code related to previousAttachmentStatus is needed so that clones of - // attachments do not bordercross while they're being duplicated. This is hacktastic! - // Normally, setting AbsolutePosition will bordercross a prim if it's outside the region! - // unless IsAttachment is true!, so to prevent border crossing, we save it's attachment state - // (which should be false anyway) set it as an Attachment and then set it's Absolute Position, - // then restore it's attachment state - - // This is only necessary when userExposed is false! - - bool previousAttachmentStatus = dupe.IsAttachment; - - if (!userExposed) - dupe.IsAttachment = true; - dupe.m_sittingAvatars = new List(); - - if (!userExposed) - { - dupe.IsAttachment = previousAttachmentStatus; - } - dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed); dupe.m_rootPart.LinkNum = m_rootPart.LinkNum; From 6734b94761a4a8b1d03ea97fd6832c51af32bd8c Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Wed, 30 Oct 2013 15:10:29 +0200 Subject: [PATCH 14/40] Better error messages This resolves http://opensimulator.org/mantis/view.php?id=6936 --- .../HGGroupsServiceRobustConnector.cs | 4 +-- .../Remote/GroupsServiceRobustConnector.cs | 2 +- .../Remote/OfflineIMServiceRobustConnector.cs | 2 +- .../Shared/Instance/ScriptInstance.cs | 11 ++++--- OpenSim/Server/Base/ServerUtils.cs | 6 ++-- .../Inventory/XInventoryInConnector.cs | 2 +- .../Neighbour/NeighbourServicesConnector.cs | 30 +++++++++---------- 7 files changed, 28 insertions(+), 29 deletions(-) diff --git a/OpenSim/Addons/Groups/Hypergrid/HGGroupsServiceRobustConnector.cs b/OpenSim/Addons/Groups/Hypergrid/HGGroupsServiceRobustConnector.cs index d2bcba5c4b..dc36787836 100644 --- a/OpenSim/Addons/Groups/Hypergrid/HGGroupsServiceRobustConnector.cs +++ b/OpenSim/Addons/Groups/Hypergrid/HGGroupsServiceRobustConnector.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) Contributors, http://opensimulator.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * @@ -158,7 +158,7 @@ namespace OpenSim.Groups } catch (Exception e) { - m_log.DebugFormat("[Groups.RobustHGConnector]: Exception {0}", e.StackTrace); + m_log.Error(string.Format("[Groups.RobustHGConnector]: Exception {0} ", e.Message), e); } return FailureResult(); diff --git a/OpenSim/Addons/Groups/Remote/GroupsServiceRobustConnector.cs b/OpenSim/Addons/Groups/Remote/GroupsServiceRobustConnector.cs index 249d974630..616afa9061 100644 --- a/OpenSim/Addons/Groups/Remote/GroupsServiceRobustConnector.cs +++ b/OpenSim/Addons/Groups/Remote/GroupsServiceRobustConnector.cs @@ -140,7 +140,7 @@ namespace OpenSim.Groups } catch (Exception e) { - m_log.DebugFormat("[GROUPS HANDLER]: Exception {0}", e.StackTrace); + m_log.Error(string.Format("[GROUPS HANDLER]: Exception {0} ", e.Message), e); } return FailureResult(); diff --git a/OpenSim/Addons/OfflineIM/Remote/OfflineIMServiceRobustConnector.cs b/OpenSim/Addons/OfflineIM/Remote/OfflineIMServiceRobustConnector.cs index 13b0e7e6a8..ed5c742b78 100644 --- a/OpenSim/Addons/OfflineIM/Remote/OfflineIMServiceRobustConnector.cs +++ b/OpenSim/Addons/OfflineIM/Remote/OfflineIMServiceRobustConnector.cs @@ -109,7 +109,7 @@ namespace OpenSim.OfflineIM } catch (Exception e) { - m_log.DebugFormat("[OFFLINE IM HANDLER]: Exception {0}", e.StackTrace); + m_log.Error(string.Format("[OFFLINE IM HANDLER]: Exception {0} ", e.Message), e); } return FailureResult(); diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 6264f5d75c..978e5671da 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -897,15 +897,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance Part.Name, Part.UUID, false); - m_log.DebugFormat( - "[SCRIPT INSTANCE]: Runtime error in script {0}, part {1} {2} at {3} in {4}, displayed error {5}, actual exception {6}", + m_log.Debug(string.Format( + "[SCRIPT INSTANCE]: Runtime error in script {0}, part {1} {2} at {3} in {4} ", ScriptName, PrimName, Part.UUID, Part.AbsolutePosition, - Part.ParentGroup.Scene.Name, - text.Replace("\n", "\\n"), - e.InnerException); + Part.ParentGroup.Scene.Name), + e); } catch (Exception) { @@ -1220,4 +1219,4 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance return null; } } -} \ No newline at end of file +} diff --git a/OpenSim/Server/Base/ServerUtils.cs b/OpenSim/Server/Base/ServerUtils.cs index 08ba50d488..c92e23ca1b 100644 --- a/OpenSim/Server/Base/ServerUtils.cs +++ b/OpenSim/Server/Base/ServerUtils.cs @@ -280,11 +280,11 @@ namespace OpenSim.Server.Base { if (!(e is System.MissingMethodException)) { - m_log.ErrorFormat("[SERVER UTILS]: Error loading plugin {0} from {1}. Exception: {2}, {3}", + m_log.Error(string.Format("[SERVER UTILS]: Error loading plugin {0} from {1}. Exception: {2}", interfaceName, dllName, - e.InnerException == null ? e.Message : e.InnerException.Message, - e.StackTrace); + e.InnerException == null ? e.Message : e.InnerException.Message), + e); } m_log.ErrorFormat("[SERVER UTILS]: Error loading plugin {0}: {1} args.Length {2}", dllName, e.Message, args.Length); return null; diff --git a/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs b/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs index 0d7c13669c..5df3ddaee9 100644 --- a/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs +++ b/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs @@ -155,7 +155,7 @@ namespace OpenSim.Server.Handlers.Asset } catch (Exception e) { - m_log.ErrorFormat("[XINVENTORY HANDLER]: Exception {0}", e.StackTrace); + m_log.Error(string.Format("[XINVENTORY HANDLER]: Exception {0} ", e.Message), e); } return FailureResult(); diff --git a/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs b/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs index 0f8033d614..eecf096e2f 100644 --- a/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs +++ b/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs @@ -97,9 +97,9 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.WarnFormat( - "[NEIGHBOUR SERVICES CONNECTOR]: Unable to parse uri {0} to send HelloNeighbour from {1} to {2}. Exception {3}{4}", - uri, thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace); + m_log.Warn(string.Format( + "[NEIGHBOUR SERVICES CONNECTOR]: Unable to parse uri {0} to send HelloNeighbour from {1} to {2}. Exception {3} ", + uri, thisRegion.RegionName, region.RegionName, e.Message), e); return false; } @@ -116,9 +116,9 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.WarnFormat( - "[NEIGHBOUR SERVICES CONNECTOR]: PackRegionInfoData failed for HelloNeighbour from {0} to {1}. Exception {2}{3}", - thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace); + m_log.Warn(string.Format( + "[NEIGHBOUR SERVICES CONNECTOR]: PackRegionInfoData failed for HelloNeighbour from {0} to {1}. Exception {2} ", + thisRegion.RegionName, region.RegionName, e.Message), e); return false; } @@ -136,9 +136,9 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.WarnFormat( - "[NEIGHBOUR SERVICES CONNECTOR]: Exception thrown on serialization of HelloNeighbour from {0} to {1}. Exception {2}{3}", - thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace); + m_log.Warn(string.Format( + "[NEIGHBOUR SERVICES CONNECTOR]: Exception thrown on serialization of HelloNeighbour from {0} to {1}. Exception {2} ", + thisRegion.RegionName, region.RegionName, e.Message), e); return false; } @@ -153,9 +153,9 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.WarnFormat( - "[NEIGHBOUR SERVICES CONNECTOR]: Unable to send HelloNeighbour from {0} to {1}. Exception {2}{3}", - thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace); + m_log.Warn(string.Format( + "[NEIGHBOUR SERVICES CONNECTOR]: Unable to send HelloNeighbour from {0} to {1} (uri {2}). Exception {3} ", + thisRegion.RegionName, region.RegionName, uri, e.Message), e); return false; } @@ -192,9 +192,9 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.WarnFormat( - "[NEIGHBOUR SERVICES CONNECTOR]: Exception on reply of DoHelloNeighbourCall from {0} back to {1}. Exception {2}{3}", - region.RegionName, thisRegion.RegionName, e.Message, e.StackTrace); + m_log.Warn(string.Format( + "[NEIGHBOUR SERVICES CONNECTOR]: Exception on reply of DoHelloNeighbourCall from {0} back to {1}. Exception {2} ", + region.RegionName, thisRegion.RegionName, e.Message), e); return false; } From 921f0052f43e0e4553e970a8d560c5635fcd3ca6 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Sun, 8 Dec 2013 16:50:24 +0200 Subject: [PATCH 15/40] Get the full viewer name even if it's (incorrectly) sent in the 'Channel' field Recent versions of Firestorm and Singularity have started sending the viewer name in the 'Channel' field, leaving only their version number in the 'Viewer' field. So we need to search both of these fields for the viewer name. This resolves http://opensimulator.org/mantis/view.php?id=6952 --- OpenSim/Framework/Util.cs | 32 +++++++++++++++++++ OpenSim/Region/Application/OpenSim.cs | 2 +- OpenSim/Region/Framework/Scenes/Scene.cs | 9 +++--- .../Region/Framework/Scenes/ScenePresence.cs | 2 +- .../Agent/UDP/Linden/LindenUDPInfoModule.cs | 4 +-- .../HypergridService/GatekeeperService.cs | 12 ++++--- 6 files changed, 48 insertions(+), 13 deletions(-) diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index efaed6220c..5805dc8389 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs @@ -2288,6 +2288,38 @@ namespace OpenSim.Framework { return str.Replace("_", "\\_").Replace("%", "\\%"); } + + /// + /// Returns the name of the user's viewer. + /// + /// + /// This method handles two ways that viewers specify their name: + /// 1. Viewer = "Firestorm-Release 4.4.2.34167", Channel = "(don't care)" -> "Firestorm-Release 4.4.2.34167" + /// 2. Viewer = "4.5.1.38838", Channel = "Firestorm-Beta" -> "Firestorm-Beta 4.5.1.38838" + /// + public static string GetViewerName(AgentCircuitData agent) + { + string name = agent.Viewer; + if (name == null) + name = ""; + else + name = name.Trim(); + + // Check if 'Viewer' is just a version number. If it's *not*, then we + // assume that it contains the real viewer name, and we return it. + foreach (char c in name) + { + if (Char.IsLetter(c)) + return name; + } + + // The 'Viewer' string contains just a version number. If there's anything in + // 'Channel' then assume that it's the viewer name. + if ((agent.Channel != null) && (agent.Channel.Length > 0)) + name = agent.Channel.Trim() + " " + name; + + return name; + } } public class DoubleQueue where T:class diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 6d3331b0ad..5c3039d9d9 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -982,7 +982,7 @@ namespace OpenSim aCircuit.child ? "child" : "root", aCircuit.circuitcode.ToString(), aCircuit.IPAddress != null ? aCircuit.IPAddress.ToString() : "not set", - aCircuit.Viewer); + Util.GetViewerName(aCircuit)); }); MainConsole.Instance.Output(cdt.ToString()); diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 08a230112c..51f6c5e6b8 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -3413,6 +3413,7 @@ namespace OpenSim.Region.Framework.Scenes // TeleportFlags.ViaLandmark | TeleportFlags.ViaLocation | TeleportFlags.ViaLandmark | TeleportFlags.Default - Regular Teleport // Don't disable this log message - it's too helpful + string curViewer = Util.GetViewerName(acd); m_log.DebugFormat( "[SCENE]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, IP {6}, viewer {7}, teleportflags ({8}), position {9})", RegionInfo.RegionName, @@ -3422,7 +3423,7 @@ namespace OpenSim.Region.Framework.Scenes acd.AgentID, acd.circuitcode, acd.IPAddress, - acd.Viewer, + curViewer, ((TPFlags)teleportFlags).ToString(), acd.startpos ); @@ -3442,7 +3443,7 @@ namespace OpenSim.Region.Framework.Scenes { foreach (string viewer in m_AllowedViewers) { - if (viewer == acd.Viewer.Substring(0, viewer.Length).Trim().ToLower()) + if (viewer == curViewer.Substring(0, viewer.Length).Trim().ToLower()) { ViewerDenied = false; break; @@ -3459,7 +3460,7 @@ namespace OpenSim.Region.Framework.Scenes { foreach (string viewer in m_BannedViewers) { - if (viewer == acd.Viewer.Substring(0, viewer.Length).Trim().ToLower()) + if (viewer == curViewer.Substring(0, viewer.Length).Trim().ToLower()) { ViewerDenied = true; break; @@ -3471,7 +3472,7 @@ namespace OpenSim.Region.Framework.Scenes { m_log.DebugFormat( "[SCENE]: Access denied for {0} {1} using {2}", - acd.firstname, acd.lastname, acd.Viewer); + acd.firstname, acd.lastname, curViewer); reason = "Access denied, your viewer is banned by the region owner"; return false; } diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 491d0bf380..64c464d761 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -848,7 +848,7 @@ namespace OpenSim.Region.Framework.Scenes public string Viewer { - get { return m_scene.AuthenticateHandler.GetAgentCircuitData(ControllingClient.CircuitCode).Viewer; } + get { return Util.GetViewerName(m_scene.AuthenticateHandler.GetAgentCircuitData(ControllingClient.CircuitCode)); } } #endregion diff --git a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs index ec18db0aa8..44d4e93466 100644 --- a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs +++ b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs @@ -669,7 +669,7 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden aCircuit = new AgentCircuitData(); if (!llClient.SceneAgent.IsChildAgent) - m_log.InfoFormat("[INFO]: {0} # {1} # {2}", llClient.Name, aCircuit.Viewer, aCircuit.Id0); + m_log.InfoFormat("[INFO]: {0} # {1} # {2}", llClient.Name, Util.GetViewerName(aCircuit), aCircuit.Id0); int avg_reqs = cinfo.AsyncRequests.Values.Sum() + cinfo.GenericRequests.Values.Sum() + cinfo.SyncRequests.Values.Sum(); avg_reqs = avg_reqs / ((DateTime.Now - cinfo.StartedTime).Minutes + 1); @@ -706,4 +706,4 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden m_log.InfoFormat("[INFO]: {0,25} {1,-6}", "Total", sum); } } -} \ No newline at end of file +} diff --git a/OpenSim/Services/HypergridService/GatekeeperService.cs b/OpenSim/Services/HypergridService/GatekeeperService.cs index f6136b5843..7a0228b75e 100644 --- a/OpenSim/Services/HypergridService/GatekeeperService.cs +++ b/OpenSim/Services/HypergridService/GatekeeperService.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) Contributors, http://opensimulator.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * @@ -228,17 +228,19 @@ namespace OpenSim.Services.HypergridService aCircuit.firstname, aCircuit.lastname, authURL, aCircuit.AgentID, destination.RegionName, aCircuit.Viewer, aCircuit.Channel, aCircuit.IPAddress, aCircuit.Mac, aCircuit.Id0, aCircuit.teleportFlags.ToString()); + string curViewer = Util.GetViewerName(aCircuit); + // // Check client // if (m_AllowedClients != string.Empty) { Regex arx = new Regex(m_AllowedClients); - Match am = arx.Match(aCircuit.Viewer); + Match am = arx.Match(curViewer); if (!am.Success) { - m_log.InfoFormat("[GATEKEEPER SERVICE]: Login failed, reason: client {0} is not allowed", aCircuit.Viewer); + m_log.InfoFormat("[GATEKEEPER SERVICE]: Login failed, reason: client {0} is not allowed", curViewer); return false; } } @@ -246,11 +248,11 @@ namespace OpenSim.Services.HypergridService if (m_DeniedClients != string.Empty) { Regex drx = new Regex(m_DeniedClients); - Match dm = drx.Match(aCircuit.Viewer); + Match dm = drx.Match(curViewer); if (dm.Success) { - m_log.InfoFormat("[GATEKEEPER SERVICE]: Login failed, reason: client {0} is denied", aCircuit.Viewer); + m_log.InfoFormat("[GATEKEEPER SERVICE]: Login failed, reason: client {0} is denied", curViewer); return false; } } From 425d76bb982c6fb41554a50035b8fce9350078ca Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Tue, 3 Dec 2013 09:08:35 +0200 Subject: [PATCH 16/40] Enable runprebuild.bat to run in Cygwin This resolves http://opensimulator.org/mantis/view.php?id=6951 --- runprebuild.bat | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/runprebuild.bat b/runprebuild.bat index 5f75982e79..ed2def1d57 100755 --- a/runprebuild.bat +++ b/runprebuild.bat @@ -7,11 +7,19 @@ setlocal ENABLEEXTENSIONS set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0" set VALUE_NAME=MSBuildToolsPath -rem We have to use find here as req query spits out 4 lines before Windows 7 -rem But 2 lines after Windows 7. Unfortunately, this screws up cygwin -rem as it uses its own find command. This could be fixed but it could be -rem complex to find the location of find on all windows systems -FOR /F "usebackq tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul ^| FIND "%VALUE_NAME%"`) DO ( +rem We have to use grep or find to locate the correct line, because reg query spits +rem out 4 lines before Windows 7 but 2 lines after Windows 7. +rem We use grep if it's on the path; otherwise we use the built-in find command +rem from Windows. (We must use grep on Cygwin because it overrides the "find" command.) + +for %%X in (grep.exe) do (set FOUNDGREP=%%~$PATH:X) +if defined FOUNDGREP ( + set FINDCMD=grep +) else ( + set FINDCMD=find +) + +FOR /F "usebackq tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul ^| %FINDCMD% "%VALUE_NAME%"`) DO ( set ValueName=%%A set ValueType=%%B set ValueValue=%%C From f5ae36d7e25a20199d676e53a066be79f76b580d Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Tue, 3 Dec 2013 08:47:47 +0200 Subject: [PATCH 17/40] Updated Prebuild to support .NET 4.5 Resolves http://opensimulator.org/mantis/view.php?id=6951 --- Prebuild/prebuild.xml | 8 +- Prebuild/src/Core/Kernel.cs | 2 +- Prebuild/src/Core/Nodes/ProjectNode.cs | 10 +- Prebuild/src/Core/Targets/VS2010Target.cs | 4 +- Prebuild/src/Properties/AssemblyInfo.cs | 4 +- Prebuild/src/data/prebuild-1.10.xsd | 338 ++++++++++++++++++++++ bin/Prebuild.exe | Bin 224768 -> 233472 bytes prebuild.xml | 2 +- 8 files changed, 358 insertions(+), 10 deletions(-) create mode 100644 Prebuild/src/data/prebuild-1.10.xsd diff --git a/Prebuild/prebuild.xml b/Prebuild/prebuild.xml index 588d7884ae..f39175b52c 100644 --- a/Prebuild/prebuild.xml +++ b/Prebuild/prebuild.xml @@ -1,6 +1,6 @@ - - + + DEBUG;TRACE @@ -31,7 +31,7 @@ type="Exe" rootNamespace="Prebuild" startupObject="Prebuild.Prebuild" - version="2.0.5" + version="2.0.6" frameworkVersion="v3_5" > Matthew Holmes (matthew@wildfiregames.com) @@ -66,7 +66,7 @@ - + diff --git a/Prebuild/src/Core/Kernel.cs b/Prebuild/src/Core/Kernel.cs index 67051d5747..761962e0a5 100644 --- a/Prebuild/src/Core/Kernel.cs +++ b/Prebuild/src/Core/Kernel.cs @@ -73,7 +73,7 @@ namespace Prebuild.Core /// /// This must match the version of the schema that is embeeded /// - private const string m_SchemaVersion = "1.9"; + private const string m_SchemaVersion = "1.10"; private const string m_Schema = "prebuild-" + m_SchemaVersion + ".xsd"; private const string m_SchemaURI = "http://dnpb.sourceforge.net/schemas/" + m_Schema; bool disposed; diff --git a/Prebuild/src/Core/Nodes/ProjectNode.cs b/Prebuild/src/Core/Nodes/ProjectNode.cs index fb92b32e73..a8227042c4 100644 --- a/Prebuild/src/Core/Nodes/ProjectNode.cs +++ b/Prebuild/src/Core/Nodes/ProjectNode.cs @@ -93,7 +93,15 @@ namespace Prebuild.Core.Nodes /// .NET 4.0 /// v4_0, - } + /// + /// .NET 4.5 + /// + v4_5, + /// + /// .NET 4.5.1 + /// + v4_5_1 + } /// /// The Node object representing /Prebuild/Solution/Project elements /// diff --git a/Prebuild/src/Core/Targets/VS2010Target.cs b/Prebuild/src/Core/Targets/VS2010Target.cs index ea9f736475..f7562b05f2 100644 --- a/Prebuild/src/Core/Targets/VS2010Target.cs +++ b/Prebuild/src/Core/Targets/VS2010Target.cs @@ -106,7 +106,9 @@ namespace Prebuild.Core.Targets { switch (frameworkVersion) { - case FrameworkVersion.v4_0: + case FrameworkVersion.v4_5_1: + case FrameworkVersion.v4_5: + case FrameworkVersion.v4_0: case FrameworkVersion.v3_5: return "ToolsVersion=\"4.0\""; case FrameworkVersion.v3_0: diff --git a/Prebuild/src/Properties/AssemblyInfo.cs b/Prebuild/src/Properties/AssemblyInfo.cs index f3ac30f39d..013743d665 100644 --- a/Prebuild/src/Properties/AssemblyInfo.cs +++ b/Prebuild/src/Properties/AssemblyInfo.cs @@ -61,7 +61,7 @@ using System.Resources; [assembly: AssemblyConfiguration(".NET CLR")] [assembly: AssemblyCompany("The Prebuild Project")] [assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("Copyright 2004-2010 " + +[assembly: AssemblyCopyright("Copyright 2004-2013 " + "Matthew Holmes, " + "Dan Moorehead, " + "C.J. Adams-Collier, " + @@ -71,7 +71,7 @@ using System.Resources; [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: NeutralResourcesLanguageAttribute("en-US")] -[assembly: AssemblyVersion("2.0.5.*")] +[assembly: AssemblyVersion("2.0.6.*")] // // Version information for an assembly consists of the following four values: diff --git a/Prebuild/src/data/prebuild-1.10.xsd b/Prebuild/src/data/prebuild-1.10.xsd new file mode 100644 index 0000000000..eee07a8f01 --- /dev/null +++ b/Prebuild/src/data/prebuild-1.10.xsd @@ -0,0 +1,338 @@ + + + + + Copyright (c) 2004-2007 + Matthew Holmes (calefaction at houston . rr . com), + Dan Moorehead (dan05a at gmail . com), + David Hudson (jendave at yahoo dot com), + C.J. Adams-Collier (cjac at colliertech dot com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002, + 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bin/Prebuild.exe b/bin/Prebuild.exe index 1d4a8e82b71f7f4708cf8ebad1ebdef593bf717b..cc6470689d2ac6bd2f9a67ff2912aed5e1b760f6 100755 GIT binary patch literal 233472 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 z

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 literal 224768 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 - + From eaf99bf9283a1b934585f719f4ac9b47bb386c4e Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Tue, 3 Dec 2013 08:48:44 +0200 Subject: [PATCH 18/40] Changed to Unix line-endings in VS2010Target.cs Resolves http://opensimulator.org/mantis/view.php?id=6951 --- Prebuild/src/Core/Targets/VS2010Target.cs | 280 +++++++++++----------- 1 file changed, 140 insertions(+), 140 deletions(-) diff --git a/Prebuild/src/Core/Targets/VS2010Target.cs b/Prebuild/src/Core/Targets/VS2010Target.cs index f7562b05f2..e8aeab5b01 100644 --- a/Prebuild/src/Core/Targets/VS2010Target.cs +++ b/Prebuild/src/Core/Targets/VS2010Target.cs @@ -1,140 +1,140 @@ -using System; -using System.IO; -using System.Text; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; -using System.CodeDom.Compiler; - -namespace Prebuild.Core.Targets -{ - - ///

- /// - /// - [Target("vs2010")] - public class VS2010Target : VSGenericTarget - { - #region Fields - - string solutionVersion = "11.00"; - string productVersion = "9.0.30729"; - string schemaVersion = "2.0"; - string versionName = "Visual Studio 2010"; - string name = "vs2010"; - VSVersion version = VSVersion.VS10; - - #endregion - - #region Properties - - /// - /// Gets or sets the solution version. - /// - /// The solution version. - public override string SolutionVersion - { - get - { - return solutionVersion; - } - } - - /// - /// Gets or sets the product version. - /// - /// The product version. - public override string ProductVersion - { - get - { - return productVersion; - } - } - - /// - /// Gets or sets the schema version. - /// - /// The schema version. - public override string SchemaVersion - { - get - { - return schemaVersion; - } - } - - /// - /// Gets or sets the name of the version. - /// - /// The name of the version. - public override string VersionName - { - get - { - return versionName; - } - } - - /// - /// Gets or sets the version. - /// - /// The version. - public override VSVersion Version - { - get - { - return version; - } - } - - /// - /// Gets the name. - /// - /// The name. - public override string Name - { - get - { - return name; - } - } - - protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) - { - switch (frameworkVersion) - { - case FrameworkVersion.v4_5_1: - case FrameworkVersion.v4_5: - case FrameworkVersion.v4_0: - case FrameworkVersion.v3_5: - return "ToolsVersion=\"4.0\""; - case FrameworkVersion.v3_0: - return "ToolsVersion=\"3.0\""; - default: - return "ToolsVersion=\"2.0\""; - } - } - - public override string SolutionTag - { - get { return "# Visual Studio 2010"; } - } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public VS2010Target() - : base() - { - } - - #endregion - } -} +using System; +using System.IO; +using System.Text; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; +using System.CodeDom.Compiler; + +namespace Prebuild.Core.Targets +{ + + /// + /// + /// + [Target("vs2010")] + public class VS2010Target : VSGenericTarget + { + #region Fields + + string solutionVersion = "11.00"; + string productVersion = "9.0.30729"; + string schemaVersion = "2.0"; + string versionName = "Visual Studio 2010"; + string name = "vs2010"; + VSVersion version = VSVersion.VS10; + + #endregion + + #region Properties + + /// + /// Gets or sets the solution version. + /// + /// The solution version. + public override string SolutionVersion + { + get + { + return solutionVersion; + } + } + + /// + /// Gets or sets the product version. + /// + /// The product version. + public override string ProductVersion + { + get + { + return productVersion; + } + } + + /// + /// Gets or sets the schema version. + /// + /// The schema version. + public override string SchemaVersion + { + get + { + return schemaVersion; + } + } + + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + public override string VersionName + { + get + { + return versionName; + } + } + + /// + /// Gets or sets the version. + /// + /// The version. + public override VSVersion Version + { + get + { + return version; + } + } + + /// + /// Gets the name. + /// + /// The name. + public override string Name + { + get + { + return name; + } + } + + protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) + { + switch (frameworkVersion) + { + case FrameworkVersion.v4_5_1: + case FrameworkVersion.v4_5: + case FrameworkVersion.v4_0: + case FrameworkVersion.v3_5: + return "ToolsVersion=\"4.0\""; + case FrameworkVersion.v3_0: + return "ToolsVersion=\"3.0\""; + default: + return "ToolsVersion=\"2.0\""; + } + } + + public override string SolutionTag + { + get { return "# Visual Studio 2010"; } + } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public VS2010Target() + : base() + { + } + + #endregion + } +} From 4bccfed80cf28746345301f525cfd17afc24c182 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 24 Mar 2014 14:20:19 +0200 Subject: [PATCH 19/40] When logging in UserAgentServiceConnector, always log the original server URL (the hostname), not the IP This resolves http://opensimulator.org/mantis/view.php?id=6955 (that patch was modified a bit) --- .../Hypergrid/UserAgentServiceConnector.cs | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs index f869060177..54191f6eec 100644 --- a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs @@ -50,6 +50,7 @@ namespace OpenSim.Services.Connectors.Hypergrid LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType); + private string m_ServerURLHost; private string m_ServerURL; private GridRegion m_Gatekeeper; @@ -59,7 +60,7 @@ namespace OpenSim.Services.Connectors.Hypergrid public UserAgentServiceConnector(string url, bool dnsLookup) { - m_ServerURL = url; + m_ServerURL = m_ServerURLHost = url; if (dnsLookup) { @@ -75,7 +76,7 @@ namespace OpenSim.Services.Connectors.Hypergrid } catch (Exception e) { - m_log.DebugFormat("[USER AGENT CONNECTOR]: Malformed Uri {0}: {1}", m_ServerURL, e.Message); + m_log.DebugFormat("[USER AGENT CONNECTOR]: Malformed Uri {0}: {1}", url, e.Message); } } @@ -99,11 +100,12 @@ namespace OpenSim.Services.Connectors.Hypergrid m_log.Error("[USER AGENT CONNECTOR]: No Server URI named in section UserAgentService"); throw new Exception("UserAgent connector init error"); } - m_ServerURL = serviceURI; + + m_ServerURL = m_ServerURLHost = serviceURI; if (!m_ServerURL.EndsWith("/")) m_ServerURL += "/"; - m_log.DebugFormat("[USER AGENT CONNECTOR]: UserAgentServiceConnector started for {0}", m_ServerURL); + //m_log.DebugFormat("[USER AGENT CONNECTOR]: new connector to {0}", m_ServerURL); } protected override string AgentPath() @@ -206,20 +208,20 @@ namespace OpenSim.Services.Connectors.Hypergrid } catch (Exception e) { - m_log.DebugFormat("[USER AGENT CONNECTOR]: {0} call to {1} failed: {2}", methodName, m_ServerURL, e.Message); + m_log.DebugFormat("[USER AGENT CONNECTOR]: {0} call to {1} failed: {2}", methodName, m_ServerURLHost, e.Message); throw; } if (response.IsFault) { - throw new Exception(string.Format("[USER AGENT CONNECTOR]: {0} call to {1} returned an error: {2}", methodName, m_ServerURL, response.FaultString)); + throw new Exception(string.Format("[USER AGENT CONNECTOR]: {0} call to {1} returned an error: {2}", methodName, m_ServerURLHost, response.FaultString)); } hash = (Hashtable)response.Value; if (hash == null) { - throw new Exception(string.Format("[USER AGENT CONNECTOR]: {0} call to {1} returned null", methodName, m_ServerURL)); + throw new Exception(string.Format("[USER AGENT CONNECTOR]: {0} call to {1} returned null", methodName, m_ServerURLHost)); } return hash; @@ -370,14 +372,14 @@ namespace OpenSim.Services.Connectors.Hypergrid } catch { - m_log.DebugFormat("[USER AGENT CONNECTOR]: Unable to contact remote server {0} for StatusNotification", m_ServerURL); + m_log.DebugFormat("[USER AGENT CONNECTOR]: Unable to contact remote server {0} for StatusNotification", m_ServerURLHost); // reason = "Exception: " + e.Message; return friendsOnline; } if (response.IsFault) { - m_log.ErrorFormat("[USER AGENT CONNECTOR]: remote call to {0} for StatusNotification returned an error: {1}", m_ServerURL, response.FaultString); + m_log.ErrorFormat("[USER AGENT CONNECTOR]: remote call to {0} for StatusNotification returned an error: {1}", m_ServerURLHost, response.FaultString); // reason = "XMLRPC Fault"; return friendsOnline; } @@ -389,7 +391,7 @@ namespace OpenSim.Services.Connectors.Hypergrid { if (hash == null) { - m_log.ErrorFormat("[USER AGENT CONNECTOR]: GetOnlineFriends Got null response from {0}! THIS IS BAAAAD", m_ServerURL); + m_log.ErrorFormat("[USER AGENT CONNECTOR]: GetOnlineFriends Got null response from {0}! THIS IS BAAAAD", m_ServerURLHost); // reason = "Internal error 1"; return friendsOnline; } @@ -442,14 +444,14 @@ namespace OpenSim.Services.Connectors.Hypergrid } catch { - m_log.DebugFormat("[USER AGENT CONNECTOR]: Unable to contact remote server {0} for GetOnlineFriends", m_ServerURL); + m_log.DebugFormat("[USER AGENT CONNECTOR]: Unable to contact remote server {0} for GetOnlineFriends", m_ServerURLHost); // reason = "Exception: " + e.Message; return online; } if (response.IsFault) { - m_log.ErrorFormat("[USER AGENT CONNECTOR]: remote call to {0} for GetOnlineFriends returned an error: {1}", m_ServerURL, response.FaultString); + m_log.ErrorFormat("[USER AGENT CONNECTOR]: remote call to {0} for GetOnlineFriends returned an error: {1}", m_ServerURLHost, response.FaultString); // reason = "XMLRPC Fault"; return online; } @@ -461,7 +463,7 @@ namespace OpenSim.Services.Connectors.Hypergrid { if (hash == null) { - m_log.ErrorFormat("[USER AGENT CONNECTOR]: GetOnlineFriends Got null response from {0}! THIS IS BAAAAD", m_ServerURL); + m_log.ErrorFormat("[USER AGENT CONNECTOR]: GetOnlineFriends Got null response from {0}! THIS IS BAAAAD", m_ServerURLHost); // reason = "Internal error 1"; return online; } @@ -570,13 +572,13 @@ namespace OpenSim.Services.Connectors.Hypergrid if (!hash.ContainsKey("UUID")) { - throw new Exception(string.Format("[USER AGENT CONNECTOR]: get_uuid call to {0} didn't return a UUID", m_ServerURL)); + throw new Exception(string.Format("[USER AGENT CONNECTOR]: get_uuid call to {0} didn't return a UUID", m_ServerURLHost)); } UUID uuid; if (!UUID.TryParse(hash["UUID"].ToString(), out uuid)) { - throw new Exception(string.Format("[USER AGENT CONNECTOR]: get_uuid call to {0} returned an invalid UUID: {1}", m_ServerURL, hash["UUID"].ToString())); + throw new Exception(string.Format("[USER AGENT CONNECTOR]: get_uuid call to {0} returned an invalid UUID: {1}", m_ServerURLHost, hash["UUID"].ToString())); } return uuid; @@ -584,7 +586,7 @@ namespace OpenSim.Services.Connectors.Hypergrid private bool GetBoolResponse(XmlRpcRequest request, out string reason) { - //m_log.Debug("[USER AGENT CONNECTOR]: GetBoolResponse from/to " + m_ServerURL); + //m_log.Debug("[USER AGENT CONNECTOR]: GetBoolResponse from/to " + m_ServerURLHost); XmlRpcResponse response = null; try { @@ -592,14 +594,14 @@ namespace OpenSim.Services.Connectors.Hypergrid } catch (Exception e) { - m_log.DebugFormat("[USER AGENT CONNECTOR]: Unable to contact remote server {0} for GetBoolResponse", m_ServerURL); + m_log.DebugFormat("[USER AGENT CONNECTOR]: Unable to contact remote server {0} for GetBoolResponse", m_ServerURLHost); reason = "Exception: " + e.Message; return false; } if (response.IsFault) { - m_log.ErrorFormat("[USER AGENT CONNECTOR]: remote call to {0} for GetBoolResponse returned an error: {1}", m_ServerURL, response.FaultString); + m_log.ErrorFormat("[USER AGENT CONNECTOR]: remote call to {0} for GetBoolResponse returned an error: {1}", m_ServerURLHost, response.FaultString); reason = "XMLRPC Fault"; return false; } @@ -611,7 +613,7 @@ namespace OpenSim.Services.Connectors.Hypergrid { if (hash == null) { - m_log.ErrorFormat("[USER AGENT CONNECTOR]: Got null response from {0}! THIS IS BAAAAD", m_ServerURL); + m_log.ErrorFormat("[USER AGENT CONNECTOR]: Got null response from {0}! THIS IS BAAAAD", m_ServerURLHost); reason = "Internal error 1"; return false; } @@ -622,7 +624,7 @@ namespace OpenSim.Services.Connectors.Hypergrid else { reason = "Internal error 2"; - m_log.WarnFormat("[USER AGENT CONNECTOR]: response from {0} does not have expected key 'result'", m_ServerURL); + m_log.WarnFormat("[USER AGENT CONNECTOR]: response from {0} does not have expected key 'result'", m_ServerURLHost); } return success; From 7496d0b0f7c22b8571c56f9356f186f5f74dbabc Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 24 Mar 2014 15:05:39 +0200 Subject: [PATCH 20/40] Fixed unit tests for delinking objects --- .../Scenes/Tests/SceneObjectLinkingTests.cs | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs index fa8277cc7b..c928b1e34c 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs @@ -91,7 +91,12 @@ namespace OpenSim.Region.Framework.Scenes.Tests grp2.RootPart.ClearUpdateSchedule(); // Link grp2 to grp1. part2 becomes child prim to grp1. grp2 is eliminated. + Assert.IsFalse(grp1.GroupContainsForeignPrims); grp1.LinkToGroup(grp2); + Assert.IsTrue(grp1.GroupContainsForeignPrims); + + scene.Backup(true); + Assert.IsFalse(grp1.GroupContainsForeignPrims); // FIXME: Can't do this test yet since group 2 still has its root part! We can't yet null this since // it might cause SOG.ProcessBackup() to fail due to the race condition. This really needs to be fixed. @@ -143,7 +148,6 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(grp1.Parts.Length, Is.EqualTo(1), "Group 1 still contained part2 after delink."); Assert.That(part2.AbsolutePosition == Vector3.Zero, "The absolute position should be zero"); - Assert.That(grp3.GroupContainsForeignPrims, Is.True); } [Test] @@ -335,30 +339,34 @@ namespace OpenSim.Region.Framework.Scenes.Tests SceneObjectPart rootPart = new SceneObjectPart(UUID.Zero, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero) { Name = rootPartName, UUID = rootPartUuid }; + SceneObjectPart linkPart = new SceneObjectPart(UUID.Zero, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero) { Name = linkPartName, UUID = linkPartUuid }; + SceneObjectGroup linkGroup = new SceneObjectGroup(linkPart); + scene.AddNewSceneObject(linkGroup, true); SceneObjectGroup sog = new SceneObjectGroup(rootPart); - sog.AddPart(linkPart); - scene.AddNewSceneObject(sog, true); - - // In a test, we have to crank the backup handle manually. Normally this would be done by the timer invoked - // scene backup thread. + scene.AddNewSceneObject(sog, true); + + Assert.IsFalse(sog.GroupContainsForeignPrims); + sog.LinkToGroup(linkGroup); + Assert.IsTrue(sog.GroupContainsForeignPrims); + scene.Backup(true); - + Assert.AreEqual(1, scene.SimulationDataService.LoadObjects(scene.RegionInfo.RegionID).Count); + // These changes should occur immediately without waiting for a backup pass SceneObjectGroup groupToDelete = sog.DelinkFromGroup(linkPart, false); + Assert.IsFalse(groupToDelete.GroupContainsForeignPrims); - Assert.That(groupToDelete.GroupContainsForeignPrims, Is.True); scene.DeleteSceneObject(groupToDelete, false); - Assert.That(groupToDelete.GroupContainsForeignPrims, Is.False); List storedObjects = scene.SimulationDataService.LoadObjects(scene.RegionInfo.RegionID); - - Assert.That(storedObjects.Count, Is.EqualTo(1)); - Assert.That(storedObjects[0].Parts.Length, Is.EqualTo(1)); - Assert.That(storedObjects[0].ContainsPart(rootPartUuid)); + + Assert.AreEqual(1, storedObjects.Count); + Assert.AreEqual(1, storedObjects[0].Parts.Length); + Assert.IsTrue(storedObjects[0].ContainsPart(rootPartUuid)); } } } From df9845a283d34c65d47b858a1c45934ee2ea6b3b Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 24 Mar 2014 18:00:59 +0200 Subject: [PATCH 21/40] When a user logs-in, automatically create the Suitcase folder This is only done if the Suitcase Inventory Service is used. Previously the Suitcase was created at a later time, which meant that it wasn't shown in the viewer until the viewer was restarted. --- .../HGSuitcaseInventoryService.cs | 22 ++++++------------- .../Services/LLLoginService/LLLoginService.cs | 16 ++++++++++++++ 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs b/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs index 90ce44a65b..1608039517 100644 --- a/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs +++ b/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs @@ -215,25 +215,17 @@ namespace OpenSim.Services.HypergridService if (suitcase == null) { m_log.ErrorFormat("[HG SUITCASE INVENTORY SERVICE]: Unable to create suitcase folder"); + return null; } - else - { - m_Database.StoreFolder(suitcase); + + m_Database.StoreFolder(suitcase); - // Create System folders - CreateSystemFolders(principalID, suitcase.folderID); - - SetAsNormalFolder(suitcase); - - return ConvertToOpenSim(suitcase); - } - } - else - { - return ConvertToOpenSim(suitcase); + CreateSystemFolders(principalID, suitcase.folderID); } - return null; + SetAsNormalFolder(suitcase); + + return ConvertToOpenSim(suitcase); } protected void CreateSystemFolders(UUID principalID, UUID rootID) diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs index 46a5c180e6..d8f036adfe 100644 --- a/OpenSim/Services/LLLoginService/LLLoginService.cs +++ b/OpenSim/Services/LLLoginService/LLLoginService.cs @@ -58,6 +58,7 @@ namespace OpenSim.Services.LLLoginService protected IGridUserService m_GridUserService; protected IAuthenticationService m_AuthenticationService; protected IInventoryService m_InventoryService; + protected IInventoryService m_HGInventoryService; protected IGridService m_GridService; protected IPresenceService m_PresenceService; protected ISimulationService m_LocalSimulationService; @@ -165,6 +166,14 @@ namespace OpenSim.Services.LLLoginService if (agentService != string.Empty) m_UserAgentService = ServerUtils.LoadPlugin(agentService, args); + // Get the Hypergrid inventory service (exists only if Hypergrid is enabled) + string hgInvService = Util.GetConfigVarFromSections(config, "LocalServiceModule", new string[] { "HGInventoryService" }, String.Empty); + if (hgInvService != string.Empty) + { + Object[] args2 = new Object[] { config, "HGInventoryService" }; + m_HGInventoryService = ServerUtils.LoadPlugin(hgInvService, args2); + } + // // deal with the services given as argument // @@ -350,6 +359,13 @@ namespace OpenSim.Services.LLLoginService return LLFailedLoginResponse.InventoryProblem; } + if (m_HGInventoryService != null) + { + // Give the Suitcase service a chance to create the suitcase folder. + // (If we're not using the Suitcase inventory service then this won't do anything.) + m_HGInventoryService.GetRootFolder(account.PrincipalID); + } + List inventorySkel = m_InventoryService.GetInventorySkeleton(account.PrincipalID); if (m_RequireInventory && ((inventorySkel == null) || (inventorySkel != null && inventorySkel.Count == 0))) { From 5b2af7f99ea9caf7c00674abd87b33797ce13ef4 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 24 Mar 2014 18:33:18 +0200 Subject: [PATCH 22/40] Moved the linkage between LoginService and HGInventoryService to the config file --- OpenSim/Services/LLLoginService/LLLoginService.cs | 9 +++++---- bin/Robust.HG.ini.example | 4 ++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs index d8f036adfe..b61b5e8466 100644 --- a/OpenSim/Services/LLLoginService/LLLoginService.cs +++ b/OpenSim/Services/LLLoginService/LLLoginService.cs @@ -167,11 +167,12 @@ namespace OpenSim.Services.LLLoginService m_UserAgentService = ServerUtils.LoadPlugin(agentService, args); // Get the Hypergrid inventory service (exists only if Hypergrid is enabled) - string hgInvService = Util.GetConfigVarFromSections(config, "LocalServiceModule", new string[] { "HGInventoryService" }, String.Empty); - if (hgInvService != string.Empty) + string hgInvServicePlugin = m_LoginServerConfig.GetString("HGInventoryServicePlugin", String.Empty); + if (hgInvServicePlugin != string.Empty) { - Object[] args2 = new Object[] { config, "HGInventoryService" }; - m_HGInventoryService = ServerUtils.LoadPlugin(hgInvService, args2); + string hgInvServiceArg = m_LoginServerConfig.GetString("HGInventoryServiceConstructorArg", String.Empty); + Object[] args2 = new Object[] { config, hgInvServiceArg }; + m_HGInventoryService = ServerUtils.LoadPlugin(hgInvServicePlugin, args2); } // diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example index 91ea42a75d..14e9bff296 100644 --- a/bin/Robust.HG.ini.example +++ b/bin/Robust.HG.ini.example @@ -335,6 +335,10 @@ HGAssetServiceConnector = "HGAssetService@8002/OpenSim.Server.Handlers.dll:Asset UserAgentService = "OpenSim.Services.HypergridService.dll:UserAgentService" FriendsService = "OpenSim.Services.FriendsService.dll:FriendsService" + ; This inventory service will be used to initialize the user's inventory + HGInventoryServicePlugin = "OpenSim.Services.HypergridService.dll:HGSuitcaseInventoryService" + HGInventoryServiceConstructorArg = "HGInventoryService" + ;; Ask co-operative viewers to use a different currency name ;Currency = "" From edc04d4184bb9ec224b27cc7b463bec6e4e65dde Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Tue, 22 Oct 2013 09:45:18 +0300 Subject: [PATCH 23/40] When updating the CreatorId of an inventory item, automatically update the CreatorIdAsUuid field as well Resolves http://opensimulator.org/mantis/view.php?id=6933 --- OpenSim/Framework/InventoryItemBase.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/OpenSim/Framework/InventoryItemBase.cs b/OpenSim/Framework/InventoryItemBase.cs index 558dfd0e4c..57612005a1 100644 --- a/OpenSim/Framework/InventoryItemBase.cs +++ b/OpenSim/Framework/InventoryItemBase.cs @@ -82,12 +82,15 @@ namespace OpenSim.Framework set { m_creatorId = value; + + if ((m_creatorId == null) || !UUID.TryParse(m_creatorId, out m_creatorIdAsUuid)) + m_creatorIdAsUuid = UUID.Zero; } } protected string m_creatorId; /// - /// The CreatorId expressed as a UUID.tely + /// The CreatorId expressed as a UUID. /// public UUID CreatorIdAsUuid { From 89945f8829dcc1ee889aad1bafd1d6c2938a6cc7 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Thu, 31 Oct 2013 13:02:57 +0200 Subject: [PATCH 24/40] Refactored: ExternalRepresentationUtils should be the only place where the "CreatorData" field is calculated, to ensure uniformity Resolves http://opensimulator.org/mantis/view.php?id=6933 --- .../External/ExternalRepresentationUtils.cs | 16 +++++++++++++--- .../External/UserInventoryItemSerializer.cs | 3 ++- OpenSim/Framework/Util.cs | 9 +++++++-- .../Serialization/SceneObjectSerializer.cs | 4 ++-- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/OpenSim/Framework/Serialization/External/ExternalRepresentationUtils.cs b/OpenSim/Framework/Serialization/External/ExternalRepresentationUtils.cs index c56f21367f..db46ea8735 100644 --- a/OpenSim/Framework/Serialization/External/ExternalRepresentationUtils.cs +++ b/OpenSim/Framework/Serialization/External/ExternalRepresentationUtils.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) Contributors, http://opensimulator.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * @@ -161,7 +161,7 @@ namespace OpenSim.Framework.Serialization.External if (!hasCreatorData && creator != null) { XmlElement creatorData = doc.CreateElement("CreatorData"); - creatorData.InnerText = homeURL + ";" + creator.FirstName + " " + creator.LastName; + creatorData.InnerText = CalcCreatorData(homeURL, creator.FirstName + " " + creator.LastName); sop.AppendChild(creatorData); } } @@ -172,5 +172,15 @@ namespace OpenSim.Framework.Serialization.External return wr.ToString(); } } + + public static string CalcCreatorData(string homeURL, string name) + { + return homeURL + ";" + name; + } + + internal static string CalcCreatorData(string homeURL, UUID uuid, string name) + { + return homeURL + "/" + uuid + ";" + name; + } } -} \ No newline at end of file +} diff --git a/OpenSim/Framework/Serialization/External/UserInventoryItemSerializer.cs b/OpenSim/Framework/Serialization/External/UserInventoryItemSerializer.cs index f2a6b8b87a..135cefb616 100644 --- a/OpenSim/Framework/Serialization/External/UserInventoryItemSerializer.cs +++ b/OpenSim/Framework/Serialization/External/UserInventoryItemSerializer.cs @@ -286,7 +286,8 @@ namespace OpenSim.Framework.Serialization.External UserAccount account = userAccountService.GetUserAccount(UUID.Zero, inventoryItem.CreatorIdAsUuid); if (account != null) { - writer.WriteElementString("CreatorData", (string)options["home"] + "/" + inventoryItem.CreatorIdAsUuid + ";" + account.FirstName + " " + account.LastName); + string creatorData = ExternalRepresentationUtils.CalcCreatorData((string)options["home"], inventoryItem.CreatorIdAsUuid, account.FirstName + " " + account.LastName); + writer.WriteElementString("CreatorData", creatorData); } writer.WriteElementString("CreatorID", inventoryItem.CreatorId); } diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index 5805dc8389..c2c96981bb 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs @@ -2250,10 +2250,15 @@ namespace OpenSim.Framework { string[] parts = firstName.Split(new char[] { '.' }); if (parts.Length == 2) - return id.ToString() + ";" + agentsURI + ";" + parts[0] + " " + parts[1]; + return CalcUniversalIdentifier(id, agentsURI, parts[0] + " " + parts[1]); } - return id.ToString() + ";" + agentsURI + ";" + firstName + " " + lastName; + + return CalcUniversalIdentifier(id, agentsURI, firstName + " " + lastName); + } + private static string CalcUniversalIdentifier(UUID id, string agentsURI, string name) + { + return id.ToString() + ";" + agentsURI + ";" + name; } /// diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index f07dee959a..4deca006f2 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs @@ -1230,7 +1230,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization if (m_UserManagement == null) m_UserManagement = sop.ParentGroup.Scene.RequestModuleInterface(); string name = m_UserManagement.GetUserName(sop.CreatorID); - writer.WriteElementString("CreatorData", (string)options["home"] + ";" + name); + writer.WriteElementString("CreatorData", ExternalRepresentationUtils.CalcCreatorData((string)options["home"], name)); } WriteUUID(writer, "FolderID", sop.FolderID, options); @@ -1403,7 +1403,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization if (m_UserManagement == null) m_UserManagement = scene.RequestModuleInterface(); string name = m_UserManagement.GetUserName(item.CreatorID); - writer.WriteElementString("CreatorData", (string)options["home"] + ";" + name); + writer.WriteElementString("CreatorData", ExternalRepresentationUtils.CalcCreatorData((string)options["home"], name)); } writer.WriteElementString("Description", item.Description); From bf68dbabd753ecfab812a4d533c16ad269dc64ad Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Thu, 24 Oct 2013 15:40:47 +0300 Subject: [PATCH 25/40] Save to database these parcel updates: Force Owner, Abandon Request, Reclaim. (Previously these updates only changed the parcel in memory) Resolves http://opensimulator.org/mantis/view.php?id=6934 --- OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index 7f17aff66d..0ecf13bc36 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs @@ -1340,6 +1340,7 @@ namespace OpenSim.Region.CoreModules.World.Land m_scene.ForEachClient(SendParcelOverlay); land.SendLandUpdateToClient(true, remote_client); + UpdateLandObject(land.LandData.LocalID, land.LandData); } } } @@ -1360,8 +1361,10 @@ namespace OpenSim.Region.CoreModules.World.Land land.LandData.GroupID = UUID.Zero; land.LandData.IsGroupOwned = false; land.LandData.Flags &= ~(uint) (ParcelFlags.ForSale | ParcelFlags.ForSaleObjects | ParcelFlags.SellParcelObjects | ParcelFlags.ShowDirectory); + m_scene.ForEachClient(SendParcelOverlay); land.SendLandUpdateToClient(true, remote_client); + UpdateLandObject(land.LandData.LocalID, land.LandData); } } } @@ -1388,6 +1391,7 @@ namespace OpenSim.Region.CoreModules.World.Land m_scene.ForEachClient(SendParcelOverlay); land.SendLandUpdateToClient(true, remote_client); + UpdateLandObject(land.LandData.LocalID, land.LandData); } } } From 6edc4467807e227d7d62e3b6ab3ae7101ea2015c Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Fri, 25 Oct 2013 12:44:27 +0300 Subject: [PATCH 26/40] Fixed: OnRegionInfoChange was never triggered Resolves http://opensimulator.org/mantis/view.php?id=6934 --- .../Region/CoreModules/World/Estate/EstateManagementModule.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 3bd7b4a218..cb9ad4a786 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs @@ -1342,10 +1342,7 @@ namespace OpenSim.Region.CoreModules.World.Estate { m_regionChangeTimer.Stop(); m_regionChangeTimer.Start(); - } - protected void RaiseRegionInfoChange(object sender, ElapsedEventArgs e) - { ChangeDelegate change = OnRegionInfoChange; if (change != null) From a2dd8f31dea20d43c942aeee7aae8b208989bbe7 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Wed, 30 Oct 2013 12:46:03 +0200 Subject: [PATCH 27/40] Trim search queries (for users, groups, etc.). I have found that sometimes the viewer adds a space at the end, which causes searches to fail. Resolves http://opensimulator.org/mantis/view.php?id=6935 --- OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 2 +- .../Region/CoreModules/Framework/Search/BasicSearchModule.cs | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 05dd764746..86161c9180 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -10387,7 +10387,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP handlerDirFindQuery(this, dirFindQueryPacket.QueryData.QueryID, Utils.BytesToString( - dirFindQueryPacket.QueryData.QueryText), + dirFindQueryPacket.QueryData.QueryText).Trim(), dirFindQueryPacket.QueryData.QueryFlags, dirFindQueryPacket.QueryData.QueryStart); } diff --git a/OpenSim/Region/CoreModules/Framework/Search/BasicSearchModule.cs b/OpenSim/Region/CoreModules/Framework/Search/BasicSearchModule.cs index 88386129b8..3849996d4c 100644 --- a/OpenSim/Region/CoreModules/Framework/Search/BasicSearchModule.cs +++ b/OpenSim/Region/CoreModules/Framework/Search/BasicSearchModule.cs @@ -150,6 +150,8 @@ namespace OpenSim.Region.CoreModules.Framework.Search void OnDirFindQuery(IClientAPI remoteClient, UUID queryID, string queryText, uint queryFlags, int queryStart) { + queryText = queryText.Trim(); + if (((DirFindFlags)queryFlags & DirFindFlags.People) == DirFindFlags.People) { if (string.IsNullOrEmpty(queryText)) @@ -194,4 +196,4 @@ namespace OpenSim.Region.CoreModules.Framework.Search } -} \ No newline at end of file +} From c8583e566dd03d4a854e77c1c690fdc35c550398 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Wed, 30 Oct 2013 12:46:42 +0200 Subject: [PATCH 28/40] When searching for users, don't add users from the local cache if they have an invalid UUID Resolves http://opensimulator.org/mantis/view.php?id=6935 --- .../Framework/UserManagement/UserManagementModule.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs index 9f0a7198ab..3455e2c956 100644 --- a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs +++ b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs @@ -278,7 +278,8 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement { foreach (UserData data in m_UserCache.Values) { - if (users.Find(delegate(UserData d) { return d.Id == data.Id; }) == null && + if (data.Id != UUID.Zero && + users.Find(delegate(UserData d) { return d.Id == data.Id; }) == null && (data.FirstName.ToLower().StartsWith(query.ToLower()) || data.LastName.ToLower().StartsWith(query.ToLower()))) users.Add(data); } @@ -725,4 +726,4 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement } -} \ No newline at end of file +} From 1d4551e52fc02db9393c5c3653139c671a2e6c97 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Wed, 30 Oct 2013 15:59:53 +0200 Subject: [PATCH 29/40] Check settings for groups module Resolves http://opensimulator.org/mantis/view.php?id=6937 --- OpenSim/Addons/Groups/GroupsMessagingModule.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/OpenSim/Addons/Groups/GroupsMessagingModule.cs b/OpenSim/Addons/Groups/GroupsMessagingModule.cs index 92528a2dc9..bbb5e059d3 100644 --- a/OpenSim/Addons/Groups/GroupsMessagingModule.cs +++ b/OpenSim/Addons/Groups/GroupsMessagingModule.cs @@ -110,7 +110,15 @@ namespace OpenSim.Groups m_messageOnlineAgentsOnly = groupsConfig.GetBoolean("MessageOnlineUsersOnly", false); if (m_messageOnlineAgentsOnly) + { m_usersOnlineCache = new ExpiringCache(); + } + else + { + m_log.Error("[Groups.Messaging]: GroupsMessagingModule V2 requires MessageOnlineUsersOnly = true"); + m_groupMessagingEnabled = false; + return; + } m_debugEnabled = groupsConfig.GetBoolean("DebugEnabled", true); @@ -260,7 +268,7 @@ namespace OpenSim.Groups // Sending to offline members is not an option. string[] t1 = groupMembers.ConvertAll(gmd => gmd.AgentID.ToString()).ToArray(); - // We cache in order not to overwhlem the presence service on large grids with many groups. This does + // We cache in order not to overwhelm the presence service on large grids with many groups. This does // mean that members coming online will not see all group members until after m_usersOnlineCacheExpirySeconds has elapsed. // (assuming this is the same across all grid simulators). if (!m_usersOnlineCache.TryGetValue(groupID, out onlineAgents)) From b9e0d0fdb217f4e5cd90883dca1b2f622dc61c1d Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Wed, 30 Oct 2013 16:15:06 +0200 Subject: [PATCH 30/40] Don't show hidden groups in search results Resolves http://opensimulator.org/mantis/view.php?id=6937 --- OpenSim/Data/MySQL/MySQLGroupsData.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Data/MySQL/MySQLGroupsData.cs b/OpenSim/Data/MySQL/MySQLGroupsData.cs index 03182849c7..8e39229939 100644 --- a/OpenSim/Data/MySQL/MySQLGroupsData.cs +++ b/OpenSim/Data/MySQL/MySQLGroupsData.cs @@ -86,11 +86,11 @@ namespace OpenSim.Data.MySQL public GroupData[] RetrieveGroups(string pattern) { if (string.IsNullOrEmpty(pattern)) - pattern = "1 ORDER BY Name LIMIT 100"; + pattern = "1"; else - pattern = string.Format("Name LIKE '%{0}%' ORDER BY Name LIMIT 100", pattern); + pattern = string.Format("Name LIKE '%{0}%'", pattern); - return m_Groups.Get(pattern); + return m_Groups.Get(string.Format("ShowInList=1 AND ({0}) ORDER BY Name LIMIT 100", pattern)); } public bool DeleteGroup(UUID groupID) From 1b30ae81b5501fbd21b0f589df6286421b0c083a Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Sun, 5 Jan 2014 11:28:33 +0200 Subject: [PATCH 31/40] Fixed updating usersettings in the database Resolves http://opensimulator.org/mantis/view.php?id=6938 --- OpenSim/Data/MySQL/MySQLUserProfilesData.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Data/MySQL/MySQLUserProfilesData.cs b/OpenSim/Data/MySQL/MySQLUserProfilesData.cs index 6ed3b06a2a..cc4c5b0576 100644 --- a/OpenSim/Data/MySQL/MySQLUserProfilesData.cs +++ b/OpenSim/Data/MySQL/MySQLUserProfilesData.cs @@ -974,8 +974,8 @@ namespace OpenSim.Data.MySQL dbcon.Open(); using (MySqlCommand cmd = new MySqlCommand(query, dbcon)) { - cmd.Parameters.AddWithValue("?ImViaEmail", pref.IMViaEmail); - cmd.Parameters.AddWithValue("?Visible", pref.Visible); + cmd.Parameters.AddWithValue("?ImViaEmail", pref.IMViaEmail.ToString().ToLower()); + cmd.Parameters.AddWithValue("?Visible", pref.Visible.ToString().ToLower()); cmd.Parameters.AddWithValue("?uuid", pref.UserId.ToString()); cmd.ExecuteNonQuery(); From 8cec0b3fa1fa36dd8823cc718dc914e8f7c0b9c8 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Thu, 31 Oct 2013 09:00:59 +0200 Subject: [PATCH 32/40] If updating a user's profile notes fails then return an error Resolves http://opensimulator.org/mantis/view.php?id=6938 --- OpenSim/Server/Handlers/Profiles/UserProfilesHandlers.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenSim/Server/Handlers/Profiles/UserProfilesHandlers.cs b/OpenSim/Server/Handlers/Profiles/UserProfilesHandlers.cs index d30cc228b0..d55142efc6 100644 --- a/OpenSim/Server/Handlers/Profiles/UserProfilesHandlers.cs +++ b/OpenSim/Server/Handlers/Profiles/UserProfilesHandlers.cs @@ -273,10 +273,10 @@ namespace OpenSim.Server.Handlers response.Result = OSD.SerializeMembers(note); return true; } - - object Notes = (object) note; - OSD.DeserializeMembers(ref Notes, (OSDMap)json["params"]); - return true; + + response.Error.Code = ErrorCode.InternalError; + response.Error.Message = "Error reading notes"; + return false; } public bool NotesUpdate(OSDMap json, ref JsonRpcResponse response) From 0ff61341e479423125daa180eb7ee83bd643939b Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Thu, 31 Oct 2013 11:17:28 +0200 Subject: [PATCH 33/40] HGAssetService searches for the "HomeURI" setting in several sections: Startup, Hypergrid, HGAssetService Resolves http://opensimulator.org/mantis/view.php?id=6940 --- OpenSim/Services/HypergridService/HGAssetService.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenSim/Services/HypergridService/HGAssetService.cs b/OpenSim/Services/HypergridService/HGAssetService.cs index 84dec8d389..5c804d47b5 100644 --- a/OpenSim/Services/HypergridService/HGAssetService.cs +++ b/OpenSim/Services/HypergridService/HGAssetService.cs @@ -76,10 +76,10 @@ namespace OpenSim.Services.HypergridService if (m_UserAccountService == null) throw new Exception(String.Format("Unable to create UserAccountService from {0}", userAccountsDll)); - // legacy configuration [obsolete] - m_HomeURL = assetConfig.GetString("ProfileServerURI", string.Empty); - // Preferred - m_HomeURL = assetConfig.GetString("HomeURI", m_HomeURL); + m_HomeURL = Util.GetConfigVarFromSections(config, "HomeURI", + new string[] { "Startup", "Hypergrid", configName }, string.Empty); + if (m_HomeURL == string.Empty) + throw new Exception("[HGAssetService] No HomeURI specified"); m_Cache = UserAccountCache.CreateUserAccountCache(m_UserAccountService); From 5fd94111434c2faa742d4eb7357d7a6b02253988 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 18 Nov 2013 12:48:23 +0200 Subject: [PATCH 34/40] Refactored Load IAR: created a generic mechanism to modify the SOG's as they are being loaded Resolves http://opensimulator.org/mantis/view.php?id=6942 --- .../Archiver/InventoryArchiveReadRequest.cs | 66 ++++++------------ .../Serialization/SceneObjectSerializer.cs | 67 +++++++++++++++++++ 2 files changed, 86 insertions(+), 47 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs index f7057fef2b..9963521a4f 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs @@ -483,52 +483,24 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver { if (m_creatorIdForAssetId.ContainsKey(assetId)) { - string xmlData = Utils.BytesToString(data); - List sceneObjects = new List(); + data = SceneObjectSerializer.ModifySerializedObject(assetId, data, + sog => { + bool modified = false; + + foreach (SceneObjectPart sop in sog.Parts) + { + if (string.IsNullOrEmpty(sop.CreatorData)) + { + sop.CreatorID = m_creatorIdForAssetId[assetId]; + modified = true; + } + } + + return modified; + }); - CoalescedSceneObjects coa = null; - if (CoalescedSceneObjectsSerializer.TryFromXml(xmlData, out coa)) - { -// m_log.DebugFormat( -// "[INVENTORY ARCHIVER]: Loaded coalescence {0} has {1} objects", assetId, coa.Count); - - if (coa.Objects.Count == 0) - { - m_log.WarnFormat( - "[INVENTORY ARCHIVE READ REQUEST]: Aborting load of coalesced object from asset {0} as it has zero loaded components", - assetId); - return false; - } - - sceneObjects.AddRange(coa.Objects); - } - else - { - SceneObjectGroup deserializedObject = SceneObjectSerializer.FromOriginalXmlFormat(xmlData); - - if (deserializedObject != null) - { - sceneObjects.Add(deserializedObject); - } - else - { - m_log.WarnFormat( - "[INVENTORY ARCHIVE READ REQUEST]: Aborting load of object from asset {0} as deserialization failed", - assetId); - - return false; - } - } - - foreach (SceneObjectGroup sog in sceneObjects) - foreach (SceneObjectPart sop in sog.Parts) - if (string.IsNullOrEmpty(sop.CreatorData)) - sop.CreatorID = m_creatorIdForAssetId[assetId]; - - if (coa != null) - data = Utils.StringToBytes(CoalescedSceneObjectsSerializer.ToXml(coa)); - else - data = Utils.StringToBytes(SceneObjectSerializer.ToOriginalXmlFormat(sceneObjects[0])); + if (data == null) + return false; } } @@ -550,7 +522,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver return false; } } - + /// /// Load control file /// @@ -656,4 +628,4 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver m_assetsLoaded = true; } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index 4deca006f2..a93f3c8a85 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs @@ -299,6 +299,73 @@ namespace OpenSim.Region.Framework.Scenes.Serialization } } + + /// + /// Modifies a SceneObjectGroup. + /// + /// The object + /// Whether the object was actually modified + public delegate bool SceneObjectModifier(SceneObjectGroup sog); + + /// + /// Modifies an object by deserializing it; applying 'modifier' to each SceneObjectGroup; and reserializing. + /// + /// The object's UUID + /// Serialized data + /// The function to run on each SceneObjectGroup + /// The new serialized object's data, or null if an error occurred + public static byte[] ModifySerializedObject(UUID assetId, byte[] data, SceneObjectModifier modifier) + { + List sceneObjects = new List(); + CoalescedSceneObjects coa = null; + + string xmlData = Utils.BytesToString(data); + + if (CoalescedSceneObjectsSerializer.TryFromXml(xmlData, out coa)) + { + // m_log.DebugFormat("[SERIALIZER]: Loaded coalescence {0} has {1} objects", assetId, coa.Count); + + if (coa.Objects.Count == 0) + { + m_log.WarnFormat("[SERIALIZER]: Aborting load of coalesced object from asset {0} as it has zero loaded components", assetId); + return null; + } + + sceneObjects.AddRange(coa.Objects); + } + else + { + SceneObjectGroup deserializedObject = FromOriginalXmlFormat(xmlData); + + if (deserializedObject != null) + { + sceneObjects.Add(deserializedObject); + } + else + { + m_log.WarnFormat("[SERIALIZER]: Aborting load of object from asset {0} as deserialization failed", assetId); + return null; + } + } + + bool modified = false; + foreach (SceneObjectGroup sog in sceneObjects) + { + if (modifier(sog)) + modified = true; + } + + if (modified) + { + if (coa != null) + data = Utils.StringToBytes(CoalescedSceneObjectsSerializer.ToXml(coa)); + else + data = Utils.StringToBytes(ToOriginalXmlFormat(sceneObjects[0])); + } + + return data; + } + #region manual serialization From 35078e03e5a0c0fe6f691eddb3a4cc843d7b3243 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 18 Nov 2013 12:53:11 +0200 Subject: [PATCH 35/40] During Load OAR, fix the User and Group ID's in objects that are embedded in assets (previously only rezzed objects were fixed) Resolves http://opensimulator.org/mantis/view.php?id=6942 --- .../World/Archiver/ArchiveReadRequest.cs | 130 +++++++++++------- 1 file changed, 77 insertions(+), 53 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index 2e638d4cc2..0c7be6f306 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs @@ -523,58 +523,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver oldTelehubUUID = UUID.Zero; } - // Try to retain the original creator/owner/lastowner if their uuid is present on this grid - // or creator data is present. Otherwise, use the estate owner instead. - foreach (SceneObjectPart part in sceneObject.Parts) - { - if (string.IsNullOrEmpty(part.CreatorData)) - { - if (!ResolveUserUuid(scene, part.CreatorID)) - part.CreatorID = scene.RegionInfo.EstateSettings.EstateOwner; - } - if (UserManager != null) - UserManager.AddUser(part.CreatorID, part.CreatorData); - - if (!ResolveUserUuid(scene, part.OwnerID)) - part.OwnerID = scene.RegionInfo.EstateSettings.EstateOwner; - - if (!ResolveUserUuid(scene, part.LastOwnerID)) - part.LastOwnerID = scene.RegionInfo.EstateSettings.EstateOwner; - - if (!ResolveGroupUuid(part.GroupID)) - part.GroupID = UUID.Zero; - - // And zap any troublesome sit target information -// part.SitTargetOrientation = new Quaternion(0, 0, 0, 1); -// part.SitTargetPosition = new Vector3(0, 0, 0); - - // Fix ownership/creator of inventory items - // Not doing so results in inventory items - // being no copy/no mod for everyone - lock (part.TaskInventory) - { - TaskInventoryDictionary inv = part.TaskInventory; - foreach (KeyValuePair kvp in inv) - { - if (!ResolveUserUuid(scene, kvp.Value.OwnerID)) - { - kvp.Value.OwnerID = scene.RegionInfo.EstateSettings.EstateOwner; - } - - if (string.IsNullOrEmpty(kvp.Value.CreatorData)) - { - if (!ResolveUserUuid(scene, kvp.Value.CreatorID)) - kvp.Value.CreatorID = scene.RegionInfo.EstateSettings.EstateOwner; - } - - if (UserManager != null) - UserManager.AddUser(kvp.Value.CreatorID, kvp.Value.CreatorData); - - if (!ResolveGroupUuid(kvp.Value.GroupID)) - kvp.Value.GroupID = UUID.Zero; - } - } - } + ModifySceneObject(scene, sceneObject); if (scene.AddRestoredSceneObject(sceneObject, true, false)) { @@ -598,6 +547,67 @@ namespace OpenSim.Region.CoreModules.World.Archiver scene.RegionInfo.RegionSettings.ClearSpawnPoints(); } } + + /// + /// Optionally modify a loaded SceneObjectGroup. Currently this just ensures that the + /// User IDs and Group IDs are valid, but other manipulations could be done as well. + /// + private void ModifySceneObject(Scene scene, SceneObjectGroup sceneObject) + { + // Try to retain the original creator/owner/lastowner if their uuid is present on this grid + // or creator data is present. Otherwise, use the estate owner instead. + foreach (SceneObjectPart part in sceneObject.Parts) + { + if (string.IsNullOrEmpty(part.CreatorData)) + { + if (!ResolveUserUuid(scene, part.CreatorID)) + part.CreatorID = scene.RegionInfo.EstateSettings.EstateOwner; + } + if (UserManager != null) + UserManager.AddUser(part.CreatorID, part.CreatorData); + + if (!ResolveUserUuid(scene, part.OwnerID)) + part.OwnerID = scene.RegionInfo.EstateSettings.EstateOwner; + + if (!ResolveUserUuid(scene, part.LastOwnerID)) + part.LastOwnerID = scene.RegionInfo.EstateSettings.EstateOwner; + + if (!ResolveGroupUuid(part.GroupID)) + part.GroupID = UUID.Zero; + + // And zap any troublesome sit target information + // part.SitTargetOrientation = new Quaternion(0, 0, 0, 1); + // part.SitTargetPosition = new Vector3(0, 0, 0); + + // Fix ownership/creator of inventory items + // Not doing so results in inventory items + // being no copy/no mod for everyone + lock (part.TaskInventory) + { + TaskInventoryDictionary inv = part.TaskInventory; + foreach (KeyValuePair kvp in inv) + { + if (!ResolveUserUuid(scene, kvp.Value.OwnerID)) + { + kvp.Value.OwnerID = scene.RegionInfo.EstateSettings.EstateOwner; + } + + if (string.IsNullOrEmpty(kvp.Value.CreatorData)) + { + if (!ResolveUserUuid(scene, kvp.Value.CreatorID)) + kvp.Value.CreatorID = scene.RegionInfo.EstateSettings.EstateOwner; + } + + if (UserManager != null) + UserManager.AddUser(kvp.Value.CreatorID, kvp.Value.CreatorData); + + if (!ResolveGroupUuid(kvp.Value.GroupID)) + kvp.Value.GroupID = UUID.Zero; + } + } + } + } + /// /// Load serialized parcels. @@ -754,7 +764,21 @@ namespace OpenSim.Region.CoreModules.World.Archiver sbyte assetType = ArchiveConstants.EXTENSION_TO_ASSET_TYPE[extension]; if (assetType == (sbyte)AssetType.Unknown) + { m_log.WarnFormat("[ARCHIVER]: Importing {0} byte asset {1} with unknown type", data.Length, uuid); + } + else if (assetType == (sbyte)AssetType.Object) + { + data = SceneObjectSerializer.ModifySerializedObject(UUID.Parse(uuid), data, + sog => + { + ModifySceneObject(m_rootScene, sog); + return true; + }); + + if (data == null) + return false; + } //m_log.DebugFormat("[ARCHIVER]: Importing asset {0}, type {1}", uuid, assetType); @@ -977,4 +1001,4 @@ namespace OpenSim.Region.CoreModules.World.Archiver return dearchivedScenes; } } -} \ No newline at end of file +} From 305f5110c6d8c57ce2d4f9d0d052b564f3d1a4b9 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Thu, 24 Oct 2013 17:40:55 +0300 Subject: [PATCH 36/40] In Load OAR: Zero isn't a valid Group ID Resolves http://opensimulator.org/mantis/view.php?id=6943 --- .../Region/CoreModules/World/Archiver/ArchiveReadRequest.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index 0c7be6f306..f5707eb337 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs @@ -189,8 +189,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver m_rotationCenter = options.ContainsKey("rotation-center") ? (Vector3)options["rotation-center"] : new Vector3(scene.RegionInfo.RegionSizeX / 2f, scene.RegionInfo.RegionSizeY / 2f, 0f); - // Zero can never be a valid user id + // Zero can never be a valid user or group id m_validUserUuids[UUID.Zero] = false; + m_validGroupUuids[UUID.Zero] = false; m_groupsModule = m_rootScene.RequestModuleInterface(); m_assetService = m_rootScene.AssetService; @@ -705,9 +706,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver /// private bool ResolveGroupUuid(UUID uuid) { - if (uuid == UUID.Zero) - return true; // this means the object has no group - lock (m_validGroupUuids) { if (!m_validGroupUuids.ContainsKey(uuid)) From 1a32b352791fe5dd3a344ab6797f6fd62e3e5391 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Sun, 12 Jan 2014 12:07:30 +0200 Subject: [PATCH 37/40] In Load OAR, correctly restore group-owned objects Resolves http://opensimulator.org/mantis/view.php?id=6943 --- .../Region/CoreModules/World/Archiver/ArchiveReadRequest.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index f5707eb337..7920748f23 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs @@ -567,10 +567,10 @@ namespace OpenSim.Region.CoreModules.World.Archiver if (UserManager != null) UserManager.AddUser(part.CreatorID, part.CreatorData); - if (!ResolveUserUuid(scene, part.OwnerID)) + if (!(ResolveUserUuid(scene, part.OwnerID) || ResolveGroupUuid(part.OwnerID))) part.OwnerID = scene.RegionInfo.EstateSettings.EstateOwner; - if (!ResolveUserUuid(scene, part.LastOwnerID)) + if (!(ResolveUserUuid(scene, part.LastOwnerID) || ResolveGroupUuid(part.LastOwnerID))) part.LastOwnerID = scene.RegionInfo.EstateSettings.EstateOwner; if (!ResolveGroupUuid(part.GroupID)) @@ -588,7 +588,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver TaskInventoryDictionary inv = part.TaskInventory; foreach (KeyValuePair kvp in inv) { - if (!ResolveUserUuid(scene, kvp.Value.OwnerID)) + if (!(ResolveUserUuid(scene, kvp.Value.OwnerID) || ResolveGroupUuid(kvp.Value.OwnerID))) { kvp.Value.OwnerID = scene.RegionInfo.EstateSettings.EstateOwner; } From 1769e93c42384125eb75fcc21dee43bb52a6090a Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 18 Nov 2013 13:14:49 +0200 Subject: [PATCH 38/40] Fixed parsing of coalesced objects if the XML starts with an XML Declaration ("") Resolves http://opensimulator.org/mantis/view.php?id=6944 --- .../CoalescedSceneObjectsSerializer.cs | 93 ++++++++++--------- 1 file changed, 47 insertions(+), 46 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs index 5cb271ddad..a556f9d0b9 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs @@ -119,21 +119,22 @@ namespace OpenSim.Region.Framework.Scenes.Serialization return output; } } - + public static bool TryFromXml(string xml, out CoalescedSceneObjects coa) { // m_log.DebugFormat("[COALESCED SCENE OBJECTS SERIALIZER]: TryFromXml() deserializing {0}", xml); coa = null; - int i = 0; - using (StringReader sr = new StringReader(xml)) - { - using (XmlTextReader reader = new XmlTextReader(sr)) - { - try + try + { + // Quickly check if this is a coalesced object, without fully parsing the XML + using (StringReader sr = new StringReader(xml)) + { + using (XmlTextReader reader = new XmlTextReader(sr)) { - reader.Read(); + reader.MoveToContent(); // skip possible xml declaration + if (reader.Name != "CoalescedObject") { // m_log.DebugFormat( @@ -142,49 +143,49 @@ namespace OpenSim.Region.Framework.Scenes.Serialization return false; } - - coa = new CoalescedSceneObjects(UUID.Zero); - reader.Read(); - - while (reader.NodeType != XmlNodeType.EndElement && reader.Name != "CoalescedObject") - { - if (reader.Name == "SceneObjectGroup") - { - string soXml = reader.ReadOuterXml(); - - SceneObjectGroup so = SceneObjectSerializer.FromOriginalXmlFormat(soXml); - - if (so != null) - { - coa.Add(so); - } - else - { - // XXX: Possibly we should fail outright here rather than continuing if a particular component of the - // coalesced object fails to load. - m_log.WarnFormat( - "[COALESCED SCENE OBJECTS SERIALIZER]: Deserialization of xml for component {0} failed. Continuing.", - i); - } - - i++; - } - } - - reader.ReadEndElement(); // CoalescedObject } - catch (Exception e) - { - m_log.ErrorFormat( - "[COALESCED SCENE OBJECTS SERIALIZER]: Deserialization of xml failed with {0} {1}", - e.Message, e.StackTrace); + } + + XmlDocument doc = new XmlDocument(); + doc.LoadXml(xml); + XmlElement e = (XmlElement)doc.SelectSingleNode("/CoalescedObject"); + if (e == null) + return false; - return false; - } + coa = new CoalescedSceneObjects(UUID.Zero); + + XmlNodeList groups = e.SelectNodes("SceneObjectGroup"); + int i = 0; + + foreach (XmlNode n in groups) + { + SceneObjectGroup so = SceneObjectSerializer.FromOriginalXmlFormat(n.OuterXml); + if (so != null) + { + coa.Add(so); + } + else + { + // XXX: Possibly we should fail outright here rather than continuing if a particular component of the + // coalesced object fails to load. + m_log.WarnFormat( + "[COALESCED SCENE OBJECTS SERIALIZER]: Deserialization of xml for component {0} failed. Continuing.", + i); + } + + i++; } } + catch (Exception e) + { + m_log.Error(string.Format( + "[COALESCED SCENE OBJECTS SERIALIZER]: Deserialization of xml failed with {0} ", + e.Message), e); + + return false; + } return true; } } -} \ No newline at end of file +} From 6a477e044dfee014ff99b1ac56a39bd5e629283a Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Mon, 25 Nov 2013 18:28:23 +0200 Subject: [PATCH 39/40] If prim region crossing fails then don't delete the prim from the original region Resolves http://opensimulator.org/mantis/view.php?id=6946 --- .../Connectors/Simulation/SimulationServiceConnector.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs index aca414b82c..171beaa096 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs @@ -421,11 +421,18 @@ namespace OpenSim.Services.Connectors.Simulation args["destination_name"] = OSD.FromString(destination.RegionName); args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString()); - WebUtil.PostToService(uri, args, 40000); + OSDMap result = WebUtil.PostToService(uri, args, 40000); + + if (result == null) + return false; + bool success = result["success"].AsBoolean(); + if (!success) + return false; } catch (Exception e) { m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] CreateObject failed with exception; {0}",e.ToString()); + return false; } return true; From 8276a9e5f7f91e6c774658228df7bf84f45fc252 Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Sun, 1 Dec 2013 14:35:17 +0200 Subject: [PATCH 40/40] Fixed Debug command for Groups. (Use of wrong capitalization caused *two* "debug" options to appear in "help") This is a (small) part of http://opensimulator.org/mantis/view.php?id=6949 --- OpenSim/Addons/Groups/GroupsModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Addons/Groups/GroupsModule.cs b/OpenSim/Addons/Groups/GroupsModule.cs index 7f453dbf8c..f11606a7b4 100644 --- a/OpenSim/Addons/Groups/GroupsModule.cs +++ b/OpenSim/Addons/Groups/GroupsModule.cs @@ -101,7 +101,7 @@ namespace OpenSim.Groups { scene.RegisterModuleInterface(this); scene.AddCommand( - "debug", + "Debug", this, "debug groups verbose", "debug groups verbose ",