Merge branch 'master' into net6

This commit is contained in:
2023-08-26 20:35:21 +02:00
10 changed files with 193 additions and 87 deletions

View 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; }
}
}

View File

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

View File

@@ -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");
@@ -92,52 +160,13 @@ namespace Pilz.Cryptography
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);
} }
} }

View 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
View 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;
}
}
}

View File

@@ -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>

View File

@@ -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()

View 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

View File

@@ -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

View File

@@ -72,6 +72,10 @@ Namespace Runtime
End Get End Get
End Property End Property
Public Function IsOSPlatform(os As OSType, checkRealOS As Boolean) As Boolean
Return If(checkRealOS, RealOSType, OSType) = os
End Function
End Module End Module
End Namespace End Namespace