4 |
using System.Text; |
using System.Text; |
5 |
using libxmltv.Interfaces; |
using libxmltv.Interfaces; |
6 |
using System.ComponentModel; |
using System.ComponentModel; |
7 |
|
using System.Windows.Forms; |
8 |
|
using System.Threading; |
9 |
|
|
10 |
namespace libxmltv.Core |
namespace libxmltv.Core |
11 |
{ |
{ |
12 |
internal class XMLTVRuntimeInstance : MarshalByRefObject, IXMLTVRuntimeInstance |
[Serializable] |
13 |
|
internal class XMLTVRuntimeInstance : MarshalByRefObject, IXMLTVRuntimeInstance, ISerializer<XMLTVRuntimeInstance>, IGetCreatedInstanceEvent, ISetCreatedInstanceEvent, IDestroyInstance |
14 |
{ |
{ |
15 |
public XMLTVRuntimeInstance(string xmlfile) : this(xmlfile, null) { } |
Thread worker; |
16 |
public XMLTVRuntimeInstance(string xmlfile, EventHandler<CancelEventArgs> t) { CreateInstance(xmlfile,t); } |
public XMLTVRuntimeInstance(string xmlfile) |
|
private void CreateInstance(string xmlfile, EventHandler<CancelEventArgs> t) |
|
17 |
{ |
{ |
18 |
CancelEvent = t; |
worker = new Thread(new ParameterizedThreadStart(CreateInstance)); |
19 |
using (Instance = new XMLTVInstance(xmlfile, this)) |
//CreateInstance(xmlfile); |
20 |
|
worker.Start(xmlfile); |
21 |
|
} |
22 |
|
//public XMLTVRuntimeInstance(string xmlfile) : this(xmlfile, null) { } |
23 |
|
//public XMLTVRuntimeInstance(string xmlfile, EventHandler<CancelEventArgs> t) { CreateInstance(xmlfile,t); } |
24 |
|
private void CreateInstance(object xmlfile) |
25 |
|
{ |
26 |
|
//CancelEvent = t; |
27 |
|
using (XMLTVInstance instance = new XMLTVInstance(xmlfile.ToString(), this)) |
28 |
{ |
{ |
29 |
|
if (OnInstanceCreated != null) |
30 |
|
{ |
31 |
|
OnInstanceCreated.Invoke(this,new EventArgs()); |
32 |
|
} |
33 |
} |
} |
34 |
} |
} |
35 |
|
|
36 |
internal XMLTVInstance Instance { get; private set; } |
//internal XMLTVInstance Instance { get; private set; } |
37 |
|
|
38 |
#region IXMLTV_LOADER members |
#region IXMLTV_LOADER members |
39 |
public System.IO.FileInfo XmlFile { get; set; } |
public System.IO.FileInfo XmlFile { get; set; } |
40 |
public System.Xml.Linq.XDocument XmlDoc { get; set; } |
public string XmlDoc { get; set; } |
41 |
#endregion |
#endregion |
42 |
#region IXMLTV_PARSER Members |
#region IXMLTV_PARSER Members |
43 |
public IXMLTVSource Source { get; set; } |
public IXMLTVSource Source { get; set; } |
45 |
public Dictionary<int, IXMLTVProgram> Programs { get; set; } |
public Dictionary<int, IXMLTVProgram> Programs { get; set; } |
46 |
#endregion |
#endregion |
47 |
|
|
48 |
//public void Dispose() |
public EventHandler<EventArgs> OnInstanceCreated { get; set; } |
49 |
//{ |
public EventHandler<EventArgs> GetOnInstanceCreated() { return OnInstanceCreated; } |
50 |
// IsDisposing = true; |
public void SetOnInstanceCreated(EventHandler<EventArgs> event_instance) { OnInstanceCreated = event_instance; } |
|
// //throw new NotImplementedException(); |
|
|
//} |
|
|
//public bool IsDisposing { get; private set; } |
|
|
|
|
|
|
|
|
private event EventHandler<CancelEventArgs> CancelEvent = null; |
|
51 |
|
|
52 |
public bool IsAborting |
public IXMLTVSerializer<XMLTVRuntimeInstance> Serializer |
53 |
|
{ |
54 |
|
get |
55 |
|
{ |
56 |
|
///* 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. |
57 |
|
// Most subscribers will be of type: System.Windows.Forms which is not marked as serializable and will fail to serialize. */ |
58 |
|
//if (CancelEvent != null) { CancelEvent = null; } |
59 |
|
return new XMLTVSerializer<XMLTVRuntimeInstance>(this); |
60 |
|
} |
61 |
|
} |
62 |
|
public void DestroyInstance() |
63 |
{ |
{ |
64 |
get |
xmltv_logger.Log.Debug.WriteLine("Destoying Instance of: '{0}'", this.GetType().Name); |
65 |
|
this.IsAborting = true; |
66 |
|
if (worker == null) |
67 |
|
{ |
68 |
|
xmltv_logger.Log.Debug.WriteLine("Unable to destroy instance of: '{0}' - worker thread is null", this.GetType().Name); |
69 |
|
return; |
70 |
|
} |
71 |
|
else |
72 |
{ |
{ |
73 |
if (CancelEvent != null) |
if (worker.IsAlive) |
74 |
{ |
{ |
75 |
CancelEventArgs e = new CancelEventArgs(); |
xmltv_logger.Log.Verbose.Debug.WriteLine("Requesting Instance to Abort..."); |
76 |
CancelEvent.Invoke(this, e); |
while (worker.IsAlive) |
|
if (e.Cancel) |
|
77 |
{ |
{ |
78 |
xmltv_logger.Log.Verbose.Debug.WriteLine("Detected Instance abort event..."); |
worker.Abort(); |
79 |
|
Application.DoEvents(); |
80 |
} |
} |
|
return e.Cancel; |
|
81 |
} |
} |
82 |
return false; |
else |
83 |
|
{ |
84 |
|
xmltv_logger.Log.Debug.WriteLine("Instance of: '{0}'- already destroyed.", this.GetType().Name); |
85 |
|
} |
86 |
} |
} |
87 |
} |
} |
88 |
|
public bool IsAborting |
89 |
|
{ |
90 |
|
get; |
91 |
|
private set; |
92 |
|
} |
93 |
} |
} |
94 |
|
|
95 |
internal class XMLTVInstance : IDisposable |
internal class XMLTVInstance : IDisposable |