| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316 |
- //
- // CommunicationObject.cs
- //
- // Author:
- // Atsushi Enomoto <[email protected]>
- //
- // Copyright (C) 2005 Novell, Inc. http://www.novell.com
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to
- // permit persons to whom the Software is furnished to do so, subject to
- // the following conditions:
- //
- // The above copyright notice and this permission notice shall be
- // included in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- //
- using System;
- using System.ServiceModel;
- using System.Threading;
- namespace System.ServiceModel.Channels
- {
- public abstract class CommunicationObject : ICommunicationObject
- {
- object mutex;
- CommunicationState state = CommunicationState.Created;
- TimeSpan open_timeout, close_timeout;
- bool aborted;
- protected CommunicationObject ()
- : this (new object ())
- {
- }
- protected CommunicationObject (object mutex)
- {
- this.mutex = mutex;
- }
- #region Events
- public event EventHandler Closed;
- public event EventHandler Closing;
- public event EventHandler Faulted;
- public event EventHandler Opened;
- public event EventHandler Opening;
- #endregion
- #region Properties
- public CommunicationState State {
- get { return state; }
- }
- protected bool IsDisposed {
- get { return state == CommunicationState.Closed; }
- }
- protected object ThisLock {
- get { return mutex; }
- }
- protected internal abstract TimeSpan DefaultCloseTimeout { get; }
- protected internal abstract TimeSpan DefaultOpenTimeout { get; }
- #endregion
- #region Methods
- [MonoTODO]
- public void Abort ()
- {
- OnAbort ();
- }
- [MonoTODO]
- protected void Fault ()
- {
- state = CommunicationState.Faulted;
- OnFaulted ();
- }
- public IAsyncResult BeginClose (AsyncCallback callback,
- object state)
- {
- return BeginClose (close_timeout, callback, state);
- }
- public IAsyncResult BeginClose (TimeSpan timeout,
- AsyncCallback callback, object state)
- {
- ProcessClosing ();
- return OnBeginClose (timeout, callback, state);
- }
- public IAsyncResult BeginOpen (AsyncCallback callback,
- object state)
- {
- return BeginOpen (open_timeout, callback, state);
- }
- public IAsyncResult BeginOpen (TimeSpan timeout,
- AsyncCallback callback, object state)
- {
- ProcessOpening ();
- return OnBeginOpen (timeout, callback, state);
- }
- public void Close ()
- {
- Close (close_timeout);
- }
- public void Close (TimeSpan timeout)
- {
- ProcessClosing ();
- OnClose (timeout);
- ProcessClosed ();
- }
- public void EndClose (IAsyncResult result)
- {
- OnEndClose (result);
- ProcessClosed ();
- }
- public void EndOpen (IAsyncResult result)
- {
- OnEndOpen (result);
- ProcessOpened ();
- }
- public void Open ()
- {
- Open (open_timeout);
- }
- public void Open (TimeSpan timeout)
- {
- ProcessOpening ();
- OnOpen (timeout);
- ProcessOpened ();
- }
- protected abstract void OnAbort ();
- protected abstract IAsyncResult OnBeginClose (TimeSpan timeout,
- AsyncCallback callback, object state);
- protected abstract IAsyncResult OnBeginOpen (TimeSpan timeout,
- AsyncCallback callback, object state);
- protected abstract void OnClose (TimeSpan timeout);
- void ProcessClosing ()
- {
- if (State == CommunicationState.Faulted)
- throw new CommunicationObjectFaultedException ();
- state = CommunicationState.Closing;
- OnClosing ();
- }
- protected virtual void OnClosing ()
- {
- // This means, if this method is overriden, then
- // Opening event is surpressed.
- if (Closing != null)
- Closing (this, new EventArgs ());
- }
- void ProcessClosed ()
- {
- state = CommunicationState.Closed;
- OnClosed ();
- }
- protected virtual void OnClosed ()
- {
- // This means, if this method is overriden, then
- // Closed event is surpressed.
- if (Closed != null)
- Closed (this, new EventArgs ());
- }
- protected abstract void OnEndClose (IAsyncResult result);
- protected abstract void OnEndOpen (IAsyncResult result);
- [MonoTODO]
- protected virtual void OnFaulted ()
- {
- // This means, if this method is overriden, then
- // Opened event is surpressed.
- if (Faulted != null)
- Faulted (this, new EventArgs ());
- }
- protected abstract void OnOpen (TimeSpan timeout);
- void ProcessOpened ()
- {
- state = CommunicationState.Opened;
- OnOpened ();
- }
- protected virtual void OnOpened ()
- {
- // This means, if this method is overriden, then
- // Opened event is surpressed.
- if (Opened != null)
- Opened (this, new EventArgs ());
- }
- void ProcessOpening ()
- {
- ThrowIfDisposedOrImmutable ();
- state = CommunicationState.Opening;
- OnOpening ();
- }
- protected virtual void OnOpening ()
- {
- // This means, if this method is overriden, then
- // Opening event is surpressed.
- if (Opening != null)
- Opening (this, new EventArgs ());
- }
- protected void ThrowIfDisposed ()
- {
- if (IsDisposed)
- throw new ObjectDisposedException (String.Format ("This communication object {0} is already disposed.", GetCommunicationObjectType ()));
- }
- protected void ThrowIfDisposedOrNotOpen ()
- {
- ThrowIfDisposed ();
- if (State == CommunicationState.Faulted)
- throw new CommunicationObjectFaultedException ();
- if (State != CommunicationState.Opened)
- throw new InvalidOperationException (String.Format ("The communication object {0} must be at opened state.", GetCommunicationObjectType ()));
- }
- protected void ThrowIfDisposedOrImmutable ()
- {
- ThrowIfDisposed ();
- // hmm, according to msdn, Closing is OK here.
- switch (State) {
- case CommunicationState.Faulted:
- throw new CommunicationObjectFaultedException ();
- case CommunicationState.Opening:
- case CommunicationState.Opened:
- throw new InvalidOperationException (String.Format ("The communication object {0} is not at created state.", GetType ()));
- }
- }
- protected virtual Type GetCommunicationObjectType ()
- {
- return GetType ();
- }
- #endregion
- class SimpleAsyncResult : IAsyncResult
- {
- CommunicationState comm_state;
- object async_state;
- public SimpleAsyncResult (
- CommunicationState communicationState,
- TimeSpan timeout, AsyncCallback callback,
- object asyncState)
- {
- comm_state = communicationState;
- async_state = asyncState;
- }
- public object AsyncState {
- get { return async_state; }
- }
- // FIXME: implement
- public WaitHandle AsyncWaitHandle {
- get { throw new NotImplementedException (); }
- }
- // FIXME: implement
- public bool CompletedSynchronously {
- get { throw new NotImplementedException (); }
- }
- // FIXME: implement
- public bool IsCompleted {
- get { throw new NotImplementedException (); }
- }
- }
- }
- }
|