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

Annotation of /trunk/libxmltv/Core/XMLTVInstance.cs

Parent Directory Parent Directory | Revision Log Revision Log


Revision 56 - (hide annotations) (download)
Fri Mar 8 12:05:33 2013 UTC (7 years, 6 months ago) by william
File size: 9698 byte(s)

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

  ViewVC Help
Powered by ViewVC 1.1.22