diff --git a/Pilz.Cryptography/IUniquieIDHost.cs b/Pilz.Cryptography/IUniquieIDHost.cs new file mode 100644 index 0000000..d391edb --- /dev/null +++ b/Pilz.Cryptography/IUniquieIDHost.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Pilz.Cryptography +{ + /// + /// Can be implemented on objects that provides an UniquieID. + /// + public interface IUniquieIDHost + { + UniquieID ID { get; } + } +} diff --git a/Pilz.Cryptography/UniquiIDStringJsonConverter.cs b/Pilz.Cryptography/Json.Converters/UniquieIDStringJsonConverter.cs similarity index 55% rename from Pilz.Cryptography/UniquiIDStringJsonConverter.cs rename to Pilz.Cryptography/Json.Converters/UniquieIDStringJsonConverter.cs index 128f4f4..f3725ab 100644 --- a/Pilz.Cryptography/UniquiIDStringJsonConverter.cs +++ b/Pilz.Cryptography/Json.Converters/UniquieIDStringJsonConverter.cs @@ -2,30 +2,28 @@ using Pilz.Cryptography; using System; using System.Collections.Generic; -using System.IO; -using System.IO.Compression; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace Pilz.Json.Converters { - public class UniquiIDStringJsonConverter : JsonConverter + public class UniquieIDStringJsonConverter : JsonConverter { + public static bool EnableCheckForDepricatedTypes { get; set; } = true; + public override bool CanConvert(Type objectType) { - return typeof(UniquieID).IsAssignableFrom(objectType); + return typeof(UniquieID).IsAssignableFrom(objectType); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var idString = serializer.Deserialize(reader); - UniquieID id; + UniquieID id; - if (existingValue is object) - id = (UniquieID)existingValue; + if (existingValue is UniquieID existingID && (!EnableCheckForDepricatedTypes || existingID.GetType() == typeof(UniquieID))) + id = existingID; else - id = new UniquieID(); + id = new UniquieID(); id.ID = idString; @@ -34,7 +32,7 @@ namespace Pilz.Json.Converters public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { - serializer.Serialize(writer, ((UniquieID)value).ID); + serializer.Serialize(writer, ((UniquieID)value).ID); } } } diff --git a/Pilz.Cryptography/UniquieID.cs b/Pilz.Cryptography/UniquieID.cs index dad0034..e493013 100644 --- a/Pilz.Cryptography/UniquieID.cs +++ b/Pilz.Cryptography/UniquieID.cs @@ -1,23 +1,31 @@ using Newtonsoft.Json; using System; using System.Collections.Generic; -using System.Linq; using System.Management; using System.Security.Cryptography; using System.Text; -using System.Threading.Tasks; namespace Pilz.Cryptography { - public class UniquieID : IUniquieID + [JsonConverter(typeof(Json.Converters.UniquieIDStringJsonConverter))] + public class UniquieID : IUniquieID { - private static int currentSimpleID = 0; + protected static ulong currentSimpleID = 0; [JsonProperty(nameof(ID))] - private string _iD; + protected string _iD; [JsonIgnore] - public string ID + public virtual bool SimpleMode { get; } + + [JsonIgnore] + public virtual bool GenerateOnGet { get; } + + [JsonIgnore] + public virtual bool HasID => !string.IsNullOrEmpty(_iD); + + [JsonIgnore] + public virtual string ID { get { @@ -29,36 +37,96 @@ namespace Pilz.Cryptography => _iD = value; } - [JsonIgnore] - public bool HasID { get => !string.IsNullOrEmpty(_iD); } - [JsonIgnore] - public bool SimpleMode { get; set; } = false; - [JsonIgnore] - public bool GenerateOnGet { get; set; } = false; - - public UniquieID() : this(false) + public UniquieID() : this(UniquieIDGenerationMode.None) { } - public UniquieID(bool autoGenerate) + public UniquieID(UniquieIDGenerationMode mode) : this(mode, false) { - if (autoGenerate) + } + + public UniquieID(UniquieIDGenerationMode mode, bool simpleMode) + { + SimpleMode = simpleMode; + + if (mode == UniquieIDGenerationMode.GenerateOnInit) GenerateIfNull(); + else if (mode == UniquieIDGenerationMode.GenerateOnGet) + GenerateOnGet = true; } - public void Generate() + [Obsolete] + public UniquieID(bool autoGenerate) : this(autoGenerate ? UniquieIDGenerationMode.GenerateOnInit : UniquieIDGenerationMode.None) + { + } + + public virtual void Generate() { if (SimpleMode) - ID = typeof(TargetType).ToString() + currentSimpleID++.ToString(); + ID = GenerateSimple(); else - ID = GenerateUniquieID(string.Empty); + ID = GenerateDefault(); } - public void GenerateIfNull() + + protected virtual string GenerateSimple() + { + return new Random().Next().ToString() + DateTime.Now.ToString("yyyyMMddHHmmssfffffff") + currentSimpleID++.ToString(); + } + + protected virtual string GenerateDefault() + { + return GenerateUniquieID(currentSimpleID++.ToString()); + } + + public virtual void GenerateIfNull() { if (!HasID) Generate(); } - private static string GenerateUniquieID(string var) + public override string ToString() + { + return ID; + } + + public override int GetHashCode() + { + return -1430039477 + EqualityComparer.Default.GetHashCode(_iD); + } + + public override bool Equals(object obj) + { + if (obj is UniquieID iD) + { + if (ReferenceEquals(obj, iD)) + return true; + else + { + var leftHasID = iD.HasID; + var rightHasID = HasID; + + if (!leftHasID && iD.GenerateOnGet) + { + iD.Generate(); + leftHasID = iD.HasID; + } + + if (!rightHasID && GenerateOnGet) + { + Generate(); + rightHasID = HasID; + } + + if (leftHasID && rightHasID) + return _iD.Equals(iD._iD); + } + } + + return base.Equals(obj); + } + + #region Statics for Generation + + protected static string GenerateUniquieID(string var) { var sn = TryGetSerialNumberOfFirstHardDrive(); var dateTime = DateTime.UtcNow.ToString("yyyyMMddHHmmssfffffff"); @@ -88,56 +156,17 @@ namespace Pilz.Cryptography Win32_PhysicalMedia_SerialNumber = sn; } - + return Win32_PhysicalMedia_SerialNumber; } - public override string ToString() => ID; + #endregion - public override bool Equals(object obj) - { - var res = false; - var iD = obj as UniquieID; + public static implicit operator string(UniquieID id) => id.ID; + public static implicit operator UniquieID(string id) => new UniquieID() { ID = id }; + public static implicit operator UniquieID(int id) => new UniquieID() { ID = Convert.ToString(id) }; - if (iD is object) - { - if (ReferenceEquals(res, iD)) - res = true; - else - { - var leftHasID = iD.HasID; - var rightHasID = HasID; - - if (!leftHasID && iD.GenerateOnGet) - { - iD.Generate(); - leftHasID = iD.HasID; - } - - if (!rightHasID && GenerateOnGet) - { - Generate(); - rightHasID = HasID; - } - - if (leftHasID && rightHasID) - res = _iD.Equals(iD._iD); - } - } - - return res; - } - - public override int GetHashCode() - { - return -1430039477 + EqualityComparer.Default.GetHashCode(_iD); - } - - public static implicit operator string(UniquieID id) => id.ID; - public static implicit operator UniquieID(string id) => new UniquieID() { ID = id }; - public static implicit operator UniquieID(int id) => new UniquieID() { ID = Convert.ToString(id) }; - - public static bool operator ==(UniquieID left, UniquieID right) => left.ID.Equals(right.ID); - public static bool operator !=(UniquieID left, UniquieID right) => !left.ID.Equals(right.ID); + public static bool operator ==(UniquieID left, UniquieID right) => left.ID.Equals(right.ID); + public static bool operator !=(UniquieID left, UniquieID right) => !left.ID.Equals(right.ID); } } diff --git a/Pilz.Cryptography/UniquieIDGenerationMode.cs b/Pilz.Cryptography/UniquieIDGenerationMode.cs new file mode 100644 index 0000000..d7f0c34 --- /dev/null +++ b/Pilz.Cryptography/UniquieIDGenerationMode.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Pilz.Cryptography +{ + public enum UniquieIDGenerationMode + { + None, + GenerateOnGet, + GenerateOnInit + } +} diff --git a/Pilz.IO/Extensions.cs b/Pilz.IO/Extensions.cs new file mode 100644 index 0000000..0cf41e2 --- /dev/null +++ b/Pilz.IO/Extensions.cs @@ -0,0 +1,26 @@ +using Pilz.Runtime; +using Pilz.Win32.Native; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; + +namespace Pilz.IO +{ + public static class Extensions + { + static readonly int MAX_PATH = 255; + + public static string GetExecutablePath(bool checkRealOS = false) + { + if (RuntimeInformationsEx.IsOSPlatform(OSType.Windows, checkRealOS)) + { + var sb = new StringBuilder(MAX_PATH); + Kernel32.GetModuleFileName(IntPtr.Zero, sb, MAX_PATH); + return sb.ToString(); + } + else + return Process.GetCurrentProcess().MainModule.FileName; + } + } +} diff --git a/Pilz.IO/Pilz.IO.csproj b/Pilz.IO/Pilz.IO.csproj index 511e3a5..3b9bcb2 100644 --- a/Pilz.IO/Pilz.IO.csproj +++ b/Pilz.IO/Pilz.IO.csproj @@ -86,4 +86,8 @@ Application.Designer.cs + + + + \ No newline at end of file diff --git a/Pilz.UI/PaintingControl/PaintingControl.vb b/Pilz.UI/PaintingControl/PaintingControl.vb index 0de9a3c..e1a7890 100644 --- a/Pilz.UI/PaintingControl/PaintingControl.vb +++ b/Pilz.UI/PaintingControl/PaintingControl.vb @@ -644,7 +644,7 @@ Public Class PaintingControl End Sub Private Sub CheckMouseWheel(sender As Object, e As MouseEventArgs) Handles Me.MouseWheel - If pressedControl Then + If pressedAlt Then Dim val As Single = e.Delta / 120 / 10 ZoomFactor = New SizeF(Math.Max(ZoomFactor.Width + val, 0.25), Math.Max(ZoomFactor.Height + val, 0.25)) Refresh() diff --git a/Pilz.Win32/Native/Kernel32.vb b/Pilz.Win32/Native/Kernel32.vb new file mode 100644 index 0000000..0164502 --- /dev/null +++ b/Pilz.Win32/Native/Kernel32.vb @@ -0,0 +1,16 @@ +Imports System.Runtime.InteropServices +Imports System.Text + +Namespace Native + + Public Class Kernel32 + + Private Const LIB_KERNEL32 As String = "kernel32.dll" + + + Public Shared Function GetModuleFileName(hModule As IntPtr, lpFilename As StringBuilder, nSize As Integer) As UInteger + End Function + + End Class + +End Namespace diff --git a/Pilz.Win32/Native/User32.vb b/Pilz.Win32/Native/User32.vb index d10c083..cf69991 100644 --- a/Pilz.Win32/Native/User32.vb +++ b/Pilz.Win32/Native/User32.vb @@ -4,11 +4,13 @@ Namespace Native Public Class User32 - + Private Const LIB_USER32 As String = "user32.dll" + + Public Shared Function GetWindowRect(ByVal hWnd As IntPtr, ByRef r As RECT) As Boolean End Function - + Public Shared Function ChildWindowFromPointEx(ByVal hWndParent As IntPtr, ByVal pt As POINT, ByVal uFlags As UInteger) As IntPtr End Function diff --git a/Pilz/Runtime/RuntimeInformationsEx.vb b/Pilz/Runtime/RuntimeInformationsEx.vb index d6f53c3..5e9ad7a 100644 --- a/Pilz/Runtime/RuntimeInformationsEx.vb +++ b/Pilz/Runtime/RuntimeInformationsEx.vb @@ -26,9 +26,9 @@ Namespace Runtime End Get End Property - Public ReadOnly Property RealOSType As OSType - Get - Static t As OSType? = Nothing + Public ReadOnly Property RealOSType As OSType + Get + Static t As OSType? = Nothing If t Is Nothing Then @@ -69,9 +69,13 @@ Namespace Runtime End If Return t - End Get - End Property + End Get + End Property - End Module + Public Function IsOSPlatform(os As OSType, checkRealOS As Boolean) As Boolean + Return If(checkRealOS, RealOSType, OSType) = os + End Function + + End Module End Namespace