Parent Directory
|
Revision Log
|
Patch
--- trunk/libxmltv/Core/XMLTVProgram.cs 2013/03/09 11:06:39 74 +++ trunk/libxmltv/Core/XMLTVProgram.cs 2013/03/09 17:42:34 90 @@ -5,44 +5,73 @@ using libxmltv.Interfaces; using System.Xml.Linq; using System.Reflection; +using System.IO; +using System.Diagnostics; +using System.Globalization; namespace libxmltv.Core { [Serializable] internal class XMLTVProgram : XMLTVBase<XMLTVRuntimeInstance>, IXMLTVProgram { - public XMLTVProgram() : base(null,XMLTVConstants.PROGRAM_ELEMENT) + public XMLTVProgram() + : base(null, XMLTVConstants.Programs.RootElement) { - Id = 0; - Start = new DateTime(); - Stop = new DateTime(); - Channel = new XMLTVChannel(); - Title = string.Empty; - SubTitle = string.Empty; - Description = string.Empty; + InternalDictionaryAddKnownProperties(); + } public XMLTVProgram(XMLTVRuntimeInstance instance, XElement node) - : base(instance, XMLTVConstants.PROGRAM_ELEMENT) + : base(instance, XMLTVConstants.Programs.RootElement) { + InternalDictionaryAddKnownProperties(); + try { xmltv_logger.Verbose.Debug.WriteLine("Creating Instance of XMLTVProgram"); - // do the work here + Create(node); xmltv_logger.Verbose.Debug.WriteLine("Created Instance of XMLTVProgram"); - //UpdateInstance(); + UpdateInstance(); + } + catch (IOException ex) { Debug.WriteLine(ex.ToString()); } } #region IXMLTVProgram members - public int Id { get; set; } - public DateTime Start { get; set; } - public DateTime Stop { get; set; } - public IXMLTVChannel Channel { get; set; } - public string Title { get; set; } - public string SubTitle { get; set; } - public string Description { get; set; } + //public int Id { get; set; } + //public DateTime Start { get; set; } + //public DateTime Stop { get; set; } + //public IXMLTVChannel Channel { get; set; } + //public string Title { get; set; } + //public string SubTitle { get; set; } + //public string Description { get; set; } + + private void InternalDictionaryAddKnownProperties() + { + Properties = new PropertyDictionary(); + Properties.AddProperty("Id", 0); + Properties.AddProperty(XMLTVConstants.Programs.ProgramStart, new DateTime()); + Properties.AddProperty(XMLTVConstants.Programs.ProgramStop, new DateTime()); + Properties.AddProperty(XMLTVConstants.Programs.ProgramChannelId, string.Empty); + Properties.AddProperty(XMLTVConstants.Programs.ProgramTitle, string.Empty); + Properties.AddProperty(XMLTVConstants.Programs.ProgramSubTitle, string.Empty); + Properties.AddProperty(XMLTVConstants.Programs.ProgramDescription, string.Empty); + } + + #region Property Dictionary Support + public PropertyDictionary Properties { get; private set; } + #endregion + #endregion public override string ToString() { - return string.Format("{0}: {1} - {2} ({3}) ['{4}' <==> '{5}']", Id, Title, SubTitle, Channel.ToString(), Start.ToString("yyyy/MM/dd hh:mm tt"), Stop.ToString("yyyy/MM/dd hh:mm tt")); + return string.Format("{0}: {1} - {2} ({3}) ['{4}' <==> '{5}']", + Properties["Id"].ToString(), + Properties[(XMLTVConstants.Programs.ProgramTitle)].ToString(), + Properties[(XMLTVConstants.Programs.ProgramSubTitle)].ToString(), + Properties[(XMLTVConstants.Programs.ProgramChannelId)].ToString(), + ((DateTime) Properties[XMLTVConstants.Programs.ProgramStart]).ToString("yyyy/MM/dd hh:mm tt"), + ((DateTime) Properties[XMLTVConstants.Programs.ProgramStop]).ToString("yyyy/MM/dd hh:mm tt")); } + + + private void UpdateInstance() { bool found_field = false; @@ -50,16 +79,16 @@ var fields = instance_type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); foreach (var field in fields) { - if (field.FieldType == typeof(List<IXMLTVChannel>)) + if (field.FieldType == typeof(List<IXMLTVProgram>)) { found_field = true; try { - xmltv_logger.Verbose.Debug.WriteLine("Updating instance with program information: {0}", this.ToString()); - //field.SetValue(this.GetInstance(), new List<IXMLTVChannel>() { this }); - + var list = (List<IXMLTVProgram>)field.GetValue(this.GetInstance()); + Properties["Id"] = list.Count + 1; list.Add(this); + xmltv_logger.Verbose.Debug.WriteLine("Updating instance with program information: {0}", this.ToString()); field.SetValue(this.GetInstance(), list); break; } @@ -75,5 +104,214 @@ xmltv_logger.Verbose.Error.WriteLine("Unable to update instance with program information."); } } + + private void Create(XElement node) + { + //if (node.HasAttributes) + //{ + // var start = node.Attribute(XMLTVConstants.Programs.ProgramStart); + // this.Start = start == null ? new DateTime() : ParseDate(start.Value); + // if (!this.Start.Equals(new DateTime())) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_start: {0}", start); } + + // var stop = node.Attribute(XMLTVConstants.Programs.ProgramStop); + // this.Stop = stop == null ? new DateTime() : ParseDate(stop.Value); + // if (!this.Stop.Equals(new DateTime())) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_stop: {0}", stop); } + + // var channelid = node.Attribute(XMLTVConstants.Programs.ProgramChannelId); + // if (!string.IsNullOrEmpty(this.channelid)) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_channelid: {0}", channelid); } + // IXMLTVChannel channel = new XMLTVChannel(); + // string _channelid = channelid == null ? string.Empty : channelid.Value; + // this.Channel = this.GetInstance().Channels.Find(m => m.Id == _channelid); + // if (this.Channel == null) { this.Channel = new XMLTVChannel(); } + // if (!string.IsNullOrEmpty(_channelid)) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_channel: {0}", this.Channel.ToString()); } //} + //try + //{ + // var title = node.Descendants(XMLTVConstants.Programs.ProgramTitle).FirstOrDefault(); + // this.Title = title == null ? string.Empty : title.Value; + //} + //catch (Exception) { this.Title = string.Empty; } + //if (!string.IsNullOrEmpty(this.Title)) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_title: {0}", this.Title == string.Empty ? "empty" : this.Title); } + //try + //{ + // var subtitle = node.Descendants(XMLTVConstants.Programs.ProgramSubTitle).FirstOrDefault(); + // this.SubTitle = subtitle == null ? string.Empty : subtitle.Value; + //} + //catch (Exception) { this.SubTitle = string.Empty; } + //if (!string.IsNullOrEmpty(this.SubTitle)) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_subtitle: {0}", this.SubTitle == string.Empty ? "empty" : this.SubTitle); } + //try + //{ + // var description = node.Descendants(XMLTVConstants.Programs.ProgramDescription).FirstOrDefault(); + // this.Description = description == null ? string.Empty : description.Value; ; + //} + //catch (Exception) { this.Description = string.Empty; } + //if (!string.IsNullOrEmpty(this.Description)) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_description: {0}", this.Description == string.Empty ? "empty" : this.Description); } + + //ParseExtraData(node); + + var nodes = node.DescendantsAndSelf().ToList(); + foreach (var sub_node in nodes) + { + if (this.GetInstance().IsAborting) + { + break; + } + CreateHandlerForProgramMetaDataNode(sub_node); + } + } + private static DateTime ParseDate(string timeStamp) + { + DateTime dt = new DateTime(); + try + { + dt = DateTime.ParseExact(timeStamp, "yyyyMMddHHmmss zzzz", System.Globalization.CultureInfo.CurrentCulture); + } + catch (Exception ex) { throw ex; } + return dt; + } + + private void CreateHandlerForProgramMetaDataNode(XElement node) + { + + Type t = this.GetType(); + Assembly asm = t.Assembly; + var types = asm.GetTypes(); + var classes = types.ToList().FindAll( + m => + m.DeclaringType == t && + m.IsClass && + !m.IsSealed + ); + classes.TrimExcess(); + + object raw_instance = null; + BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; + CultureInfo culture = CultureInfo.CurrentCulture; + Type handler_type = null; + foreach (var type in classes) + { + if (type.BaseType != null && type.BaseType == typeof(XMLTVBase<XMLTVProgram>)) + { + var iface = type.GetInterface("IXMLTVHandler", true); + if (iface != null) + { + var handler_prop = type.GetProperty("Handler"); + if (handler_prop != null) + { + var ctors = type.GetConstructors(flags); + bool has_default_ctor = false; + foreach (var ctor in ctors) { if (ctor.GetParameters().Count() == 0) { has_default_ctor = true; } } + if (!has_default_ctor) { continue; } + raw_instance = Activator.CreateInstance(type, flags, null, new object[0], culture); + if (raw_instance != null) + { + object handler_value = handler_prop.GetValue(raw_instance, null); + if (handler_value != null && handler_value.ToString() == node.Name.ToString()) + { + handler_type = type; + break; + } + } + } + } + } + } + if (handler_type == null) + { + StringBuilder node_builder = new StringBuilder(); + node_builder.AppendFormat("<{0} ", node.Name); + if (node.HasAttributes) { foreach (var attribute in node.Attributes()) { node_builder.AppendFormat("{0}=\"{1}\" ", attribute.Name, attribute.Value); } } + string node_text = string.Format("{0}>", node_builder.ToString().TrimEnd(new char[] { ' ' })); + xmltv_logger.Verbose.Warn.WriteLine("Ignoring unhandled extra meta-data: {0}", node_text); + } + else + { + raw_instance = Activator.CreateInstance(handler_type, flags, null, new object[] { this, node }, culture); + } + } + + + + #region sub-classes + #region program title + private class title : XMLTVBase<XMLTVProgram> + { + public title() : base(null, XMLTVConstants.Programs.ProgramTitle) { } + public title(XMLTVProgram instance, XElement node) + : base(instance, XMLTVConstants.Programs.ProgramTitle) + { + if(node == null){throw new NullReferenceException("The node instance was null");} + if (node.Value != null) + { + instance.Properties.AddProperty(XMLTVConstants.Programs.ProgramTitle, node.Value); + xmltv_logger.Verbose.Debug.WriteLine("\tprogram_title: {0}", node.Value); + } + } + } + #endregion + #region program stop/start/channel (programme) + private class programme : XMLTVBase<XMLTVProgram> + { + public programme() : base(null, XMLTVConstants.Programs.RootElement) { } + public programme(XMLTVProgram instance, XElement node) + : base(instance, XMLTVConstants.Programs.RootElement) + { + if (node == null) { throw new NullReferenceException("The node instance was null"); } + if (node.HasAttributes) + { + var start = node.Attribute(XMLTVConstants.Programs.ProgramStart); + var t_start = start == null ? new DateTime() : ParseDate(start.Value); + if (!t_start.Equals(new DateTime())) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_start: {0}", start); } + instance.Properties.AddProperty(XMLTVConstants.Programs.ProgramStart, t_start); + + var stop = node.Attribute(XMLTVConstants.Programs.ProgramStop); + var t_stop = stop == null ? new DateTime() : ParseDate(stop.Value); + if (!t_stop.Equals(new DateTime())) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_stop: {0}", stop); } + instance.Properties.AddProperty(XMLTVConstants.Programs.ProgramStop, t_stop); + + var channelid = node.Attribute(XMLTVConstants.Programs.ProgramChannelId); + if (channelid != null) + { + if (!string.IsNullOrEmpty(channelid.Value)) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_channelid: {0}", channelid.Value); } + instance.Properties.AddProperty(XMLTVConstants.Programs.ProgramChannelId, channelid.Value); + } + + } + } + } + #endregion + + #region sub title + private class subtitle : XMLTVBase<XMLTVProgram> + { + public subtitle() : base(null, XMLTVConstants.Programs.ProgramSubTitle) { } + public subtitle(XMLTVProgram instance, XElement node) + : base(instance, XMLTVConstants.Programs.ProgramSubTitle) + { + if (node == null) { throw new NullReferenceException("The node instance was null"); } + if (node.Value != null) + { + instance.Properties.AddProperty(XMLTVConstants.Programs.ProgramSubTitle, node.Value); + xmltv_logger.Verbose.Debug.WriteLine("\tprogram_subtitle: {0}", node.Value); + } + } + } + #endregion + #region sub title + private class description : XMLTVBase<XMLTVProgram> + { + public description() : base(null, XMLTVConstants.Programs.ProgramDescription) { } + public description(XMLTVProgram instance, XElement node) + : base(instance, XMLTVConstants.Programs.ProgramDescription) + { + if (node == null) { throw new NullReferenceException("The node instance was null"); } + if (node.Value != null) + { + instance.Properties.AddProperty(XMLTVConstants.Programs.ProgramDescription, node.Value); + xmltv_logger.Verbose.Debug.WriteLine("\tprogram_description: {0}", node.Value); + } + } + } + #endregion + #endregion } }
ViewVC Help | |
Powered by ViewVC 1.1.22 |