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

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

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

revision 22 by william, Thu Mar 7 10:20:50 2013 UTC revision 126 by william, Sun Mar 10 20:19:33 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.IO;
8    using System.Reflection;
9    using System.Globalization;
10    using System.Windows.Forms;
11    
12  namespace libxmltv.Core  namespace libxmltv.Core
13  {  {
# Line 11  namespace libxmltv.Core Line 16  namespace libxmltv.Core
16      /// </summary>      /// </summary>
17      public static class XMLTV      public static class XMLTV
18      {      {
19          static XMLTV() { XMLTV_LOGGER.Initialize(); }          static XMLTV()
20          public static object CreateLoader(string xml_file)          {
21          {                        xmltv_logger.Initialize();
22              XMLTV_LOADER loader = new XMLTV_LOADER(xml_file);              if (instance == null)
23              return loader;              {
24                    instance = new XMLTV<IXMLTVRuntimeInstance, XMLTVRuntimeInstance>();
25                }
26            }
27    
28            #region public members
29            #region save data
30            public static void Save(string file)
31            {
32                if (!Serialize(file))
33                {
34                    MessageBox.Show("Failed to save data - check log", "Failed to save data", MessageBoxButtons.OK, MessageBoxIcon.Error);
35                    return;
36                }
37                MessageBox.Show("Successfully saved data", "Successfully saved data", MessageBoxButtons.OK, MessageBoxIcon.Information);
38            }
39            public static void Save(Stream stream)
40            {
41                if (!Serialize(stream))
42                {
43                    MessageBox.Show("Failed to save data - check log", "Failed to save data", MessageBoxButtons.OK, MessageBoxIcon.Error);
44                    return;
45                }
46                MessageBox.Show("Successfully saved data", "Successfully saved data", MessageBoxButtons.OK, MessageBoxIcon.Information);
47            }
48            #endregion
49            #region load data
50            public static void Load(string file) { Load(file, null); }
51            public static void Load(string file, EventHandler<EventArgs> handler)
52            {
53                if (!DeSerialize(file, handler))
54                {
55                    MessageBox.Show("Failed to load data - check log", "Failed to load data", MessageBoxButtons.OK, MessageBoxIcon.Error);
56                    return;
57                }
58                MessageBox.Show("Successfully loaded data", "Successfully loaded data", MessageBoxButtons.OK, MessageBoxIcon.Information);
59                OnCreatedInstance();
60    
61            }
62            public static void Load(Stream stream) { Load(stream, null); }
63            public static void Load(Stream stream, EventHandler<EventArgs> handler)
64            {
65                if (!DeSerialize(stream, handler))
66                {
67                    MessageBox.Show("Failed to load data - check log", "Failed to load data", MessageBoxButtons.OK, MessageBoxIcon.Error);
68                    return;
69                }
70                MessageBox.Show("Successfully loaded data", "Successfully loaded data", MessageBoxButtons.OK, MessageBoxIcon.Information);
71                OnCreatedInstance();
72            }
73            #endregion
74            #region Create/Destroy
75            public static void Create(params object[] args) { CreateInstance(args); }
76            public static void Destroy() { DestroyInstance(); }
77            #endregion
78    
79            #region Get Data
80            public static IXMLTVSource GetSource()
81            {
82                var gInstance = GetInstance();
83                var list = gInstance.Source;
84                return list;
85            }
86            public static List<IXMLTVChannel> GetChannels()
87            {
88                var gInstance = GetInstance();
89               var list = gInstance.Channels;
90                return list;
91            }
92            public static List<IXMLTVProgram> GetPrograms()
93            {
94                var gInstance = GetInstance();
95                var list = gInstance.Programs;
96                return list;
97            }
98    
99            public static object CreateDataSourceFromObject(object data)
100            {
101                if (data == null) { throw new ArgumentNullException("data", "cannot be null"); }
102                //BindingSource source = new BindingSource();
103    
104                IDataSourceBindable binder = (data as IDataSourceBindable);
105                if (binder == null) { throw new InvalidCastException(string.Format("Cannot cast: '{0}' to '{1}'", data.GetType().Name, typeof(IDataSourceBindable).Name)); }
106                object bindable = binder.CreateBindableDataSource();
107                //source.DataSource = bindable;
108                //return source;
109                return bindable;
110            }
111    
112            public static void CreateFilterFromDataSource(ref object source, params string[] args)
113            {
114                if (source == null) { throw new ArgumentNullException("source", "cannot be null"); }
115                if (args == null) { throw new ArgumentNullException("args", "cannot be null"); }
116                IDataSourceFilterable filter = (source as IDataSourceFilterable);
117                if (filter == null) { throw new InvalidCastException(string.Format("Cannot cast: '{0}' to '{1}'", source.GetType().Name, typeof(IDataSourceFilterable).Name)); }
118                filter.Filter(ref source,args);            
119            }
120            public static void CreateSorterFromDataSource(ref object source, params string[] args)
121            {
122                if (source == null) { throw new ArgumentNullException("source", "cannot be null"); }
123                if (args == null) { throw new ArgumentNullException("args", "cannot be null"); }
124                IDataSourceSortable sorter = (source as IDataSourceSortable);
125                if (sorter == null) { throw new InvalidCastException(string.Format("Cannot cast: '{0}' to '{1}'", source.GetType().Name, typeof(IDataSourceSortable).Name)); }
126                sorter.Sort(ref source, args);            
127            }
128            #endregion
129            #endregion
130    
131    
132            static IXMLTV<IXMLTVRuntimeInstance, XMLTVRuntimeInstance> instance;
133            internal static IXMLTVRuntimeInstance GetInstance() { return instance.GetInstance(); }
134            internal static void CreateInstance(params object[] args) { instance = new XMLTV<IXMLTVRuntimeInstance, XMLTVRuntimeInstance>(args); }
135    
136            internal static void CreateFromInstance(object raw_instance, EventHandler<EventArgs> handler)
137            {
138                instance = new XMLTV<IXMLTVRuntimeInstance, XMLTVRuntimeInstance>(raw_instance, handler);
139                //OnCreatedInstance();
140            }
141    
142            internal static void OnCreatedInstance() { if (OnInstanceCreated != null) { OnInstanceCreated.Invoke(null, new EventArgs()); } }
143    
144            #region IXMLTVSerializer<IXMLTVRuntimeInstance> members
145            internal static bool Serialize(string file) { return instance.Serialize(file); }
146            internal static bool Serialize(Stream stream) { return instance.Serialize(stream); }
147            internal static bool DeSerialize(string file, EventHandler<EventArgs> handler)
148            {
149                bool status;
150                var gInstance = instance.DeSerialize(file, out status);            
151                CreateFromInstance(gInstance, handler);
152                return status;
153          }          }
154          public static object CreateParser(object xmltv)          internal static bool DeSerialize(Stream stream, EventHandler<EventArgs> handler)
155          {          {
156              XMLTV_PARSER parser = new XMLTV_PARSER(xmltv);              bool status;
157              return parser;              var gInstance = instance.DeSerialize(stream, out status);
158                CreateFromInstance(gInstance, handler);
159                return status;
160          }          }
161            #endregion
162            internal static void DestroyInstance() { instance.DestroyInstance(); }
163    
164            internal static EventHandler<EventArgs> OnInstanceCreated
165            {
166                get { return instance.OnInstanceCreated; }
167                set { instance.OnInstanceCreated = value; }
168            }
169    
170          
171      }      }
172    
173        internal class XMLTV<INTERFACE, CLASS> : IDestroyInstance, IXMLTV<INTERFACE, CLASS> where CLASS : class,INTERFACE,new()
174        {
175            public XMLTV()
176            {
177                instance = new CLASS();
178            }
179            public XMLTV(object raw_instance, EventHandler<EventArgs> handler)
180            {
181                instance = (CLASS)Convert.ChangeType(raw_instance, typeof(CLASS));
182                if (instance != null)
183                {
184                    IRuntimeInstanceLoader<CLASS> loader = (instance as IRuntimeInstanceLoader<CLASS>);
185                    if (loader != null)
186                    {
187                        SetOnInstanceCreated(handler);
188                        instance = loader.LoadFromInstance(instance);
189                    }
190                }
191            }
192            public XMLTV(params object[] args)
193            {
194                
195                BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
196                CultureInfo culture = CultureInfo.CurrentCulture;
197                try
198                {
199                    object raw_instance = Activator.CreateInstance(typeof(CLASS), flags, null, args, culture);
200                    instance = (CLASS)Convert.ChangeType(raw_instance, typeof(CLASS));
201                }
202                catch (Exception ex)
203                {
204                    xmltv_logger.Error.WriteLine(ex.ToString());
205    
206                    StringBuilder parameter_builder = new StringBuilder();
207                    foreach (object arg in args)
208                    {
209                        Type type = arg.GetType();
210                        parameter_builder.AppendFormat("({0}), ", type.FullName);
211                    }
212    
213                    string type_parameters = parameter_builder.ToString().TrimEnd(new char[] { ',', ' ' });
214                    throw new Exception(string.Format("Unable to create instance of: '{0}' with parameters: '{1}'", typeof(CLASS).Name, type_parameters), ex);
215                }
216            }
217    
218            private CLASS instance;
219            #region IXMLTV<T> members
220            public IXMLTVSerializer<CLASS> CreateSerializer()
221            {
222                // we must serialize on the CLASS type, using the INTERFACE type is syntatically incorrect
223                ISerializer<CLASS> class_serializer = (instance as ISerializer<CLASS>);
224                if (class_serializer != null)
225                {
226                    return class_serializer.Serializer;
227                }
228                else
229                {
230                    return new XMLTVSerializer<CLASS>(instance);
231                }
232            }
233            public INTERFACE GetInstance()
234            {
235                return (INTERFACE)instance;
236            }
237            public void SetInstance(INTERFACE gInstance)
238            {
239                this.instance = gInstance as CLASS;
240            }
241            #endregion
242    
243            #region IXMLTVSerializer<INTERFACE> members
244            public bool Serialize(string file) { return CreateSerializer().Serialize(file); }
245            public bool Serialize(Stream stream) { return CreateSerializer().Serialize(stream); }
246            public INTERFACE DeSerialize(string file, out bool status) { return CreateSerializer().DeSerialize(file, out status); }
247            public INTERFACE DeSerialize(Stream stream, out bool status) { return CreateSerializer().DeSerialize(stream, out status); }
248            #endregion
249            public void DestroyInstance()
250            {
251                IDestroyInstance destoyer = (instance as IDestroyInstance);
252                if (destoyer != null)
253                {
254                    destoyer.DestroyInstance();
255                }
256                else
257                {
258                    xmltv_logger.Error.WriteLine("Unable to call DestroyInstance() on type: '{0}'", instance.GetType().Name);
259                }            
260            }
261            private void SetOnInstanceCreated(EventHandler<EventArgs> event_instance)
262            {
263                ISetCreatedInstanceEvent setter = (instance as ISetCreatedInstanceEvent);
264                if (setter != null) { setter.SetOnInstanceCreated(event_instance); }
265            }
266            private EventHandler<EventArgs> GetOnInstanceCreated()
267            {
268                IGetCreatedInstanceEvent getter = (instance as IGetCreatedInstanceEvent);
269                if (getter != null) { return getter.GetOnInstanceCreated(); }
270                return null;
271            }
272            public EventHandler<EventArgs> OnInstanceCreated
273            {
274                get { return GetOnInstanceCreated(); }
275                set { SetOnInstanceCreated(value); }
276            }
277        }
278    
279  }  }
280    
281    

Legend:
Removed from v.22  
changed lines
  Added in v.126

  ViewVC Help
Powered by ViewVC 1.1.22