File: System\ServiceModel\Configuration\ByteStreamMessageEncodingElement.cs
Project: ndp\cdf\src\NetFx40\System.ServiceModel.Channels\System.ServiceModel.Channels.csproj (System.ServiceModel.Channels)
//------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------------------------
 
namespace System.ServiceModel.Configuration
{
    using System.Configuration;
    using System.Runtime;
    using System.ServiceModel.Channels;
    using System.ServiceModel.Configuration;
    using System.Xml;
    using System.Diagnostics.CodeAnalysis;
 
    public sealed partial class ByteStreamMessageEncodingElement : BindingElementExtensionElement
    {
        public ByteStreamMessageEncodingElement()
        {
        }
 
        [SuppressMessage(FxCop.Category.Configuration, FxCop.Rule.ConfigurationPropertyAttributeRule, Justification = "this property not a configuration property")]
        public override Type BindingElementType
        {
            get { return typeof(ByteStreamMessageEncodingBindingElement); }
        }
 
        [ConfigurationProperty(ByteStreamConfigurationStrings.ReaderQuotas)]
        public XmlDictionaryReaderQuotasElement ReaderQuotas
        {
            get { return (XmlDictionaryReaderQuotasElement)base[ByteStreamConfigurationStrings.ReaderQuotas]; }
        }
 
        public override void ApplyConfiguration(BindingElement bindingElement)
        {
            base.ApplyConfiguration(bindingElement);
            ByteStreamMessageEncodingBindingElement binding = (ByteStreamMessageEncodingBindingElement)bindingElement;
 
            this.ApplyConfiguration(binding.ReaderQuotas);
        }
 
        public override void CopyFrom(ServiceModelExtensionElement from)
        {
            base.CopyFrom(from);
            ByteStreamMessageEncodingElement source = (ByteStreamMessageEncodingElement)from;
 
            this.CopyFrom(source.ReaderQuotas);
        }
 
        protected internal override void InitializeFrom(BindingElement bindingElement)
        {
            base.InitializeFrom(bindingElement);
            ByteStreamMessageEncodingBindingElement element = (ByteStreamMessageEncodingBindingElement)bindingElement;
 
            this.InitializeFrom(element.ReaderQuotas);
        }
 
        protected internal override BindingElement CreateBindingElement()
        {
            ByteStreamMessageEncodingBindingElement binding = new ByteStreamMessageEncodingBindingElement();
            this.ApplyConfiguration(binding);
            return binding;
        }
 
        void ApplyConfiguration(XmlDictionaryReaderQuotas readerQuotas)
        {
            if (readerQuotas == null)
            {
                throw FxTrace.Exception.ArgumentNull("readerQuotas");
            }
 
            XmlDictionaryReaderQuotasElement oldQuotas = this.ReaderQuotas;
 
            if (oldQuotas.MaxDepth != 0)
            {
                readerQuotas.MaxDepth = oldQuotas.MaxDepth;
            }
            if (oldQuotas.MaxStringContentLength != 0)
            {
                readerQuotas.MaxStringContentLength = oldQuotas.MaxStringContentLength;
            }
            if (oldQuotas.MaxArrayLength != 0)
            {
                readerQuotas.MaxArrayLength = oldQuotas.MaxArrayLength;
            }
            if (oldQuotas.MaxBytesPerRead != 0)
            {
                readerQuotas.MaxBytesPerRead = oldQuotas.MaxBytesPerRead;
            }
            if (oldQuotas.MaxNameTableCharCount != 0)
            {
                readerQuotas.MaxNameTableCharCount = oldQuotas.MaxNameTableCharCount;
            }
        }
 
        void InitializeFrom(XmlDictionaryReaderQuotas readerQuotas)
        {
            if (readerQuotas == null)
            {
                throw FxTrace.Exception.ArgumentNull("readerQuotas");
            }
            
            XmlDictionaryReaderQuotasElement thisQuotas = this.ReaderQuotas;
            
            // Can't call thisQuotas.InitializeFrom() because it's internal to System.ServiceModel.dll, so we duplicate the logic
            if (readerQuotas.MaxDepth != EncoderDefaults.MaxDepth && readerQuotas.MaxDepth != 0)
            {
                thisQuotas.MaxDepth = readerQuotas.MaxDepth;
            }
            if (readerQuotas.MaxStringContentLength != EncoderDefaults.MaxStringContentLength && readerQuotas.MaxStringContentLength != 0)
            {
                thisQuotas.MaxStringContentLength = readerQuotas.MaxStringContentLength;
            }
            if (readerQuotas.MaxArrayLength != EncoderDefaults.MaxArrayLength && readerQuotas.MaxArrayLength != 0)
            {
                thisQuotas.MaxArrayLength = readerQuotas.MaxArrayLength;
            }
            if (readerQuotas.MaxBytesPerRead != EncoderDefaults.MaxBytesPerRead && readerQuotas.MaxBytesPerRead != 0)
            {
                thisQuotas.MaxBytesPerRead = readerQuotas.MaxBytesPerRead;
            }
            if (readerQuotas.MaxNameTableCharCount != EncoderDefaults.MaxNameTableCharCount && readerQuotas.MaxNameTableCharCount != 0)
            {
                thisQuotas.MaxNameTableCharCount = readerQuotas.MaxNameTableCharCount;
            } 
        }
 
        void CopyFrom(XmlDictionaryReaderQuotasElement readerQuotas)
        {
            XmlDictionaryReaderQuotasElement thisQuotas = this.ReaderQuotas;
 
            thisQuotas.MaxDepth = readerQuotas.MaxDepth;
            thisQuotas.MaxStringContentLength = readerQuotas.MaxStringContentLength;
            thisQuotas.MaxArrayLength = readerQuotas.MaxArrayLength;
            thisQuotas.MaxBytesPerRead = readerQuotas.MaxBytesPerRead;
            thisQuotas.MaxNameTableCharCount = readerQuotas.MaxNameTableCharCount;
        }
    }
}