2008-09-28 21:28:10 +00:00
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Xml;
|
2008-10-05 22:05:18 +00:00
|
|
|
using ExtensionLoader;
|
2008-09-28 21:28:10 +00:00
|
|
|
using OpenMetaverse;
|
|
|
|
|
using OpenMetaverse.StructuredData;
|
|
|
|
|
|
|
|
|
|
namespace Simian.Extensions
|
|
|
|
|
{
|
2008-10-29 20:11:28 +00:00
|
|
|
public class XMLPersistence : IExtension<Simian>, IPersistenceProvider
|
2008-09-28 21:28:10 +00:00
|
|
|
{
|
|
|
|
|
Simian server;
|
|
|
|
|
|
2008-10-29 20:11:28 +00:00
|
|
|
public XMLPersistence()
|
2008-09-28 21:28:10 +00:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2008-10-29 20:11:28 +00:00
|
|
|
public void Start(Simian server)
|
2008-09-28 21:28:10 +00:00
|
|
|
{
|
2008-10-29 20:11:28 +00:00
|
|
|
this.server = server;
|
|
|
|
|
|
2008-10-30 01:50:59 +00:00
|
|
|
OSD osd;
|
2008-09-28 21:28:10 +00:00
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
XmlTextReader reader = new XmlTextReader(File.OpenRead(server.DataDir + "simiandata.xml"));
|
2008-10-30 16:54:17 +00:00
|
|
|
osd = OSDParser.DeserializeLLSDXml(reader);
|
2008-09-28 21:28:10 +00:00
|
|
|
reader.Close();
|
|
|
|
|
}
|
|
|
|
|
catch (FileNotFoundException)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
Logger.Log("Failed to load saved data: " + ex.Message, Helpers.LogLevel.Error);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2008-10-30 01:50:59 +00:00
|
|
|
if (osd is OSDMap)
|
2008-09-28 21:28:10 +00:00
|
|
|
{
|
2008-10-30 01:50:59 +00:00
|
|
|
OSDMap dictionary = (OSDMap)osd;
|
2008-09-28 21:28:10 +00:00
|
|
|
|
|
|
|
|
for (int i = 0; i < server.PersistentExtensions.Count; i++)
|
|
|
|
|
{
|
|
|
|
|
IPersistable persistable = server.PersistentExtensions[i];
|
|
|
|
|
|
2008-10-30 01:50:59 +00:00
|
|
|
OSD savedData;
|
2008-09-28 21:28:10 +00:00
|
|
|
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()
|
|
|
|
|
{
|
2008-10-30 01:50:59 +00:00
|
|
|
OSDMap dictionary = new OSDMap(server.PersistentExtensions.Count);
|
2008-09-28 21:28:10 +00:00
|
|
|
|
|
|
|
|
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(server.DataDir + "simiandata.xml", System.Text.Encoding.UTF8);
|
2008-10-07 19:12:06 +00:00
|
|
|
writer.Formatting = Formatting.Indented;
|
2008-09-28 21:28:10 +00:00
|
|
|
writer.WriteStartElement("llsd");
|
2008-10-30 16:54:17 +00:00
|
|
|
OSDParser.SerializeLLSDXmlElement(writer, dictionary);
|
2008-09-28 21:28:10 +00:00
|
|
|
writer.WriteEndElement();
|
|
|
|
|
writer.Close();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
Logger.Log("Failed to save persistance data: " + ex.Message, Helpers.LogLevel.Error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|