-
Notifications
You must be signed in to change notification settings - Fork 1
/
XmlSettingsProvider.cs
116 lines (112 loc) · 4.27 KB
/
XmlSettingsProvider.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
using System;
using System.Configuration;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
namespace Sharp.Utils.Wpf
{
/// <summary>
/// A FileSettingProvider that stores settings in XML format.
/// </summary>
public class XmlSettingsProvider : FileSettingsProvider
{
/// <summary>
/// Gets the provider name.
/// </summary>
public override string Name
{
get { return "XmlSettingsProvider"; }
}
/// <summary>
/// Gets the property values from storage.
/// </summary>
/// <param name="context">The settings context.</param>
/// <param name="collection">A collection containing the names of the settings to get.</param>
/// <returns>A collection containing the setting values.</returns>
public override SettingsPropertyValueCollection GetPropertyValues(SettingsContext context, SettingsPropertyCollection collection)
{
var values = new SettingsPropertyValueCollection();
XDocument doc = null;
try
{
doc = XDocument.Load(Location);
}
catch
{
doc = new XDocument(new XElement("Settings"));
}
var root = doc.Element("Settings") ?? new XElement("Settings");
foreach (SettingsProperty setting in collection)
{
SettingsPropertyValue val = new SettingsPropertyValue(setting);
try
{
var elem = root.Element(setting.Name);
if (elem == null || elem.IsEmpty)
{
val.SerializedValue = setting.DefaultValue;
}
else if (setting.SerializeAs == SettingsSerializeAs.Xml)
{
val.SerializedValue = @"<?xml version=""1.0"" encoding=""utf-16""?>" + elem.FirstNode.ToString();
}
else
{
using (var reader = XmlReader.Create(new StringReader(elem.ToString())))
{
reader.MoveToContent();
val.SerializedValue = reader.ReadElementContentAsString();
}
}
}
catch
{
val.SerializedValue = setting.DefaultValue;
}
values.Add(val);
}
return values;
}
/// <summary>
/// Saves the settings to file.
/// </summary>
/// <param name="context">The settings context.</param>
/// <param name="collection">A collection containing the setting values.</param>
public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection collection)
{
var dir = Path.GetDirectoryName(Location);
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
using (var writer = new XmlTextWriter(Location, Encoding.UTF8))
{
writer.WriteStartDocument();
writer.WriteStartElement("Settings");
foreach (SettingsPropertyValue setting in collection)
{
if (setting.UsingDefaultValue)
continue;
writer.WriteStartElement(setting.Name);
if (setting.Property.SerializeAs == SettingsSerializeAs.Xml)
{
var rawXml = setting.SerializedValue.ToString();
var xmlDeclaration = new Regex(@"^<\? *xml.*\?>");
rawXml = xmlDeclaration.Replace(rawXml, string.Empty).Trim('\r', '\n');
writer.WriteRaw(rawXml);
}
else
{
writer.WriteString(setting.SerializedValue.ToString());
}
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.Flush();
}
}
}
}