X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem%2FSystem.Configuration%2FApplicationSettingsBase.cs;h=87b75d46e02423c1ca01d391d195f8949c8192e0;hb=93ff28fda8a1bf0382e61dc58f8553842d949d4a;hp=b554e9903f4b1cea3bb25e78ef2dc1882ff0df41;hpb=75df74a96c33af7a99e16e4281272f1b67334a48;p=mono.git diff --git a/mcs/class/System/System.Configuration/ApplicationSettingsBase.cs b/mcs/class/System/System.Configuration/ApplicationSettingsBase.cs index b554e9903f4..87b75d46e02 100644 --- a/mcs/class/System/System.Configuration/ApplicationSettingsBase.cs +++ b/mcs/class/System/System.Configuration/ApplicationSettingsBase.cs @@ -17,14 +17,18 @@ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // -// Copyright (C) 2005 Novell, Inc (http://www.novell.com) +// Copyright (C) 2005, 2006 Novell, Inc (http://www.novell.com) // #if NET_2_0 -#if CONFIGURATION_DEP +#if CONFIGURATION_DEP && !TARGET_JVM extern alias PrebuiltSystem; using NameValueCollection = PrebuiltSystem.System.Collections.Specialized.NameValueCollection; #endif +#if CONFIGURATION_DEP +using System.IO; +using System.Xml.Serialization; +#endif using System.ComponentModel; using System.Reflection; @@ -32,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) { @@ -59,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); @@ -103,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 (); @@ -115,6 +119,7 @@ namespace System.Configuration { if (cache.Count > 0) provider.SetPropertyValues (Context, cache); } + Context.CurrentSettings = null; #endif } @@ -246,79 +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? */ - 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)] @@ -354,10 +373,12 @@ namespace System.Configuration { string settingsKey; SettingsContext context; +#if (CONFIGURATION_DEP) SettingsPropertyCollection properties; + ISettingsProviderService providerService; +#endif SettingsPropertyValueCollection propertyValues; SettingsProviderCollection providers; - ISettingsProviderService providerService; } }