Merge pull request #4453 from lambdageek/bug-49721
[mono.git] / mcs / class / System.Configuration / System.Configuration / AppSettingsSection.cs
index 8303998b489255da440b045736238d9c635c7005..65b63cdee8b266d8699e9eb47c6e565b1f84ac7e 100644 (file)
@@ -27,8 +27,8 @@
 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
 //
 
-#if NET_2_0
 using System;
+using System.ComponentModel;
 using System.Collections.Specialized;
 using System.Xml;
 using System.IO;
@@ -37,21 +37,21 @@ namespace System.Configuration {
 
        public sealed class AppSettingsSection : ConfigurationSection
        {
-               KeyValueConfigurationCollection values;
-               const string configFile = "file";
-
                 private static ConfigurationPropertyCollection _properties;
                 private static readonly ConfigurationProperty _propFile;
+                private static readonly ConfigurationProperty _propSettings;
 
                 static AppSettingsSection ()
                 {
+                        _propFile = new ConfigurationProperty ("file", typeof(string), "",
+                                                              new StringConverter(), null, ConfigurationPropertyOptions.None);
+                        _propSettings = new ConfigurationProperty ("", typeof(KeyValueConfigurationCollection), null, 
+                                                                  null, null, ConfigurationPropertyOptions.IsDefaultCollection);
+
                         _properties     = new ConfigurationPropertyCollection ();
-                        _propFile = new ConfigurationProperty (configFile, 
-                                                               typeof(string), 
-                                                               "", 
-                                                               ConfigurationPropertyOptions.None);
 
                         _properties.Add (_propFile);
+                        _properties.Add (_propSettings);
                 }
 
                public AppSettingsSection ()
@@ -63,12 +63,26 @@ namespace System.Configuration {
                        return Settings.IsModified ();
                }
 
-               [MonoTODO ("Read file attribute")]
+               [MonoInternalNote ("file path?  do we use a System.Configuration api for opening it?  do we keep it open?  do we open it writable?")]
                protected internal override void DeserializeElement (XmlReader reader, bool serializeCollectionKey)
                {
+                       /* need to do this so we pick up the File attribute */
+                       base.DeserializeElement (reader, serializeCollectionKey);
+
                        if (File != "") {
-                               /* deserialize from the file */
-                               throw new NotImplementedException ();
+                               try {
+                                       string filePath = File;
+                                       if (!Path.IsPathRooted (filePath))
+                                               filePath = Path.Combine (Path.GetDirectoryName (Configuration.FilePath), filePath);
+
+                                       Stream s = System.IO.File.OpenRead (filePath);
+                                       XmlReader subreader = new ConfigXmlTextReader (s, filePath);
+                                       base.DeserializeElement (subreader, serializeCollectionKey);
+                                       s.Close ();
+                               }
+                               catch {
+                                       // nada, we just ignore a missing/unreadble file
+                               }
                        }
                }
 
@@ -81,10 +95,10 @@ namespace System.Configuration {
 
                [MonoTODO]
                protected internal override string SerializeSection (
-                       ConfigurationElement parent, string name, ConfigurationSaveMode mode)
+                       ConfigurationElement parentElement, string name, ConfigurationSaveMode saveMode)
                {
                        if (File == "") {
-                               return base.SerializeSection (parent, name, mode);
+                               return base.SerializeSection (parentElement, name, saveMode);
                        }
                        else {
                                throw new NotImplementedException ();
@@ -93,17 +107,13 @@ namespace System.Configuration {
 
                [ConfigurationProperty ("file", DefaultValue = "")]
                public string File {
-                       get { return (string)base [configFile]; }
-                       set { base [configFile] = value; }
+                       get { return (string)base [_propFile]; }
+                       set { base [_propFile] = value; }
                }
 
                [ConfigurationProperty ("", Options = ConfigurationPropertyOptions.IsDefaultCollection)]
                public KeyValueConfigurationCollection Settings {
-                       get {
-                               if (values == null)
-                                       values = new KeyValueConfigurationCollection();
-                               return values;
-                       }
+                       get { return (KeyValueConfigurationCollection) base [_propSettings]; }
                }
 
                protected internal override ConfigurationPropertyCollection Properties {
@@ -112,11 +122,19 @@ namespace System.Configuration {
                        }
                }
 
-               [MonoTODO]
                protected internal override object GetRuntimeObject ()
                {
-                       return base.GetRuntimeObject();
+                       KeyValueInternalCollection col = new KeyValueInternalCollection ();
+                               
+                       foreach (string key in Settings.AllKeys) {
+                               KeyValueConfigurationElement ele = Settings[key];
+                               col.Add (ele.Key, ele.Value);
+                       }
+                               
+                       if (!ConfigurationManager.ConfigurationSystem.SupportsUserConfig)
+                               col.SetReadOnly ();
+
+                       return col;
                }
        }
 }
-#endif