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