Develop and Download Open Source Software

Browse Subversion Repository

Contents of /branches/ProcessWatchImpl/Bagel/Repeater.cs

Parent Directory Parent Directory | Revision Log Revision Log


Revision 44 - (show annotations) (download)
Tue Dec 15 16:20:54 2009 UTC (14 years, 3 months ago) by netseed
File size: 7306 byte(s)


1 using System;
2 using System.Threading;
3 using System.Windows.Threading;
4 using Toast.NicoNico;
5 using Toast.Twitter;
6 using dbg = SeedCreate.CommonLibrary.DebugHelper;
7 using Toast.ProcessControl;
8
9 namespace Toast.IsolationLayer
10 {
11 public sealed class Repeater:IDisposable
12 {
13 private EventHandler<ReceieverStatusChangedEventArgs> receieverStatucChangedEventInvoker;
14 private EventHandler<DetectProgramStartEventArgs> programStartedEventInvoker;
15 private EventHandler<TwitterWriteFailedEventArgs> twitterWriteFailedEventInvoker;
16
17 private EventHandler detectProcessStartedEventInvoker;
18 private EventHandler detectProcessTerminatedEventInvoker;
19
20
21 private OriginalAlertApiReceiever receiver;
22 private TweetController writer;
23 private ManualResetEvent threadCatcher;
24 private Dispatcher dispatcher;
25 private MessageFormatter formatter;
26 private ProcessWatcher watcher;
27
28 private readonly object syncRoot = new object();
29
30
31 //surrogated event.
32 public event EventHandler<ReceieverStatusChangedEventArgs> ReceieverStatusChanged;
33
34 //surrogated event.
35 public event EventHandler<DetectProgramStartEventArgs> ProgramStarted;
36
37 //converted from exception event.
38 public event EventHandler<TwitterWriteFailedEventArgs> TwitterWriteFailed;
39
40 public event EventHandler DetectWatchProcessStarted;
41
42 public event EventHandler DetectWatchProcessTerminated;
43
44 //Ui side thread incoming.
45 public Repeater(Dispatcher dispatcher)
46 {
47 if (dispatcher == null)
48 {
49 throw new ArgumentNullException("dispatcher");
50 }
51
52 dispatcher = dispatcher;
53
54 receieverStatucChangedEventInvoker = new EventHandler<ReceieverStatusChangedEventArgs>(OnReceieverStatusChanged);
55 programStartedEventInvoker = new EventHandler<DetectProgramStartEventArgs>(OnProgramStarted);
56 twitterWriteFailedEventInvoker = new EventHandler<TwitterWriteFailedEventArgs>(OnTwitterWriteFailed);
57
58 detectProcessStartedEventInvoker = new EventHandler(OnDetectProcessStarted);
59 detectProcessTerminatedEventInvoker = new EventHandler(OnDetectProcessTerminated);
60 }
61
62 //Ui side thread incoming.
63 public void Start(uint smileId, string twitterId, string password,string format)
64 {
65 Start(smileId, twitterId, password, format, string.Empty, false);
66 }
67
68 public void Start(uint smileId, string twitterId, string password, string format, string processName, bool requireWatch)
69 {
70 lock (syncRoot)
71 {
72 if (receiver == null)
73 {
74 if (requireWatch && processName == null)
75 {
76 throw new ArgumentNullException("processName");
77 }
78
79 if (twitterId == null)
80 {
81 throw new ArgumentNullException("twitterId");
82 }
83
84 if (password == null)
85 {
86 throw new ArgumentNullException("password");
87 }
88
89 receiver = new OriginalAlertApiReceiever(smileId);
90 receiver.ProgramStarted += new EventHandler<DetectProgramStartEventArgs>(Receiver__ProgramStarted);
91 receiver.StatusChanged += new EventHandler<ReceieverStatusChangedEventArgs>(Receiver__StatusChanged);
92
93 writer = new TweetController(twitterId, password);
94
95 threadCatcher = new ManualResetEvent(false);
96
97 formatter = new MessageFormatter(format == null ? string.Empty : format);
98
99 #if !DEBUG_TESTING
100 if (!requireWatch)
101 {
102 receiver.Start();
103 }
104 else
105 {
106 watcher = new ProcessWatcher();
107 watcher.DetectProcessStart += new EventHandler(watcher_DetectProcessStart);
108 watcher.DetectProcessTerminate += new EventHandler(watcher_DetectProcessTerminate);
109
110 watcher.Start(4, new TimeSpan(0, 0, 5), processName);
111 }
112 #else
113 receiver.DebugStart();
114 #endif
115
116 }
117 else
118 {
119 throw new InvalidOperationException("Already running");
120 }
121 }
122
123
124 }
125
126
127
128 //Ui side thread incoming.
129 public void Stop()
130 {
131 lock (syncRoot)
132 {
133 if (receiver != null)
134 {
135 if (watcher != null)
136 {
137 watcher.Dispose();
138 watcher = null;
139 }
140
141
142 receiver.Dispose();
143 receiver = null;
144
145 writer = null;
146 threadCatcher.Close();
147 threadCatcher = null;
148 }
149 }
150 }
151
152 //Ui side thread incoming.
153 public bool IsRunning
154 {
155 get
156 {
157 lock (syncRoot)
158 {
159 return receiver != null;
160 }
161 }
162 }
163
164
165
166 //Logic side threads incoming.
167 void watcher_DetectProcessTerminate(object sender, EventArgs e)
168 {
169 receiver.Start();
170 dispatcher.Invoke(detectProcessStartedEventInvoker, this, e);
171 }
172
173
174 //Logic side threads incoming.
175 void watcher_DetectProcessStart(object sender, EventArgs e)
176 {
177 receiver.Stop();
178 dispatcher.Invoke(detectProcessTerminatedEventInvoker, this, e);
179 }
180
181
182 //Logic side threads incoming.
183 private void Receiver__StatusChanged(object sender, ReceieverStatusChangedEventArgs e)
184 {
185 dispatcher.Invoke(receieverStatucChangedEventInvoker, this, e);
186 }
187
188 //Logic side threads incoming.
189 private void Receiver__ProgramStarted(object sender, DetectProgramStartEventArgs e)
190 {
191 try
192 {
193 writer.PostMessage(formatter.BuildMessage(e.TargetProgram));
194
195 //Asynchronous
196 dispatcher.BeginInvoke(programStartedEventInvoker, this, e);
197 }
198 catch (Exception ex)
199 {
200
201 //Independent thread stop llogical process.
202 ThreadPool.QueueUserWorkItem(new WaitCallback(AutomatedStop),ex);
203
204
205 try
206 {
207 Thread.CurrentThread.Abort();
208 }
209 catch (ThreadInterruptedException)
210 {
211 dbg::TinyDebugWriter.WriteLine("Event process Thread interrupted");
212 }
213 }
214
215 }
216
217 //Embodiment of the stop llogical process.
218 private void AutomatedStop(object dummy)
219 {
220 Stop();
221
222 dispatcher.BeginInvoke(twitterWriteFailedEventInvoker, this,
223 new TwitterWriteFailedEventArgs("Some error occured", (Exception)dummy));
224 }
225
226
227 //Ui side thread outgoing.
228 private void OnReceieverStatusChanged(object sender, ReceieverStatusChangedEventArgs e)
229 {
230 if (ReceieverStatusChanged != null)
231 {
232 ReceieverStatusChanged(sender, e);
233 }
234 }
235
236 //Ui side thread outgoing.
237 private void OnProgramStarted(object sender, DetectProgramStartEventArgs e)
238 {
239 if (ProgramStarted != null)
240 {
241 ProgramStarted(sender, e);
242 }
243 }
244
245 //Ui side thread outoging.
246 private void OnTwitterWriteFailed(object sender, TwitterWriteFailedEventArgs e)
247 {
248 if (TwitterWriteFailed != null)
249 {
250 TwitterWriteFailed(sender, e);
251 }
252 }
253
254 //Ui side thread outgoing.
255 private void OnDetectProcessStarted(object sender, EventArgs e)
256 {
257 if (DetectWatchProcessStarted != null)
258 {
259 DetectWatchProcessStarted(sender, e);
260 }
261 }
262
263 //Ui side thread outgoing.
264 private void OnDetectProcessTerminated(object sender, EventArgs e)
265 {
266 if (DetectWatchProcessTerminated != null)
267 {
268 DetectWatchProcessTerminated(sender, e);
269 }
270 }
271
272
273
274 #region IDisposable メンバ
275
276 //Must called by UI side thread.
277 public void Dispose()
278 {
279 lock (syncRoot)
280 {
281 if (watcher != null)
282 {
283 watcher.Dispose();
284 }
285
286 if (receiver != null)
287 {
288 receiver.Dispose();
289 }
290
291 if (threadCatcher != null)
292 {
293 threadCatcher.Close();
294 }
295 }
296 }
297
298 #endregion
299 }
300 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26