Mercurial > hg > ucis.core
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Pml/Channels/PassivePmlChannel.cs Tue Sep 11 16:28:53 2012 +0200 @@ -0,0 +1,59 @@ +using System; +using UCIS.Pml; +using System.Collections.Generic; +using System.Threading; + +namespace UCIS.Pml { + public abstract class PassivePmlChannel : IPmlChannel { + private bool _isOpen = true; + + public virtual bool IsOpen { get { return _isOpen; } } + public abstract void WriteMessage(PmlElement message); + + public void Dispose() { + Close(); + } + public virtual void Close() { + _isOpen = false; + } + + public abstract PmlElement ReadMessage(); + + public IAsyncResult BeginReadMessage(AsyncCallback callback, object state) { + ReadMessageAsyncResult ar = new ReadMessageAsyncResult(); + ar.Callback = callback; + ar.State = state; + UCIS.ThreadPool.RunCall(AsyncReadMessage, ar); + return ar; + } + public PmlElement EndReadMessage(IAsyncResult asyncResult) { + ReadMessageAsyncResult ar = (ReadMessageAsyncResult)asyncResult; + if (ar.Error != null) throw new Exception("The asynchronous operation could not be completed", ar.Error); + return ar.Message; + } + + private struct ReadMessageAsyncResult : IAsyncResult { + internal object State; + internal PmlElement Message; + internal AsyncCallback Callback; + internal Exception Error; + internal bool Completed; + + public bool CompletedSynchronously { get { return false; } } + public object AsyncState { get { return State; } } + public WaitHandle AsyncWaitHandle { get { return null; } } + public bool IsCompleted { get { return Completed; } } + } + private void AsyncReadMessage(object state) { + ReadMessageAsyncResult ar = (ReadMessageAsyncResult)state; + try { + ar.Message = ReadMessage(); + ar.Error = null; + } catch (Exception ex) { + ar.Error = ex; + } + ar.Completed = true; + ar.Callback.Invoke(ar); + } + } +}