diff Pml/Channels/PmlChannel.cs @ 0:3ab940a0c7a0

Initial commit
author Ivo Smits <Ivo@UCIS.nl>
date Tue, 11 Sep 2012 16:28:53 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Pml/Channels/PmlChannel.cs	Tue Sep 11 16:28:53 2012 +0200
@@ -0,0 +1,50 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace UCIS.Pml {
+	public class PmlChannel : ActivePmlChannel {
+		private IPmlRW _rw;
+		private bool _open;
+
+		public PmlChannel(IPmlRW rw) {
+			if (rw == null) throw new ArgumentNullException("rw");
+			_rw = rw;
+			_open = true;
+			ThreadPool.RunTask(worker, null);
+		}
+
+		public IPmlReader Reader { get { return _rw; } }
+		public IPmlWriter Writer { get { return _rw; } }
+
+		public new bool IsOpen { get { return _open; } }
+
+		public override void WriteMessage(PmlElement message) {
+			if (!_open) throw new InvalidOperationException("The channel is not open");
+			lock (_rw) _rw.WriteMessage(message);
+		}
+
+		public override void Close() {
+			if (!_open) return;
+			_open = false;
+			if (_rw != null) _rw = null;
+			base.Close();
+		}
+
+		private void worker(Object state) {
+			try {
+				while (_open) {
+					base.PushReceivedMessage(_rw.ReadMessage());
+				}
+			} catch (System.Net.Sockets.SocketException ex) {
+				Console.WriteLine("SocketException in PmlChannel.worker: " + ex.Message);
+			} catch (System.IO.EndOfStreamException ex) {
+				Console.WriteLine("EndOfStreamException in PmlChannel.worker: " + ex.Message);
+			} catch (Exception ex) {
+				Console.WriteLine(ex.ToString());
+			} finally {
+				Close();
+			}
+		}
+	}
+}