211 lines
5.2 KiB
C#
211 lines
5.2 KiB
C#
|
using System;
|
||
|
using System.Runtime.InteropServices;
|
||
|
|
||
|
namespace eina {
|
||
|
|
||
|
public class Binbuf : IDisposable
|
||
|
{
|
||
|
[DllImport(efl.Libs.Eina)] public static extern IntPtr
|
||
|
eina_binbuf_new();
|
||
|
[DllImport(efl.Libs.Eina)] public static extern void
|
||
|
eina_binbuf_free(IntPtr buf);
|
||
|
[DllImport(efl.Libs.Eina)] public static extern void
|
||
|
eina_binbuf_reset(IntPtr buf);
|
||
|
[DllImport(efl.Libs.Eina)] public static extern byte
|
||
|
eina_binbuf_append_length(IntPtr buf, byte[] str, UIntPtr length);
|
||
|
[DllImport(efl.Libs.Eina)] public static extern byte
|
||
|
eina_binbuf_append_slice(IntPtr buf, eina.Slice slice);
|
||
|
[DllImport(efl.Libs.Eina)] public static extern byte
|
||
|
eina_binbuf_append_buffer(IntPtr buf, IntPtr data);
|
||
|
[DllImport(efl.Libs.Eina)] public static extern byte
|
||
|
eina_binbuf_append_char(IntPtr buf, byte c);
|
||
|
[DllImport(efl.Libs.Eina)] public static extern byte
|
||
|
eina_binbuf_insert_length(IntPtr buf, byte[] str, UIntPtr length, UIntPtr pos);
|
||
|
[DllImport(efl.Libs.Eina)] public static extern byte
|
||
|
eina_binbuf_insert_slice(IntPtr buf, eina.Slice slice, UIntPtr pos);
|
||
|
[DllImport(efl.Libs.Eina)] public static extern byte
|
||
|
eina_binbuf_insert_char(IntPtr buf, byte c, UIntPtr pos);
|
||
|
[DllImport(efl.Libs.Eina)] public static extern byte
|
||
|
eina_binbuf_remove(IntPtr buf, UIntPtr start, UIntPtr end);
|
||
|
[DllImport(efl.Libs.Eina)] public static extern IntPtr
|
||
|
eina_binbuf_string_get(IntPtr buf);
|
||
|
[DllImport(efl.Libs.Eina)] public static extern void
|
||
|
eina_binbuf_string_free(IntPtr buf);
|
||
|
[DllImport(efl.Libs.Eina)] public static extern UIntPtr
|
||
|
eina_binbuf_length_get(IntPtr buf);
|
||
|
[DllImport(efl.Libs.Eina)] public static extern eina.Slice
|
||
|
eina_binbuf_slice_get(IntPtr buf);
|
||
|
|
||
|
public IntPtr Handle {get;set;} = IntPtr.Zero;
|
||
|
public bool Own {get;set;}
|
||
|
|
||
|
public int Length
|
||
|
{
|
||
|
get { return (int) GetLength(); }
|
||
|
}
|
||
|
|
||
|
private void InitNew()
|
||
|
{
|
||
|
Handle = eina_binbuf_new();
|
||
|
Own = true;
|
||
|
if (Handle == IntPtr.Zero)
|
||
|
throw new SEHException("Could not alloc binbuf");
|
||
|
}
|
||
|
|
||
|
public Binbuf()
|
||
|
{
|
||
|
InitNew();
|
||
|
}
|
||
|
|
||
|
public Binbuf(byte[] str, uint? length = null)
|
||
|
{
|
||
|
InitNew();
|
||
|
|
||
|
if (str != null)
|
||
|
{
|
||
|
if (!Append(str, (length != null ? length.Value : (uint)(str.Length))))
|
||
|
{
|
||
|
Dispose();
|
||
|
throw new SEHException("Could not append on binbuf");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public Binbuf(Binbuf bb)
|
||
|
{
|
||
|
InitNew();
|
||
|
|
||
|
if (bb != null)
|
||
|
{
|
||
|
Append(bb);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public Binbuf(IntPtr handle, bool own)
|
||
|
{
|
||
|
Handle = handle;
|
||
|
Own = own;
|
||
|
}
|
||
|
|
||
|
~Binbuf()
|
||
|
{
|
||
|
Dispose(false);
|
||
|
}
|
||
|
|
||
|
protected virtual void Dispose(bool disposing)
|
||
|
{
|
||
|
IntPtr h = Handle;
|
||
|
Handle = IntPtr.Zero;
|
||
|
if (Own && h != IntPtr.Zero) {
|
||
|
eina_binbuf_free(Handle);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void Dispose()
|
||
|
{
|
||
|
Dispose(true);
|
||
|
GC.SuppressFinalize(this);
|
||
|
}
|
||
|
|
||
|
public void Free()
|
||
|
{
|
||
|
Dispose();
|
||
|
}
|
||
|
|
||
|
public IntPtr Release()
|
||
|
{
|
||
|
IntPtr h = Handle;
|
||
|
Handle = IntPtr.Zero;
|
||
|
return h;
|
||
|
}
|
||
|
|
||
|
public void Reset()
|
||
|
{
|
||
|
eina_binbuf_reset(Handle);
|
||
|
}
|
||
|
|
||
|
public bool Append(byte[] str)
|
||
|
{
|
||
|
return 0 != eina_binbuf_append_length(Handle, str, (UIntPtr)(str.Length));
|
||
|
}
|
||
|
|
||
|
public bool Append(byte[] str, uint length)
|
||
|
{
|
||
|
return 0 != eina_binbuf_append_length(Handle, str, (UIntPtr)length);
|
||
|
}
|
||
|
|
||
|
public bool Append(Binbuf bb)
|
||
|
{
|
||
|
return 0 != eina_binbuf_append_buffer(Handle, bb.Handle);
|
||
|
}
|
||
|
|
||
|
public bool Append(byte c)
|
||
|
{
|
||
|
return 0 != eina_binbuf_append_char(Handle, c);
|
||
|
}
|
||
|
|
||
|
public bool Append(eina.Slice slice)
|
||
|
{
|
||
|
return 0 != eina_binbuf_append_slice(Handle, slice);
|
||
|
}
|
||
|
|
||
|
public bool Insert(byte[] str, uint pos)
|
||
|
{
|
||
|
return 0 != eina_binbuf_insert_length(Handle, str, (UIntPtr)(str.Length), (UIntPtr)pos);
|
||
|
}
|
||
|
|
||
|
public bool Insert(byte[] str, uint length, uint pos)
|
||
|
{
|
||
|
return 0 != eina_binbuf_insert_length(Handle, str, (UIntPtr)length, (UIntPtr)pos);
|
||
|
}
|
||
|
|
||
|
public bool Insert(byte c, uint pos)
|
||
|
{
|
||
|
return 0 != eina_binbuf_insert_char(Handle, c, (UIntPtr)pos);
|
||
|
}
|
||
|
|
||
|
public bool Insert(eina.Slice slice, uint pos)
|
||
|
{
|
||
|
return 0 != eina_binbuf_insert_slice(Handle, slice, (UIntPtr)pos);
|
||
|
}
|
||
|
|
||
|
public bool Remove(uint start, uint end)
|
||
|
{
|
||
|
return 0 != eina_binbuf_remove(Handle, (UIntPtr)start, (UIntPtr)end);
|
||
|
}
|
||
|
|
||
|
public byte[] GetBytes()
|
||
|
{
|
||
|
var ptr = eina_binbuf_string_get(Handle);
|
||
|
if (ptr == IntPtr.Zero)
|
||
|
return null;
|
||
|
|
||
|
var size = (int)(this.GetLength());
|
||
|
byte[] mArray = new byte[size];
|
||
|
Marshal.Copy(ptr, mArray, 0, size);
|
||
|
return mArray;
|
||
|
}
|
||
|
|
||
|
public IntPtr GetStringNative()
|
||
|
{
|
||
|
return eina_binbuf_string_get(Handle);
|
||
|
}
|
||
|
|
||
|
public void FreeString()
|
||
|
{
|
||
|
eina_binbuf_string_free(Handle);
|
||
|
}
|
||
|
|
||
|
public UIntPtr GetLength()
|
||
|
{
|
||
|
return eina_binbuf_length_get(Handle);
|
||
|
}
|
||
|
|
||
|
eina.Slice GetSlice()
|
||
|
{
|
||
|
return eina_binbuf_slice_get(Handle);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|