File: System\ServiceModel\Channels\CustomBinding.cs
Web Access
Project: src\src\System.ServiceModel.Primitives\src\System.ServiceModel.Primitives.csproj (System.ServiceModel.Primitives)
// 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.Collections.Generic;
 
namespace System.ServiceModel.Channels
{
    public class CustomBinding : Binding
    {
        public CustomBinding()
            : base()
        {
        }
 
        public CustomBinding(params BindingElement[] bindingElementsInTopDownChannelStackOrder)
            : base()
        {
            if (bindingElementsInTopDownChannelStackOrder == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(bindingElementsInTopDownChannelStackOrder));
            }
 
            foreach (BindingElement element in bindingElementsInTopDownChannelStackOrder)
            {
                Elements.Add(element);
            }
        }
 
        public CustomBinding(string name, string ns, params BindingElement[] bindingElementsInTopDownChannelStackOrder)
            : base(name, ns)
        {
            if (bindingElementsInTopDownChannelStackOrder == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(bindingElementsInTopDownChannelStackOrder));
            }
 
            foreach (BindingElement element in bindingElementsInTopDownChannelStackOrder)
            {
                Elements.Add(element);
            }
        }
 
        public CustomBinding(IEnumerable<BindingElement> bindingElementsInTopDownChannelStackOrder)
        {
            if (bindingElementsInTopDownChannelStackOrder == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(bindingElementsInTopDownChannelStackOrder));
            }
 
            foreach (BindingElement element in bindingElementsInTopDownChannelStackOrder)
            {
                Elements.Add(element);
            }
        }
 
        internal CustomBinding(BindingElementCollection bindingElements)
            : base()
        {
            if (bindingElements == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(bindingElements));
            }
 
            for (int i = 0; i < bindingElements.Count; i++)
            {
                Elements.Add(bindingElements[i]);
            }
        }
 
        public CustomBinding(Binding binding)
            : this(binding, SafeCreateBindingElements(binding))
        {
        }
 
        private static BindingElementCollection SafeCreateBindingElements(Binding binding)
        {
            if (binding == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(binding));
            }
            return binding.CreateBindingElements();
        }
 
        internal CustomBinding(Binding binding, BindingElementCollection elements)
        {
            if (binding == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(binding));
            }
            if (elements == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(elements));
            }
 
            Name = binding.Name;
            Namespace = binding.Namespace;
            CloseTimeout = binding.CloseTimeout;
            OpenTimeout = binding.OpenTimeout;
            ReceiveTimeout = binding.ReceiveTimeout;
            SendTimeout = binding.SendTimeout;
 
            for (int i = 0; i < elements.Count; i++)
            {
                Elements.Add(elements[i]);
            }
        }
 
        public BindingElementCollection Elements { get; } = new BindingElementCollection();
 
        public override BindingElementCollection CreateBindingElements()
        {
            return Elements.Clone();
        }
 
        public override string Scheme
        {
            get
            {
                TransportBindingElement transport = Elements.Find<TransportBindingElement>();
                if (transport == null)
                {
                    return String.Empty;
                }
 
                return transport.Scheme;
            }
        }
    }
}