From 52a32878a9573681e3b56d0151c4a0903719eadf Mon Sep 17 00:00:00 2001
From: Oren Hurvitz
Date: Thu, 3 May 2012 19:38:35 +0300
Subject: Save the Telehub and its Spawn Points in the OAR

---
 OpenSim/Framework/RegionSettings.cs                | 29 ++++++++++++++++-
 .../External/RegionSettingsSerializer.cs           | 37 ++++++++++++++++++++--
 .../Tests/RegionSettingsSerializerTests.cs         |  8 +++++
 3 files changed, 71 insertions(+), 3 deletions(-)

(limited to 'OpenSim/Framework')

diff --git a/OpenSim/Framework/RegionSettings.cs b/OpenSim/Framework/RegionSettings.cs
index 4ce3392..47dbcec 100644
--- a/OpenSim/Framework/RegionSettings.cs
+++ b/OpenSim/Framework/RegionSettings.cs
@@ -29,6 +29,7 @@ using System;
 using System.Collections.Generic;
 using System.IO;
 using OpenMetaverse;
+using System.Runtime.Serialization;
 
 namespace OpenSim.Framework
 {
@@ -71,6 +72,32 @@ namespace OpenSim.Framework
 
             return pos + offset;
         }
+
+        /// <summary>
+        /// Returns a string representation of this SpawnPoint.
+        /// </summary>
+        /// <returns></returns>
+        public override string ToString()
+        {
+            return string.Format("{0},{1},{2}", Yaw, Pitch, Distance);
+        }
+
+        /// <summary>
+        /// Generate a SpawnPoint from a string
+        /// </summary>
+        /// <param name="str"></param>
+        public static SpawnPoint Parse(string str)
+        {
+            string[] parts = str.Split(',');
+            if (parts.Length != 3)
+                throw new ArgumentException("Invalid string: " + str);
+            
+            SpawnPoint sp = new SpawnPoint();
+            sp.Yaw = float.Parse(parts[0]);
+            sp.Pitch = float.Parse(parts[1]);
+            sp.Distance = float.Parse(parts[2]);
+            return sp;
+        }
     }
 
     public class RegionSettings
@@ -456,7 +483,7 @@ namespace OpenSim.Framework
         }
 
         // Connected Telehub object
-        private UUID m_TelehubObject;
+        private UUID m_TelehubObject = UUID.Zero;
         public UUID TelehubObject
         {
             get
diff --git a/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs
index 931898c..f18435d 100644
--- a/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs
+++ b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs
@@ -30,6 +30,8 @@ using System.Text;
 using System.Xml;
 using OpenMetaverse;
 using OpenSim.Framework;
+using log4net;
+using System.Reflection;
 
 namespace OpenSim.Framework.Serialization.External
 {
@@ -187,7 +189,29 @@ namespace OpenSim.Framework.Serialization.External
                         break;
                 }
             }
-            
+
+            xtr.ReadEndElement();
+
+            if (xtr.IsStartElement("Telehub"))
+            {
+                xtr.ReadStartElement("Telehub");
+
+                while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement)
+                {
+                    switch (xtr.Name)
+                    {
+                        case "TelehubObject":
+                            settings.TelehubObject = UUID.Parse(xtr.ReadElementContentAsString());
+                            break;
+                        case "SpawnPoint":
+                            string str = xtr.ReadElementContentAsString();
+                            SpawnPoint sp = SpawnPoint.Parse(str);
+                            settings.AddSpawnPoint(sp);
+                            break;
+                    }
+                }
+            }
+
             xtr.Close();
             sr.Close();
             
@@ -243,7 +267,16 @@ namespace OpenSim.Framework.Serialization.External
             xtw.WriteElementString("SunPosition", settings.SunPosition.ToString());
             // Note: 'SunVector' isn't saved because this value is owned by the Sun Module, which
             // calculates it automatically according to the date and other factors.
-            xtw.WriteEndElement(); 
+            xtw.WriteEndElement();
+
+            xtw.WriteStartElement("Telehub");
+            if (settings.TelehubObject != UUID.Zero)
+            {
+                xtw.WriteElementString("TelehubObject", settings.TelehubObject.ToString());
+                foreach (SpawnPoint sp in settings.SpawnPoints())
+                    xtw.WriteElementString("SpawnPoint", sp.ToString());
+            }
+            xtw.WriteEndElement();
             
             xtw.WriteEndElement();
             
diff --git a/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs b/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs
index a61e4af..09b6f6d 100644
--- a/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs
+++ b/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs
@@ -78,6 +78,10 @@ namespace OpenSim.Framework.Serialization.Tests
     <FixedSun>true</FixedSun>
     <SunPosition>12</SunPosition>
   </Terrain>
+  <Telehub>
+    <TelehubObject>00000000-0000-0000-0000-111111111111</TelehubObject>
+    <SpawnPoint>1,-2,0.33</SpawnPoint>
+  </Telehub>
 </RegionSettings>";
 
         private RegionSettings m_rs;
@@ -116,6 +120,8 @@ namespace OpenSim.Framework.Serialization.Tests
             m_rs.TerrainTexture4 = UUID.Parse("00000000-0000-0000-0000-000000000080");
             m_rs.UseEstateSun = true;
             m_rs.WaterHeight = 23;
+            m_rs.TelehubObject = UUID.Parse("00000000-0000-0000-0000-111111111111");
+            m_rs.AddSpawnPoint(SpawnPoint.Parse("1,-2,0.33"));
         }
 
         [Test]
@@ -129,6 +135,8 @@ namespace OpenSim.Framework.Serialization.Tests
             Assert.That(deserRs.TerrainTexture2, Is.EqualTo(m_rs.TerrainTexture2));
             Assert.That(deserRs.DisablePhysics, Is.EqualTo(m_rs.DisablePhysics));
             Assert.That(deserRs.TerrainLowerLimit, Is.EqualTo(m_rs.TerrainLowerLimit));
+            Assert.That(deserRs.TelehubObject, Is.EqualTo(m_rs.TelehubObject));
+            Assert.That(deserRs.SpawnPoints()[0].ToString(), Is.EqualTo(m_rs.SpawnPoints()[0].ToString()));
         }
     }
 }
-- 
cgit v1.1