* System_test.dll.sources: Added ConfigXmlDocumentTest.cs.
[mono.git] / mcs / class / System / System.Configuration / ApplicationSettingsBase.cs
index a3b341b0bca6cc99a08687b71456dba8e22febfb..87b75d46e02423c1ca01d391d195f8949c8192e0 100644 (file)
 // 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 && !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;
 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)
                {
@@ -54,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);
@@ -98,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 ();
@@ -110,6 +119,7 @@ namespace System.Configuration {
                                if (cache.Count > 0)
                                        provider.SetPropertyValues (Context, cache);
                        }
+                       Context.CurrentSettings = null;
 #endif
                }
 
@@ -168,6 +178,8 @@ namespace System.Configuration {
                                SettingsPropertyValueCollection vals = provider.GetPropertyValues (Context, col);
                                PropertyValues.Add (vals);
                        }
+
+                       OnSettingsLoaded (this, new SettingsLoadedEventArgs (provider));
                }
 
                void InitializeSettings (SettingsPropertyCollection settings)
@@ -213,7 +225,7 @@ namespace System.Configuration {
                                        CacheValuesByProvider (prop.Provider);
 
                                SettingChangingEventArgs changing_args = new SettingChangingEventArgs (propertyName,
-                                                                                                      "" /* XXX settingClass? */,
+                                                                                                      GetType().FullName,
                                                                                                       settingsKey,
                                                                                                       value,
                                                                                                       false);
@@ -239,76 +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 &&
-                                                   (setting_attrs[0] is UserScopedSettingAttribute
-                                                   || setting_attrs[0] is ApplicationScopedSettingAttribute)) {
-
-                                                       SettingsAttributeDictionary dict = new SettingsAttributeDictionary ();
-                                                       SettingsProvider provider = null;
-                                                       object defaultValue = null;
-                                                       SettingsSerializeAs serializeAs = SettingsSerializeAs.String;
-
-                                                       foreach (Attribute a in prop.GetCustomAttributes (false)) {
-                                                               if (a is UserScopedSettingAttribute
-                                                                   || a is ApplicationScopedSettingAttribute)
-                                                                       continue;
-
-                                                               /* the attributes we handle natively here */
-                                                               if (a is SettingsProviderAttribute) {
-                                                                       Type provider_type = Type.GetType (((SettingsProviderAttribute)a).ProviderTypeName);
-                                                                       provider = (SettingsProvider) Activator.CreateInstance (provider_type);
-                                                               }
-                                                               else if (a is DefaultSettingValueAttribute) {
-                                                                       defaultValue = ((DefaultSettingValueAttribute)a).Value; /* XXX this is a string.. do we convert? */
-                                                               }
-                                                               else if (a is SettingsSerializeAsAttribute) {
-                                                                       serializeAs = ((SettingsSerializeAsAttribute)a).SerializeAs;
-                                                               }
-                                                               else {
-                                                                       dict.Add (a.GetType().ToString() /* XXX ?*/, 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 ();
-                                                               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)]
@@ -344,10 +373,12 @@ namespace System.Configuration {
 
                string settingsKey;
                SettingsContext context;
+#if (CONFIGURATION_DEP)                
                SettingsPropertyCollection properties;
+               ISettingsProviderService providerService;
+#endif
                SettingsPropertyValueCollection propertyValues;
                SettingsProviderCollection providers;
-               ISettingsProviderService providerService;
         }
 
 }