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

135 lines
4.1 KiB
C#

using CPF.Mac.Foundation;
using CPF.Mac.ObjCRuntime;
using System;
using System.Runtime.InteropServices;
namespace CPF.Mac.CoreFoundation
{
public class CFReadStream : CFStream
{
public CFReadStream(IntPtr handle)
: base(handle)
{
}
[DllImport("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation")]
private static extern IntPtr CFReadStreamCopyError(IntPtr handle);
public override CFException GetError()
{
IntPtr intPtr = CFReadStreamCopyError(base.Handle);
if (intPtr == IntPtr.Zero)
{
return null;
}
return CFException.FromCFError(intPtr);
}
[DllImport("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation")]
private static extern bool CFReadStreamOpen(IntPtr handle);
protected override bool DoOpen()
{
return CFReadStreamOpen(base.Handle);
}
[DllImport("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation")]
private static extern void CFReadStreamClose(IntPtr handle);
protected override void DoClose()
{
CFReadStreamClose(base.Handle);
}
[DllImport("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation")]
private static extern CFStreamStatus CFReadStreamGetStatus(IntPtr handle);
protected override CFStreamStatus DoGetStatus()
{
return CFReadStreamGetStatus(base.Handle);
}
[DllImport("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation")]
private static extern bool CFReadStreamHasBytesAvailable(IntPtr handle);
public bool HasBytesAvailable()
{
return CFReadStreamHasBytesAvailable(base.Handle);
}
[DllImport("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation")]
private static extern void CFReadStreamScheduleWithRunLoop(IntPtr handle, IntPtr loop, IntPtr mode);
protected override void ScheduleWithRunLoop(CFRunLoop loop, NSString mode)
{
CFReadStreamScheduleWithRunLoop(base.Handle, loop.Handle, mode.Handle);
}
[DllImport("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation")]
private static extern void CFReadStreamUnscheduleFromRunLoop(IntPtr handle, IntPtr loop, IntPtr mode);
protected override void UnscheduleFromRunLoop(CFRunLoop loop, NSString mode)
{
CFReadStreamUnscheduleFromRunLoop(base.Handle, loop.Handle, mode.Handle);
}
[DllImport("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation")]
private static extern bool CFReadStreamSetClient(IntPtr stream, CFIndex eventTypes, CFStreamCallback cb, IntPtr context);
protected override bool DoSetClient(CFStreamCallback callback, CFIndex eventTypes, IntPtr context)
{
return CFReadStreamSetClient(base.Handle, eventTypes, callback, context);
}
[DllImport("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation")]
private static extern CFIndex CFReadStreamRead(IntPtr handle, IntPtr buffer, CFIndex count);
public int Read(byte[] buffer)
{
return Read(buffer, 0, buffer.Length);
}
public int Read(byte[] buffer, int offset, int count)
{
CheckHandle();
if (offset < 0)
{
throw new ArgumentException();
}
if (count < 1)
{
throw new ArgumentException();
}
if (offset + count > buffer.Length)
{
throw new ArgumentException();
}
GCHandle gCHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
try
{
return CFReadStreamRead(buffer: new IntPtr(gCHandle.AddrOfPinnedObject().ToInt64() + offset), handle: base.Handle, count: count);
}
finally
{
gCHandle.Free();
}
}
[DllImport("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation")]
private static extern IntPtr CFReadStreamCopyProperty(IntPtr handle, IntPtr name);
protected override IntPtr DoGetProperty(NSString name)
{
return CFReadStreamCopyProperty(base.Handle, name.Handle);
}
[DllImport("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation")]
private static extern bool CFReadStreamSetProperty(IntPtr handle, IntPtr name, IntPtr value);
protected override bool DoSetProperty(NSString name, INativeObject value)
{
return CFReadStreamSetProperty(base.Handle, name.Handle, value.Handle);
}
}
}