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

129 lines
No EOL
3 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 PersistanceWriter()
{
}
}
public sealed class XmlPersistanceWriter : PersistanceWriter
{
private string m_RealFilePath;
private string m_TempFilePath;
private StreamWriter m_Writer;
private XmlTextWriter m_Xml;
private string m_Title;
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.Local ) );
}
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 );
}
}
}
}