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);
+ }
}
}
}