1 #pragma warning disable 1591
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;
11 using static Eina.NativeCustomExportFunctions;
12 using EoG = Efl.Eo.Globals;
22 /// <summary>Represents the type of the native Efl_Class.</summary>
23 public enum EflClassType
25 /// <summary>Regular EFL classes.</summary>
27 /// <summary>Non-instantiable efl classes (i.e. Abstracts).</summary>
29 /// <summary>Interface types.</summary>
31 /// <summary>Mixins types.</summary>
33 /// <summary>Invalid class type.</summary>
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();
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();
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);
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
66 efl_unref_delegate(IntPtr eo);
67 [DllImport(efl.Libs.CustomExports)] public static extern void
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);
82 [DllImport(efl.Libs.CustomExports)] public static extern void
83 efl_mono_thread_safe_free_cb_exec(IntPtr free_cb, IntPtr cb_data);
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);
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();
198 [DllImport(efl.Libs.Eo)] public static extern IntPtr efl_constructor(IntPtr obj);
200 [DllImport(efl.Libs.CustomExports)] public static extern IntPtr efl_mono_avoid_top_level_constructor_callback_addr_get();
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);
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);
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);
211 public const int RTLD_NOW = 2;
213 public delegate byte class_initializer(IntPtr klass);
215 public static T GetParamHelper<T>(Nullable<T> v) where T : struct
220 public static U GetParamHelper<U>(U v)
225 public static bool ParamHelperCheck<T>(Nullable<T> v) where T : struct
230 public static bool ParamHelperCheck<U>(U v)
235 public static IntPtr register_class(String class_name, IntPtr base_klass, System.Type type)
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;
246 class_initializer init = (IntPtr kls) =>
248 return Globals.class_initializer_call(kls, type);
251 description.class_initializer = Marshal.GetFunctionPointerForDelegate(init);
253 IntPtr description_ptr = Eina.MemoryNative.Alloc(Marshal.SizeOf(description));
254 Marshal.StructureToPtr(description, description_ptr, false);
256 // FIXME: description_ptr seems to be leaking memory even after an eo_shutdown
258 var interface_list = EoG.get_efl_interfaces(type);
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)
264 Eina.Log.Error("klass was not registered");
268 Eina.Log.Debug("Registered class successfully");
274 public static List<IntPtr> get_efl_interfaces(System.Type type)
276 System.Type base_type = type.BaseType;
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)
283 if (!System.Array.Exists(base_ifaces, element => element == iface))
285 var attrs = System.Attribute.GetCustomAttributes(iface);
286 foreach (var attr in attrs)
288 if (attr is Efl.Eo.NativeClass)
290 ifaces_lst.Add(((Efl.Eo.NativeClass)attr).GetEflClass());
300 private static Efl.Eo.NativeClass GetNativeClass(System.Type type)
302 var attrs = System.Attribute.GetCustomAttributes(type, false);
303 foreach (var attr in attrs)
305 if (attr is Efl.Eo.NativeClass)
307 return (Efl.Eo.NativeClass)attr;
314 public static System.Collections.Generic.List<System.Reflection.MethodInfo>
315 GetUserMethods(System.Type type)
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;
325 for (;base_type != null; base_type = base_type.BaseType)
327 if (IsGeneratedClass(base_type))
332 r.AddRange(base_type.GetMethods(flags));
337 public static byte class_initializer_call(IntPtr klass, System.Type type)
339 Eina.Log.Debug($"called with 0x{klass.ToInt64():x} {type}");
340 var derived = type.BaseType;
341 Efl.Eo.NativeClass nativeClass = GetNativeClass(derived);
343 while (nativeClass == null)
345 derived = derived.BaseType;
348 nativeClass = GetNativeClass(derived);
351 if (nativeClass != null)
353 Eina.Log.Debug("nativeClass != null");
354 var descs = nativeClass.GetEoOps(type);
355 var count = descs.Count;
357 var all_interfaces = type.GetInterfaces();
358 var base_interfaces = type.BaseType.GetInterfaces();
359 foreach (var iface in all_interfaces)
361 if (!System.Array.Exists(base_interfaces, element => element == iface))
363 var nc = GetNativeClass(iface);
366 var moredescs = nc.GetEoOps(type);
367 Eina.Log.Debug($"adding {moredescs.Count} more descs to registration");
368 descs.AddRange(moredescs);
374 IntPtr descs_ptr = IntPtr.Zero;
378 descs_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(descs[0]) * count);
381 IntPtr ptr = descs_ptr;
382 for (int i = 0; i != count; ++i)
384 Marshal.StructureToPtr(descs[i], ptr, false);
385 ptr = IntPtr.Add(ptr, Marshal.SizeOf(descs[0]));
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);
398 Eina.Log.Debug("nativeClass == null");
404 public static IntPtr call_efl_class_new(IntPtr desc, IntPtr bk, List<IntPtr> il = null)
406 IntPtr nul = IntPtr.Zero;
407 int iface_list_count = (il == null ? 0 : il.Count);
408 switch (iface_list_count)
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);
463 public static Efl.Eo.WrapperSupervisor WrapperSupervisorPtrToManaged(IntPtr wsPtr)
465 return (Efl.Eo.WrapperSupervisor) GCHandle.FromIntPtr(wsPtr).Target;
468 public static Efl.Eo.WrapperSupervisor GetWrapperSupervisor(IntPtr eo)
470 var wsPtr = Efl.Eo.Globals.efl_mono_wrapper_supervisor_get(eo);
471 if (wsPtr == IntPtr.Zero)
476 return WrapperSupervisorPtrToManaged(wsPtr);
479 public static void SetWrapperSupervisor(IntPtr eo, Efl.Eo.WrapperSupervisor ws)
481 GCHandle gch = GCHandle.Alloc(ws);
482 Efl.Eo.Globals.efl_mono_wrapper_supervisor_set(eo, GCHandle.ToIntPtr(gch));
485 public static void free_dict_values(Dictionary<String, IntPtr> dict)
487 foreach (IntPtr ptr in dict.Values)
489 Eina.MemoryNative.Free(ptr);
493 public static void free_stringshare_values(Dictionary<String, IntPtr> dict)
495 foreach (IntPtr ptr in dict.Values)
497 Eina.NativeMethods.eina_stringshare_del(ptr);
501 public static void free_gchandle(IntPtr ptr)
503 GCHandle handle = GCHandle.FromIntPtr(ptr);
507 public static System.Threading.Tasks.Task<Eina.Value> WrapAsync(Eina.Future future, CancellationToken token)
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>();
513 // Flag to be passed to the cancell callback
514 bool fulfilled = false;
516 future.Then((Eina.Value received) =>
520 // Convert an failed Future to a failed Task.
521 if (received.GetValueType() == Eina.ValueType.Error)
524 received.Get(out err);
525 if (err == Eina.Error.ECANCELED)
531 tcs.TrySetException(new Efl.FutureException(received));
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));
546 // Callback to be called when the token is cancelled.
551 // Will trigger the Then callback above with an Eina.Error
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)
567 return GetNativeClass(managedType) != null;
570 /// <summary>Creates a new wrapper for the given Eo id.
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>
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)
582 if (handle == IntPtr.Zero)
587 Efl.Eo.Globals.efl_ref(handle);
590 var ws = Efl.Eo.Globals.GetWrapperSupervisor(handle);
591 if (ws != null && ws.Target != null)
595 Efl.Eo.Globals.efl_unref(handle);
601 IntPtr eoKlass = efl_class_get(handle);
603 if (eoKlass == IntPtr.Zero)
605 throw new InvalidOperationException($"Can't get Eo class for object handle 0x{handle.ToInt64():x}");
608 var managedType = ClassRegister.GetManagedType(eoKlass);
610 if (managedType == null)
612 IntPtr nativeName = efl_class_name_get(eoKlass);
613 var name = Eina.StringConversion.NativeUtf8ToManagedString(nativeName);
615 throw new InvalidOperationException($"Can't get Managed class for object handle 0x{handle.ToInt64():x} with native class [{name}]");
618 Debug.Assert(IsGeneratedClass(managedType));
619 System.Reflection.ConstructorInfo constructor = null;
623 var flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
624 constructor = managedType.GetConstructor(flags, null, new Type[1] { typeof(WrappingHandle) }, null);
626 catch (InvalidOperationException)
628 throw new InvalidOperationException($"Can't get constructor for type {managedType}");
631 WrappingHandle wh = new WrappingHandle(handle);
632 var ret = (Efl.Eo.IWrapper) constructor.Invoke(new object[1] { wh });
636 throw new InvalidOperationException($"Can't construct type {managedType} from IntPtr handle");
641 Efl.Eo.Globals.efl_ref(handle);
648 Efl.Eo.Globals.efl_unref(handle);
652 private static Efl.FreeWrapperSupervisorCb FreeWrapperSupervisorCallbackDelegate = new Efl.FreeWrapperSupervisorCb(FreeWrapperSupervisorCallback);
653 public static void FreeWrapperSupervisorCallback(IntPtr eo)
657 var wsPtr = Efl.Eo.Globals.efl_mono_wrapper_supervisor_get(eo);
658 if (wsPtr == IntPtr.Zero)
660 Eina.Log.Error($"Invalid wrapper supervisor [Eo pointer: {eo.ToInt64():x}]");
664 Efl.Eo.Globals.efl_mono_wrapper_supervisor_set(eo, IntPtr.Zero);
666 GCHandle gch = GCHandle.FromIntPtr(wsPtr);
667 var ws = (Efl.Eo.WrapperSupervisor) gch.Target;
668 foreach (var item in ws.EoEvents)
670 if (!efl_event_callback_del(eo, item.Key.desc, item.Value.evtCallerPtr, wsPtr))
672 Eina.Log.Error($"Failed to remove event proxy for event {item.Key.desc} [eo: {eo.ToInt64():x}; cb: {item.Value.evtCallerPtr.ToInt64():x}]");
676 // Free the native eo
677 Efl.Eo.Globals.efl_unref(eo);
679 // now the WrapperSupervisor can be collected, and so its member:
680 // - the event dictionary
681 // - and the EoWrapper if it is still pinned
686 Eina.Log.Error(e.ToString());
687 Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);
691 public static void SetNativeDisposeCallbacks()
693 efl_mono_wrapper_supervisor_callbacks_set(FreeWrapperSupervisorCallbackDelegate);
696 public static void ThreadSafeFreeCbExec(EinaFreeCb cbFreeCb, IntPtr cbData)
698 EinaFreeCb cb = (IntPtr gcHandlePtr) => {
700 GCHandle gcHandle = GCHandle.FromIntPtr(gcHandlePtr);
704 Monitor.Enter(Efl.All.InitLock);
705 if (Efl.All.MainLoopInitialized)
707 IntPtr cbPtr = Marshal.GetFunctionPointerForDelegate(cb);
708 var handle = GCHandle.Alloc(cb);
709 var handlePtr = GCHandle.ToIntPtr(handle);
711 efl_mono_thread_safe_free_cb_exec(cbPtr, handlePtr);
713 Monitor.Exit(Efl.All.InitLock);
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.
721 public struct WrappingHandle
723 public WrappingHandle(IntPtr h)
728 public IntPtr NativeHandle { get; private set; }
733 public static class Config
736 public static void Init()
738 Globals.efl_object_init();
739 Globals.SetNativeDisposeCallbacks();
742 public static void Shutdown()
744 Globals.efl_object_shutdown();
748 [System.AttributeUsage(System.AttributeTargets.Class |
749 System.AttributeTargets.Interface,
750 AllowMultiple = false,
753 public abstract class NativeClass : System.Attribute
755 public abstract IntPtr GetEflClass();
756 public abstract System.Collections.Generic.List<Efl_Op_Description> GetEoOps(System.Type type);
759 /// <summary>Attribute for private native classes.
761 /// <para>For internal usage by generated code only.</para></summary>
762 public class PrivateNativeClass : NativeClass
764 public override IntPtr GetEflClass()
769 public override System.Collections.Generic.List<Efl_Op_Description> GetEoOps(System.Type type)
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,
783 public class BindingEntity: System.Attribute
785 public static bool IsBindingEntity(System.Type t)
787 return Attribute.GetCustomAttribute(t, typeof(BindingEntity), false) != null;
791 public interface IWrapper
793 /// <summary>Pointer to internal Eo instance.</summary>
799 /// <summary>Pointer to internal Eo class.</summary>
806 public static class ClassRegister
808 public static System.Type GetManagedType(IntPtr klass)
811 if (Efl.Eo.ClassRegister.typeFromKlass.TryGetValue(klass, out t))
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)
820 throw new System.InvalidOperationException($"Could not get Native class name. Handle: {klass}");
823 string name = Eina.StringConversion.NativeUtf8ToManagedString(namePtr)
824 .Replace("_", ""); // Convert Efl C name to C# name
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))
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
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)
840 var pos = name.LastIndexOf(".");
841 name = name.Insert(pos + 1, "I"); // -1 if not found, inserts at 0 normally
844 var curr_asm = typeof(IWrapper).Assembly;
845 t = curr_asm.GetType(name);
848 foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
850 if (assembly == curr_asm)
855 t = assembly.GetType(name);
864 return typeof(Efl.Object);
868 AddToKlassTypeBiDictionary(klass, t); // Cache it in the dictionary
872 public static IntPtr GetKlass(System.Type objectType)
875 if (klassFromType.TryGetValue(objectType, out klass))
880 // Check if it is a Native binding class
881 klass = GetNativeKlassPtr(objectType);
882 if (klass != IntPtr.Zero)
884 // Add to the dictionary cache
885 AddToKlassTypeBiDictionary(klass, objectType);
889 // Unregistered Inherited class, let's register it
890 IntPtr baseKlass = GetNativeBaseKlassPtr(objectType);
891 if (baseKlass == IntPtr.Zero)
893 throw new System.InvalidOperationException($"Could not get base C# binding class for Inherited type: {objectType.FullName}");
896 return RegisterKlass(baseKlass, objectType);
899 public static IntPtr GetInheritKlassOrRegister(IntPtr baseKlass, System.Type objectType)
902 if (klassFromType.TryGetValue(objectType, out klass))
907 return RegisterKlass(baseKlass, objectType);
910 private static IntPtr RegisterKlass(IntPtr baseKlass, System.Type objectType)
912 lock (klassAllocLock)
914 IntPtr newKlass = Efl.Eo.Globals.register_class(objectType.FullName, baseKlass, objectType);
915 if (newKlass == IntPtr.Zero)
917 throw new System.InvalidOperationException($"Failed to register class '{objectType.FullName}'");
920 AddToKlassTypeBiDictionary(newKlass, objectType);
925 private static IntPtr GetNativeBaseKlassPtr(System.Type objectType)
927 for (System.Type t = objectType.BaseType; t != null; t = t.BaseType)
929 var ptr = GetNativeKlassPtr(t);
930 if (ptr != IntPtr.Zero)
936 throw new System.InvalidOperationException($"Class '{objectType.FullName}' is not an Efl object");
939 private static IntPtr GetNativeKlassPtr(System.Type objectType)
941 if (objectType == null)
946 if (objectType.IsInterface)
948 // Try to get the *Concrete class
949 var assembly = objectType.Assembly;
950 objectType = assembly.GetType(objectType.FullName + "Concrete");
952 if (objectType == null)
958 var method = objectType.GetMethod("GetEflClassStatic",
959 System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
966 return (IntPtr)(method.Invoke(null, null));
969 public static void AddToKlassTypeBiDictionary(IntPtr klassPtr, System.Type objectType)
971 klassFromType[objectType] = klassPtr;
972 typeFromKlass[klassPtr] = objectType;
975 public static System.Collections.Concurrent.ConcurrentDictionary<System.Type, System.IntPtr> klassFromType
976 = new System.Collections.Concurrent.ConcurrentDictionary<System.Type, System.IntPtr>();
978 public static System.Collections.Concurrent.ConcurrentDictionary<System.IntPtr, System.Type> typeFromKlass
979 = new System.Collections.Concurrent.ConcurrentDictionary<System.IntPtr, System.Type>();
981 private static readonly object klassAllocLock = new object();
984 public interface IOwnershipTag
988 public class OwnTag : IOwnershipTag
992 public class NonOwnTag : IOwnershipTag
996 public class MarshalEo<U> : ICustomMarshaler
997 where U : IOwnershipTag
999 public static ICustomMarshaler GetInstance(string cookie)
1001 Eina.Log.Debug("MarshalEo.GetInstace cookie " + cookie);
1002 return new MarshalEo<U>();
1005 public void CleanUpManagedData(object ManagedObj)
1007 //Eina.Log.Warning("MarshalEo.CleanUpManagedData not implemented");
1008 //throw new NotImplementedException();
1011 public void CleanUpNativeData(IntPtr pNativeData)
1013 //Eina.Log.Warning("MarshalEo.CleanUpNativeData not implemented");
1014 //throw new NotImplementedException();
1017 public int GetNativeDataSize()
1019 Eina.Log.Debug("MarshalEo.GetNativeDataSize");
1024 public IntPtr MarshalManagedToNative(object ManagedObj)
1026 Eina.Log.Debug("MarshalEo.MarshallManagedToNative");
1028 if (ManagedObj == null)
1033 var r = ((IWrapper)ManagedObj).NativeHandle;
1034 if (typeof(U) == typeof(OwnTag))
1036 Efl.Eo.Globals.efl_ref(r);
1042 public object MarshalNativeToManaged(IntPtr pNativeData)
1044 return Efl.Eo.Globals.CreateWrapperFor(pNativeData, shouldIncRef : typeof(U) != typeof(OwnTag));
1048 ///<summary>Marshals between System.Type instances and Eo classes (IntPtrs).</summary>
1049 public class MarshalEflClass : ICustomMarshaler
1051 public static ICustomMarshaler GetInstance(string cookie)
1053 Eina.Log.Debug("MarshalEflClass.GetInstance cookie " + cookie);
1054 return new MarshalEflClass();
1057 public void CleanUpManagedData(object ManagedObj)
1061 public void CleanUpNativeData(IntPtr pNativeData)
1065 public int GetNativeDataSize()
1067 Eina.Log.Debug("MarshalEflClass.GetNativeDataSize");
1071 public IntPtr MarshalManagedToNative(object ManagedObj)
1073 Eina.Log.Debug("MarshalEflClass.MarshallManagedToNative");
1074 if (ManagedObj == null)
1079 var t = (System.Type)ManagedObj;
1080 return Efl.Eo.ClassRegister.GetKlass(t);
1083 public object MarshalNativeToManaged(IntPtr pNativeData)
1085 Eina.Log.Debug("MarshalEflClass.MarshalNativeToManaged");
1086 if (pNativeData == IntPtr.Zero)
1091 return Efl.Eo.ClassRegister.GetManagedType(pNativeData);
1095 public class StringPassOwnershipMarshaler : ICustomMarshaler
1097 public object MarshalNativeToManaged(IntPtr pNativeData)
1099 var ret = Eina.StringConversion.NativeUtf8ToManagedString(pNativeData);
1100 Eina.MemoryNative.Free(pNativeData);
1104 public IntPtr MarshalManagedToNative(object managedObj)
1106 return Eina.MemoryNative.StrDup((string)managedObj);
1109 public void CleanUpNativeData(IntPtr pNativeData)
1111 // No need to cleanup. C will take care of it.
1114 public void CleanUpManagedData(object managedObj)
1118 public int GetNativeDataSize()
1123 public static ICustomMarshaler GetInstance(string cookie)
1125 if (marshaler == null)
1127 marshaler = new StringPassOwnershipMarshaler();
1133 static private StringPassOwnershipMarshaler marshaler;
1136 public class StringKeepOwnershipMarshaler: ICustomMarshaler
1138 public object MarshalNativeToManaged(IntPtr pNativeData)
1140 return Eina.StringConversion.NativeUtf8ToManagedString(pNativeData);
1143 public IntPtr MarshalManagedToNative(object managedObj)
1145 return Eina.StringConversion.ManagedStringToNativeUtf8Alloc((string)managedObj);
1148 public void CleanUpNativeData(IntPtr pNativeData)
1150 // No need to free. The Native side will keep the ownership.
1153 public void CleanUpManagedData(object managedObj)
1157 public int GetNativeDataSize()
1162 public static ICustomMarshaler GetInstance(string cookie)
1164 if (marshaler == null)
1166 marshaler = new StringKeepOwnershipMarshaler();
1172 static private StringKeepOwnershipMarshaler marshaler;
1175 public class StringsharePassOwnershipMarshaler : ICustomMarshaler
1177 public object MarshalNativeToManaged(IntPtr pNativeData)
1179 var ret = Eina.StringConversion.NativeUtf8ToManagedString(pNativeData);
1180 Eina.NativeMethods.eina_stringshare_del(pNativeData);
1184 public IntPtr MarshalManagedToNative(object managedObj)
1186 return Eina.MemoryNative.AddStringshare((string)managedObj);
1189 public void CleanUpNativeData(IntPtr pNativeData)
1191 // No need to free as it's for own() parameters.
1194 public void CleanUpManagedData(object managedObj)
1198 public int GetNativeDataSize()
1203 public static ICustomMarshaler GetInstance(string cookie)
1205 if (marshaler == null)
1207 marshaler = new StringsharePassOwnershipMarshaler();
1213 static private StringsharePassOwnershipMarshaler marshaler;
1216 public class StringshareKeepOwnershipMarshaler : ICustomMarshaler
1218 public object MarshalNativeToManaged(IntPtr pNativeData)
1220 return Eina.StringConversion.NativeUtf8ToManagedString(pNativeData);
1223 public IntPtr MarshalManagedToNative(object managedObj)
1225 return Eina.MemoryNative.AddStringshare((string)managedObj);
1228 public void CleanUpNativeData(IntPtr pNativeData)
1230 // No need to free, as the native side will keep ownership.
1233 public void CleanUpManagedData(object managedObj)
1237 public int GetNativeDataSize()
1242 public static ICustomMarshaler GetInstance(string cookie)
1244 if (marshaler == null)
1246 marshaler = new StringshareKeepOwnershipMarshaler();
1252 static private StringshareKeepOwnershipMarshaler marshaler;
1255 public class StrbufPassOwnershipMarshaler : ICustomMarshaler
1257 public object MarshalNativeToManaged(IntPtr pNativeData)
1259 return new Eina.Strbuf(pNativeData, Eina.Ownership.Managed);
1262 public IntPtr MarshalManagedToNative(object managedObj)
1264 Eina.Strbuf buf = managedObj as Eina.Strbuf;
1265 buf.ReleaseOwnership();
1269 public void CleanUpNativeData(IntPtr pNativeData)
1271 // No need to cleanup. C will take care of it.
1274 public void CleanUpManagedData(object managedObj)
1278 public int GetNativeDataSize()
1283 public static ICustomMarshaler GetInstance(string cookie)
1285 if (marshaler == null)
1287 marshaler = new StrbufPassOwnershipMarshaler();
1293 static private StrbufPassOwnershipMarshaler marshaler;
1296 public class StrbufKeepOwnershipMarshaler: ICustomMarshaler
1298 public object MarshalNativeToManaged(IntPtr pNativeData)
1300 return new Eina.Strbuf(pNativeData, Eina.Ownership.Unmanaged);
1303 public IntPtr MarshalManagedToNative(object managedObj)
1305 Eina.Strbuf buf = managedObj as Eina.Strbuf;
1309 public void CleanUpNativeData(IntPtr pNativeData)
1311 // No need to free. The Native side will keep the ownership.
1314 public void CleanUpManagedData(object managedObj)
1318 public int GetNativeDataSize()
1323 public static ICustomMarshaler GetInstance(string cookie)
1325 if (marshaler == null)
1327 marshaler = new StrbufKeepOwnershipMarshaler();
1333 static private StrbufKeepOwnershipMarshaler marshaler;
1338 /// <summary>General exception for errors inside the binding.</summary>
1339 public class EflException : Exception
1341 /// <summary>Create a new EflException with the given message.</summary>
1342 public EflException(string message) : base(message)
1347 /// <summary>Exception to be raised when a Task fails due to a failed Eina.Future.</summary>
1348 public class FutureException : EflException
1350 /// <summary>The error code returned by the failed Eina.Future.</summary>
1351 public Eina.Error Error { get; private set; }
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.")
1356 if (value.GetValueType() != Eina.ValueType.Error)
1358 throw new ArgumentException("FutureException must receive an Eina.Value with Eina.Error.");