using System; using System.Collections; using System.Collections.Generic; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; namespace Service { /// /// Collection of items only for reading /// /// /// public interface IItemsCollectionReadOnly { TValue this[TKey Key] { get; } bool ContainsKey( TKey Key ); bool ContainsValue( TValue Value ); bool TryGetValue( TKey key, out TValue Value ); int Count { get; } Dictionary.KeyCollection Keys { get; } Dictionary.ValueCollection Values { get; } Dictionary.Enumerator GetEnumerator(); Item FindItemByPath( string Path ); } /// /// Collection of items /// public class ItemsCollection : Dictionary>>, IItemsCollectionReadOnly>>, IXmlSerializable { /// /// Search item by path /// /// Path to item /// Item with path, which is searched 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 storages = new Dictionary(); 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>()); 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 = 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 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(); } } } }