| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 | using System.Collections;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System;using System.Globalization;using System.Text.RegularExpressions;using System.Net;namespace Renci.SshNet{    /// <summary>    /// Collection of different extension method    /// </summary>    public static class Extensions    {        /// <summary>        /// Checks whether a collection is the same as another collection        /// </summary>        /// <param name="value">The current instance object</param>        /// <param name="compareList">The collection to compare with</param>        /// <param name="comparer">The comparer object to use to compare each item in the collection.  If null uses EqualityComparer(T).Default</param>        /// <returns>True if the two collections contain all the same items in the same order</returns>        internal static bool IsEqualTo<TSource>(this IEnumerable<TSource> value, IEnumerable<TSource> compareList, IEqualityComparer<TSource> comparer)        {            if (value == compareList)            {                return true;            }            else if (value == null || compareList == null)            {                return false;            }            else            {                if (comparer == null)                {                    comparer = EqualityComparer<TSource>.Default;                }                IEnumerator<TSource> enumerator1 = value.GetEnumerator();                IEnumerator<TSource> enumerator2 = compareList.GetEnumerator();                bool enum1HasValue = enumerator1.MoveNext();                bool enum2HasValue = enumerator2.MoveNext();                try                {                    while (enum1HasValue && enum2HasValue)                    {                        if (!comparer.Equals(enumerator1.Current, enumerator2.Current))                        {                            return false;                        }                        enum1HasValue = enumerator1.MoveNext();                        enum2HasValue = enumerator2.MoveNext();                    }                    return !(enum1HasValue || enum2HasValue);                }                finally                {                    if (enumerator1 != null) enumerator1.Dispose();                    if (enumerator2 != null) enumerator2.Dispose();                }            }        }        /// <summary>        /// Checks whether a collection is the same as another collection        /// </summary>        /// <param name="value">The current instance object</param>        /// <param name="compareList">The collection to compare with</param>        /// <returns>True if the two collections contain all the same items in the same order</returns>        internal static bool IsEqualTo<TSource>(this IEnumerable<TSource> value, IEnumerable<TSource> compareList)        {            return IsEqualTo(value, compareList, null);        }#if SILVERLIGHT#else        /// <summary>        /// Prints out         /// </summary>        /// <param name="bytes">The bytes.</param>        internal static void DebugPrint(this IEnumerable<byte> bytes)        {            foreach (var b in bytes)            {                Debug.Write(string.Format(CultureInfo.CurrentCulture, "0x{0:x2}, ", b));            }            Debug.WriteLine(string.Empty);        }#endif        /// <summary>        /// Trims the leading zero from bytes array.        /// </summary>        /// <param name="data">The data.</param>        /// <returns></returns>        internal static IEnumerable<byte> TrimLeadingZero(this IEnumerable<byte> data)        {            bool leadingZero = true;            foreach (var item in data)            {                if (item == 0 & leadingZero)                {                    continue;                }                else                {                    leadingZero = false;                }                yield return item;            }        }        /// <summary>        /// Creates an instance of the specified type using that type's default constructor.        /// </summary>        /// <typeparam name="T">The type to create.</typeparam>        /// <param name="type">Type of the instance to create.</param>        /// <returns>A reference to the newly created object.</returns>        internal static T CreateInstance<T>(this Type type) where T : class        {            if (type == null)                return null;            return Activator.CreateInstance(type) as T;        }        /// <summary>        /// Returns the specified 16-bit unsigned integer value as an array of bytes.        /// </summary>        /// <param name="value">The number to convert.</param>        /// <returns>An array of bytes with length 2.</returns>        internal static byte[] GetBytes(this UInt16 value)        {            return new byte[] { (byte)(value >> 8), (byte)(value & 0xFF) };        }        /// <summary>        /// Returns the specified 32-bit unsigned integer value as an array of bytes.        /// </summary>        /// <param name="value">The number to convert.</param>        /// <returns>An array of bytes with length 4.</returns>        internal static byte[] GetBytes(this UInt32 value)        {            return new byte[] { (byte)(value >> 24), (byte)(value >> 16), (byte)(value >> 8), (byte)(value & 0xFF) };        }        /// <summary>        /// Returns the specified 64-bit unsigned integer value as an array of bytes.        /// </summary>        /// <param name="value">The number to convert.</param>        /// <returns>An array of bytes with length 8.</returns>        internal static byte[] GetBytes(this UInt64 value)        {            return new byte[] { (byte)(value >> 56), (byte)(value >> 48), (byte)(value >> 40), (byte)(value >> 32), (byte)(value >> 24), (byte)(value >> 16), (byte)(value >> 8), (byte)(value & 0xFF) };        }        /// <summary>        /// Returns the specified 64-bit signed integer value as an array of bytes.        /// </summary>        /// <param name="value">The number to convert.</param>        /// <returns>An array of bytes with length 8.</returns>        internal static byte[] GetBytes(this Int64 value)        {            return new byte[] { (byte)(value >> 56), (byte)(value >> 48), (byte)(value >> 40), (byte)(value >> 32), (byte)(value >> 24), (byte)(value >> 16), (byte)(value >> 8), (byte)(value & 0xFF) };        }#if SILVERLIGHT        private static Regex _rehost = new Regex(@"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$|^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$", RegexOptions.IgnoreCase);        private static Regex _reIPv6 = new Regex(@"^(((?=(?>.*?::)(?!.*::)))(::)?([0-9A-F]{1,4}::?){0,5}|([0-9A-F]{1,4}:){6})(\2([0-9A-F]{1,4}(::?|$)){0,2}|((25[0-5]|(2[0-4]|1\d|[1-9])?\d)(\.|$)){4}|[0-9A-F]{1,4}:[0-9A-F]{1,4})(?<![^:]:|\.)\z", RegexOptions.IgnoreCase);#else        private static Regex _rehost = new Regex(@"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$|^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$", RegexOptions.IgnoreCase | RegexOptions.Compiled);        private static Regex _reIPv6 = new Regex(@"^(((?=(?>.*?::)(?!.*::)))(::)?([0-9A-F]{1,4}::?){0,5}|([0-9A-F]{1,4}:){6})(\2([0-9A-F]{1,4}(::?|$)){0,2}|((25[0-5]|(2[0-4]|1\d|[1-9])?\d)(\.|$)){4}|[0-9A-F]{1,4}:[0-9A-F]{1,4})(?<![^:]:|\.)\z", RegexOptions.IgnoreCase | RegexOptions.Compiled);#endif        internal static bool IsValidHost(this string value)        {            if (value == null)                return false;            if (_rehost.Match(value).Success)                return true;            if (_reIPv6.Match(value).Success)                return true;            return false;        }        internal static bool IsValidPort(this uint value)        {            if (value < IPEndPoint.MinPort)                return false;            if (value > IPEndPoint.MaxPort)                return false;            return true;        }        internal static bool IsValidPort(this int value)        {            if (value < IPEndPoint.MinPort)                return false;            if (value > IPEndPoint.MaxPort)                return false;            return true;        }    }}
 |