public void TestConvertXmlDocument() { StringBuilder xml = new StringBuilder(); xml.Append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>"); xml.Append("<!--document comment-->"); xml.Append("<root>"); xml.Append("<child1 a1=\"val1\" a2=\"val2\">"); xml.Append("<!--first comment-->"); xml.Append("child1 value"); xml.Append("<!--second comment-->"); xml.Append("</child1>"); xml.Append("<child2>"); xml.Append("<![CDATA[cdata value ]]>"); xml.Append("child2 value"); xml.Append("</child2>"); xml.Append("</root>"); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xml.ToString()); Assert.IsNotNull(xmlDoc); IXmlDocument convXmlDoc = XmlHelper.ConvertDocument(xmlDoc); Assert.IsNotNull(convXmlDoc); Assert.AreEqual(convXmlDoc.Encoding, "utf-8"); Assert.IsNull(convXmlDoc.DtdName); Assert.IsNull(convXmlDoc.DtdUri); Assert.AreEqual(convXmlDoc.DocumentComment, "document comment"); Assert.AreEqual(convXmlDoc.Name, "root"); Assert.AreEqual(convXmlDoc.ElementList.Count, 2); IXmlElement child1 = convXmlDoc.GetElement("child1"); Assert.IsNotNull(child1); Assert.AreEqual(child1.Attributes.Count, 2); Assert.IsTrue(child1.Attributes.Contains("a1")); Assert.AreEqual(child1.GetAttribute("a1").GetString(), "val1"); Assert.IsTrue(child1.Attributes.Contains("a2")); Assert.AreEqual(child1.GetAttribute("a2").GetString(), "val2"); Assert.AreEqual(child1.GetString(), "child1 value"); Assert.AreEqual(child1.Comment, "first comment\nsecond comment"); IXmlElement child2 = convXmlDoc.GetElement("child2"); Assert.IsNotNull(child2); Assert.AreEqual(child2.Attributes.Count, 0); Assert.AreEqual(child2.GetString(), "cdata value child2 value"); Assert.IsTrue(child2.Comment.Length == 0); }
/// <summary> /// Parse the given <b>IXmlElement</b> as a local <b>IPEndPoint</b>. /// </summary> /// <remarks> /// If the specified <b>IXmlElement</b> contains an empty address, /// <c>null</c> is returned. /// </remarks> /// <param name="xml"> /// The <b>IXmlElement</b> to parse. /// </param> /// <returns> /// A new <b>IPEndPoint</b> representing the contents of the given /// <b>XmlNode</b>. /// </returns> protected static IPEndPoint ParseLocalSocketAddress(IXmlElement xml) { IXmlElement xmlAddr = xml.GetElement("address"); IXmlElement xmlPort = xml.GetElement("port"); String sAddressFamiliy = xml.GetSafeElement("address-family").GetString( "InterNetwork"); if (xmlAddr == null && xmlPort == null) { return(null); } string addr = xmlAddr == null ? "localhost" : xmlAddr.GetString(); int port = xmlPort == null ? 0 : xmlPort.GetInt(); NetworkUtils.PreferredAddressFamily = (AddressFamily) Enum.Parse(typeof(AddressFamily), sAddressFamiliy); IPAddress ipAddress; try { ipAddress = addr.Equals("localhost") ? NetworkUtils.GetLocalHostAddress() : NetworkUtils.GetHostAddress(addr); } catch (Exception e) { throw new Exception("The \"" + xml.Name + "\" configuration " + "element contains an invalid \"address\" element", e); } try { return(new IPEndPoint(ipAddress, port)); } catch (Exception e) { throw new Exception("The \"" + xml.Name + "\" configuration " + "element contains an invalid \"port\" element", e); } }
/// <summary> /// Configure the controllable service. /// </summary> /// <remarks> /// <p/> /// This method can only be called before the controllable service /// is started. /// </remarks> /// <param name="xml"> /// An <see cref="IXmlElement"/> carrying configuration information /// specific to the IControllable object. /// </param> /// <exception cref="InvalidOperationException"> /// Thrown if the service is already running. /// </exception> /// <exception cref="ArgumentException"> /// Thrown if the configuration information is invalid. /// </exception> public override void Configure(IXmlElement xml) { lock (this) { base.Configure(xml); if (xml == null) { return; } // <tcp-initiator> IXmlElement xmlCat = xml.GetSafeElement("tcp-initiator"); // <stream-provider/> IXmlElement xmlSub = xmlCat.GetSafeElement("stream-provider"); StreamProvider = StreamProviderFactory.CreateProvider(xmlSub); // <local-address> xmlSub = xmlCat.GetSafeElement("local-address"); // <address> // <port> LocalAddress = ParseLocalSocketAddress(xmlSub); // <reusable> IsLocalAddressReusable = xmlSub.GetSafeElement("reusable"). GetBoolean(IsLocalAddressReusable); // <remote-addresses> bool isNameService = false; xmlSub = xmlCat.GetElement("name-service-addresses"); if (xmlSub == null) { xmlSub = xmlCat.GetSafeElement("remote-addresses"); } else { isNameService = true; } IAddressProviderFactory factory; IXmlElement xmlProvider = xmlSub.GetElement("address-provider"); bool missing = xmlProvider == null; bool empty = !missing && xmlProvider.IsEmpty; if (empty || missing) { ConfigurableAddressProviderFactory factoryImpl = new ConfigurableAddressProviderFactory(); factoryImpl.Config = missing ? xmlSub : xmlProvider; factory = factoryImpl; } else { String name = xmlProvider.GetString(); factory = (IAddressProviderFactory) OperationalContext.AddressProviderMap[name]; if (factory == null) { throw new ArgumentException("Address provider " + name + " not found."); } } RemoteAddressProvider = factory.CreateAddressProvider(); if (RemoteAddressProvider is ConfigurableAddressProvider && ConnectTimeout > 0) { ((ConfigurableAddressProvider)RemoteAddressProvider).RequestTimeout = ConnectTimeout; } IsNameService = isNameService; if (isNameService) { Subport = (int)WellKnownSubPorts.NameService; } else { Subport = -1; } // <reuse-address> IsLocalAddressReusable = xmlCat.GetSafeElement("reuse-address"). GetBoolean(IsLocalAddressReusable); // <keep-alive-enabled/> IsKeepAliveEnabled = xmlCat.GetSafeElement("keep-alive-enabled") . GetBoolean(IsKeepAliveEnabled); // <tcp-delay-enabled> IsTcpDelayEnabled = xmlCat.GetSafeElement("tcp-delay-enabled"). GetBoolean(IsTcpDelayEnabled); // <receive-buffer-size> ReceiveBufferSize = ParseMemorySize( xmlCat, "receive-buffer-size", ReceiveBufferSize); // <send-buffer-size> SendBufferSize = ParseMemorySize( xmlCat, "send-buffer-size", SendBufferSize); // <linger-timeout> LingerTimeout = ParseTime( xmlCat, "linger-timeout", LingerTimeout); } }