#region Copyright & License // // Copyright 2001-2005 The Apache Software Foundation // // Licensed under the Apache License',' Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing',' software // distributed under the License is distributed on an "AS IS" BASIS',' // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND',' either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #endregion using System; using System.Net; namespace log4net.Util.TypeConverters { /// /// Supports conversion from string to type. /// /// /// /// Supports conversion from string to type. /// /// /// /// /// Nicko Cadell internal class IPAddressConverter : IConvertFrom { #region Implementation of IConvertFrom /// /// Can the source type be converted to the type supported by this object /// /// the type to convert /// true if the conversion is possible /// /// /// Returns true if the is /// the type. /// /// public bool CanConvertFrom(Type sourceType) { return (sourceType == typeof(string)); } /// /// Overrides the ConvertFrom method of IConvertFrom. /// /// the object to convert to an IPAddress /// the IPAddress /// /// /// Uses the method to convert the /// argument to an . /// If that fails then the string is resolved as a DNS hostname. /// /// /// /// The object cannot be converted to the /// target type. To check for this condition use the /// method. /// public object ConvertFrom(object source) { string str = source as string; if (str != null && str.Length > 0) { try { #if NET_2_0 // Try to resolve via DNS. This is a blocking call. // GetHostEntry works with either an IPAddress string or a host name IPHostEntry host = Dns.GetHostEntry(str); if (host != null && host.AddressList != null && host.AddressList.Length > 0 && host.AddressList[0] != null) { return host.AddressList[0]; } #else // Before .NET 2 we need to try to parse the IPAddress from the string first // Check if the string only contains IP address valid chars if (str.Trim(validIpAddressChars).Length == 0) { try { // try to parse the string as an IP address return IPAddress.Parse(str); } catch(FormatException) { // Ignore a FormatException, try to resolve via DNS } } // Try to resolve via DNS. This is a blocking call. IPHostEntry host = Dns.GetHostByName(str); if (host != null && host.AddressList != null && host.AddressList.Length > 0 && host.AddressList[0] != null) { return host.AddressList[0]; } #endif } catch(Exception ex) { throw ConversionNotSupportedException.Create(typeof(IPAddress), source, ex); } } throw ConversionNotSupportedException.Create(typeof(IPAddress), source); } #endregion /// /// Valid characters in an IPv4 or IPv6 address string. (Does not support subnets) /// private static readonly char[] validIpAddressChars = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','A','B','C','D','E','F','x','X','.',':','%'}; } }