From 686f44c575312950b96413380e7506523d44090f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 11 Aug 2010 18:30:07 +0100 Subject: [PATCH 01/34] minor: change "no [GridInfo] config" warning to refer to "configuration files" rather than "OpenSim.ini" --- OpenSim/Server/Handlers/Grid/GridInfoHandlers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Server/Handlers/Grid/GridInfoHandlers.cs b/OpenSim/Server/Handlers/Grid/GridInfoHandlers.cs index d1233dc0e4..b07d447fb0 100644 --- a/OpenSim/Server/Handlers/Grid/GridInfoHandlers.cs +++ b/OpenSim/Server/Handlers/Grid/GridInfoHandlers.cs @@ -111,7 +111,7 @@ namespace OpenSim.Server.Handlers.Grid private void IssueWarning() { - _log.Warn("[GRID INFO SERVICE]: found no [GridInfo] section in your OpenSim.ini"); + _log.Warn("[GRID INFO SERVICE]: found no [GridInfo] section in your configuration files"); _log.Warn("[GRID INFO SERVICE]: trying to guess sensible defaults, you might want to provide better ones:"); foreach (string k in _info.Keys) From 576faee203126e42b80050867da3ae6769009f06 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 11 Aug 2010 23:17:29 +0100 Subject: [PATCH 02/34] minor: change some logging levels --- OpenSim/Server/Handlers/Grid/GridInfoHandlers.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/OpenSim/Server/Handlers/Grid/GridInfoHandlers.cs b/OpenSim/Server/Handlers/Grid/GridInfoHandlers.cs index b07d447fb0..cdab49ed6b 100644 --- a/OpenSim/Server/Handlers/Grid/GridInfoHandlers.cs +++ b/OpenSim/Server/Handlers/Grid/GridInfoHandlers.cs @@ -102,11 +102,10 @@ namespace OpenSim.Server.Handlers.Grid } catch (Exception) { - _log.Debug("[GRID INFO SERVICE]: Cannot get grid info from config source, using minimal defaults"); + _log.Warn("[GRID INFO SERVICE]: Cannot get grid info from config source, using minimal defaults"); } _log.DebugFormat("[GRID INFO SERVICE]: Grid info service initialized with {0} keys", _info.Count); - } private void IssueWarning() @@ -125,7 +124,7 @@ namespace OpenSim.Server.Handlers.Grid XmlRpcResponse response = new XmlRpcResponse(); Hashtable responseData = new Hashtable(); - _log.Info("[GRID INFO SERVICE]: Request for grid info"); + _log.Debug("[GRID INFO SERVICE]: Request for grid info"); foreach (string k in _info.Keys) { From 251be8a1be55ecdacc36b1d01d17c4ac6da45c60 Mon Sep 17 00:00:00 2001 From: Marck Date: Tue, 10 Aug 2010 22:39:03 +0200 Subject: [PATCH 03/34] Prettify console output for long avatar names. --- OpenSim/Region/Application/OpenSim.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 501d47f6d1..c541249627 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -418,7 +418,7 @@ namespace OpenSim { MainConsole.Instance.Output( String.Format( - "Kicking user: {0,-16}{1,-16}{2,-37} in region: {3,-16}", + "Kicking user: {0,-16} {1,-16} {2,-37} in region: {3,-16}", presence.Firstname, presence.Lastname, presence.UUID, regionInfo.RegionName)); // kick client... @@ -861,7 +861,7 @@ namespace OpenSim MainConsole.Instance.Output(String.Format("\nAgents connected: {0}\n", agents.Count)); MainConsole.Instance.Output( - String.Format("{0,-16}{1,-16}{2,-37}{3,-11}{4,-16}{5,-30}", "Firstname", "Lastname", + String.Format("{0,-16} {1,-16} {2,-37} {3,-11} {4,-16} {5,-30}", "Firstname", "Lastname", "Agent ID", "Root/Child", "Region", "Position")); foreach (ScenePresence presence in agents) @@ -880,7 +880,7 @@ namespace OpenSim MainConsole.Instance.Output( String.Format( - "{0,-16}{1,-16}{2,-37}{3,-11}{4,-16}{5,-30}", + "{0,-16} {1,-16} {2,-37} {3,-11} {4,-16} {5,-30}", presence.Firstname, presence.Lastname, presence.UUID, From c98c6a2930af5112fe2afdedcb0ccbb76e59d218 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 11 Aug 2010 20:38:10 -0700 Subject: [PATCH 04/34] File wants to be committed --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 74b10c3c2c..33aa8eee0e 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -3313,7 +3313,7 @@ namespace OpenSim.Region.Framework.Scenes texcolor.B = Util.Clip((float)color.Z, 0.0f, 1.0f); tex.FaceTextures[face].RGBA = texcolor; UpdateTexture(tex); - TriggerScriptChangedEvent(Changed.COLOR); + TriggerScriptChangedEvent(Changed.COLOR); return; } else if (face == ALL_SIDES) @@ -3335,7 +3335,7 @@ namespace OpenSim.Region.Framework.Scenes tex.DefaultTexture.RGBA = texcolor; } UpdateTexture(tex); - TriggerScriptChangedEvent(Changed.COLOR); + TriggerScriptChangedEvent(Changed.COLOR); return; } } From 39a748b47a5eb8020f167287c84a91bee0881cca Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 13 Aug 2010 20:23:53 +0100 Subject: [PATCH 05/34] refactor: Use SOP.Flags rather than SOP.ObjectFlags --- OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs | 4 ++-- OpenSim/Data/MySQL/MySQLLegacyRegionData.cs | 4 ++-- OpenSim/Data/SQLiteLegacy/SQLiteRegionData.cs | 4 ++-- OpenSim/Data/Tests/RegionTests.cs | 8 ++++---- .../InventoryAccess/InventoryAccessModule.cs | 4 ++-- OpenSim/Region/DataSnapshot/ObjectSnapshot.cs | 2 +- OpenSim/Region/Framework/Scenes/Scene.cs | 6 +++--- OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 6 +++--- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 12 ++++++------ 9 files changed, 25 insertions(+), 25 deletions(-) diff --git a/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs b/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs index 7c176c79de..7d017a6e17 100644 --- a/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs +++ b/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs @@ -1017,7 +1017,7 @@ VALUES prim.SitName = (string)primRow["SitName"]; prim.TouchName = (string)primRow["TouchName"]; // permissions - prim.ObjectFlags = Convert.ToUInt32(primRow["ObjectFlags"]); + prim.Flags = (PrimFlags)Convert.ToUInt32(primRow["ObjectFlags"]); prim.CreatorID = new UUID((Guid)primRow["CreatorID"]); prim.OwnerID = new UUID((Guid)primRow["OwnerID"]); prim.GroupID = new UUID((Guid)primRow["GroupID"]); @@ -1408,7 +1408,7 @@ VALUES parameters.Add(_Database.CreateParameter("SitName", prim.SitName)); parameters.Add(_Database.CreateParameter("TouchName", prim.TouchName)); // permissions - parameters.Add(_Database.CreateParameter("ObjectFlags", prim.ObjectFlags)); + parameters.Add(_Database.CreateParameter("ObjectFlags", (uint)prim.Flags)); parameters.Add(_Database.CreateParameter("CreatorID", prim.CreatorID)); parameters.Add(_Database.CreateParameter("OwnerID", prim.OwnerID)); parameters.Add(_Database.CreateParameter("GroupID", prim.GroupID)); diff --git a/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs b/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs index d8debc5274..1edcb5d499 100644 --- a/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs +++ b/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs @@ -1081,7 +1081,7 @@ namespace OpenSim.Data.MySQL prim.SitName = (string)row["SitName"]; prim.TouchName = (string)row["TouchName"]; // Permissions - prim.ObjectFlags = (uint)(int)row["ObjectFlags"]; + prim.Flags = (PrimFlags)(int)row["ObjectFlags"]; prim.OwnerMask = (uint)(int)row["OwnerMask"]; prim.NextOwnerMask = (uint)(int)row["NextOwnerMask"]; prim.GroupMask = (uint)(int)row["GroupMask"]; @@ -1414,7 +1414,7 @@ namespace OpenSim.Data.MySQL cmd.Parameters.AddWithValue("SitName", prim.SitName); cmd.Parameters.AddWithValue("TouchName", prim.TouchName); // permissions - cmd.Parameters.AddWithValue("ObjectFlags", prim.ObjectFlags); + cmd.Parameters.AddWithValue("ObjectFlags", (uint)prim.Flags); cmd.Parameters.AddWithValue("CreatorID", prim.CreatorID.ToString()); cmd.Parameters.AddWithValue("OwnerID", prim.OwnerID.ToString()); cmd.Parameters.AddWithValue("GroupID", prim.GroupID.ToString()); diff --git a/OpenSim/Data/SQLiteLegacy/SQLiteRegionData.cs b/OpenSim/Data/SQLiteLegacy/SQLiteRegionData.cs index eb78037bb1..289fd948ce 100644 --- a/OpenSim/Data/SQLiteLegacy/SQLiteRegionData.cs +++ b/OpenSim/Data/SQLiteLegacy/SQLiteRegionData.cs @@ -1187,7 +1187,7 @@ namespace OpenSim.Data.SQLiteLegacy prim.SitName = (String) row["SitName"]; prim.TouchName = (String) row["TouchName"]; // permissions - prim.ObjectFlags = Convert.ToUInt32(row["ObjectFlags"]); + prim.Flags = (PrimFlags)Convert.ToUInt32(row["ObjectFlags"]); prim.CreatorID = new UUID((String) row["CreatorID"]); prim.OwnerID = new UUID((String) row["OwnerID"]); prim.GroupID = new UUID((String) row["GroupID"]); @@ -1521,7 +1521,7 @@ namespace OpenSim.Data.SQLiteLegacy row["SitName"] = prim.SitName; row["TouchName"] = prim.TouchName; // permissions - row["ObjectFlags"] = prim.ObjectFlags; + row["ObjectFlags"] = (uint)prim.Flags; row["CreatorID"] = prim.CreatorID.ToString(); row["OwnerID"] = prim.OwnerID.ToString(); row["GroupID"] = prim.GroupID.ToString(); diff --git a/OpenSim/Data/Tests/RegionTests.cs b/OpenSim/Data/Tests/RegionTests.cs index eeffddaa1b..3cd9e0be1e 100644 --- a/OpenSim/Data/Tests/RegionTests.cs +++ b/OpenSim/Data/Tests/RegionTests.cs @@ -317,7 +317,7 @@ namespace OpenSim.Data.Tests sop.CreatorID = creator; sop.InventorySerial = iserial; sop.TaskInventory = dic; - sop.ObjectFlags = objf; + sop.Flags = (PrimFlags)objf; sop.Name = name; sop.Material = material; sop.ScriptAccessPin = pin; @@ -350,7 +350,7 @@ namespace OpenSim.Data.Tests // Modified in-class // Assert.That(iserial,Is.EqualTo(sop.InventorySerial), "Assert.That(iserial,Is.EqualTo(sop.InventorySerial))"); Assert.That(dic,Is.EqualTo(sop.TaskInventory), "Assert.That(dic,Is.EqualTo(sop.TaskInventory))"); - Assert.That(objf,Is.EqualTo(sop.ObjectFlags), "Assert.That(objf,Is.EqualTo(sop.ObjectFlags))"); + Assert.That(objf, Is.EqualTo((uint)sop.Flags), "Assert.That(objf,Is.EqualTo(sop.Flags))"); Assert.That(name,Is.EqualTo(sop.Name), "Assert.That(name,Is.EqualTo(sop.Name))"); Assert.That(material,Is.EqualTo(sop.Material), "Assert.That(material,Is.EqualTo(sop.Material))"); Assert.That(pin,Is.EqualTo(sop.ScriptAccessPin), "Assert.That(pin,Is.EqualTo(sop.ScriptAccessPin))"); @@ -373,7 +373,7 @@ namespace OpenSim.Data.Tests Assert.That(updatef,Is.EqualTo(sop.UpdateFlag), "Assert.That(updatef,Is.EqualTo(sop.UpdateFlag))"); // This is necessary or object will not be inserted in DB - sop.ObjectFlags = 0; + sop.Flags = PrimFlags.None; SceneObjectGroup sog = new SceneObjectGroup(sop); @@ -398,7 +398,7 @@ namespace OpenSim.Data.Tests Assert.That(creator,Is.EqualTo(p.CreatorID), "Assert.That(creator,Is.EqualTo(p.CreatorID))"); //Assert.That(iserial,Is.EqualTo(p.InventorySerial), "Assert.That(iserial,Is.EqualTo(p.InventorySerial))"); Assert.That(dic,Is.EqualTo(p.TaskInventory), "Assert.That(dic,Is.EqualTo(p.TaskInventory))"); - //Assert.That(objf,Is.EqualTo(p.ObjectFlags), "Assert.That(objf,Is.EqualTo(p.ObjectFlags))"); + //Assert.That(objf, Is.EqualTo((uint)p.Flags), "Assert.That(objf,Is.EqualTo(p.Flags))"); Assert.That(name,Is.EqualTo(p.Name), "Assert.That(name,Is.EqualTo(p.Name))"); Assert.That(material,Is.EqualTo(p.Material), "Assert.That(material,Is.EqualTo(p.Material))"); Assert.That(pin,Is.EqualTo(p.ScriptAccessPin), "Assert.That(pin,Is.EqualTo(p.ScriptAccessPin))"); diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index 1a7da61105..eef0c731af 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) Contributors, http://opensimulator.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * @@ -543,7 +543,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess if (attachment) { - group.RootPart.ObjectFlags |= (uint)PrimFlags.Phantom; + group.RootPart.Flags |= PrimFlags.Phantom; group.RootPart.IsAttachment = true; } diff --git a/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs b/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs index 00f6918600..c489972e25 100644 --- a/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs +++ b/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs @@ -135,7 +135,7 @@ namespace OpenSim.Region.DataSnapshot.Providers xmlobject.AppendChild(node); node = nodeFactory.CreateNode(XmlNodeType.Element, "flags", ""); - node.InnerText = String.Format("{0:x}", m_rootPart.ObjectFlags); + node.InnerText = String.Format("{0:x}", (uint)m_rootPart.Flags); xmlobject.AppendChild(node); node = nodeFactory.CreateNode(XmlNodeType.Element, "regionuuid", ""); diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 0eb28f4c5f..afdb95b413 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1897,7 +1897,7 @@ namespace OpenSim.Region.Framework.Scenes AddRestoredSceneObject(group, true, true); SceneObjectPart rootPart = group.GetChildPart(group.UUID); - rootPart.ObjectFlags &= ~(uint)PrimFlags.Scripted; + rootPart.Flags &= ~PrimFlags.Scripted; rootPart.TrimPermissions(); group.CheckSculptAndLoad(); //rootPart.DoPhysicsPropertyUpdate(UsePhysics, true); @@ -2184,7 +2184,7 @@ namespace OpenSim.Region.Framework.Scenes foreach (SceneObjectPart part in group.Children.Values) { - if (part.IsJoint() && ((part.ObjectFlags&(uint)PrimFlags.Physics) != 0)) + if (part.IsJoint() && ((part.Flags & PrimFlags.Physics) != 0)) { PhysicsScene.RequestJointDeletion(part.Name); // FIXME: what if the name changed? } @@ -4852,7 +4852,7 @@ namespace OpenSim.Region.Framework.Scenes } // turn the proxy non-physical, which also stops its client-side interpolation - bool wasUsingPhysics = ((jointProxyObject.ObjectFlags & (uint)PrimFlags.Physics) != 0); + bool wasUsingPhysics = ((jointProxyObject.Flags & PrimFlags.Physics) != 0); if (wasUsingPhysics) { jointProxyObject.UpdatePrimFlags(false, false, true, false); // FIXME: possible deadlock here; check to make sure all the scene alterations set into motion here won't deadlock diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 3670080b7f..117f86900b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -1322,9 +1322,9 @@ namespace OpenSim.Region.Framework.Scenes public void aggregateScriptEvents() { - uint objectflagupdate=(uint)RootPart.GetEffectiveObjectFlags(); + PrimFlags objectflagupdate = (PrimFlags)RootPart.GetEffectiveObjectFlags(); - scriptEvents aggregateScriptEvents=0; + scriptEvents aggregateScriptEvents = 0; lock (m_parts) { @@ -1333,7 +1333,7 @@ namespace OpenSim.Region.Framework.Scenes if (part == null) continue; if (part != RootPart) - part.ObjectFlags = objectflagupdate; + part.Flags = objectflagupdate; aggregateScriptEvents |= part.AggregateScriptEvents; } } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 33aa8eee0e..2ad4223670 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -1324,7 +1324,7 @@ namespace OpenSim.Region.Framework.Scenes public void AddFlag(PrimFlags flag) { // PrimFlags prevflag = Flags; - if ((ObjectFlags & (uint) flag) == 0) + if ((Flags & flag) == 0) { //m_log.Debug("Adding flag: " + ((PrimFlags) flag).ToString()); Flags |= flag; @@ -1607,7 +1607,7 @@ namespace OpenSim.Region.Framework.Scenes dupe.Velocity = new Vector3(0, 0, 0); dupe.Acceleration = new Vector3(0, 0, 0); dupe.AngularVelocity = new Vector3(0, 0, 0); - dupe.ObjectFlags = ObjectFlags; + dupe.Flags = Flags; dupe._ownershipCost = _ownershipCost; dupe._objectSaleType = _objectSaleType; @@ -1644,7 +1644,7 @@ namespace OpenSim.Region.Framework.Scenes m_parentGroup.Scene.AssetService.Get(dupe.m_shape.SculptTexture.ToString(), dupe, AssetReceived); } - bool UsePhysics = ((dupe.ObjectFlags & (uint)PrimFlags.Physics) != 0); + bool UsePhysics = ((dupe.Flags & PrimFlags.Physics) != 0); dupe.DoPhysicsPropertyUpdate(UsePhysics, true); } @@ -4271,9 +4271,9 @@ namespace OpenSim.Region.Framework.Scenes public void UpdatePrimFlags(bool UsePhysics, bool IsTemporary, bool IsPhantom, bool IsVD) { - bool wasUsingPhysics = ((ObjectFlags & (uint) PrimFlags.Physics) != 0); - bool wasTemporary = ((ObjectFlags & (uint)PrimFlags.TemporaryOnRez) != 0); - bool wasPhantom = ((ObjectFlags & (uint)PrimFlags.Phantom) != 0); + bool wasUsingPhysics = ((Flags & PrimFlags.Physics) != 0); + bool wasTemporary = ((Flags & PrimFlags.TemporaryOnRez) != 0); + bool wasPhantom = ((Flags & PrimFlags.Phantom) != 0); bool wasVD = VolumeDetectActive; if ((UsePhysics == wasUsingPhysics) && (wasTemporary == IsTemporary) && (wasPhantom == IsPhantom) && (IsVD==wasVD)) From 5f5c65e4bae1f2a84d6972697d0413137f6b1da1 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 13 Aug 2010 20:34:46 +0100 Subject: [PATCH 06/34] refactor: move more map tile generation code from scene to IWorldMapModule --- OpenSim/Region/Application/OpenSimBase.cs | 8 ++++-- .../World/WorldMap/WorldMapModule.cs | 17 ++++++++++-- .../Framework/Interfaces/IWorldMapModule.cs | 5 +++- OpenSim/Region/Framework/Scenes/Scene.cs | 27 ------------------- 4 files changed, 25 insertions(+), 32 deletions(-) diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index f535fe805a..e148cde14c 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -347,9 +347,13 @@ namespace OpenSim // Prims have to be loaded after module configuration since some modules may be invoked during the load scene.LoadPrimsFromStorage(regionInfo.originRegionID); - // moved these here as the terrain texture has to be created after the modules are initialized + // moved these here as the map texture has to be created after the modules are initialized // and has to happen before the region is registered with the grid. - scene.CreateTerrainTexture(); + IWorldMapModule mapModule = scene.RequestModuleInterface(); + if (mapModule != null) + mapModule.GenerateMaptile(); + else + m_log.WarnFormat("[STARTUP]: No map module available to generate map tile"); // TODO : Try setting resource for region xstats here on scene MainServer.Instance.AddStreamHandler(new Region.Framework.Scenes.RegionStatsHandler(regionInfo)); diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs index 9d9967a22b..f036d85910 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs @@ -1000,11 +1000,24 @@ namespace OpenSim.Region.CoreModules.World.WorldMap return responsemap; } - public void RegenerateMaptile(byte[] data) + public void GenerateMaptile() { + // Cannot create a map for a nonexistant heightmap + if (m_scene.Heightmap == null) + return; + + //create a texture asset of the terrain + IMapImageGenerator terrain = m_scene.RequestModuleInterface(); + if (terrain == null) + return; + + byte[] data = terrain.WriteJpeg2000Image("defaultstripe.png"); + if (data == null) + return; + UUID lastMapRegionUUID = m_scene.RegionInfo.RegionSettings.TerrainImageID; - m_log.Debug("[MAPTILE]: STORING MAPTILE IMAGE"); + m_log.Debug("[WORLDMAP]: STORING MAPTILE IMAGE"); m_scene.RegionInfo.RegionSettings.TerrainImageID = UUID.Random(); diff --git a/OpenSim/Region/Framework/Interfaces/IWorldMapModule.cs b/OpenSim/Region/Framework/Interfaces/IWorldMapModule.cs index ac6afed9ce..d6e31f4503 100644 --- a/OpenSim/Region/Framework/Interfaces/IWorldMapModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IWorldMapModule.cs @@ -29,6 +29,9 @@ namespace OpenSim.Region.Framework.Interfaces { public interface IWorldMapModule { - void RegenerateMaptile(byte[] data); + /// + /// Generate a map tile for the scene. a terrain texture for this scene + /// + void GenerateMaptile(); } } diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index afdb95b413..4d5c1e7873 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1812,33 +1812,6 @@ namespace OpenSim.Region.Framework.Scenes } - /// - /// Create a terrain texture for this scene - /// - public void CreateTerrainTexture() - { - //create a texture asset of the terrain - IMapImageGenerator terrain = RequestModuleInterface(); - - // Cannot create a map for a nonexistant heightmap yet. - if (Heightmap == null) - return; - - if (terrain == null) - return; - - byte[] data = terrain.WriteJpeg2000Image("defaultstripe.png"); - if (data != null) - { - IWorldMapModule mapModule = RequestModuleInterface(); - - if (mapModule != null) - mapModule.RegenerateMaptile(data); - else - m_log.DebugFormat("[SCENE]: MapModule is null, can't save maptile"); - } - } - #endregion #region Load Land From fd23f270c6914b7aa628f96daa9608745d3a20b3 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 13 Aug 2010 21:01:10 +0100 Subject: [PATCH 07/34] refactor: remove Scene.SetRootAgentScene() in favour of existing event with same name --- .../Inventory/Transfer/InventoryTransferModule.cs | 15 ++++++++------- .../Interfaces/IInventoryTransferModule.cs | 3 +-- OpenSim/Region/Framework/Scenes/Scene.cs | 11 ----------- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +- 4 files changed, 10 insertions(+), 21 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs index 2f1e9dd74e..8b77a5f4ee 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs @@ -82,6 +82,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer scene.EventManager.OnNewClient += OnNewClient; scene.EventManager.OnClientClosed += ClientLoggedOut; scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage; + scene.EventManager.OnSetRootAgentScene += OnSetRootAgentScene; } public void RegionLoaded(Scene scene) @@ -98,9 +99,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer scene.EventManager.OnNewClient -= OnNewClient; scene.EventManager.OnClientClosed -= ClientLoggedOut; scene.EventManager.OnIncomingInstantMessage -= OnGridInstantMessage; + scene.EventManager.OnSetRootAgentScene -= OnSetRootAgentScene; } } - } public void RemoveRegion(Scene scene) @@ -108,6 +109,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer scene.EventManager.OnNewClient -= OnNewClient; scene.EventManager.OnClientClosed -= ClientLoggedOut; scene.EventManager.OnIncomingInstantMessage -= OnGridInstantMessage; + scene.EventManager.OnSetRootAgentScene -= OnSetRootAgentScene; m_Scenelist.Remove(scene); } @@ -136,6 +138,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer // Inventory giving is conducted via instant message client.OnInstantMessage += OnInstantMessage; } + + protected void OnSetRootAgentScene(UUID id, Scene scene) + { + m_AgentRegions[id] = scene; + } private Scene FindClientScene(UUID agentId) { @@ -160,7 +167,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer if (scene == null) // Something seriously wrong here. return; - if (im.dialog == (byte) InstantMessageDialog.InventoryOffered) { //m_log.DebugFormat("Asset type {0}", ((AssetType)im.binaryBucket[0])); @@ -346,11 +352,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer } } - public void SetRootAgentScene(UUID agentID, Scene scene) - { - m_AgentRegions[agentID] = scene; - } - public bool NeedSceneCacheClear(UUID agentID, Scene scene) { if (!m_AgentRegions.ContainsKey(agentID)) diff --git a/OpenSim/Region/Framework/Interfaces/IInventoryTransferModule.cs b/OpenSim/Region/Framework/Interfaces/IInventoryTransferModule.cs index 2390ff428e..1e92fde00b 100644 --- a/OpenSim/Region/Framework/Interfaces/IInventoryTransferModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IInventoryTransferModule.cs @@ -35,7 +35,6 @@ namespace OpenSim.Region.Framework.Interfaces /// public interface IInventoryTransferModule { - void SetRootAgentScene(UUID agentID, Scene scene); bool NeedSceneCacheClear(UUID agentID, Scene scene); } -} +} \ No newline at end of file diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 4d5c1e7873..631046a162 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -4487,17 +4487,6 @@ namespace OpenSim.Region.Framework.Scenes client.SendLayerData(patchX, patchY, Heightmap.GetFloatsSerialised()); } - public void SetRootAgentScene(UUID agentID) - { - IInventoryTransferModule inv = RequestModuleInterface(); - if (inv == null) - return; - - inv.SetRootAgentScene(agentID, this); - - EventManager.TriggerSetRootAgentScene(agentID, this); - } - public bool NeedSceneCacheClear(UUID agentID) { IInventoryTransferModule inv = RequestModuleInterface(); diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 14d7d6a4bf..08c6e270db 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -821,7 +821,7 @@ namespace OpenSim.Region.Framework.Scenes m_rootRegionHandle = m_scene.RegionInfo.RegionHandle; - m_scene.SetRootAgentScene(m_uuid); + m_scene.EventManager.TriggerSetRootAgentScene(m_uuid, m_scene); // Moved this from SendInitialData to ensure that m_appearance is initialized // before the inventory is processed in MakeRootAgent. This fixes a race condition From b51534852f409bc02034ab2242bd4544d82392b2 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 13 Aug 2010 21:07:45 +0100 Subject: [PATCH 08/34] minor: remove mono compiler warning --- .../OptionalModules/World/MoneyModule/SampleMoneyModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs b/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs index 653f856664..69ab33de68 100644 --- a/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs +++ b/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs @@ -85,7 +85,7 @@ namespace OpenSim.Region.OptionalModules.World.MoneyModule // private int m_stipend = 1000; - private int ObjectCapacity = 45000; +// private int ObjectCapacity = 45000; private int ObjectCount = 0; private int PriceEnergyUnit = 0; private int PriceGroupCreate = 0; From 5d20f04e08c65b37bbdda187c30ce038872307ab Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 13 Aug 2010 21:18:26 +0100 Subject: [PATCH 09/34] refactor: move Scene.TerrainUnAcked() handling into TerrainModule --- .../Region/CoreModules/World/Terrain/TerrainModule.cs | 9 ++++++++- OpenSim/Region/Framework/Scenes/Scene.cs | 8 -------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs index 2c5e44432c..cb801111f9 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs @@ -586,8 +586,9 @@ namespace OpenSim.Region.CoreModules.World.Terrain client.OnModifyTerrain += client_OnModifyTerrain; client.OnBakeTerrain += client_OnBakeTerrain; client.OnLandUndo += client_OnLandUndo; + client.OnUnackedTerrain += client_OnUnackedTerrain; } - + /// /// Checks to see if the terrain has been modified since last check /// but won't attempt to limit those changes to the limits specified in the estate settings @@ -808,6 +809,12 @@ namespace OpenSim.Region.CoreModules.World.Terrain InterfaceBakeTerrain(null); //bake terrain does not use the passed in parameter } } + + protected void client_OnUnackedTerrain(IClientAPI client, int patchX, int patchY) + { + //m_log.Debug("Terrain packet unacked, resending patch: " + patchX + " , " + patchY); + client.SendLayerData(patchX, patchY, m_scene.Heightmap.GetFloatsSerialised()); + } private void StoreUndoState() { diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 631046a162..50f6b710bc 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2770,7 +2770,6 @@ namespace OpenSim.Region.Framework.Scenes public virtual void SubscribeToClientTerrainEvents(IClientAPI client) { client.OnRegionHandShakeReply += SendLayerData; - client.OnUnackedTerrain += TerrainUnAcked; } public virtual void SubscribeToClientPrimEvents(IClientAPI client) @@ -2901,7 +2900,6 @@ namespace OpenSim.Region.Framework.Scenes public virtual void UnSubscribeToClientTerrainEvents(IClientAPI client) { client.OnRegionHandShakeReply -= SendLayerData; - client.OnUnackedTerrain -= TerrainUnAcked; } public virtual void UnSubscribeToClientPrimEvents(IClientAPI client) @@ -4481,12 +4479,6 @@ namespace OpenSim.Region.Framework.Scenes client.SendRegionHandle(regionID, handle); } - public void TerrainUnAcked(IClientAPI client, int patchX, int patchY) - { - //m_log.Debug("Terrain packet unacked, resending patch: " + patchX + " , " + patchY); - client.SendLayerData(patchX, patchY, Heightmap.GetFloatsSerialised()); - } - public bool NeedSceneCacheClear(UUID agentID) { IInventoryTransferModule inv = RequestModuleInterface(); From feba3164af384371ecb21b21edba1f7045e1939c Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 13 Aug 2010 21:19:32 +0100 Subject: [PATCH 10/34] minor: remove mono compiler warning --- OpenSim/Tests/Common/Mock/TestInventoryDataPlugin.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Tests/Common/Mock/TestInventoryDataPlugin.cs b/OpenSim/Tests/Common/Mock/TestInventoryDataPlugin.cs index fecb73f351..7c4f689502 100644 --- a/OpenSim/Tests/Common/Mock/TestInventoryDataPlugin.cs +++ b/OpenSim/Tests/Common/Mock/TestInventoryDataPlugin.cs @@ -42,7 +42,7 @@ namespace OpenSim.Tests.Common.Mock /// public class TestInventoryDataPlugin : IInventoryDataPlugin { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); /// /// Inventory folders From b30635a454a2d4c8753023efaeb41118be1ef40e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 13 Aug 2010 21:39:43 +0100 Subject: [PATCH 11/34] Establish new Objects/BuySellModule Move Scene.ObjectSaleInfo() to this --- .../World/Objects/BuySell/BuySellModule.cs | 98 +++++++++++++++++++ OpenSim/Region/Framework/Scenes/Scene.cs | 23 +---- 2 files changed, 99 insertions(+), 22 deletions(-) create mode 100644 OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs diff --git a/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs new file mode 100644 index 0000000000..326eea90bb --- /dev/null +++ b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs @@ -0,0 +1,98 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * 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. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``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 CONTRIBUTORS 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. + */ + +using System; +using System.Collections.Generic; +using System.Reflection; +using log4net; +using Mono.Addins; +using Nini.Config; +using OpenMetaverse; +using OpenMetaverse.Packets; +using OpenSim.Framework; +using OpenSim.Region.Framework; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; + +namespace OpenSim.Region.CoreModules.World.Objects.BuySell +{ + [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "BuySellModule")] + public class BuySellModule : INonSharedRegionModule + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + protected Scene m_scene = null; + + public string Name { get { return "Object BuySell Module"; } } + public Type ReplaceableInterface { get { return null; } } + + public void Initialise(IConfigSource source) {} + + public void AddRegion(Scene scene) + { + m_scene = scene; + m_scene.EventManager.OnNewClient += SubscribeToClientEvents; + } + + public void RemoveRegion(Scene scene) + { + m_scene.EventManager.OnNewClient -= SubscribeToClientEvents; + } + + public void RegionLoaded(Scene scene) {} + + public void Close() + { + RemoveRegion(m_scene); + } + + public void SubscribeToClientEvents(IClientAPI client) + { + client.OnObjectSaleInfo += ObjectSaleInfo; + } + + protected void ObjectSaleInfo( + IClientAPI client, UUID agentID, UUID sessionID, uint localID, byte saleType, int salePrice) + { + SceneObjectPart part = m_scene.GetSceneObjectPart(localID); + if (part == null || part.ParentGroup == null) + return; + + if (part.ParentGroup.IsDeleted) + return; + + part = part.ParentGroup.RootPart; + + part.ObjectSaleType = saleType; + part.SalePrice = salePrice; + + part.ParentGroup.HasGroupChanged = true; + + part.GetProperties(client); + } + } +} \ No newline at end of file diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 50f6b710bc..b6def14985 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2809,8 +2809,7 @@ namespace OpenSim.Region.Framework.Scenes client.OnUndo += m_sceneGraph.HandleUndo; client.OnRedo += m_sceneGraph.HandleRedo; client.OnObjectDescription += m_sceneGraph.PrimDescription; - client.OnObjectDrop += m_sceneGraph.DropObject; - client.OnObjectSaleInfo += ObjectSaleInfo; + client.OnObjectDrop += m_sceneGraph.DropObject; client.OnObjectIncludeInSearch += m_sceneGraph.MakeObjectSearchable; client.OnObjectOwner += ObjectOwner; } @@ -2938,7 +2937,6 @@ namespace OpenSim.Region.Framework.Scenes client.OnRedo -= m_sceneGraph.HandleRedo; client.OnObjectDescription -= m_sceneGraph.PrimDescription; client.OnObjectDrop -= m_sceneGraph.DropObject; - client.OnObjectSaleInfo -= ObjectSaleInfo; client.OnObjectIncludeInSearch -= m_sceneGraph.MakeObjectSearchable; client.OnObjectOwner -= ObjectOwner; } @@ -4488,25 +4486,6 @@ namespace OpenSim.Region.Framework.Scenes return inv.NeedSceneCacheClear(agentID, this); } - public void ObjectSaleInfo(IClientAPI client, UUID agentID, UUID sessionID, uint localID, byte saleType, int salePrice) - { - SceneObjectPart part = GetSceneObjectPart(localID); - if (part == null || part.ParentGroup == null) - return; - - if (part.ParentGroup.IsDeleted) - return; - - part = part.ParentGroup.RootPart; - - part.ObjectSaleType = saleType; - part.SalePrice = salePrice; - - part.ParentGroup.HasGroupChanged = true; - - part.GetProperties(client); - } - public bool PerformObjectBuy(IClientAPI remoteClient, UUID categoryID, uint localID, byte saleType) { From 9d84dfb687f3387773f67497d4c39386636853fa Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 13 Aug 2010 21:44:44 +0100 Subject: [PATCH 12/34] minor: remove mono compiler warning --- OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs b/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs index a895d6e838..032e55a369 100644 --- a/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs @@ -93,7 +93,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Combat.CombatModule { string deadAvatarMessage; ScenePresence killingAvatar = null; - string killingAvatarMessage; +// string killingAvatarMessage; if (killerObjectLocalID == 0) deadAvatarMessage = "You committed suicide!"; @@ -118,14 +118,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Combat.CombatModule deadAvatarMessage = String.Format("You impaled yourself on {0} owned by {1}!", part.Name, deadAvatar.Scene.GetUserName(part.OwnerID)); else { - killingAvatarMessage = String.Format("You fragged {0}!", deadAvatar.Name); +// killingAvatarMessage = String.Format("You fragged {0}!", deadAvatar.Name); deadAvatarMessage = String.Format("You got killed by {0}!", killingAvatar.Name); } } } else { - killingAvatarMessage = String.Format("You fragged {0}!", deadAvatar.Name); +// killingAvatarMessage = String.Format("You fragged {0}!", deadAvatar.Name); deadAvatarMessage = String.Format("You got killed by {0}!", killingAvatar.Name); } } From e89f0b3f71dc8bd439fcfc23d12b305369eac36b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 13 Aug 2010 22:29:42 +0100 Subject: [PATCH 13/34] refactor: move Scene.PerformObjectBuy into BuySellModule --- .../World/Objects/BuySell/BuySellModule.cs | 169 +++++++++++++++++- .../Framework/Interfaces/IBuySellModule.cs | 47 +++++ .../Framework/Interfaces/ICloudModule.cs | 3 +- .../Framework/Scenes/Scene.Inventory.cs | 2 +- OpenSim/Region/Framework/Scenes/Scene.cs | 159 ---------------- .../World/MoneyModule/SampleMoneyModule.cs | 15 +- 6 files changed, 222 insertions(+), 173 deletions(-) create mode 100644 OpenSim/Region/Framework/Interfaces/IBuySellModule.cs diff --git a/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs index 326eea90bb..b0ddd8fa95 100644 --- a/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs +++ b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs @@ -37,15 +37,17 @@ using OpenSim.Framework; using OpenSim.Region.Framework; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; +using OpenSim.Region.Framework.Scenes.Serialization; namespace OpenSim.Region.CoreModules.World.Objects.BuySell { [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "BuySellModule")] - public class BuySellModule : INonSharedRegionModule + public class BuySellModule : IBuySellModule, INonSharedRegionModule { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); protected Scene m_scene = null; + protected IDialogModule m_dialogModule; public string Name { get { return "Object BuySell Module"; } } public Type ReplaceableInterface { get { return null; } } @@ -55,6 +57,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell public void AddRegion(Scene scene) { m_scene = scene; + m_scene.RegisterModuleInterface(this); m_scene.EventManager.OnNewClient += SubscribeToClientEvents; } @@ -63,7 +66,10 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell m_scene.EventManager.OnNewClient -= SubscribeToClientEvents; } - public void RegionLoaded(Scene scene) {} + public void RegionLoaded(Scene scene) + { + m_dialogModule = scene.RequestModuleInterface(); + } public void Close() { @@ -93,6 +99,165 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell part.ParentGroup.HasGroupChanged = true; part.GetProperties(client); + } + + public bool BuyObject(IClientAPI remoteClient, UUID categoryID, uint localID, byte saleType) + { + SceneObjectPart part = m_scene.GetSceneObjectPart(localID); + + if (part == null) + return false; + + if (part.ParentGroup == null) + return false; + + SceneObjectGroup group = part.ParentGroup; + + switch (saleType) + { + case 1: // Sell as original (in-place sale) + uint effectivePerms = group.GetEffectivePermissions(); + + if ((effectivePerms & (uint)PermissionMask.Transfer) == 0) + { + if (m_dialogModule != null) + m_dialogModule.SendAlertToUser(remoteClient, "This item doesn't appear to be for sale"); + return false; + } + + group.SetOwnerId(remoteClient.AgentId); + group.SetRootPartOwner(part, remoteClient.AgentId, remoteClient.ActiveGroupId); + + List partList = new List(group.Children.Values); + + if (m_scene.Permissions.PropagatePermissions()) + { + foreach (SceneObjectPart child in partList) + { + child.Inventory.ChangeInventoryOwner(remoteClient.AgentId); + child.TriggerScriptChangedEvent(Changed.OWNER); + child.ApplyNextOwnerPermissions(); + } + } + + part.ObjectSaleType = 0; + part.SalePrice = 10; + + group.HasGroupChanged = true; + part.GetProperties(remoteClient); + part.TriggerScriptChangedEvent(Changed.OWNER); + group.ResumeScripts(); + part.ScheduleFullUpdate(); + + break; + + case 2: // Sell a copy + Vector3 inventoryStoredPosition = new Vector3 + (((group.AbsolutePosition.X > (int)Constants.RegionSize) + ? 250 + : group.AbsolutePosition.X) + , + (group.AbsolutePosition.X > (int)Constants.RegionSize) + ? 250 + : group.AbsolutePosition.X, + group.AbsolutePosition.Z); + + Vector3 originalPosition = group.AbsolutePosition; + + group.AbsolutePosition = inventoryStoredPosition; + + string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(group); + group.AbsolutePosition = originalPosition; + + uint perms = group.GetEffectivePermissions(); + + if ((perms & (uint)PermissionMask.Transfer) == 0) + { + if (m_dialogModule != null) + m_dialogModule.SendAlertToUser(remoteClient, "This item doesn't appear to be for sale"); + return false; + } + + AssetBase asset = m_scene.CreateAsset( + group.GetPartName(localID), + group.GetPartDescription(localID), + (sbyte)AssetType.Object, + Utils.StringToBytes(sceneObjectXml), + group.OwnerID); + m_scene.AssetService.Store(asset); + + InventoryItemBase item = new InventoryItemBase(); + item.CreatorId = part.CreatorID.ToString(); + + item.ID = UUID.Random(); + item.Owner = remoteClient.AgentId; + item.AssetID = asset.FullID; + item.Description = asset.Description; + item.Name = asset.Name; + item.AssetType = asset.Type; + item.InvType = (int)InventoryType.Object; + item.Folder = categoryID; + + uint nextPerms=(perms & 7) << 13; + if ((nextPerms & (uint)PermissionMask.Copy) == 0) + perms &= ~(uint)PermissionMask.Copy; + if ((nextPerms & (uint)PermissionMask.Transfer) == 0) + perms &= ~(uint)PermissionMask.Transfer; + if ((nextPerms & (uint)PermissionMask.Modify) == 0) + perms &= ~(uint)PermissionMask.Modify; + + item.BasePermissions = perms & part.NextOwnerMask; + item.CurrentPermissions = perms & part.NextOwnerMask; + item.NextPermissions = part.NextOwnerMask; + item.EveryOnePermissions = part.EveryoneMask & + part.NextOwnerMask; + item.GroupPermissions = part.GroupMask & + part.NextOwnerMask; + item.CurrentPermissions |= 16; // Slam! + item.CreationDate = Util.UnixTimeSinceEpoch(); + + if (m_scene.InventoryService.AddItem(item)) + { + remoteClient.SendInventoryItemCreateUpdate(item, 0); + } + else + { + if (m_dialogModule != null) + m_dialogModule.SendAlertToUser(remoteClient, "Cannot buy now. Your inventory is unavailable"); + return false; + } + break; + + case 3: // Sell contents + List invList = part.Inventory.GetInventoryList(); + + bool okToSell = true; + + foreach (UUID invID in invList) + { + TaskInventoryItem item1 = part.Inventory.GetInventoryItem(invID); + if ((item1.CurrentPermissions & + (uint)PermissionMask.Transfer) == 0) + { + okToSell = false; + break; + } + } + + if (!okToSell) + { + if (m_dialogModule != null) + m_dialogModule.SendAlertToUser( + remoteClient, "This item's inventory doesn't appear to be for sale"); + return false; + } + + if (invList.Count > 0) + m_scene.MoveTaskInventoryItems(remoteClient.AgentId, part.Name, part, invList); + break; + } + + return true; } } } \ No newline at end of file diff --git a/OpenSim/Region/Framework/Interfaces/IBuySellModule.cs b/OpenSim/Region/Framework/Interfaces/IBuySellModule.cs new file mode 100644 index 0000000000..0132bae284 --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/IBuySellModule.cs @@ -0,0 +1,47 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * 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. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``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 CONTRIBUTORS 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. + */ + +using OpenMetaverse; +using OpenSim.Framework; + +namespace OpenSim.Region.Framework.Interfaces +{ + public interface IBuySellModule + { + /// + /// Try to buy an object + /// + /// + /// + /// + /// + /// + /// True on a successful purchase, false on failure + /// + bool BuyObject(IClientAPI remoteClient, UUID categoryID, uint localID, byte saleType); + } +} \ No newline at end of file diff --git a/OpenSim/Region/Framework/Interfaces/ICloudModule.cs b/OpenSim/Region/Framework/Interfaces/ICloudModule.cs index f8a5bad347..7296ac3ef5 100644 --- a/OpenSim/Region/Framework/Interfaces/ICloudModule.cs +++ b/OpenSim/Region/Framework/Interfaces/ICloudModule.cs @@ -25,7 +25,6 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - namespace OpenSim.Region.Framework.Interfaces { public interface ICloudModule : IRegionModule @@ -35,4 +34,4 @@ namespace OpenSim.Region.Framework.Interfaces /// float CloudCover(int x, int y, int z); } -} +} \ No newline at end of file diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 01edf51a3b..4f5a65ef26 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -670,7 +670,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// Create a new asset data structure. /// - private AssetBase CreateAsset(string name, string description, sbyte assetType, byte[] data, UUID creatorID) + public AssetBase CreateAsset(string name, string description, sbyte assetType, byte[] data, UUID creatorID) { AssetBase asset = new AssetBase(UUID.Random(), name, assetType, creatorID.ToString()); asset.Description = description; diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index b6def14985..5f6748e39b 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -4486,165 +4486,6 @@ namespace OpenSim.Region.Framework.Scenes return inv.NeedSceneCacheClear(agentID, this); } - public bool PerformObjectBuy(IClientAPI remoteClient, UUID categoryID, - uint localID, byte saleType) - { - SceneObjectPart part = GetSceneObjectPart(localID); - - if (part == null) - return false; - - if (part.ParentGroup == null) - return false; - - SceneObjectGroup group = part.ParentGroup; - - switch (saleType) - { - case 1: // Sell as original (in-place sale) - uint effectivePerms=group.GetEffectivePermissions(); - - if ((effectivePerms & (uint)PermissionMask.Transfer) == 0) - { - m_dialogModule.SendAlertToUser(remoteClient, "This item doesn't appear to be for sale"); - return false; - } - - group.SetOwnerId(remoteClient.AgentId); - group.SetRootPartOwner(part, remoteClient.AgentId, - remoteClient.ActiveGroupId); - - List partList = - new List(group.Children.Values); - - if (Permissions.PropagatePermissions()) - { - foreach (SceneObjectPart child in partList) - { - child.Inventory.ChangeInventoryOwner(remoteClient.AgentId); - child.TriggerScriptChangedEvent(Changed.OWNER); - child.ApplyNextOwnerPermissions(); - } - } - - part.ObjectSaleType = 0; - part.SalePrice = 10; - - group.HasGroupChanged = true; - part.GetProperties(remoteClient); - part.TriggerScriptChangedEvent(Changed.OWNER); - group.ResumeScripts(); - part.ScheduleFullUpdate(); - - break; - - case 2: // Sell a copy - - - Vector3 inventoryStoredPosition = new Vector3 - (((group.AbsolutePosition.X > (int)Constants.RegionSize) - ? 250 - : group.AbsolutePosition.X) - , - (group.AbsolutePosition.X > (int)Constants.RegionSize) - ? 250 - : group.AbsolutePosition.X, - group.AbsolutePosition.Z); - - Vector3 originalPosition = group.AbsolutePosition; - - group.AbsolutePosition = inventoryStoredPosition; - - string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(group); - group.AbsolutePosition = originalPosition; - - uint perms=group.GetEffectivePermissions(); - - if ((perms & (uint)PermissionMask.Transfer) == 0) - { - m_dialogModule.SendAlertToUser(remoteClient, "This item doesn't appear to be for sale"); - return false; - } - - AssetBase asset = CreateAsset( - group.GetPartName(localID), - group.GetPartDescription(localID), - (sbyte)AssetType.Object, - Utils.StringToBytes(sceneObjectXml), - group.OwnerID); - AssetService.Store(asset); - - InventoryItemBase item = new InventoryItemBase(); - item.CreatorId = part.CreatorID.ToString(); - - item.ID = UUID.Random(); - item.Owner = remoteClient.AgentId; - item.AssetID = asset.FullID; - item.Description = asset.Description; - item.Name = asset.Name; - item.AssetType = asset.Type; - item.InvType = (int)InventoryType.Object; - item.Folder = categoryID; - - uint nextPerms=(perms & 7) << 13; - if ((nextPerms & (uint)PermissionMask.Copy) == 0) - perms &= ~(uint)PermissionMask.Copy; - if ((nextPerms & (uint)PermissionMask.Transfer) == 0) - perms &= ~(uint)PermissionMask.Transfer; - if ((nextPerms & (uint)PermissionMask.Modify) == 0) - perms &= ~(uint)PermissionMask.Modify; - - item.BasePermissions = perms & part.NextOwnerMask; - item.CurrentPermissions = perms & part.NextOwnerMask; - item.NextPermissions = part.NextOwnerMask; - item.EveryOnePermissions = part.EveryoneMask & - part.NextOwnerMask; - item.GroupPermissions = part.GroupMask & - part.NextOwnerMask; - item.CurrentPermissions |= 16; // Slam! - item.CreationDate = Util.UnixTimeSinceEpoch(); - - if (InventoryService.AddItem(item)) - remoteClient.SendInventoryItemCreateUpdate(item, 0); - else - { - m_dialogModule.SendAlertToUser(remoteClient, "Cannot buy now. Your inventory is unavailable"); - return false; - } - break; - - case 3: // Sell contents - List invList = part.Inventory.GetInventoryList(); - - bool okToSell = true; - - foreach (UUID invID in invList) - { - TaskInventoryItem item1 = part.Inventory.GetInventoryItem(invID); - if ((item1.CurrentPermissions & - (uint)PermissionMask.Transfer) == 0) - { - okToSell = false; - break; - } - } - - if (!okToSell) - { - m_dialogModule.SendAlertToUser( - remoteClient, "This item's inventory doesn't appear to be for sale"); - return false; - } - - if (invList.Count > 0) - MoveTaskInventoryItems(remoteClient.AgentId, part.Name, - part, invList); - break; - } - - return true; - } - public void CleanTempObjects() { List objs = GetEntities(); diff --git a/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs b/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs index 69ab33de68..61cbb907d9 100644 --- a/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs +++ b/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs @@ -72,8 +72,6 @@ namespace OpenSim.Region.OptionalModules.World.MoneyModule private IConfigSource m_gConfig; - - /// /// Region UUIDS indexed by AgentID /// @@ -267,13 +265,11 @@ namespace OpenSim.Region.OptionalModules.World.MoneyModule PriceGroupCreate = startupConfig.GetInt("PriceGroupCreate", -1); m_sellEnabled = startupConfig.GetBoolean("SellEnabled", false); } - } private void GetClientFunds(IClientAPI client) { CheckExistAndRefreshFunds(client.AgentId); - } /// @@ -815,7 +811,10 @@ namespace OpenSim.Region.OptionalModules.World.MoneyModule remoteClient.SendAgentAlertMessage("Unable to buy now. The object was not found.", false); return; } - s.PerformObjectBuy(remoteClient, categoryID, localID, saleType); + + IBuySellModule module = s.RequestModuleInterface(); + if (module != null) + module.BuyObject(remoteClient, categoryID, localID, saleType); } } @@ -825,7 +824,5 @@ namespace OpenSim.Region.OptionalModules.World.MoneyModule RegionMoneyRequest = 1, Gift = 2, Purchase = 3 - } - - -} + } +} \ No newline at end of file From ab6dc478188e1609d9656e65d410d08270066bf0 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 13 Aug 2010 23:15:11 +0100 Subject: [PATCH 14/34] refactor: move binary statistics logging from scene into separate region module --- .../Statistics/Logging/BinaryLoggingModule.cs | 169 ++++++++++++++++++ .../Framework/Scenes/Scene.Inventory.cs | 9 +- OpenSim/Region/Framework/Scenes/Scene.cs | 113 +----------- 3 files changed, 181 insertions(+), 110 deletions(-) create mode 100644 OpenSim/Region/CoreModules/Framework/Statistics/Logging/BinaryLoggingModule.cs diff --git a/OpenSim/Region/CoreModules/Framework/Statistics/Logging/BinaryLoggingModule.cs b/OpenSim/Region/CoreModules/Framework/Statistics/Logging/BinaryLoggingModule.cs new file mode 100644 index 0000000000..b75a7001b8 --- /dev/null +++ b/OpenSim/Region/CoreModules/Framework/Statistics/Logging/BinaryLoggingModule.cs @@ -0,0 +1,169 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * 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. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``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 CONTRIBUTORS 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. + */ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using log4net; +using Mono.Addins; +using Nini.Config; +using OpenMetaverse; +using OpenMetaverse.Packets; +using OpenSim.Framework; +using OpenSim.Region.Framework; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; + +namespace OpenSim.Region.CoreModules.Avatar.Attachments +{ + [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "BinaryLoggingModule")] + public class BinaryLoggingModule : INonSharedRegionModule + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + protected bool m_collectStats; + protected Scene m_scene = null; + + public string Name { get { return "Binary Statistics Logging Module"; } } + public Type ReplaceableInterface { get { return null; } } + + public void Initialise(IConfigSource source) + { + try + { + IConfig statConfig = source.Configs["Statistics.Binary"]; + if (statConfig.Contains("enabled") && statConfig.GetBoolean("enabled")) + { + if (statConfig.Contains("collect_region_stats")) + { + if (statConfig.GetBoolean("collect_region_stats")) + { + m_collectStats = true; + } + } + if (statConfig.Contains("region_stats_period_seconds")) + { + m_statLogPeriod = TimeSpan.FromSeconds(statConfig.GetInt("region_stats_period_seconds")); + } + if (statConfig.Contains("stats_dir")) + { + m_statsDir = statConfig.GetString("stats_dir"); + } + } + } + catch + { + // if it doesn't work, we don't collect anything + } + } + + public void AddRegion(Scene scene) + { + m_scene = scene; + } + + public void RemoveRegion(Scene scene) + { + } + + public void RegionLoaded(Scene scene) + { + if (m_collectStats) + m_scene.StatsReporter.OnSendStatsResult += LogSimStats; + } + + public void Close() + { + } + + public class StatLogger + { + public DateTime StartTime; + public string Path; + public System.IO.BinaryWriter Log; + } + + static StatLogger m_statLog = null; + static TimeSpan m_statLogPeriod = TimeSpan.FromSeconds(300); + static string m_statsDir = String.Empty; + static Object m_statLockObject = new Object(); + + private void LogSimStats(SimStats stats) + { + SimStatsPacket pack = new SimStatsPacket(); + pack.Region = new SimStatsPacket.RegionBlock(); + pack.Region.RegionX = stats.RegionX; + pack.Region.RegionY = stats.RegionY; + pack.Region.RegionFlags = stats.RegionFlags; + pack.Region.ObjectCapacity = stats.ObjectCapacity; + //pack.Region = //stats.RegionBlock; + pack.Stat = stats.StatsBlock; + pack.Header.Reliable = false; + + // note that we are inside the reporter lock when called + DateTime now = DateTime.Now; + + // hide some time information into the packet + pack.Header.Sequence = (uint)now.Ticks; + + lock (m_statLockObject) // m_statLog is shared so make sure there is only executer here + { + try + { + if (m_statLog == null || now > m_statLog.StartTime + m_statLogPeriod) + { + // First log file or time has expired, start writing to a new log file + if (m_statLog != null && m_statLog.Log != null) + { + m_statLog.Log.Close(); + } + m_statLog = new StatLogger(); + m_statLog.StartTime = now; + m_statLog.Path = (m_statsDir.Length > 0 ? m_statsDir + System.IO.Path.DirectorySeparatorChar.ToString() : "") + + String.Format("stats-{0}.log", now.ToString("yyyyMMddHHmmss")); + m_statLog.Log = new BinaryWriter(File.Open(m_statLog.Path, FileMode.Append, FileAccess.Write)); + } + + // Write the serialized data to disk + if (m_statLog != null && m_statLog.Log != null) + m_statLog.Log.Write(pack.ToBytes()); + } + catch (Exception ex) + { + m_log.Error("statistics gathering failed: " + ex.Message, ex); + if (m_statLog != null && m_statLog.Log != null) + { + m_statLog.Log.Close(); + } + m_statLog = null; + } + } + return; + } + } +} diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 4f5a65ef26..996322540a 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -834,7 +834,7 @@ namespace OpenSim.Region.Framework.Scenes ScenePresence presence; if (TryGetScenePresence(remoteClient.AgentId, out presence)) { - byte[] data = null; +// byte[] data = null; AssetBase asset = new AssetBase(); asset.FullID = olditemID; @@ -842,8 +842,10 @@ namespace OpenSim.Region.Framework.Scenes asset.Name = name; asset.Description = description; - CreateNewInventoryItem(remoteClient, remoteClient.AgentId.ToString(), folderID, name, 0, callbackID, asset, invType, (uint)PermissionMask.All, (uint)PermissionMask.All, (uint)PermissionMask.All, (uint)PermissionMask.All, (uint)PermissionMask.All, Util.UnixTimeSinceEpoch()); - + CreateNewInventoryItem( + remoteClient, remoteClient.AgentId.ToString(), folderID, name, 0, callbackID, asset, invType, + (uint)PermissionMask.All, (uint)PermissionMask.All, (uint)PermissionMask.All, + (uint)PermissionMask.All, (uint)PermissionMask.All, Util.UnixTimeSinceEpoch()); } else { @@ -876,7 +878,6 @@ namespace OpenSim.Region.Framework.Scenes InventoryService.DeleteFolders(remoteClient.AgentId, folderIDs); } - /// /// Send the details of a prim's inventory to the client. /// diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 5f6748e39b..f62851ad94 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -481,73 +481,6 @@ namespace OpenSim.Region.Framework.Scenes #endregion - #region BinaryStats - - public class StatLogger - { - public DateTime StartTime; - public string Path; - public System.IO.BinaryWriter Log; - } - static StatLogger m_statLog = null; - static TimeSpan m_statLogPeriod = TimeSpan.FromSeconds(300); - static string m_statsDir = String.Empty; - static Object m_statLockObject = new Object(); - private void LogSimStats(SimStats stats) - { - SimStatsPacket pack = new SimStatsPacket(); - pack.Region = new SimStatsPacket.RegionBlock(); - pack.Region.RegionX = stats.RegionX; - pack.Region.RegionY = stats.RegionY; - pack.Region.RegionFlags = stats.RegionFlags; - pack.Region.ObjectCapacity = stats.ObjectCapacity; - //pack.Region = //stats.RegionBlock; - pack.Stat = stats.StatsBlock; - pack.Header.Reliable = false; - - // note that we are inside the reporter lock when called - DateTime now = DateTime.Now; - - // hide some time information into the packet - pack.Header.Sequence = (uint)now.Ticks; - - lock (m_statLockObject) // m_statLog is shared so make sure there is only executer here - { - try - { - if (m_statLog == null || now > m_statLog.StartTime + m_statLogPeriod) - { - // First log file or time has expired, start writing to a new log file - if (m_statLog != null && m_statLog.Log != null) - { - m_statLog.Log.Close(); - } - m_statLog = new StatLogger(); - m_statLog.StartTime = now; - m_statLog.Path = (m_statsDir.Length > 0 ? m_statsDir + System.IO.Path.DirectorySeparatorChar.ToString() : "") - + String.Format("stats-{0}.log", now.ToString("yyyyMMddHHmmss")); - m_statLog.Log = new BinaryWriter(File.Open(m_statLog.Path, FileMode.Append, FileAccess.Write)); - } - - // Write the serialized data to disk - if (m_statLog != null && m_statLog.Log != null) - m_statLog.Log.Write(pack.ToBytes()); - } - catch (Exception ex) - { - m_log.Error("statistics gathering failed: " + ex.Message, ex); - if (m_statLog != null && m_statLog.Log != null) - { - m_statLog.Log.Close(); - } - m_statLog = null; - } - } - return; - } - - #endregion - #region Constructors public Scene(RegionInfo regInfo, AgentCircuitManager authen, @@ -752,38 +685,6 @@ namespace OpenSim.Region.Framework.Scenes } m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl); - - #region BinaryStats - - try - { - IConfig statConfig = m_config.Configs["Statistics.Binary"]; - if (statConfig.Contains("enabled") && statConfig.GetBoolean("enabled")) - { - if (statConfig.Contains("collect_region_stats")) - { - if (statConfig.GetBoolean("collect_region_stats")) - { - // if enabled, add us to the event. If not enabled, I won't get called - StatsReporter.OnSendStatsResult += LogSimStats; - } - } - if (statConfig.Contains("region_stats_period_seconds")) - { - m_statLogPeriod = TimeSpan.FromSeconds(statConfig.GetInt("region_stats_period_seconds")); - } - if (statConfig.Contains("stats_dir")) - { - m_statsDir = statConfig.GetString("stats_dir"); - } - } - } - catch - { - // if it doesn't work, we don't collect anything - } - - #endregion BinaryStats } catch { @@ -2652,7 +2553,7 @@ namespace OpenSim.Region.Framework.Scenes if (!VerifyClient(aCircuit, ep, out vialogin)) { // uh-oh, this is fishy - m_log.WarnFormat("[Scene]: Agent {0} with session {1} connecting with unidentified end point {2}. Refusing service.", + m_log.WarnFormat("[SCENE]: Agent {0} with session {1} connecting with unidentified end point {2}. Refusing service.", client.AgentId, client.SessionId, ep.ToString()); try { @@ -2660,13 +2561,13 @@ namespace OpenSim.Region.Framework.Scenes } catch (Exception e) { - m_log.DebugFormat("[Scene]: Exception while closing aborted client: {0}", e.StackTrace); + m_log.DebugFormat("[SCENE]: Exception while closing aborted client: {0}", e.StackTrace); } return; } } - m_log.Debug("[Scene] Adding new agent " + client.Name + " to scene " + RegionInfo.RegionName); + m_log.Debug("[SCENE]: Adding new agent " + client.Name + " to scene " + RegionInfo.RegionName); ScenePresence sp = CreateAndAddScenePresence(client); if (aCircuit != null) @@ -2695,7 +2596,7 @@ namespace OpenSim.Region.Framework.Scenes // Do the verification here if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0) { - m_log.DebugFormat("[Scene]: Incoming client {0} {1} in region {2} via Login", aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName); + m_log.DebugFormat("[SCENE]: Incoming client {0} {1} in region {2} via Login", aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName); vialogin = true; IUserAgentVerificationModule userVerification = RequestModuleInterface(); if (userVerification != null && ep != null) @@ -2705,11 +2606,11 @@ namespace OpenSim.Region.Framework.Scenes if (!userVerification.VerifyClient(aCircuit, /*ep.Address.ToString() */ addr.ToString())) { // uh-oh, this is fishy - m_log.DebugFormat("[Scene]: User Client Verification for {0} {1} in {2} returned false", aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName); + m_log.DebugFormat("[SCENE]: User Client Verification for {0} {1} in {2} returned false", aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName); return false; } else - m_log.DebugFormat("[Scene]: User Client Verification for {0} {1} in {2} returned true", aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName); + m_log.DebugFormat("[SCENE]: User Client Verification for {0} {1} in {2} returned true", aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName); } } @@ -2740,7 +2641,7 @@ namespace OpenSim.Region.Framework.Scenes } catch (Exception e) { - m_log.DebugFormat("[Scene]: Exception while closing aborted client: {0}", e.StackTrace); + m_log.DebugFormat("[SCENE]: Exception while closing aborted client: {0}", e.StackTrace); } } else From c64bef146bd66a4044e1bd3cd367ff392c1495bf Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 13 Aug 2010 23:18:05 +0100 Subject: [PATCH 15/34] minor: remove mono compiler warnings --- OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 5473d2369e..c11b9a2758 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -6295,7 +6295,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } #endregion - ObjectDuplicatePacket.AgentDataBlock AgentandGroupData = dupe.AgentData; +// ObjectDuplicatePacket.AgentDataBlock AgentandGroupData = dupe.AgentData; ObjectDuplicate handlerObjectDuplicate = null; @@ -11668,8 +11668,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP { StringBuilder sb = new StringBuilder(); sb.Append("["); - if (this.priority != null) - sb.Append(this.priority.ToString()); + sb.Append(this.priority.ToString()); sb.Append(","); if (this.value != null) sb.Append(this.value.ToString()); From 8acb401a1455430336c41ac9becb0c16390612f0 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 13 Aug 2010 23:28:28 +0100 Subject: [PATCH 16/34] minor: remove mono compiler warnings --- .../EntityTransfer/EntityTransferModule.cs | 26 +++++++------- .../InventoryAccess/HGAssetMapper.cs | 2 +- .../HGInventoryAccessModule.cs | 4 +-- .../Framework/Library/LibraryModule.cs | 16 ++++----- .../InterGrid/OpenGridProtocolModule.cs | 35 ++++++++++--------- .../RemoteInventoryServiceConnector.cs | 5 ++- .../RemoteXInventoryServiceConnector.cs | 5 ++- .../World/Land/LandManagementModule.cs | 12 +++---- .../World/Objects/BuySell/BuySellModule.cs | 2 +- .../World/WorldMap/MapSearchModule.cs | 18 +++++----- 10 files changed, 62 insertions(+), 63 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index ab1cfc352b..364d340198 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) Contributors, http://opensimulator.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * @@ -1265,18 +1265,18 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return handles; } - private void Dump(string msg, List handles) - { - m_log.InfoFormat("-------------- HANDLE DUMP ({0}) ---------", msg); - foreach (ulong handle in handles) - { - uint x, y; - Utils.LongToUInts(handle, out x, out y); - x = x / Constants.RegionSize; - y = y / Constants.RegionSize; - m_log.InfoFormat("({0}, {1})", x, y); - } - } +// private void Dump(string msg, List handles) +// { +// m_log.InfoFormat("-------------- HANDLE DUMP ({0}) ---------", msg); +// foreach (ulong handle in handles) +// { +// uint x, y; +// Utils.LongToUInts(handle, out x, out y); +// x = x / Constants.RegionSize; +// y = y / Constants.RegionSize; +// m_log.InfoFormat("({0}, {1})", x, y); +// } +// } #endregion diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs index b13b9d8fc5..ccb892e1e4 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs @@ -95,7 +95,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess try { asset1.ID = url + "/" + asset.ID; - UUID temp = UUID.Zero; +// UUID temp = UUID.Zero; // TODO: if the creator is local, stick this grid's URL in front //if (UUID.TryParse(asset.Metadata.CreatorID, out temp)) // asset1.Metadata.CreatorID = ??? + "/" + asset.Metadata.CreatorID; diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs index 8ccc941c18..c673b31bbc 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) Contributors, http://opensimulator.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * @@ -54,7 +54,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess get { return m_assMapper; } } - private bool m_Initialized = false; +// private bool m_Initialized = false; #region INonSharedRegionModule diff --git a/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs b/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs index 9c20d68ce8..d570608369 100644 --- a/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs +++ b/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs @@ -51,7 +51,7 @@ namespace OpenSim.Region.CoreModules.Framework.Library private static bool m_HasRunOnce = false; private bool m_Enabled = false; - private string m_LibraryName = "OpenSim Library"; +// private string m_LibraryName = "OpenSim Library"; private Scene m_Scene; private ILibraryService m_Library; @@ -212,13 +212,13 @@ namespace OpenSim.Region.CoreModules.Framework.Library } } - private void DumpLibrary() - { - InventoryFolderImpl lib = m_Library.LibraryRootFolder; - - m_log.DebugFormat(" - folder {0}", lib.Name); - DumpFolder(lib); - } +// private void DumpLibrary() +// { +// InventoryFolderImpl lib = m_Library.LibraryRootFolder; +// +// m_log.DebugFormat(" - folder {0}", lib.Name); +// DumpFolder(lib); +// } // // private void DumpLibrary() // { diff --git a/OpenSim/Region/CoreModules/InterGrid/OpenGridProtocolModule.cs b/OpenSim/Region/CoreModules/InterGrid/OpenGridProtocolModule.cs index e95d2f8fef..87a0a8dd7b 100644 --- a/OpenSim/Region/CoreModules/InterGrid/OpenGridProtocolModule.cs +++ b/OpenSim/Region/CoreModules/InterGrid/OpenGridProtocolModule.cs @@ -91,7 +91,7 @@ namespace OpenSim.Region.CoreModules.InterGrid private string httpsCN = ""; private bool httpSSL = false; private uint httpsslport = 0; - private bool GridMode = false; +// private bool GridMode = false; #region IRegionModule Members @@ -126,10 +126,10 @@ namespace OpenSim.Region.CoreModules.InterGrid } - if (startupcfg != null) - { - GridMode = enabled = startupcfg.GetBoolean("gridmode", false); - } +// if (startupcfg != null) +// { +// GridMode = enabled = startupcfg.GetBoolean("gridmode", false); +// } if (cfg != null) { @@ -1213,18 +1213,19 @@ namespace OpenSim.Region.CoreModules.InterGrid } } - private string CreateRandomStr(int len) - { - Random rnd = new Random(Environment.TickCount); - string returnstring = ""; - string chars = "abcdefghijklmnopqrstuvwxyz0123456789"; - - for (int i = 0; i < len; i++) - { - returnstring += chars.Substring(rnd.Next(chars.Length), 1); - } - return returnstring; - } +// private string CreateRandomStr(int len) +// { +// Random rnd = new Random(Environment.TickCount); +// string returnstring = ""; +// string chars = "abcdefghijklmnopqrstuvwxyz0123456789"; +// +// for (int i = 0; i < len; i++) +// { +// returnstring += chars.Substring(rnd.Next(chars.Length), 1); +// } +// return returnstring; +// } + // Temporary hack to allow teleporting to and from Vaak private static bool customXertificateValidation(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) { diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs index aa3b30d55e..153aeec1a4 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs @@ -32,7 +32,6 @@ using System.Reflection; using Nini.Config; using OpenSim.Framework; using OpenSim.Framework.Statistics; - using OpenSim.Services.Connectors; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; @@ -48,7 +47,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory private bool m_Enabled = false; private bool m_Initialized = false; - private Scene m_Scene; +// private Scene m_Scene; private InventoryServicesConnector m_RemoteConnector; public Type ReplaceableInterface @@ -105,7 +104,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory public void AddRegion(Scene scene) { - m_Scene = scene; +// m_Scene = scene; //m_log.Debug("[XXXX] Adding scene " + m_Scene.RegionInfo.RegionName); if (!m_Enabled) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs index 277060d2aa..ada26cc359 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs @@ -32,7 +32,6 @@ using System.Reflection; using Nini.Config; using OpenSim.Framework; using OpenSim.Framework.Statistics; - using OpenSim.Services.Connectors; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; @@ -48,7 +47,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory private bool m_Enabled = false; private bool m_Initialized = false; - private Scene m_Scene; +// private Scene m_Scene; private XInventoryServicesConnector m_RemoteConnector; public Type ReplaceableInterface @@ -109,7 +108,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory public void AddRegion(Scene scene) { - m_Scene = scene; +// m_Scene = scene; //m_log.Debug("[XXXX] Adding scene " + m_Scene.RegionInfo.RegionName); if (!m_Enabled) diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index 31aa017615..15dc301aa1 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs @@ -139,12 +139,12 @@ namespace OpenSim.Region.CoreModules.World.Land { } - private bool OnVerifyUserConnection(ScenePresence scenePresence, out string reason) - { - ILandObject nearestParcel = m_scene.GetNearestAllowedParcel(scenePresence.UUID, scenePresence.AbsolutePosition.X, scenePresence.AbsolutePosition.Y); - reason = "You are not allowed to enter this sim."; - return nearestParcel != null; - } +// private bool OnVerifyUserConnection(ScenePresence scenePresence, out string reason) +// { +// ILandObject nearestParcel = m_scene.GetNearestAllowedParcel(scenePresence.UUID, scenePresence.AbsolutePosition.X, scenePresence.AbsolutePosition.Y); +// reason = "You are not allowed to enter this sim."; +// return nearestParcel != null; +// } void EventManagerOnNewClient(IClientAPI client) { diff --git a/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs index b0ddd8fa95..62abd4cfaf 100644 --- a/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs +++ b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs @@ -44,7 +44,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "BuySellModule")] public class BuySellModule : IBuySellModule, INonSharedRegionModule { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); protected Scene m_scene = null; protected IDialogModule m_dialogModule; diff --git a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs index a1a4f9e125..9f8851708c 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs @@ -138,14 +138,14 @@ namespace OpenSim.Region.CoreModules.World.WorldMap remoteClient.SendMapBlock(blocks, 2); } - private Scene GetClientScene(IClientAPI client) - { - foreach (Scene s in m_scenes) - { - if (client.Scene.RegionInfo.RegionHandle == s.RegionInfo.RegionHandle) - return s; - } - return m_scene; - } +// private Scene GetClientScene(IClientAPI client) +// { +// foreach (Scene s in m_scenes) +// { +// if (client.Scene.RegionInfo.RegionHandle == s.RegionInfo.RegionHandle) +// return s; +// } +// return m_scene; +// } } } From 8eeb3f2fd21c05f0bfd141e333f34c4c69e8865b Mon Sep 17 00:00:00 2001 From: randomhuman Date: Fri, 13 Aug 2010 16:08:43 +0100 Subject: [PATCH 17/34] Updated the create_region command in the RemoteAdmin plugin to properly support estates without seeking further input on the console. --- .../LoadRegions/LoadRegionsPlugin.cs | 2 + .../RemoteController/RemoteAdminPlugin.cs | 90 +++++++++++++------ OpenSim/Region/Application/OpenSim.cs | 10 ++- OpenSim/Region/Application/OpenSimBase.cs | 54 +++++++++++ .../ClientStack/RegionApplicationBase.cs | 5 ++ OpenSim/Region/Framework/Scenes/Scene.cs | 39 -------- 6 files changed, 133 insertions(+), 67 deletions(-) diff --git a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs index 1e85a22c69..b16f46cd6b 100644 --- a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs +++ b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs @@ -122,7 +122,9 @@ 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/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index 7e4a8e8fd7..da3d3c2a14 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs @@ -444,12 +444,14 @@ namespace OpenSim.ApplicationPlugins.RemoteController /// desired region X coordinate (integer) /// region_y /// desired region Y coordinate (integer) - /// region_master_first - /// firstname of region master - /// region_master_last - /// lastname of region master - /// region_master_uuid - /// explicit UUID to use for master avatar (optional) + /// estate_owner_first + /// firstname of estate owner (formerly region master) + /// (required if new estate is being created, optional otherwise) + /// estate_owner_last + /// lastname of estate owner (formerly region master) + /// (required if new estate is being created, optional otherwise) + /// estate_owner_uuid + /// explicit UUID to use for estate owner (optional) /// listen_ip /// internal IP address (dotted quad) /// listen_port @@ -465,6 +467,9 @@ namespace OpenSim.ApplicationPlugins.RemoteController /// enable_voice /// if true, enable voice on all parcels, /// ('true' or 'false') (optional, default: false) + /// estate_name + /// the name of the estate to join (or to create if it doesn't + /// already exist) /// /// /// XmlRpcCreateRegionMethod returns @@ -503,9 +508,8 @@ namespace OpenSim.ApplicationPlugins.RemoteController { "password", "region_name", - "region_master_first", "region_master_last", - "region_master_password", - "listen_ip", "external_address" + "listen_ip", "external_address", + "estate_name" }); CheckIntegerParams(request, new string[] {"region_x", "region_y", "listen_port"}); @@ -576,18 +580,6 @@ namespace OpenSim.ApplicationPlugins.RemoteController region.ExternalHostName = (string) requestData["external_address"]; - string masterFirst = (string) requestData["region_master_first"]; - string masterLast = (string) requestData["region_master_last"]; - string masterPassword = (string) requestData["region_master_password"]; - - UUID userID = UUID.Zero; - if (requestData.ContainsKey("region_master_uuid")) - { - // ok, client wants us to use an explicit UUID - // regardless of what the avatar name provided - userID = new UUID((string) requestData["estate_owner_uuid"]); - } - bool persist = Convert.ToBoolean((string) requestData["persist"]); if (persist) { @@ -622,7 +614,55 @@ namespace OpenSim.ApplicationPlugins.RemoteController { region.Persistent = false; } + + // Set the estate + + // Check for an existing estate + List estateIDs = m_application.StorageManager.EstateDataStore.GetEstates((string) requestData["estate_name"]); + if (estateIDs.Count < 1) + { + UUID userID = UUID.Zero; + if (requestData.ContainsKey("estate_owner_uuid")) + { + // ok, client wants us to use an explicit UUID + // regardless of what the avatar name provided + userID = new UUID((string) requestData["estate_owner_uuid"]); + } + else if (requestData.ContainsKey("estate_owner_first") & requestData.ContainsKey("estate_owner_last")) + { + // We need to look up the UUID for the avatar with the provided name. + string ownerFirst = (string) requestData["estate_owner_first"]; + string ownerLast = (string) requestData["estate_owner_last"]; + + Scene currentOrFirst = m_application.SceneManager.CurrentOrFirstScene; + IUserAccountService accountService = currentOrFirst.UserAccountService; + UserAccount user = accountService.GetUserAccount(currentOrFirst.RegionInfo.ScopeID, + ownerFirst, ownerLast); + userID = user.PrincipalID; + } + else + { + throw new Exception("Estate owner details not provided."); + } + + // Create a new estate with the name provided + region.EstateSettings = m_application.StorageManager.EstateDataStore.LoadEstateSettings(region.RegionID, true); + region.EstateSettings.EstateName = (string) requestData["estate_name"]; + region.EstateSettings.EstateOwner = userID; + // Persistence does not seem to effect the need to save a new estate + region.EstateSettings.Save(); + } + else + { + int estateID = estateIDs[0]; + + region.EstateSettings = m_application.StorageManager.EstateDataStore.LoadEstateSettings(estateID); + + if (!m_application.StorageManager.EstateDataStore.LinkRegion(region.RegionID, estateID)) + throw new Exception("Failed to join estate."); + } + // Create the region and perform any initial initialization IScene newScene; @@ -631,9 +671,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController // If an access specification was provided, use it. // Otherwise accept the default. newScene.RegionInfo.EstateSettings.PublicAccess = GetBoolean(requestData, "public", m_publicAccess); - newScene.RegionInfo.EstateSettings.EstateOwner = userID; - if (persist) - newScene.RegionInfo.EstateSettings.Save(); + newScene.RegionInfo.EstateSettings.Save(); // enable voice on newly created region if // requested by either the XmlRpc request or the @@ -1497,7 +1535,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController if (destinationFolder.Type != (short)AssetType.Clothing) { destinationFolder = new InventoryFolderBase(); - + destinationFolder.ID = UUID.Random(); destinationFolder.Name = "Clothing"; destinationFolder.Owner = destination; @@ -2982,7 +3020,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController /// private bool ChangeUserPassword(string firstName, string lastName, string password) { - Scene scene = m_application.SceneManager.CurrentOrFirstScene; + Scene scene = m_application.SceneManager.CurrentOrFirstScene; IUserAccountService userAccountService = scene.UserAccountService; IAuthenticationService authenticationService = scene.AuthenticationService; diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index c541249627..d9ec287076 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -530,7 +530,10 @@ namespace OpenSim regionFile = cmd[3]; IScene scene; - CreateRegion(new RegionInfo(cmd[2], regionFile, false, ConfigSource.Source), true, out scene); + RegionInfo regInfo = new RegionInfo(cmd[2], regionFile, false, ConfigSource.Source); + PopulateRegionEstateInfo(regInfo); + CreateRegion(regInfo, true, out scene); + regInfo.EstateSettings.Save(); } else if (cmd[3].EndsWith(".ini")) { @@ -541,7 +544,10 @@ namespace OpenSim regionFile = cmd[3]; IScene scene; - CreateRegion(new RegionInfo(cmd[2], regionFile, false, ConfigSource.Source, cmd[2]), true, out scene); + RegionInfo regInfo = new RegionInfo(cmd[2], regionFile, false, ConfigSource.Source, cmd[2]); + PopulateRegionEstateInfo(regInfo); + CreateRegion(regInfo, true, out scene); + regInfo.EstateSettings.Save(); } else { diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index e148cde14c..eb18e83753 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -790,6 +790,60 @@ namespace OpenSim { regionnum = m_sceneManager.Scenes.Count; } + + /// + /// Load the estate information for the provided RegionInfo object. + /// + /// + /// A + /// + public void PopulateRegionEstateInfo(RegionInfo regInfo) + { + if (m_storageManager.EstateDataStore != null) + { + regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(regInfo.RegionID, false); + } + + if (regInfo.EstateSettings.EstateID == 0) // No record at all + { + MainConsole.Instance.Output("Your region is not part of an estate."); + while (true) + { + string response = MainConsole.Instance.CmdPrompt("Do you wish to join an existing estate?", "no", new List() {"yes", "no"}); + if (response == "no") + { + // Create a new estate + regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(regInfo.RegionID, true); + + regInfo.EstateSettings.EstateName = MainConsole.Instance.CmdPrompt("New estate name", regInfo.EstateSettings.EstateName); + //regInfo.EstateSettings.Save(); + break; + } + else + { + response = MainConsole.Instance.CmdPrompt("Estate name to join", "None"); + if (response == "None") + continue; + + List estateIDs = m_storageManager.EstateDataStore.GetEstates(response); + if (estateIDs.Count < 1) + { + MainConsole.Instance.Output("The name you have entered matches no known estate. Please try again"); + continue; + } + + int estateID = estateIDs[0]; + + regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(estateID); + + if (m_storageManager.EstateDataStore.LinkRegion(regInfo.RegionID, estateID)) + break; + + MainConsole.Instance.Output("Joining the estate failed. Please try again."); + } + } + } + } } diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs index e683821d95..46b68ec04b 100644 --- a/OpenSim/Region/ClientStack/RegionApplicationBase.cs +++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs @@ -58,6 +58,11 @@ namespace OpenSim.Region.ClientStack protected StorageManager m_storageManager; + public StorageManager StorageManager + { + get { return m_storageManager; } + } + protected ClientStackManager m_clientStackManager; public SceneManager SceneManager diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index f62851ad94..18705a8121 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -544,45 +544,6 @@ namespace OpenSim.Region.Framework.Scenes if (m_storageManager.EstateDataStore != null) { m_regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(m_regInfo.RegionID, false); - if (m_regInfo.EstateSettings.EstateID == 0) // No record at all - { - MainConsole.Instance.Output("Your region is not part of an estate."); - while (true) - { - string response = MainConsole.Instance.CmdPrompt("Do you wish to join an existing estate?", "no", new List() {"yes", "no"}); - if (response == "no") - { - // Create a new estate - m_regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(m_regInfo.RegionID, true); - - m_regInfo.EstateSettings.EstateName = MainConsole.Instance.CmdPrompt("New estate name", m_regInfo.EstateSettings.EstateName); - m_regInfo.EstateSettings.Save(); - break; - } - else - { - response = MainConsole.Instance.CmdPrompt("Estate name to join", "None"); - if (response == "None") - continue; - - List estateIDs = m_storageManager.EstateDataStore.GetEstates(response); - if (estateIDs.Count < 1) - { - MainConsole.Instance.Output("The name you have entered matches no known estate. Please try again"); - continue; - } - - int estateID = estateIDs[0]; - - m_regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(estateID); - - if (m_storageManager.EstateDataStore.LinkRegion(m_regInfo.RegionID, estateID)) - break; - - MainConsole.Instance.Output("Joining the estate failed. Please try again."); - } - } - } } #endregion Region Settings From ae43a07f3bf5bd91e4ae7ed9b82c44d610b72044 Mon Sep 17 00:00:00 2001 From: Marck Date: Tue, 10 Aug 2010 16:07:21 +0200 Subject: [PATCH 18/34] Configuration files can read include files from relative paths. --- OpenSim/Region/Application/ConfigurationLoader.cs | 12 +++++++++++- OpenSim/Tools/Configger/ConfigurationLoader.cs | 12 +++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/Application/ConfigurationLoader.cs b/OpenSim/Region/Application/ConfigurationLoader.cs index 09f7bea14f..e69e3fc9d9 100644 --- a/OpenSim/Region/Application/ConfigurationLoader.cs +++ b/OpenSim/Region/Application/ConfigurationLoader.cs @@ -211,7 +211,17 @@ namespace OpenSim else { string basepath = Path.GetFullPath(Util.configDir()); - string path = Path.Combine(basepath, file); + // Resolve relative paths with wildcards + string chunkWithoutWildcards = file; + string chunkWithWildcards = string.Empty; + int wildcardIndex = file.IndexOfAny(new char[] { '*', '?' }); + if (wildcardIndex != -1) + { + chunkWithoutWildcards = file.Substring(0, wildcardIndex); + chunkWithWildcards = file.Substring(wildcardIndex); + } + string path = Path.Combine(basepath, chunkWithoutWildcards); + path = Path.GetFullPath(path) + chunkWithWildcards; string[] paths = Util.Glob(path); foreach (string p in paths) { diff --git a/OpenSim/Tools/Configger/ConfigurationLoader.cs b/OpenSim/Tools/Configger/ConfigurationLoader.cs index e74debbd17..8e71b42bca 100644 --- a/OpenSim/Tools/Configger/ConfigurationLoader.cs +++ b/OpenSim/Tools/Configger/ConfigurationLoader.cs @@ -141,7 +141,17 @@ namespace OpenSim.Tools.Configger else { string basepath = Path.GetFullPath("."); - string path = Path.Combine(basepath, file); + // Resolve relative paths with wildcards + string chunkWithoutWildcards = file; + string chunkWithWildcards = string.Empty; + int wildcardIndex = file.IndexOfAny(new char[] { '*', '?' }); + if (wildcardIndex != -1) + { + chunkWithoutWildcards = file.Substring(0, wildcardIndex); + chunkWithWildcards = file.Substring(wildcardIndex); + } + string path = Path.Combine(basepath, chunkWithoutWildcards); + path = Path.GetFullPath(path) + chunkWithWildcards; string[] paths = Util.Glob(path); foreach (string p in paths) { From fcc83f2305f6da6fc93b6f94ef7dbd4a1737568a Mon Sep 17 00:00:00 2001 From: Marck Date: Wed, 11 Aug 2010 16:31:26 +0200 Subject: [PATCH 19/34] Unit test for ConfigurationLoader. Adds a new test assembly for OpenSim. --- .nant/local.include | 11 ++ OpenSim/Tests/ConfigurationLoaderTest.cs | 143 +++++++++++++++++++++++ prebuild.xml | 22 ++++ 3 files changed, 176 insertions(+) create mode 100644 OpenSim/Tests/ConfigurationLoaderTest.cs diff --git a/.nant/local.include b/.nant/local.include index 0279f257b0..97c0c0fb56 100644 --- a/.nant/local.include +++ b/.nant/local.include @@ -91,6 +91,11 @@ the assembly here as an exec, and you add the fail clause later. This lets all the unit tests run and tells you if they fail at the end, instead of stopping short --> + + + + + @@ -256,6 +261,11 @@ + + + + + @@ -298,6 +308,7 @@ + diff --git a/OpenSim/Tests/ConfigurationLoaderTest.cs b/OpenSim/Tests/ConfigurationLoaderTest.cs new file mode 100644 index 0000000000..4262c95827 --- /dev/null +++ b/OpenSim/Tests/ConfigurationLoaderTest.cs @@ -0,0 +1,143 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * 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. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``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 CONTRIBUTORS 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. + */ + +using System.IO; +using Nini.Config; +using NUnit.Framework; +using OpenSim.Framework; + +namespace OpenSim.Tests +{ + [TestFixture] + public class ConfigurationLoaderTests + { + private const string m_testSubdirectory = "test"; + private string m_basePath; + private string m_workingDirectory; + private IConfigSource m_config; + + /// + /// Set up a test directory. + /// + [SetUp] + public void SetUp() + { + m_basePath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + string path = Path.Combine(m_basePath, m_testSubdirectory); + Directory.CreateDirectory(path); + m_workingDirectory = Directory.GetCurrentDirectory(); + Directory.SetCurrentDirectory(path); + } + + /// + /// Remove the test directory. + /// + [TearDown] + public void TearDown() + { + Directory.SetCurrentDirectory(m_workingDirectory); + Directory.Delete(m_basePath, true); + } + + /// + /// Test the including of ini files with absolute and relative paths. + /// + [Test] + public void IncludeTests() + { + const string mainIniFile = "OpenSim.ini"; + m_config = new IniConfigSource(); + + // Create ini files in a directory structure + IniConfigSource ini; + IConfig config; + + ini = new IniConfigSource(); + config = ini.AddConfig("IncludeTest"); + config.Set("Include-absolute", "absolute/*/config/*.ini"); + config.Set("Include-relative", "../" + m_testSubdirectory + "/relative/*/config/*.ini"); + CreateIni(mainIniFile, ini); + + ini = new IniConfigSource(); + ini.AddConfig("Absolute1").Set("name1", "value1"); + CreateIni("absolute/one/config/setting.ini", ini); + + ini = new IniConfigSource(); + ini.AddConfig("Absolute2").Set("name2", 2.3); + CreateIni("absolute/two/config/setting1.ini", ini); + + ini = new IniConfigSource(); + ini.AddConfig("Absolute2").Set("name3", "value3"); + CreateIni("absolute/two/config/setting2.ini", ini); + + ini = new IniConfigSource(); + ini.AddConfig("Relative1").Set("name4", "value4"); + CreateIni("relative/one/config/setting.ini", ini); + + ini = new IniConfigSource(); + ini.AddConfig("Relative2").Set("name5", true); + CreateIni("relative/two/config/setting1.ini", ini); + + ini = new IniConfigSource(); + ini.AddConfig("Relative2").Set("name6", 6); + CreateIni("relative/two/config/setting2.ini", ini); + + // Prepare call to ConfigurationLoader.LoadConfigSettings() + ConfigurationLoader cl = new ConfigurationLoader(); + IConfigSource argvSource = new IniConfigSource(); + argvSource.AddConfig("Startup").Set("inifile", mainIniFile); + ConfigSettings configSettings; + NetworkServersInfo networkInfo; + + OpenSimConfigSource source = cl.LoadConfigSettings(argvSource, out configSettings, out networkInfo); + + // Remove default config + config = source.Source.Configs["Startup"]; + source.Source.Configs.Remove(config); + config = source.Source.Configs["Network"]; + source.Source.Configs.Remove(config); + + // Finally, we are able to check the result + Assert.AreEqual(m_config.ToString(), source.Source.ToString(), + "Configuration with includes does not contain all settings."); + // The following would be preferable but fails due to a type mismatch which I am not able to resolve + //CollectionAssert.AreEquivalent(m_config.Configs, source.Source.Configs, + // String.Format("Configuration with includes does not contain all settings.\nAll settings:\n{0}\nSettings read:\n{1}", m_config, source.Source)); + } + + private void CreateIni(string filepath, IniConfigSource source) + { + string path = Path.GetDirectoryName(filepath); + if (path != string.Empty) + { + Directory.CreateDirectory(path); + } + source.Save(filepath); + m_config.Merge(source); + } + } +} diff --git a/prebuild.xml b/prebuild.xml index 84077971db..fdd024abde 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -2770,6 +2770,28 @@ + + + + ../../bin/ + + + + + ../../bin/ + + + + ../../bin/ + + + + + + + + + From 1463691cb6d022efbb2a0c5742a032f03a940cee Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 14 Aug 2010 00:48:12 +0100 Subject: [PATCH 20/34] In EventQueueHelper.uintToByteArray, fetch big end-ian bytes directly from libomv rather than little endian then swapping This avoids a problem with failing to swap on big-endian machines. This addresses http://opensimulator.org/mantis/view.php?id=4849 Thanks to Valy- for pointing this out and submitting a suggestion patch --- .../Framework/EventQueue/EventQueueHelper.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueHelper.cs b/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueHelper.cs index efa60bbb1e..53a2a7d791 100644 --- a/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueHelper.cs +++ b/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueHelper.cs @@ -54,12 +54,10 @@ namespace OpenSim.Region.CoreModules.Framework.EventQueue } private static byte[] uintToByteArray(uint uIntValue) - { - byte[] resultbytes = Utils.UIntToBytes(uIntValue); - if (BitConverter.IsLittleEndian) - Array.Reverse(resultbytes); - - return resultbytes; + { + byte[] result = new byte[4]; + Utils.UIntToBytesBig(uIntValue, result, 0); + return result; } public static OSD buildEvent(string eventName, OSD eventBody) From 46d0690b3166c3367457ad248fb1a65f41b88fb0 Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Fri, 13 Aug 2010 16:56:01 -0700 Subject: [PATCH 21/34] * Fixed a casing typo for Simian profile data * Minor logging tweak in Simian asset connector --- .../Connectors/SimianGrid/SimianAssetServiceConnector.cs | 2 +- OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs index 7a420e4dc4..616b5a7663 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs @@ -184,7 +184,7 @@ namespace OpenSim.Services.Connectors.SimianGrid } catch (Exception ex) { - m_log.Warn("[SIMIAN ASSET CONNECTOR]: Asset GET from " + url + " failed: " + ex.Message); + m_log.Warn("[SIMIAN ASSET CONNECTOR]: Asset HEAD from " + url + " failed: " + ex.Message); } return metadata; diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs b/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs index 704790ee28..d30d8805de 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs @@ -326,7 +326,7 @@ namespace OpenSim.Services.Connectors.SimianGrid try { interests = OSDParser.DeserializeJson(user["LLInterests"].AsString()) as OSDMap; - client.SendAvatarInterestsReply(avatarID, interests["WantMask"].AsUInteger(), interests["WantText"].AsString(), interests["SkillsMask"].AsUInteger(), interests["SkillsText"].AsString(), interests["languages"].AsString()); + client.SendAvatarInterestsReply(avatarID, interests["WantMask"].AsUInteger(), interests["WantText"].AsString(), interests["SkillsMask"].AsUInteger(), interests["SkillsText"].AsString(), interests["Languages"].AsString()); } catch { } } From d806741e9d244ab254f33c99f75eb6da96db1ebd Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Fri, 13 Aug 2010 17:39:45 -0700 Subject: [PATCH 22/34] * Cleaned up the magic UUID definitions in AvatarWearable.cs --- OpenSim/Framework/AvatarWearable.cs | 39 ++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/OpenSim/Framework/AvatarWearable.cs b/OpenSim/Framework/AvatarWearable.cs index 87d9e617b8..30c5172ad4 100644 --- a/OpenSim/Framework/AvatarWearable.cs +++ b/OpenSim/Framework/AvatarWearable.cs @@ -34,8 +34,23 @@ namespace OpenSim.Framework { public class AvatarWearable { - public UUID AssetID = new UUID("00000000-0000-0000-0000-000000000000"); - public UUID ItemID = new UUID("00000000-0000-0000-0000-000000000000"); + public static readonly UUID DEFAULT_BODY_ITEM = new UUID("66c41e39-38f9-f75a-024e-585989bfaba9"); + public static readonly UUID DEFAULT_BODY_ASSET = new UUID("66c41e39-38f9-f75a-024e-585989bfab73"); + + public static readonly UUID DEFAULT_HAIR_ITEM = new UUID("d342e6c1-b9d2-11dc-95ff-0800200c9a66"); + public static readonly UUID DEFAULT_HAIR_ASSET = new UUID("d342e6c0-b9d2-11dc-95ff-0800200c9a66"); + + public static readonly UUID DEFAULT_SKIN_ITEM = new UUID("77c41e39-38f9-f75a-024e-585989bfabc9"); + public static readonly UUID DEFAULT_SKIN_ASSET = new UUID("77c41e39-38f9-f75a-024e-585989bbabbb"); + + public static readonly UUID DEFAULT_SHIRT_ITEM = new UUID("77c41e39-38f9-f75a-0000-585989bf0000"); + public static readonly UUID DEFAULT_SHIRT_ASSET = new UUID("00000000-38f9-1111-024e-222222111110"); + + public static readonly UUID DEFAULT_PANTS_ITEM = new UUID("77c41e39-38f9-f75a-0000-5859892f1111"); + public static readonly UUID DEFAULT_PANTS_ASSET = new UUID("00000000-38f9-1111-024e-222222111120"); + + public UUID AssetID; + public UUID ItemID; public AvatarWearable() { @@ -58,24 +73,24 @@ namespace OpenSim.Framework } // Body - defaultWearables[0].ItemID = new UUID("66c41e39-38f9-f75a-024e-585989bfaba9"); - defaultWearables[0].AssetID = new UUID("66c41e39-38f9-f75a-024e-585989bfab73"); + defaultWearables[0].ItemID = DEFAULT_BODY_ITEM; + defaultWearables[0].AssetID = DEFAULT_BODY_ASSET; // Hair - defaultWearables[2].ItemID = new UUID("d342e6c1-b9d2-11dc-95ff-0800200c9a66"); - defaultWearables[2].AssetID = new UUID("d342e6c0-b9d2-11dc-95ff-0800200c9a66"); + defaultWearables[2].ItemID = DEFAULT_HAIR_ITEM; + defaultWearables[2].AssetID = DEFAULT_HAIR_ASSET; // Skin - defaultWearables[1].ItemID = new UUID("77c41e39-38f9-f75a-024e-585989bfabc9"); - defaultWearables[1].AssetID = new UUID("77c41e39-38f9-f75a-024e-585989bbabbb"); + defaultWearables[1].ItemID = DEFAULT_SKIN_ITEM; + defaultWearables[1].AssetID = DEFAULT_SKIN_ASSET; // Shirt - defaultWearables[4].ItemID = new UUID("77c41e39-38f9-f75a-0000-585989bf0000"); - defaultWearables[4].AssetID = new UUID("00000000-38f9-1111-024e-222222111110"); + defaultWearables[4].ItemID = DEFAULT_SHIRT_ITEM; + defaultWearables[4].AssetID = DEFAULT_SHIRT_ASSET; // Pants - defaultWearables[5].ItemID = new UUID("77c41e39-38f9-f75a-0000-5859892f1111"); - defaultWearables[5].AssetID = new UUID("00000000-38f9-1111-024e-222222111120"); + defaultWearables[5].ItemID = DEFAULT_PANTS_ITEM; + defaultWearables[5].AssetID = DEFAULT_PANTS_ASSET; return defaultWearables; } From d5c24241b7bcbe22fe22e1b7b0057f1105070131 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 15 Aug 2010 17:25:27 -0700 Subject: [PATCH 23/34] Thanks Marck for the patch to mantis #4941 (shortening avies' names on HG) --- .../Services/HypergridService/GatekeeperService.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/OpenSim/Services/HypergridService/GatekeeperService.cs b/OpenSim/Services/HypergridService/GatekeeperService.cs index 3aaafe8efd..6f041dae21 100644 --- a/OpenSim/Services/HypergridService/GatekeeperService.cs +++ b/OpenSim/Services/HypergridService/GatekeeperService.cs @@ -259,7 +259,16 @@ namespace OpenSim.Services.HypergridService if (account == null && !aCircuit.lastname.StartsWith("@")) { aCircuit.firstname = aCircuit.firstname + "." + aCircuit.lastname; - aCircuit.lastname = "@" + aCircuit.ServiceURLs["HomeURI"].ToString(); + try + { + Uri uri = new Uri(aCircuit.ServiceURLs["HomeURI"].ToString()); + aCircuit.lastname = "@" + uri.Host; // + ":" + uri.Port; + } + catch + { + m_log.WarnFormat("[GATEKEEPER SERVICE]: Malformed HomeURI (this should never happen): {0}", aCircuit.ServiceURLs["HomeURI"]); + aCircuit.lastname = "@" + aCircuit.ServiceURLs["HomeURI"].ToString(); + } } // From 30d0bf42071bf07f3f2ad30aa75126436e9360ae Mon Sep 17 00:00:00 2001 From: Marck Date: Sun, 15 Aug 2010 21:08:37 +0200 Subject: [PATCH 24/34] Fix SQLite database plugin for UserAccountData queries with a single word. --- OpenSim/Data/SQLite/SQLiteUserAccountData.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Data/SQLite/SQLiteUserAccountData.cs b/OpenSim/Data/SQLite/SQLiteUserAccountData.cs index 893f105604..2706aea257 100644 --- a/OpenSim/Data/SQLite/SQLiteUserAccountData.cs +++ b/OpenSim/Data/SQLite/SQLiteUserAccountData.cs @@ -66,7 +66,7 @@ namespace OpenSim.Data.SQLite if (words.Length == 1) { - cmd.CommandText = String.Format("select * from {0} where ScopeID='{1}' or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like '{2}%' or LastName like '{2}%')", + cmd.CommandText = String.Format("select * from {0} where (ScopeID='{1}' or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like '{2}%' or LastName like '{2}%')", m_Realm, scopeID.ToString(), words[0]); } else From 5d29c0ec9d917c9edd251f8bf171c44e6922c4cf Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 15 Aug 2010 18:10:54 -0700 Subject: [PATCH 25/34] Addresses mantis #4929. Agent was being logged off the grid too soon -- things may still fail. --- .../EntityTransfer/EntityTransferModule.cs | 15 +++++++++++++-- .../EntityTransfer/HGEntityTransferModule.cs | 14 ++++++++++---- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 364d340198..607219ef73 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -307,7 +307,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer string reason = String.Empty; // Let's create an agent there if one doesn't exist yet. - if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason)) + bool logout = false; + if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout)) { sp.ControllingClient.SendTeleportFailed(String.Format("Destination refused: {0}", reason)); @@ -434,8 +435,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it CrossAttachmentsIntoNewRegion(finalDestination, sp, true); + // Well, this is it. The agent is over there. + KillEntity(sp.Scene, sp.LocalId); + // May need to logout or other cleanup + AgentHasMovedAway(sp.ControllingClient.SessionId, logout); + // Now let's make it officially a child agent sp.MakeChildAgent(); @@ -483,8 +489,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer } - protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason) + protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout) { + logout = false; return m_aScene.SimulationService.CreateAgent(finalDestination, agentCircuit, teleportFlags, out reason); } @@ -500,6 +507,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer } + protected virtual void AgentHasMovedAway(UUID sessionID, bool logout) + { + } + protected void KillEntity(Scene scene, uint localID) { scene.SendKillObject(localID); diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs index 7d26e3ff5f..d49d18db36 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs @@ -140,9 +140,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return false; } - protected override bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason) + protected override void AgentHasMovedAway(UUID sessionID, bool logout) + { + if (logout) + // Log them out of this grid + m_aScene.PresenceService.LogoutAgent(sessionID); + } + + protected override bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout) { reason = string.Empty; + logout = false; int flags = m_aScene.GridService.GetRegionFlags(m_aScene.RegionInfo.ScopeID, reg.RegionID); if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) { @@ -152,9 +160,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer string userAgentDriver = agentCircuit.ServiceURLs["HomeURI"].ToString(); IUserAgentService connector = new UserAgentServiceConnector(userAgentDriver); bool success = connector.LoginAgentToGrid(agentCircuit, reg, finalDestination, out reason); - if (success) - // Log them out of this grid - m_aScene.PresenceService.LogoutAgent(agentCircuit.SessionID); + logout = success; return success; } From a5044e08fb3f42588c5a64013a57120cbd9de3e3 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 15 Aug 2010 18:13:09 -0700 Subject: [PATCH 26/34] Better comment (related to previous commit) --- .../Framework/EntityTransfer/HGEntityTransferModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs index d49d18db36..1ac7508c20 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs @@ -160,7 +160,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer string userAgentDriver = agentCircuit.ServiceURLs["HomeURI"].ToString(); IUserAgentService connector = new UserAgentServiceConnector(userAgentDriver); bool success = connector.LoginAgentToGrid(agentCircuit, reg, finalDestination, out reason); - logout = success; + logout = success; // flag for later logout from this grid; this is an HG TP return success; } From f219e320bc3eedec860bcd1137bf705f4af12865 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 16 Aug 2010 08:51:56 -0700 Subject: [PATCH 27/34] Increased the timeout on AgentUpdate to 30 sec and improved error message to try to catch some weirdnesses going on in HG TPs (and maybe non-HG TPs too). --- .../Connectors/Simulation/SimulationServiceConnector.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs index 32f02fbf37..6244565c2d 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs @@ -257,7 +257,7 @@ namespace OpenSim.Services.Connectors.Simulation HttpWebRequest ChildUpdateRequest = (HttpWebRequest)WebRequest.Create(uri); ChildUpdateRequest.Method = "PUT"; ChildUpdateRequest.ContentType = "application/json"; - ChildUpdateRequest.Timeout = 10000; + ChildUpdateRequest.Timeout = 30000; //ChildUpdateRequest.KeepAlive = false; // Fill it in @@ -334,7 +334,7 @@ namespace OpenSim.Services.Connectors.Simulation } catch (WebException ex) { - m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of ChilAgentUpdate {0}", ex.Message); + m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of ChilAgentUpdate from {0}: {1}", uri, ex.Message); // ignore, really } finally From 77de28965ae5fc6de3c60a28ce7d4e59643a2a70 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 16 Aug 2010 11:33:59 -0700 Subject: [PATCH 28/34] Work on TeleportStart: renamed method from TeleportLocationStart to TeleportStart, and now sending this upon all teleports, not just some, and in the right place (EntityTransferModule). --- .../Client/MXP/ClientStack/MXPClientView.cs | 2 +- .../ClientStack/SirikataClientView.cs | 2 +- .../VWoHTTP/ClientStack/VWHClientView.cs | 2 +- OpenSim/Framework/IClientAPI.cs | 2 +- .../ClientStack/LindenUDP/LLClientView.cs | 19 +++++++++++++++---- .../EntityTransfer/EntityTransferModule.cs | 10 ++++------ .../World/Estate/EstateManagementModule.cs | 3 --- .../Examples/SimpleModule/MyNpcCharacter.cs | 2 +- .../Server/IRCClientView.cs | 2 +- .../OptionalModules/World/NPC/NPCAvatar.cs | 2 +- .../Shared/Api/Implementation/LSL_Api.cs | 1 - .../Shared/Api/Implementation/OSSL_Api.cs | 2 -- OpenSim/Tests/Common/Mock/TestClient.cs | 2 +- 13 files changed, 27 insertions(+), 24 deletions(-) diff --git a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs index 65921a2c00..5e16347dce 100644 --- a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs +++ b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs @@ -1015,7 +1015,7 @@ namespace OpenSim.Client.MXP.ClientStack // Need to translate to MXP somehow } - public void SendTeleportLocationStart() + public void SendTeleportStart(uint flags) { // Need to translate to MXP somehow } diff --git a/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs b/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs index b808e95073..1c702d2260 100644 --- a/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs +++ b/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs @@ -573,7 +573,7 @@ namespace OpenSim.Client.Sirikata.ClientStack throw new System.NotImplementedException(); } - public void SendTeleportLocationStart() + public void SendTeleportStart(uint flags) { throw new System.NotImplementedException(); } diff --git a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs b/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs index a6c490b2bc..e954aa3d5b 100644 --- a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs +++ b/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs @@ -579,7 +579,7 @@ namespace OpenSim.Client.VWoHTTP.ClientStack throw new System.NotImplementedException(); } - public void SendTeleportLocationStart() + public void SendTeleportStart(uint flags) { throw new System.NotImplementedException(); } diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index db745481bc..81f99b0769 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -1011,7 +1011,7 @@ namespace OpenSim.Framework uint flags, string capsURL); void SendTeleportFailed(string reason); - void SendTeleportLocationStart(); + void SendTeleportStart(uint flags); void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance); void SendPayPrice(UUID objectID, int[] payPrice); diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index c11b9a2758..bb9e6d4c73 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -1432,16 +1432,27 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// /// /// - public void SendTeleportLocationStart() + public void SendTeleportStart(uint flags) { - //TeleportStartPacket tpStart = (TeleportStartPacket)PacketPool.Instance.GetPacket(PacketType.TeleportStart); - TeleportStartPacket tpStart = new TeleportStartPacket(); - tpStart.Info.TeleportFlags = 16; // Teleport via location + TeleportStartPacket tpStart = (TeleportStartPacket)PacketPool.Instance.GetPacket(PacketType.TeleportStart); + //TeleportStartPacket tpStart = new TeleportStartPacket(); + tpStart.Info.TeleportFlags = flags; //16; // Teleport via location // Hack to get this out immediately and skip throttles OutPacket(tpStart, ThrottleOutPacketType.Unknown); } + public void SendTeleportProgress(uint flags, string message) + { + TeleportProgressPacket tpProgress = (TeleportProgressPacket)PacketPool.Instance.GetPacket(PacketType.TeleportProgress); + tpProgress.AgentData.AgentID = this.AgentId; + tpProgress.Info.TeleportFlags = flags; + tpProgress.Info.Message = Util.StringToBytes256(message); + + // Hack to get this out immediately and skip throttles + OutPacket(tpProgress, ThrottleOutPacketType.Unknown); + } + public void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance) { MoneyBalanceReplyPacket money = (MoneyBalanceReplyPacket)PacketPool.Instance.GetPacket(PacketType.MoneyBalanceReply); diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 607219ef73..751d49acba 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -174,9 +174,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer position.Z = newPosZ; } - // Only send this if the event queue is null - if (eq == null) - sp.ControllingClient.SendTeleportLocationStart(); + sp.ControllingClient.SendTeleportStart(teleportFlags); sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); sp.Teleport(position); @@ -257,9 +255,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer ulong destinationHandle = finalDestination.RegionHandle; - if (eq == null) - sp.ControllingClient.SendTeleportLocationStart(); - // Let's do DNS resolution only once in this process, please! // This may be a costly operation. The reg.ExternalEndPoint field is not a passive field, // it's actually doing a lot of work. @@ -277,6 +272,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return; } + sp.ControllingClient.SendTeleportStart(teleportFlags); + // the avatar.Close below will clear the child region list. We need this below for (possibly) // closing the child agents, so save it here (we need a copy as it is Clear()-ed). //List childRegions = new List(avatar.GetKnownRegionList()); @@ -320,6 +317,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (NeedsNewAgent(oldRegionX, newRegionX, oldRegionY, newRegionY)) { + #region IP Translation for NAT IClientIPEndpoint ipepClient; if (sp.ClientView.TryGet(out ipepClient)) diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 940b535921..51f2c41f8e 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs @@ -343,7 +343,6 @@ namespace OpenSim.Region.CoreModules.World.Estate { if (!s.IsChildAgent) { - s.ControllingClient.SendTeleportLocationStart(); m_scene.TeleportClientHome(user, s.ControllingClient); } } @@ -478,7 +477,6 @@ namespace OpenSim.Region.CoreModules.World.Estate ScenePresence s = m_scene.GetScenePresence(prey); if (s != null) { - s.ControllingClient.SendTeleportLocationStart(); m_scene.TeleportClientHome(prey, s.ControllingClient); } } @@ -498,7 +496,6 @@ namespace OpenSim.Region.CoreModules.World.Estate // Also make sure they are actually in the region if (p != null && !p.IsChildAgent) { - p.ControllingClient.SendTeleportLocationStart(); m_scene.TeleportClientHome(p.UUID, p.ControllingClient); } } diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs index f6e6163301..3f5aa467a0 100644 --- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs @@ -520,7 +520,7 @@ namespace OpenSim.Region.Examples.SimpleModule { } - public virtual void SendTeleportLocationStart() + public virtual void SendTeleportStart(uint flags) { } diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index ee7aa2da8d..19bb0026a3 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs @@ -1035,7 +1035,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server } - public void SendTeleportLocationStart() + public void SendTeleportStart(uint flags) { } diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index 2e0450cf76..944bac62c7 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs @@ -611,7 +611,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC { } - public virtual void SendTeleportLocationStart() + public virtual void SendTeleportStart(uint flags) { } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 32e46ec4e9..b21e53262e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -4070,7 +4070,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (m_host.OwnerID == World.LandChannel.GetLandObject( presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID) { - presence.ControllingClient.SendTeleportLocationStart(); World.TeleportClientHome(agentId, presence.ControllingClient); } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 01b64eb08f..a529a944fb 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -664,7 +664,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api regionName = regInfo.RegionName; } } - presence.ControllingClient.SendTeleportLocationStart(); World.RequestTeleportLocation(presence.ControllingClient, regionName, new Vector3((float)position.x, (float)position.y, (float)position.z), new Vector3((float)lookat.x, (float)lookat.y, (float)lookat.z), (uint)TPFlags.ViaLocation); @@ -696,7 +695,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api == World.LandChannel.GetLandObject( presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID) { - presence.ControllingClient.SendTeleportLocationStart(); World.RequestTeleportLocation(presence.ControllingClient, regionHandle, new Vector3((float)position.x, (float)position.y, (float)position.z), new Vector3((float)lookat.x, (float)lookat.y, (float)lookat.z), (uint)TPFlags.ViaLocation); diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs index 999cf5e56d..0dee374378 100644 --- a/OpenSim/Tests/Common/Mock/TestClient.cs +++ b/OpenSim/Tests/Common/Mock/TestClient.cs @@ -614,7 +614,7 @@ namespace OpenSim.Tests.Common.Mock { } - public virtual void SendTeleportLocationStart() + public virtual void SendTeleportStart(uint flags) { } From a8b80ef800e78d9fa321bc2388b4d8336f454b1d Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 16 Aug 2010 11:39:46 -0700 Subject: [PATCH 29/34] Added SendTeleportProgress to IClientAPI. Ya know what that means... 8 files affected. --- OpenSim/Client/MXP/ClientStack/MXPClientView.cs | 4 ++++ OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs | 5 +++++ OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs | 5 +++++ OpenSim/Framework/IClientAPI.cs | 2 ++ OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs | 4 ++++ .../Agent/InternetRelayClientView/Server/IRCClientView.cs | 4 ++++ OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs | 4 ++++ OpenSim/Tests/Common/Mock/TestClient.cs | 4 ++++ 8 files changed, 32 insertions(+) diff --git a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs index 5e16347dce..b5b2508035 100644 --- a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs +++ b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs @@ -1020,6 +1020,10 @@ namespace OpenSim.Client.MXP.ClientStack // Need to translate to MXP somehow } + public void SendTeleportProgress(uint flags, string message) + { + } + public void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance) { // Need to translate to MXP somehow diff --git a/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs b/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs index 1c702d2260..c1e281abf9 100644 --- a/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs +++ b/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs @@ -578,6 +578,11 @@ namespace OpenSim.Client.Sirikata.ClientStack throw new System.NotImplementedException(); } + public void SendTeleportProgress(uint flags, string message) + { + throw new System.NotImplementedException(); + } + public void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance) { throw new System.NotImplementedException(); diff --git a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs b/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs index e954aa3d5b..99a46dc884 100644 --- a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs +++ b/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs @@ -584,6 +584,11 @@ namespace OpenSim.Client.VWoHTTP.ClientStack throw new System.NotImplementedException(); } + public void SendTeleportProgress(uint flags, string message) + { + throw new System.NotImplementedException(); + } + public void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance) { throw new System.NotImplementedException(); diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 81f99b0769..94815cd238 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -1012,6 +1012,8 @@ namespace OpenSim.Framework void SendTeleportFailed(string reason); void SendTeleportStart(uint flags); + void SendTeleportProgress(uint flags, string message); + void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance); void SendPayPrice(UUID objectID, int[] payPrice); diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs index 3f5aa467a0..268612efda 100644 --- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs @@ -524,6 +524,10 @@ namespace OpenSim.Region.Examples.SimpleModule { } + public virtual void SendTeleportProgress(uint flags, string message) + { + } + public virtual void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance) { } diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index 19bb0026a3..6793ef63f3 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs @@ -1040,6 +1040,10 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server } + public void SendTeleportProgress(uint flags, string message) + { + } + public void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance) { diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index 944bac62c7..fae12b6fc0 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs @@ -615,6 +615,10 @@ namespace OpenSim.Region.OptionalModules.World.NPC { } + public virtual void SendTeleportProgress(uint flags, string message) + { + } + public virtual void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance) { } diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs index 0dee374378..e46f9b75ad 100644 --- a/OpenSim/Tests/Common/Mock/TestClient.cs +++ b/OpenSim/Tests/Common/Mock/TestClient.cs @@ -618,6 +618,10 @@ namespace OpenSim.Tests.Common.Mock { } + public void SendTeleportProgress(uint flags, string message) + { + } + public virtual void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance) { } From 69ad04cdf6ca899877a38fd4f9248f4107e3a7ce Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 16 Aug 2010 12:03:13 -0700 Subject: [PATCH 30/34] Attempt at sending TeleportProgress, but it doesn't seem to be doing anything at all. Left it commented, just as a reminder for where those messages could be sent. --- .../Framework/EntityTransfer/EntityTransferModule.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 751d49acba..bb98dba7a2 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -317,6 +317,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (NeedsNewAgent(oldRegionX, newRegionX, oldRegionY, newRegionY)) { + //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Creating agent..."); #region IP Translation for NAT IClientIPEndpoint ipepClient; @@ -395,6 +396,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer agent.Position = position; SetCallbackURL(agent, sp.Scene.RegionInfo); + //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Updating agent..."); + if (!UpdateAgent(reg, finalDestination, agent)) { // Region doesn't take it From d7824b86d97bf3b219b67c8908eb28ba0f3edbeb Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 16 Aug 2010 14:36:20 -0700 Subject: [PATCH 31/34] Fixes mantis #4954 for the xml-rpc calls of the UserAgentServiceConnector. Basically, let's not let the xml-rpc library do the DNS conversion... --- .../Hypergrid/UserAgentServiceConnector.cs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs index 96d2605058..69dff3cd4d 100644 --- a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs @@ -53,9 +53,20 @@ namespace OpenSim.Services.Connectors.Hypergrid MethodBase.GetCurrentMethod().DeclaringType); string m_ServerURL; + Uri m_Uri; public UserAgentServiceConnector(string url) { m_ServerURL = url; + try + { + m_Uri = new Uri(m_ServerURL); + IPAddress ip = Util.GetHostFromDNS(m_Uri.Host); + m_ServerURL = "http://" + ip.ToString() + ":" + m_Uri.Port; + } + catch (Exception e) + { + m_log.DebugFormat("[USER AGENT CONNECTOR]: Malformed Uri {0}: {1}", m_ServerURL, e.Message); + } } public UserAgentServiceConnector(IConfigSource config) @@ -373,7 +384,7 @@ namespace OpenSim.Services.Connectors.Hypergrid if (response.IsFault) { - m_log.ErrorFormat("[HGrid]: remote call to {0} returned an error: {1}", m_ServerURL, response.FaultString); + m_log.ErrorFormat("[USER AGENT CONNECTOR]: remote call to {0} returned an error: {1}", m_ServerURL, response.FaultString); reason = "XMLRPC Fault"; return false; } @@ -403,7 +414,7 @@ namespace OpenSim.Services.Connectors.Hypergrid } catch (Exception e) { - m_log.ErrorFormat("[HGrid]: Got exception on GetBoolResponse response."); + m_log.ErrorFormat("[USER AGENT CONNECTOR]: Got exception on GetBoolResponse response."); if (hash.ContainsKey("result") && hash["result"] != null) m_log.ErrorFormat("Reply was ", (string)hash["result"]); reason = "Exception: " + e.Message; From 53190e332d896b2c36c95dcd5f7ce03404f9d60a Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Tue, 17 Aug 2010 12:04:37 -0700 Subject: [PATCH 32/34] Updated to new OpenMetaverse.StructuredData.dll that includes implicit typecasts --- bin/OpenMetaverse.StructuredData.dll | Bin 102400 -> 102400 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/OpenMetaverse.StructuredData.dll b/bin/OpenMetaverse.StructuredData.dll index 76db137d0c53aef840d571ae9ec69e3e43d1db32..1c55e2c4139aa3624d0f4315a8178e517bf070b8 100644 GIT binary patch literal 102400 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 B>I?t? literal 102400 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 A)c^nh From e1f2c32284b38bc1116239bc0c8d2d5010214449 Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Tue, 17 Aug 2010 12:26:20 -0700 Subject: [PATCH 33/34] * Updated to OpenMetaverse.StructuredData.dll that includes implicit typecasts going in the other direction --- bin/OpenMetaverse.StructuredData.dll | Bin 102400 -> 102400 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/OpenMetaverse.StructuredData.dll b/bin/OpenMetaverse.StructuredData.dll index 1c55e2c4139aa3624d0f4315a8178e517bf070b8..54681e4bfed65437999cf10f4cf7b64c91124b49 100644 GIT binary patch delta 19979 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 E02OD_=l}o! delta 19377 zcmbuH2Y6LQxA$kwJ~?%tBqt}N03itp$srBW6PolUEmEX}CcU1J1R+ump?3&7gdzxN zP^y%GpkhIa0fG`iMFa&wiXyLAUO`d6wPp_?dHwEvzI#8O_x|_%)><>OX7=pa<>WeR zvvJmD85ZVyG>-4tHlUW{r2` zYK-M@*E0xtoiOZ$$3gWH8tTz?6TjV76v z(|}!S%>$c2Cv9qAOK@s$2981v4~p`yHq79rSM-Fm0YL{b)DfH-SiohgedN6X$L3NrP*p*yPM#S@Cy^p7~^)N*)(&h{IJ9g*A9S8QiboaNV=9 znHb%mxVNDthEJw>jBO9SVqCrmx)TT6ug#hi92FVam_IZP?PUuiJBQpX#XRyPVdOYvK|M2Kb zJz_nFJo?Gw*VImZK0Z$rFyK4c@B?}LTOKWh#0R&jSk6Iu4xw8T)o7XPSMRx=9g9r%akAX<7>Yg{Jr&&J-MsxMbh;?O@Vho4xq z`%V2lRU>$l95qJp);}z7|HE>mrbUbrFTekoop)+R;V9pg7SEFjd+#4X@7J{a7mXjS z8HJ61@DIzee^`#|mW0P=EJnfeQ?B1U7>_sRouczEuPv2trAsUCjF#Bk*<36^KACob zIP}mlPb@P&nf4E|(NSNjd@^kyWTRu=1+B2T(<58xCOvd~9Nk&k=%}wvKDiIs?0hR7 z<${%)gsSfm`r_r2>&nV>%o7WlPY#hbI_8N*&7YK_+;AZ$VSIJKW$Kp8E~rXa*K!m`)l<7^V*b`W<9M}t43jBbHOc%Icamz zZ@fl#YdqUF)ABKSb+qKxV<1Y~*t#1u)b6%UhErNto7Ygw+lGFblupm0e%xsdRv6X!U2xG_;d!^PlNp0>PmJltb(4~JyUO-F z+O)1+5@3Zky-RnjU(w|gS@GW#G`MEP->Ph);>oTB;G?zd7K%DV=&WvG;jM752}*YP zF&^M*gJt&;Ok~^)+KkW^=xU=K?G~L%QNhX0{xgcU9zE(w%>%kE2y2FPk51NWX4b4Z zgSMHP6=%>sgC?psrF#R>W9{S~HS3L=L0e4CisNR`CL?QBc6Z{97we(xUtWqsNy{QNAT<5VecN+nB&ZXM(&%~kgm1i28`;e2P>C0!bV44=+Gd{VuZdyWz z+%5{s$(xIfzR;Nmkj3@=QE&qlbay)in9y9Q%? z6=Wk=jkd2WQF*7d?|RmUeww{k8|Yt_)$4D71TCviJLs>i>C??YE5+3x#S+-pZZW%C zY5(ri0fuNTo^1d_wc*dshQVdGo{a>5eG9DKTi&U%(0&aS^FXYPBOIjl$X)=owTs#H zVX*c`_Ch0N;f~Z64eSO<+QosPXnrs-RyTLl8V<_C9ySgtt~U(hY({qm4#b4xa^mnT zI6U0A9NaZp>pnOTMrfl3#{^8kK=H@`EC2%Vf^N0k+r>u9)0njZDyf92=mejt*BtAA1#dg7)0#2H4KR z(cv(mY{zIbh^FJUt7Cd%DP?SA@FczYTxTT9amC;%Ht0R&YLmt$#Xjk&w?Xg7JrB=I zs5K#=23r!0+TL+NRz+G}Ihan*C#e`PmG0xxu+RD9>O+pUecU@Z)KTMcz-5cZ_u_cv zeKoOB`?;75&;5~OD)X@zAH;LVL_G#u?jkJf*CKa`P*)*kFIFTixaML}&Cq(fTfucs>YQ-`(1@^U> zj7fKS=s?#zZF7Fa@ESE}U8}Jjc<4CSJS@iBa(B9_PE)lp+Vzwy)dpZNI}EZTx&~xN z2YKiW*Sxam$!~!@5MP39CRYMZiffs6@A;UpWf(}CE4`O^;Y@d;b6)ib=msrgO0ws3 z3=$g%?t5QQna&KBFHw23UcQLs@!|;_9bY0?jjoUJ9uX%WC-u3-ckAuw%S%SF1*owB zCT@10LU2(cVt&kleO0p_mUPWT6)-O&KE3>FimSDVib8f6=*qFiU$DgJkE?0;98g4U zDDp`Fn$r^N?Pqq~$60W# z(l!;;f^zL(feR|NuL^P+R~wi+}XN!<=_koB2W@RxNoU2KDF* zL7vAM$T2%ju|WR@ zd@HtLbyyu1efSq0W^5*yMrd=`YD@s$NN@rsO$&il+KOp3;H}e|YL}H+CgzF(5-Cj5|RbZ6xJ9$ji!AyWRQqDT#gy6dl-i3b$t>ui791q)O4Cu9kTCK-j zJLPegJnojq*X41KJnp3c*p3@p$~0D&w(IyH%)BrRlTlSoEA|1~$)5pa##)4xz)pW{1+jcTQhw zckCQ1bP-oteY~~|bjeYHPAI(rh{56=*2?{7;48d=#!NQFjhBO%0iE!f#~RazeA@eS z{hR4Vd@-x4heOkiq1BAf(RgVhrs1=-88c{H++Fh6xPgrN*C_Xz$Ht9h z)W1f#*FH9GBBTBt%3X|o8spmHhbU~0yYWfMiaUtejZeW=t1%x(hBNmkXsHWAyA;)@v%uBXzduoV1+k4Ow1Cw_0`U{N?dF+jM?cMBQCpPq+H&)>JYs`vzF(OxQVWq686k0!USsT0_oqi6#fG}#|C5NA@wzf}HIw$mBE5fk> z$4b&s|QhT@pj>kstu?O|f<5wS_=s-c z)5=kk6S=FN*0DGQzfX@WPKWl|OT{1iB+wk=-7F8+o7EMkOSHk=<3yD`3VI)R@=t0jqla%&*bv!Yjh+O4OFD53Bvespvku zFzCZSx=*Zc;(6lc(*KgE`~TJtUQgK1f5x7yk&_Z{=ebuJ$>d{AcvYoT)rk0Shp|~7 z#+DcBn?;@hu4L`Zi|x`=sebOQ$8CxaWgYbUCcW`j8&mH0kArw#xYl7qbO>%XxarWR zwIPpd1nMHC*?B?Hg8H(r1T_-WkKGZJDX2gDO;9UA1K3}JItj{V z_!5O}_7F6Xc?;?(@MU8W?Kr7ffbFn+Xog>0*Rx{Sf?3Z(V(fJ! zYIGTr9SI)`kV*s{#xsgewqMkHli4`}J0g51k*LiNh3^6j$C3N8O5wYNxzvsRx0RM)}1@C(K|?9><>xj zn>;2Xo2j&CMm9(3jJia7t#pZ}q0PaT$CFkH^-rMkvqIMky&^QM5!r_ez1?Uimg5_f z<_bL|^pVh3iDaKI^o&s7B(n4tx?bqlLiZ-yRMo+5UITK znyTW|rm6cyISMBzO?^w0j|=@ss2=%)C@(Q+pS)V%lkAl>Yo9miNugf~{Yj|VhwSx) zrU~sLbg8#^HI3Zv}z;?xG{K}$2pIMe5gQ?FfZ=tn>))pEjw1Logp-DoUaf(kD z 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 QA2bg+X2HLFiW-~#580QMV*mgE From a8c0b131f9aa62d4b6260fd37f89014e55b457cf Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Tue, 17 Aug 2010 13:50:04 -0700 Subject: [PATCH 34/34] * Changed a few OSD.FromBinary() calls to the more accurate OSD.FromULong() to fix the build --- OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 2 +- .../Region/CoreModules/Framework/EventQueue/EventQueueHelper.cs | 2 +- .../Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index bb9e6d4c73..1d3bdf3ff7 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -3033,7 +3033,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP { OSDMap GroupDataMap = new OSDMap(6); OSDMap NewGroupDataMap = new OSDMap(1); - GroupDataMap.Add("GroupPowers", OSD.FromBinary(m.GroupPowers)); + GroupDataMap.Add("GroupPowers", OSD.FromULong(m.GroupPowers)); GroupDataMap.Add("AcceptNotices", OSD.FromBoolean(m.AcceptNotices)); GroupDataMap.Add("GroupTitle", OSD.FromString(m.GroupTitle)); GroupDataMap.Add("GroupID", OSD.FromUUID(m.GroupID)); diff --git a/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueHelper.cs b/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueHelper.cs index 53a2a7d791..e9bcae30cd 100644 --- a/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueHelper.cs +++ b/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueHelper.cs @@ -158,7 +158,7 @@ namespace OpenSim.Region.CoreModules.Framework.EventQueue info.Add("SimAccess", OSD.FromInteger(simAccess)); info.Add("SimIP", OSD.FromBinary(regionExternalEndPoint.Address.GetAddressBytes())); info.Add("SimPort", OSD.FromInteger(regionExternalEndPoint.Port)); - info.Add("TeleportFlags", OSD.FromBinary(1L << 4)); // AgentManager.TeleportFlags.ViaLocation + info.Add("TeleportFlags", OSD.FromULong(1L << 4)); // AgentManager.TeleportFlags.ViaLocation OSDArray infoArr = new OSDArray(); infoArr.Add(info); diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs index 3f15b69944..29695034ae 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs @@ -1129,7 +1129,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups OSDMap NewGroupDataMap = new OSDMap(1); GroupDataMap.Add("GroupID", OSD.FromUUID(membership.GroupID)); - GroupDataMap.Add("GroupPowers", OSD.FromBinary(membership.GroupPowers)); + GroupDataMap.Add("GroupPowers", OSD.FromULong(membership.GroupPowers)); GroupDataMap.Add("AcceptNotices", OSD.FromBoolean(membership.AcceptNotices)); GroupDataMap.Add("GroupInsigniaID", OSD.FromUUID(membership.GroupPicture)); GroupDataMap.Add("Contribution", OSD.FromInteger(membership.Contribution));