File: FrameworkFork\System.ServiceModel\System\ServiceModel\UdpBinding.cs
Web Access
Project: src\src\dotnet-svcutil\lib\src\dotnet-svcutil-lib.csproj (dotnet-svcutil-lib)
// 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.
 
namespace System.ServiceModel
{
    using System.ComponentModel;
    using System.Diagnostics.CodeAnalysis;
    using System.Runtime;
    using System.ServiceModel.Channels;
    using System.Text;
    using Microsoft.Xml;
 
    public class UdpBinding : Binding, IBindingRuntimePreferences
    {
        private TextMessageEncodingBindingElement _textEncoding;
        private UdpTransportBindingElement _udpTransport;
 
        public UdpBinding()
            : base()
        {
            _textEncoding = new TextMessageEncodingBindingElement();
            _udpTransport = new UdpTransportBindingElement();
        }
 
        private UdpBinding(UdpTransportBindingElement transport, TextMessageEncodingBindingElement encoding)
            : this()
        {
            this.DuplicateMessageHistoryLength = transport.DuplicateMessageHistoryLength;
            this.MaxBufferPoolSize = transport.MaxBufferPoolSize;
            this.MaxPendingMessagesTotalSize = transport.MaxPendingMessagesTotalSize;
            this.MaxReceivedMessageSize = transport.MaxReceivedMessageSize;
            this.MaxRetransmitCount = Math.Max(transport.RetransmissionSettings.MaxUnicastRetransmitCount, transport.RetransmissionSettings.MaxMulticastRetransmitCount);
            this.MulticastInterfaceId = transport.MulticastInterfaceId;
            this.TimeToLive = transport.TimeToLive;
 
            this.ReaderQuotas = encoding.ReaderQuotas;
            this.TextEncoding = encoding.WriteEncoding;
        }
 
        [DefaultValue(UdpConstants.Defaults.DuplicateMessageHistoryLength)]
        public int DuplicateMessageHistoryLength
        {
            get
            {
                return _udpTransport.DuplicateMessageHistoryLength;
            }
            set
            {
                _udpTransport.DuplicateMessageHistoryLength = value;
            }
        }
 
        [DefaultValue(TransportDefaults.MaxBufferPoolSize)]
        public long MaxBufferPoolSize
        {
            get
            {
                return _udpTransport.MaxBufferPoolSize;
            }
            set
            {
                _udpTransport.MaxBufferPoolSize = value;
            }
        }
 
        [DefaultValue(UdpConstants.Defaults.MaxRetransmitCount)]
        public int MaxRetransmitCount
        {
            get
            {
                return Math.Max(_udpTransport.RetransmissionSettings.MaxUnicastRetransmitCount, _udpTransport.RetransmissionSettings.MaxMulticastRetransmitCount);
            }
            set
            {
                _udpTransport.RetransmissionSettings.MaxUnicastRetransmitCount = value;
                _udpTransport.RetransmissionSettings.MaxMulticastRetransmitCount = value;
            }
        }
 
        [DefaultValue(UdpConstants.Defaults.DefaultMaxPendingMessagesTotalSize)]
        public long MaxPendingMessagesTotalSize
        {
            get
            {
                return _udpTransport.MaxPendingMessagesTotalSize;
            }
            set
            {
                _udpTransport.MaxPendingMessagesTotalSize = value;
            }
        }
 
        [DefaultValue(UdpConstants.Defaults.MaxReceivedMessageSize)]
        public long MaxReceivedMessageSize
        {
            get
            {
                return _udpTransport.MaxReceivedMessageSize;
            }
            set
            {
                _udpTransport.MaxReceivedMessageSize = value;
            }
        }
 
        [DefaultValue(UdpConstants.Defaults.MulticastInterfaceId)]
        public string MulticastInterfaceId
        {
            get { return _udpTransport.MulticastInterfaceId; }
            set { _udpTransport.MulticastInterfaceId = value; }
        }
 
        public XmlDictionaryReaderQuotas ReaderQuotas
        {
            get { return _textEncoding.ReaderQuotas; }
            set
            {
                if (value == null)
                {
                    throw FxTrace.Exception.ArgumentNull("value");
                }
                value.CopyTo(_textEncoding.ReaderQuotas);
            }
        }
 
        //TODO: [TypeConverter(typeof(EncodingConverter))]
        public Encoding TextEncoding
        {
            get { return _textEncoding.WriteEncoding; }
            set { _textEncoding.WriteEncoding = value; }
        }
 
        [DefaultValue(UdpConstants.Defaults.TimeToLive)]
        public int TimeToLive
        {
            get { return _udpTransport.TimeToLive; }
            set { _udpTransport.TimeToLive = value; }
        }
 
        public override string Scheme
        {
            get { return _udpTransport.Scheme; }
        }
 
        public override BindingElementCollection CreateBindingElements()
        {
            BindingElementCollection bindingElements = new BindingElementCollection();
            bindingElements.Add(_textEncoding);
            bindingElements.Add(_udpTransport);
 
            return bindingElements.Clone();
        }
 
        private bool BindingElementsPropertiesMatch(UdpTransportBindingElement transport, MessageEncodingBindingElement encoding)
        {
            if (!_udpTransport.IsMatch(transport))
            {
                return false;
            }
 
            if (!_textEncoding.IsMatch(encoding))
            {
                return false;
            }
 
            return true;
        }
 
        [SuppressMessage(FxCop.Category.Design, FxCop.Rule.InterfaceMethodsShouldBeCallableByChildTypes, Justification = "no need to call this from derrived classes")]
        bool IBindingRuntimePreferences.ReceiveSynchronously
        {
            get { return false; }
        }
 
        [EditorBrowsable(EditorBrowsableState.Never)]
        public bool ShouldSerializeReaderQuotas()
        {
            return (!EncoderDefaults.IsDefaultReaderQuotas(this.ReaderQuotas));
        }
 
        [EditorBrowsable(EditorBrowsableState.Never)]
        public bool ShouldSerializeTextEncoding()
        {
            return (!this.TextEncoding.Equals(TextEncoderDefaults.Encoding));
        }
 
        internal static bool TryCreate(BindingElementCollection bindingElements, out Binding binding)
        {
            binding = null;
 
            if (bindingElements.Count > 2)
            {
                return false;
            }
 
            UdpTransportBindingElement transport = null;
            TextMessageEncodingBindingElement encoding = null;
 
            foreach (BindingElement bindingElement in bindingElements)
            {
                if (bindingElement is UdpTransportBindingElement)
                {
                    transport = bindingElement as UdpTransportBindingElement;
                }
                else if (bindingElement is TextMessageEncodingBindingElement)
                {
                    encoding = bindingElement as TextMessageEncodingBindingElement;
                }
                else
                {
                    return false;
                }
            }
 
            if (transport == null || encoding == null)
            {
                return false;
            }
 
            UdpBinding udpBinding = new UdpBinding(transport, encoding);
 
            if (!udpBinding.BindingElementsPropertiesMatch(transport, encoding))
            {
                return false;
            }
 
            binding = udpBinding;
            return true;
        }
    }
}