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

  1. //------------------------------------------------------------------------------
  2. // <copyright file="SettingsBase.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.Collections.Specialized;
  18.     using System.Runtime.Serialization;
  19.     using System.Configuration.Provider;
  20.     using System.Collections;
  21.     using System.ComponentModel;
  22.     ////////////////////////////////////////////////////////////
  23.     ////////////////////////////////////////////////////////////
  24.     ////////////////////////////////////////////////////////////
  25.    
  26.     public abstract class SettingsBase
  27.     {
  28.        
  29.         protected SettingsBase()
  30.         {
  31.             _PropertyValues = new SettingsPropertyValueCollection();
  32.         }
  33.         ////////////////////////////////////////////////////////////
  34.         ////////////////////////////////////////////////////////////
  35.         public virtual object this[string propertyName]
  36.         {
  37.             get {
  38.                 if (IsSynchronized) {
  39.                     lock (this) {
  40.                         return GetPropertyValueByName(propertyName);
  41.                     }
  42.                 }
  43.                 else {
  44.                     return GetPropertyValueByName(propertyName);
  45.                 }
  46.             }
  47.             set {
  48.                 if (IsSynchronized) {
  49.                     lock (this) {
  50.                         SetPropertyValueByName(propertyName, value);
  51.                     }
  52.                 }
  53.                 else {
  54.                     SetPropertyValueByName(propertyName, value);
  55.                 }
  56.             }
  57.         }
  58.        
  59.         private object GetPropertyValueByName(string propertyName)
  60.         {
  61.             if (Properties == null || _PropertyValues == null || Properties.Count == 0)
  62.                 throw new SettingsPropertyNotFoundException(SR.GetString(SR.SettingsPropertyNotFound, propertyName));
  63.             SettingsProperty pp = Properties[propertyName];
  64.             if (pp == null)
  65.                 throw new SettingsPropertyNotFoundException(SR.GetString(SR.SettingsPropertyNotFound, propertyName));
  66.             SettingsPropertyValue p = _PropertyValues[propertyName];
  67.             if (p == null) {
  68.                 GetPropertiesFromProvider(pp.Provider);
  69.                 p = _PropertyValues[propertyName];
  70.                 if (p == null)
  71.                     throw new SettingsPropertyNotFoundException(SR.GetString(SR.SettingsPropertyNotFound, propertyName));
  72.             }
  73.             return p.PropertyValue;
  74.         }
  75.         private void SetPropertyValueByName(string propertyName, object propertyValue)
  76.         {
  77.             if (Properties == null || _PropertyValues == null || Properties.Count == 0)
  78.                 throw new SettingsPropertyNotFoundException(SR.GetString(SR.SettingsPropertyNotFound, propertyName));
  79.            
  80.             SettingsProperty pp = Properties[propertyName];
  81.             if (pp == null)
  82.                 throw new SettingsPropertyNotFoundException(SR.GetString(SR.SettingsPropertyNotFound, propertyName));
  83.            
  84.             if (pp.IsReadOnly)
  85.                 throw new SettingsPropertyIsReadOnlyException(SR.GetString(SR.SettingsPropertyReadOnly, propertyName));
  86.            
  87.             if (propertyValue != null && !pp.PropertyType.IsInstanceOfType(propertyValue))
  88.                 throw new SettingsPropertyWrongTypeException(SR.GetString(SR.SettingsPropertyWrongType, propertyName));
  89.            
  90.             SettingsPropertyValue p = _PropertyValues[propertyName];
  91.             if (p == null) {
  92.                 GetPropertiesFromProvider(pp.Provider);
  93.                 p = _PropertyValues[propertyName];
  94.                 if (p == null)
  95.                     throw new SettingsPropertyNotFoundException(SR.GetString(SR.SettingsPropertyNotFound, propertyName));
  96.             }
  97.            
  98.             p.PropertyValue = propertyValue;
  99.         }
  100.        
  101.         ////////////////////////////////////////////////////////////
  102.         ////////////////////////////////////////////////////////////
  103.         public void Initialize(SettingsContext context, SettingsPropertyCollection properties, SettingsProviderCollection providers)
  104.         {
  105.             _Context = context;
  106.             _Properties = properties;
  107.             _Providers = providers;
  108.         }
  109.        
  110.         ////////////////////////////////////////////////////////////
  111.         ////////////////////////////////////////////////////////////
  112.         public virtual void Save()
  113.         {
  114.             if (IsSynchronized) {
  115.                 lock (this) {
  116.                     SaveCore();
  117.                 }
  118.             }
  119.             else {
  120.                 SaveCore();
  121.             }
  122.         }
  123.         private void SaveCore()
  124.         {
  125.             if (Properties == null || _PropertyValues == null || Properties.Count == 0)
  126.                 return;
  127.            
  128.             foreach (SettingsProvider prov in Providers) {
  129.                 SettingsPropertyValueCollection ppcv = new SettingsPropertyValueCollection();
  130.                 foreach (SettingsPropertyValue pp in PropertyValues) {
  131.                     if (pp.Property.Provider == prov) {
  132.                         ppcv.Add(pp);
  133.                     }
  134.                 }
  135.                 if (ppcv.Count > 0) {
  136.                     prov.SetPropertyValues(Context, ppcv);
  137.                 }
  138.             }
  139.             foreach (SettingsPropertyValue pp in PropertyValues)
  140.                 pp.IsDirty = false;
  141.         }
  142.         public virtual SettingsPropertyCollection Properties {
  143.             get { return _Properties; }
  144.         }
  145.         public virtual SettingsProviderCollection Providers {
  146.             get { return _Providers; }
  147.         }
  148.         public virtual SettingsPropertyValueCollection PropertyValues {
  149.             get { return _PropertyValues; }
  150.         }
  151.         public virtual SettingsContext Context {
  152.             get { return _Context; }
  153.         }
  154.        
  155.        
  156.         private void GetPropertiesFromProvider(SettingsProvider provider)
  157.         {
  158.             SettingsPropertyCollection ppc = new SettingsPropertyCollection();
  159.             foreach (SettingsProperty pp in Properties) {
  160.                 if (pp.Provider == provider) {
  161.                     ppc.Add(pp);
  162.                 }
  163.             }
  164.            
  165.             if (ppc.Count > 0) {
  166.                 SettingsPropertyValueCollection ppcv = provider.GetPropertyValues(Context, ppc);
  167.                 foreach (SettingsPropertyValue p in ppcv) {
  168.                     if (_PropertyValues[p.Name] == null)
  169.                         _PropertyValues.Add(p);
  170.                 }
  171.             }
  172.         }
  173.        
  174.         public static SettingsBase Synchronized(SettingsBase settingsBase)
  175.         {
  176.             settingsBase._IsSynchronized = true;
  177.             return settingsBase;
  178.         }
  179.         ////////////////////////////////////////////////////////////
  180.         ////////////////////////////////////////////////////////////
  181.         private SettingsPropertyCollection _Properties = null;
  182.         private SettingsProviderCollection _Providers = null;
  183.         private SettingsPropertyValueCollection _PropertyValues = null;
  184.         private SettingsContext _Context = null;
  185.         private bool _IsSynchronized = false;
  186.        
  187.         [Browsable(false)]
  188.         public bool IsSynchronized {
  189.             get { return _IsSynchronized; }
  190.         }
  191.     }
  192. }

Developer Fusion