comparison Pml/Channels/PassivePmlChannel.cs @ 0:3ab940a0c7a0

Initial commit
author Ivo Smits <Ivo@UCIS.nl>
date Tue, 11 Sep 2012 16:28:53 +0200
parents
children 327be9216006
comparison
equal deleted inserted replaced
-1:000000000000 0:3ab940a0c7a0
1 using System;
2 using UCIS.Pml;
3 using System.Collections.Generic;
4 using System.Threading;
5
6 namespace UCIS.Pml {
7 public abstract class PassivePmlChannel : IPmlChannel {
8 private bool _isOpen = true;
9
10 public virtual bool IsOpen { get { return _isOpen; } }
11 public abstract void WriteMessage(PmlElement message);
12
13 public void Dispose() {
14 Close();
15 }
16 public virtual void Close() {
17 _isOpen = false;
18 }
19
20 public abstract PmlElement ReadMessage();
21
22 public IAsyncResult BeginReadMessage(AsyncCallback callback, object state) {
23 ReadMessageAsyncResult ar = new ReadMessageAsyncResult();
24 ar.Callback = callback;
25 ar.State = state;
26 UCIS.ThreadPool.RunCall(AsyncReadMessage, ar);
27 return ar;
28 }
29 public PmlElement EndReadMessage(IAsyncResult asyncResult) {
30 ReadMessageAsyncResult ar = (ReadMessageAsyncResult)asyncResult;
31 if (ar.Error != null) throw new Exception("The asynchronous operation could not be completed", ar.Error);
32 return ar.Message;
33 }
34
35 private struct ReadMessageAsyncResult : IAsyncResult {
36 internal object State;
37 internal PmlElement Message;
38 internal AsyncCallback Callback;
39 internal Exception Error;
40 internal bool Completed;
41
42 public bool CompletedSynchronously { get { return false; } }
43 public object AsyncState { get { return State; } }
44 public WaitHandle AsyncWaitHandle { get { return null; } }
45 public bool IsCompleted { get { return Completed; } }
46 }
47 private void AsyncReadMessage(object state) {
48 ReadMessageAsyncResult ar = (ReadMessageAsyncResult)state;
49 try {
50 ar.Message = ReadMessage();
51 ar.Error = null;
52 } catch (Exception ex) {
53 ar.Error = ex;
54 }
55 ar.Completed = true;
56 ar.Callback.Invoke(ar);
57 }
58 }
59 }