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