/[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 55 by william, Fri Mar 8 10:19:32 2013 UTC revision 56 by william, Fri Mar 8 12:05:33 2013 UTC
# Line 6  using libxmltv.Interfaces; Line 6  using libxmltv.Interfaces;
6  using System.ComponentModel;  using System.ComponentModel;
7  using System.Windows.Forms;  using System.Windows.Forms;
8  using System.Threading;  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      [Serializable]      [Serializable]
16      internal class XMLTVRuntimeInstance : MarshalByRefObject, IXMLTVRuntimeInstance, ISerializer<XMLTVRuntimeInstance>, IGetCreatedInstanceEvent, ISetCreatedInstanceEvent, IDestroyInstance      internal class XMLTVRuntimeInstance : MarshalByRefObject,
17            IXMLTVRuntimeInstance,
18            ISerializer<XMLTVRuntimeInstance>,
19            IGetCreatedInstanceEvent,
20            ISetCreatedInstanceEvent,
21            IDestroyInstance,
22            IRuntimeInstanceLoader<XMLTVRuntimeInstance>
23      {      {
24            [NonSerialized]
25          Thread worker;          Thread worker;
26            public XMLTVRuntimeInstance()
27            {
28            }
29          public XMLTVRuntimeInstance(string xmlfile)          public XMLTVRuntimeInstance(string xmlfile)
30          {          {
31              worker = new Thread(new ParameterizedThreadStart(CreateInstance));              worker = new Thread(new ParameterizedThreadStart(CreateInstance));
# Line 36  namespace libxmltv.Core Line 49  namespace libxmltv.Core
49          //internal XMLTVInstance Instance { get; private set; }          //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 string 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          public EventHandler<EventArgs> OnInstanceCreated { get; set; }          [NonSerialized]
67            private EventHandler<EventArgs> _OnInstanceCreated;
68            public EventHandler<EventArgs> OnInstanceCreated { get { return _OnInstanceCreated; } set { _OnInstanceCreated = value; } }
69          public EventHandler<EventArgs> GetOnInstanceCreated() { return OnInstanceCreated; }          public EventHandler<EventArgs> GetOnInstanceCreated() { return OnInstanceCreated; }
70          public void SetOnInstanceCreated(EventHandler<EventArgs> event_instance) { OnInstanceCreated = event_instance; }          public void SetOnInstanceCreated(EventHandler<EventArgs> event_instance) { OnInstanceCreated = event_instance; }
71    
# Line 85  namespace libxmltv.Core Line 105  namespace libxmltv.Core
105                  }                  }
106              }              }
107          }          }
108            private bool _IsAborting;
109          public bool IsAborting          public bool IsAborting
110          {          {
111              get;              get { return _IsAborting; }
112              private set;              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      }      }
214    
215      internal class XMLTVInstance : IDisposable      internal class XMLTVInstance : IDisposable

Legend:
Removed from v.55  
changed lines
  Added in v.56

  ViewVC Help
Powered by ViewVC 1.1.22