54 lines
1.5 KiB
C#
54 lines
1.5 KiB
C#
using System;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
|
|
namespace Foodsoft.Alpm
|
|
{
|
|
internal readonly struct UTF8Marshaler : ICustomMarshaler
|
|
{
|
|
private static readonly UTF8Marshaler _instance = default;
|
|
|
|
// ReSharper disable once UnusedMember.Local
|
|
// ReSharper disable once UnusedParameter.Local
|
|
private static ICustomMarshaler GetInstance(string cookie)
|
|
{
|
|
return _instance;
|
|
}
|
|
|
|
public void CleanUpManagedData(object managedObj) { }
|
|
|
|
public void CleanUpNativeData(IntPtr pNativeData)
|
|
{
|
|
if (pNativeData == IntPtr.Zero)
|
|
return;
|
|
Marshal.FreeHGlobal(pNativeData);
|
|
}
|
|
|
|
public int GetNativeDataSize() => -1;
|
|
|
|
public unsafe IntPtr MarshalManagedToNative(object? managedObj)
|
|
{
|
|
if (managedObj is null) return IntPtr.Zero;
|
|
|
|
var s = (string) managedObj;
|
|
|
|
var nb = Encoding.UTF8.GetMaxByteCount(s.Length);
|
|
|
|
var pMem = Marshal.AllocHGlobal(nb + 1);
|
|
var pbMem = (byte*) pMem;
|
|
|
|
int nbWritten;
|
|
fixed (char* firstChar = s)
|
|
{
|
|
nbWritten = Encoding.UTF8.GetBytes(firstChar, s.Length, pbMem, nb);
|
|
}
|
|
pbMem[nbWritten] = 0;
|
|
return pMem;
|
|
}
|
|
|
|
public object MarshalNativeToManaged(IntPtr pNativeData)
|
|
{
|
|
return Marshal.PtrToStringUTF8(pNativeData)!;
|
|
}
|
|
}
|
|
} |