All pastes #795781 Raw Edit

Anonymous

public text v1 · immutable
#795781 ·published 2007-11-24 13:39 UTC
rendered paste body
using 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();
			}
		}
	}
}