rendered paste bodyusing System;
using System.Collections;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
namespace Service
{
/// <summary>
/// Collection of items only for reading
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
public interface IItemsCollectionReadOnly<TKey, TValue>
{
TValue this[TKey Key] { get; }
bool ContainsKey( TKey Key );
bool ContainsValue( TValue Value );
bool TryGetValue( TKey key, out TValue Value );
int Count { get; }
Dictionary<TKey, TValue>.KeyCollection Keys { get; }
Dictionary<TKey, TValue>.ValueCollection Values { get; }
Dictionary<TKey, TValue>.Enumerator GetEnumerator();
Item FindItemByPath( string Path );
}
/// <summary>
/// Collection of items
/// </summary>
public class ItemsCollection : Dictionary<Item, Dictionary<string, List<Version>>>,
IItemsCollectionReadOnly<Item, Dictionary<string, List<Version>>>,
IXmlSerializable
{
/// <summary>
/// Search item by path
/// </summary>
/// <param name="Path">Path to item</param>
/// <returns>Item with path, which is searched</returns>
public Item FindItemByPath( string Path )
{
foreach ( Item item in base.Keys )
if ( item.Path == Path ) return item;
return null;
}
public XmlSchema GetSchema() { return null; }
public void ReadXml( XmlReader Reader )
{
Dictionary<string, int> storages = new Dictionary<string, int>();
for ( int i = 0; i < Archive.Storages.Count; i++ ) storages.Add(Archive.Storages[i].FileName, i);
while ( Reader.Read() && Reader.Name == "Item" )
{
Reader.MoveToAttribute("Path");
Reader.ReadAttributeValue();
string path = Reader.Value;
Reader.MoveToAttribute("Filter");
Reader.ReadAttributeValue();
string filter = Reader.Value;
Reader.MoveToAttribute("MaxVersions");
Reader.ReadAttributeValue();
int maxversions = int.Parse(Reader.Value);
Item item = new Item(path, filter, maxversions);
base.Add(item, new Dictionary<string, List<Version>>());
while ( Reader.Read() && Reader.Name == "Version" )
{
Reader.MoveToAttribute("Path");
Reader.ReadAttributeValue();
string file = Reader.Value;
if ( !base[item].ContainsKey(file) ) base[item].Add(file, new List<Version>());
Version version = new Version();
Reader.MoveToAttribute("Changed");
Reader.ReadAttributeValue();
version.Changed = new DateTime(long.Parse(Reader.Value));
Reader.MoveToAttribute("Storage");
Reader.ReadAttributeValue();
version.Storage = storages[Reader.Value];
Reader.MoveToAttribute("Offset");
Reader.ReadAttributeValue();
version.Offset = int.Parse(Reader.Value);
Reader.MoveToAttribute("Length");
Reader.ReadAttributeValue();
version.FileLength = int.Parse(Reader.Value);
Reader.MoveToAttribute("MapOffset");
Reader.ReadAttributeValue();
version.MapOffset = int.Parse(Reader.Value);
Reader.MoveToAttribute("MapLength");
Reader.ReadAttributeValue();
version.MapLength = int.Parse(Reader.Value);
Reader.MoveToAttribute("Path");
Reader.ReadAttributeValue();
version.Path = Reader.Value;
base[item][file].Add(version);
}
}
}
public void WriteXml( XmlWriter Writer )
{
foreach ( Item item in base.Keys )
{
Writer.WriteStartElement("Item");
Writer.WriteAttributeString("Path", item.Path);
Writer.WriteAttributeString("Filter", item.Filter);
Writer.WriteAttributeString("MaxVersions", item.MaxVersions.ToString());
foreach ( List<Version> versions in base[item].Values )
foreach ( Version version in versions )
{
Writer.WriteStartElement("Version");
Writer.WriteAttributeString("Path", version.Path);
Writer.WriteAttributeString("Changed", version.Changed.Ticks.ToString());
Writer.WriteAttributeString("Storage", Archive.Storages[version.Storage].FileName);
Writer.WriteAttributeString("Offset", version.Offset.ToString());
Writer.WriteAttributeString("Length", version.FileLength.ToString());
Writer.WriteAttributeString("MapOffset", version.MapOffset.ToString());
Writer.WriteAttributeString("MapLength", version.MapLength.ToString());
Writer.WriteEndElement();
}
Writer.WriteEndElement();
}
}
}
}