2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / System / System.Configuration / AppSettingsSection.cs
1 //
2 // System.Configuration.AppSettingsSection.cs
3 //
4 // Authors:
5 //      Duncan Mak (duncan@ximian.com)
6 //
7 // Permission is hereby granted, free of charge, to any person obtaining
8 // a copy of this software and associated documentation files (the
9 // "Software"), to deal in the Software without restriction, including
10 // without limitation the rights to use, copy, modify, merge, publish,
11 // distribute, sublicense, and/or sell copies of the Software, and to
12 // permit persons to whom the Software is furnished to do so, subject to
13 // the following conditions:
14 // 
15 // The above copyright notice and this permission notice shall be
16 // included in all copies or substantial portions of the Software.
17 // 
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 //
26 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
27 //
28
29 #if NET_2_0 && XML_DEP
30 #if XML_DEP
31 using System;
32 using System.Collections.Specialized;
33 using System.Xml;
34 using System.IO;
35
36 namespace System.Configuration {
37
38         public sealed class AppSettingsSection : ConfigurationSection
39         {
40                 ConfigNameValueCollection values;
41                 bool hasClear;
42                 
43                 public AppSettingsSection ()
44                 {
45                 }
46
47                 protected internal override  bool IsModified ()
48                 {
49                         return values != null && values.IsModified;
50                 }
51
52                 [MonoTODO ("Read file attribute")]
53                 protected internal override void ReadXml (XmlReader reader, object context)
54                 {
55                         XmlDocument doc = new XmlDocument ();
56                         XmlNode data = doc.ReadNode (reader);
57                         hasClear = ((XmlElement)data)["clear"] != null;
58                         values = ConfigHelper.GetNameValueCollection (values, data, "key", "value");
59                 }
60
61                 protected internal override void Reset (ConfigurationElement parentSection, object context)
62                 {
63                         AppSettingsSection sec = parentSection as AppSettingsSection;
64                         if (sec != null && sec.values != null)
65                                 values = new ConfigNameValueCollection (sec.values);
66                         else
67                                 values = null;
68                 }
69
70                 protected internal override void ResetModified ()
71                 {
72                         if (values != null) values.ResetModified ();
73                 }
74
75                 protected internal override string WriteXml (
76                         ConfigurationElement parent, object context, string name, ConfigurationUpdateMode mode)
77                 {
78                         AppSettingsSection sec = parent as AppSettingsSection;
79                         NameValueCollection parentValues = sec != null && !hasClear ? sec.Settings : null;
80                         
81                         StringWriter sw = new StringWriter ();
82                         XmlTextWriter writer = new XmlTextWriter (sw);
83                         writer.WriteStartElement ("appSettings");
84                         
85                         if (hasClear) {
86                                 writer.WriteStartElement ("clear");
87                                 writer.WriteEndElement ();
88                         }
89                         
90                         foreach (string key in values) {
91                                 string val = values [key];
92                                 string parentVal = parentValues != null ? parentValues [key] : null;
93                                 if (parentVal != val) {
94                                         writer.WriteStartElement ("add");
95                                         writer.WriteAttributeString ("key", key);
96                                         writer.WriteAttributeString ("value", val);
97                                         writer.WriteEndElement ();
98                                 }
99                         }
100                         
101                         if (parentValues != null) {
102                                 foreach (string key in parentValues) {
103                                         if (values [key] == null) {
104                                                 writer.WriteStartElement ("remove");
105                                                 writer.WriteAttributeString ("key", key);
106                                                 writer.WriteEndElement ();
107                                         }
108                                 }
109                         }
110                         
111                         writer.WriteEndElement ();
112                         return sw.ToString ();
113                 }
114
115                 [MonoTODO]
116                 public string File {
117                         get { throw new NotImplementedException (); }
118                         set { throw new NotImplementedException (); }
119                 }
120
121                 public NameValueCollection Settings {
122                         get {
123                                 if (values == null)
124                                         values = new ConfigNameValueCollection();
125                                 return values;
126                         }
127                 }
128         }
129 }
130 #endif
131 #endif