mirror of
https://gitee.com/csharpui/CPF.git
synced 2025-07-16 16:50:45 +08:00
90 lines
2.4 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|