Quellcode durchsuchen

added new handler for machine.config

svn path=/trunk/mcs/; revision=14411
Gonzalo Paniagua Javier vor 22 Jahren
Ursprung
Commit
13c51db2b2

+ 5 - 0
mcs/class/System/System.Net.Configuration/ChangeLog

@@ -0,0 +1,5 @@
+2003-05-09  Gonzalo Paniagua Javier <[email protected]>
+
+	* ConnectionManagementHandler.cs: New file that handles
+	system.net/connectionManagement section.
+

+ 153 - 0
mcs/class/System/System.Net.Configuration/ConnectionManagementHandler.cs

@@ -0,0 +1,153 @@
+//
+// System.Net.Configuration.ConnectionManagementHandler
+//
+// Authors:
+//	Gonzalo Paniagua Javier ([email protected])
+//
+// (C) 2003 Ximian, Inc (http://www.ximian.com)
+//
+
+using System.Collections;
+using System.Configuration;
+using System.Xml;
+
+namespace System.Net.Configuration
+{
+	class ConnectionManagementData
+	{
+		Hashtable data; // key -> address, value -> maxconnections
+		
+		public ConnectionManagementData (object parent)
+		{
+			data = new Hashtable ();
+			if (parent != null && parent is ConnectionManagementData) {
+				ConnectionManagementData p = (ConnectionManagementData) parent;
+				foreach (string k in p.data.Keys)
+					data [k] = p.data [k];	
+			}
+		}
+
+		public void Add (string address, string nconns)
+		{
+			if (nconns == null || nconns == "")
+				nconns = "2";
+			// Adding duplicates works fine under MS, so...
+			data [address] = UInt32.Parse (nconns);
+		}
+
+		public void Remove (string address)
+		{
+			// Removing non-existent address is fine.
+			data.Remove (address);
+		}
+
+		public void Clear ()
+		{
+			data.Clear ();
+		}
+
+		public Hashtable Data {
+			get { return data; }
+		}
+	}
+
+	class ConnectionManagementHandler : IConfigurationSectionHandler
+	{
+		public virtual object Create (object parent, object configContext, XmlNode section)
+		{
+			ConnectionManagementData cmd = new ConnectionManagementData (parent);
+			
+			if (section.Attributes != null && section.Attributes.Count != 0)
+				HandlersUtil.ThrowException ("Unrecognized attribute", section);
+
+			XmlNodeList httpHandlers = section.ChildNodes;
+			foreach (XmlNode child in httpHandlers) {
+				XmlNodeType ntype = child.NodeType;
+				if (ntype == XmlNodeType.Whitespace || ntype == XmlNodeType.Comment)
+					continue;
+
+				if (ntype != XmlNodeType.Element)
+					HandlersUtil.ThrowException ("Only elements allowed", child);
+				
+				string name = child.Name;
+				if (name == "clear") {
+					if (child.Attributes != null && child.Attributes.Count != 0)
+						HandlersUtil.ThrowException ("Unrecognized attribute", child);
+
+					cmd.Clear ();
+					continue;
+				}
+
+				//LAMESPEC: the MS doc says that <remove name="..."/> but they throw an exception
+				// if you use that. "address" is correct.
+
+				string address = HandlersUtil.ExtractAttributeValue ("address", child);
+				if (name == "add") {
+					string maxcnc = HandlersUtil.ExtractAttributeValue ("maxconnection", child, true);
+					if (child.Attributes != null && child.Attributes.Count != 0)
+						HandlersUtil.ThrowException ("Unrecognized attribute", child);
+
+					cmd.Add (address, maxcnc);
+					continue;
+				}
+
+				if (name == "remove") {
+					if (child.Attributes != null && child.Attributes.Count != 0)
+						HandlersUtil.ThrowException ("Unrecognized attribute", child);
+
+					cmd.Remove (address);
+					continue;
+				}
+
+				HandlersUtil.ThrowException ("Unexpected element", child);
+			}
+
+			return cmd;
+		}
+	}
+
+	internal class HandlersUtil
+	{
+		private HandlersUtil ()
+		{
+		}
+
+		static internal string ExtractAttributeValue (string attKey, XmlNode node)
+		{
+			return ExtractAttributeValue (attKey, node, false);
+		}
+			
+		static internal string ExtractAttributeValue (string attKey, XmlNode node, bool optional)
+		{
+			if (node.Attributes == null) {
+				if (optional)
+					return null;
+
+				ThrowException ("Required attribute not found: " + attKey, node);
+			}
+
+			XmlNode att = node.Attributes.RemoveNamedItem (attKey);
+			if (att == null) {
+				if (optional)
+					return null;
+				ThrowException ("Required attribute not found: " + attKey, node);
+			}
+
+			string value = att.Value;
+			if (value == String.Empty) {
+				string opt = optional ? "Optional" : "Required";
+				ThrowException (opt + " attribute is empty: " + attKey, node);
+			}
+
+			return value;
+		}
+
+		static internal void ThrowException (string msg, XmlNode node)
+		{
+			if (node != null && node.Name != String.Empty)
+				msg = msg + " (node name: " + node.Name + ") ";
+			throw new ConfigurationException (msg, node);
+		}
+	}
+}
+

+ 1 - 0
mcs/class/System/list.unix

@@ -388,6 +388,7 @@ System.IO/WatcherChangeTypes.cs
 System.Net/AuthenticationManager.cs
 System.Net/Authorization.cs
 System.Net/ConnectionModes.cs
+System.Net.Configuration/ConnectionManagementHandler.cs
 System.Net/CookieCollection.cs
 System.Net/CookieContainer.cs
 System.Net/Cookie.cs