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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 125 - (hide annotations) (download)
Sun Mar 10 19:44:49 2013 UTC (7 years, 7 months ago) by william
File size: 12080 byte(s)

1 william 22 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 50 using System.IO;
8 william 52 using System.Reflection;
9     using System.Globalization;
10 william 118 using System.Windows.Forms;
11 william 22
12     namespace libxmltv.Core
13     {
14     /// <summary>
15     /// Main class: Creates the XMLTV Loader
16     /// </summary>
17     public static class XMLTV
18     {
19 william 56 static XMLTV()
20     {
21     xmltv_logger.Initialize();
22     if (instance == null)
23     {
24     instance = new XMLTV<IXMLTVRuntimeInstance, XMLTVRuntimeInstance>();
25     }
26     }
27 william 23
28 william 118 #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 william 120
99     public static BindingSource CreateBindingSourceForData(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 william 125 if (binder == null) { throw new InvalidCastException(string.Format("Cannot cast: '{0}' to '{1}'", data.GetType().Name, typeof(IDataSourceBindable).Name)); }
106 william 120 object bindable = binder.CreateBindableDataSource();
107     source.DataSource = bindable;
108     return source;
109     }
110    
111 william 125 public static BindingSource CreateFilterFromDataSource(object source, params string[] args)
112     {
113     if (source == null) { throw new ArgumentNullException("source", "cannot be null"); }
114     if (args == null) { throw new ArgumentNullException("args", "cannot be null"); }
115     IDataSourceFilterable filter = (source as IDataSourceFilterable);
116     if (filter == null) { throw new InvalidCastException(string.Format("Cannot cast: '{0}' to '{1}'", source.GetType().Name, typeof(IDataSourceFilterable).Name)); }
117     object filtered = filter.Filter(source,args);
118     BindingSource bound = new BindingSource();
119     bound.DataSource = filtered;
120     return bound;
121     }
122     public static BindingSource CreateSorterFromDataSource(object source, params string[] args)
123     {
124     if (source == null) { throw new ArgumentNullException("source", "cannot be null"); }
125     if (args == null) { throw new ArgumentNullException("args", "cannot be null"); }
126     IDataSourceSortable sorter = (source as IDataSourceSortable);
127     if (sorter == null) { throw new InvalidCastException(string.Format("Cannot cast: '{0}' to '{1}'", source.GetType().Name, typeof(IDataSourceSortable).Name)); }
128     object sorted = sorter.Sort(source, args);
129     BindingSource bound = new BindingSource();
130     bound.DataSource = sorted;
131     return bound;
132     }
133 william 118 #endregion
134     #endregion
135    
136    
137 william 50 static IXMLTV<IXMLTVRuntimeInstance, XMLTVRuntimeInstance> instance;
138 william 117 internal static IXMLTVRuntimeInstance GetInstance() { return instance.GetInstance(); }
139     internal static void CreateInstance(params object[] args) { instance = new XMLTV<IXMLTVRuntimeInstance, XMLTVRuntimeInstance>(args); }
140 william 50
141 william 118 internal static void CreateFromInstance(object raw_instance, EventHandler<EventArgs> handler)
142     {
143     instance = new XMLTV<IXMLTVRuntimeInstance, XMLTVRuntimeInstance>(raw_instance, handler);
144     //OnCreatedInstance();
145 william 56 }
146 william 50
147 william 118 internal static void OnCreatedInstance() { if (OnInstanceCreated != null) { OnInstanceCreated.Invoke(null, new EventArgs()); } }
148    
149 william 50 #region IXMLTVSerializer<IXMLTVRuntimeInstance> members
150 william 117 internal static bool Serialize(string file) { return instance.Serialize(file); }
151     internal static bool Serialize(Stream stream) { return instance.Serialize(stream); }
152 william 118 internal static bool DeSerialize(string file, EventHandler<EventArgs> handler)
153 william 117 {
154     bool status;
155 william 118 var gInstance = instance.DeSerialize(file, out status);
156     CreateFromInstance(gInstance, handler);
157 william 117 return status;
158     }
159 william 118 internal static bool DeSerialize(Stream stream, EventHandler<EventArgs> handler)
160 william 117 {
161     bool status;
162     var gInstance = instance.DeSerialize(stream, out status);
163 william 118 CreateFromInstance(gInstance, handler);
164 william 117 return status;
165     }
166 william 50 #endregion
167 william 117 internal static void DestroyInstance() { instance.DestroyInstance(); }
168 william 54
169 william 117 internal static EventHandler<EventArgs> OnInstanceCreated
170 william 54 {
171     get { return instance.OnInstanceCreated; }
172     set { instance.OnInstanceCreated = value; }
173     }
174 william 117
175 william 118
176 william 22 }
177 william 50
178 william 56 internal class XMLTV<INTERFACE, CLASS> : IDestroyInstance, IXMLTV<INTERFACE, CLASS> where CLASS : class,INTERFACE,new()
179 william 50 {
180 william 56 public XMLTV()
181     {
182     instance = new CLASS();
183     }
184     public XMLTV(object raw_instance, EventHandler<EventArgs> handler)
185     {
186     instance = (CLASS)Convert.ChangeType(raw_instance, typeof(CLASS));
187     if (instance != null)
188     {
189     IRuntimeInstanceLoader<CLASS> loader = (instance as IRuntimeInstanceLoader<CLASS>);
190     if (loader != null)
191     {
192     SetOnInstanceCreated(handler);
193     instance = loader.LoadFromInstance(instance);
194     }
195     }
196     }
197 william 52 public XMLTV(params object[] args)
198 william 50 {
199 william 53
200     BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
201 william 52 CultureInfo culture = CultureInfo.CurrentCulture;
202     try
203 william 50 {
204 william 52 object raw_instance = Activator.CreateInstance(typeof(CLASS), flags, null, args, culture);
205     instance = (CLASS)Convert.ChangeType(raw_instance, typeof(CLASS));
206     }
207     catch (Exception ex)
208     {
209 william 55 xmltv_logger.Error.WriteLine(ex.ToString());
210 william 52
211     StringBuilder parameter_builder = new StringBuilder();
212     foreach (object arg in args)
213 william 50 {
214 william 52 Type type = arg.GetType();
215     parameter_builder.AppendFormat("({0}), ", type.FullName);
216 william 50 }
217 william 52
218     string type_parameters = parameter_builder.ToString().TrimEnd(new char[] { ',', ' ' });
219     throw new Exception(string.Format("Unable to create instance of: '{0}' with parameters: '{1}'", typeof(CLASS).Name, type_parameters), ex);
220 william 50 }
221     }
222    
223     private CLASS instance;
224     #region IXMLTV<T> members
225 william 51 public IXMLTVSerializer<CLASS> CreateSerializer()
226     {
227     // we must serialize on the CLASS type, using the INTERFACE type is syntatically incorrect
228     ISerializer<CLASS> class_serializer = (instance as ISerializer<CLASS>);
229     if (class_serializer != null)
230     {
231     return class_serializer.Serializer;
232     }
233     else
234     {
235     return new XMLTVSerializer<CLASS>(instance);
236     }
237     }
238 william 50 public INTERFACE GetInstance()
239     {
240     return (INTERFACE)instance;
241     }
242 william 117 public void SetInstance(INTERFACE gInstance)
243     {
244     this.instance = gInstance as CLASS;
245     }
246 william 50 #endregion
247    
248     #region IXMLTVSerializer<INTERFACE> members
249     public bool Serialize(string file) { return CreateSerializer().Serialize(file); }
250     public bool Serialize(Stream stream) { return CreateSerializer().Serialize(stream); }
251     public INTERFACE DeSerialize(string file, out bool status) { return CreateSerializer().DeSerialize(file, out status); }
252     public INTERFACE DeSerialize(Stream stream, out bool status) { return CreateSerializer().DeSerialize(stream, out status); }
253     #endregion
254 william 54 public void DestroyInstance()
255     {
256     IDestroyInstance destoyer = (instance as IDestroyInstance);
257     if (destoyer != null)
258     {
259     destoyer.DestroyInstance();
260     }
261     else
262     {
263 william 55 xmltv_logger.Error.WriteLine("Unable to call DestroyInstance() on type: '{0}'", instance.GetType().Name);
264 william 54 }
265     }
266     private void SetOnInstanceCreated(EventHandler<EventArgs> event_instance)
267     {
268     ISetCreatedInstanceEvent setter = (instance as ISetCreatedInstanceEvent);
269     if (setter != null) { setter.SetOnInstanceCreated(event_instance); }
270     }
271     private EventHandler<EventArgs> GetOnInstanceCreated()
272     {
273     IGetCreatedInstanceEvent getter = (instance as IGetCreatedInstanceEvent);
274     if (getter != null) { return getter.GetOnInstanceCreated(); }
275     return null;
276     }
277     public EventHandler<EventArgs> OnInstanceCreated
278     {
279     get { return GetOnInstanceCreated(); }
280     set { SetOnInstanceCreated(value); }
281     }
282 william 50 }
283    
284 william 22 }
285 william 46
286 william 49

  ViewVC Help
Powered by ViewVC 1.1.22