/[xmltv_parser]/trunk/libxmltv/Core/XMLTVProgram.cs
ViewVC logotype

Diff of /trunk/libxmltv/Core/XMLTVProgram.cs

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 78 by william, Sat Mar 9 11:36:24 2013 UTC revision 86 by william, Sat Mar 9 13:51:58 2013 UTC
# Line 7  using System.Xml.Linq; Line 7  using System.Xml.Linq;
7  using System.Reflection;  using System.Reflection;
8  using System.IO;  using System.IO;
9  using System.Diagnostics;  using System.Diagnostics;
10    using System.Globalization;
11    
12  namespace libxmltv.Core  namespace libxmltv.Core
13  {  {
# Line 15  namespace libxmltv.Core Line 16  namespace libxmltv.Core
16      {      {
17          public XMLTVProgram() : base(null,XMLTVConstants.PROGRAM_ELEMENT)          public XMLTVProgram() : base(null,XMLTVConstants.PROGRAM_ELEMENT)
18          {          {
19              Id = 0;              InternalDictionaryAddKnownProperties();
20              Start = new DateTime();          
             Stop = new DateTime();  
             Channel = new XMLTVChannel();  
             Title = string.Empty;  
             SubTitle = string.Empty;  
             Description = string.Empty;  
21          }          }
22          public XMLTVProgram(XMLTVRuntimeInstance instance, XElement node)          public XMLTVProgram(XMLTVRuntimeInstance instance, XElement node)
23              : base(instance, XMLTVConstants.PROGRAM_ELEMENT)              : base(instance, XMLTVConstants.PROGRAM_ELEMENT)
24          {          {
25                InternalDictionaryAddKnownProperties();
26              try {              try {
27              xmltv_logger.Verbose.Debug.WriteLine("Creating Instance of XMLTVProgram");              xmltv_logger.Verbose.Debug.WriteLine("Creating Instance of XMLTVProgram");
28              Create(node);              Create(node);
# Line 35  namespace libxmltv.Core Line 32  namespace libxmltv.Core
32              catch (IOException ex) { Debug.WriteLine(ex.ToString()); }              catch (IOException ex) { Debug.WriteLine(ex.ToString()); }
33          }          }
34          #region IXMLTVProgram members          #region IXMLTVProgram members
35          public int Id { get; set; }          //public int Id { get; set; }
36          public DateTime Start { get; set; }          //public DateTime Start { get; set; }
37          public DateTime Stop { get; set; }          //public DateTime Stop { get; set; }
38          public IXMLTVChannel Channel { get; set; }          //public IXMLTVChannel Channel { get; set; }
39          public string Title { get; set; }          //public string Title { get; set; }
40          public string SubTitle { get; set; }          //public string SubTitle { get; set; }
41          public string Description { get; set; }          //public string Description { get; set; }
42    
43            private void InternalDictionaryAddKnownProperties()
44            {
45                Properties = new Dictionary<string, object>();
46                Properties.Add("Id", 0);
47                Properties.Add(XMLTVConstants.Programs.ProgramStart, new DateTime());
48                Properties.Add(XMLTVConstants.Programs.ProgramStop, new DateTime());
49                Properties.Add(XMLTVConstants.Programs.ProgramChannelId, string.Empty);
50                Properties.Add(XMLTVConstants.Programs.ProgramTitle, string.Empty);
51                Properties.Add(XMLTVConstants.Programs.ProgramSubTitle, string.Empty);
52                Properties.Add(XMLTVConstants.Programs.ProgramDescription, string.Empty);
53            }
54    
55            public Dictionary<string, object> Properties { get; private set; }
56    
57            private void InternalDictionaryTestOrThrow()
58            {
59                if (Properties == null) { throw new NullReferenceException("Properties collection has not been initialized."); }
60                if (Properties.Count == 0) { throw new IndexOutOfRangeException("Properties collection has 0 elements."); }
61            }
62            private void InternalProperyExistsOrThrow(string name)
63            {
64                InternalDictionaryTestOrThrow();
65                if (!Properties.ContainsKey(name)) { throw new KeyNotFoundException(string.Format("Property '{0}' does not exist", name)); }
66            }
67            public object GetProperty(string name)
68            {
69                InternalProperyExistsOrThrow(name);
70                return Properties[name];            
71            }
72            public void SetProperty(string name, object value)
73            {
74                InternalProperyExistsOrThrow(name);
75                Properties[name] = value;
76            }
77          #endregion          #endregion
78          public override string ToString()          public override string ToString()
79          {          {
80              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}']",
81                    GetProperty("Id").ToString(),
82                    GetProperty(XMLTVConstants.Programs.ProgramTitle).ToString(),
83                    GetProperty(XMLTVConstants.Programs.ProgramSubTitle), ToString(),
84                    GetProperty(XMLTVConstants.Programs.ProgramChannelId).ToString(),
85                    ((DateTime)GetProperty(XMLTVConstants.Programs.ProgramStart)).ToString("yyyy/MM/dd hh:mm tt"),
86                    ((DateTime)GetProperty(XMLTVConstants.Programs.ProgramStop)).ToString("yyyy/MM/dd hh:mm tt"));
87          }          }
88    
89    
90            
91    
92          private void UpdateInstance()          private void UpdateInstance()
93          {          {
94              bool found_field = false;              bool found_field = false;
# Line 62  namespace libxmltv.Core Line 103  namespace libxmltv.Core
103                      {                      {
104                                                    
105                          var list = (List<IXMLTVProgram>)field.GetValue(this.GetInstance());                          var list = (List<IXMLTVProgram>)field.GetValue(this.GetInstance());
106                          this.Id = list.Count + 1;                          this.SetProperty("Id", list.Count + 1);
107                          list.Add(this);                          list.Add(this);
108                          xmltv_logger.Verbose.Debug.WriteLine("Updating instance with program information: {0}", this.ToString());                          xmltv_logger.Verbose.Debug.WriteLine("Updating instance with program information: {0}", this.ToString());
109                          field.SetValue(this.GetInstance(), list);                          field.SetValue(this.GetInstance(), list);
# Line 83  namespace libxmltv.Core Line 124  namespace libxmltv.Core
124    
125          private void Create(XElement node)          private void Create(XElement node)
126          {          {
127              if (node.HasAttributes)              //if (node.HasAttributes)
128                //{
129                //    var start = node.Attribute(XMLTVConstants.Programs.ProgramStart);
130                //    this.Start = start == null ? new DateTime() : ParseDate(start.Value);
131                //    if (!this.Start.Equals(new DateTime())) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_start: {0}", start); }
132    
133                //    var stop = node.Attribute(XMLTVConstants.Programs.ProgramStop);
134                //    this.Stop = stop == null ? new DateTime() : ParseDate(stop.Value);
135                //    if (!this.Stop.Equals(new DateTime())) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_stop: {0}", stop); }
136    
137                //    var channelid = node.Attribute(XMLTVConstants.Programs.ProgramChannelId);
138                //    if (!string.IsNullOrEmpty(this.Description)) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_channelid: {0}", channelid); }
139                //    IXMLTVChannel channel = new XMLTVChannel();
140                //    string _channelid = channelid == null ? string.Empty : channelid.Value;
141                //    this.Channel = this.GetInstance().Channels.Find(m => m.Id == _channelid);
142                //    if (this.Channel == null) { this.Channel = new XMLTVChannel(); }
143                //    if (!string.IsNullOrEmpty(_channelid)) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_channel: {0}", this.Channel.ToString()); }            //}
144                //try
145                //{
146                //    var title = node.Descendants(XMLTVConstants.Programs.ProgramTitle).FirstOrDefault();
147                //    this.Title = title == null ? string.Empty : title.Value;
148                //}
149                //catch (Exception) { this.Title = string.Empty; }
150                //if (!string.IsNullOrEmpty(this.Title)) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_title: {0}", this.Title == string.Empty ? "empty" : this.Title); }
151                //try
152                //{
153                //    var subtitle = node.Descendants(XMLTVConstants.Programs.ProgramSubTitle).FirstOrDefault();
154                //    this.SubTitle = subtitle == null ? string.Empty : subtitle.Value;
155                //}
156                //catch (Exception) { this.SubTitle = string.Empty; }
157                //if (!string.IsNullOrEmpty(this.SubTitle)) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_subtitle: {0}", this.SubTitle == string.Empty ? "empty" : this.SubTitle); }
158                //try
159                //{
160                //    var description = node.Descendants(XMLTVConstants.Programs.ProgramDescription).FirstOrDefault();
161                //    this.Description = description == null ? string.Empty : description.Value; ;
162                //}
163                //catch (Exception) { this.Description = string.Empty; }
164                //if (!string.IsNullOrEmpty(this.Description)) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_description: {0}", this.Description == string.Empty ? "empty" : this.Description); }
165    
166                //ParseExtraData(node);
167    
168                var nodes = node.Elements().ToList();
169                foreach (var sub_node in nodes)
170              {              {
171                  var start = node.Attribute(XMLTVConstants.Programs.ProgramStart);                  if (this.GetInstance().IsAborting)
172                  this.Start = start == null ? new DateTime() : ParseDate(start.Value);                  {
173                  if (!this.Start.Equals(new DateTime())) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_start: {0}", start); }                      break;
174                    }
175                  var stop = node.Attribute(XMLTVConstants.Programs.ProgramStop);                  CreateHandlerForProgramMetaDataNode(sub_node);
                 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.Description)) { 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()); }  
176              }              }
177            }
178            private DateTime ParseDate(string timeStamp)
179            {
180                DateTime dt = new DateTime();
181              try              try
182              {              {
183                  var title = node.Descendants(XMLTVConstants.Programs.ProgramTitle).FirstOrDefault();                  dt = DateTime.ParseExact(timeStamp, "yyyyMMddHHmmss zzzz", System.Globalization.CultureInfo.CurrentCulture);
                 this.Title = title == null ? string.Empty : title.Value;  
184              }              }
185              catch (Exception) { this.Title = string.Empty; }              catch (Exception ex) { throw ex; }
186              if (!string.IsNullOrEmpty(this.Title)) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_title: {0}", this.Title == string.Empty ? "empty" : this.Title); }              return dt;
187              try          }
188    
189            private void CreateHandlerForProgramMetaDataNode(XElement node)
190            {
191                Type t = this.GetType();
192                Assembly asm = t.Assembly;
193                var types = asm.GetTypes();
194                var classes = types.ToList().FindAll(
195                    m =>
196                        m.DeclaringType == t &&
197                        m.IsClass &&
198                        !m.IsSealed
199                    );
200                classes.TrimExcess();
201    
202                object raw_instance = null;
203                BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
204                CultureInfo culture = CultureInfo.CurrentCulture;
205                Type handler_type = null;
206                foreach (var type in classes)
207              {              {
208                  var subtitle = node.Descendants(XMLTVConstants.Programs.ProgramSubTitle).FirstOrDefault();                  if (type.BaseType != null && type.BaseType == typeof(XMLTVBase<XMLTVProgram>))
209                  this.SubTitle = subtitle == null ? string.Empty : subtitle.Value;                  {
210                        var iface = type.GetInterface("IXMLTVHandler", true);
211                        if (iface != null)
212                        {
213                            var handler_prop = type.GetProperty("Handler");
214                            if (handler_prop != null)
215                            {
216                                var ctors = type.GetConstructors(flags);
217                                bool has_default_ctor = false;
218                                foreach (var ctor in ctors) { if (ctor.GetParameters().Count() == 0) { has_default_ctor = true; } }
219                                if (!has_default_ctor) { continue; }
220                                raw_instance = Activator.CreateInstance(type, flags, null, new object[0], culture);
221                                if (raw_instance != null)
222                                {
223                                    object handler_value = handler_prop.GetValue(raw_instance, null);
224                                    if (handler_value != null && handler_value.ToString() == node.Name.ToString())
225                                    {
226                                        handler_type = type;
227                                        break;
228                                    }
229                                }
230                            }
231                        }
232                    }
233              }              }
234              catch (Exception) { this.SubTitle = string.Empty; }              if (handler_type == null)
             if (!string.IsNullOrEmpty(this.SubTitle)) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_subtitle: {0}", this.SubTitle == string.Empty ? "empty" : this.SubTitle); }  
             try  
235              {              {
236                  var description = node.Descendants(XMLTVConstants.Programs.ProgramDescription).FirstOrDefault();                  StringBuilder node_builder = new StringBuilder();
237                  this.Description = description == null ? string.Empty : description.Value; ;                  node_builder.AppendFormat("<{0} ", node.Name);
238                    if (node.HasAttributes) { foreach (var attribute in node.Attributes()) { node_builder.AppendFormat("{0}=\"{1}\" ", attribute.Name, attribute.Value); } }
239                    string node_text = string.Format("{0}>", node_builder.ToString().TrimEnd(new char[] { ' ' }));
240                    xmltv_logger.Verbose.Warn.WriteLine("Ignoring unhandled extra meta-data: {0}", node_text);
241              }              }
242              catch (Exception) { this.Description = string.Empty; }              raw_instance = Activator.CreateInstance(handler_type, flags, null, new object[] { this, node }, culture);
             if (!string.IsNullOrEmpty(this.Description)) { xmltv_logger.Verbose.Debug.WriteLine("\tprogram_description: {0}", this.Description == string.Empty ? "empty" : this.Description); }  
   
             //entries.Add(program.Id, program);  
             //program_index++;  
             //progress = 100.0 * (program_index / program_count);  
             //xmltv_logger.ReportProgress(this, new Enterprise.Logging.ReportProgressEventArgs((int)progress));  
             //Application.DoEvents();  
243          }          }
244          private DateTime ParseDate(string timeStamp)  
245    
246    
247            #region sub-classes
248            private class title : XMLTVBase<XMLTVProgram>
249          {          {
250              DateTime dt = new DateTime();              public title() : base(null, XMLTVConstants.Programs.ProgramTitle) { }
251              try              public title(XMLTVProgram instance, XElement node)
252                    : base(instance, XMLTVConstants.Programs.ProgramTitle)
253              {              {
                 dt = DateTime.ParseExact(timeStamp, "yyyyMMddHHmmss zzzz", System.Globalization.CultureInfo.CurrentCulture);  
254              }              }
             catch (Exception ex) { throw ex; }  
             return dt;  
255          }          }
256            #endregion
257      }      }
258  }  }

Legend:
Removed from v.78  
changed lines
  Added in v.86

  ViewVC Help
Powered by ViewVC 1.1.22