File: sys\system\configuration\SettingsBase.cs
Project: ndp\fx\src\System.csproj (System)
//------------------------------------------------------------------------------
// <copyright file="SettingsBase.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
 
namespace System.Configuration {
    using  System.Collections.Specialized;
    using  System.Runtime.Serialization;
    using  System.Configuration.Provider;
    using  System.Collections;
    using System.ComponentModel;
   ////////////////////////////////////////////////////////////
   ////////////////////////////////////////////////////////////
   ////////////////////////////////////////////////////////////
 
   public abstract class SettingsBase {
 
       protected SettingsBase()
       {
           _PropertyValues = new SettingsPropertyValueCollection();
       }
       ////////////////////////////////////////////////////////////
       ////////////////////////////////////////////////////////////
       public virtual object this[string propertyName]
       {
           get {
               if (IsSynchronized) {
                   lock (this) {
                       return GetPropertyValueByName(propertyName);
                   }
               } else {
                   return GetPropertyValueByName(propertyName);
               }
           }
           set {
               if (IsSynchronized) {
                   lock (this) {
                       SetPropertyValueByName(propertyName, value);
                   }
               } else {
                   SetPropertyValueByName(propertyName, value);
               }
           }
       }
 
       private object GetPropertyValueByName(string propertyName)
       {
           if (Properties == null || _PropertyValues == null || Properties.Count == 0)
               throw new SettingsPropertyNotFoundException(SR.GetString(SR.SettingsPropertyNotFound, propertyName));
           SettingsProperty pp = Properties[propertyName];
           if (pp == null)
               throw new SettingsPropertyNotFoundException(SR.GetString(SR.SettingsPropertyNotFound, propertyName));
           SettingsPropertyValue p = _PropertyValues[propertyName];
           if (p == null)
           {
               GetPropertiesFromProvider(pp.Provider);
               p = _PropertyValues[propertyName];
               if (p == null)
                   throw new SettingsPropertyNotFoundException(SR.GetString(SR.SettingsPropertyNotFound, propertyName));
           }
           return p.PropertyValue;
       }
       private void SetPropertyValueByName(string propertyName, object propertyValue)
       {
           if (Properties == null || _PropertyValues == null || Properties.Count == 0)
               throw new SettingsPropertyNotFoundException(SR.GetString(SR.SettingsPropertyNotFound, propertyName));
 
           SettingsProperty pp = Properties[propertyName];
           if (pp == null)
               throw new SettingsPropertyNotFoundException(SR.GetString(SR.SettingsPropertyNotFound, propertyName));
 
           if (pp.IsReadOnly)
               throw new SettingsPropertyIsReadOnlyException(SR.GetString(SR.SettingsPropertyReadOnly, propertyName));
 
           if (propertyValue != null && !pp.PropertyType.IsInstanceOfType(propertyValue))
               throw new SettingsPropertyWrongTypeException(SR.GetString(SR.SettingsPropertyWrongType, propertyName));
 
           SettingsPropertyValue p = _PropertyValues[propertyName];
           if (p == null)
           {
               GetPropertiesFromProvider(pp.Provider);
               p = _PropertyValues[propertyName];
               if (p == null)
                   throw new SettingsPropertyNotFoundException(SR.GetString(SR.SettingsPropertyNotFound, propertyName));
           }
 
           p.PropertyValue = propertyValue;
       }
 
       ////////////////////////////////////////////////////////////
       ////////////////////////////////////////////////////////////
       public void Initialize(
               SettingsContext                  context,
               SettingsPropertyCollection       properties,
               SettingsProviderCollection       providers)
       {
           _Context = context;
           _Properties = properties;
           _Providers = providers;
       }
 
       ////////////////////////////////////////////////////////////
       ////////////////////////////////////////////////////////////
       public virtual void Save() {
           if (IsSynchronized) {
               lock (this) {
                   SaveCore();
               }
           } else {
               SaveCore();
           }
       }
       private void SaveCore()
       {
           if (Properties == null || _PropertyValues == null || Properties.Count == 0)
               return;
 
           foreach(SettingsProvider prov in Providers) {
               SettingsPropertyValueCollection ppcv = new SettingsPropertyValueCollection();
               foreach (SettingsPropertyValue pp in PropertyValues)
               {
                   if (pp.Property.Provider == prov) {
                       ppcv.Add(pp);
                   }
               }
               if (ppcv.Count > 0) {
                   prov.SetPropertyValues(Context, ppcv);
               }
           }
           foreach (SettingsPropertyValue pp in PropertyValues)
               pp.IsDirty = false;
       }
       virtual public SettingsPropertyCollection Properties  { get { return _Properties; }}
       virtual public SettingsProviderCollection Providers   { get { return _Providers; }}
       virtual public SettingsPropertyValueCollection PropertyValues { get { return _PropertyValues; } }
       virtual public SettingsContext Context { get { return _Context; } }
 
 
       private void GetPropertiesFromProvider(SettingsProvider provider)
       {
           SettingsPropertyCollection ppc = new SettingsPropertyCollection();
           foreach (SettingsProperty pp in Properties)
           {
               if (pp.Provider == provider)
               {
                   ppc.Add(pp);
               }
           }
 
           if (ppc.Count > 0)
           {
               SettingsPropertyValueCollection ppcv = provider.GetPropertyValues(Context, ppc);
               foreach (SettingsPropertyValue p in ppcv)
               {
                   if (_PropertyValues[p.Name] == null)
                       _PropertyValues.Add(p);
               }
           }
       }
 
       public static SettingsBase Synchronized(SettingsBase settingsBase)
       {
           settingsBase._IsSynchronized = true;
           return settingsBase;
       }
       ////////////////////////////////////////////////////////////
       ////////////////////////////////////////////////////////////
       private  SettingsPropertyCollection      _Properties       = null;
       private  SettingsProviderCollection      _Providers        = null;
       private  SettingsPropertyValueCollection _PropertyValues   = null;
       private  SettingsContext                 _Context          = null;
       private  bool                            _IsSynchronized   = false;
 
       [Browsable(false)]
       public bool IsSynchronized { get { return _IsSynchronized; } }
   }
}