From 7e21c1eadf28e86b29fdd24b33e29950e195c6db Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 12 Feb 2011 00:46:01 +0000 Subject: [PATCH 1/9] Hack in a crude temporary "estate show" command This will show the estate for each region, along with that estate's id and the estate owner. This is temporary because the command output might change. This commit also converts the estate module from the old to the new region module format --- .../World/Estate/EstateManagementCommands.cs | 74 ++++++++++++++++++- .../World/Estate/EstateManagementModule.cs | 40 +++++----- .../Framework/Interfaces/IEstateModule.cs | 2 +- 3 files changed, 94 insertions(+), 22 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs index 14f5b1ef94..f6d1a826c7 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs @@ -30,21 +30,29 @@ using System.Collections.Generic; using System.IO; using System.Reflection; using System.Security; +using System.Text; using log4net; using Nini.Config; using OpenMetaverse; using OpenSim.Framework; +using OpenSim.Framework.Console; +using OpenSim.Region.CoreModules.Framework.InterfaceCommander; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; namespace OpenSim.Region.CoreModules.World.Estate { + /// + /// Estate management console commands. + /// public class EstateManagementCommands { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); protected EstateManagementModule m_module; + protected Commander m_commander = new Commander("estate"); + public EstateManagementCommands(EstateManagementModule module) { m_module = module; @@ -52,20 +60,60 @@ namespace OpenSim.Region.CoreModules.World.Estate public void Initialise() { - m_module.Scene.AddCommand(this, "set terrain texture", + m_log.DebugFormat("[ESTATE MODULE]: Setting up estate commands for region {0}", m_module.Scene.RegionInfo.RegionName); + + m_module.Scene.AddCommand(m_module, "set terrain texture", "set terrain texture [] []", "Sets the terrain to , if or are specified, it will only " + "set it on regions with a matching coordinate. Specify -1 in or to wildcard" + " that coordinate.", consoleSetTerrainTexture); - m_module.Scene.AddCommand(this, "set terrain heights", + m_module.Scene.AddCommand(m_module, "set terrain heights", "set terrain heights [] []", "Sets the terrain texture heights on corner # to /, if or are specified, it will only " + "set it on regions with a matching coordinate. Specify -1 in or to wildcard" + " that coordinate. Corner # SW = 0, NW = 1, SE = 2, NE = 3.", consoleSetTerrainHeights); - } + + Command showCommand + = new Command("show", CommandIntentions.COMMAND_STATISTICAL, ShowEstatesCommand, "Shows all estates on the simulator."); + + m_commander.RegisterCommand("show", showCommand); + + m_module.Scene.RegisterModuleCommander(m_commander); + + m_module.Scene.EventManager.OnPluginConsole += EventManagerOnPluginConsole; + } + + public void Close() + { + m_module.Scene.EventManager.OnPluginConsole -= EventManagerOnPluginConsole; + m_module.Scene.UnregisterModuleCommander(m_commander.Name); + } + + /// + /// Processes commandline input. Do not call directly. + /// + /// Commandline arguments + protected void EventManagerOnPluginConsole(string[] args) + { + if (args[0] == "estate") + { + if (args.Length == 1) + { + m_commander.ProcessConsoleCommand("help", new string[0]); + return; + } + + string[] tmpArgs = new string[args.Length - 2]; + int i; + for (i = 2; i < args.Length; i++) + tmpArgs[i - 2] = args[i]; + + m_commander.ProcessConsoleCommand(args[1], tmpArgs); + } + } protected void consoleSetTerrainTexture(string module, string[] args) { @@ -152,5 +200,25 @@ namespace OpenSim.Region.CoreModules.World.Estate } } } + + protected void ShowEstatesCommand(Object[] args) + { + StringBuilder report = new StringBuilder(); + RegionInfo ri = m_module.Scene.RegionInfo; + EstateSettings es = ri.EstateSettings; + + report.AppendFormat("Estate information for region {0}\n", ri.RegionName); + report.AppendFormat( + "{0,-20} {1,-7} {2,-20}\n", + "Estate Name", + "ID", + "Owner"); + + report.AppendFormat( + "{0,-20} {1,-7} {2,-20}\n", + es.EstateName, es.EstateID, m_module.UserManager.GetUserName(es.EstateOwner)); + + MainConsole.Instance.Output(report.ToString()); + } } } \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 54d3c6126d..57ab13550a 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs @@ -31,6 +31,7 @@ using System.IO; using System.Reflection; using System.Security; using log4net; +using Mono.Addins; using Nini.Config; using OpenMetaverse; using OpenSim.Framework; @@ -39,15 +40,17 @@ using OpenSim.Region.Framework.Scenes; namespace OpenSim.Region.CoreModules.World.Estate { - public class EstateManagementModule : IEstateModule + [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "EstateManagementModule")] + public class EstateManagementModule : IEstateModule, INonSharedRegionModule { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private delegate void LookupUUIDS(List uuidLst); public Scene Scene { get; private set; } + public IUserManagement UserManager { get; private set; } - protected EstateManagementCommands m_commands; + protected EstateManagementCommands m_commands; private EstateTerrainXferHandler TerrainUploader; @@ -895,9 +898,15 @@ namespace OpenSim.Region.CoreModules.World.Estate #endregion #region IRegionModule Members + + public string Name { get { return "EstateManagementModule"; } } + + public Type ReplaceableInterface { get { return null; } } - public void Initialise(Scene scene, IConfigSource source) - { + public void Initialise(IConfigSource source) {} + + public void AddRegion(Scene scene) + { Scene = scene; Scene.RegisterModuleInterface(this); Scene.EventManager.OnNewClient += EventManager_OnNewClient; @@ -906,26 +915,21 @@ namespace OpenSim.Region.CoreModules.World.Estate m_commands = new EstateManagementCommands(this); m_commands.Initialise(); } - - public void PostInitialise() + + public void RemoveRegion(Scene scene) {} + + public void RegionLoaded(Scene scene) { // Sets up the sun module based no the saved Estate and Region Settings // DO NOT REMOVE or the sun will stop working - Scene.TriggerEstateSunUpdate(); + scene.TriggerEstateSunUpdate(); + + UserManager = scene.RequestModuleInterface(); } - public void Close() + public void Close() { - } - - public string Name - { - get { return "EstateManagementModule"; } - } - - public bool IsSharedModule - { - get { return false; } + m_commands.Close(); } #endregion diff --git a/OpenSim/Region/Framework/Interfaces/IEstateModule.cs b/OpenSim/Region/Framework/Interfaces/IEstateModule.cs index c850f7fd81..721f0eedea 100644 --- a/OpenSim/Region/Framework/Interfaces/IEstateModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IEstateModule.cs @@ -32,7 +32,7 @@ namespace OpenSim.Region.Framework.Interfaces public delegate void ChangeDelegate(UUID regionID); public delegate void MessageDelegate(UUID regionID, UUID fromID, string fromName, string message); - public interface IEstateModule : IRegionModule + public interface IEstateModule { event ChangeDelegate OnRegionInfoChange; event ChangeDelegate OnEstateInfoChange; From 03d82a5a8524cfba07d95456d59be6f35ab72048 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 12 Feb 2011 01:08:56 +0000 Subject: [PATCH 2/9] Fix bug where "My estate" name was always used even if the user entered a different name on initial setup. Turns out we had stopped saving estate settings immediately after the name change. The scene constructor then reloade the settings and oblitereted the different name. This code could be more efficient since there's no reason for scene to reload the settings when they are already known to be valid. Thanks to Thoneve for the spot on this. --- .../LoadRegions/LoadRegionsPlugin.cs | 2 ++ OpenSim/Region/Application/OpenSimBase.cs | 12 ++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs index 7ef0f5f455..f37c399050 100644 --- a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs +++ b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs @@ -122,9 +122,11 @@ namespace OpenSim.ApplicationPlugins.LoadRegions m_log.Debug("[LOADREGIONS]: Creating Region: " + regionsToLoad[i].RegionName + " (ThreadID: " + Thread.CurrentThread.ManagedThreadId.ToString() + ")"); + m_openSim.PopulateRegionEstateInfo(regionsToLoad[i]); m_openSim.CreateRegion(regionsToLoad[i], true, out scene); regionsToLoad[i].EstateSettings.Save(); + if (scene != null) { m_newRegionCreatedHandler = OnNewRegionCreated; diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 1652b82542..e950613e6b 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -795,9 +795,7 @@ namespace OpenSim /// /// Load the estate information for the provided RegionInfo object. /// - /// - /// A - /// + /// public void PopulateRegionEstateInfo(RegionInfo regInfo) { IEstateDataService estateDataService = EstateDataService; @@ -819,7 +817,13 @@ namespace OpenSim regInfo.EstateSettings = estateDataService.LoadEstateSettings(regInfo.RegionID, true); regInfo.EstateSettings.EstateName = MainConsole.Instance.CmdPrompt("New estate name", regInfo.EstateSettings.EstateName); - //regInfo.EstateSettings.Save(); + + // FIXME: Later on, the scene constructor will reload the estate settings no matter what. + // Therefore, we need to do an initial save here otherwise the new estate name will be reset + // back to the default. The reloading of estate settings by scene could be eliminated if it + // knows that the passed in settings in RegionInfo are already valid. Also, it might be + // possible to eliminate some additional later saves made by callers of this method. + regInfo.EstateSettings.Save(); break; } else From 9801bf03f8ab59e1fe8d439a216ca48a5bd68dc7 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 12 Feb 2011 01:14:12 +0000 Subject: [PATCH 3/9] minor: add comment explaining that GetRegionsByName needs to stay in TeleportAgent for its side effects. --- .../Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 3f8735e0c1..688dfe4649 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -702,6 +702,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // and convert the regionName to the target region if (regionName.Contains(".") && regionName.Contains(":")) { + // Even though we use none of the results, we need to perform this call because it appears + // to have some the side effect of setting up hypergrid teleport locations. World.GridService.GetRegionsByName(World.RegionInfo.ScopeID, regionName, 1); // List regions = World.GridService.GetRegionsByName(World.RegionInfo.ScopeID, regionName, 1); From a8ced66e873d09bd1c9fd0cfe5d0487bf0ee27e7 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 12 Feb 2011 07:28:21 -0800 Subject: [PATCH 4/9] Improved error message on TP failure --- .../Framework/EntityTransfer/EntityTransferModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 80a804137f..1337143a31 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -243,7 +243,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer } catch (Exception e) { - m_log.WarnFormat("[ENTITY TRANSFER MODULE]: Exception on teleport: {0}\n{1}", e.Message, e.StackTrace); + m_log.WarnFormat("[ENTITY TRANSFER MODULE]: Exception on teleport: {0} {1}", e.Message, e.StackTrace); sp.ControllingClient.SendTeleportFailed("Internal error"); } } From 059e9eaf98c93c0befd84b99c88d9411ddd73817 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 12 Feb 2011 14:38:46 -0800 Subject: [PATCH 5/9] Fixed a couple of tests in the HttpServer. Not sure if this is enough. Mantis #5373 and #5384 --- bin/HttpServer_OpenSim.dll | Bin 115712 -> 115712 bytes bin/HttpServer_OpenSim.pdb | Bin 409088 -> 409088 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/HttpServer_OpenSim.dll b/bin/HttpServer_OpenSim.dll index d7503a0915af2502889385f98811510dc784a79a..a7a1303c63a454d186cd99f206b470a6127d054c 100644 GIT binary patch delta 253 zcmVJK6BT57>P4?zU%KC zuW_Ci{0d{AudhKr6z0W1V3$w2hN9{1Vqu&J8PX> z_5ljB&;nCT0Wz~BPck3@F|${1cJU-eGBY?eG&wabIWsaaEi^JRGc7?eG(s&fLqjz= zGDAc|HZ?G}@n8XLJr7hk@*tBVLZM3x#gfg&P`7NJ0U#X%mIhaskGlaW0R*?Xy8%ZC D!ZK&R delta 253 zcmVGDbAF@n8XLJrBFeK6v$~N}dV%hHtfk^tWuD0U#X%{c8=EkGlaW0Ry+Wy8%ZC D8Y*fD diff --git a/bin/HttpServer_OpenSim.pdb b/bin/HttpServer_OpenSim.pdb index 4151588c66c50454ae010ae60b3cd6c3ae16444a..c6f3b235f1d96ddf38bce3e3b6b4e5ee4c7959d2 100644 GIT binary patch delta 9437 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 DS+?Da delta 12764 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 Rb8u;pEp$x+-x_VR{U0C!R&f9T From c169a62f557c9361da73da901e9f188d8b8bdeb8 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 12 Feb 2011 18:05:25 -0800 Subject: [PATCH 6/9] Typo --- OpenSim/Services/AssetService/AssetService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Services/AssetService/AssetService.cs b/OpenSim/Services/AssetService/AssetService.cs index 3fd2fcf4d6..a81af4355a 100644 --- a/OpenSim/Services/AssetService/AssetService.cs +++ b/OpenSim/Services/AssetService/AssetService.cs @@ -93,7 +93,7 @@ namespace OpenSim.Services.AssetService if (!UUID.TryParse(id, out assetID)) { - m_log.WarnFormat("[ASSET SERVICE]: Could not parse requested sset id {0}", id); + m_log.WarnFormat("[ASSET SERVICE]: Could not parse requested asset id {0}", id); return null; } From 19d3792278643af0d45dd09f338a33ad78a138b7 Mon Sep 17 00:00:00 2001 From: Marck Date: Sat, 12 Feb 2011 20:02:42 +0100 Subject: [PATCH 7/9] Fix and simplify QBasedComparer. Make parsing of qvalues independent from a system's language setting and ensure that the comparison adheres to a descending order. --- OpenSim/Framework/WebUtil.cs | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs index d731ac5882..1feeeb31e5 100644 --- a/OpenSim/Framework/WebUtil.cs +++ b/OpenSim/Framework/WebUtil.cs @@ -29,6 +29,7 @@ using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; +using System.Globalization; using System.IO; using System.Net; using System.Net.Security; @@ -557,34 +558,27 @@ namespace OpenSim.Framework { float qx = GetQ(x); float qy = GetQ(y); - if (qx < qy) - return -1; - if (qx == qy) - return 0; - return 1; + return qy.CompareTo(qx); // descending order } private float GetQ(Object o) { // Example: image/png;q=0.9 + float qvalue = 1F; if (o is String) { string mime = (string)o; - string[] parts = mime.Split(new char[] { ';' }); + string[] parts = mime.Split(';'); if (parts.Length > 1) { - string[] kvp = parts[1].Split(new char[] { '=' }); + string[] kvp = parts[1].Split('='); if (kvp.Length == 2 && kvp[0] == "q") - { - float qvalue = 1F; - float.TryParse(kvp[1], out qvalue); - return qvalue; - } + float.TryParse(kvp[1], NumberStyles.Number, CultureInfo.InvariantCulture, out qvalue); } } - return 1F; + return qvalue; } } From c75e916ccfb195554c5010ab4187c4d74b81c4e1 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Sun, 13 Feb 2011 00:30:43 -0500 Subject: [PATCH 8/9] Set filter to send proper rotations for root part This allows the root prim, alone or in a set, to send it's rotation. This fixes unsitting the avatar on sit-offsest type teleports where the sit target is in the root prim of a linkset. --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 6a92378ea7..4d5eedfc95 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -2099,7 +2099,7 @@ namespace OpenSim.Region.Framework.Scenes { Quaternion newRot; - if (this.LinkNum == 0) + if (this.LinkNum == 0 || this.LinkNum == 1) { newRot = RotationOffset; } From 5d6d0aa14226fe31e59c4f2e8a9bd6d6dfc4f995 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Tue, 15 Feb 2011 08:38:37 -0800 Subject: [PATCH 9/9] Catch HttpServer exception: mantis #5381 --- bin/HttpServer_OpenSim.dll | Bin 115712 -> 115712 bytes bin/HttpServer_OpenSim.pdb | Bin 409088 -> 409088 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/HttpServer_OpenSim.dll b/bin/HttpServer_OpenSim.dll index a7a1303c63a454d186cd99f206b470a6127d054c..95ea5dd7ffc4891df56a52ba27d558cb81ea2d1a 100644 GIT binary patch delta 434 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 Hd3gLAM%y~8 delta 7702 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 k<&mTmn(o#5ysNL2K`