CPF/CPF.Mac/Mac/Security/SecIdentity.cs
2023-11-21 23:05:03 +08:00

70 lines
1.4 KiB
C#

using CPF.Mac.CoreFoundation;
using CPF.Mac.Foundation;
using CPF.Mac.ObjCRuntime;
using System;
using System.Runtime.InteropServices;
namespace CPF.Mac.Security
{
public class SecIdentity : INativeObject, IDisposable
{
internal IntPtr handle;
public SecCertificate Certificate
{
get
{
if (handle == IntPtr.Zero)
{
throw new ObjectDisposedException("SecIdentity");
}
SecIdentityCopyCertificate(handle, out IntPtr _);
return new SecCertificate(handle, owns: true);
}
}
public IntPtr Handle => handle;
internal SecIdentity(IntPtr handle)
: this(handle, owns: false)
{
}
[Preserve(Conditional = true)]
internal SecIdentity(IntPtr handle, bool owns)
{
this.handle = handle;
if (!owns)
{
CFObject.CFRetain(handle);
}
}
[DllImport("/System/Library/Frameworks/Security.framework/Security", EntryPoint = "SecIdentityGetTypeID")]
public static extern int GetTypeID();
[DllImport("/System/Library/Frameworks/Security.framework/Security")]
private static extern IntPtr SecIdentityCopyCertificate(IntPtr handle, out IntPtr cert);
~SecIdentity()
{
Dispose(disposing: false);
}
public void Dispose()
{
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
public virtual void Dispose(bool disposing)
{
if (handle != IntPtr.Zero)
{
CFObject.CFRelease(handle);
handle = IntPtr.Zero;
}
}
}
}