csharpc-sharpdotnetxamlavaloniauicross-platformcross-platform-xamlavaloniaguimulti-platformuser-interfacedotnetcore
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1.3 KiB
49 lines
1.3 KiB
using System;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
|
|
namespace Avalonia.Platform.Interop
|
|
{
|
|
public class Utf8Buffer : SafeHandle
|
|
{
|
|
private GCHandle _gchandle;
|
|
private byte[] _data;
|
|
|
|
public Utf8Buffer(string s) : base(IntPtr.Zero, true)
|
|
{
|
|
if (s == null)
|
|
return;
|
|
_data = Encoding.UTF8.GetBytes(s);
|
|
_gchandle = GCHandle.Alloc(_data, GCHandleType.Pinned);
|
|
handle = _gchandle.AddrOfPinnedObject();
|
|
}
|
|
|
|
public int ByteLen => _data.Length;
|
|
|
|
protected override bool ReleaseHandle()
|
|
{
|
|
if (handle != IntPtr.Zero)
|
|
{
|
|
handle = IntPtr.Zero;
|
|
_data = null;
|
|
_gchandle.Free();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public override bool IsInvalid => handle == IntPtr.Zero;
|
|
|
|
public static unsafe string StringFromPtr(IntPtr s)
|
|
{
|
|
var pstr = (byte*)s;
|
|
if (pstr == null)
|
|
return null;
|
|
int len;
|
|
for (len = 0; pstr[len] != 0; len++) ;
|
|
var bytes = new byte[len];
|
|
Marshal.Copy(s, bytes, 0, len);
|
|
|
|
return Encoding.UTF8.GetString(bytes, 0, len);
|
|
}
|
|
}
|
|
}
|
|
|