Merge pull request #364 from directhex/master
[mono.git] / mcs / class / System.Configuration / System.Configuration / AppSettingsSection.cs
index 3e442145976ae4886d6067e4523223c082b9f555..1008a0ae986c214146c513f2320112e183479032 100644 (file)
@@ -3,6 +3,7 @@
 //
 // Authors:
 //     Duncan Mak (duncan@ximian.com)
+//     Chris Toshok (toshok@ximian.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -28,6 +29,7 @@
 
 #if NET_2_0
 using System;
+using System.ComponentModel;
 using System.Collections.Specialized;
 using System.Xml;
 using System.IO;
@@ -36,94 +38,101 @@ namespace System.Configuration {
 
        public sealed class AppSettingsSection : ConfigurationSection
        {
-               ConfigNameValueCollection values;
-               bool hasClear;
-               
+                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 ();
+
+                        _properties.Add (_propFile);
+                        _properties.Add (_propSettings);
+                }
+
                public AppSettingsSection ()
                {
                }
 
                protected internal override  bool IsModified ()
                {
-                       return values != null && values.IsModified;
+                       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)
                {
-                       XmlDocument doc = new XmlDocument ();
-                       XmlNode data = doc.ReadNode (reader);
-                       hasClear = ((XmlElement)data)["clear"] != null;
-                       values = ConfigHelper.GetNameValueCollection (values, data, "key", "value");
-               }
+                       /* need to do this so we pick up the File attribute */
+                       base.DeserializeElement (reader, serializeCollectionKey);
 
-               protected internal override void Reset (ConfigurationElement parentSection)
-               {
-                       AppSettingsSection sec = parentSection as AppSettingsSection;
-                       if (sec != null && sec.values != null)
-                               values = new ConfigNameValueCollection (sec.values);
-                       else
-                               values = null;
+                       if (File != "") {
+                               try {
+                                       Stream s = System.IO.File.OpenRead (File);
+                                       XmlReader subreader = new ConfigXmlTextReader (s, File);
+                                       base.DeserializeElement (subreader, serializeCollectionKey);
+                                       s.Close ();
+                               }
+                               catch {
+                                       // nada, we just ignore a missing/unreadble file
+                               }
+                       }
                }
 
-               protected internal override void ResetModified ()
+               protected internal override void Reset (ConfigurationElement parentSection)
                {
-                       if (values != null) values.ResetModified ();
+                       AppSettingsSection psec = parentSection as AppSettingsSection;
+                       if (psec != null)
+                               Settings.Reset (psec.Settings);
                }
 
+               [MonoTODO]
                protected internal override string SerializeSection (
                        ConfigurationElement parent, string name, ConfigurationSaveMode mode)
                {
-                       AppSettingsSection sec = parent as AppSettingsSection;
-                       NameValueCollection parentValues = sec != null && !hasClear ? sec.Settings : null;
-                       
-                       StringWriter sw = new StringWriter ();
-                       XmlTextWriter writer = new XmlTextWriter (sw);
-                       writer.WriteStartElement ("appSettings");
-                       
-                       if (hasClear) {
-                               writer.WriteStartElement ("clear");
-                               writer.WriteEndElement ();
+                       if (File == "") {
+                               return base.SerializeSection (parent, name, mode);
                        }
-                       
-                       foreach (string key in values) {
-                               string val = values [key];
-                               string parentVal = parentValues != null ? parentValues [key] : null;
-                               if (parentVal != val) {
-                                       writer.WriteStartElement ("add");
-                                       writer.WriteAttributeString ("key", key);
-                                       writer.WriteAttributeString ("value", val);
-                                       writer.WriteEndElement ();
-                               }
-                       }
-                       
-                       if (parentValues != null) {
-                               foreach (string key in parentValues) {
-                                       if (values [key] == null) {
-                                               writer.WriteStartElement ("remove");
-                                               writer.WriteAttributeString ("key", key);
-                                               writer.WriteEndElement ();
-                                       }
-                               }
+                       else {
+                               throw new NotImplementedException ();
                        }
-                       
-                       writer.WriteEndElement ();
-                       return sw.ToString ();
                }
 
-               [MonoTODO]
+               [ConfigurationProperty ("file", DefaultValue = "")]
                public string File {
-                       get { throw new NotImplementedException (); }
-                       set { throw new NotImplementedException (); }
+                       get { return (string)base [_propFile]; }
+                       set { base [_propFile] = value; }
+               }
+
+               [ConfigurationProperty ("", Options = ConfigurationPropertyOptions.IsDefaultCollection)]
+               public KeyValueConfigurationCollection Settings {
+                       get { return (KeyValueConfigurationCollection) base [_propSettings]; }
                }
 
-               public NameValueCollection Settings {
+               protected internal override ConfigurationPropertyCollection Properties {
                        get {
-                               if (values == null)
-                                       values = new ConfigNameValueCollection();
-                               return values;
+                               return _properties;
                        }
                }
+
+               protected internal override object 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