X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem%2FSystem.Configuration%2FApplicationSettingsBase.cs;h=87b75d46e02423c1ca01d391d195f8949c8192e0;hb=93ff28fda8a1bf0382e61dc58f8553842d949d4a;hp=51e6eaccd52d30fe6683b54cd05c381ecdb15e40;hpb=af90548a08ef5effc93b083b7eec44daa178b141;p=mono.git diff --git a/mcs/class/System/System.Configuration/ApplicationSettingsBase.cs b/mcs/class/System/System.Configuration/ApplicationSettingsBase.cs index 51e6eaccd52..87b75d46e02 100644 --- a/mcs/class/System/System.Configuration/ApplicationSettingsBase.cs +++ b/mcs/class/System/System.Configuration/ApplicationSettingsBase.cs @@ -36,19 +36,17 @@ using System.Collections.Specialized; namespace System.Configuration { - public abstract class ApplicationSettingsBase : SettingsBase, INotifyPropertyChanged + public abstract class ApplicationSettingsBase : SettingsBase, INotifyPropertyChanged { - - protected ApplicationSettingsBase () - { + protected ApplicationSettingsBase () + { Initialize (Context, Properties, Providers); - } + } protected ApplicationSettingsBase (IComponent owner) : this (owner, String.Empty) { } - protected ApplicationSettingsBase (string settingsKey) { @@ -63,8 +61,9 @@ namespace System.Configuration { if (owner == null) throw new ArgumentNullException (); +#if (CONFIGURATION_DEP) providerService = (ISettingsProviderService)owner.Site.GetService(typeof (ISettingsProviderService)); - +#endif this.settingsKey = settingsKey; Initialize (Context, Properties, Providers); @@ -107,6 +106,7 @@ namespace System.Configuration { public override void Save() { #if (CONFIGURATION_DEP) + Context.CurrentSettings = this; /* ew.. this needs to be more efficient */ foreach (SettingsProvider provider in Providers) { SettingsPropertyValueCollection cache = new SettingsPropertyValueCollection (); @@ -119,6 +119,7 @@ namespace System.Configuration { if (cache.Count > 0) provider.SetPropertyValues (Context, cache); } + Context.CurrentSettings = null; #endif } @@ -250,87 +251,93 @@ namespace System.Configuration { properties = new SettingsPropertyCollection (); - foreach (PropertyInfo prop in GetType().GetProperties (/* only public properties? */)) { + foreach (PropertyInfo prop in GetType ().GetProperties ()) { // only public properties SettingAttribute[] setting_attrs = (SettingAttribute[])prop.GetCustomAttributes (typeof (SettingAttribute), false); - if (setting_attrs != null && setting_attrs.Length > 0) { - SettingsAttributeDictionary dict = new SettingsAttributeDictionary (); - SettingsProvider provider = null; - object defaultValue = null; - SettingsSerializeAs serializeAs = SettingsSerializeAs.String; - - foreach (Attribute a in prop.GetCustomAttributes (false)) { - /* the attributes we handle natively here */ - if (a is SettingsProviderAttribute) { - Type provider_type = Type.GetType (((SettingsProviderAttribute)a).ProviderTypeName); - provider = (SettingsProvider) Activator.CreateInstance (provider_type); - provider.Initialize (null, null); - } - else if (a is DefaultSettingValueAttribute) { - defaultValue = ((DefaultSettingValueAttribute)a).Value; /* XXX this is a string.. do we convert? */ - // note: for StringCollection, TypeDescriptor.GetConverter(prop.PropertyType) returns - // CollectionConverter, however this class cannot handle the XML serialized strings - if (prop.PropertyType == typeof(StringCollection)) { - XmlSerializer xs = new XmlSerializer (typeof (string[])); - string[] values = (string[]) xs.Deserialize (new StringReader ((string)defaultValue)); - StringCollection sc = new StringCollection (); - sc.AddRange (values); - defaultValue = sc; - } else if (prop.PropertyType != typeof(string)) { - defaultValue = TypeDescriptor.GetConverter(prop.PropertyType).ConvertFromString((string)defaultValue); - } - } - else if (a is SettingsSerializeAsAttribute) { - serializeAs = ((SettingsSerializeAsAttribute)a).SerializeAs; - } - else if (a is ApplicationScopedSettingAttribute || - a is UserScopedSettingAttribute) { - dict.Add (a.GetType(), a); - } - else { - dict.Add (a.GetType(), a); - } - } - - SettingsProperty setting = new SettingsProperty (prop.Name, - prop.PropertyType, - provider, - false /* XXX */, - defaultValue /* XXX always a string? */, - serializeAs, - dict, - false, false); - - - if (providerService != null) - setting.Provider = providerService.GetSettingsProvider (setting); - - if (provider == null) { - if (local_provider == null) { - local_provider = new LocalFileSettingsProvider (); - local_provider.Initialize (null, null); - } - setting.Provider = local_provider; - } - - if (provider != null) { - /* make sure we're using the same instance of a - given provider across multiple properties */ - SettingsProvider p = Providers[provider.Name]; - if (p != null) - setting.Provider = p; - } - - properties.Add (setting); - - if (setting.Provider != null && Providers [setting.Provider.Name] == null) - Providers.Add (setting.Provider); - } + if (setting_attrs == null || setting_attrs.Length == 0) + continue; + CreateSettingsProperty (prop, properties, ref local_provider); } } return properties; } } + + void CreateSettingsProperty (PropertyInfo prop, SettingsPropertyCollection properties, ref LocalFileSettingsProvider local_provider) + { + SettingsAttributeDictionary dict = new SettingsAttributeDictionary (); + SettingsProvider provider = null; + object defaultValue = null; + SettingsSerializeAs serializeAs = SettingsSerializeAs.String; + bool explicitSerializeAs = false; + + foreach (Attribute a in prop.GetCustomAttributes (false)) { + /* the attributes we handle natively here */ + if (a is SettingsProviderAttribute) { + Type provider_type = Type.GetType (((SettingsProviderAttribute)a).ProviderTypeName); + provider = (SettingsProvider) Activator.CreateInstance (provider_type); + provider.Initialize (null, null); + } + else if (a is DefaultSettingValueAttribute) { + defaultValue = ((DefaultSettingValueAttribute)a).Value; + } + else if (a is SettingsSerializeAsAttribute) { + serializeAs = ((SettingsSerializeAsAttribute)a).SerializeAs; + explicitSerializeAs = true; + } + else if (a is ApplicationScopedSettingAttribute || + a is UserScopedSettingAttribute) { + dict.Add (a.GetType(), a); + } + else { + dict.Add (a.GetType(), a); + } + } + + if (!explicitSerializeAs) { + // DefaultValue is a string and if we can't convert from string to the + // property type then the only other option left is for the string to + // be XML. + // + TypeConverter converter = TypeDescriptor.GetConverter (prop.PropertyType); + if (converter != null && + (!converter.CanConvertFrom (typeof (string)) || + !converter.CanConvertTo (typeof (string)))) + serializeAs = SettingsSerializeAs.Xml; + } + + SettingsProperty setting = + new SettingsProperty (prop.Name, prop.PropertyType, provider, false /* XXX */, + defaultValue /* XXX always a string? */, serializeAs, dict, + false, false); + + + if (providerService != null) + setting.Provider = providerService.GetSettingsProvider (setting); + + if (provider == null) { + if (local_provider == null) { + local_provider = new LocalFileSettingsProvider (); + local_provider.Initialize (null, null); + } + setting.Provider = local_provider; + // .NET ends up to set this to providers. + provider = local_provider; + } + + if (provider != null) { + /* make sure we're using the same instance of a + given provider across multiple properties */ + SettingsProvider p = Providers[provider.Name]; + if (p != null) + setting.Provider = p; + } + + properties.Add (setting); + + if (setting.Provider != null && Providers [setting.Provider.Name] == null) + Providers.Add (setting.Provider); + } #endif [Browsable (false)] @@ -366,10 +373,12 @@ namespace System.Configuration { string settingsKey; SettingsContext context; +#if (CONFIGURATION_DEP) SettingsPropertyCollection properties; + ISettingsProviderService providerService; +#endif SettingsPropertyValueCollection propertyValues; SettingsProviderCollection providers; - ISettingsProviderService providerService; } }