/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* AUTHOR: Vance Morrison
* Date : 10/20/2007 */
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Xml;
namespace Utilities
{
///
/// ConfigData is simply a Dictionary that knows how to read and write itself to XML efficiently.
///
public class ConfigData : SortedDictionary
{
public ConfigData() { m_elementName = "ConfigData"; }
public ConfigData(string xmlFileName, bool autoWrite = false, string elementName = "ConfigData")
{
m_elementName = elementName;
m_fileName = xmlFileName;
m_autoWrite = autoWrite;
Read(xmlFileName);
}
public ConfigData(Stream xmlDataStream) : this(xmlDataStream, "ConfigData") { }
public ConfigData(Stream xmlDataStream, string elementName)
{
m_elementName = elementName;
Read(xmlDataStream);
}
public new string this[string key]
{
get
{
string result = null;
base.TryGetValue(key, out result);
return result;
}
set
{
if (value == null)
{
base.Remove(key);
}
else
{
base[key] = value;
}
if (m_autoWrite && m_fileName != null)
{
Write(m_fileName);
}
}
}
public double GetDouble(string key, double defaultValue)
{
string value;
if (TryGetValue(key, out value))
{
double doubleValue;
if (double.TryParse(value, out doubleValue))
{
return doubleValue;
}
}
return defaultValue;
}
public string ElementName
{
get { return m_elementName; }
set { ElementName = value; }
}
public void Write(string xmlFileName)
{
Directory.CreateDirectory(Path.GetDirectoryName(Path.GetFullPath(xmlFileName)));
XmlWriterSettings settings = new XmlWriterSettings();
using (XmlWriter writer = XmlWriter.Create(xmlFileName, new XmlWriterSettings() { Indent = true, NewLineOnAttributes = true }))
{
WriteData(writer);
}
}
public void Write(Stream stream)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.NewLineOnAttributes = true;
using (XmlWriter writer = XmlWriter.Create(stream, settings))
{
writer.Close();
}
}
public void Read(string xmlFileName)
{
if (File.Exists(xmlFileName))
{
XmlReaderSettings settings = new XmlReaderSettings() { IgnoreWhitespace = true, IgnoreComments = true };
using (XmlReader reader = XmlTextReader.Create(xmlFileName, settings))
{
Read(reader);
}
}
}
public void Read(Stream xmlDataStream)
{
XmlReaderSettings settings = new XmlReaderSettings() { IgnoreWhitespace = true, IgnoreComments = true };
using (XmlReader reader = XmlTextReader.Create(xmlDataStream, settings))
{
Read(reader);
}
}
public void Read(XmlReader reader)
{
int entryDepth = reader.Depth;
try
{
reader.Read();
for (; ; )
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
// Console.WriteLine("Reader got element " + reader.Name);
if (reader.Depth > entryDepth)
{
string key = reader.Name;
string value = reader.ReadElementContentAsString();
Add(key, value);
continue;
}
else
{
if (reader.Name != m_elementName)
{
throw new Exception("Unexpected Element " + reader.Name + " expected " + m_elementName);
}
}
break;
case XmlNodeType.EndElement:
// Console.WriteLine("Reader got End element " + reader.Name);
return;
}
reader.Read();
}
}
catch (Exception)
{
Debug.WriteLine("Error reading configuration file. May have partial results");
}
}
#region Private
private void WriteData(XmlWriter writer)
{
writer.WriteStartElement(m_elementName);
foreach (KeyValuePair entry in this)
{
// TODO worry about invalid historyInfo names
writer.WriteElementString(entry.Key, entry.Value);
}
writer.WriteEndElement();
}
private string m_elementName;
private string m_fileName;
private bool m_autoWrite;
#endregion
}
}