porting shell from nuget to local

This commit is contained in:
NaBian committed 2020-12-06 11:18:36 +08:00
1 parent d971be8816
commit 035ef17569
164 files changed
+10363 -11

No files matched your search

@@ -0,0 +1,822 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace Standard
{
internal static class Utility
{
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
private static bool _MemCmp(IntPtr left, IntPtr right, long cb)
{
int num = 0;
while ((long)num < cb - 8L)
{
long num2 = Marshal.ReadInt64(left, num);
long num3 = Marshal.ReadInt64(right, num);
if (num2 != num3)
{
return false;
}
num += 8;
}
while ((long)num < cb)
{
byte b = Marshal.ReadByte(left, num);
byte b2 = Marshal.ReadByte(right, num);
if (b != b2)
{
return false;
}
num++;
}
return true;
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static int RGB(Color c)
{
return (int)c.R | (int)c.G << 8 | (int)c.B << 16;
}
public static Color ColorFromArgbDword(uint color)
{
return Color.FromArgb((byte)((color & 4278190080u) >> 24), (byte)((color & 16711680u) >> 16), (byte)((color & 65280u) >> 8), (byte)(color & 255u));
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static int GET_X_LPARAM(IntPtr lParam)
{
return Utility.LOWORD(lParam.ToInt32());
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static int GET_Y_LPARAM(IntPtr lParam)
{
return Utility.HIWORD(lParam.ToInt32());
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static int HIWORD(int i)
{
return (int)((short)(i >> 16));
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static int LOWORD(int i)
{
return (int)((short)(i & 65535));
}
[SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")]
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static bool AreStreamsEqual(Stream left, Stream right)
{
if (left == null)
{
return right == null;
}
if (right == null)
{
return false;
}
if (!left.CanRead || !right.CanRead)
{
throw new NotSupportedException("The streams can't be read for comparison");
}
if (left.Length != right.Length)
{
return false;
}
int num = (int)left.Length;
left.Position = 0L;
right.Position = 0L;
int i = 0;
int num2 = 0;
byte[] array = new byte[512];
byte[] array2 = new byte[512];
GCHandle gchandle = GCHandle.Alloc(array, GCHandleType.Pinned);
IntPtr left2 = gchandle.AddrOfPinnedObject();
GCHandle gchandle2 = GCHandle.Alloc(array2, GCHandleType.Pinned);
IntPtr right2 = gchandle2.AddrOfPinnedObject();
bool result;
try
{
while (i < num)
{
int num3 = left.Read(array, 0, array.Length);
int num4 = right.Read(array2, 0, array2.Length);
if (num3 != num4)
{
return false;
}
if (!Utility._MemCmp(left2, right2, (long)num3))
{
return false;
}
i += num3;
num2 += num4;
}
result = true;
}
finally
{
gchandle.Free();
gchandle2.Free();
}
return result;
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static bool GuidTryParse(string guidString, out Guid guid)
{
Verify.IsNeitherNullNorEmpty(guidString, "guidString");
try
{
guid = new Guid(guidString);
return true;
}
catch (FormatException)
{
}
catch (OverflowException)
{
}
guid = default(Guid);
return false;
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static bool IsFlagSet(int value, int mask)
{
return 0 != (value & mask);
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static bool IsFlagSet(uint value, uint mask)
{
return 0u != (value & mask);
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static bool IsFlagSet(long value, long mask)
{
return 0L != (value & mask);
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static bool IsFlagSet(ulong value, ulong mask)
{
return 0UL != (value & mask);
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static bool IsOSVistaOrNewer
{
get
{
return Utility._osVersion >= new Version(6, 0);
}
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static bool IsOSWindows7OrNewer
{
get
{
return Utility._osVersion >= new Version(6, 1);
}
}
public static bool IsPresentationFrameworkVersionLessThan4
{
get
{
return Utility._presentationFrameworkVersion < new Version(4, 0);
}
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
[SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")]
public static IntPtr GenerateHICON(ImageSource image, Size dimensions)
{
if (image == null)
{
return IntPtr.Zero;
}
BitmapFrame bitmapFrame = image as BitmapFrame;
if (bitmapFrame != null)
{
bitmapFrame = Utility.GetBestMatch(bitmapFrame.Decoder.Frames, (int)dimensions.Width, (int)dimensions.Height);
}
else
{
Rect rectangle = new Rect(0.0, 0.0, dimensions.Width, dimensions.Height);
double num = dimensions.Width / dimensions.Height;
double num2 = image.Width / image.Height;
if (image.Width <= dimensions.Width && image.Height <= dimensions.Height)
{
rectangle = new Rect((dimensions.Width - image.Width) / 2.0, (dimensions.Height - image.Height) / 2.0, image.Width, image.Height);
}
else if (num > num2)
{
double num3 = image.Width / image.Height * dimensions.Width;
rectangle = new Rect((dimensions.Width - num3) / 2.0, 0.0, num3, dimensions.Height);
}
else if (num < num2)
{
double num4 = image.Height / image.Width * dimensions.Height;
rectangle = new Rect(0.0, (dimensions.Height - num4) / 2.0, dimensions.Width, num4);
}
DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
drawingContext.DrawImage(image, rectangle);
drawingContext.Close();
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap((int)dimensions.Width, (int)dimensions.Height, 96.0, 96.0, PixelFormats.Pbgra32);
renderTargetBitmap.Render(drawingVisual);
bitmapFrame = BitmapFrame.Create(renderTargetBitmap);
}
IntPtr result;
using (MemoryStream memoryStream = new MemoryStream())
{
new PngBitmapEncoder
{
Frames =
{
bitmapFrame
}
}.Save(memoryStream);
using (ManagedIStream managedIStream = new ManagedIStream(memoryStream))
{
IntPtr zero = IntPtr.Zero;
try
{
Status status = NativeMethods.GdipCreateBitmapFromStream(managedIStream, out zero);
if (status != Status.Ok)
{
result = IntPtr.Zero;
}
else
{
IntPtr intPtr;
status = NativeMethods.GdipCreateHICONFromBitmap(zero, out intPtr);
if (status != Status.Ok)
{
result = IntPtr.Zero;
}
else
{
result = intPtr;
}
}
}
finally
{
Utility.SafeDisposeImage(ref zero);
}
}
}
return result;
}
public static BitmapFrame GetBestMatch(IList<BitmapFrame> frames, int width, int height)
{
return Utility._GetBestMatch(frames, Utility._GetBitDepth(), width, height);
}
private static int _MatchImage(BitmapFrame frame, int bitDepth, int width, int height, int bpp)
{
return 2 * Utility._WeightedAbs(bpp, bitDepth, false) + Utility._WeightedAbs(frame.PixelWidth, width, true) + Utility._WeightedAbs(frame.PixelHeight, height, true);
}
private static int _WeightedAbs(int valueHave, int valueWant, bool fPunish)
{
int num = valueHave - valueWant;
if (num < 0)
{
num = (fPunish ? -2 : -1) * num;
}
return num;
}
private static BitmapFrame _GetBestMatch(IList<BitmapFrame> frames, int bitDepth, int width, int height)
{
int num = int.MaxValue;
int num2 = 0;
int index = 0;
bool flag = frames[0].Decoder is IconBitmapDecoder;
int num3 = 0;
while (num3 < frames.Count && num != 0)
{
int num4 = flag ? frames[num3].Thumbnail.Format.BitsPerPixel : frames[num3].Format.BitsPerPixel;
if (num4 == 0)
{
num4 = 8;
}
int num5 = Utility._MatchImage(frames[num3], bitDepth, width, height, num4);
if (num5 < num)
{
index = num3;
num2 = num4;
num = num5;
}
else if (num5 == num && num2 < num4)
{
index = num3;
num2 = num4;
}
num3++;
}
return frames[index];
}
private static int _GetBitDepth()
{
if (Utility.s_bitDepth == 0)
{
using (SafeDC desktop = SafeDC.GetDesktop())
{
Utility.s_bitDepth = NativeMethods.GetDeviceCaps(desktop, DeviceCap.BITSPIXEL) * NativeMethods.GetDeviceCaps(desktop, DeviceCap.PLANES);
}
}
return Utility.s_bitDepth;
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static void SafeDeleteFile(string path)
{
if (!string.IsNullOrEmpty(path))
{
File.Delete(path);
}
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static void SafeDeleteObject(ref IntPtr gdiObject)
{
IntPtr intPtr = gdiObject;
gdiObject = IntPtr.Zero;
if (IntPtr.Zero != intPtr)
{
NativeMethods.DeleteObject(intPtr);
}
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static void SafeDestroyIcon(ref IntPtr hicon)
{
IntPtr intPtr = hicon;
hicon = IntPtr.Zero;
if (IntPtr.Zero != intPtr)
{
NativeMethods.DestroyIcon(intPtr);
}
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static void SafeDestroyWindow(ref IntPtr hwnd)
{
IntPtr hwnd2 = hwnd;
hwnd = IntPtr.Zero;
if (NativeMethods.IsWindow(hwnd2))
{
NativeMethods.DestroyWindow(hwnd2);
}
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static void SafeDispose<T>(ref T disposable) where T : IDisposable
{
IDisposable disposable2 = disposable;
disposable = default(T);
if (disposable2 != null)
{
disposable2.Dispose();
}
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static void SafeDisposeImage(ref IntPtr gdipImage)
{
IntPtr intPtr = gdipImage;
gdipImage = IntPtr.Zero;
if (IntPtr.Zero != intPtr)
{
NativeMethods.GdipDisposeImage(intPtr);
}
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
[SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")]
public static void SafeCoTaskMemFree(ref IntPtr ptr)
{
IntPtr intPtr = ptr;
ptr = IntPtr.Zero;
if (IntPtr.Zero != intPtr)
{
Marshal.FreeCoTaskMem(intPtr);
}
}
[SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")]
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static void SafeFreeHGlobal(ref IntPtr hglobal)
{
IntPtr intPtr = hglobal;
hglobal = IntPtr.Zero;
if (IntPtr.Zero != intPtr)
{
Marshal.FreeHGlobal(intPtr);
}
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
[SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")]
public static void SafeRelease<T>(ref T comObject) where T : class
{
T t = comObject;
comObject = default(T);
if (t != null)
{
Marshal.ReleaseComObject(t);
}
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static void GeneratePropertyString(StringBuilder source, string propertyName, string value)
{
if (source.Length != 0)
{
source.Append(' ');
}
source.Append(propertyName);
source.Append(": ");
if (string.IsNullOrEmpty(value))
{
source.Append("<null>");
return;
}
source.Append('"');
source.Append(value);
source.Append('"');
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
[Obsolete]
public static string GenerateToString<T>(T @object) where T : struct
{
StringBuilder stringBuilder = new StringBuilder();
foreach (PropertyInfo propertyInfo in typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public))
{
if (stringBuilder.Length != 0)
{
stringBuilder.Append(", ");
}
object value = propertyInfo.GetValue(@object, null);
string format = (value == null) ? "{0}: <null>" : "{0}: \"{1}\"";
stringBuilder.AppendFormat(format, propertyInfo.Name, value);
}
return stringBuilder.ToString();
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static void CopyStream(Stream destination, Stream source)
{
destination.Position = 0L;
if (source.CanSeek)
{
source.Position = 0L;
destination.SetLength(source.Length);
}
byte[] array = new byte[4096];
int num;
do
{
num = source.Read(array, 0, array.Length);
if (num != 0)
{
destination.Write(array, 0, num);
}
}
while (array.Length == num);
destination.Position = 0L;
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static string HashStreamMD5(Stream stm)
{
stm.Position = 0L;
StringBuilder stringBuilder = new StringBuilder();
using (MD5 md = MD5.Create())
{
foreach (byte b in md.ComputeHash(stm))
{
stringBuilder.Append(b.ToString("x2", CultureInfo.InvariantCulture));
}
}
return stringBuilder.ToString();
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static void EnsureDirectory(string path)
{
if (!Directory.Exists(Path.GetDirectoryName(path)))
{
Directory.CreateDirectory(Path.GetDirectoryName(path));
}
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static bool MemCmp(byte[] left, byte[] right, int cb)
{
GCHandle gchandle = GCHandle.Alloc(left, GCHandleType.Pinned);
IntPtr left2 = gchandle.AddrOfPinnedObject();
GCHandle gchandle2 = GCHandle.Alloc(right, GCHandleType.Pinned);
IntPtr right2 = gchandle2.AddrOfPinnedObject();
bool result = Utility._MemCmp(left2, right2, (long)cb);
gchandle.Free();
gchandle2.Free();
return result;
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static string UrlDecode(string url)
{
if (url == null)
{
return null;
}
Utility._UrlDecoder urlDecoder = new Utility._UrlDecoder(url.Length, Encoding.UTF8);
int length = url.Length;
for (int i = 0; i < length; i++)
{
char c = url[i];
if (c == '+')
{
urlDecoder.AddByte(32);
}
else
{
if (c == '%' && i < length - 2)
{
if (url[i + 1] == 'u' && i < length - 5)
{
int num = Utility._HexToInt(url[i + 2]);
int num2 = Utility._HexToInt(url[i + 3]);
int num3 = Utility._HexToInt(url[i + 4]);
int num4 = Utility._HexToInt(url[i + 5]);
if (num >= 0 && num2 >= 0 && num3 >= 0 && num4 >= 0)
{
urlDecoder.AddChar((char)(num << 12 | num2 << 8 | num3 << 4 | num4));
i += 5;
goto IL_12D;
}
}
else
{
int num5 = Utility._HexToInt(url[i + 1]);
int num6 = Utility._HexToInt(url[i + 2]);
if (num5 >= 0 && num6 >= 0)
{
urlDecoder.AddByte((byte)(num5 << 4 | num6));
i += 2;
goto IL_12D;
}
}
}
if ((c & 'タ') == '\0')
{
urlDecoder.AddByte((byte)c);
}
else
{
urlDecoder.AddChar(c);
}
}
IL_12D:;
}
return urlDecoder.GetString();
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static string UrlEncode(string url)
{
if (url == null)
{
return null;
}
byte[] array = Encoding.UTF8.GetBytes(url);
bool flag = false;
int num = 0;
foreach (byte b in array)
{
if (b == 32)
{
flag = true;
}
else if (!Utility._UrlEncodeIsSafe(b))
{
num++;
flag = true;
}
}
if (flag)
{
byte[] array3 = new byte[array.Length + num * 2];
int num2 = 0;
foreach (byte b2 in array)
{
if (Utility._UrlEncodeIsSafe(b2))
{
array3[num2++] = b2;
}
else if (b2 == 32)
{
array3[num2++] = 43;
}
else
{
array3[num2++] = 37;
array3[num2++] = Utility._IntToHex(b2 >> 4 & 15);
array3[num2++] = Utility._IntToHex((int)(b2 & 15));
}
}
array = array3;
}
return Encoding.ASCII.GetString(array);
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
private static bool _UrlEncodeIsSafe(byte b)
{
if (Utility._IsAsciiAlphaNumeric(b))
{
return true;
}
if (b != 33)
{
switch (b)
{
case 39:
case 40:
case 41:
case 42:
case 45:
case 46:
return true;
case 43:
case 44:
break;
default:
if (b == 95)
{
return true;
}
break;
}
return false;
}
return true;
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
private static bool _IsAsciiAlphaNumeric(byte b)
{
return (b >= 97 && b <= 122) || (b >= 65 && b <= 90) || (b >= 48 && b <= 57);
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
private static byte _IntToHex(int n)
{
if (n <= 9)
{
return (byte)(n + 48);
}
return (byte)(n - 10 + 65);
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
private static int _HexToInt(char h)
{
if (h >= '0' && h <= '9')
{
return (int)(h - '0');
}
if (h >= 'a' && h <= 'f')
{
return (int)(h - 'a' + '\n');
}
if (h >= 'A' && h <= 'F')
{
return (int)(h - 'A' + '\n');
}
return -1;
}
public static void AddDependencyPropertyChangeListener(object component, DependencyProperty property, EventHandler listener)
{
if (component == null)
{
return;
}
DependencyPropertyDescriptor dependencyPropertyDescriptor = DependencyPropertyDescriptor.FromProperty(property, component.GetType());
dependencyPropertyDescriptor.AddValueChanged(component, listener);
}
public static void RemoveDependencyPropertyChangeListener(object component, DependencyProperty property, EventHandler listener)
{
if (component == null)
{
return;
}
DependencyPropertyDescriptor dependencyPropertyDescriptor = DependencyPropertyDescriptor.FromProperty(property, component.GetType());
dependencyPropertyDescriptor.RemoveValueChanged(component, listener);
}
public static bool IsThicknessNonNegative(Thickness thickness)
{
return Utility.IsDoubleFiniteAndNonNegative(thickness.Top) && Utility.IsDoubleFiniteAndNonNegative(thickness.Left) && Utility.IsDoubleFiniteAndNonNegative(thickness.Bottom) && Utility.IsDoubleFiniteAndNonNegative(thickness.Right);
}
public static bool IsCornerRadiusValid(CornerRadius cornerRadius)
{
return Utility.IsDoubleFiniteAndNonNegative(cornerRadius.TopLeft) && Utility.IsDoubleFiniteAndNonNegative(cornerRadius.TopRight) && Utility.IsDoubleFiniteAndNonNegative(cornerRadius.BottomLeft) && Utility.IsDoubleFiniteAndNonNegative(cornerRadius.BottomRight);
}
public static bool IsDoubleFiniteAndNonNegative(double d)
{
return !double.IsNaN(d) && !double.IsInfinity(d) && d >= 0.0;
}
private static readonly Version _osVersion = Environment.OSVersion.Version;
private static readonly Version _presentationFrameworkVersion = Assembly.GetAssembly(typeof(Window)).GetName().Version;
private static int s_bitDepth;
private class _UrlDecoder
{
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public _UrlDecoder(int size, Encoding encoding)
{
this._encoding = encoding;
this._charBuffer = new char[size];
this._byteBuffer = new byte[size];
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public void AddByte(byte b)
{
this._byteBuffer[this._byteCount++] = b;
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public void AddChar(char ch)
{
this._FlushBytes();
this._charBuffer[this._charCount++] = ch;
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
private void _FlushBytes()
{
if (this._byteCount > 0)
{
this._charCount += this._encoding.GetChars(this._byteBuffer, 0, this._byteCount, this._charBuffer, this._charCount);
this._byteCount = 0;
}
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public string GetString()
{
this._FlushBytes();
if (this._charCount > 0)
{
return new string(this._charBuffer, 0, this._charCount);
}
return "";
}
private readonly Encoding _encoding;
private readonly char[] _charBuffer;
private readonly byte[] _byteBuffer;
private int _byteCount;
private int _charCount;
}
}
}