Files
libremetaverse/Programs/Simian/Extensions/XMLPersistence.cs
John Hurliman 808b681b83 * Fixed a nasty OSD->JSON bug that was producing invalid JSON for empty arrays or dictionaries
* Several fixes in OpenMetaverse.Http.CapsServer and OpenMetaverse.Http.EventQueueServer (this is the first time they've been tested)
[Simian]
* Initial capabilities and EventQueue support (appears to be working)
* HyperGrid is almost working
* More cleanup with how agents are removed from the scene

git-svn-id: http://libopenmetaverse.googlecode.com/svn/libopenmetaverse/trunk@2427 52acb1d6-8a22-11de-b505-999d5b087335
2009-02-04 23:00:33 +00:00

94 lines
3.0 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using ExtensionLoader;
using OpenMetaverse;
using OpenMetaverse.StructuredData;
namespace Simian.Extensions
{
public class XMLPersistence : IExtension<Simian>, IPersistenceProvider
{
Simian server;
public XMLPersistence()
{
}
public void Start(Simian server)
{
this.server = server;
OSD osd;
try
{
XmlTextReader reader = new XmlTextReader(File.OpenRead(Simian.DATA_DIR + "simiandata.xml"));
osd = OSDParser.DeserializeLLSDXml(reader);
reader.Close();
}
catch (FileNotFoundException)
{
return;
}
catch (Exception ex)
{
Logger.Log("Failed to load saved data: " + ex.Message, Helpers.LogLevel.Error);
return;
}
if (osd is OSDMap)
{
OSDMap dictionary = (OSDMap)osd;
for (int i = 0; i < server.PersistentExtensions.Count; i++)
{
IPersistable persistable = server.PersistentExtensions[i];
OSD savedData;
if (dictionary.TryGetValue(persistable.ToString(), out savedData))
{
Logger.DebugLog("Loading saved data for " + persistable.ToString());
persistable.Deserialize(savedData);
}
else
{
Logger.DebugLog("No saved data found for " + persistable.ToString());
}
}
}
}
public void Stop()
{
if (server != null)
{
OSDMap dictionary = new OSDMap(server.PersistentExtensions.Count);
for (int i = 0; i < server.PersistentExtensions.Count; i++)
{
IPersistable persistable = server.PersistentExtensions[i];
Logger.DebugLog("Storing persistant data for " + persistable.ToString());
dictionary.Add(persistable.ToString(), persistable.Serialize());
}
try
{
XmlTextWriter writer = new XmlTextWriter(Simian.DATA_DIR + "simiandata.xml", System.Text.Encoding.UTF8);
writer.Formatting = Formatting.Indented;
writer.WriteStartElement("llsd");
OSDParser.SerializeLLSDXmlElement(writer, dictionary);
writer.WriteEndElement();
writer.Close();
}
catch (Exception ex)
{
Logger.Log("Failed to save persistance data: " + ex.Message, Helpers.LogLevel.Error);
}
}
}
}
}