e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
179 lines
7.1 KiB
C#
179 lines
7.1 KiB
C#
//------------------------------------------------------------------------------
|
|
// <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; } }
|
|
}
|
|
}
|