File: System\IdentityModel\Security\WrapperSecurityCommunicationObject.cs
Web Access
Project: src\src\System.ServiceModel.Federation\src\System.ServiceModel.Federation.csproj (System.ServiceModel.Federation)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
 
using System.IdentityModel.Selectors;
using System.Runtime;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Security;
using System.Threading.Tasks;
 
namespace System.IdentityModel.Security
{
    internal class WrapperSecurityCommunicationObject : CommunicationObject
    {
        private ISecurityCommunicationObject _innerCommunicationObject;
 
        public WrapperSecurityCommunicationObject(ISecurityCommunicationObject innerCommunicationObject)
            : base()
        {
            _innerCommunicationObject = innerCommunicationObject ?? throw new ArgumentNullException(nameof(innerCommunicationObject));
        }
 
        internal Type GetCommunicationObjectInnerType()
        {
            return _innerCommunicationObject.GetType();
        }
 
        protected override Type GetCommunicationObjectType()
        {
            return _innerCommunicationObject.GetType();
        }
 
        protected override TimeSpan DefaultCloseTimeout
        {
            get { return _innerCommunicationObject.DefaultCloseTimeout; }
        }
 
        protected override TimeSpan DefaultOpenTimeout
        {
            get { return _innerCommunicationObject.DefaultOpenTimeout; }
        }
 
        protected override void OnAbort()
        {
            _innerCommunicationObject.OnAbort();
        }
 
        protected override IAsyncResult OnBeginClose(TimeSpan timeout, AsyncCallback callback, object state)
        {
            return OnCloseAsync(timeout).ToApm(callback, state);
        }
 
        protected override IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state)
        {
            return OnOpenAsync(timeout).ToApm(callback, state);
        }
 
        protected override void OnClose(TimeSpan timeout)
        {
            _innerCommunicationObject.OnCloseAsync(timeout).GetAwaiter().GetResult();
        }
 
        protected override void OnClosed()
        {
            _innerCommunicationObject.OnClosed();
            base.OnClosed();
        }
 
        protected override void OnClosing()
        {
            _innerCommunicationObject.OnClosing();
            base.OnClosing();
        }
 
        protected override void OnEndClose(IAsyncResult result)
        {
            result.ToApmEnd();
        }
 
        protected override void OnEndOpen(IAsyncResult result)
        {
            result.ToApmEnd();
        }
 
        protected override void OnFaulted()
        {
            _innerCommunicationObject.OnFaulted();
            base.OnFaulted();
        }
 
        protected override void OnOpen(TimeSpan timeout)
        {
            _innerCommunicationObject.OnOpenAsync(timeout).GetAwaiter().GetResult();
        }
 
        protected override void OnOpened()
        {
            _innerCommunicationObject.OnOpened();
            base.OnOpened();
        }
 
        protected override void OnOpening()
        {
            _innerCommunicationObject.OnOpening();
            base.OnOpening();
        }
 
        internal Task OnCloseAsync(TimeSpan timeout)
        {
            return _innerCommunicationObject.OnCloseAsync(timeout);
        }
 
        internal Task OnOpenAsync(TimeSpan timeout)
        {
            return _innerCommunicationObject.OnOpenAsync(timeout);
        }
 
        internal void ThrowIfClosedOrNotOpen()
        {
            switch (State)
            {
                case CommunicationState.Created:
                    throw CreateNotOpenException();
 
                case CommunicationState.Opening:
                    throw CreateNotOpenException();
 
                case CommunicationState.Opened:
                    break;
 
                case CommunicationState.Closing:
                    break;
 
                case CommunicationState.Closed:
                    throw CreateClosedException();
 
                case CommunicationState.Faulted:
                    throw CreateFaultedException();
 
                default:
                    throw new Exception("ThrowIfClosedOrNotOpen: Unknown CommunicationObject.state");
            }
        }
 
        private Exception CreateNotOpenException()
        {
            return new InvalidOperationException(SR.Format(SR.CommunicationObjectCannotBeUsed, GetCommunicationObjectType().ToString(), State.ToString()));
        }
 
        private Exception CreateClosedException()
        {
            return new ObjectDisposedException(GetCommunicationObjectType().ToString());
        }
 
        internal Exception CreateFaultedException()
        {
            string message = SR.Format(SR.CommunicationObjectFaulted1, GetCommunicationObjectType().ToString());
            return new CommunicationObjectFaultedException(message);
        }
 
        internal abstract class CommunicationObjectSecurityTokenProvider : SecurityTokenProvider, ISecurityCommunicationObject
        {
 
            protected CommunicationObjectSecurityTokenProvider()
            {
                CommunicationObject = new WrapperSecurityCommunicationObject(this);
            }
 
            protected WrapperSecurityCommunicationObject CommunicationObject { get; }
 
            public event EventHandler Closed
            {
                add { CommunicationObject.Closed += value; }
                remove { CommunicationObject.Closed -= value; }
            }
 
            public event EventHandler Closing
            {
                add { CommunicationObject.Closing += value; }
                remove { CommunicationObject.Closing -= value; }
            }
 
            public event EventHandler Faulted
            {
                add { CommunicationObject.Faulted += value; }
                remove { CommunicationObject.Faulted -= value; }
            }
 
            public event EventHandler Opened
            {
                add { CommunicationObject.Opened += value; }
                remove { CommunicationObject.Opened -= value; }
            }
 
            public event EventHandler Opening
            {
                add { CommunicationObject.Opening += value; }
                remove { CommunicationObject.Opening -= value; }
            }
 
            public CommunicationState State
            {
                get { return CommunicationObject.State; }
            }
 
            public virtual TimeSpan DefaultOpenTimeout
            {
                get { return ServiceDefaults.OpenTimeout; }
            }
 
            public virtual TimeSpan DefaultCloseTimeout
            {
                get { return ServiceDefaults.CloseTimeout; }
            }
 
            // communication object
            public void Abort()
            {
                CommunicationObject.Abort();
            }
 
            public void Close()
            {
                CommunicationObject.Close();
            }
 
            public void Close(TimeSpan timeout)
            {
                CommunicationObject.Close(timeout);
            }
 
            public IAsyncResult BeginClose(AsyncCallback callback, object state)
            {
                return CommunicationObject.BeginClose(callback, state);
            }
 
            public IAsyncResult BeginClose(TimeSpan timeout, AsyncCallback callback, object state)
            {
                return CommunicationObject.BeginClose(timeout, callback, state);
            }
 
            public void EndClose(IAsyncResult result)
            {
                CommunicationObject.EndClose(result);
            }
 
            public void Open()
            {
                CommunicationObject.Open();
            }
 
            public void Open(TimeSpan timeout)
            {
                CommunicationObject.Open(timeout);
            }
 
            public IAsyncResult BeginOpen(AsyncCallback callback, object state)
            {
                return CommunicationObject.BeginOpen(callback, state);
            }
 
            public IAsyncResult BeginOpen(TimeSpan timeout, AsyncCallback callback, object state)
            {
                return CommunicationObject.BeginOpen(timeout, callback, state);
            }
 
            public void EndOpen(IAsyncResult result)
            {
                CommunicationObject.EndOpen(result);
            }
 
            public void Dispose()
            {
                Close();
            }
 
            // ISecurityCommunicationObject methods
            public virtual void OnAbort()
            {
            }
 
            public virtual Task OnCloseAsync(TimeSpan timeout)
            {
                return Task.CompletedTask;
            }
 
            public virtual void OnClosed()
            {
            }
 
            public virtual void OnClosing()
            {
            }
 
            public virtual void OnFaulted()
            {
                OnAbort();
            }
 
            public virtual Task OnOpenAsync(TimeSpan timeout)
            {
                return Task.CompletedTask;
            }
 
            public virtual void OnOpened()
            {
            }
 
            public virtual void OnOpening()
            {
            }
        }
 
        internal abstract class CommunicationObjectSecurityTokenAuthenticator : SecurityTokenAuthenticator, ICommunicationObject, ISecurityCommunicationObject
        {
            protected CommunicationObjectSecurityTokenAuthenticator()
            {
                CommunicationObject = new WrapperSecurityCommunicationObject(this);
            }
 
            protected WrapperSecurityCommunicationObject CommunicationObject { get; }
 
            public event EventHandler Closed
            {
                add { CommunicationObject.Closed += value; }
                remove { CommunicationObject.Closed -= value; }
            }
 
            public event EventHandler Closing
            {
                add { CommunicationObject.Closing += value; }
                remove { CommunicationObject.Closing -= value; }
            }
 
            public event EventHandler Faulted
            {
                add { CommunicationObject.Faulted += value; }
                remove { CommunicationObject.Faulted -= value; }
            }
 
            public event EventHandler Opened
            {
                add { CommunicationObject.Opened += value; }
                remove { CommunicationObject.Opened -= value; }
            }
 
            public event EventHandler Opening
            {
                add { CommunicationObject.Opening += value; }
                remove { CommunicationObject.Opening -= value; }
            }
 
            public CommunicationState State
            {
                get { return CommunicationObject.State; }
            }
 
            public virtual TimeSpan DefaultOpenTimeout
            {
                get { return ServiceDefaults.OpenTimeout; }
            }
 
            public virtual TimeSpan DefaultCloseTimeout
            {
                get { return ServiceDefaults.CloseTimeout; }
            }
 
            // communication object
            public void Abort()
            {
                CommunicationObject.Abort();
            }
 
            public void Close()
            {
                CommunicationObject.Close();
            }
 
            public void Close(TimeSpan timeout)
            {
                CommunicationObject.Close(timeout);
            }
 
            public IAsyncResult BeginClose(AsyncCallback callback, object state)
            {
                return CommunicationObject.BeginClose(callback, state);
            }
 
            public IAsyncResult BeginClose(TimeSpan timeout, AsyncCallback callback, object state)
            {
                return CommunicationObject.BeginClose(timeout, callback, state);
            }
 
            public void EndClose(IAsyncResult result)
            {
                CommunicationObject.EndClose(result);
            }
 
            public void Open()
            {
                CommunicationObject.Open();
            }
 
            public void Open(TimeSpan timeout)
            {
                CommunicationObject.Open(timeout);
            }
 
            public IAsyncResult BeginOpen(AsyncCallback callback, object state)
            {
                return CommunicationObject.BeginOpen(callback, state);
            }
 
            public IAsyncResult BeginOpen(TimeSpan timeout, AsyncCallback callback, object state)
            {
                return CommunicationObject.BeginOpen(timeout, callback, state);
            }
 
            public void EndOpen(IAsyncResult result)
            {
                CommunicationObject.EndOpen(result);
            }
 
            public void Dispose()
            {
                Close();
            }
 
            // ISecurityCommunicationObject methods
            public virtual void OnAbort()
            {
            }
 
            public IAsyncResult OnBeginClose(TimeSpan timeout, AsyncCallback callback, object state)
            {
                return new OperationWithTimeoutAsyncResult(OnClose, timeout, callback, state);
            }
 
            public IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state)
            {
                return new OperationWithTimeoutAsyncResult(OnOpen, timeout, callback, state);
            }
 
            public virtual void OnClose(TimeSpan timeout)
            {
            }
 
            public Task OnCloseAsync(TimeSpan timeout)
            {
                return Task.CompletedTask;
            }
 
            public virtual void OnClosed()
            {
            }
 
            public virtual void OnClosing()
            {
            }
 
            public void OnEndClose(IAsyncResult result)
            {
                OperationWithTimeoutAsyncResult.End(result);
            }
 
            public void OnEndOpen(IAsyncResult result)
            {
                OperationWithTimeoutAsyncResult.End(result);
            }
 
            public virtual void OnFaulted()
            {
                OnAbort();
            }
 
            public virtual void OnOpen(TimeSpan timeout)
            {
            }
 
            public Task OnOpenAsync(TimeSpan timeout)
            {
                return Task.CompletedTask;
            }
 
            public virtual void OnOpened()
            {
            }
 
            public virtual void OnOpening()
            {
            }
        }
    }
}