From 8d479fe5afc30cb4a188b79fb9f09820a763afbb Mon Sep 17 00:00:00 2001 From: Dr Scofield Date: Fri, 15 Aug 2008 07:20:38 +0000 Subject: From: Richard Alimi The following patch makes some enhancements to loading/saving the Xml2 format. - Add streamed version of functionality for saving prims to Xml2 format. The streamed version (optionally) allows for saving the prims whose positions appear within a particular bounding box. - Expose stream versions of LoadPrimsFromXml2 and SavePrimsToXml2 in the Scene class - Extend loading from Xml2 (the streamed version) to optionally start scripts for the loaded scene objects) --- .../Modules/World/Serialiser/IRegionSerialiser.cs | 25 ++++++++- .../Modules/World/Serialiser/SceneXmlLoader.cs | 64 +++++++++++++++++++--- .../Modules/World/Serialiser/SerialiserModule.cs | 14 ++++- OpenSim/Region/Environment/Scenes/Scene.cs | 15 +++++ 4 files changed, 106 insertions(+), 12 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Environment/Modules/World/Serialiser/IRegionSerialiser.cs b/OpenSim/Region/Environment/Modules/World/Serialiser/IRegionSerialiser.cs index 8a13f2b..e76d40d 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 @@ -74,6 +75,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 /// /// @@ -81,6 +93,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 cd1fecb..0df19d9 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 ce59ecc..d722d68 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 bd02b7e..4e7e764 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( -- cgit v1.1