From 521754ba84652c8363bcf3757dbcfe5eff44afdc Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Sun, 7 Mar 2021 15:52:44 +0200 Subject: [PATCH] Save a couple of estate settings in OAR files. The settings that are saved are: * AllowDirectTeleport - required in order to make Telehubs work * AllowEnvironmentOverride - required in order to allow parcels to have different EEP settings from the region --- .../External/RegionSettingsSerializer.cs | 40 +++++++++++++++++-- .../Tests/RegionSettingsSerializerTests.cs | 2 +- .../World/Archiver/ArchiveReadRequest.cs | 4 +- .../World/Archiver/ArchiveWriteRequest.cs | 2 +- .../World/Archiver/Tests/ArchiverTests.cs | 2 +- 5 files changed, 42 insertions(+), 8 deletions(-) diff --git a/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs index 4132b2be7b..f547251c8d 100644 --- a/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs +++ b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs @@ -44,21 +44,25 @@ namespace OpenSim.Framework.Serialization.External /// Deserialize settings /// /// + /// + /// The Estate Settings stored in the archive will be merged into this object /// /// - public static RegionSettings Deserialize(byte[] serializedSettings, out ViewerEnvironment regionEnv) + public static RegionSettings Deserialize(byte[] serializedSettings, out ViewerEnvironment regionEnv, EstateSettings estateSettings) { // encoding is wrong. old oars seem to be on utf-16 - return Deserialize(Encoding.ASCII.GetString(serializedSettings, 0, serializedSettings.Length), out regionEnv); + return Deserialize(Encoding.ASCII.GetString(serializedSettings, 0, serializedSettings.Length), out regionEnv, estateSettings); } /// /// Deserialize settings /// /// + /// + /// The Estate Settings stored in the archive will be merged into this object /// /// - public static RegionSettings Deserialize(string serializedSettings, out ViewerEnvironment regionEnv) + public static RegionSettings Deserialize(string serializedSettings, out ViewerEnvironment regionEnv, EstateSettings estateSettings) { RegionSettings settings = new RegionSettings(); regionEnv = null; @@ -237,13 +241,36 @@ namespace OpenSim.Framework.Serialization.External } } + if (xtr.IsStartElement("Estate")) + { + if (xtr.IsEmptyElement) + xtr.Read(); + else + { + xtr.ReadStartElement("Estate"); + while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement) + { + switch (xtr.Name) + { + case "AllowDirectTeleport": + estateSettings.AllowDirectTeleport = bool.Parse(xtr.ReadElementContentAsString()); + break; + case "AllowEnvironmentOverride": + estateSettings.AllowEnvironmentOverride = bool.Parse(xtr.ReadElementContentAsString()); + break; + } + } + xtr.ReadEndElement(); + } + } + xtr.Close(); sr.Close(); return settings; } - public static string Serialize(RegionSettings settings, ViewerEnvironment RegionEnv) + public static string Serialize(RegionSettings settings, ViewerEnvironment RegionEnv, EstateSettings estateSettings) { StringWriter sw = new StringWriter(); XmlTextWriter xtw = new XmlTextWriter(sw); @@ -308,6 +335,11 @@ namespace OpenSim.Framework.Serialization.External xtw.WriteEndElement(); } + xtw.WriteStartElement("Estate"); + xtw.WriteElementString("AllowDirectTeleport", estateSettings.AllowDirectTeleport.ToString()); + xtw.WriteElementString("AllowEnvironmentOverride", estateSettings.AllowEnvironmentOverride.ToString()); + xtw.WriteEndElement(); + xtw.WriteEndElement(); xtw.Close(); diff --git a/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs b/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs index 80215e5e6d..4f3f2ddde3 100644 --- a/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs +++ b/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs @@ -130,7 +130,7 @@ namespace OpenSim.Framework.Serialization.Tests TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); - RegionSettings deserRs = RegionSettingsSerializer.Deserialize(m_serializedRs, out ViewerEnvironment dummy); + RegionSettings deserRs = RegionSettingsSerializer.Deserialize(m_serializedRs, out ViewerEnvironment dummy, new EstateSettings()); Assert.That(deserRs, Is.Not.Null); Assert.That(deserRs.TerrainTexture2, Is.EqualTo(m_rs.TerrainTexture2)); Assert.That(deserRs.DisablePhysics, Is.EqualTo(m_rs.DisablePhysics)); diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index 68231a91b6..494ac8065f 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs @@ -1044,7 +1044,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver ViewerEnvironment regionEnv = null; try { - loadedRegionSettings = RegionSettingsSerializer.Deserialize(data, out regionEnv); + loadedRegionSettings = RegionSettingsSerializer.Deserialize(data, out regionEnv, scene.RegionInfo.EstateSettings); } catch (Exception e) { @@ -1104,6 +1104,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver currentRegionSettings.CacheID = UUID.Random(); currentRegionSettings.Save(); + scene.EstateDataService.StoreEstateSettings(scene.RegionInfo.EstateSettings); + IEstateModule estateModule = scene.RequestModuleInterface(); if (estateModule != null) estateModule.sendRegionHandshakeToAll(); diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs index 2511c103e2..d62eecb0a9 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs @@ -579,7 +579,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver // Write out region settings string settingsPath = String.Format("{0}{1}{2}.xml", regionDir, ArchiveConstants.SETTINGS_PATH, scene.RegionInfo.RegionName); - m_archiveWriter.WriteFile(settingsPath, RegionSettingsSerializer.Serialize(scene.RegionInfo.RegionSettings, scene.RegionEnvironment)); + m_archiveWriter.WriteFile(settingsPath, RegionSettingsSerializer.Serialize(scene.RegionInfo.RegionSettings, scene.RegionEnvironment, scene.RegionInfo.EstateSettings)); m_log.InfoFormat("[ARCHIVER]: Adding parcel settings to archive."); diff --git a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs index 85eaaf0434..514a1596ac 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs @@ -657,7 +657,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests rs.TelehubObject = UUID.Parse("00000000-0000-0000-0000-111111111111"); rs.AddSpawnPoint(SpawnPoint.Parse("1,-2,0.33")); - tar.WriteFile(ArchiveConstants.SETTINGS_PATH + "region1.xml", RegionSettingsSerializer.Serialize(rs, null)); + tar.WriteFile(ArchiveConstants.SETTINGS_PATH + "region1.xml", RegionSettingsSerializer.Serialize(rs, null, new EstateSettings())); tar.Close();