Merge branch 'master' into net6
This commit is contained in:
14
Pilz.Cryptography/IUniquieIDHost.cs
Normal file
14
Pilz.Cryptography/IUniquieIDHost.cs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Pilz.Cryptography
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Can be implemented on objects that provides an UniquieID.
|
||||||
|
/// </summary>
|
||||||
|
public interface IUniquieIDHost
|
||||||
|
{
|
||||||
|
UniquieID ID { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,30 +2,28 @@
|
|||||||
using Pilz.Cryptography;
|
using Pilz.Cryptography;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
|
||||||
using System.IO.Compression;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Pilz.Json.Converters
|
namespace Pilz.Json.Converters
|
||||||
{
|
{
|
||||||
public class UniquiIDStringJsonConverter<TargetType> : JsonConverter
|
public class UniquieIDStringJsonConverter : JsonConverter
|
||||||
{
|
{
|
||||||
|
public static bool EnableCheckForDepricatedTypes { get; set; } = true;
|
||||||
|
|
||||||
public override bool CanConvert(Type objectType)
|
public override bool CanConvert(Type objectType)
|
||||||
{
|
{
|
||||||
return typeof(UniquieID<TargetType>).IsAssignableFrom(objectType);
|
return typeof(UniquieID).IsAssignableFrom(objectType);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
|
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
|
||||||
{
|
{
|
||||||
var idString = serializer.Deserialize<string>(reader);
|
var idString = serializer.Deserialize<string>(reader);
|
||||||
UniquieID<TargetType> id;
|
UniquieID id;
|
||||||
|
|
||||||
if (existingValue is object)
|
if (existingValue is UniquieID existingID && (!EnableCheckForDepricatedTypes || existingID.GetType() == typeof(UniquieID)))
|
||||||
id = (UniquieID<TargetType>)existingValue;
|
id = existingID;
|
||||||
else
|
else
|
||||||
id = new UniquieID<TargetType>();
|
id = new UniquieID();
|
||||||
|
|
||||||
id.ID = idString;
|
id.ID = idString;
|
||||||
|
|
||||||
@@ -34,7 +32,7 @@ namespace Pilz.Json.Converters
|
|||||||
|
|
||||||
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
|
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
|
||||||
{
|
{
|
||||||
serializer.Serialize(writer, ((UniquieID<TargetType>)value).ID);
|
serializer.Serialize(writer, ((UniquieID)value).ID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,23 +1,31 @@
|
|||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
|
||||||
using System.Management;
|
using System.Management;
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Pilz.Cryptography
|
namespace Pilz.Cryptography
|
||||||
{
|
{
|
||||||
public class UniquieID<TargetType> : IUniquieID
|
[JsonConverter(typeof(Json.Converters.UniquieIDStringJsonConverter))]
|
||||||
|
public class UniquieID : IUniquieID
|
||||||
{
|
{
|
||||||
private static int currentSimpleID = 0;
|
protected static ulong currentSimpleID = 0;
|
||||||
|
|
||||||
[JsonProperty(nameof(ID))]
|
[JsonProperty(nameof(ID))]
|
||||||
private string _iD;
|
protected string _iD;
|
||||||
|
|
||||||
[JsonIgnore]
|
[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
|
get
|
||||||
{
|
{
|
||||||
@@ -29,36 +37,96 @@ namespace Pilz.Cryptography
|
|||||||
=> _iD = value;
|
=> _iD = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
[JsonIgnore]
|
public UniquieID() : this(UniquieIDGenerationMode.None)
|
||||||
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(bool autoGenerate)
|
public UniquieID(UniquieIDGenerationMode mode) : this(mode, false)
|
||||||
{
|
{
|
||||||
if (autoGenerate)
|
}
|
||||||
|
|
||||||
|
public UniquieID(UniquieIDGenerationMode mode, bool simpleMode)
|
||||||
|
{
|
||||||
|
SimpleMode = simpleMode;
|
||||||
|
|
||||||
|
if (mode == UniquieIDGenerationMode.GenerateOnInit)
|
||||||
GenerateIfNull();
|
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)
|
if (SimpleMode)
|
||||||
ID = typeof(TargetType).ToString() + currentSimpleID++.ToString();
|
ID = GenerateSimple();
|
||||||
else
|
else
|
||||||
ID = GenerateUniquieID<TargetType>(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<UniquieID>(currentSimpleID++.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void GenerateIfNull()
|
||||||
{
|
{
|
||||||
if (!HasID) Generate();
|
if (!HasID) Generate();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string GenerateUniquieID<T>(string var)
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode()
|
||||||
|
{
|
||||||
|
return -1430039477 + EqualityComparer<string>.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<T>(string var)
|
||||||
{
|
{
|
||||||
var sn = TryGetSerialNumberOfFirstHardDrive();
|
var sn = TryGetSerialNumberOfFirstHardDrive();
|
||||||
var dateTime = DateTime.UtcNow.ToString("yyyyMMddHHmmssfffffff");
|
var dateTime = DateTime.UtcNow.ToString("yyyyMMddHHmmssfffffff");
|
||||||
@@ -88,56 +156,17 @@ namespace Pilz.Cryptography
|
|||||||
|
|
||||||
Win32_PhysicalMedia_SerialNumber = sn;
|
Win32_PhysicalMedia_SerialNumber = sn;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Win32_PhysicalMedia_SerialNumber;
|
return Win32_PhysicalMedia_SerialNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string ToString() => ID;
|
#endregion
|
||||||
|
|
||||||
public override bool Equals(object obj)
|
public static implicit operator string(UniquieID id) => id.ID;
|
||||||
{
|
public static implicit operator UniquieID(string id) => new UniquieID() { ID = id };
|
||||||
var res = false;
|
public static implicit operator UniquieID(int id) => new UniquieID() { ID = Convert.ToString(id) };
|
||||||
var iD = obj as UniquieID<TargetType>;
|
|
||||||
|
|
||||||
if (iD is object)
|
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);
|
||||||
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<string>.Default.GetHashCode(_iD);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static implicit operator string(UniquieID<TargetType> id) => id.ID;
|
|
||||||
public static implicit operator UniquieID<TargetType>(string id) => new UniquieID<TargetType>() { ID = id };
|
|
||||||
public static implicit operator UniquieID<TargetType>(int id) => new UniquieID<TargetType>() { ID = Convert.ToString(id) };
|
|
||||||
|
|
||||||
public static bool operator ==(UniquieID<TargetType> left, UniquieID<TargetType> right) => left.ID.Equals(right.ID);
|
|
||||||
public static bool operator !=(UniquieID<TargetType> left, UniquieID<TargetType> right) => !left.ID.Equals(right.ID);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
13
Pilz.Cryptography/UniquieIDGenerationMode.cs
Normal file
13
Pilz.Cryptography/UniquieIDGenerationMode.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Pilz.Cryptography
|
||||||
|
{
|
||||||
|
public enum UniquieIDGenerationMode
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
GenerateOnGet,
|
||||||
|
GenerateOnInit
|
||||||
|
}
|
||||||
|
}
|
||||||
26
Pilz.IO/Extensions.cs
Normal file
26
Pilz.IO/Extensions.cs
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -86,4 +86,8 @@
|
|||||||
<LastGenOutput>Application.Designer.cs</LastGenOutput>
|
<LastGenOutput>Application.Designer.cs</LastGenOutput>
|
||||||
</None>
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Pilz.Win32\Pilz.Win32.vbproj" />
|
||||||
|
<ProjectReference Include="..\Pilz\Pilz.vbproj" />
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -644,7 +644,7 @@ Public Class PaintingControl
|
|||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Private Sub CheckMouseWheel(sender As Object, e As MouseEventArgs) Handles Me.MouseWheel
|
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
|
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))
|
ZoomFactor = New SizeF(Math.Max(ZoomFactor.Width + val, 0.25), Math.Max(ZoomFactor.Height + val, 0.25))
|
||||||
Refresh()
|
Refresh()
|
||||||
|
|||||||
16
Pilz.Win32/Native/Kernel32.vb
Normal file
16
Pilz.Win32/Native/Kernel32.vb
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
Imports System.Runtime.InteropServices
|
||||||
|
Imports System.Text
|
||||||
|
|
||||||
|
Namespace Native
|
||||||
|
|
||||||
|
Public Class Kernel32
|
||||||
|
|
||||||
|
Private Const LIB_KERNEL32 As String = "kernel32.dll"
|
||||||
|
|
||||||
|
<DllImport(LIB_KERNEL32)>
|
||||||
|
Public Shared Function GetModuleFileName(hModule As IntPtr, lpFilename As StringBuilder, nSize As Integer) As UInteger
|
||||||
|
End Function
|
||||||
|
|
||||||
|
End Class
|
||||||
|
|
||||||
|
End Namespace
|
||||||
@@ -4,11 +4,13 @@ Namespace Native
|
|||||||
|
|
||||||
Public Class User32
|
Public Class User32
|
||||||
|
|
||||||
<DllImport("user32")>
|
Private Const LIB_USER32 As String = "user32.dll"
|
||||||
|
|
||||||
|
<DllImport(LIB_USER32)>
|
||||||
Public Shared Function GetWindowRect(ByVal hWnd As IntPtr, ByRef r As RECT) As Boolean
|
Public Shared Function GetWindowRect(ByVal hWnd As IntPtr, ByRef r As RECT) As Boolean
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
<DllImport("user32.dll")>
|
<DllImport(LIB_USER32)>
|
||||||
Public Shared Function ChildWindowFromPointEx(ByVal hWndParent As IntPtr, ByVal pt As POINT, ByVal uFlags As UInteger) As IntPtr
|
Public Shared Function ChildWindowFromPointEx(ByVal hWndParent As IntPtr, ByVal pt As POINT, ByVal uFlags As UInteger) As IntPtr
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
|
|||||||
@@ -26,9 +26,9 @@ Namespace Runtime
|
|||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
|
|
||||||
Public ReadOnly Property RealOSType As OSType
|
Public ReadOnly Property RealOSType As OSType
|
||||||
Get
|
Get
|
||||||
Static t As OSType? = Nothing
|
Static t As OSType? = Nothing
|
||||||
|
|
||||||
If t Is Nothing Then
|
If t Is Nothing Then
|
||||||
|
|
||||||
@@ -69,9 +69,13 @@ Namespace Runtime
|
|||||||
End If
|
End If
|
||||||
|
|
||||||
Return t
|
Return t
|
||||||
End Get
|
End Get
|
||||||
End Property
|
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
|
End Namespace
|
||||||
|
|||||||
Reference in New Issue
Block a user