--- trunk/libxmltv/Core/XMLTVRuntimeInstance.cs 2013/03/09 12:23:27 81 +++ trunk/libxmltv/Core/XMLTVRuntimeInstance.cs 2013/03/10 15:37:16 111 @@ -55,6 +55,7 @@ this.XmlFile_FullName = string.Empty; this.XmlDoc = string.Empty; this.OnInstanceCreated = null; + this.ExtraEntries = new List(); } #region IXMLTVRuntimeInstance members @@ -75,6 +76,9 @@ public List Channels { get { return _Channels; } set { _Channels = value; } } private List _Programs; public List Programs { get { return _Programs; } set { _Programs = value; } } + + private List _ExtraEntries; + public List ExtraEntries { get { return _ExtraEntries; } set { _ExtraEntries = value; } } #endregion #region IOnInstanceCreated members [NonSerialized] @@ -337,6 +341,7 @@ var ctors = type.GetConstructors(flags); bool has_default_ctor = false; foreach (var ctor in ctors) { if (ctor.GetParameters().Count() == 0) { has_default_ctor = true; } } + ctors = null; if (!has_default_ctor) { continue; } raw_instance = Activator.CreateInstance(type, flags, null, new object[0], culture); if (raw_instance != null) @@ -345,25 +350,45 @@ if (handler_value != null && handler_value.ToString() == root_name) { handler_type = type; + handler_value = null; + raw_instance = null; + handler_prop = null; + iface = null; break; } + handler_value = null; } + raw_instance = null; } + handler_prop = null; } + iface = null; } } - if (handler_type == null) { throw new Exception("Unable to find a compatible handler to parse document root."); } + asm = null; + types = null; + if (handler_type == null) + { + StringBuilder node_builder = new StringBuilder(); + node_builder.AppendFormat("<{0} ", root.Name); + if (root.HasAttributes) { foreach (var attribute in root.Attributes()) { node_builder.AppendFormat("{0}=\"{1}\" ", attribute.Name, attribute.Value); } } + string node_text = string.Format("{0}>", node_builder.ToString().TrimEnd(new char[] { ' ' })); + throw new Exception(string.Format("Unable to find a compatible handler to parse node: {0}", node_text)); + } xmltv_logger.Verbose.Debug.WriteLine("Created handler for root: '{0}'", root_name.ToString()); raw_instance = Activator.CreateInstance(handler_type, flags, null, new object[] { gInstance }, culture); + raw_instance = null; + flags = 0; + culture = null; } private bool CreateHandlerForNode(XElement node) { if (node == null) { throw new NullReferenceException("Node element is null"); } if (node.Name == null) { throw new NullReferenceException("Node element's Name is null"); } - var node_name = node.Name.ToString(); + //var node_name = node.Name.ToString(); - xmltv_logger.Verbose.Debug.WriteLine("Creating handler for node: '{0}'", node_name.ToString()); + xmltv_logger.Verbose.Debug.WriteLine("Creating handler for node: '{0}'", node.Name.ToString()); object raw_instance = null; BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; CultureInfo culture = CultureInfo.CurrentCulture; @@ -383,26 +408,79 @@ var ctors = type.GetConstructors(flags); bool has_default_ctor = false; foreach (var ctor in ctors) { if (ctor.GetParameters().Count() == 0) { has_default_ctor = true; } } + ctors = null; 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) + if (handler_value != null && handler_value.ToString() == node.Name.ToString()) { handler_type = type; + handler_value = null; + raw_instance = null; + handler_prop = null; + iface = null; break; } + handler_value = null; } + raw_instance = null; } + handler_prop = null; } + iface = null; + } + } + asm = null; + types = null; + if (handler_type == null) + { + try + { + raw_instance = Activator.CreateInstance(typeof(UnhandledNodeData), flags, null, new object[] { gInstance, node }, culture); + } + catch (Exception ex) { throw ex; } + + if (raw_instance == 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[] { ' ' })); + throw new Exception(string.Format("Unable to find a compatible handler to parse node: {0}", node_text)); } } - if (handler_type == null) { throw new Exception("Unable to find a compatible handler to parse document root."); } - xmltv_logger.Verbose.Debug.WriteLine("Created handler for node: '{0}'", node_name.ToString()); - raw_instance = Activator.CreateInstance(handler_type, flags, null, new object[] { gInstance, node }, culture); + else + { + xmltv_logger.Verbose.Debug.WriteLine("Created handler for node: '{0}'", node.Name.ToString()); + raw_instance = Activator.CreateInstance(handler_type, flags, null, new object[] { gInstance, node }, culture); + } + raw_instance = null; + flags = 0; + culture = null; + node = null; return true; } + #region UnhandledExtraMetaData + private class UnhandledNodeData : XMLTVBase + { + public UnhandledNodeData() : base(null, null) { } + public UnhandledNodeData(XMLTVRuntimeInstance instance, XElement node) + : base(instance, null) + { + if (node == null) { throw new NullReferenceException("The node instance was null"); } + xmltv_logger.Verbose.Debug.WriteLine("Parsng unhandled node data: {0}", node.Name.ToString()); + if (this.GetInstance() != null) + { + ExtraMetaData data = new ExtraMetaData(node); + instance.ExtraEntries.Add(data); + data = null; + } + node = null; + } + } + #endregion } }