5fe1daae9146b675dbe6ab649669967af56a0a6a
[platform/core/csapi/tizenfx.git] / internals / src / EflSharp / EflSharp / efl / iwrapper.cs
1 #pragma warning disable 1591
2
3 using System;
4 using System.Runtime.InteropServices;
5 using System.Runtime.CompilerServices;
6 using System.Collections.Generic;
7 using System.Diagnostics;
8 using System.Reflection;
9 using System.Threading;
10
11 using static Eina.NativeCustomExportFunctions;
12 using EoG = Efl.Eo.Globals;
13
14 namespace Efl
15 {
16
17 namespace Eo
18 {
19
20 public class Globals
21 {
22     /// <summary>Represents the type of the native Efl_Class.</summary>
23     public enum EflClassType
24     {
25         /// <summary>Regular EFL classes.</summary>
26         Regular = 0,
27         /// <summary>Non-instantiable efl classes (i.e. Abstracts).</summary>
28         RegularNoInstant,
29         /// <summary>Interface types.</summary>
30         Interface,
31         /// <summary>Mixins types.</summary>
32         Mixin,
33         /// <summary>Invalid class type.</summary>
34         Invalid
35     }
36
37     [return: MarshalAs(UnmanagedType.U1)]
38     public delegate bool efl_object_init_delegate();
39     public static FunctionWrapper<efl_object_init_delegate> efl_object_init_ptr =
40         new FunctionWrapper<efl_object_init_delegate>(efl.Libs.EoModule, "efl_object_init");
41     public static bool efl_object_init() => efl_object_init_ptr.Value.Delegate();
42
43     public delegate void efl_object_shutdown_delegate();
44     public static FunctionWrapper<efl_object_shutdown_delegate> efl_object_shutdown_ptr = new FunctionWrapper<efl_object_shutdown_delegate>(efl.Libs.EoModule, "efl_object_shutdown");
45     public static void efl_object_shutdown() => efl_object_shutdown_ptr.Value.Delegate();
46     // [DllImport(efl.Libs.Eo)] public static extern void efl_object_shutdown();
47     public static FunctionWrapper<_efl_add_internal_start_delegate> _efl_add_internal_start_ptr = new FunctionWrapper<_efl_add_internal_start_delegate>(efl.Libs.EoModule, "_efl_add_internal_start");
48     public delegate  IntPtr
49         _efl_add_internal_start_delegate([MarshalAs(UnmanagedType.LPStr)] String file, int line,
50                                 IntPtr klass, IntPtr parent, byte is_ref, byte is_fallback);
51
52     [DllImport(efl.Libs.CustomExports)] public static extern IntPtr efl_mono_wrapper_supervisor_get(IntPtr eo);
53     [DllImport(efl.Libs.CustomExports)] public static extern void efl_mono_wrapper_supervisor_set(IntPtr eo, IntPtr ws);
54
55     [DllImport(efl.Libs.Eo)] public static extern IntPtr
56         _efl_add_internal_start([MarshalAs(UnmanagedType.LPStr)] String file, int line,
57                                 IntPtr klass, IntPtr parent, byte is_ref, byte is_fallback);
58     public delegate  IntPtr
59         _efl_add_end_delegate(IntPtr eo, byte is_ref, byte is_fallback);
60     [DllImport(efl.Libs.Eo)] public static extern IntPtr
61         _efl_add_end(IntPtr eo, byte is_ref, byte is_fallback);
62     public delegate  IntPtr
63         efl_ref_delegate(IntPtr eo);
64     [DllImport(efl.Libs.Eo)] public static extern IntPtr
65         efl_ref(IntPtr eo);
66     public delegate  void
67         efl_unref_delegate(IntPtr eo);
68     [DllImport(efl.Libs.CustomExports)] public static extern void
69         efl_unref(IntPtr eo);
70     public delegate  int
71         efl_ref_count_delegate(IntPtr eo);
72     [DllImport(efl.Libs.Eo)] public static extern int
73         efl_ref_count(IntPtr eo);
74     [DllImport(efl.Libs.CustomExports)] public static extern void
75         efl_mono_wrapper_supervisor_callbacks_set(Efl.FreeWrapperSupervisorCb freeWrapperSupervisorCb);
76     [DllImport(efl.Libs.CustomExports)] public static extern void
77         efl_mono_native_dispose(IntPtr eo);
78     [DllImport(efl.Libs.CustomExports)] public static extern void
79         efl_mono_thread_safe_native_dispose(IntPtr eo);
80     [DllImport(efl.Libs.CustomExports)] public static extern void
81         efl_mono_thread_safe_efl_unref(IntPtr eo);
82
83     [DllImport(efl.Libs.CustomExports)] public static extern void
84         efl_mono_thread_safe_free_cb_exec(IntPtr free_cb, IntPtr cb_data);
85
86     [DllImport(efl.Libs.Eo)] public static extern IntPtr
87         efl_class_name_get(IntPtr eo);
88     [DllImport(efl.Libs.Eo)] public static extern IntPtr
89         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr term);
90     [DllImport(efl.Libs.Eo)] public static extern IntPtr
91         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr term);
92     [DllImport(efl.Libs.Eo)] public static extern IntPtr
93         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr term);
94     [DllImport(efl.Libs.Eo)] public static extern IntPtr
95         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr term);
96     [DllImport(efl.Libs.Eo)] public static extern IntPtr
97         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr term);
98     [DllImport(efl.Libs.Eo)] public static extern IntPtr
99         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr term);
100     [DllImport(efl.Libs.Eo)] public static extern IntPtr
101         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr term);
102     [DllImport(efl.Libs.Eo)] public static extern IntPtr
103         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr term);
104     [DllImport(efl.Libs.Eo)] public static extern IntPtr
105         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr term);
106     [DllImport(efl.Libs.Eo)] public static extern IntPtr
107         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr term);
108     [DllImport(efl.Libs.Eo)] public static extern IntPtr
109         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr term);
110     [DllImport(efl.Libs.Eo)] public static extern IntPtr
111         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr term);
112     [DllImport(efl.Libs.Eo)] public static extern IntPtr
113         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr term);
114     [DllImport(efl.Libs.Eo)] public static extern IntPtr
115         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr term);
116     [DllImport(efl.Libs.Eo)] public static extern IntPtr
117         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr term);
118     [DllImport(efl.Libs.Eo)] public static extern IntPtr
119         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr term);
120     [DllImport(efl.Libs.Eo)] public static extern IntPtr
121         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr term);
122     [DllImport(efl.Libs.Eo)] public static extern IntPtr
123         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr term);
124     [DllImport(efl.Libs.Eo)] public static extern IntPtr
125         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr term);
126     [DllImport(efl.Libs.Eo)] public static extern IntPtr
127         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr term);
128     [DllImport(efl.Libs.Eo)] public static extern IntPtr
129         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr term);
130     [DllImport(efl.Libs.Eo)] public static extern IntPtr
131         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr term);
132     [DllImport(efl.Libs.Eo)] public static extern IntPtr
133         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr term);
134     [DllImport(efl.Libs.Eo)] public static extern IntPtr
135         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr term);
136     [DllImport(efl.Libs.Eo)] public static extern IntPtr
137         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr term);
138     [DllImport(efl.Libs.Eo)] public static extern IntPtr
139         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr term);
140     [DllImport(efl.Libs.Eo)] public static extern IntPtr
141         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr term);
142     [DllImport(efl.Libs.Eo)] public static extern IntPtr
143         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr term);
144     [DllImport(efl.Libs.Eo)] public static extern IntPtr
145         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr term);
146     [DllImport(efl.Libs.Eo)] public static extern IntPtr
147         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr term);
148     [DllImport(efl.Libs.Eo)] public static extern IntPtr
149         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr extn30, IntPtr term);
150     [DllImport(efl.Libs.Eo)] public static extern IntPtr
151         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr extn30, IntPtr extn31, IntPtr term);
152     [DllImport(efl.Libs.Eo)] public static extern IntPtr
153         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr extn30, IntPtr extn31, IntPtr extn32, IntPtr term);
154     [DllImport(efl.Libs.Eo)] public static extern IntPtr
155         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr extn30, IntPtr extn31, IntPtr extn32, IntPtr extn33, IntPtr term);
156     [DllImport(efl.Libs.Eo)] public static extern IntPtr
157         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr extn30, IntPtr extn31, IntPtr extn32, IntPtr extn33, IntPtr extn34, IntPtr term);
158     [DllImport(efl.Libs.Eo)] public static extern IntPtr
159         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr extn30, IntPtr extn31, IntPtr extn32, IntPtr extn33, IntPtr extn34, IntPtr extn35, IntPtr term);
160     [DllImport(efl.Libs.Eo)] public static extern IntPtr
161         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr extn30, IntPtr extn31, IntPtr extn32, IntPtr extn33, IntPtr extn34, IntPtr extn35, IntPtr extn36, IntPtr term);
162     [DllImport(efl.Libs.Eo)] public static extern IntPtr
163         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr extn30, IntPtr extn31, IntPtr extn32, IntPtr extn33, IntPtr extn34, IntPtr extn35, IntPtr extn36, IntPtr extn37, IntPtr term);
164     [DllImport(efl.Libs.Eo)] public static extern IntPtr
165         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr extn30, IntPtr extn31, IntPtr extn32, IntPtr extn33, IntPtr extn34, IntPtr extn35, IntPtr extn36, IntPtr extn37, IntPtr extn38, IntPtr term);
166     [DllImport(efl.Libs.Eo)] public static extern IntPtr
167         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr extn30, IntPtr extn31, IntPtr extn32, IntPtr extn33, IntPtr extn34, IntPtr extn35, IntPtr extn36, IntPtr extn37, IntPtr extn38, IntPtr extn39, IntPtr term);
168     [DllImport(efl.Libs.Eo)] public static extern IntPtr
169         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr extn30, IntPtr extn31, IntPtr extn32, IntPtr extn33, IntPtr extn34, IntPtr extn35, IntPtr extn36, IntPtr extn37, IntPtr extn38, IntPtr extn39, IntPtr extn40, IntPtr term);
170     [DllImport(efl.Libs.Eo)] public static extern IntPtr
171         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr extn30, IntPtr extn31, IntPtr extn32, IntPtr extn33, IntPtr extn34, IntPtr extn35, IntPtr extn36, IntPtr extn37, IntPtr extn38, IntPtr extn39, IntPtr extn40, IntPtr extn41, IntPtr term);
172     [DllImport(efl.Libs.Eo)] public static extern IntPtr
173         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr extn30, IntPtr extn31, IntPtr extn32, IntPtr extn33, IntPtr extn34, IntPtr extn35, IntPtr extn36, IntPtr extn37, IntPtr extn38, IntPtr extn39, IntPtr extn40, IntPtr extn41, IntPtr extn42, IntPtr term);
174     [DllImport(efl.Libs.Eo)] public static extern IntPtr
175         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr extn30, IntPtr extn31, IntPtr extn32, IntPtr extn33, IntPtr extn34, IntPtr extn35, IntPtr extn36, IntPtr extn37, IntPtr extn38, IntPtr extn39, IntPtr extn40, IntPtr extn41, IntPtr extn42, IntPtr extn43, IntPtr term);
176     [DllImport(efl.Libs.Eo)] public static extern IntPtr
177         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr extn30, IntPtr extn31, IntPtr extn32, IntPtr extn33, IntPtr extn34, IntPtr extn35, IntPtr extn36, IntPtr extn37, IntPtr extn38, IntPtr extn39, IntPtr extn40, IntPtr extn41, IntPtr extn42, IntPtr extn43, IntPtr extn44, IntPtr term);
178     [DllImport(efl.Libs.Eo)] public static extern IntPtr
179         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr extn30, IntPtr extn31, IntPtr extn32, IntPtr extn33, IntPtr extn34, IntPtr extn35, IntPtr extn36, IntPtr extn37, IntPtr extn38, IntPtr extn39, IntPtr extn40, IntPtr extn41, IntPtr extn42, IntPtr extn43, IntPtr extn44, IntPtr extn45, IntPtr term);
180     [DllImport(efl.Libs.Eo)] public static extern IntPtr
181         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr extn30, IntPtr extn31, IntPtr extn32, IntPtr extn33, IntPtr extn34, IntPtr extn35, IntPtr extn36, IntPtr extn37, IntPtr extn38, IntPtr extn39, IntPtr extn40, IntPtr extn41, IntPtr extn42, IntPtr extn43, IntPtr extn44, IntPtr extn45, IntPtr extn46, IntPtr term);
182     [DllImport(efl.Libs.Eo)] public static extern IntPtr
183         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr extn30, IntPtr extn31, IntPtr extn32, IntPtr extn33, IntPtr extn34, IntPtr extn35, IntPtr extn36, IntPtr extn37, IntPtr extn38, IntPtr extn39, IntPtr extn40, IntPtr extn41, IntPtr extn42, IntPtr extn43, IntPtr extn44, IntPtr extn45, IntPtr extn46, IntPtr extn47, IntPtr term);
184     [DllImport(efl.Libs.Eo)] public static extern IntPtr
185         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr extn8, IntPtr extn9, IntPtr extn10, IntPtr extn11, IntPtr extn12, IntPtr extn13, IntPtr extn14, IntPtr extn15, IntPtr extn16, IntPtr extn17, IntPtr extn18, IntPtr extn19, IntPtr extn20, IntPtr extn21, IntPtr extn22, IntPtr extn23, IntPtr extn24, IntPtr extn25, IntPtr extn26, IntPtr extn27, IntPtr extn28, IntPtr extn29, IntPtr extn30, IntPtr extn31, IntPtr extn32, IntPtr extn33, IntPtr extn34, IntPtr extn35, IntPtr extn36, IntPtr extn37, IntPtr extn38, IntPtr extn39, IntPtr extn40, IntPtr extn41, IntPtr extn42, IntPtr extn43, IntPtr extn44, IntPtr extn45, IntPtr extn46, IntPtr extn47, IntPtr extn48, IntPtr term);
186
187     public delegate  byte efl_class_functions_set_delegate(IntPtr klass_id, IntPtr object_ops, IntPtr class_ops);
188     [DllImport(efl.Libs.Eo)] public static extern byte efl_class_functions_set(IntPtr klass_id, IntPtr object_ops, IntPtr class_ops);
189     public delegate  IntPtr efl_data_scope_get_delegate(IntPtr obj, IntPtr klass);
190     [DllImport(efl.Libs.Eo)] public static extern IntPtr efl_data_scope_get(IntPtr obj, IntPtr klass);
191     public delegate  IntPtr efl_super_delegate(IntPtr obj, IntPtr klass);
192     [DllImport(efl.Libs.Eo)] public static extern IntPtr efl_super(IntPtr obj, IntPtr klass);
193     public delegate  IntPtr efl_class_get_delegate(IntPtr obj);
194     [DllImport(efl.Libs.Eo)] public static extern IntPtr efl_class_get(IntPtr obj);
195     [DllImport(efl.Libs.Eo)] public static extern EflClassType efl_class_type_get(IntPtr klass);
196     public delegate  IntPtr dlerror_delegate();
197     [DllImport(efl.Libs.Evil)] public static extern IntPtr dlerror();
198
199     [DllImport(efl.Libs.Eo)] [return: MarshalAs(UnmanagedType.U1)] public static extern bool
200         efl_event_callback_priority_add(IntPtr obj, IntPtr desc, short priority, IntPtr cb, IntPtr data);
201
202     [DllImport(efl.Libs.Eo)] [return: MarshalAs(UnmanagedType.U1)] public static extern bool
203         efl_event_callback_del(IntPtr obj, IntPtr desc, IntPtr cb, IntPtr data);
204
205     [DllImport(efl.Libs.Eo)] [return: MarshalAs(UnmanagedType.U1)] public static extern bool
206         efl_event_callback_call(IntPtr obj, IntPtr desc, IntPtr event_info);
207
208     public const int RTLD_NOW = 2;
209
210     public delegate byte class_initializer(IntPtr klass);
211
212     public static T GetParamHelper<T>(Nullable<T> v) where T : struct
213     {
214         return v.Value;
215     }
216
217     public static U GetParamHelper<U>(U v)
218     {
219         return v;
220     }
221
222     public static bool ParamHelperCheck<T>(Nullable<T> v) where T : struct
223     {
224         return v.HasValue;
225     }
226
227     public static bool ParamHelperCheck<U>(U v)
228     {
229         return v != null;
230     }
231
232     public static IntPtr register_class(String class_name, IntPtr base_klass, System.Type type)
233     {
234         ClassDescription description;
235         description.version = 2; // EO_VERSION
236         description.name = class_name;
237         description.class_type = 0; // REGULAR
238         description.data_size = (UIntPtr)0;
239         description.class_initializer = IntPtr.Zero;
240         description.class_constructor = IntPtr.Zero;
241         description.class_destructor = IntPtr.Zero;
242
243         class_initializer init = (IntPtr kls) =>
244         {
245             return Globals.class_initializer_call(kls, type);
246         };
247
248         description.class_initializer = Marshal.GetFunctionPointerForDelegate(init);
249
250         IntPtr description_ptr = Eina.MemoryNative.Alloc(Marshal.SizeOf(description));
251         Marshal.StructureToPtr(description, description_ptr, false);
252
253         // FIXME: description_ptr seems to be leaking memory even after an eo_shutdown
254
255         var interface_list = EoG.get_efl_interfaces(type);
256
257         Eina.Log.Debug($"Going to register new class named {class_name}");
258         IntPtr klass = EoG.call_efl_class_new(description_ptr, base_klass, interface_list);
259         if (klass == IntPtr.Zero)
260         {
261             Eina.Log.Error("klass was not registered");
262         }
263         else
264         {
265             Eina.Log.Debug("Registered class successfully");
266         }
267
268         return klass;
269     }
270
271     public static List<IntPtr> get_efl_interfaces(System.Type type)
272     {
273         System.Type base_type = type.BaseType;
274
275         var ifaces_lst = new List<IntPtr>();
276         var base_ifaces = base_type.GetInterfaces();
277         var ifaces = type.GetInterfaces();
278         foreach (var iface in ifaces)
279         {
280             if (!System.Array.Exists(base_ifaces, element => element == iface))
281             {
282                 var attrs = System.Attribute.GetCustomAttributes(iface);
283                 foreach (var attr in attrs)
284                 {
285                     if (attr is Efl.Eo.NativeClass)
286                     {
287                         ifaces_lst.Add(((Efl.Eo.NativeClass)attr).GetEflClass());
288                         break;
289                     }
290                 }
291             }
292         }
293
294         return ifaces_lst;
295     }
296
297     private static Efl.Eo.NativeClass GetNativeClass(System.Type type)
298     {
299         var attrs = System.Attribute.GetCustomAttributes(type, false);
300         foreach (var attr in attrs)
301         {
302             if (attr is Efl.Eo.NativeClass)
303             {
304                 return (Efl.Eo.NativeClass)attr;
305             }
306         }
307
308         return null;
309     }
310
311     public static System.Collections.Generic.List<System.Reflection.MethodInfo>
312         GetUserMethods(System.Type type)
313     {
314         var r = new System.Collections.Generic.List<System.Reflection.MethodInfo>();
315         var flags = System.Reflection.BindingFlags.Instance
316                     | System.Reflection.BindingFlags.DeclaredOnly
317                     | System.Reflection.BindingFlags.Public
318                     | System.Reflection.BindingFlags.NonPublic;
319         r.AddRange(type.GetMethods(flags));
320         var base_type = type.BaseType;
321
322         for (;base_type != null; base_type = base_type.BaseType)
323         {
324             if (IsGeneratedClass(base_type))
325             {
326                 return r;
327             }
328
329             r.AddRange(base_type.GetMethods(flags));
330         }
331         return r;
332     }
333
334     public static byte class_initializer_call(IntPtr klass, System.Type type)
335     {
336         Eina.Log.Debug($"called with 0x{klass.ToInt64():x} {type}");
337         var derived = type.BaseType;
338         Efl.Eo.NativeClass nativeClass = GetNativeClass(derived);
339
340         while (nativeClass == null)
341         {
342             derived = derived.BaseType;
343             if (derived == null)
344                 break;
345             nativeClass = GetNativeClass(derived);
346         }
347
348         if (nativeClass != null)
349         {
350             Eina.Log.Debug("nativeClass != null");
351             var descs = nativeClass.GetEoOps(type);
352             var count = descs.Count;
353
354             var all_interfaces = type.GetInterfaces();
355             var base_interfaces = type.BaseType.GetInterfaces();
356             foreach (var iface in all_interfaces)
357             {
358                 if (!System.Array.Exists(base_interfaces, element => element == iface))
359                 {
360                     var nc = GetNativeClass(iface);
361                     if (nc != null)
362                     {
363                         var moredescs = nc.GetEoOps(type);
364                         Eina.Log.Debug($"adding {moredescs.Count} more descs to registration");
365                         descs.AddRange(moredescs);
366                         count = descs.Count;
367                     }
368                 }
369             }
370
371             IntPtr descs_ptr = IntPtr.Zero;
372
373             if (count > 0)
374             {
375                 descs_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(descs[0]) * count);
376             }
377
378             IntPtr ptr = descs_ptr;
379             for (int i = 0; i != count; ++i)
380             {
381                Marshal.StructureToPtr(descs[i], ptr, false);
382                ptr = IntPtr.Add(ptr, Marshal.SizeOf(descs[0]));
383             }
384
385             Efl_Object_Ops ops;
386             ops.descs = descs_ptr;
387             ops.count = (UIntPtr)count;
388             IntPtr ops_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(ops));
389             Marshal.StructureToPtr(ops, ops_ptr, false);
390             Efl.Eo.Globals.efl_class_functions_set(klass, ops_ptr, IntPtr.Zero);
391             //EoKlass = klass;
392         }
393         else
394         {
395             Eina.Log.Debug("nativeClass == null");
396         }
397
398        return 1;
399     }
400
401     public static IntPtr call_efl_class_new(IntPtr desc, IntPtr bk, List<IntPtr> il = null)
402     {
403         IntPtr nul = IntPtr.Zero;
404         int iface_list_count = (il == null ? 0 : il.Count);
405         switch (iface_list_count)
406         {
407             default: return nul;
408             case  0: return EoG.efl_class_new(desc, bk, nul);
409             case  1: return EoG.efl_class_new(desc, bk, il[0], nul);
410             case  2: return EoG.efl_class_new(desc, bk, il[0], il[1], nul);
411             case  3: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], nul);
412             case  4: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], nul);
413             case  5: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], nul);
414             case  6: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], nul);
415             case  7: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], nul);
416             case  8: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], nul);
417             case  9: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], nul);
418             case 10: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], nul);
419             case 11: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], nul);
420             case 12: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], nul);
421             case 13: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], nul);
422             case 14: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], nul);
423             case 15: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], nul);
424             case 16: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], nul);
425             case 17: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], nul);
426             case 18: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], nul);
427             case 19: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], nul);
428             case 20: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], nul);
429             case 21: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], nul);
430             case 22: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], nul);
431             case 23: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], nul);
432             case 24: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], nul);
433             case 25: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], nul);
434             case 26: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], nul);
435             case 27: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], nul);
436             case 28: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], nul);
437             case 29: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], nul);
438             case 30: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], il[29], nul);
439             case 31: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], il[29], il[30], nul);
440             case 32: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], il[29], il[30], il[31], nul);
441             case 33: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], il[29], il[30], il[31], il[32], nul);
442             case 34: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], il[29], il[30], il[31], il[32], il[33], nul);
443             case 35: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], il[29], il[30], il[31], il[32], il[33], il[34], nul);
444             case 36: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], il[29], il[30], il[31], il[32], il[33], il[34], il[35], nul);
445             case 37: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], il[29], il[30], il[31], il[32], il[33], il[34], il[35], il[36], nul);
446             case 38: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], il[29], il[30], il[31], il[32], il[33], il[34], il[35], il[36], il[37], nul);
447             case 39: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], il[29], il[30], il[31], il[32], il[33], il[34], il[35], il[36], il[37], il[38], nul);
448             case 40: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], il[29], il[30], il[31], il[32], il[33], il[34], il[35], il[36], il[37], il[38], il[39], nul);
449             case 41: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], il[29], il[30], il[31], il[32], il[33], il[34], il[35], il[36], il[37], il[38], il[39], il[40], nul);
450             case 42: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], il[29], il[30], il[31], il[32], il[33], il[34], il[35], il[36], il[37], il[38], il[39], il[40], il[41], nul);
451             case 43: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], il[29], il[30], il[31], il[32], il[33], il[34], il[35], il[36], il[37], il[38], il[39], il[40], il[41], il[42], nul);
452             case 44: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], il[29], il[30], il[31], il[32], il[33], il[34], il[35], il[36], il[37], il[38], il[39], il[40], il[41], il[42], il[43], nul);
453             case 45: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], il[29], il[30], il[31], il[32], il[33], il[34], il[35], il[36], il[37], il[38], il[39], il[40], il[41], il[42], il[43], il[44], nul);
454             case 46: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], il[29], il[30], il[31], il[32], il[33], il[34], il[35], il[36], il[37], il[38], il[39], il[40], il[41], il[42], il[43], il[44], il[45], nul);
455             case 47: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], il[29], il[30], il[31], il[32], il[33], il[34], il[35], il[36], il[37], il[38], il[39], il[40], il[41], il[42], il[43], il[44], il[45], il[46], nul);
456             case 48: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], il[7], il[8], il[9], il[10], il[11], il[12], il[13], il[14], il[15], il[16], il[17], il[18], il[19], il[20], il[21], il[22], il[23], il[24], il[25], il[26], il[27], il[28], il[29], il[30], il[31], il[32], il[33], il[34], il[35], il[36], il[37], il[38], il[39], il[40], il[41], il[42], il[43], il[44], il[45], il[46], il[47], nul);
457         }
458     }
459
460     public static Efl.Eo.WrapperSupervisor WrapperSupervisorPtrToManaged(IntPtr wsPtr)
461     {
462         return (Efl.Eo.WrapperSupervisor) GCHandle.FromIntPtr(wsPtr).Target;
463     }
464
465     public static Efl.Eo.WrapperSupervisor GetWrapperSupervisor(IntPtr eo)
466     {
467         var wsPtr = Efl.Eo.Globals.efl_mono_wrapper_supervisor_get(eo);
468         if (wsPtr == IntPtr.Zero)
469         {
470             return null;
471         }
472
473         return WrapperSupervisorPtrToManaged(wsPtr);
474     }
475
476     public static void SetWrapperSupervisor(IntPtr eo, Efl.Eo.WrapperSupervisor ws)
477     {
478         GCHandle gch = GCHandle.Alloc(ws);
479         Efl.Eo.Globals.efl_mono_wrapper_supervisor_set(eo, GCHandle.ToIntPtr(gch));
480     }
481
482     public static void free_dict_values(Dictionary<String, IntPtr> dict)
483     {
484         foreach (IntPtr ptr in dict.Values)
485         {
486             Eina.MemoryNative.Free(ptr);
487         }
488     }
489
490     public static void free_stringshare_values(Dictionary<String, IntPtr> dict)
491     {
492         foreach (IntPtr ptr in dict.Values)
493         {
494             Eina.Stringshare.eina_stringshare_del(ptr);
495         }
496     }
497
498     public static void free_gchandle(IntPtr ptr)
499     {
500         GCHandle handle = GCHandle.FromIntPtr(ptr);
501         handle.Free();
502     }
503
504     public static System.Threading.Tasks.Task<Eina.Value> WrapAsync(Eina.Future future, CancellationToken token)
505     {
506         // Creates a task that will wait for SetResult for completion.
507         // TaskCompletionSource is used to create tasks for 'external' Task sources.
508         var tcs = new System.Threading.Tasks.TaskCompletionSource<Eina.Value>();
509
510         // Flag to be passed to the cancell callback
511         bool fulfilled = false;
512
513         future.Then((Eina.Value received) =>
514         {
515             lock (future)
516             {
517                 // Convert an failed Future to a failed Task.
518                 if (received.GetValueType() == Eina.ValueType.Error)
519                 {
520                     Eina.Error err;
521                     received.Get(out err);
522                     if (err == Eina.Error.ECANCELED)
523                     {
524                         tcs.SetCanceled();
525                     }
526                     else
527                     {
528                         tcs.TrySetException(new Efl.FutureException(received));
529                     }
530                 }
531                 else
532                 {
533                     // Will mark the returned task below as completed.
534                     tcs.SetResult(received);
535                 }
536
537                 fulfilled = true;
538                 return received;
539             }
540         });
541         // Callback to be called when the token is cancelled.
542         token.Register(() =>
543         {
544             lock (future)
545             {
546                 // Will trigger the Then callback above with an Eina.Error
547                 if (!fulfilled)
548                 {
549                     future.Cancel();
550                 }
551             }
552         });
553
554         return tcs.Task;
555     }
556
557     /// <summary>Returns whether the given type was generated by eolian-mono</summary>
558     /// <param name="managedType">The type to check.</param>
559     /// <returns>True if generated by eolian-mono. False otherwise.</returns>
560     private static bool IsGeneratedClass(System.Type managedType)
561     {
562         return GetNativeClass(managedType) != null;
563     }
564
565     /// <summary>Creates a new wrapper for the given Eo id.
566     ///
567     /// <para>If the Eo was created from a non-generated class (i.e. C#-pure class), it returns
568     /// the C# instance handle stored in the Eo's private data.</para>
569     ///
570     /// <para>For generated-class Eo instance, we use reflection to get the correct C# type to re-wrap
571     /// it.</para>
572     /// </summary>
573     ///
574     /// <param name="handle">The Eo id to be wrapped.</param>
575     /// <param name="shouldIncRef">Whether we should increase the refcount of the Eo instance.</param>
576     /// <returns>The C# wrapper for this instance.</returns>
577     public static Efl.Eo.IWrapper CreateWrapperFor(System.IntPtr handle, bool shouldIncRef=true)
578     {
579
580         if (handle == IntPtr.Zero)
581         {
582             return null;
583         }
584
585         Efl.Eo.Globals.efl_ref(handle);
586         try
587         {
588             var ws = Efl.Eo.Globals.GetWrapperSupervisor(handle);
589             if (ws != null && ws.Target != null)
590             {
591                 if (!shouldIncRef)
592                 {
593                     Efl.Eo.Globals.efl_unref(handle);
594                 }
595
596                 return ws.Target;
597             }
598
599             IntPtr eoKlass = efl_class_get(handle);
600
601             if (eoKlass == IntPtr.Zero)
602             {
603                 throw new InvalidOperationException($"Can't get Eo class for object handle 0x{handle.ToInt64():x}");
604             }
605
606             var managedType = ClassRegister.GetManagedType(eoKlass);
607
608             if (managedType == null)
609             {
610                 IntPtr nativeName = efl_class_name_get(eoKlass);
611                 var name = Eina.StringConversion.NativeUtf8ToManagedString(nativeName);
612
613                 throw new InvalidOperationException($"Can't get Managed class for object handle 0x{handle.ToInt64():x} with native class [{name}]");
614             }
615
616             Debug.Assert(IsGeneratedClass(managedType));
617             System.Reflection.ConstructorInfo constructor = null;
618
619             try
620             {
621                 var flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
622                 constructor = managedType.GetConstructor(flags, null, new Type[1] { typeof(System.IntPtr) }, null);
623             }
624             catch (InvalidOperationException)
625             {
626                 throw new InvalidOperationException($"Can't get constructor for type {managedType}");
627             }
628
629             var ret = (Efl.Eo.IWrapper) constructor.Invoke(new object[1] { handle });
630
631             if (ret == null)
632             {
633                 throw new InvalidOperationException($"Can't construct type {managedType} from IntPtr handle");
634             }
635
636             if (shouldIncRef)
637             {
638                 Efl.Eo.Globals.efl_ref(handle);
639             }
640
641             return ret;
642         }
643         finally
644         {
645             Efl.Eo.Globals.efl_unref(handle);
646         }
647     }
648
649     private static Efl.FreeWrapperSupervisorCb FreeWrapperSupervisorCallbackDelegate = new Efl.FreeWrapperSupervisorCb(FreeWrapperSupervisorCallback);
650     public static void FreeWrapperSupervisorCallback(IntPtr eo)
651     {
652         try
653         {
654             var wsPtr = Efl.Eo.Globals.efl_mono_wrapper_supervisor_get(eo);
655             if (wsPtr == IntPtr.Zero)
656             {
657                 Eina.Log.Error($"Invalid wrapper supervisor [Eo pointer: {eo.ToInt64():x}]");
658                 return;
659             }
660
661             Efl.Eo.Globals.efl_mono_wrapper_supervisor_set(eo, IntPtr.Zero);
662
663             GCHandle gch = GCHandle.FromIntPtr(wsPtr);
664             var ws = (Efl.Eo.WrapperSupervisor) gch.Target;
665             foreach (var item in ws.EoEvents)
666             {
667                 if (!efl_event_callback_del(eo, item.Key.desc, item.Value.evtCallerPtr, wsPtr))
668                 {
669                     Eina.Log.Error($"Failed to remove event proxy for event {item.Key.desc} [eo: {eo.ToInt64():x}; cb: {item.Value.evtCallerPtr.ToInt64():x}]");
670                 }
671             }
672
673             // Free the native eo
674             Efl.Eo.Globals.efl_unref(eo);
675
676             // now the WrapperSupervisor can be collected, and so its member:
677             //     - the event dictionary
678             //     - and the EoWrapper if it is still pinned
679             gch.Free();
680         }
681         catch (Exception e)
682         {
683             Eina.Log.Error(e.ToString());
684             Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);
685         }
686     }
687
688     public static void SetNativeDisposeCallbacks()
689     {
690         efl_mono_wrapper_supervisor_callbacks_set(FreeWrapperSupervisorCallbackDelegate);
691     }
692
693     public static void ThreadSafeFreeCbExec(EinaFreeCb cbFreeCb, IntPtr cbData)
694     {
695         EinaFreeCb cb = (IntPtr gcHandlePtr) => {
696             cbFreeCb(cbData);
697             GCHandle gcHandle = GCHandle.FromIntPtr(gcHandlePtr);
698             gcHandle.Free();
699         };
700
701         Monitor.Enter(Efl.All.InitLock);
702         if (Efl.All.MainLoopInitialized)
703         {
704             IntPtr cbPtr = Marshal.GetFunctionPointerForDelegate(cb);
705             var handle = GCHandle.Alloc(cb);
706             var handlePtr = GCHandle.ToIntPtr(handle);
707
708             efl_mono_thread_safe_free_cb_exec(cbPtr, handlePtr);
709         }
710         Monitor.Exit(Efl.All.InitLock);
711     }
712
713 } // Globals
714
715 public static class Config
716 {
717
718     public static void Init()
719     {
720         Globals.efl_object_init();
721         Globals.SetNativeDisposeCallbacks();
722     }
723
724     public static void Shutdown()
725     {
726         Globals.efl_object_shutdown();
727     }
728 }
729
730 [System.AttributeUsage(System.AttributeTargets.Class |
731                        System.AttributeTargets.Interface,
732                        AllowMultiple = false,
733                        Inherited = false)
734 ]
735 public abstract class NativeClass : System.Attribute
736 {
737     public abstract IntPtr GetEflClass();
738     public abstract System.Collections.Generic.List<Efl_Op_Description> GetEoOps(System.Type type);
739 }
740
741 /// <summary>Attribute for private native classes.
742 ///
743 /// <para>For internal usage by generated code only.</para></summary>
744 public class PrivateNativeClass : NativeClass
745 {
746     public override IntPtr GetEflClass()
747     {
748         return IntPtr.Zero;
749     }
750
751     public override System.Collections.Generic.List<Efl_Op_Description> GetEoOps(System.Type type)
752     {
753         return null;
754     }
755 }
756
757 public interface IWrapper
758 {
759     /// <summary>Pointer to internal Eo instance.</summary>
760     IntPtr NativeHandle
761     {
762         get;
763     }
764
765     /// <summary>Pointer to internal Eo class.</summary>
766     IntPtr NativeClass
767     {
768         get;
769     }
770 }
771
772 public static class ClassRegister
773 {
774     public static System.Type GetManagedType(IntPtr klass)
775     {
776         System.Type t;
777         if (Efl.Eo.ClassRegister.typeFromKlass.TryGetValue(klass, out t))
778         {
779             return t;
780         }
781
782         // If it isn't on the dictionary then it is a Native binding class
783         IntPtr namePtr = Efl.Eo.Globals.efl_class_name_get(klass);
784         if (namePtr == IntPtr.Zero)
785         {
786             throw new System.InvalidOperationException($"Could not get Native class name. Handle: {klass}");
787         }
788
789         string name = Eina.StringConversion.NativeUtf8ToManagedString(namePtr)
790                       .Replace("_", ""); // Convert Efl C name to C# name
791
792         // Check if this is an internal implementation of an abstract class
793         var abstract_impl_suffix = "Realized";
794         if (name.EndsWith(abstract_impl_suffix))
795         {
796             name = name.Substring(0, name.Length - abstract_impl_suffix.Length);
797             var lastDot = name.LastIndexOf(".");
798             var klassName = name.Substring(lastDot + 1);
799             name += "+" + klassName + abstract_impl_suffix; // '+' is the separator for nested classes
800         }
801
802         // When converting to managed, interfaces and mixins gets the 'I' prefix.
803         var klass_type = Efl.Eo.Globals.efl_class_type_get(klass);
804         if (klass_type == Efl.Eo.Globals.EflClassType.Interface || klass_type == Efl.Eo.Globals.EflClassType.Mixin)
805         {
806             var pos = name.LastIndexOf(".");
807             name = name.Insert(pos + 1, "I"); // -1 if not found, inserts at 0 normally
808         }
809
810         var curr_asm = typeof(IWrapper).Assembly;
811         t = curr_asm.GetType(name);
812         if (t == null)
813         {
814             foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
815             {
816                 if (assembly == curr_asm)
817                 {
818                     continue;
819                 }
820
821                 t = assembly.GetType(name);
822                 if (t != null)
823                 {
824                     break;
825                 }
826             }
827
828             if (t == null)
829             {
830                 return typeof(Efl.Object);
831             }
832         }
833
834         AddToKlassTypeBiDictionary(klass, t); // Cache it in the dictionary
835         return t;
836     }
837
838     public static IntPtr GetKlass(System.Type objectType)
839     {
840         IntPtr klass;
841         if (klassFromType.TryGetValue(objectType, out klass))
842         {
843             return klass;
844         }
845
846         // Check if it is a Native binding class
847         klass = GetNativeKlassPtr(objectType);
848         if (klass != IntPtr.Zero)
849         {
850             // Add to the dictionary cache
851             AddToKlassTypeBiDictionary(klass, objectType);
852             return klass;
853         }
854
855         // Unregistered Inherited class, let's register it
856         IntPtr baseKlass = GetNativeBaseKlassPtr(objectType);
857         if (baseKlass == IntPtr.Zero)
858         {
859             throw new System.InvalidOperationException($"Could not get base C# binding class for Inherited type: {objectType.FullName}");
860         }
861
862         return RegisterKlass(baseKlass, objectType);
863     }
864
865     public static IntPtr GetInheritKlassOrRegister(IntPtr baseKlass, System.Type objectType)
866     {
867         IntPtr klass;
868         if (klassFromType.TryGetValue(objectType, out klass))
869         {
870             return klass;
871         }
872
873         return RegisterKlass(baseKlass, objectType);
874     }
875
876     private static IntPtr RegisterKlass(IntPtr baseKlass, System.Type objectType)
877     {
878         lock (klassAllocLock)
879         {
880             IntPtr newKlass = Efl.Eo.Globals.register_class(objectType.FullName, baseKlass, objectType);
881             if (newKlass == IntPtr.Zero)
882             {
883                 throw new System.InvalidOperationException($"Failed to register class '{objectType.FullName}'");
884             }
885
886             AddToKlassTypeBiDictionary(newKlass, objectType);
887             return newKlass;
888         }
889     }
890
891     private static IntPtr GetNativeBaseKlassPtr(System.Type objectType)
892     {
893         for (System.Type t = objectType.BaseType; t != null; t = t.BaseType)
894         {
895             var ptr = GetNativeKlassPtr(t);
896             if (ptr != IntPtr.Zero)
897             {
898                 return ptr;
899             }
900         }
901
902         throw new System.InvalidOperationException($"Class '{objectType.FullName}' is not an Efl object");
903     }
904
905     private static IntPtr GetNativeKlassPtr(System.Type objectType)
906     {
907         if (objectType == null)
908         {
909             return IntPtr.Zero;
910         }
911
912         if (objectType.IsInterface)
913         {
914             // Try to get the *Concrete class
915             var assembly = objectType.Assembly;
916             objectType = assembly.GetType(objectType.FullName + "Concrete");
917
918             if (objectType == null)
919             {
920                 return IntPtr.Zero;
921             }
922         }
923
924         var method = objectType.GetMethod("GetEflClassStatic",
925                                           System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
926
927         if (method == null)
928         {
929             return IntPtr.Zero;
930         }
931
932         return (IntPtr)(method.Invoke(null, null));
933     }
934
935     public static void AddToKlassTypeBiDictionary(IntPtr klassPtr, System.Type objectType)
936     {
937         klassFromType[objectType] = klassPtr;
938         typeFromKlass[klassPtr] = objectType;
939     }
940
941     public static System.Collections.Concurrent.ConcurrentDictionary<System.Type, System.IntPtr> klassFromType
942         = new System.Collections.Concurrent.ConcurrentDictionary<System.Type, System.IntPtr>();
943
944     public static System.Collections.Concurrent.ConcurrentDictionary<System.IntPtr, System.Type> typeFromKlass
945         = new System.Collections.Concurrent.ConcurrentDictionary<System.IntPtr, System.Type>();
946
947     private static readonly object klassAllocLock = new object();
948 }
949
950 public interface IOwnershipTag
951 {
952 }
953
954 public class OwnTag : IOwnershipTag
955 {
956 }
957
958 public class NonOwnTag : IOwnershipTag
959 {
960 }
961
962 public class MarshalEo<U> : ICustomMarshaler
963     where U : IOwnershipTag
964 {
965     public static ICustomMarshaler GetInstance(string cookie)
966     {
967         Eina.Log.Debug("MarshalEo.GetInstace cookie " + cookie);
968         return new MarshalEo<U>();
969     }
970
971     public void CleanUpManagedData(object ManagedObj)
972     {
973         //Eina.Log.Warning("MarshalEo.CleanUpManagedData not implemented");
974         //throw new NotImplementedException();
975     }
976
977     public void CleanUpNativeData(IntPtr pNativeData)
978     {
979         //Eina.Log.Warning("MarshalEo.CleanUpNativeData not implemented");
980         //throw new NotImplementedException();
981     }
982
983     public int GetNativeDataSize()
984     {
985         Eina.Log.Debug("MarshalEo.GetNativeDataSize");
986         return 0;
987         //return 8;
988     }
989
990     public IntPtr MarshalManagedToNative(object ManagedObj)
991     {
992         Eina.Log.Debug("MarshalEo.MarshallManagedToNative");
993
994         if (ManagedObj == null)
995         {
996             return IntPtr.Zero;
997         }
998
999         var r = ((IWrapper)ManagedObj).NativeHandle;
1000         if (typeof(U) == typeof(OwnTag))
1001         {
1002             Efl.Eo.Globals.efl_ref(r);
1003         }
1004
1005         return r;
1006     }
1007
1008     public object MarshalNativeToManaged(IntPtr pNativeData)
1009     {
1010         return Efl.Eo.Globals.CreateWrapperFor(pNativeData, shouldIncRef : typeof(U) != typeof(OwnTag));
1011     }
1012 }
1013
1014 ///<summary>Marshals between System.Type instances and Eo classes (IntPtrs).</summary>
1015 public class MarshalEflClass : ICustomMarshaler
1016 {
1017     public static ICustomMarshaler GetInstance(string cookie)
1018     {
1019         Eina.Log.Debug("MarshalEflClass.GetInstance cookie " + cookie);
1020         return new MarshalEflClass();
1021     }
1022
1023     public void CleanUpManagedData(object ManagedObj)
1024     {
1025     }
1026
1027     public void CleanUpNativeData(IntPtr pNativeData)
1028     {
1029     }
1030
1031     public int GetNativeDataSize()
1032     {
1033         Eina.Log.Debug("MarshalEflClass.GetNativeDataSize");
1034         return 0;
1035     }
1036
1037     public IntPtr MarshalManagedToNative(object ManagedObj)
1038     {
1039         Eina.Log.Debug("MarshalEflClass.MarshallManagedToNative");
1040         if (ManagedObj == null)
1041         {
1042             return IntPtr.Zero;
1043         }
1044
1045         var t = (System.Type)ManagedObj;
1046         return Efl.Eo.ClassRegister.GetKlass(t);
1047     }
1048
1049     public object MarshalNativeToManaged(IntPtr pNativeData)
1050     {
1051         Eina.Log.Debug("MarshalEflClass.MarshalNativeToManaged");
1052         if (pNativeData == IntPtr.Zero)
1053         {
1054             return null;
1055         }
1056
1057         return Efl.Eo.ClassRegister.GetManagedType(pNativeData);
1058     }
1059 }
1060
1061 public class StringPassOwnershipMarshaler : ICustomMarshaler
1062 {
1063     public object MarshalNativeToManaged(IntPtr pNativeData)
1064     {
1065         var ret = Eina.StringConversion.NativeUtf8ToManagedString(pNativeData);
1066         Eina.MemoryNative.Free(pNativeData);
1067         return ret;
1068     }
1069
1070     public IntPtr MarshalManagedToNative(object managedObj)
1071     {
1072         return Eina.MemoryNative.StrDup((string)managedObj);
1073     }
1074
1075     public void CleanUpNativeData(IntPtr pNativeData)
1076     {
1077         // No need to cleanup. C will take care of it.
1078     }
1079
1080     public void CleanUpManagedData(object managedObj)
1081     {
1082     }
1083
1084     public int GetNativeDataSize()
1085     {
1086         return -1;
1087     }
1088
1089     public static ICustomMarshaler GetInstance(string cookie)
1090     {
1091         if (marshaler == null)
1092         {
1093             marshaler = new StringPassOwnershipMarshaler();
1094         }
1095
1096         return marshaler;
1097     }
1098
1099     static private StringPassOwnershipMarshaler marshaler;
1100 }
1101
1102 public class StringKeepOwnershipMarshaler: ICustomMarshaler
1103 {
1104     public object MarshalNativeToManaged(IntPtr pNativeData)
1105     {
1106         return Eina.StringConversion.NativeUtf8ToManagedString(pNativeData);
1107     }
1108
1109     public IntPtr MarshalManagedToNative(object managedObj)
1110     {
1111         return Eina.StringConversion.ManagedStringToNativeUtf8Alloc((string)managedObj);
1112     }
1113
1114     public void CleanUpNativeData(IntPtr pNativeData)
1115     {
1116         // No need to free. The Native side will keep the ownership.
1117     }
1118
1119     public void CleanUpManagedData(object managedObj)
1120     {
1121     }
1122
1123     public int GetNativeDataSize()
1124     {
1125         return -1;
1126     }
1127
1128     public static ICustomMarshaler GetInstance(string cookie)
1129     {
1130         if (marshaler == null)
1131         {
1132             marshaler = new StringKeepOwnershipMarshaler();
1133         }
1134
1135         return marshaler;
1136     }
1137
1138     static private StringKeepOwnershipMarshaler marshaler;
1139 }
1140
1141 public class StringsharePassOwnershipMarshaler : ICustomMarshaler
1142 {
1143     public object MarshalNativeToManaged(IntPtr pNativeData)
1144     {
1145         var ret = Eina.StringConversion.NativeUtf8ToManagedString(pNativeData);
1146         Eina.Stringshare.eina_stringshare_del(pNativeData);
1147         return ret;
1148     }
1149
1150     public IntPtr MarshalManagedToNative(object managedObj)
1151     {
1152         return Eina.Stringshare.eina_stringshare_add((string)managedObj);
1153     }
1154
1155     public void CleanUpNativeData(IntPtr pNativeData)
1156     {
1157         // No need to free as it's for own() parameters.
1158     }
1159
1160     public void CleanUpManagedData(object managedObj)
1161     {
1162     }
1163
1164     public int GetNativeDataSize()
1165     {
1166         return -1;
1167     }
1168
1169     public static ICustomMarshaler GetInstance(string cookie)
1170     {
1171         if (marshaler == null)
1172         {
1173             marshaler = new StringsharePassOwnershipMarshaler();
1174         }
1175
1176         return marshaler;
1177     }
1178
1179     static private StringsharePassOwnershipMarshaler marshaler;
1180 }
1181
1182 public class StringshareKeepOwnershipMarshaler : ICustomMarshaler
1183 {
1184     public object MarshalNativeToManaged(IntPtr pNativeData)
1185     {
1186         return Eina.StringConversion.NativeUtf8ToManagedString(pNativeData);
1187     }
1188
1189     public IntPtr MarshalManagedToNative(object managedObj)
1190     {
1191         return Eina.Stringshare.eina_stringshare_add((string)managedObj);
1192     }
1193
1194     public void CleanUpNativeData(IntPtr pNativeData)
1195     {
1196         // No need to free, as the native side will keep ownership.
1197     }
1198
1199     public void CleanUpManagedData(object managedObj)
1200     {
1201     }
1202
1203     public int GetNativeDataSize()
1204     {
1205         return -1;
1206     }
1207
1208     public static ICustomMarshaler GetInstance(string cookie)
1209     {
1210         if (marshaler == null)
1211         {
1212             marshaler = new StringshareKeepOwnershipMarshaler();
1213         }
1214
1215         return marshaler;
1216     }
1217
1218     static private StringshareKeepOwnershipMarshaler marshaler;
1219 }
1220
1221 public class StrbufPassOwnershipMarshaler : ICustomMarshaler
1222 {
1223     public object MarshalNativeToManaged(IntPtr pNativeData)
1224     {
1225         return new Eina.Strbuf(pNativeData, Eina.Ownership.Managed);
1226     }
1227
1228     public IntPtr MarshalManagedToNative(object managedObj)
1229     {
1230         Eina.Strbuf buf = managedObj as Eina.Strbuf;
1231         buf.ReleaseOwnership();
1232         return buf.Handle;
1233     }
1234
1235     public void CleanUpNativeData(IntPtr pNativeData)
1236     {
1237         // No need to cleanup. C will take care of it.
1238     }
1239
1240     public void CleanUpManagedData(object managedObj)
1241     {
1242     }
1243
1244     public int GetNativeDataSize()
1245     {
1246         return -1;
1247     }
1248
1249     public static ICustomMarshaler GetInstance(string cookie)
1250     {
1251         if (marshaler == null)
1252         {
1253             marshaler = new StrbufPassOwnershipMarshaler();
1254         }
1255
1256         return marshaler;
1257     }
1258
1259     static private StrbufPassOwnershipMarshaler marshaler;
1260 }
1261
1262 public class StrbufKeepOwnershipMarshaler: ICustomMarshaler
1263 {
1264     public object MarshalNativeToManaged(IntPtr pNativeData)
1265     {
1266         return new Eina.Strbuf(pNativeData, Eina.Ownership.Unmanaged);
1267     }
1268
1269     public IntPtr MarshalManagedToNative(object managedObj)
1270     {
1271         Eina.Strbuf buf = managedObj as Eina.Strbuf;
1272         return buf.Handle;
1273     }
1274
1275     public void CleanUpNativeData(IntPtr pNativeData)
1276     {
1277         // No need to free. The Native side will keep the ownership.
1278     }
1279
1280     public void CleanUpManagedData(object managedObj)
1281     {
1282     }
1283
1284     public int GetNativeDataSize()
1285     {
1286         return -1;
1287     }
1288
1289     public static ICustomMarshaler GetInstance(string cookie)
1290     {
1291         if (marshaler == null)
1292         {
1293             marshaler = new StrbufKeepOwnershipMarshaler();
1294         }
1295
1296         return marshaler;
1297     }
1298
1299     static private StrbufKeepOwnershipMarshaler marshaler;
1300 }
1301
1302 } // namespace eo
1303
1304 /// <summary>General exception for errors inside the binding.</summary>
1305 public class EflException : Exception
1306 {
1307     /// <summary>Create a new EflException with the given message.</summary>
1308     public EflException(string message) : base(message)
1309     {
1310     }
1311 }
1312
1313 /// <summary>Exception to be raised when a Task fails due to a failed Eina.Future.</summary>
1314 public class FutureException : EflException
1315 {
1316     /// <summary>The error code returned by the failed Eina.Future.</summary>
1317     public Eina.Error Error { get; private set; }
1318
1319     /// <summary>Construct a new exception from the Eina.Error stored in the given Eina.Value.</summary>
1320     public FutureException(Eina.Value value) : base("Future failed.")
1321     {
1322         if (value.GetValueType() != Eina.ValueType.Error)
1323         {
1324             throw new ArgumentException("FutureException must receive an Eina.Value with Eina.Error.");
1325         }
1326
1327         Eina.Error err;
1328         value.Get(out err);
1329         Error = err;
1330     }
1331 }
1332
1333 } // namespace efl