aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/Extensions.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/Extensions.cs')
-rw-r--r--Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/Extensions.cs696
1 files changed, 696 insertions, 0 deletions
diff --git a/Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/Extensions.cs b/Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/Extensions.cs
new file mode 100644
index 000000000..1716adef7
--- /dev/null
+++ b/Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/Extensions.cs
@@ -0,0 +1,696 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Reflection;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading;
+using System.Threading.Tasks;
+//using Windows.Networking;
+//using Windows.Networking.Sockets;
+
+namespace SharpCifs.Util.Sharpen
+{
+
+
+ public static class Extensions
+ {
+ private static readonly long EpochTicks;
+
+ static Extensions()
+ {
+ DateTime time = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
+ EpochTicks = time.Ticks;
+ }
+
+ public static void Add<T>(this IList<T> list, int index, T item)
+ {
+ list.Insert(index, item);
+ }
+
+ public static void AddFirst<T>(this IList<T> list, T item)
+ {
+ list.Insert(0, item);
+ }
+
+ public static void AddLast<T>(this IList<T> list, T item)
+ {
+ list.Add(item);
+ }
+
+ public static void RemoveLast<T>(this IList<T> list)
+ {
+ if (list.Count > 0)
+ list.Remove(list.Count - 1);
+ }
+
+ public static StringBuilder AppendRange(this StringBuilder sb, string str, int start, int end)
+ {
+ return sb.Append(str, start, end - start);
+ }
+
+ public static StringBuilder Delete(this StringBuilder sb, int start, int end)
+ {
+ return sb.Remove(start, end - start);
+ }
+
+ public static void SetCharAt(this StringBuilder sb, int index, char c)
+ {
+ sb[index] = c;
+ }
+
+ public static int IndexOf(this StringBuilder sb, string str)
+ {
+ return sb.ToString().IndexOf(str);
+ }
+
+ public static int BitCount(int val)
+ {
+ uint num = (uint)val;
+ int count = 0;
+ for (int i = 0; i < 32; i++)
+ {
+ if ((num & 1) != 0)
+ {
+ count++;
+ }
+ num >>= 1;
+ }
+ return count;
+ }
+
+ public static IndexOutOfRangeException CreateIndexOutOfRangeException(int index)
+ {
+ return new IndexOutOfRangeException("Index: " + index);
+ }
+
+ public static string Decode(this Encoding e, byte[] chars, int start, int len)
+ {
+ try
+ {
+ byte[] bom = e.GetPreamble();
+ if (bom != null && bom.Length > 0)
+ {
+ if (len >= bom.Length)
+ {
+ int pos = start;
+ bool hasBom = true;
+ for (int n = 0; n < bom.Length && hasBom; n++)
+ {
+ if (bom[n] != chars[pos++])
+ hasBom = false;
+ }
+ if (hasBom)
+ {
+ len -= pos - start;
+ start = pos;
+ }
+ }
+ }
+ return e.GetString(chars, start, len);
+ }
+ catch (DecoderFallbackException)
+ {
+ throw new CharacterCodingException();
+ }
+ }
+
+
+
+ public static Encoding GetEncoding(string name)
+ {
+ // Encoding e = Encoding.GetEncoding (name, EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback);
+ try
+ {
+
+ Encoding e = Encoding.GetEncoding(name.Replace('_', '-'));
+ if (e is UTF8Encoding)
+ return new UTF8Encoding(false, true);
+
+ return e;
+ }
+ catch (ArgumentException)
+ {
+ throw new UnsupportedCharsetException(name);
+ }
+ }
+
+ public static ICollection<KeyValuePair<T, TU>> EntrySet<T, TU>(this IDictionary<T, TU> s)
+ {
+ return s;
+ }
+
+
+ public static bool AddItem<T>(this IList<T> list, T item)
+ {
+ list.Add(item);
+ return true;
+ }
+
+ public static bool AddItem<T>(this ICollection<T> list, T item)
+ {
+ list.Add(item);
+ return true;
+ }
+
+ public static TU Get<T, TU>(this IDictionary<T, TU> d, T key)
+ {
+ TU val;
+ d.TryGetValue(key, out val);
+ return val;
+ }
+
+
+ public static TU Put<T, TU>(this IDictionary<T, TU> d, T key, TU value)
+ {
+ TU old;
+ d.TryGetValue(key, out old);
+ d[key] = value;
+ return old;
+ }
+
+ public static void PutAll<T, TU>(this IDictionary<T, TU> d, IDictionary<T, TU> values)
+ {
+ foreach (KeyValuePair<T, TU> val in values)
+ d[val.Key] = val.Value;
+ }
+
+
+ public static CultureInfo GetEnglishCulture()
+ {
+ return new CultureInfo("en-US");
+ }
+
+ public static T GetFirst<T>(this IList<T> list)
+ {
+ return ((list.Count == 0) ? default(T) : list[0]);
+ }
+
+ public static CultureInfo GetGermanCulture()
+ {
+ CultureInfo r = new CultureInfo("de-DE");
+ return r;
+ }
+
+ public static T GetLast<T>(this IList<T> list)
+ {
+ return ((list.Count == 0) ? default(T) : list[list.Count - 1]);
+ }
+
+ public static int GetOffset(this TimeZoneInfo tzone, long date)
+ {
+ return (int)tzone.GetUtcOffset(MillisToDateTimeOffset(date, 0).DateTime).TotalMilliseconds;
+ }
+
+ public static long GetTime(this DateTime dateTime)
+ {
+ return new DateTimeOffset(DateTime.SpecifyKind(dateTime, DateTimeKind.Utc), TimeSpan.Zero).ToMillisecondsSinceEpoch();
+ }
+
+ public static void InitCause(this Exception ex, Exception cause)
+ {
+ Console.WriteLine(cause);
+ }
+
+ public static bool IsEmpty<T>(this ICollection<T> col)
+ {
+ return (col.Count == 0);
+ }
+
+ public static bool IsEmpty<T>(this Stack<T> col)
+ {
+ return (col.Count == 0);
+ }
+
+ public static bool IsLower(this char c)
+ {
+ return char.IsLower(c);
+ }
+
+ public static bool IsUpper(this char c)
+ {
+ return char.IsUpper(c);
+ }
+
+ public static Iterator<T> Iterator<T>(this ICollection<T> col)
+ {
+ return new EnumeratorWrapper<T>(col, col.GetEnumerator());
+ }
+
+ public static Iterator<T> Iterator<T>(this IEnumerable<T> col)
+ {
+ return new EnumeratorWrapper<T>(col, col.GetEnumerator());
+ }
+
+ public static T Last<T>(this ICollection<T> col)
+ {
+ IList<T> list = col as IList<T>;
+ if (list != null)
+ {
+ return list[list.Count - 1];
+ }
+ return col.Last();
+ }
+
+ public static int LowestOneBit(int val)
+ {
+ return (1 << NumberOfTrailingZeros(val));
+ }
+
+ public static bool Matches(this string str, string regex)
+ {
+ Regex regex2 = new Regex(regex);
+ return regex2.IsMatch(str);
+ }
+
+ public static DateTime CreateDate(long milliSecondsSinceEpoch)
+ {
+ long num = EpochTicks + (milliSecondsSinceEpoch * 10000);
+ return new DateTime(num);
+ }
+
+ public static DateTime CreateDateFromUTC(long milliSecondsSinceEpoch)
+ {
+ long num = EpochTicks + (milliSecondsSinceEpoch * 10000);
+ return new DateTime(num, DateTimeKind.Utc);
+ }
+
+
+ public static DateTimeOffset MillisToDateTimeOffset(long milliSecondsSinceEpoch, long offsetMinutes)
+ {
+ TimeSpan offset = TimeSpan.FromMinutes(offsetMinutes);
+ long num = EpochTicks + (milliSecondsSinceEpoch * 10000);
+ return new DateTimeOffset(num + offset.Ticks, offset);
+ }
+
+ public static int NumberOfLeadingZeros(int val)
+ {
+ uint num = (uint)val;
+ int count = 0;
+ while ((num & 0x80000000) == 0)
+ {
+ num = num << 1;
+ count++;
+ }
+ return count;
+ }
+
+ public static int NumberOfTrailingZeros(int val)
+ {
+ uint num = (uint)val;
+ int count = 0;
+ while ((num & 1) == 0)
+ {
+ num = num >> 1;
+ count++;
+ }
+ return count;
+ }
+
+ public static int Read(this StreamReader reader, char[] data)
+ {
+ return reader.Read(data, 0, data.Length);
+ }
+
+ public static T Remove<T>(this IList<T> list, T item)
+ {
+ int index = list.IndexOf(item);
+ if (index == -1)
+ {
+ return default(T);
+ }
+ T local = list[index];
+ list.RemoveAt(index);
+ return local;
+ }
+
+ public static T Remove<T>(this IList<T> list, int i)
+ {
+ T old;
+ try
+ {
+ old = list[i];
+ list.RemoveAt(i);
+ }
+ catch (IndexOutOfRangeException)
+ {
+ throw new NoSuchElementException();
+ }
+ return old;
+ }
+
+ public static T RemoveFirst<T>(this IList<T> list)
+ {
+ return list.Remove(0);
+ }
+
+ public static string ReplaceAll(this string str, string regex, string replacement)
+ {
+ Regex rgx = new Regex(regex);
+
+ if (replacement.IndexOfAny(new[] { '\\', '$' }) != -1)
+ {
+ // Back references not yet supported
+ StringBuilder sb = new StringBuilder();
+ for (int n = 0; n < replacement.Length; n++)
+ {
+ char c = replacement[n];
+ if (c == '$')
+ throw new NotSupportedException("Back references not supported");
+ if (c == '\\')
+ c = replacement[++n];
+ sb.Append(c);
+ }
+ replacement = sb.ToString();
+ }
+
+ return rgx.Replace(str, replacement);
+ }
+
+ public static bool RegionMatches(this string str, bool ignoreCase, int toOffset, string other, int ooffset, int len)
+ {
+ if (toOffset < 0 || ooffset < 0 || toOffset + len > str.Length || ooffset + len > other.Length)
+ return false;
+ return string.Compare(str, toOffset, other, ooffset, len) == 0;
+ }
+
+ public static T Set<T>(this IList<T> list, int index, T item)
+ {
+ T old = list[index];
+ list[index] = item;
+ return old;
+ }
+
+ public static int Signum(long val)
+ {
+ if (val < 0)
+ {
+ return -1;
+ }
+ if (val > 0)
+ {
+ return 1;
+ }
+ return 0;
+ }
+
+ public static void RemoveAll<T, TU>(this ICollection<T> col, ICollection<TU> items) where TU : T
+ {
+ foreach (var u in items)
+ col.Remove(u);
+ }
+
+ public static bool ContainsAll<T, TU>(this ICollection<T> col, ICollection<TU> items) where TU : T
+ {
+ foreach (var u in items)
+ if (!col.Any(n => (ReferenceEquals(n, u)) || n.Equals(u)))
+ return false;
+ return true;
+ }
+
+ public static bool Contains<T>(this ICollection<T> col, object item)
+ {
+ if (!(item is T))
+ return false;
+ return col.Any(n => (ReferenceEquals(n, item)) || n.Equals(item));
+ }
+
+ public static void Sort<T>(this IList<T> list)
+ {
+ List<T> sorted = new List<T>(list);
+ sorted.Sort();
+ for (int i = 0; i < list.Count; i++)
+ {
+ list[i] = sorted[i];
+ }
+ }
+
+ public static void Sort<T>(this IList<T> list, IComparer<T> comparer)
+ {
+ List<T> sorted = new List<T>(list);
+ sorted.Sort(comparer);
+ for (int i = 0; i < list.Count; i++)
+ {
+ list[i] = sorted[i];
+ }
+ }
+
+ public static string[] Split(this string str, string regex)
+ {
+ return str.Split(regex, 0);
+ }
+
+ public static string[] Split(this string str, string regex, int limit)
+ {
+ Regex rgx = new Regex(regex);
+ List<string> list = new List<string>();
+ int startIndex = 0;
+ if (limit != 1)
+ {
+ int nm = 1;
+ foreach (Match match in rgx.Matches(str))
+ {
+ list.Add(str.Substring(startIndex, match.Index - startIndex));
+ startIndex = match.Index + match.Length;
+ if (limit > 0 && ++nm == limit)
+ break;
+ }
+ }
+ if (startIndex < str.Length)
+ {
+ list.Add(str.Substring(startIndex));
+ }
+ if (limit >= 0)
+ {
+ int count = list.Count - 1;
+ while ((count >= 0) && (list[count].Length == 0))
+ {
+ count--;
+ }
+ list.RemoveRange(count + 1, (list.Count - count) - 1);
+ }
+ return list.ToArray();
+ }
+
+ public static IList<T> SubList<T>(this IList<T> list, int start, int len)
+ {
+ List<T> sublist = new List<T>(len);
+ for (int i = start; i < (start + len); i++)
+ {
+ sublist.Add(list[i]);
+ }
+ return sublist;
+ }
+
+ public static char[] ToCharArray(this string str)
+ {
+ char[] destination = new char[str.Length];
+ str.CopyTo(0, destination, 0, str.Length);
+ return destination;
+ }
+
+ public static long ToMillisecondsSinceEpoch(this DateTime dateTime)
+ {
+ if (dateTime.Kind != DateTimeKind.Utc)
+ {
+ throw new ArgumentException("dateTime is expected to be expressed as a UTC DateTime", "dateTime");
+ }
+ return new DateTimeOffset(DateTime.SpecifyKind(dateTime, DateTimeKind.Utc), TimeSpan.Zero).ToMillisecondsSinceEpoch();
+ }
+
+ public static long ToMillisecondsSinceEpoch(this DateTimeOffset dateTimeOffset)
+ {
+ return (((dateTimeOffset.Ticks - dateTimeOffset.Offset.Ticks) - EpochTicks) / TimeSpan.TicksPerMillisecond);
+ }
+
+ public static string ToOctalString(int val)
+ {
+ return Convert.ToString(val, 8);
+ }
+
+ public static string ToHexString(int val)
+ {
+ return Convert.ToString(val, 16);
+ }
+
+ public static string ToString(object val)
+ {
+ return val.ToString();
+ }
+
+ public static string ToString(int val, int bas)
+ {
+ return Convert.ToString(val, bas);
+ }
+
+ public static IList<TU> UpcastTo<T, TU>(this IList<T> s) where T : TU
+ {
+ List<TU> list = new List<TU>(s.Count);
+ for (int i = 0; i < s.Count; i++)
+ {
+ list.Add(s[i]);
+ }
+ return list;
+ }
+
+ public static ICollection<TU> UpcastTo<T, TU>(this ICollection<T> s) where T : TU
+ {
+ List<TU> list = new List<TU>(s.Count);
+ foreach (var v in s)
+ {
+ list.Add(v);
+ }
+ return list;
+ }
+
+ public static T ValueOf<T>(T val)
+ {
+ return val;
+ }
+
+
+ //use? for NUnit-testing?
+ //public static string GetTestName(object obj)
+ //{
+ // return GetTestName();
+ //}
+
+ //public static string GetTestName()
+ //{
+ // MethodBase met;
+ // int n = 0;
+ // do
+ // {
+ // met = new StackFrame(n).GetMethod();
+ // if (met != null)
+ // {
+ // foreach (Attribute at in met.GetCustomAttributes(true))
+ // {
+ // if (at.GetType().FullName == "NUnit.Framework.TestAttribute")
+ // {
+ // // Convert back to camel case
+ // string name = met.Name;
+ // if (char.IsUpper(name[0]))
+ // name = char.ToLower(name[0]) + name.Substring(1);
+ // return name;
+ // }
+ // }
+ // }
+ // n++;
+ // } while (met != null);
+ // return "";
+ //}
+
+ public static string GetHostAddress(this IPAddress addr)
+ {
+ return addr.ToString();
+ }
+
+
+ public static IPAddress GetAddressByName(string host)
+ {
+ if (host == "0.0.0.0")
+ {
+ return IPAddress.Any;
+ }
+
+ try
+ {
+ return IPAddress.Parse(host);
+ }
+ catch (Exception ex)
+ {
+ return null;
+ }
+ }
+
+ public static IPAddress[] GetAddressesByName(string host)
+ {
+ //IReadOnlyList<EndpointPair> data = null;
+
+ //try
+ //{
+ // Task.Run(async () =>
+ // {
+ // data = await DatagramSocket.GetEndpointPairsAsync(new HostName(host), "0");
+ // }).Wait();
+ //}
+ //catch (Exception ex)
+ //{
+ // return null;
+ //}
+
+ //return data != null
+ // ? data.Where(i => i.RemoteHostName.Type == HostNameType.Ipv4)
+ // .GroupBy(i => i.RemoteHostName.DisplayName)
+ // .Select(i => IPAddress.Parse(i.First().RemoteHostName.DisplayName))
+ // .ToArray()
+ // : null;
+
+ //get v4-address only
+ var entry = Task.Run(() => System.Net.Dns.GetHostEntryAsync(host))
+ .GetAwaiter()
+ .GetResult();
+ return entry.AddressList
+ .Where(addr => addr.AddressFamily == AddressFamily.InterNetwork)
+ .ToArray();
+
+ }
+
+ public static string GetImplementationVersion(this Assembly asm)
+ {
+ return asm.GetName().Version.ToString();
+ }
+
+ public static string GetHost(this Uri uri)
+ {
+ return string.IsNullOrEmpty(uri.Host) ? "" : uri.Host;
+ }
+
+ public static string GetUserInfo(this Uri uri)
+ {
+ return string.IsNullOrEmpty(uri.UserInfo) ? null : uri.UserInfo;
+ }
+
+ public static string GetQuery(this Uri uri)
+ {
+ return string.IsNullOrEmpty(uri.Query) ? null : uri.Query;
+ }
+
+ public static int GetLocalPort(this Socket socket)
+ {
+ return ((IPEndPoint)socket.LocalEndPoint).Port;
+ }
+
+ public static int GetPort(this Socket socket)
+ {
+ return ((IPEndPoint)socket.RemoteEndPoint).Port;
+ }
+
+ public static IPAddress GetInetAddress(this Socket socket)
+ {
+ return ((IPEndPoint)socket.RemoteEndPoint).Address;
+ }
+
+
+ /*public static bool RemoveElement(this ArrayList list, object elem)
+ {
+ int i = list.IndexOf(elem);
+ if (i == -1)
+ return false;
+ list.RemoveAt(i);
+ return true;
+ }*/
+
+ public static Semaphore CreateSemaphore(int count)
+ {
+ return new Semaphore(count, int.MaxValue);
+ }
+
+ }
+}