ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/xmltv_parser/trunk/libxmltv/Core/XMLTVInstance.cs
(Generate patch)

Comparing trunk/libxmltv/Core/XMLTVInstance.cs (file contents):
Revision 55 by william, Fri Mar 8 10:19:32 2013 UTC vs.
Revision 56 by william, Fri Mar 8 12:05:33 2013 UTC

# Line 6 | Line 6 | 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, IXMLTVRuntimeInstance, ISerializer<XMLTVRuntimeInstance>, IGetCreatedInstanceEvent, ISetCreatedInstanceEvent, IDestroyInstance
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));
# Line 36 | Line 49 | namespace libxmltv.Core
49          //internal XMLTVInstance Instance { get; private set; }
50  
51          #region IXMLTV_LOADER members
52 <        public System.IO.FileInfo XmlFile { get; set; }
53 <        public string XmlDoc { get; set; }
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 <        public IXMLTVSource Source { get; set; }
59 <        public Dictionary<string, IXMLTVChannel> Channels { get; set; }
60 <        public Dictionary<int, IXMLTVProgram> Programs { get; set; }
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 <        public EventHandler<EventArgs> OnInstanceCreated { get; set; }
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  
# Line 85 | Line 105 | namespace libxmltv.Core
105                  }
106              }
107          }
108 +        private bool _IsAborting;
109          public bool IsAborting
110          {
111 <            get;
112 <            private set;
113 <        }        
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 >            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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines