//
// 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
#if NET_2_0
using System;
+using System.ComponentModel;
using System.Collections.Specialized;
using System.Xml;
using System.IO;
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