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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 58 - (show annotations) (download)
Fri Mar 8 12:20:50 2013 UTC (7 years, 5 months ago) by william
File size: 10206 byte(s)

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 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
14 {
15 [Serializable]
16 internal class XMLTVRuntimeInstance : MarshalByRefObject,
17 IXMLTVRuntimeInstance,
18 ISerializer<XMLTVRuntimeInstance>,
19 IGetCreatedInstanceEvent,
20 ISetCreatedInstanceEvent,
21 IDestroyInstance,
22 IRuntimeInstanceLoader<XMLTVRuntimeInstance>
23 {
24 [NonSerialized]
25 Thread worker;
26 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
52 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 #endregion
57 #region IXMLTV_PARSER Members
58 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 #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 : IDisposable
220 {
221 public XMLTVInstance(string xmlfile, XMLTVRuntimeInstance instance)
222 {
223 CreateLoader(xmlfile, instance);
224 CreateParser(instance);
225 }
226
227 private void CreateLoader(string xml_file, XMLTVRuntimeInstance instance)
228 {
229 //XMLTVLoader loader = new XMLTVLoader(xml_file, instance);
230 XMLTVLoader.CreateInstance(xml_file, instance);
231 }
232 private void CreateParser(XMLTVRuntimeInstance instance)
233 {
234 //XMLTVParser parser = new XMLTVParser(instance);
235 XMLTVParser.CreateInstance(instance);
236 }
237
238 public void Dispose()
239 {
240 //throw new NotImplementedException();
241 }
242 }
243 }

  ViewVC Help
Powered by ViewVC 1.1.22