diff --git a/OpenSim/Region/Application/OpenSimMain.cs b/OpenSim/Region/Application/OpenSimMain.cs
index c367537456..d2f5648f2e 100644
--- a/OpenSim/Region/Application/OpenSimMain.cs
+++ b/OpenSim/Region/Application/OpenSimMain.cs
@@ -146,7 +146,6 @@ namespace OpenSim
m_networkServersInfo.loadFromConfiguration(m_config);
}
-
///
/// Performs initialisation of the scene, such as loading configuration from disk.
///
@@ -485,6 +484,28 @@ namespace OpenSim
}
break;
+ case "save-xml2":
+ if (cmdparams.Length > 0)
+ {
+ m_sceneManager.SaveCurrentSceneToXml2(cmdparams[0]);
+ }
+ else
+ {
+ m_sceneManager.SaveCurrentSceneToXml2(DEFAULT_PRIM_BACKUP_FILENAME);
+ }
+ break;
+
+ case "load-xml2":
+ if (cmdparams.Length > 0)
+ {
+ m_sceneManager.LoadCurrentSceneFromXml2(cmdparams[0]);
+ }
+ else
+ {
+ m_sceneManager.LoadCurrentSceneFromXml2(DEFAULT_PRIM_BACKUP_FILENAME);
+ }
+ break;
+
case "terrain":
if (!m_sceneManager.RunTerrainCmdOnCurrentScene(cmdparams, ref result))
{
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index f7e3543519..553e55f289 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -709,6 +709,64 @@ namespace OpenSim.Region.Environment.Scenes
file.Close();
}
+ public void LoadPrimsFromXml2(string fileName)
+ {
+ XmlDocument doc = new XmlDocument();
+ XmlNode rootNode;
+ if ((fileName.StartsWith("http:")) | (File.Exists(fileName)))
+ {
+ XmlTextReader reader = new XmlTextReader(fileName);
+ reader.WhitespaceHandling = WhitespaceHandling.None;
+ doc.Load(reader);
+ reader.Close();
+ rootNode = doc.FirstChild;
+ foreach (XmlNode aPrimNode in rootNode.ChildNodes)
+ {
+ CreatePrimFromXml(aPrimNode.OuterXml);
+ }
+ }
+ else
+ {
+ throw new Exception("Could not open file " + fileName + " for reading");
+ }
+ }
+
+ public void CreatePrimFromXml(string xmlData)
+ {
+ SceneObjectGroup obj = new SceneObjectGroup(xmlData);
+ AddEntityFromStorage(obj);
+
+ SceneObjectPart rootPart = obj.GetChildPart(obj.UUID);
+ if ((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Phantom) == 0)
+ rootPart.PhysActor = phyScene.AddPrimShape(
+ rootPart.Name,
+ rootPart.Shape,
+ new PhysicsVector(rootPart.AbsolutePosition.X, rootPart.AbsolutePosition.Y,
+ rootPart.AbsolutePosition.Z),
+ new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z),
+ new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X,
+ rootPart.RotationOffset.Y, rootPart.RotationOffset.Z));
+ }
+
+ public void SavePrimsToXml2(string fileName)
+ {
+ FileStream file = new FileStream(fileName, FileMode.Create);
+ StreamWriter stream = new StreamWriter(file);
+ int primCount = 0;
+ stream.WriteLine("\n");
+ foreach (EntityBase ent in Entities.Values)
+ {
+ if (ent is SceneObjectGroup)
+ {
+ stream.WriteLine(((SceneObjectGroup)ent).ToXmlString2());
+ primCount++;
+ }
+ }
+ stream.WriteLine("\n");
+ stream.Close();
+ file.Close();
+ }
+
#endregion
#region Add/Remove Avatar Methods
diff --git a/OpenSim/Region/Environment/Scenes/SceneManager.cs b/OpenSim/Region/Environment/Scenes/SceneManager.cs
index e3da550762..d2718dfe38 100644
--- a/OpenSim/Region/Environment/Scenes/SceneManager.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneManager.cs
@@ -85,6 +85,16 @@ namespace OpenSim.Region.Environment.Scenes
public void LoadCurrentSceneFromXml(string filename)
{
CurrentOrFirstScene.LoadPrimsFromXml(filename);
+ }
+
+ public void SaveCurrentSceneToXml2(string filename)
+ {
+ CurrentOrFirstScene.SavePrimsToXml2(filename);
+ }
+
+ public void LoadCurrentSceneFromXml2(string filename)
+ {
+ CurrentOrFirstScene.LoadPrimsFromXml2(filename);
}
public bool RunTerrainCmdOnCurrentScene(string[] cmdparams, ref string result)
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index 18390514de..bb2eadb75f 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -272,7 +272,6 @@ namespace OpenSim.Region.Environment.Scenes
reader.Read();
reader.ReadStartElement("SceneObjectGroup");
- // reader.ReadStartElement("RootPart");
m_rootPart = SceneObjectPart.FromXml(reader);
reader.Read();
@@ -286,8 +285,7 @@ namespace OpenSim.Region.Environment.Scenes
if (reader.Name == "SceneObjectPart")
{
SceneObjectPart Part = SceneObjectPart.FromXml(reader);
- AddPart(Part);
-
+ AddPart(Part);
}
break;
case XmlNodeType.EndElement:
@@ -375,6 +373,35 @@ namespace OpenSim.Region.Environment.Scenes
writer.WriteEndElement();
}
+ public string ToXmlString2()
+ {
+ using (StringWriter sw = new StringWriter())
+ {
+ using (XmlTextWriter writer = new XmlTextWriter(sw))
+ {
+ ToXml2(writer);
+ }
+
+ return sw.ToString();
+ }
+ }
+
+ public void ToXml2(XmlTextWriter writer)
+ {
+ writer.WriteStartElement(String.Empty, "SceneObjectGroup", String.Empty);
+ m_rootPart.ToXml(writer);
+ writer.WriteStartElement(String.Empty, "OtherParts", String.Empty);
+ foreach (SceneObjectPart part in m_parts.Values)
+ {
+ if (part.UUID != m_rootPart.UUID)
+ {
+ part.ToXml(writer);
+ }
+ }
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+ }
+
#region Copying
///