Xamarin Public Jenkins (auto-signing) 6bdd276d05 Imported Upstream version 5.0.0.42
Former-commit-id: fd56571888259555122d8a0f58c68838229cea2b
2017-04-10 11:41:01 +00:00

248 lines
6.3 KiB
C#

//
// System.Configuration.ConfigHelper
//
// Authors:
// Gonzalo Paniagua Javier (gonzalo@ximian.com)
//
// (C) 2002 Ximian, Inc (http://www.ximian.com)
//
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
using System.Collections;
using System.Collections.Specialized;
#if (XML_DEP)
using System.Xml;
#endif
#pragma warning disable 618
namespace System.Configuration
{
class ConfigHelper
{
class CollectionWrapper
{
IDictionary dict;
NameValueCollection collection;
bool isDict;
public CollectionWrapper (IDictionary dict)
{
this.dict = dict;
isDict = true;
}
public CollectionWrapper (NameValueCollection collection)
{
this.collection = collection;
isDict = false;
}
public void Remove (string s)
{
if (isDict)
dict.Remove (s);
else
collection.Remove (s);
}
public void Clear ()
{
if (isDict)
dict.Clear ();
else
collection.Clear ();
}
public string this [string key]
{
set {
if (isDict)
dict [key] = value;
else
collection [key] = value;
}
}
public object UnWrap ()
{
if (isDict)
return dict;
else
return collection;
}
}
#if (XML_DEP)
internal static IDictionary GetDictionary (IDictionary prev,
XmlNode region,
string nameAtt,
string valueAtt)
{
Hashtable hash;
if (prev == null)
hash = new Hashtable (CaseInsensitiveHashCodeProvider.Default,
CaseInsensitiveComparer.Default);
else {
Hashtable aux = (Hashtable) prev;
hash = (Hashtable) aux.Clone ();
}
CollectionWrapper result = new CollectionWrapper (hash);
result = GoGetThem (result, region, nameAtt, valueAtt);
if (result == null)
return null;
return result.UnWrap () as IDictionary;
}
internal static ConfigNameValueCollection GetNameValueCollection (NameValueCollection prev,
XmlNode region,
string nameAtt,
string valueAtt)
{
ConfigNameValueCollection coll =
new ConfigNameValueCollection (CaseInsensitiveHashCodeProvider.Default,
CaseInsensitiveComparer.Default);
if (prev != null)
coll.Add (prev);
CollectionWrapper result = new CollectionWrapper (coll);
result = GoGetThem (result, region, nameAtt, valueAtt);
if (result == null)
return null;
return result.UnWrap () as ConfigNameValueCollection;
}
private static CollectionWrapper GoGetThem (CollectionWrapper result,
XmlNode region,
string nameAtt,
string valueAtt)
{
if (region.Attributes != null && region.Attributes.Count != 0) {
if (region.Attributes.Count != 1 || region.Attributes[0].Name != "xmlns") {
throw new ConfigurationException ("Unknown attribute", region);
}
}
XmlNode keyNode;
XmlNode valueNode;
XmlNodeList childs = region.ChildNodes;
foreach (XmlNode node in childs) {
XmlNodeType ntype = node.NodeType;
if (ntype == XmlNodeType.Whitespace || ntype == XmlNodeType.Comment)
continue;
if (ntype != XmlNodeType.Element)
throw new ConfigurationException ("Only XmlElement allowed", node);
string nodeName = node.Name;
if (nodeName == "clear") {
if (node.Attributes != null && node.Attributes.Count != 0)
throw new ConfigurationException ("Unknown attribute", node);
result.Clear ();
} else if (nodeName == "remove") {
keyNode = null;
if (node.Attributes != null)
keyNode = node.Attributes.RemoveNamedItem (nameAtt);
if (keyNode == null)
throw new ConfigurationException ("Required attribute not found",
node);
if (keyNode.Value == String.Empty)
throw new ConfigurationException ("Required attribute is empty",
node);
if (node.Attributes.Count != 0)
throw new ConfigurationException ("Unknown attribute", node);
result.Remove (keyNode.Value);
} else if (nodeName == "add") {
keyNode = null;
if (node.Attributes != null)
keyNode = node.Attributes.RemoveNamedItem (nameAtt);
if (keyNode == null)
throw new ConfigurationException ("Required attribute not found",
node);
if (keyNode.Value == String.Empty)
throw new ConfigurationException ("Required attribute is empty",
node);
valueNode = node.Attributes.RemoveNamedItem (valueAtt);
if (valueNode == null)
throw new ConfigurationException ("Required attribute not found",
node);
if (node.Attributes.Count != 0)
throw new ConfigurationException ("Unknown attribute", node);
result [keyNode.Value] = valueNode.Value;
} else {
throw new ConfigurationException ("Unknown element", node);
}
}
return result;
}
#endif
}
internal class ConfigNameValueCollection: NameValueCollection
{
bool modified;
public ConfigNameValueCollection ()
{
}
public ConfigNameValueCollection (ConfigNameValueCollection col)
: base (col.Count, col)
{
}
public ConfigNameValueCollection (IHashCodeProvider hashProvider, IComparer comparer)
: base(hashProvider, comparer)
{
}
public void ResetModified ()
{
modified = false;
}
public bool IsModified {
get { return modified; }
}
public override void Set (string name, string value)
{
base.Set (name, value);
modified = true;
}
}
}