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

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

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

revision 36 by william, Fri Mar 8 02:13:59 2013 UTC revision 58 by william, Fri Mar 8 12:20:50 2013 UTC
# Line 3  using System.Collections.Generic; Line 3  using System.Collections.Generic;
3  using System.Linq;  using System.Linq;
4  using System.Text;  using System.Text;
5  using libxmltv.Interfaces;  using libxmltv.Interfaces;
6    using System.ComponentModel;
7    using System.Windows.Forms;
8    using System.Threading;
9    using System.Reflection;
10    using System.Globalization;
11    using System.Diagnostics;
12    
13  namespace libxmltv.Core  namespace libxmltv.Core
14  {  {
15      internal class XMLTVRuntimeInstance : MarshalByRefObject, IXMLTVRuntimeInstance      [Serializable]
16        internal class XMLTVRuntimeInstance : MarshalByRefObject,
17            IXMLTVRuntimeInstance,
18            ISerializer<XMLTVRuntimeInstance>,
19            IGetCreatedInstanceEvent,
20            ISetCreatedInstanceEvent,
21            IDestroyInstance,
22            IRuntimeInstanceLoader<XMLTVRuntimeInstance>
23      {      {
24          public XMLTVRuntimeInstance(string xmlfile) { CreateInstance(xmlfile); }          [NonSerialized]
25          private void CreateInstance(string xmlfile) { Instance = new XMLTVInstance(xmlfile, this); }          Thread worker;
26          internal XMLTVInstance Instance { get; private set; }          public XMLTVRuntimeInstance()
27            {
28            }
29            public XMLTVRuntimeInstance(string xmlfile)
30            {
31                worker = new Thread(new ParameterizedThreadStart(CreateInstance));
32                //CreateInstance(xmlfile);
33                worker.Start(xmlfile);
34            }
35            //public XMLTVRuntimeInstance(string xmlfile) : this(xmlfile, null) { }
36            //public XMLTVRuntimeInstance(string xmlfile, EventHandler<CancelEventArgs> t) { CreateInstance(xmlfile,t); }
37            private void CreateInstance(object xmlfile)
38            {            
39                //CancelEvent = t;
40                using (XMLTVInstance instance = new XMLTVInstance(xmlfile.ToString(), this))
41                {
42                    if (OnInstanceCreated != null)
43                    {
44                        OnInstanceCreated.Invoke(this,new EventArgs());
45                    }
46                }
47            }
48    
49            //internal XMLTVInstance Instance { get; private set; }
50    
51          #region IXMLTV_LOADER members          #region IXMLTV_LOADER members
52          public System.IO.FileInfo XmlFile { get; set; }          private System.IO.FileInfo _XmlFile;
53          public System.Xml.Linq.XDocument XmlDoc { get; set; }          public System.IO.FileInfo XmlFile { get { return _XmlFile; } set { _XmlFile = value; } }
54            private string _XmlDoc;
55            public string XmlDoc { get { return _XmlDoc; } set { _XmlDoc = value; } }
56          #endregion          #endregion
57          #region IXMLTV_PARSER Members          #region IXMLTV_PARSER Members
58          public IXMLTVSource Source { get; set; }          private IXMLTVSource _Source;
59          public Dictionary<string, IXMLTVChannel> Channels { get; set; }          public IXMLTVSource Source { get { return _Source; } set { _Source = value; } }
60          public Dictionary<int, IXMLTVProgram> Programs { get; set; }          private Dictionary<string, IXMLTVChannel> _Channels;
61            public Dictionary<string, IXMLTVChannel> Channels { get { return _Channels; } set { _Channels = value; } }
62            private Dictionary<int, IXMLTVProgram> _Programs;
63            public Dictionary<int, IXMLTVProgram> Programs { get { return _Programs; } set { _Programs = value; } }
64          #endregion            #endregion  
65        
66            [NonSerialized]
67            private EventHandler<EventArgs> _OnInstanceCreated;
68            public EventHandler<EventArgs> OnInstanceCreated { get { return _OnInstanceCreated; } set { _OnInstanceCreated = value; } }
69            public EventHandler<EventArgs> GetOnInstanceCreated() { return OnInstanceCreated; }
70            public void SetOnInstanceCreated(EventHandler<EventArgs> event_instance) { OnInstanceCreated = event_instance; }
71    
72            public IXMLTVSerializer<XMLTVRuntimeInstance> Serializer
73            {
74                get
75                {
76                    ///* We have to set CancelEvent to null, before returning a new instance of the serializer otherwise all subscribers to the event will have to be marked as serializeable.
77                    //   Most subscribers will be of type: System.Windows.Forms which is not marked as serializable and will fail to serialize. */
78                    //if (CancelEvent != null) { CancelEvent = null; }
79                    return new XMLTVSerializer<XMLTVRuntimeInstance>(this);
80                }
81            }
82            public void DestroyInstance()
83            {
84                xmltv_logger.Debug.WriteLine("Destoying Instance of: '{0}'", this.GetType().Name);
85                this.IsAborting = true;
86                if (worker == null)
87                {
88                    xmltv_logger.Debug.WriteLine("Unable to destroy instance of: '{0}' - worker thread is null", this.GetType().Name);
89                    return;
90                }
91                else
92                {
93                    if (worker.IsAlive)
94                    {
95                        xmltv_logger.Verbose.Debug.WriteLine("Requesting Instance to Abort...");
96                        while (worker.IsAlive)
97                        {
98                            worker.Abort();
99                            Application.DoEvents();
100                        }
101                    }
102                    else
103                    {
104                        xmltv_logger.Debug.WriteLine("Instance of: '{0}'- already destroyed.", this.GetType().Name);
105                    }
106                }
107            }
108            private bool _IsAborting;
109            public bool IsAborting
110            {
111                get { return _IsAborting; }
112                private set { _IsAborting = value; }
113            }
114            public XMLTVRuntimeInstance LoadFromInstance(XMLTVRuntimeInstance instance)
115            {
116                if (instance == null)
117                {
118                    throw new NullReferenceException("Failed to load from instance because the instance is null.");
119                }
120                
121                if (instance.Source != null)
122                {
123                    xmltv_logger.Debug.WriteLine("Loading from instance...");
124                    xmltv_logger.Info.WriteLine("Source Loaded: '{0}' Created by '{1}' - original source file: '{2}'", instance.Source.SourceName, instance.Source.GeneratorName, instance.XmlFile.FullName);
125                }
126                else
127                {
128                    xmltv_logger.Error.WriteLine("The Instance's Source Property is null.");
129                    throw new NullReferenceException("The Instance's Source Property is null.");
130                }
131                if (instance.Channels != null)
132                {
133                    xmltv_logger.Info.WriteLine("Source Loaded: '{0}' Channels from source '{1}'", instance.Channels.Count, instance.Source.SourceName);
134                }
135                else
136                {
137                    xmltv_logger.Error.WriteLine("The Instance's Channels Property is null.");
138                    throw new NullReferenceException("The Instance's Channels Property is null.");
139                }
140                if (instance.Programs != null)
141                {
142                    xmltv_logger.Info.WriteLine("Source Loaded: '{0}' Programs from source '{1}", instance.Programs.Count, instance.Source.SourceName);
143                }
144                else
145                {
146                    xmltv_logger.Error.WriteLine("The Instance's Programs Property is null.");
147                    throw new NullReferenceException("The Instance's Programs Property is null.");
148                }
149                CloneFromInstance(ref instance);
150                //if (OnInstanceCreated != null)
151                //{
152                //    OnInstanceCreated.Invoke(this, new EventArgs());
153                //}
154                return instance;
155            }
156            private void CloneFromInstance(ref XMLTVRuntimeInstance instance)
157            {
158                //if (!instance.GetType().IsSerializable)
159                //{
160                //    throw new ArgumentException("Loaded instance is not serializable.", "instance");
161                //}
162                //if (Object.ReferenceEquals(instance, null))
163                //{
164                //    throw new NullReferenceException("Failed to load from instance because the instance is null.");
165                //}
166                BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
167                CultureInfo culture = CultureInfo.CurrentCulture;
168                Type t = typeof(XMLTVRuntimeInstance);
169                foreach (var field in t.GetFields(flags))
170                {
171                    try
172                    {
173                        if (field.IsNotSerialized)
174                        {
175                            continue;
176                        }
177                        
178                        var f = instance.GetType().GetField(field.Name, flags);
179                        
180                        var v = f.GetValue(instance);
181                        field.SetValue(this, v);
182                    }
183                    catch (Exception ex)
184                    {
185                        throw new Exception(string.Format("Unable to copy value for field: '{0}' from instance", field.Name), ex);
186                    }
187                }
188                foreach (var property in t.GetProperties(flags))
189                {
190                    try
191                    {
192                        //if (property.Attributes.HasFlag(FieldAttributes.NotSerialized))
193                        //{
194                        //    continue;
195                        //}
196                        var f = instance.GetType().GetProperty(property.Name);
197                        object value = null;
198    
199                        try
200                        {
201                            value = f.GetValue(instance, null);
202                        }
203                        catch (ArgumentException ex) { if (ex.Message == "Property get method not found.") { Debug.WriteLine(ex.ToString()); } else { throw ex; } }
204                        try
205                        {
206                            property.SetValue(this, value, null);
207                        }
208                        catch (ArgumentException ex) { if (ex.Message == "Property set method not found.") { Debug.WriteLine(ex.ToString()); } else { throw ex; } }
209    
210                    }
211                    catch (Exception ex)
212                    {
213                        throw new Exception(string.Format("Unable to copy value for property: '{0}' from instance", property.Name), ex);
214                    }
215                }
216            }
217      }      }
218    
219      internal class XMLTVInstance      internal class XMLTVInstance : IDisposable
220      {      {
221          public XMLTVInstance(string xmlfile, XMLTVRuntimeInstance instance)          public XMLTVInstance(string xmlfile, XMLTVRuntimeInstance instance)
222          {          {
# Line 33  namespace libxmltv.Core Line 226  namespace libxmltv.Core
226    
227          private void CreateLoader(string xml_file, XMLTVRuntimeInstance instance)          private void CreateLoader(string xml_file, XMLTVRuntimeInstance instance)
228          {          {
229              XMLTVLoader loader = new XMLTVLoader(xml_file, instance);              //XMLTVLoader loader = new XMLTVLoader(xml_file, instance);
230                XMLTVLoader.CreateInstance(xml_file, instance);
231          }          }
232          private void CreateParser(XMLTVRuntimeInstance instance)          private void CreateParser(XMLTVRuntimeInstance instance)
233          {          {
234              XMLTVParser parser = new XMLTVParser(instance);              //XMLTVParser parser = new XMLTVParser(instance);
235                XMLTVParser.CreateInstance(instance);
236            }
237    
238            public void Dispose()
239            {
240                //throw new NotImplementedException();
241          }          }
242      }      }
243  }  }

Legend:
Removed from v.36  
changed lines
  Added in v.58

  ViewVC Help
Powered by ViewVC 1.1.22