The Labs \ Source Viewer \ SSCLI \ System.Configuration \ AppSettingsSection

  1. //------------------------------------------------------------------------------
  2. // <copyright file="AppSettingsSection.cs" company="Microsoft">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. //------------------------------------------------------------------------------
  15. namespace System.Configuration
  16. {
  17.     using System;
  18.     using System.Xml;
  19.     using System.Configuration;
  20.     using System.Collections.Specialized;
  21.     using System.Collections;
  22.     using System.IO;
  23.     using System.Text;
  24.    
  25.     public sealed class AppSettingsSection : ConfigurationSection
  26.     {
  27.         private static ConfigurationPropertyCollection s_properties;
  28.         private static ConfigurationProperty s_propAppSettings;
  29.         private static ConfigurationProperty s_propFile;
  30.        
  31.         private KeyValueInternalCollection _KeyValueCollection = null;
  32.        
  33.         private static ConfigurationPropertyCollection EnsureStaticPropertyBag()
  34.         {
  35.             if (s_properties == null) {
  36.                 s_propAppSettings = new ConfigurationProperty(null, typeof(KeyValueConfigurationCollection), null, ConfigurationPropertyOptions.IsDefaultCollection);
  37.                 s_propFile = new ConfigurationProperty("file", typeof(string), String.Empty, ConfigurationPropertyOptions.None);
  38.                
  39.                 ConfigurationPropertyCollection properties = new ConfigurationPropertyCollection();
  40.                 properties.Add(s_propAppSettings);
  41.                 properties.Add(s_propFile);
  42.                 s_properties = properties;
  43.             }
  44.            
  45.             return s_properties;
  46.         }
  47.        
  48.         public AppSettingsSection()
  49.         {
  50.             EnsureStaticPropertyBag();
  51.         }
  52.        
  53.         protected internal override ConfigurationPropertyCollection Properties {
  54.             get { return EnsureStaticPropertyBag(); }
  55.         }
  56.        
  57.         protected internal override object GetRuntimeObject()
  58.         {
  59.             SetReadOnly();
  60.             return this.InternalSettings;
  61.             // return the read only object
  62.         }
  63.        
  64.         internal NameValueCollection InternalSettings {
  65.             get {
  66.                 if (_KeyValueCollection == null) {
  67.                     _KeyValueCollection = new KeyValueInternalCollection(this);
  68.                 }
  69.                 return (NameValueCollection)_KeyValueCollection;
  70.             }
  71.         }
  72.        
  73.         [ConfigurationProperty("", IsDefaultCollection = true)]
  74.         public KeyValueConfigurationCollection Settings {
  75.             get { return (KeyValueConfigurationCollection)base[s_propAppSettings]; }
  76.         }
  77.        
  78.         [ConfigurationProperty("file", DefaultValue = "")]
  79.         public string File {
  80.             get {
  81.                 string fileValue = (string)base[s_propFile];
  82.                 if (fileValue == null) {
  83.                     return String.Empty;
  84.                 }
  85.                 return fileValue;
  86.             }
  87.             set { base[s_propFile] = value; }
  88.         }
  89.         protected internal override void Reset(ConfigurationElement parentSection)
  90.         {
  91.             _KeyValueCollection = null;
  92.             base.Reset(parentSection);
  93.             if (!String.IsNullOrEmpty((string)base[s_propFile])) {
  94.                 // don't inherit from the parent
  95.                 SetPropertyValue(s_propFile, null, true);
  96.                 // ignore the lock to prevent inheritence
  97.             }
  98.         }
  99.        
  100.        
  101.         protected internal override bool IsModified()
  102.         {
  103.             return base.IsModified();
  104.         }
  105.        
  106.         protected internal override string SerializeSection(ConfigurationElement parentElement, string name, ConfigurationSaveMode saveMode)
  107.         {
  108.             return base.SerializeSection(parentElement, name, saveMode);
  109.         }
  110.        
  111.         protected internal override void DeserializeElement(XmlReader reader, bool serializeCollectionKey)
  112.         {
  113.             string ElementName = reader.Name;
  114.            
  115.             base.DeserializeElement(reader, serializeCollectionKey);
  116.             if ((File != null) && (File.Length > 0)) {
  117.                 string sourceFileFullPath;
  118.                 string configFileDirectory;
  119.                 string configFile;
  120.                
  121.                 // Determine file location
  122.                 configFile = ElementInformation.Source;
  123.                
  124.                 if (String.IsNullOrEmpty(configFile)) {
  125.                     sourceFileFullPath = File;
  126.                 }
  127.                 else {
  128.                     configFileDirectory = System.IO.Path.GetDirectoryName(configFile);
  129.                     sourceFileFullPath = System.IO.Path.Combine(configFileDirectory, File);
  130.                 }
  131.                
  132.                 if (System.IO.File.Exists(sourceFileFullPath)) {
  133.                     int lineOffset = 0;
  134.                     string rawXml = null;
  135.                    
  136.                     using (Stream sourceFileStream = new FileStream(sourceFileFullPath, FileMode.Open, FileAccess.Read, FileShare.Read)) {
  137.                         using (XmlUtil xmlUtil = new XmlUtil(sourceFileStream, sourceFileFullPath, true)) {
  138.                             if (xmlUtil.Reader.Name != ElementName) {
  139.                                 throw new ConfigurationErrorsException(SR.GetString(SR.Config_name_value_file_section_file_invalid_root, ElementName), xmlUtil);
  140.                             }
  141.                            
  142.                             lineOffset = xmlUtil.Reader.LineNumber;
  143.                             rawXml = xmlUtil.CopySection();
  144.                            
  145.                             // Detect if there is any XML left over after the section
  146.                             while (!xmlUtil.Reader.EOF) {
  147.                                 XmlNodeType t = xmlUtil.Reader.NodeType;
  148.                                 if (t != XmlNodeType.Comment) {
  149.                                     throw new ConfigurationErrorsException(SR.GetString(SR.Config_source_file_format), xmlUtil);
  150.                                 }
  151.                                
  152.                                 xmlUtil.Reader.Read();
  153.                             }
  154.                         }
  155.                     }
  156.                    
  157.                     ConfigXmlReader internalReader = new ConfigXmlReader(rawXml, sourceFileFullPath, lineOffset);
  158.                     internalReader.Read();
  159.                     if (internalReader.MoveToNextAttribute()) {
  160.                         throw new ConfigurationErrorsException(SR.GetString(SR.Config_base_unrecognized_attribute, internalReader.Name), (XmlReader)internalReader);
  161.                     }
  162.                    
  163.                     internalReader.MoveToElement();
  164.                    
  165.                     base.DeserializeElement(internalReader, serializeCollectionKey);
  166.                 }
  167.             }
  168.         }
  169.     }
  170. }

Developer Fusion