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

103 lines
2.7 KiB
C#

using CPF.Mac.ObjCRuntime;
using System;
using System.Runtime.InteropServices;
namespace CPF.Mac.CoreFoundation
{
public class CFUrl : INativeObject, IDisposable
{
internal IntPtr handle;
public IntPtr Handle => handle;
public string FileSystemPath => GetFileSystemPath(handle);
~CFUrl()
{
Dispose(disposing: false);
}
public void Dispose()
{
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (handle != IntPtr.Zero)
{
CFObject.CFRelease(handle);
handle = IntPtr.Zero;
}
}
[DllImport("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation", CharSet = CharSet.Unicode)]
private static extern IntPtr CFURLCreateWithFileSystemPath(IntPtr allocator, IntPtr cfstringref, CFUrlPathStyle pathstyle, bool isdir);
internal CFUrl(IntPtr handle)
{
this.handle = handle;
}
public static CFUrl FromFile(string filename)
{
using (CFString cFString = new CFString(filename))
{
IntPtr value = CFURLCreateWithFileSystemPath(IntPtr.Zero, cFString.Handle, CFUrlPathStyle.POSIX, isdir: false);
if (value == IntPtr.Zero)
{
return null;
}
return new CFUrl(value);
}
}
[DllImport("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation", CharSet = CharSet.Unicode)]
private static extern IntPtr CFURLCreateWithString(IntPtr allocator, IntPtr stringref, IntPtr baseUrl);
public static CFUrl FromUrlString(string url, CFUrl baseurl)
{
using (CFString cFString = new CFString(url))
{
return FromStringHandle(cFString.Handle, baseurl);
}
}
internal static CFUrl FromStringHandle(IntPtr cfstringHandle, CFUrl baseurl)
{
IntPtr value = CFURLCreateWithString(IntPtr.Zero, cfstringHandle, baseurl?.Handle ?? IntPtr.Zero);
if (value == IntPtr.Zero)
{
return null;
}
return new CFUrl(value);
}
[DllImport("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation")]
private static extern IntPtr CFURLGetString(IntPtr anURL);
public override string ToString()
{
using (CFString cFString = new CFString(CFURLGetString(handle)))
{
return cFString.ToString();
}
}
[DllImport("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation")]
private static extern IntPtr CFURLCopyFileSystemPath(IntPtr cfUrl, int style);
internal static string GetFileSystemPath(IntPtr hcfurl)
{
using (CFString cFString = new CFString(CFURLCopyFileSystemPath(hcfurl, 0), owns: true))
{
return cFString.ToString();
}
}
[DllImport("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation", EntryPoint = "CFURLGetTypeID")]
public static extern int GetTypeID();
}
}