All pastes #263419 Raw Edit

Something

public text v1 · immutable
·published 2006-12-01 14:55 UTC
rendered paste body
using System;
using System.IO;
using System.Xml;
using System.Collections;
using System.Security.Cryptography;

enum HashKey
{
	MD5Hash,
	Filename,
	Artist,
	Album,
	Title
}

namespace Music
{
	public class Library : Hashtable
	{
		public void Add(Track trk)
		{
			if(base.ContainsKey(trk[HashKey.MD5Hash]))
				base[trk[HashKey.MD5Hash]] = trk;
			else
				base.Add(trk[HashKey.MD5Hash], trk);
		}
		
		public void Save(string filename)
		{
			IDictionaryEnumerator en;
			XmlTextWriter tw = null;
			
			try
			{
			 	tw = new XmlTextWriter(filename, null);
				tw.Formatting = Formatting.Indented;

				tw.WriteStartDocument();
				tw.WriteStartElement("library");
			
				foreach(Track trk in base.Values)
				{
					tw.WriteStartElement("track");
				
					en = trk.GetEnumerator();
				
					while(en.MoveNext())
   						tw.WriteElementString(en.Key.ToString(), en.Value.ToString());

					tw.WriteEndElement();
				}
			
				tw.WriteEndElement();
				tw.WriteEndDocument();			
				tw.Flush();
			}
			catch(Exception ex)
			{
				Console.WriteLine("\n{0}\n{1}\n", ex.Message, ex.StackTrace);
			}
			finally
			{
				tw.Close();
			}
		}
		
		public void Open(string filename)
		{
			Track trk = null;
			XmlTextReader reader;
			
			try
			{
				reader = new XmlTextReader(filename);
			}
			catch(System.Exception ex)
   			{
				Console.WriteLine("\n{0}\n{1}\n", ex.Message, ex.StackTrace);
				return;
    		}
					
			while(reader.Read() != false)
  			{
  				if(reader.NodeType != XmlNodeType.Whitespace)
					Console.WriteLine(reader.Depth);
			}
		}
		
		/*
		public void Debug()
		{
			foreach(Track trk in base.Values)
			{
				Console.WriteLine(trk[HashKey.MD5Hash]);
				trk.Debug();
			}
		}
		*/
	}
	
	public class Track : Hashtable
	{
		override public void Add(object key, object value)
		{
			if(base.ContainsKey(key))
				base[key] = value;
			else
				base.Add(key, value);
			
			if((HashKey)key == HashKey.Filename)
				ComputeHash();
		}
		
		private bool ComputeHash()
		{
			if(!base.ContainsKey(HashKey.Filename))
				return false;
				
   			string hash = "";
   			FileStream strm = null;
   			MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            
			try
   			{
    			strm = new FileStream((string)base[HashKey.Filename], FileMode.Open);
	   			hash = System.BitConverter.ToString(md5.ComputeHash(strm));
    			hash = hash.Replace("-", "");
    			base[HashKey.MD5Hash] = hash;
   				return true;
   			}
   			catch(System.Exception ex)
   			{
				Console.WriteLine("\n{0}\n{1}\n", ex.Message, ex.StackTrace);
				return false;
    		}
    		finally
    		{
    			strm.Close();
    		}
		}
		
		/*
		public void Debug()
		{
			IDictionaryEnumerator en = base.GetEnumerator();

			while (en.MoveNext())
   				Console.WriteLine(en.Key + " => " + en.Value);
		}
		*/
	}
	
	public class LibraryParser
	{
		private Library       lib;
		private Track         trk;
		private Stack         tags;
		private XmlTextReader reader;
		
		public LibraryParser(Library l)
		{
			lib = l;
			tags = new Stack();
		}
		
		public bool Parse(string filename)
		{
			try
			{
				reader = new XmlTextReader(filename);
			}
			catch(Exception ex)
			{
				Console.WriteLine("\n{0}\n{1}\n", ex.Message, ex.StackTrace);
				return false;
			}
			
			while(reader.Read() != false)
  			{
  				switch(reader.NodeType)
  				{
  					case XmlNodeType.Element:
  						OpenTag();
  						break;
  					
  					case XmlNodeType.EndElement:
  						CloseTag();
  						break;
  				}
			}
			
			return true;
		}
		
		private void OpenTag()
		{
			Console.WriteLine("Pushed {0}", reader.Name);
			tags.Push(reader.Name);
		}
		
		private bool CloseTag()
		{
			Console.WriteLine("Popped {0}", reader.Name);
			tags.Pop();
				
			return true;
		}
		
		private bool ReadStr()
		{
			return true;
		}
	}
	
	class MainClass
	{
		public static void Main(string[] args)
		{
			/*
			Library lib = new Library();
			
			Track trk  = new Track();
			
			trk.Add(HashKey.Filename, "/home/kyle/Desktop/Music/Bartenstein.ogg");
			trk.Add(HashKey.Artist,   "The Velvet Teen");
			trk.Add(HashKey.Album,    "Elysium");
			trk.Add(HashKey.Title,    "Chimera Obscurant");
		
			lib.Add(trk);

			//lib.Debug();
			
			lib.Save("library.xml");		
			
			lib.Open("library.xml");
			*/
			
			Library lib = new Library();
			LibraryParser parser = new LibraryParser(lib);
			parser.Parse("library.xml");
		}
	}
}