File: net\System\Net\Configuration\WebRequestModulesSection.cs
Project: ndp\fx\src\System.csproj (System)
//------------------------------------------------------------------------------
// <copyright file="WebRequestModulesSection.cs" company="Microsoft Corporation">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
 
namespace System.Net.Configuration
{
    using System.Configuration;
    using System.Collections;
    using System.Globalization;
    using System.Net;    
    using System.Reflection;
    using System.Threading;
    public sealed class WebRequestModulesSection : ConfigurationSection
    {
        public WebRequestModulesSection() 
        {
            this.properties.Add(this.webRequestModules);
        }
 
        protected override void PostDeserialize()
        {
            // Perf optimization. If the configuration is coming from machine.config
            // It is safe and we don't need to check for permissions.
            if (EvaluationContext.IsMachineLevel)
                return;
 
            try {
                ExceptionHelper.WebPermissionUnrestricted.Demand();
            } catch (Exception exception) {
                throw new ConfigurationErrorsException(
                              SR.GetString(SR.net_config_section_permission, 
                                           ConfigurationStrings.WebRequestModulesSectionName),
                              exception);
            }
        }
 
        protected override void InitializeDefault()
        {
            this.WebRequestModules.Add(
                new WebRequestModuleElement(ConfigurationStrings.Https, typeof(HttpRequestCreator)));
            this.WebRequestModules.Add(
                new WebRequestModuleElement(ConfigurationStrings.Http, typeof(HttpRequestCreator)));
            this.WebRequestModules.Add(
                new WebRequestModuleElement(ConfigurationStrings.File, typeof(FileWebRequestCreator)));
            this.WebRequestModules.Add(
                new WebRequestModuleElement(ConfigurationStrings.Ftp, typeof(FtpWebRequestCreator)));
        }
 
        protected override ConfigurationPropertyCollection Properties
        {
            get { return this.properties; }
        }
 
        [ConfigurationProperty("", IsDefaultCollection=true )]
        public WebRequestModuleElementCollection WebRequestModules
        {
            get { return (WebRequestModuleElementCollection)this[this.webRequestModules]; }
        }
 
        ConfigurationPropertyCollection properties = new ConfigurationPropertyCollection();
 
        readonly ConfigurationProperty webRequestModules =
            new ConfigurationProperty(null, typeof(WebRequestModuleElementCollection), null,
                    ConfigurationPropertyOptions.IsDefaultCollection);
    }
 
    internal sealed class WebRequestModulesSectionInternal
    {
        internal WebRequestModulesSectionInternal(WebRequestModulesSection section)
        {
            if (section.WebRequestModules.Count > 0)
            {
                this.webRequestModules = new ArrayList(section.WebRequestModules.Count);
                foreach(WebRequestModuleElement webRequestModuleElement in section.WebRequestModules)
                {
                    try
                    {
                        this.webRequestModules.Add(new WebRequestPrefixElement(webRequestModuleElement.Prefix, webRequestModuleElement.Type));
                    }
                    catch (Exception exception)
                    {
                        if (NclUtilities.IsFatal(exception)) throw;
 
                        throw new ConfigurationErrorsException(SR.GetString(SR.net_config_webrequestmodules), exception);
                    }
                }
            }
        }
 
        internal static object ClassSyncObject
        {
            get
            {
                if (classSyncObject == null)
                {
                    object o = new object();
                    Interlocked.CompareExchange(ref classSyncObject, o, null);
                }
                return classSyncObject;
            }
        }
 
        static internal WebRequestModulesSectionInternal GetSection()
        {
            lock (WebRequestModulesSectionInternal.ClassSyncObject)
            {
                WebRequestModulesSection section = PrivilegedConfigurationManager.GetSection(ConfigurationStrings.WebRequestModulesSectionPath) as WebRequestModulesSection;
                if (section == null)
                    return null;
 
                return new WebRequestModulesSectionInternal(section);
            }
        }
 
        internal ArrayList WebRequestModules
        {
            get 
            {
                ArrayList retval = this.webRequestModules;
                if (retval == null)
                {
                    retval = new ArrayList(0);
                }
                return retval; 
            }
        }
 
        static object classSyncObject = null;
        ArrayList webRequestModules = null;
    }
}