--- trunk/libxmltv/Core/XMLTVSource.cs 2013/03/08 04:01:25 46 +++ trunk/libxmltv/Core/XMLTVSource.cs 2013/03/09 11:28:41 77 @@ -4,32 +4,72 @@ using System.Text; using libxmltv.Interfaces; using System.Diagnostics; +using System.Xml.Linq; +using System.Reflection; namespace libxmltv.Core { [Serializable] - internal class XMLTVSource : IXMLTVSource, IDisposable, ICloneable + internal class XMLTVSource : XMLTVBase, IXMLTVSource, IDisposable//, ICloneable { + private Dictionary entries = new Dictionary(); - internal static void CreateInstance(XMLTVRuntimeInstance xmltv) - { - using (XMLTVSource g = new XMLTVSource(xmltv)) { g.instance.Source = (IXMLTVSource)g.Clone(); } + //internal static void CreateInstance(XMLTVRuntimeInstance xmltv) + //{ + // using (XMLTVSource g = new XMLTVSource(xmltv)) { g.instance.Source = (IXMLTVSource)g.Clone(); } + //} + + //private XMLTVRuntimeInstance instance; + //protected XMLTVSource(string sourcename, string generatorname, string generatorurl) + //{ + // this.SourceName = sourcename; + // this.GeneratorName = generatorname; + // this.GeneratorUrl = generatorurl; + //} + public XMLTVSource() + : base(null, XMLTVConstants.ROOT_ELEMENT) + { + this.SourceName = string.Empty; + this.GeneratorName = string.Empty; + this.GeneratorUrl = string.Empty; } - - private XMLTVRuntimeInstance instance; - protected XMLTVSource(string sourcename, string generatorname, string generatorurl) + public XMLTVSource(XMLTVRuntimeInstance instance) : base(instance, XMLTVConstants.ROOT_ELEMENT) { + xmltv_logger.Verbose.Debug.WriteLine("Creating Instance of XMLTVSource"); + Create(); + xmltv_logger.Verbose.Debug.WriteLine("Created Instance of XMLTVSource '{0}'", SourceName); + UpdateInstance(); } - protected XMLTVSource(XMLTVRuntimeInstance xmltv) + + private void UpdateInstance() { - xmltv_logger.Log.Verbose.Debug.WriteLine("Creating Instance of XMLTVSource"); - //IXMLTV_PARSER _xmltv; - //if (!Internals.VerifyInstance(xmltv, out _xmltv)) { return; } - //XMLTV_PARSER = _xmltv; - instance = xmltv; - Create(); + bool found_field = false; + var instance_type = this.GetInstance().GetType(); + var fields = instance_type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + foreach (var field in fields) + { + if (field.FieldType == typeof(IXMLTVSource)) + { + found_field = true; + try + { + xmltv_logger.Verbose.Debug.WriteLine("Updating instance with source information: {0}", this.ToString()); + field.SetValue(this.GetInstance(), this); + break; + } + catch (Exception ex) + { + xmltv_logger.Verbose.Error.WriteLine("Unable to update instance with source information."); + xmltv_logger.Verbose.Error.WriteLine(ex.ToString()); + } + } + } + if (!found_field) + { + xmltv_logger.Verbose.Error.WriteLine("Unable to update instance with source information."); + } } - + #region IXMLTVSource //private IXMLTV_PARSER XMLTV_PARSER { get; set; } public string SourceName { get; private set; } @@ -39,13 +79,13 @@ private void Create() { - var doc = instance.XmlDoc; + var doc = XDocument.Parse(this.GetInstance().XmlDoc); Debug.Assert(doc.Root.Name == XMLTVConstants.ROOT_ELEMENT, string.Format("Expected Root Element: '{0}' but read: '{1}'", XMLTVConstants.ROOT_ELEMENT, doc.Root.Name)); - //xmltv_logger.Log.Verbose.Debug.WriteLine("\tRoot: {0}", doc.Root.Name); + //xmltv_logger.Verbose.Debug.WriteLine("\tRoot: {0}", doc.Root.Name); var attributes = doc.Root.Attributes().ToList(); foreach (var attribute in attributes) { - //xmltv_logger.Log.Verbose.Debug.WriteLine("\t{0}: {1}", attribute.Name, attribute.Value); + xmltv_logger.Verbose.Debug.WriteLine("\t{0}: {1}", attribute.Name, attribute.Value); entries.Add(attribute.Name.ToString(), attribute.Value); } @@ -64,9 +104,9 @@ //throw new NotImplementedException(); } - public object Clone() - { - return new XMLTVSource(this.SourceName, this.GeneratorName, this.GeneratorUrl); - } + //public object Clone() + //{ + // return new XMLTVSource(this.SourceName, this.GeneratorName, this.GeneratorUrl); + //} } }