2017-12-06 16:03:55 -08:00
|
|
|
#pragma warning disable 1591
|
2017-11-23 16:49:22 -08:00
|
|
|
|
|
|
|
using System;
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
using static eina.NativeCustomExportFunctions;
|
|
|
|
|
|
|
|
namespace efl { namespace eo {
|
|
|
|
|
|
|
|
public class Globals {
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern void efl_object_init();
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern void efl_object_shutdown();
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern IntPtr
|
|
|
|
_efl_add_internal_start([MarshalAs(UnmanagedType.LPStr)] String file, int line,
|
|
|
|
IntPtr klass, IntPtr parent, byte is_ref, byte is_fallback);
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern IntPtr
|
|
|
|
_efl_add_end(IntPtr eo, byte is_ref, byte is_fallback);
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern IntPtr
|
|
|
|
efl_ref(IntPtr eo);
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern void
|
|
|
|
efl_unref(IntPtr eo);
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern IntPtr
|
|
|
|
efl_class_new(IntPtr class_description, IntPtr base0);
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern IntPtr
|
|
|
|
efl_class_new(IntPtr class_description, IntPtr base0, IntPtr base1);
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern IntPtr
|
|
|
|
efl_class_new(IntPtr class_description, IntPtr base0, IntPtr base1, IntPtr base2);
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern IntPtr
|
|
|
|
efl_class_new(IntPtr class_description, IntPtr base0, IntPtr base1, IntPtr base2, IntPtr base3);
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern IntPtr
|
|
|
|
efl_class_new(IntPtr class_description, IntPtr base0, IntPtr base1, IntPtr base2, IntPtr base3, IntPtr base4);
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern IntPtr
|
|
|
|
efl_class_new(IntPtr class_description, IntPtr base0, IntPtr base1, IntPtr base2, IntPtr base3, IntPtr base4, IntPtr base5);
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern IntPtr
|
|
|
|
efl_class_new(IntPtr class_description, IntPtr base0, IntPtr base1, IntPtr base2, IntPtr base3, IntPtr base4, IntPtr base5, IntPtr base6);
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern IntPtr
|
|
|
|
efl_class_new(IntPtr class_description, IntPtr base0, IntPtr base1, IntPtr base2, IntPtr base3, IntPtr base4, IntPtr base5, IntPtr base6, IntPtr base7);
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern byte efl_class_functions_set(IntPtr klass_id, IntPtr object_ops, IntPtr class_ops);
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern IntPtr efl_data_scope_get(IntPtr obj, IntPtr klass);
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern IntPtr efl_super(IntPtr obj, IntPtr klass);
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern IntPtr efl_class_get(IntPtr obj);
|
|
|
|
#if WIN32
|
|
|
|
public static IntPtr RTLD_DEFAULT = new IntPtr(1);
|
|
|
|
#else
|
|
|
|
public static IntPtr RTLD_DEFAULT = new IntPtr(0);
|
|
|
|
#endif
|
|
|
|
[DllImport(efl.Libs.Evil)] public static extern IntPtr dlerror();
|
|
|
|
[DllImport(efl.Libs.Evil)] public static extern IntPtr dlsym
|
|
|
|
(IntPtr handle, [MarshalAs(UnmanagedType.LPStr)] String name);
|
|
|
|
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern bool efl_event_callback_priority_add(
|
|
|
|
System.IntPtr obj,
|
|
|
|
// FIXME commented to allow passing null stuff during test
|
|
|
|
/* ref efl.kw_event.Description desc, */
|
|
|
|
efl.kw_event.Description desc,
|
|
|
|
short priority,
|
|
|
|
efl.Event_Cb cb,
|
|
|
|
System.IntPtr data);
|
|
|
|
[DllImport(efl.Libs.Eo)] public static extern bool efl_event_callback_del(
|
|
|
|
System.IntPtr obj,
|
|
|
|
efl.kw_event.Description desc,
|
|
|
|
efl.Event_Cb cb,
|
|
|
|
System.IntPtr data);
|
|
|
|
|
|
|
|
|
|
|
|
public const int RTLD_NOW = 2;
|
|
|
|
|
|
|
|
public delegate byte class_initializer(IntPtr klass);
|
|
|
|
|
|
|
|
public static IntPtr register_class(class_initializer initializer, IntPtr base_klass)
|
|
|
|
{
|
|
|
|
ClassDescription description;
|
|
|
|
description.version = 2; // EO_VERSION
|
|
|
|
description.name = "BoxInherit";
|
|
|
|
description.class_type = 0; // REGULAR
|
|
|
|
description.data_size = (UIntPtr)8;
|
|
|
|
description.class_initializer = IntPtr.Zero;
|
|
|
|
description.class_constructor = IntPtr.Zero;
|
|
|
|
description.class_destructor = IntPtr.Zero;
|
|
|
|
|
|
|
|
if(initializer != null)
|
|
|
|
description.class_initializer = Marshal.GetFunctionPointerForDelegate(initializer);
|
|
|
|
|
|
|
|
IntPtr description_ptr = eina.MemoryNative.Alloc(Marshal.SizeOf(description));
|
|
|
|
Marshal.StructureToPtr(description, description_ptr, false);
|
|
|
|
|
|
|
|
eina.Log.Debug("Going to register!");
|
|
|
|
IntPtr klass = efl.eo.Globals.efl_class_new(description_ptr, base_klass, IntPtr.Zero);
|
|
|
|
if(klass == IntPtr.Zero)
|
|
|
|
eina.Log.Error("klass was not registered");
|
|
|
|
eina.Log.Debug("Registered?");
|
|
|
|
return klass;
|
|
|
|
}
|
|
|
|
public static IntPtr instantiate_start(IntPtr klass, efl.Object parent)
|
|
|
|
{
|
|
|
|
eina.Log.Debug("Instantiating");
|
|
|
|
System.IntPtr parent_ptr = System.IntPtr.Zero;
|
|
|
|
if(parent != null)
|
|
|
|
parent_ptr = parent.raw_handle;
|
|
|
|
|
|
|
|
System.IntPtr eo = efl.eo.Globals._efl_add_internal_start("file", 0, klass, parent_ptr, 0, 0);
|
|
|
|
return eo;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static IntPtr instantiate_end(IntPtr eo) {
|
|
|
|
eina.Log.Debug("efl_add_internal_start returned");
|
|
|
|
eo = efl.eo.Globals._efl_add_end(eo, 0, 0);
|
|
|
|
eina.Log.Debug("efl_add_end returned");
|
|
|
|
return eo;
|
|
|
|
}
|
|
|
|
public static void data_set(efl.eo.IWrapper obj)
|
|
|
|
{
|
|
|
|
IntPtr pd = efl.eo.Globals.efl_data_scope_get(obj.raw_handle, obj.raw_klass);
|
|
|
|
{
|
|
|
|
GCHandle gch = GCHandle.Alloc(obj);
|
|
|
|
EolianPD epd;
|
|
|
|
epd.pointer = GCHandle.ToIntPtr(gch);
|
|
|
|
Marshal.StructureToPtr(epd, pd, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
public static efl.eo.IWrapper data_get(IntPtr pd)
|
|
|
|
{
|
|
|
|
EolianPD epd = (EolianPD)Marshal.PtrToStructure(pd, typeof(EolianPD));
|
|
|
|
if(epd.pointer != IntPtr.Zero)
|
|
|
|
{
|
|
|
|
GCHandle gch = GCHandle.FromIntPtr(epd.pointer);
|
|
|
|
return (efl.eo.IWrapper)gch.Target;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static IntPtr cached_string_to_intptr(Dictionary<String, IntPtr> dict, String str)
|
|
|
|
{
|
|
|
|
IntPtr ptr = IntPtr.Zero;
|
|
|
|
if (!dict.TryGetValue(str, out ptr))
|
|
|
|
{
|
|
|
|
ptr = eina.StringConversion.ManagedStringToNativeUtf8Alloc(str);
|
|
|
|
dict[str] = ptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static IntPtr cached_stringshare_to_intptr(Dictionary<String, IntPtr> dict, String str)
|
|
|
|
{
|
|
|
|
IntPtr ptr = IntPtr.Zero;
|
|
|
|
if (!dict.TryGetValue(str, out ptr))
|
|
|
|
{
|
|
|
|
ptr = eina.Stringshare.eina_stringshare_add(str);
|
|
|
|
dict[str] = ptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void free_dict_values(Dictionary<String, IntPtr> dict)
|
|
|
|
{
|
|
|
|
foreach(IntPtr ptr in dict.Values)
|
|
|
|
{
|
|
|
|
eina.MemoryNative.Free(ptr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void free_stringshare_values(Dictionary<String, IntPtr> dict)
|
|
|
|
{
|
|
|
|
foreach(IntPtr ptr in dict.Values)
|
|
|
|
{
|
|
|
|
eina.Stringshare.eina_stringshare_del(ptr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void free_gchandle(IntPtr ptr)
|
|
|
|
{
|
|
|
|
GCHandle handle = GCHandle.FromIntPtr(ptr);
|
|
|
|
handle.Free();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static class Config
|
|
|
|
{
|
|
|
|
public static void Init()
|
|
|
|
{
|
|
|
|
Globals.efl_object_init();
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void Shutdown()
|
|
|
|
{
|
|
|
|
Globals.efl_object_shutdown();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public interface IWrapper
|
|
|
|
{
|
|
|
|
IntPtr raw_handle
|
|
|
|
{
|
|
|
|
get;
|
|
|
|
}
|
|
|
|
IntPtr raw_klass
|
|
|
|
{
|
|
|
|
get;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public interface IOwnershipTag
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
public class OwnTag : IOwnershipTag
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
public class NonOwnTag : IOwnershipTag
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
public class MarshalTest<T, U> : ICustomMarshaler
|
|
|
|
where U : IOwnershipTag
|
|
|
|
{
|
|
|
|
public static ICustomMarshaler GetInstance(string cookie)
|
|
|
|
{
|
|
|
|
eina.Log.Debug("MarshalTest.GetInstace cookie " + cookie);
|
|
|
|
return new MarshalTest<T, U>();
|
|
|
|
}
|
|
|
|
public void CleanUpManagedData(object ManagedObj)
|
|
|
|
{
|
|
|
|
//eina.Log.Warning("MarshalTest.CleanUpManagedData not implemented");
|
|
|
|
//throw new NotImplementedException();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void CleanUpNativeData(IntPtr pNativeData)
|
|
|
|
{
|
|
|
|
//eina.Log.Warning("MarshalTest.CleanUpNativeData not implemented");
|
|
|
|
//throw new NotImplementedException();
|
|
|
|
}
|
|
|
|
|
|
|
|
public int GetNativeDataSize()
|
|
|
|
{
|
|
|
|
eina.Log.Debug("MarshalTest.GetNativeDataSize");
|
|
|
|
return 0;
|
|
|
|
//return 8;
|
|
|
|
}
|
|
|
|
|
|
|
|
public IntPtr MarshalManagedToNative(object ManagedObj)
|
|
|
|
{
|
|
|
|
eina.Log.Debug("MarshalTest.MarshallManagedToNative");
|
|
|
|
var r = ((IWrapper)ManagedObj).raw_handle;
|
|
|
|
if (typeof(U) == typeof(OwnTag))
|
|
|
|
efl.eo.Globals.efl_ref(r);
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
public object MarshalNativeToManaged(IntPtr pNativeData)
|
|
|
|
{
|
|
|
|
eina.Log.Debug("MarshalTest.MarshalNativeToManaged");
|
|
|
|
if (typeof(U) != typeof(OwnTag))
|
|
|
|
efl.eo.Globals.efl_ref(pNativeData);
|
|
|
|
return Activator.CreateInstance(typeof(T), new System.Object[] {pNativeData});
|
|
|
|
// return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public class StringPassOwnershipMarshaler : ICustomMarshaler {
|
|
|
|
public object MarshalNativeToManaged(IntPtr pNativeData) {
|
|
|
|
var ret = eina.StringConversion.NativeUtf8ToManagedString(pNativeData);
|
|
|
|
eina.MemoryNative.Free(pNativeData);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
public IntPtr MarshalManagedToNative(object managedObj) {
|
|
|
|
return eina.MemoryNative.StrDup((string)managedObj);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void CleanUpNativeData(IntPtr pNativeData) {
|
|
|
|
// No need to cleanup. C will take care of it.
|
|
|
|
}
|
|
|
|
|
|
|
|
public void CleanUpManagedData(object managedObj) {
|
|
|
|
}
|
|
|
|
|
|
|
|
public int GetNativeDataSize() {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static ICustomMarshaler GetInstance(string cookie) {
|
|
|
|
if (marshaler == null) {
|
|
|
|
marshaler = new StringPassOwnershipMarshaler();
|
|
|
|
}
|
|
|
|
return marshaler;
|
|
|
|
}
|
|
|
|
static private StringPassOwnershipMarshaler marshaler;
|
|
|
|
}
|
|
|
|
|
|
|
|
public class StringKeepOwnershipMarshaler: ICustomMarshaler {
|
|
|
|
public object MarshalNativeToManaged(IntPtr pNativeData) {
|
|
|
|
return eina.StringConversion.NativeUtf8ToManagedString(pNativeData);
|
|
|
|
}
|
|
|
|
|
|
|
|
public IntPtr MarshalManagedToNative(object managedObj) {
|
|
|
|
return eina.StringConversion.ManagedStringToNativeUtf8Alloc((string)managedObj);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void CleanUpNativeData(IntPtr pNativeData) {
|
|
|
|
// No need to free. The Native side will keep the ownership.
|
|
|
|
}
|
|
|
|
|
|
|
|
public void CleanUpManagedData(object managedObj) {
|
|
|
|
}
|
|
|
|
|
|
|
|
public int GetNativeDataSize() {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static ICustomMarshaler GetInstance(string cookie) {
|
|
|
|
if (marshaler == null) {
|
|
|
|
marshaler = new StringKeepOwnershipMarshaler();
|
|
|
|
}
|
|
|
|
return marshaler;
|
|
|
|
}
|
|
|
|
static private StringKeepOwnershipMarshaler marshaler;
|
|
|
|
}
|
|
|
|
|
|
|
|
public class StringsharePassOwnershipMarshaler : ICustomMarshaler {
|
|
|
|
public object MarshalNativeToManaged(IntPtr pNativeData) {
|
|
|
|
var ret = eina.StringConversion.NativeUtf8ToManagedString(pNativeData);
|
|
|
|
eina.Stringshare.eina_stringshare_del(pNativeData);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
public IntPtr MarshalManagedToNative(object managedObj) {
|
|
|
|
return eina.Stringshare.eina_stringshare_add((string)managedObj);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void CleanUpNativeData(IntPtr pNativeData) {
|
|
|
|
// No need to free as it's for own() parameters.
|
|
|
|
}
|
|
|
|
|
|
|
|
public void CleanUpManagedData(object managedObj) {
|
|
|
|
}
|
|
|
|
|
|
|
|
public int GetNativeDataSize() {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static ICustomMarshaler GetInstance(string cookie) {
|
|
|
|
if (marshaler == null) {
|
|
|
|
marshaler = new StringsharePassOwnershipMarshaler();
|
|
|
|
}
|
|
|
|
return marshaler;
|
|
|
|
}
|
|
|
|
static private StringsharePassOwnershipMarshaler marshaler;
|
|
|
|
}
|
|
|
|
|
|
|
|
public class StringshareKeepOwnershipMarshaler : ICustomMarshaler {
|
|
|
|
public object MarshalNativeToManaged(IntPtr pNativeData) {
|
|
|
|
return eina.StringConversion.NativeUtf8ToManagedString(pNativeData);
|
|
|
|
}
|
|
|
|
|
|
|
|
public IntPtr MarshalManagedToNative(object managedObj) {
|
|
|
|
return eina.Stringshare.eina_stringshare_add((string)managedObj);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void CleanUpNativeData(IntPtr pNativeData) {
|
|
|
|
// No need to free, as the native side will keep ownership.
|
|
|
|
}
|
|
|
|
|
|
|
|
public void CleanUpManagedData(object managedObj) {
|
|
|
|
}
|
|
|
|
|
|
|
|
public int GetNativeDataSize() {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static ICustomMarshaler GetInstance(string cookie) {
|
|
|
|
if (marshaler == null) {
|
|
|
|
marshaler = new StringshareKeepOwnershipMarshaler();
|
|
|
|
}
|
|
|
|
return marshaler;
|
|
|
|
}
|
|
|
|
static private StringshareKeepOwnershipMarshaler marshaler;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace eo
|
|
|
|
|
|
|
|
public class EflException : Exception
|
|
|
|
{
|
|
|
|
public EflException(string message) : base(message)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace efl
|