rendered paste bodyusing 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");
}
}
}