From 2b60a5c5d64f38caf243119105416c1101c6eb6c Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Sat, 19 May 2012 02:45:17 +0100
Subject: Add is_megaregion flag into oar control file. Not currently read -
for future use. Please do not rely on this remaining here.
An adaptation of part of Garmin's patch from http://opensimulator.org/mantis/view.php?id=5975, thanks!
Flag only written if the SW corner OAR is saved - this is the only one that captures object data presently (though not land or terrain data).
This adds an IRegionCombinerModule interface and the necessary methods on RegionCombinerModule
---
.../Archiver/ArchiveWriteRequestPreparation.cs | 95 ++++++++++++++--------
.../CoreModules/World/Archiver/ArchiverModule.cs | 20 +++--
.../Framework/Interfaces/IRegionCombinerModule.cs | 51 ++++++++++++
.../RegionCombinerModule/RegionCombinerModule.cs | 22 ++++-
4 files changed, 145 insertions(+), 43 deletions(-)
create mode 100644 OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs
index 5679ad5..838b741 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs
@@ -67,7 +67,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver
/// Determine whether this archive will save assets. Default is true.
///
public bool SaveAssets { get; set; }
-
+
+ protected ArchiverModule m_module;
protected Scene m_scene;
protected Stream m_saveStream;
protected Guid m_requestId;
@@ -75,13 +76,13 @@ namespace OpenSim.Region.CoreModules.World.Archiver
///
/// Constructor
///
- ///
+ /// Calling module
/// The path to which to save data.
/// The id associated with this request
///
/// If there was a problem opening a stream for the file specified by the savePath
///
- public ArchiveWriteRequestPreparation(Scene scene, string savePath, Guid requestId) : this(scene, requestId)
+ public ArchiveWriteRequestPreparation(ArchiverModule module, string savePath, Guid requestId) : this(module, requestId)
{
try
{
@@ -99,17 +100,23 @@ namespace OpenSim.Region.CoreModules.World.Archiver
///
/// Constructor.
///
- ///
+ /// Calling module
/// The stream to which to save data.
/// The id associated with this request
- public ArchiveWriteRequestPreparation(Scene scene, Stream saveStream, Guid requestId) : this(scene, requestId)
+ public ArchiveWriteRequestPreparation(ArchiverModule module, Stream saveStream, Guid requestId) : this(module, requestId)
{
m_saveStream = saveStream;
}
- protected ArchiveWriteRequestPreparation(Scene scene, Guid requestId)
+ protected ArchiveWriteRequestPreparation(ArchiverModule module, Guid requestId)
{
- m_scene = scene;
+ m_module = module;
+
+ // FIXME: This is only here for regression test purposes since they do not supply a module. Need to fix
+ // this.
+ if (m_module != null)
+ m_scene = m_module.Scene;
+
m_requestId = requestId;
SaveAssets = true;
@@ -364,32 +371,56 @@ namespace OpenSim.Region.CoreModules.World.Archiver
//if (majorVersion == 1)
//{
// m_log.WarnFormat("[ARCHIVER]: Please be aware that version 1.0 OARs are not compatible with OpenSim 0.7.0.2 and earlier. Please use the --version=0 option if you want to produce a compatible OAR");
- //}
+ //}
+
+ String s;
- StringWriter sw = new StringWriter();
- XmlTextWriter xtw = new XmlTextWriter(sw);
- xtw.Formatting = Formatting.Indented;
- xtw.WriteStartDocument();
- xtw.WriteStartElement("archive");
- xtw.WriteAttributeString("major_version", majorVersion.ToString());
- xtw.WriteAttributeString("minor_version", minorVersion.ToString());
-
- xtw.WriteStartElement("creation_info");
- DateTime now = DateTime.UtcNow;
- TimeSpan t = now - new DateTime(1970, 1, 1);
- xtw.WriteElementString("datetime", ((int)t.TotalSeconds).ToString());
- xtw.WriteElementString("id", UUID.Random().ToString());
- xtw.WriteEndElement();
-
- xtw.WriteElementString("assets_included", SaveAssets.ToString());
-
- xtw.WriteEndElement();
-
- xtw.Flush();
- xtw.Close();
-
- String s = sw.ToString();
- sw.Close();
+ using (StringWriter sw = new StringWriter())
+ {
+ using (XmlTextWriter xtw = new XmlTextWriter(sw))
+ {
+ xtw.Formatting = Formatting.Indented;
+ xtw.WriteStartDocument();
+ xtw.WriteStartElement("archive");
+ xtw.WriteAttributeString("major_version", majorVersion.ToString());
+ xtw.WriteAttributeString("minor_version", minorVersion.ToString());
+
+ xtw.WriteStartElement("creation_info");
+ DateTime now = DateTime.UtcNow;
+ TimeSpan t = now - new DateTime(1970, 1, 1);
+ xtw.WriteElementString("datetime", ((int)t.TotalSeconds).ToString());
+ xtw.WriteElementString("id", UUID.Random().ToString());
+ xtw.WriteEndElement();
+
+ xtw.WriteElementString("assets_included", SaveAssets.ToString());
+
+ bool isMegaregion;
+
+ // FIXME: This is only here for regression test purposes since they do not supply a module. Need to fix
+ // this, possibly by doing control file creation somewhere else.
+ if (m_module != null && m_module.RegionCombinerModule != null)
+ {
+ IRegionCombinerModule mod = m_module.RegionCombinerModule;
+ isMegaregion = mod.IsMegaregion && mod.IsRootRegion(m_scene.RegionInfo.RegionID);
+ }
+ else
+ {
+ isMegaregion = false;
+ }
+
+ xtw.WriteElementString("is_megaregion", isMegaregion.ToString());
+
+ xtw.WriteEndElement();
+
+ xtw.Flush();
+ xtw.Close();
+ }
+
+ s = sw.ToString();
+ }
+
+// Console.WriteLine(
+// "[ARCHIVE WRITE REQUEST PREPARATION]: Control file for {0} is: {1}", m_scene.RegionInfo.RegionName, s);
return s;
}
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs
index f5a5a8d..bf3b124 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs
@@ -45,7 +45,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver
private static readonly ILog m_log =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
- private Scene m_scene;
+ public Scene Scene { get; private set; }
+ public IRegionCombinerModule RegionCombinerModule { get; private set; }
///
/// The file used to load and save an opensimulator archive if no filename has been specified
@@ -70,13 +71,14 @@ namespace OpenSim.Region.CoreModules.World.Archiver
public void AddRegion(Scene scene)
{
- m_scene = scene;
- m_scene.RegisterModuleInterface(this);
+ Scene = scene;
+ Scene.RegisterModuleInterface(this);
//m_log.DebugFormat("[ARCHIVER]: Enabled for region {0}", scene.RegionInfo.RegionName);
}
public void RegionLoaded(Scene scene)
{
+ RegionCombinerModule = scene.RequestModuleInterface();
}
public void RemoveRegion(Scene scene)
@@ -165,9 +167,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver
public void ArchiveRegion(string savePath, Guid requestId, Dictionary options)
{
m_log.InfoFormat(
- "[ARCHIVER]: Writing archive for region {0} to {1}", m_scene.RegionInfo.RegionName, savePath);
+ "[ARCHIVER]: Writing archive for region {0} to {1}", Scene.RegionInfo.RegionName, savePath);
- new ArchiveWriteRequestPreparation(m_scene, savePath, requestId).ArchiveRegion(options);
+ new ArchiveWriteRequestPreparation(this, savePath, requestId).ArchiveRegion(options);
}
public void ArchiveRegion(Stream saveStream)
@@ -182,7 +184,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
public void ArchiveRegion(Stream saveStream, Guid requestId, Dictionary options)
{
- new ArchiveWriteRequestPreparation(m_scene, saveStream, requestId).ArchiveRegion(options);
+ new ArchiveWriteRequestPreparation(this, saveStream, requestId).ArchiveRegion(options);
}
public void DearchiveRegion(string loadPath)
@@ -193,9 +195,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver
public void DearchiveRegion(string loadPath, bool merge, bool skipAssets, Guid requestId)
{
m_log.InfoFormat(
- "[ARCHIVER]: Loading archive to region {0} from {1}", m_scene.RegionInfo.RegionName, loadPath);
+ "[ARCHIVER]: Loading archive to region {0} from {1}", Scene.RegionInfo.RegionName, loadPath);
- new ArchiveReadRequest(m_scene, loadPath, merge, skipAssets, requestId).DearchiveRegion();
+ new ArchiveReadRequest(Scene, loadPath, merge, skipAssets, requestId).DearchiveRegion();
}
public void DearchiveRegion(Stream loadStream)
@@ -205,7 +207,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
public void DearchiveRegion(Stream loadStream, bool merge, bool skipAssets, Guid requestId)
{
- new ArchiveReadRequest(m_scene, loadStream, merge, skipAssets, requestId).DearchiveRegion();
+ new ArchiveReadRequest(Scene, loadStream, merge, skipAssets, requestId).DearchiveRegion();
}
}
}
diff --git a/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs b/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs
new file mode 100644
index 0000000..30e49b1
--- /dev/null
+++ b/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs
@@ -0,0 +1,51 @@
+/*
+ * 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.Linq;
+using System.Text;
+using OpenSim.Region.Framework.Scenes;
+using System.IO;
+using OpenMetaverse;
+
+namespace OpenSim.Region.Framework.Interfaces
+{
+ public interface IRegionCombinerModule
+ {
+ ///
+ /// Is this simulator hosting a megaregion?
+ ///
+ ///
+ bool IsMegaregion { get; }
+
+ ///
+ /// Does the given id belong to the root region of the megaregion?
+ ///
+ bool IsRootRegion(UUID sceneId);
+ }
+}
\ No newline at end of file
diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs
index a142f26..37b3037 100644
--- a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs
+++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs
@@ -43,9 +43,8 @@ using Mono.Addins;
[assembly: AddinDependency("OpenSim", "0.5")]
namespace OpenSim.Region.RegionCombinerModule
{
-
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
- public class RegionCombinerModule : ISharedRegionModule
+ public class RegionCombinerModule : ISharedRegionModule, IRegionCombinerModule
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@@ -59,6 +58,15 @@ namespace OpenSim.Region.RegionCombinerModule
get { return null; }
}
+ public bool IsMegaregion
+ {
+ get
+ {
+ lock (m_startingScenes)
+ return m_startingScenes.Count > 1;
+ }
+ }
+
private Dictionary m_regions = new Dictionary();
private bool enabledYN = false;
private Dictionary m_startingScenes = new Dictionary();
@@ -69,9 +77,11 @@ namespace OpenSim.Region.RegionCombinerModule
enabledYN = myConfig.GetBoolean("CombineContiguousRegions", false);
if (enabledYN)
+ {
MainConsole.Instance.Commands.AddCommand(
"RegionCombinerModule", false, "fix-phantoms", "fix-phantoms",
"Fixes phantom objects after an import to megaregions", FixPhantoms);
+ }
}
public void Close()
@@ -80,6 +90,8 @@ namespace OpenSim.Region.RegionCombinerModule
public void AddRegion(Scene scene)
{
+ if (enabledYN)
+ scene.RegisterModuleInterface(this);
}
public void RemoveRegion(Scene scene)
@@ -96,6 +108,12 @@ namespace OpenSim.Region.RegionCombinerModule
}
}
+ public bool IsRootRegion(UUID sceneId)
+ {
+ lock (m_regions)
+ return m_regions.ContainsKey(sceneId);
+ }
+
private void NewPresence(ScenePresence presence)
{
if (presence.IsChildAgent)
--
cgit v1.1