ModernUO/Scripts/Engines/Reports/Persistance/PersistanceWriter.cs

125 lines
No EOL
3.2 KiB
C#

using System;
using System.IO;
using System.Xml;
namespace Server.Engines.Reports
{
public abstract class PersistanceWriter
{
public abstract void SetInt32(string key, int value);
public abstract void SetBoolean(string key, bool value);
public abstract void SetString(string key, string value);
public abstract void SetDateTime(string key, DateTime value);
public abstract void BeginObject(PersistableType typeID);
public abstract void BeginChildren();
public abstract void FinishChildren();
public abstract void FinishObject();
public abstract void WriteDocument(PersistableObject root);
public abstract void Close();
}
public sealed class XmlPersistanceWriter : PersistanceWriter
{
private string m_RealFilePath;
private string m_TempFilePath;
private string m_Title;
private StreamWriter m_Writer;
private XmlTextWriter m_Xml;
public XmlPersistanceWriter(string filePath, string title)
{
m_RealFilePath = filePath;
m_TempFilePath = Path.ChangeExtension(filePath, ".tmp");
m_Writer = new StreamWriter(m_TempFilePath);
m_Xml = new XmlTextWriter(m_Writer);
m_Title = title;
}
public override void SetInt32(string key, int value)
{
m_Xml.WriteAttributeString(key, XmlConvert.ToString(value));
}
public override void SetBoolean(string key, bool value)
{
m_Xml.WriteAttributeString(key, XmlConvert.ToString(value));
}
public override void SetString(string key, string value)
{
if (value != null)
m_Xml.WriteAttributeString(key, value);
}
public override void SetDateTime(string key, DateTime value)
{
if (value != DateTime.MinValue)
m_Xml.WriteAttributeString(key, XmlConvert.ToString(value, XmlDateTimeSerializationMode.Utc));
}
public override void BeginObject(PersistableType typeID)
{
m_Xml.WriteStartElement(typeID.Name);
}
public override void BeginChildren()
{
}
public override void FinishChildren()
{
}
public override void FinishObject()
{
m_Xml.WriteEndElement();
}
public override void WriteDocument(PersistableObject root)
{
Console.WriteLine("Reports: {0}: Save started", m_Title);
m_Xml.Formatting = Formatting.Indented;
m_Xml.IndentChar = '\t';
m_Xml.Indentation = 1;
m_Xml.WriteStartDocument(true);
root.Serialize(this);
Console.WriteLine("Reports: {0}: Save complete", m_Title);
}
public override void Close()
{
m_Xml.Close();
m_Writer.Close();
try
{
string renamed = null;
if (File.Exists(m_RealFilePath))
{
renamed = Path.ChangeExtension(m_RealFilePath, ".rem");
File.Move(m_RealFilePath, renamed);
File.Move(m_TempFilePath, m_RealFilePath);
File.Delete(renamed);
}
else
{
File.Move(m_TempFilePath, m_RealFilePath);
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}