annotate Pml/Channels/PassivePmlChannel.cs @ 104:327be9216006

Improved PML code
author Ivo Smits <Ivo@UCIS.nl>
date Sat, 11 Oct 2014 14:05:41 +0200
parents 3ab940a0c7a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1 ???using System;
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2 using UCIS.Pml;
104
327be9216006 Improved PML code
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
3 using UCIS.Util;
0
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
4 using System.Collections.Generic;
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
5 using System.Threading;
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
6
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
7 namespace UCIS.Pml {
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
8 public abstract class PassivePmlChannel : IPmlChannel {
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
9 private bool _isOpen = true;
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
10
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
11 public virtual bool IsOpen { get { return _isOpen; } }
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
12 public abstract void WriteMessage(PmlElement message);
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
13
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
14 public void Dispose() {
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
15 Close();
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
16 }
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
17 public virtual void Close() {
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
18 _isOpen = false;
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
19 }
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
20
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
21 public abstract PmlElement ReadMessage();
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
22
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
23 public IAsyncResult BeginReadMessage(AsyncCallback callback, object state) {
104
327be9216006 Improved PML code
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
24 ReadMessageAsyncResult ar = new ReadMessageAsyncResult(callback, state);
0
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
25 UCIS.ThreadPool.RunCall(AsyncReadMessage, ar);
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
26 return ar;
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
27 }
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
28 public PmlElement EndReadMessage(IAsyncResult asyncResult) {
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
29 ReadMessageAsyncResult ar = (ReadMessageAsyncResult)asyncResult;
104
327be9216006 Improved PML code
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
30 ar.WaitForCompletion();
327be9216006 Improved PML code
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
31 if (ar.Error != null) throw new Exception("The asynchronous operation failed", ar.Error);
0
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
32 return ar.Message;
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
33 }
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
34
104
327be9216006 Improved PML code
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
35 class ReadMessageAsyncResult : AsyncResultBase {
0
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
36 internal PmlElement Message;
104
327be9216006 Improved PML code
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
37 public ReadMessageAsyncResult(AsyncCallback callback, Object state) : base(callback, state) { }
327be9216006 Improved PML code
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
38 public void SetCompleted(Boolean synchronously, Exception error, PmlElement message) {
327be9216006 Improved PML code
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
39 this.Message = message;
327be9216006 Improved PML code
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
40 base.SetCompleted(synchronously, error);
327be9216006 Improved PML code
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
41 }
0
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
42 }
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
43 private void AsyncReadMessage(object state) {
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
44 ReadMessageAsyncResult ar = (ReadMessageAsyncResult)state;
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
45 try {
104
327be9216006 Improved PML code
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
46 PmlElement message = ReadMessage();
327be9216006 Improved PML code
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
47 ar.SetCompleted(false, null, message);
0
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
48 } catch (Exception ex) {
104
327be9216006 Improved PML code
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
49 ar.SetCompleted(false, ex, null);
0
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
50 }
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
51 }
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
52 }
3ab940a0c7a0 Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
53 }