//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------ namespace System.ServiceModel { using System.ComponentModel; using System.Configuration; using System.Diagnostics.CodeAnalysis; using System.Runtime; using System.ServiceModel.Channels; using System.ServiceModel.Configuration; using System.Text; using System.Xml; public class UdpBinding : Binding, IBindingRuntimePreferences { TextMessageEncodingBindingElement textEncoding; UdpTransportBindingElement udpTransport; public UdpBinding() : base() { this.textEncoding = new TextMessageEncodingBindingElement(); this.udpTransport = new UdpTransportBindingElement(); } public UdpBinding(string configurationName) : this() { UdpBindingCollectionElement section = UdpBindingCollectionElement.GetBindingCollectionElement(); UdpBindingElement element = section.Bindings[configurationName]; if (element == null) { throw FxTrace.Exception.AsError(new ConfigurationErrorsException( SR.GetString(SR.ConfigInvalidBindingConfigurationName, configurationName, UdpTransportConfigurationStrings.UdpBindingElementName))); } else { element.ApplyConfiguration(this); } } 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 this.udpTransport.DuplicateMessageHistoryLength; } set { this.udpTransport.DuplicateMessageHistoryLength = value; } } [DefaultValue(TransportDefaults.MaxBufferPoolSize)] public long MaxBufferPoolSize { get { return this.udpTransport.MaxBufferPoolSize; } set { this.udpTransport.MaxBufferPoolSize = value; } } [DefaultValue(UdpConstants.Defaults.MaxRetransmitCount)] public int MaxRetransmitCount { get { return Math.Max(this.udpTransport.RetransmissionSettings.MaxUnicastRetransmitCount, this.udpTransport.RetransmissionSettings.MaxMulticastRetransmitCount); } set { this.udpTransport.RetransmissionSettings.MaxUnicastRetransmitCount = value; this.udpTransport.RetransmissionSettings.MaxMulticastRetransmitCount = value; } } [DefaultValue(UdpConstants.Defaults.DefaultMaxPendingMessagesTotalSize)] public long MaxPendingMessagesTotalSize { get { return this.udpTransport.MaxPendingMessagesTotalSize; } set { this.udpTransport.MaxPendingMessagesTotalSize = value; } } [DefaultValue(UdpConstants.Defaults.MaxReceivedMessageSize)] public long MaxReceivedMessageSize { get { return this.udpTransport.MaxReceivedMessageSize; } set { this.udpTransport.MaxReceivedMessageSize = value; } } [DefaultValue(UdpConstants.Defaults.MulticastInterfaceId)] public string MulticastInterfaceId { get { return this.udpTransport.MulticastInterfaceId; } set { this.udpTransport.MulticastInterfaceId = value; } } public XmlDictionaryReaderQuotas ReaderQuotas { get { return this.textEncoding.ReaderQuotas; } set { if (value == null) { throw FxTrace.Exception.ArgumentNull("value"); } value.CopyTo(this.textEncoding.ReaderQuotas); } } [TypeConverter(typeof(EncodingConverter))] public Encoding TextEncoding { get { return this.textEncoding.WriteEncoding; } set { this.textEncoding.WriteEncoding = value; } } [DefaultValue(UdpConstants.Defaults.TimeToLive)] public int TimeToLive { get { return this.udpTransport.TimeToLive; } set { this.udpTransport.TimeToLive = value; } } public override string Scheme { get { return this.udpTransport.Scheme; } } public override BindingElementCollection CreateBindingElements() { BindingElementCollection bindingElements = new BindingElementCollection(); bindingElements.Add(this.textEncoding); bindingElements.Add(this.udpTransport); return bindingElements.Clone(); } bool BindingElementsPropertiesMatch(UdpTransportBindingElement transport, MessageEncodingBindingElement encoding) { if (!this.udpTransport.IsMatch(transport)) { return false; } if (!this.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; } } }