File: System\ServiceModel\Channels\PeerCustomResolverBindingElement.cs
Project: ndp\cdf\src\WCF\ServiceModel\System.ServiceModel.csproj (System.ServiceModel)
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------
 
namespace System.ServiceModel.Channels
{
    using System.ComponentModel;
    using System.ServiceModel;
    using System.ServiceModel.Configuration;
    using System.ServiceModel.Description;
    using System.ServiceModel.Dispatcher;
    using System.ServiceModel.PeerResolvers;
 
    [ObsoleteAttribute ("PeerChannel feature is obsolete and will be removed in the future.", false)]
    public sealed class PeerCustomResolverBindingElement : PeerResolverBindingElement
    {
        EndpointAddress address;
        Binding binding;
        string bindingSection, bindingConfiguration;
        //this should be PeerCustomResolver?
        PeerResolver resolver;
        ClientCredentials credentials;
        PeerReferralPolicy referralPolicy;
 
        public PeerCustomResolverBindingElement() { }
        public PeerCustomResolverBindingElement(PeerCustomResolverBindingElement other)
            : base(other)
        {
            this.address = other.address;
            this.bindingConfiguration = other.bindingConfiguration;
            this.bindingSection = other.bindingSection;
            this.binding = other.binding;
            this.resolver = other.resolver;
            this.credentials = other.credentials;
        }
 
        public PeerCustomResolverBindingElement(PeerCustomResolverSettings settings)
        {
            if (settings != null)
            {
                this.address = settings.Address;
                this.binding = settings.Binding;
                this.resolver = settings.Resolver;
                this.bindingConfiguration = settings.BindingConfiguration;
                this.bindingSection = settings.BindingSection;
            }
        }
 
        public PeerCustomResolverBindingElement(BindingContext context, PeerCustomResolverSettings settings)
            : this(settings)
        {
            if (context == null)
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("context"));
 
#pragma warning suppress 56506 // Microsoft, context.BindingParameters is never null
            credentials = context.BindingParameters.Find<ClientCredentials>();
        }
        public override T GetProperty<T>(System.ServiceModel.Channels.BindingContext context)
        {
#pragma warning suppress 56506 // context could be null. Pre-4.0 behaviour, won't fix in Dev10.
            return context.GetInnerProperty<T>();
        }
        public EndpointAddress Address
        {
            get
            {
                return address;
            }
            set
            {
                address = value;
            }
        }
 
        public Binding Binding
        {
            get
            {
                return binding;
            }
            set
            {
                binding = value;
            }
        }
 
        public override PeerReferralPolicy ReferralPolicy
        {
            get
            {
                return referralPolicy;
            }
            set
            {
                if (!PeerReferralPolicyHelper.IsDefined(value))
                {
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidEnumArgumentException("value", (int)value, typeof(PeerReferralPolicy)));
                }
                referralPolicy = value;
            }
        }
 
        public override BindingElement Clone()
        {
            return new PeerCustomResolverBindingElement(this);
        }
 
        public override IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
        {
            if (context == null)
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("context"));
 
#pragma warning suppress 56506 // Microsoft, context.BindingParameters is never null
            context.BindingParameters.Add(this);
            credentials = context.BindingParameters.Find<ClientCredentials>();
            return context.BuildInnerChannelFactory<TChannel>();
        }
 
        public override bool CanBuildChannelFactory<TChannel>(BindingContext context)
        {
            if (context == null)
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("context"));
#pragma warning suppress 56506 // Microsoft, context.BindingParameters is never null
            this.credentials = context.BindingParameters.Find<ClientCredentials>();
            context.BindingParameters.Add(this);
            return context.CanBuildInnerChannelFactory<TChannel>();
        }
 
        public override IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
        {
            if (context == null)
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("context"));
 
#pragma warning suppress 56506 // Microsoft, context.BindingParameters is never null
            context.BindingParameters.Add(this);
            this.credentials = context.BindingParameters.Find<ClientCredentials>();
            return context.BuildInnerChannelListener<TChannel>();
        }
 
        public override bool CanBuildChannelListener<TChannel>(BindingContext context)
        {
            if (context == null)
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("context"));
#pragma warning suppress 56506 // Microsoft, context.BindingParameters is never null
            this.credentials = context.BindingParameters.Find<ClientCredentials>();
            context.BindingParameters.Add(this);
            return context.CanBuildInnerChannelListener<TChannel>();
        }
 
        public override PeerResolver CreatePeerResolver()
        {
            if (resolver == null)
            {
                if (address == null || ((binding == null) && (String.IsNullOrEmpty(this.bindingSection) || String.IsNullOrEmpty(this.bindingConfiguration))))
                    PeerExceptionHelper.ThrowArgument_InsufficientResolverSettings();
                if (binding == null)
                {
                    this.binding = ConfigLoader.LookupBinding(this.bindingSection, this.bindingConfiguration);
                    if (binding == null)
                        PeerExceptionHelper.ThrowArgument_InsufficientResolverSettings();
                }
                resolver = new PeerDefaultCustomResolverClient();
            }
            if (resolver != null)
            {
                resolver.Initialize(address, binding, credentials, this.referralPolicy);
                if (resolver is PeerDefaultCustomResolverClient)
                {
                    (resolver as PeerDefaultCustomResolverClient).BindingName = this.bindingSection;
                    (resolver as PeerDefaultCustomResolverClient).BindingConfigurationName = this.bindingConfiguration;
                }
            }
            return resolver;
        }
    }
}