From 049ea0934a57f80b2cee5052c523f6755526867f Mon Sep 17 00:00:00 2001 From: Maurice Date: Wed, 20 Dec 2023 18:32:07 +0100 Subject: [PATCH] Update For Hashing. I have revamped the code structure, removed unnecessary functions, and improved overall efficiency. Redundancies were eliminated, leading to a faster and more streamlined codebase. --- Hashing/App.config | 6 +- Hashing/EmbeddedAssembly.cs | 103 +++++++++++------------ Hashing/Hashing.csproj | 3 +- Hashing/Options.cs | 157 +++++++++++------------------------ Hashing/Program.cs | 46 ++++------ Hashing/SumResult.cs | 53 ++++-------- Hashing/TopMostMessageBox.cs | 24 ++---- 7 files changed, 144 insertions(+), 248 deletions(-) diff --git a/Hashing/App.config b/Hashing/App.config index 88fa402..4bfa005 100644 --- a/Hashing/App.config +++ b/Hashing/App.config @@ -1,6 +1,6 @@ - + - + - \ No newline at end of file + diff --git a/Hashing/EmbeddedAssembly.cs b/Hashing/EmbeddedAssembly.cs index b7dbcab..f4fabf6 100644 --- a/Hashing/EmbeddedAssembly.cs +++ b/Hashing/EmbeddedAssembly.cs @@ -8,79 +8,76 @@ namespace Hashing { public class EmbeddedAssembly { - private static Dictionary dic; + private static readonly Dictionary _assemblies = new Dictionary(); public static void Load(string embeddedResource, string fileName) { - if (dic == null) - dic = new Dictionary(); + var assemblyData = GetEmbeddedResourceBytes(embeddedResource); + var assembly = TryLoadAssemblyFromBytes(assemblyData); - byte[] ba = null; - Assembly asm = null; - var curAsm = Assembly.GetExecutingAssembly(); - - using (var stm = curAsm.GetManifestResourceStream(embeddedResource)) + if (assembly == null) { - if (stm == null) - throw new Exception(embeddedResource + " is not found in Embedded Resources."); - - ba = new byte[(int)stm.Length]; - stm.Read(ba, 0, (int)stm.Length); - try - { - asm = Assembly.Load(ba); - - dic.Add(asm.FullName, asm); - return; - } - catch { } + var tempFilePath = GetOrCreateTemporaryFile(assemblyData, fileName); + assembly = Assembly.LoadFile(tempFilePath); } - var fileOk = false; - var tempFile = ""; - - using (var sha1 = new SHA1CryptoServiceProvider()) - { - var fileHash = BitConverter.ToString(sha1.ComputeHash(ba)).Replace("-", string.Empty); - ; + _assemblies[assembly.FullName] = assembly; + } - tempFile = Path.GetTempPath() + fileName; + public static Assembly Get(string assemblyFullName) + { + _assemblies.TryGetValue(assemblyFullName, out var assembly); + return assembly; + } - if (File.Exists(tempFile)) - { - var bb = File.ReadAllBytes(tempFile); - var fileHash2 = BitConverter.ToString(sha1.ComputeHash(bb)).Replace("-", string.Empty); + private static byte[] GetEmbeddedResourceBytes(string embeddedResource) + { + var currentAssembly = Assembly.GetExecutingAssembly(); + using (var stream = currentAssembly.GetManifestResourceStream(embeddedResource)) + { + if (stream == null) + throw new Exception($"{embeddedResource} is not found in Embedded Resources."); - if (fileHash == fileHash2) - { - fileOk = true; - } - } - else - { - fileOk = false; - } + var resourceBytes = new byte[stream.Length]; + stream.Read(resourceBytes, 0, resourceBytes.Length); + return resourceBytes; } + } - if (!fileOk) + private static Assembly TryLoadAssemblyFromBytes(byte[] assemblyData) + { + try { - File.WriteAllBytes(tempFile, ba); + return Assembly.Load(assemblyData); } + catch + { + return null; + } + } - asm = Assembly.LoadFile(tempFile); - - dic.Add(asm.FullName, asm); + private static string GetOrCreateTemporaryFile(byte[] assemblyData, string fileName) + { + var tempFilePath = Path.Combine(Path.GetTempPath(), fileName); + if (!IsFileContentEqual(tempFilePath, assemblyData)) + { + File.WriteAllBytes(tempFilePath, assemblyData); + } + return tempFilePath; } - public static Assembly Get(string assemblyFullName) + private static bool IsFileContentEqual(string filePath, byte[] data) { - if (dic == null || dic.Count == 0) - return null; + if (!File.Exists(filePath)) return false; - if (dic.ContainsKey(assemblyFullName)) - return dic[assemblyFullName]; + var fileData = File.ReadAllBytes(filePath); + using (var sha1 = new SHA1CryptoServiceProvider()) + { + var fileHash = BitConverter.ToString(sha1.ComputeHash(fileData)).Replace("-", string.Empty); + var dataHash = BitConverter.ToString(sha1.ComputeHash(data)).Replace("-", string.Empty); - return null; + return fileHash == dataHash; + } } } } diff --git a/Hashing/Hashing.csproj b/Hashing/Hashing.csproj index ae2af3a..056def3 100644 --- a/Hashing/Hashing.csproj +++ b/Hashing/Hashing.csproj @@ -9,9 +9,10 @@ Properties Hashing Hashing - v4.5.2 + v4.8 512 true + AnyCPU diff --git a/Hashing/Options.cs b/Hashing/Options.cs index fd888a8..11656b2 100644 --- a/Hashing/Options.cs +++ b/Hashing/Options.cs @@ -12,8 +12,8 @@ namespace Hashing [Serializable] public class SettingsJson { - public Theme Color { get; set; } - public HashOptions HashOptions { get; set; } + public Theme Color { get; set; } = Theme.Amethyst; + public HashOptions HashOptions { get; set; } = new HashOptions(); public bool LowerCasing { get; set; } public bool TrayIcon { get; set; } public bool HighPriority { get; set; } @@ -21,67 +21,44 @@ public class SettingsJson public short ActiveHash { get; set; } public bool StayOnTop { get; set; } public bool SingleInstance { get; set; } - public Size WindowSize { get; set; } + + public Size WindowSize { get; set; } = new Size(820, 632); public Point? WindowLocation { get; set; } - public FormWindowState WindowState { get; set; } + public FormWindowState WindowState { get; set; } = FormWindowState.Normal; public LanguageCode LanguageCode { get; set; } - - public SettingsJson() - { - HashOptions = new HashOptions(); - } } public class Options { - internal static Color ForegroundColor = Color.FromArgb(153, 102, 204); - internal static Color ForegroundAccentColor = Color.FromArgb(134, 89, 179); - + internal static Color ForegroundColor; + internal static Color ForegroundAccentColor; internal static Color BackgroundColor = Color.FromArgb(20, 20, 20); - - internal readonly static string ThemeFlag = "themeable"; - readonly static string SettingsFile = Application.StartupPath + "\\Hashing.json"; - internal static SettingsJson CurrentOptions = new SettingsJson(); - internal static dynamic TranslationList; - internal static IEnumerable GetSelfAndChildrenRecursive(Control parent) - { - List controls = new List(); + internal static string ThemeFlag = "ThemeTag"; - foreach (Control child in parent.Controls) - { - controls.AddRange(GetSelfAndChildrenRecursive(child)); - } + private static readonly Dictionary ThemeColors = new Dictionary + { + { Theme.Amber, (Color.FromArgb(195, 146, 0), Color.FromArgb(171, 128, 0)) }, + { Theme.Jade, (Color.FromArgb(70, 175, 105), Color.FromArgb(61, 153, 92)) }, + { Theme.Ruby, (Color.FromArgb(205, 22, 39), Color.FromArgb(155, 17, 30)) }, + { Theme.Silver, (Color.Gray, Color.DimGray) }, + { Theme.Azurite, (Color.FromArgb(0, 127, 255), Color.FromArgb(0, 111, 223)) }, + { Theme.Amethyst, (Color.FromArgb(153, 102, 204), Color.FromArgb(134, 89, 179)) }, + }; - controls.Add(parent); - return controls; + internal static IEnumerable GetSelfAndChildrenRecursive(Control parent) + { + return parent.Controls.Cast().SelectMany(GetSelfAndChildrenRecursive).Append(parent); } internal static void ApplyTheme(Form f) { - switch (CurrentOptions.Color) + if (ThemeColors.TryGetValue(CurrentOptions.Color, out var colors)) { - case Theme.Amber: - SetTheme(f, Color.FromArgb(195, 146, 0), Color.FromArgb(171, 128, 0)); - break; - case Theme.Jade: - SetTheme(f, Color.FromArgb(70, 175, 105), Color.FromArgb(61, 153, 92)); - break; - case Theme.Ruby: - SetTheme(f, Color.FromArgb(205, 22, 39), Color.FromArgb(155, 17, 30)); - break; - case Theme.Silver: - SetTheme(f, Color.Gray, Color.DimGray); - break; - case Theme.Azurite: - SetTheme(f, Color.FromArgb(0, 127, 255), Color.FromArgb(0, 111, 223)); - break; - case Theme.Amethyst: - SetTheme(f, Color.FromArgb(153, 102, 204), Color.FromArgb(134, 89, 179)); - break; + SetTheme(f, colors.Item1, colors.Item2); } } @@ -90,7 +67,6 @@ private static void SetTheme(Form f, Color c1, Color c2) dynamic c; ForegroundColor = c1; ForegroundAccentColor = c2; - GetSelfAndChildrenRecursive(f).ToList().ForEach(x => { c = x; @@ -124,81 +100,48 @@ private static void SetTheme(Form f, Color c1, Color c2) internal static void SaveSettings() { - if (File.Exists(SettingsFile)) - { - File.Delete(SettingsFile); - - using (FileStream fs = File.Open(SettingsFile, FileMode.OpenOrCreate)) - using (StreamWriter sw = new StreamWriter(fs)) - using (JsonWriter jw = new JsonTextWriter(sw)) - { - jw.Formatting = Formatting.Indented; - - JsonSerializer serializer = new JsonSerializer(); - serializer.Serialize(jw, CurrentOptions); - } - } + string settingsFile = GetSettingsFilePath(); + File.WriteAllText(settingsFile, JsonConvert.SerializeObject(CurrentOptions, Formatting.Indented)); } internal static void LoadSettings() { - if (!File.Exists(SettingsFile)) + string settingsFile = GetSettingsFilePath(); + if (File.Exists(settingsFile)) { - CurrentOptions.Color = Theme.Amethyst; - CurrentOptions.LowerCasing = false; - CurrentOptions.TrayIcon = false; - CurrentOptions.HighPriority = false; - CurrentOptions.CRC32Decimal = false; - CurrentOptions.ActiveHash = 1; - CurrentOptions.StayOnTop = false; - CurrentOptions.SingleInstance = true; - - CurrentOptions.HashOptions.MD5 = false; - CurrentOptions.HashOptions.SHA1 = true; - CurrentOptions.HashOptions.SHA256 = true; - CurrentOptions.HashOptions.SHA384 = false; - CurrentOptions.HashOptions.SHA512 = false; - CurrentOptions.HashOptions.CRC32 = false; - CurrentOptions.HashOptions.RIPEMD160 = false; - CurrentOptions.HashOptions.SHA3_256 = false; - CurrentOptions.HashOptions.SHA3_384 = false; - CurrentOptions.HashOptions.SHA3_512 = false; - - CurrentOptions.WindowLocation = null; - CurrentOptions.WindowSize = new Size(820, 632); - CurrentOptions.WindowState = FormWindowState.Normal; - - using (FileStream fs = File.Open(SettingsFile, FileMode.CreateNew)) - using (StreamWriter sw = new StreamWriter(fs)) - using (JsonWriter jw = new JsonTextWriter(sw)) - { - jw.Formatting = Formatting.Indented; - - JsonSerializer serializer = new JsonSerializer(); - serializer.Serialize(jw, CurrentOptions); - } + CurrentOptions = JsonConvert.DeserializeObject(File.ReadAllText(settingsFile)); } else { - CurrentOptions = JsonConvert.DeserializeObject(File.ReadAllText(SettingsFile)); - - if (CurrentOptions.WindowSize.IsEmpty) - { - CurrentOptions.WindowSize = new Size(820, 632); - SaveSettings(); - } + SaveSettings(); } - LoadTranslation(); } + private static string GetSettingsFilePath() + { + return Path.Combine(Application.StartupPath, "Hashing.json"); + } + internal static void LoadTranslation() { - // load proper translation list - if (CurrentOptions.LanguageCode == LanguageCode.EN) TranslationList = JObject.Parse(Properties.Resources.EN); - if (CurrentOptions.LanguageCode == LanguageCode.EL) TranslationList = JObject.Parse(Properties.Resources.EL); - if (CurrentOptions.LanguageCode == LanguageCode.CN) TranslationList = JObject.Parse(Properties.Resources.CN); - if (CurrentOptions.LanguageCode == LanguageCode.DE) TranslationList = JObject.Parse(Properties.Resources.DE); + var languageResources = new Dictionary + { + { LanguageCode.EN, Properties.Resources.EN }, + { LanguageCode.EL, Properties.Resources.EL }, + { LanguageCode.CN, Properties.Resources.CN }, + { LanguageCode.DE, Properties.Resources.DE }, + }; + + if (languageResources.TryGetValue(CurrentOptions.LanguageCode, out var resource)) + { + TranslationList = JObject.Parse(resource); + } + else + { + TranslationList = JObject.Parse(Properties.Resources.EN); + } } + } } diff --git a/Hashing/Program.cs b/Hashing/Program.cs index 68138c7..0808f18 100644 --- a/Hashing/Program.cs +++ b/Hashing/Program.cs @@ -2,35 +2,23 @@ using System.Reflection; using System.Threading; using System.Windows.Forms; +using System.Runtime.InteropServices; namespace Hashing { static class Program { - /* VERSION PROPERTIES */ - /* DO NOT LEAVE THEM EMPTY */ + internal static readonly float Major = 3; + internal static readonly float Minor = 7; - // Enter current version here - internal readonly static float Major = 3; - internal readonly static float Minor = 7; + internal static string GetCurrentVersionToString() => $"{Major}.{Minor}"; + internal static float GetCurrentVersion() => float.Parse(GetCurrentVersionToString()); - /* END OF VERSION PROPERTIES */ - - internal static string GetCurrentVersionToString() - { - return Major.ToString() + "." + Minor.ToString(); - } - - internal static float GetCurrentVersion() - { - return float.Parse(GetCurrentVersionToString()); - } - - const string _mutexGuid = @"{DEADMOON-0EFC7B9A-D7FC-437F-B4B3-0118C643FE19-HASHING}"; + private const string MutexGuid = @"{DEADMOON-0EFC7B9A-D7FC-437F-B4B3-0118C643FE19-HASHING}"; internal static Mutex MUTEX; - static bool _notRunning; + private static bool notRunning; - [System.Runtime.InteropServices.DllImport("user32.dll")] + [DllImport("user32.dll")] private static extern bool SetProcessDPIAware(); [STAThread] @@ -41,21 +29,16 @@ static void Main(string[] args) Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); - string resource = "Hashing.Newtonsoft.Json.dll"; - string resource2 = "Hashing.Crc32.NET.dll"; - - EmbeddedAssembly.Load(resource, "Newtonsoft.Json.dll"); - EmbeddedAssembly.Load(resource2, "Crc32.NET.dll"); - - AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); + LoadEmbeddedAssemblies(); + AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => EmbeddedAssembly.Get(e.Name); Options.LoadSettings(); if (Options.CurrentOptions.SingleInstance) { - using (MUTEX = new Mutex(true, _mutexGuid, out _notRunning)) + using (MUTEX = new Mutex(true, MutexGuid, out notRunning)) { - if (_notRunning) + if (notRunning) { Application.Run(new MainForm(args)); } @@ -72,9 +55,10 @@ static void Main(string[] args) } } - static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) + private static void LoadEmbeddedAssemblies() { - return EmbeddedAssembly.Get(args.Name); + EmbeddedAssembly.Load("Hashing.Newtonsoft.Json.dll", "Newtonsoft.Json.dll"); + EmbeddedAssembly.Load("Hashing.Crc32.NET.dll", "Crc32.NET.dll"); } } } diff --git a/Hashing/SumResult.cs b/Hashing/SumResult.cs index 00fc619..6d3a0d5 100644 --- a/Hashing/SumResult.cs +++ b/Hashing/SumResult.cs @@ -19,47 +19,28 @@ public class SumResult public string SHA3_384 { get; set; } public string SHA3_512 { get; set; } - public SumResult() - { - - } + public SumResult() { } - public void ConvertToLowerCasing() + private void ConvertHashes(Func converter) { - if (!string.IsNullOrEmpty(MD5)) MD5 = MD5.ToLower(); - if (!string.IsNullOrEmpty(SHA1)) SHA1 = SHA1.ToLower(); - if (!string.IsNullOrEmpty(SHA256)) SHA256 = SHA256.ToLower(); - if (!string.IsNullOrEmpty(SHA384)) SHA384 = SHA384.ToLower(); - if (!string.IsNullOrEmpty(SHA512)) SHA512 = SHA512.ToLower(); - if (!string.IsNullOrEmpty(CRC32)) CRC32 = CRC32.ToLower(); - if (!string.IsNullOrEmpty(RIPEMD160)) RIPEMD160 = RIPEMD160.ToLower(); - if (!string.IsNullOrEmpty(SHA3_256)) SHA3_256 = SHA3_256.ToLower(); - if (!string.IsNullOrEmpty(SHA3_384)) SHA3_384 = SHA3_384.ToLower(); - if (!string.IsNullOrEmpty(SHA3_512)) SHA3_512 = SHA3_512.ToLower(); + MD5 = converter(MD5); + SHA1 = converter(SHA1); + SHA256 = converter(SHA256); + SHA384 = converter(SHA384); + SHA512 = converter(SHA512); + CRC32 = converter(CRC32); + RIPEMD160 = converter(RIPEMD160); + SHA3_256 = converter(SHA3_256); + SHA3_384 = converter(SHA3_384); + SHA3_512 = converter(SHA3_512); } - public void ConvertToUpperCasing() - { - if (!string.IsNullOrEmpty(MD5)) MD5 = MD5.ToUpper(); - if (!string.IsNullOrEmpty(SHA1)) SHA1 = SHA1.ToUpper(); - if (!string.IsNullOrEmpty(SHA256)) SHA256 = SHA256.ToUpper(); - if (!string.IsNullOrEmpty(SHA384)) SHA384 = SHA384.ToUpper(); - if (!string.IsNullOrEmpty(SHA512)) SHA512 = SHA512.ToUpper(); - if (!string.IsNullOrEmpty(CRC32)) CRC32 = CRC32.ToUpper(); - if (!string.IsNullOrEmpty(RIPEMD160)) RIPEMD160 = RIPEMD160.ToUpper(); - if (!string.IsNullOrEmpty(SHA3_256)) SHA3_256 = SHA3_256.ToUpper(); - if (!string.IsNullOrEmpty(SHA3_384)) SHA3_384 = SHA3_384.ToUpper(); - if (!string.IsNullOrEmpty(SHA3_512)) SHA3_512 = SHA3_512.ToUpper(); - } + public void ConvertToLowerCasing() => ConvertHashes(s => s?.ToLower()); - public void ConvertCRC32ToDecimal() - { - if (!string.IsNullOrEmpty(CRC32)) CRC32 = Convert.ToInt64(CRC32, 16).ToString(); - } + public void ConvertToUpperCasing() => ConvertHashes(s => s?.ToUpper()); - public void ConvertCRC32ToHexadecimal() - { - if (!string.IsNullOrEmpty(CRC32)) CRC32 = string.Format("{0:x}", CRC32); - } + public void ConvertCRC32ToDecimal() => CRC32 = !string.IsNullOrEmpty(CRC32) ? Convert.ToInt64(CRC32, 16).ToString() : CRC32; + + public void ConvertCRC32ToHexadecimal() => CRC32 = !string.IsNullOrEmpty(CRC32) ? string.Format("{0:x}", Convert.ToInt64(CRC32)) : CRC32; } } diff --git a/Hashing/TopMostMessageBox.cs b/Hashing/TopMostMessageBox.cs index 7bf6286..a719e1a 100644 --- a/Hashing/TopMostMessageBox.cs +++ b/Hashing/TopMostMessageBox.cs @@ -1,27 +1,17 @@ using System.Windows.Forms; +using System.Drawing; namespace Hashing { public static class TopMostMessageBox { - static public DialogResult Show(string message, string title, MessageBoxButtons buttons, MessageBoxIcon iconStyle) + public static DialogResult Show(string message, string title, MessageBoxButtons buttons, MessageBoxIcon icon) { - Form topmostForm = new Form(); - - topmostForm.Size = new System.Drawing.Size(1, 1); - topmostForm.StartPosition = FormStartPosition.Manual; - System.Drawing.Rectangle rect = SystemInformation.VirtualScreen; - topmostForm.Location = new System.Drawing.Point(rect.Bottom + 10, rect.Right + 10); - topmostForm.Show(); - - topmostForm.Focus(); - topmostForm.BringToFront(); - topmostForm.TopMost = true; - - DialogResult result = MessageBox.Show(topmostForm, message, title, buttons, iconStyle); - topmostForm.Dispose(); - - return result; + using (Form topmostForm = new Form { StartPosition = FormStartPosition.CenterScreen }) + { + topmostForm.TopMost = true; + return MessageBox.Show(topmostForm, message, title, buttons, icon); + } } } }