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

90 lines
2.4 KiB
C#

using CPF.Mac.Foundation;
using System;
using System.Runtime.InteropServices;
namespace CPF.Mac.CoreFoundation
{
public struct CFStreamClientContext
{
[MonoNativeFunctionWrapper]
private delegate IntPtr RetainDelegate(IntPtr info);
[MonoNativeFunctionWrapper]
private delegate void ReleaseDelegate(IntPtr info);
[MonoNativeFunctionWrapper]
private delegate IntPtr CopyDescriptionDelegate(IntPtr info);
[MonoNativeFunctionWrapper]
private delegate void CallbackDelegate(IntPtr stream, CFStreamEventType eventType, IntPtr info);
public int Version;
public IntPtr Info;
private IntPtr retain;
private IntPtr release;
private IntPtr copyDescription;
public void Retain()
{
if (!(retain == IntPtr.Zero) && !(Info == IntPtr.Zero))
{
CFReadStreamRef_InvokeRetain(retain, Info);
}
}
public void Release()
{
if (!(release == IntPtr.Zero) && !(Info == IntPtr.Zero))
{
CFReadStreamRef_InvokeRelease(release, Info);
}
}
public override string ToString()
{
if (copyDescription == IntPtr.Zero)
{
return ((ValueType)this).ToString();
}
IntPtr intPtr = CFReadStreamRef_InvokeCopyDescription(copyDescription, Info);
if (!(intPtr == IntPtr.Zero))
{
return new NSString(intPtr).ToString();
}
return ((ValueType)this).ToString();
}
internal void Invoke(IntPtr callback, IntPtr stream, CFStreamEventType eventType)
{
if (!(callback == IntPtr.Zero))
{
CFReadStreamRef_InvokeCallback(callback, stream, eventType, Info);
}
}
private static IntPtr CFReadStreamRef_InvokeRetain(IntPtr retain, IntPtr info)
{
return ((RetainDelegate)Marshal.GetDelegateForFunctionPointer(retain, typeof(RetainDelegate)))(info);
}
private static void CFReadStreamRef_InvokeRelease(IntPtr release, IntPtr info)
{
((ReleaseDelegate)Marshal.GetDelegateForFunctionPointer(release, typeof(ReleaseDelegate)))(info);
}
private static IntPtr CFReadStreamRef_InvokeCopyDescription(IntPtr copyDescription, IntPtr info)
{
return ((CopyDescriptionDelegate)Marshal.GetDelegateForFunctionPointer(copyDescription, typeof(CopyDescriptionDelegate)))(info);
}
private static void CFReadStreamRef_InvokeCallback(IntPtr callback, IntPtr stream, CFStreamEventType eventType, IntPtr info)
{
((CallbackDelegate)Marshal.GetDelegateForFunctionPointer(callback, typeof(CallbackDelegate)))(stream, eventType, info);
}
}
}