diff --git a/OpenSim/Region/Environment/Modules/World/Serialiser/IRegionSerialiser.cs b/OpenSim/Region/Environment/Modules/World/Serialiser/IRegionSerialiser.cs
index 8a13f2be45..e76d40d1f8 100644
--- a/OpenSim/Region/Environment/Modules/World/Serialiser/IRegionSerialiser.cs
+++ b/OpenSim/Region/Environment/Modules/World/Serialiser/IRegionSerialiser.cs
@@ -64,7 +64,8 @@ namespace OpenSim.Region.Environment.Modules.World.Serialiser
///
///
///
- void LoadPrimsFromXml2(Scene scene, TextReader reader);
+ ///
+ void LoadPrimsFromXml2(Scene scene, TextReader reader, bool startScripts);
///
/// Save prims in the xml2 format
@@ -73,6 +74,17 @@ namespace OpenSim.Region.Environment.Modules.World.Serialiser
///
void SavePrimsToXml2(Scene scene, string fileName);
+ ///
+ /// Save prims in the xml2 format, optionally specifying a bounding box for which
+ /// prims should be saved. If both min and max vectors are LLVector3.Zero, then all prims
+ /// are exported.
+ ///
+ ///
+ ///
+ ///
+ ///
+ void SavePrimsToXml2(Scene scene, TextWriter stream, LLVector3 min, LLVector3 max);
+
///
/// Save a set of prims in the xml2 format
///
@@ -80,6 +92,17 @@ namespace OpenSim.Region.Environment.Modules.World.Serialiser
///
void SavePrimListToXml2(List entityList, string fileName);
+ ///
+ /// Save a set of prims in the xml2 format, optionally specifying a bounding box for which
+ /// prims should be saved. If both min and max vectors are LLVector3.Zero, then all prims
+ /// are exported.
+ ///
+ ///
+ ///
+ ///
+ ///
+ void SavePrimListToXml2(List entityList, TextWriter stream, LLVector3 min, LLVector3 max);
+
///
/// Deserializes a scene object from its xml2 representation. This does not load the object into the scene.
///
diff --git a/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs b/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs
index cd1fecb49e..0df19d976e 100644
--- a/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs
+++ b/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs
@@ -143,7 +143,7 @@ namespace OpenSim.Region.Environment.Scenes
///
public static void LoadPrimsFromXml2(Scene scene, string fileName)
{
- LoadPrimsFromXml2(scene, new XmlTextReader(fileName));
+ LoadPrimsFromXml2(scene, new XmlTextReader(fileName), false);
}
///
@@ -151,9 +151,10 @@ namespace OpenSim.Region.Environment.Scenes
///
///
///
- public static void LoadPrimsFromXml2(Scene scene, TextReader reader)
+ ///
+ public static void LoadPrimsFromXml2(Scene scene, TextReader reader, bool startScripts)
{
- LoadPrimsFromXml2(scene, new XmlTextReader(reader));
+ LoadPrimsFromXml2(scene, new XmlTextReader(reader), startScripts);
}
///
@@ -161,7 +162,8 @@ namespace OpenSim.Region.Environment.Scenes
///
///
///
- protected static void LoadPrimsFromXml2(Scene scene, XmlTextReader reader)
+ ///
+ protected static void LoadPrimsFromXml2(Scene scene, XmlTextReader reader, bool startScripts)
{
XmlDocument doc = new XmlDocument();
reader.WhitespaceHandling = WhitespaceHandling.None;
@@ -169,9 +171,17 @@ namespace OpenSim.Region.Environment.Scenes
reader.Close();
XmlNode rootNode = doc.FirstChild;
+ ICollection sceneObjects = new List();
foreach (XmlNode aPrimNode in rootNode.ChildNodes)
{
- CreatePrimFromXml2(scene, aPrimNode.OuterXml);
+ SceneObjectGroup obj = CreatePrimFromXml2(scene, aPrimNode.OuterXml);
+ if (obj != null && startScripts)
+ sceneObjects.Add(obj);
+ }
+
+ foreach (SceneObjectGroup sceneObject in sceneObjects)
+ {
+ sceneObject.CreateScriptInstances(0, true);
}
}
@@ -198,10 +208,36 @@ namespace OpenSim.Region.Environment.Scenes
SavePrimListToXml2(EntityList, fileName);
}
+ public static void SavePrimsToXml2(Scene scene, TextWriter stream, LLVector3 min, LLVector3 max)
+ {
+ List EntityList = scene.GetEntities();
+
+ SavePrimListToXml2(EntityList, stream, min, max);
+ }
+
public static void SavePrimListToXml2(List entityList, string fileName)
{
FileStream file = new FileStream(fileName, FileMode.Create);
- StreamWriter stream = new StreamWriter(file);
+ try
+ {
+ StreamWriter stream = new StreamWriter(file);
+ try
+ {
+ SavePrimListToXml2(entityList, stream, LLVector3.Zero, LLVector3.Zero);
+ }
+ finally
+ {
+ stream.Close();
+ }
+ }
+ finally
+ {
+ file.Close();
+ }
+ }
+
+ public static void SavePrimListToXml2(List entityList, TextWriter stream, LLVector3 min, LLVector3 max)
+ {
int primCount = 0;
stream.WriteLine("\n");
@@ -209,13 +245,23 @@ namespace OpenSim.Region.Environment.Scenes
{
if (ent is SceneObjectGroup)
{
- stream.WriteLine(((SceneObjectGroup)ent).ToXmlString2());
+ SceneObjectGroup g = (SceneObjectGroup)ent;
+ if (!min.Equals(LLVector3.Zero) || !max.Equals(LLVector3.Zero))
+ {
+ LLVector3 pos = g.RootPart.GetWorldPosition();
+ if (min.X > pos.X || min.Y > pos.Y || min.Z > pos.Z)
+ continue;
+ if (max.X < pos.X || max.Y < pos.Y || max.Z < pos.Z)
+ continue;
+ }
+
+ stream.WriteLine(g.ToXmlString2());
primCount++;
}
}
stream.WriteLine("\n");
- stream.Close();
- file.Close();
+ stream.Flush();
}
+
}
}
diff --git a/OpenSim/Region/Environment/Modules/World/Serialiser/SerialiserModule.cs b/OpenSim/Region/Environment/Modules/World/Serialiser/SerialiserModule.cs
index ce59ecc135..d722d6863f 100644
--- a/OpenSim/Region/Environment/Modules/World/Serialiser/SerialiserModule.cs
+++ b/OpenSim/Region/Environment/Modules/World/Serialiser/SerialiserModule.cs
@@ -102,9 +102,9 @@ namespace OpenSim.Region.Environment.Modules.World.Serialiser
SceneXmlLoader.LoadPrimsFromXml2(scene, fileName);
}
- public void LoadPrimsFromXml2(Scene scene, TextReader reader)
+ public void LoadPrimsFromXml2(Scene scene, TextReader reader, bool startScripts)
{
- SceneXmlLoader.LoadPrimsFromXml2(scene, reader);
+ SceneXmlLoader.LoadPrimsFromXml2(scene, reader, startScripts);
}
public void SavePrimsToXml2(Scene scene, string fileName)
@@ -112,6 +112,11 @@ namespace OpenSim.Region.Environment.Modules.World.Serialiser
SceneXmlLoader.SavePrimsToXml2(scene, fileName);
}
+ public void SavePrimsToXml2(Scene scene, TextWriter stream, LLVector3 min, LLVector3 max)
+ {
+ SceneXmlLoader.SavePrimsToXml2(scene, stream, min, max);
+ }
+
public SceneObjectGroup DeserializeGroupFromXml2(string xmlString)
{
return SceneXmlLoader.DeserializeGroupFromXml2(xmlString);
@@ -127,6 +132,11 @@ namespace OpenSim.Region.Environment.Modules.World.Serialiser
SceneXmlLoader.SavePrimListToXml2(entityList, fileName);
}
+ public void SavePrimListToXml2(List entityList, TextWriter stream, LLVector3 min, LLVector3 max)
+ {
+ SceneXmlLoader.SavePrimListToXml2(entityList, stream, min, max);
+ }
+
public List SerialiseRegion(Scene scene, string saveDir)
{
List results = new List();
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index bd02b7e747..4e7e76479d 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -29,6 +29,7 @@ using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
+using System.IO;
using System.Threading;
using System.Timers;
using Axiom.Math;
@@ -1760,6 +1761,13 @@ namespace OpenSim.Region.Environment.Scenes
m_serialiser.LoadPrimsFromXml2(this, fileName);
}
+ public void LoadPrimsFromXml2(TextReader reader, bool startScripts)
+ {
+ m_log.InfoFormat("[SCENE]: Loading prims in xml2 format to region {0} from stream", RegionInfo.RegionName);
+
+ m_serialiser.LoadPrimsFromXml2(this, reader, startScripts);
+ }
+
public void SavePrimsToXml2(string fileName)
{
m_log.InfoFormat("[SCENE]: Saving prims in xml2 format for region {0} to {1}", RegionInfo.RegionName, fileName);
@@ -1767,6 +1775,13 @@ namespace OpenSim.Region.Environment.Scenes
m_serialiser.SavePrimsToXml2(this, fileName);
}
+ public void SavePrimsToXml2(TextWriter stream, LLVector3 min, LLVector3 max)
+ {
+ m_log.InfoFormat("[SCENE]: Saving prims in xml2 format for region {0} to stream", RegionInfo.RegionName);
+
+ m_serialiser.SavePrimsToXml2(this, stream, min, max);
+ }
+
public void SaveNamedPrimsToXml2(string primName, string fileName)
{
m_log.InfoFormat(