[Bluetooth][Non-ACR] Fix no data exception issue (#787)
[platform/core/csapi/tizenfx.git] / internals / src / EflSharp / EflSharp / iwrapper.cs
1 #pragma warning disable 1591
2
3 using System;
4 using System.Runtime.InteropServices;
5 using System.Collections.Generic;
6 using System.Diagnostics;
7 using System.Threading;
8
9 using static Eina.NativeCustomExportFunctions;
10 using EoG = Efl.Eo.Globals;
11
12 namespace Efl { namespace Eo {
13
14 public class Globals {
15     [return: MarshalAs(UnmanagedType.U1)]
16     public delegate bool efl_object_init_delegate();
17     public static FunctionWrapper<efl_object_init_delegate> efl_object_init_ptr =
18         new FunctionWrapper<efl_object_init_delegate>(efl.Libs.EoModule, "efl_object_init");
19     public static bool efl_object_init() => efl_object_init_ptr.Value.Delegate();
20
21     public delegate void efl_object_shutdown_delegate();
22     public static FunctionWrapper<efl_object_shutdown_delegate> efl_object_shutdown_ptr = new FunctionWrapper<efl_object_shutdown_delegate>(efl.Libs.EoModule, "efl_object_shutdown");
23     public static void efl_object_shutdown() => efl_object_shutdown_ptr.Value.Delegate();
24     // [DllImport(efl.Libs.Eo)] public static extern void efl_object_shutdown();
25     public static FunctionWrapper<_efl_add_internal_start_delegate> _efl_add_internal_start_ptr = new FunctionWrapper<_efl_add_internal_start_delegate>(efl.Libs.EoModule, "_efl_add_internal_start");
26     public delegate  IntPtr
27         _efl_add_internal_start_delegate([MarshalAs(UnmanagedType.LPStr)] String file, int line,
28                                 IntPtr klass, IntPtr parent, byte is_ref, byte is_fallback);
29     [DllImport(efl.Libs.Eo)] public static extern IntPtr
30         _efl_add_internal_start([MarshalAs(UnmanagedType.LPStr)] String file, int line,
31                                 IntPtr klass, IntPtr parent, byte is_ref, byte is_fallback);
32     public delegate  IntPtr
33         _efl_add_end_delegate(IntPtr eo, byte is_ref, byte is_fallback);
34     [DllImport(efl.Libs.Eo)] public static extern IntPtr
35         _efl_add_end(IntPtr eo, byte is_ref, byte is_fallback);
36     public delegate  IntPtr
37         efl_ref_delegate(IntPtr eo);
38     [DllImport(efl.Libs.Eo)] public static extern IntPtr
39         efl_ref(IntPtr eo);
40     public delegate  void
41         efl_unref_delegate(IntPtr eo);
42     [DllImport(efl.Libs.CustomExports)] public static extern void
43         efl_unref(IntPtr eo);
44     public delegate  int
45         efl_ref_count_delegate(IntPtr eo);
46     [DllImport(efl.Libs.Eo)] public static extern int
47         efl_ref_count(IntPtr eo);
48
49     [DllImport(efl.Libs.Eo)] public static extern IntPtr
50         efl_class_name_get(IntPtr eo);
51     [DllImport(efl.Libs.Eo)] public static extern IntPtr
52         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr term);
53     [DllImport(efl.Libs.Eo)] public static extern IntPtr
54         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr term);
55     [DllImport(efl.Libs.Eo)] public static extern IntPtr
56         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr term);
57     [DllImport(efl.Libs.Eo)] public static extern IntPtr
58         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr term);
59     [DllImport(efl.Libs.Eo)] public static extern IntPtr
60         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr term);
61     [DllImport(efl.Libs.Eo)] public static extern IntPtr
62         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr term);
63     [DllImport(efl.Libs.Eo)] public static extern IntPtr
64         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr term);
65     [DllImport(efl.Libs.Eo)] public static extern IntPtr
66         efl_class_new(IntPtr class_description, IntPtr parent, IntPtr extn1, IntPtr extn2, IntPtr extn3, IntPtr extn4, IntPtr extn5, IntPtr extn6, IntPtr extn7, IntPtr term);
67     [DllImport(efl.Libs.Eo)] public static extern IntPtr
68         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);
69     [DllImport(efl.Libs.Eo)] public static extern IntPtr
70         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);
71     [DllImport(efl.Libs.Eo)] public static extern IntPtr
72         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);
73     [DllImport(efl.Libs.Eo)] public static extern IntPtr
74         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);
75     [DllImport(efl.Libs.Eo)] public static extern IntPtr
76         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);
77     [DllImport(efl.Libs.Eo)] public static extern IntPtr
78         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);
79     [DllImport(efl.Libs.Eo)] public static extern IntPtr
80         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);
81     [DllImport(efl.Libs.Eo)] public static extern IntPtr
82         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);
83     [DllImport(efl.Libs.Eo)] public static extern IntPtr
84         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);
85     [DllImport(efl.Libs.Eo)] public static extern IntPtr
86         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);
87     [DllImport(efl.Libs.Eo)] public static extern IntPtr
88         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);
89     [DllImport(efl.Libs.Eo)] public static extern IntPtr
90         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);
91     [DllImport(efl.Libs.Eo)] public static extern IntPtr
92         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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
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 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);
149
150     public delegate  byte efl_class_functions_set_delegate(IntPtr klass_id, IntPtr object_ops, IntPtr class_ops);
151     [DllImport(efl.Libs.Eo)] public static extern byte efl_class_functions_set(IntPtr klass_id, IntPtr object_ops, IntPtr class_ops);
152     public delegate  IntPtr efl_data_scope_get_delegate(IntPtr obj, IntPtr klass);
153     [DllImport(efl.Libs.Eo)] public static extern IntPtr efl_data_scope_get(IntPtr obj, IntPtr klass);
154     public delegate  IntPtr efl_super_delegate(IntPtr obj, IntPtr klass);
155     [DllImport(efl.Libs.Eo)] public static extern IntPtr efl_super(IntPtr obj, IntPtr klass);
156     public delegate  IntPtr efl_class_get_delegate(IntPtr obj);
157     [DllImport(efl.Libs.Eo)] public static extern IntPtr efl_class_get(IntPtr obj);
158     public delegate  IntPtr dlerror_delegate();
159     [DllImport(efl.Libs.Evil)] public static extern IntPtr dlerror();
160
161     public delegate  bool efl_event_callback_priority_add_delegate(
162               System.IntPtr obj,
163               IntPtr desc,
164               short priority,
165               Efl.EventCb cb,
166               System.IntPtr data);
167     [DllImport(efl.Libs.Eo)] public static extern bool efl_event_callback_priority_add(
168               System.IntPtr obj,
169               IntPtr desc,
170               short priority,
171               Efl.EventCb cb,
172               System.IntPtr data);
173     public delegate  bool efl_event_callback_del_delegate(
174               System.IntPtr obj,
175               IntPtr desc,
176               Efl.EventCb cb,
177               System.IntPtr data);
178     [DllImport(efl.Libs.Eo)] public static extern bool efl_event_callback_del(
179               System.IntPtr obj,
180               IntPtr desc,
181               Efl.EventCb cb,
182               System.IntPtr data);
183     public delegate  IntPtr
184         efl_object_legacy_only_event_description_get_delegate([MarshalAs(UnmanagedType.LPStr)] String name);
185     [DllImport(efl.Libs.Eo)] public static extern IntPtr
186         efl_object_legacy_only_event_description_get([MarshalAs(UnmanagedType.LPStr)] String name);
187
188     public const int RTLD_NOW = 2;
189
190     public delegate byte class_initializer(IntPtr klass);
191
192     public static T GetParamHelper<T>(Nullable<T> v) where T : struct
193     {
194         return v.Value;
195     }
196     public static U GetParamHelper<U>(U v)
197     {
198         return v;
199     }
200     public static bool ParamHelperCheck<T>(Nullable<T> v) where T : struct
201     {
202         return v.HasValue;
203     }
204     public static bool ParamHelperCheck<U>(U v)
205     {
206         return v != null;
207     }
208
209     public static IntPtr register_class(String class_name, IntPtr base_klass, System.Type type)
210     {
211         ClassDescription description;
212         description.version = 2; // EO_VERSION
213         description.name = class_name;
214         description.class_type = 0; // REGULAR
215         description.data_size = (UIntPtr)8;
216         description.class_initializer = IntPtr.Zero;
217         description.class_constructor = IntPtr.Zero;
218         description.class_destructor = IntPtr.Zero;
219
220         class_initializer init = (IntPtr kls) =>
221             {
222                 return Globals.class_initializer_call(kls, type);
223             };
224
225         description.class_initializer = Marshal.GetFunctionPointerForDelegate(init);
226
227         IntPtr description_ptr = Eina.MemoryNative.Alloc(Marshal.SizeOf(description));
228         Marshal.StructureToPtr(description, description_ptr, false);
229
230         var interface_list = EoG.get_efl_interfaces(type);
231
232         Eina.Log.Debug($"Going to register new class named {class_name}");
233         IntPtr klass = EoG.call_efl_class_new(description_ptr, base_klass, interface_list);
234         if(klass == IntPtr.Zero)
235             Eina.Log.Error("klass was not registered");
236         else
237             Eina.Log.Debug("Registered class successfully");
238         return klass;
239     }
240     public static List<IntPtr> get_efl_interfaces(System.Type type)
241     {
242         System.Type base_type = type.BaseType;
243
244         var ifaces_lst = new List<IntPtr>();
245         var base_ifaces = base_type.GetInterfaces();
246         var ifaces = type.GetInterfaces();
247         foreach (var iface in ifaces)
248         {
249             if (!System.Array.Exists(base_ifaces, element => element == iface))
250             {
251                var attrs = System.Attribute.GetCustomAttributes(iface);
252                foreach (var attr in attrs)
253                {
254                   if (attr is Efl.Eo.NativeClass) {
255                     ifaces_lst.Add(((Efl.Eo.NativeClass)attr).GetEflClass());
256                     break;
257                   }
258                }
259             }
260         }
261         return ifaces_lst;
262     }
263     private static Efl.Eo.NativeClass get_native_class(System.Type type)
264     {
265         var attrs = System.Attribute.GetCustomAttributes(type);
266         foreach (var attr in attrs)
267         {
268             if (attr is Efl.Eo.NativeClass) {
269                 return (Efl.Eo.NativeClass)attr;
270             }
271         }
272         return null;
273     }
274     public static byte class_initializer_call(IntPtr klass, System.Type type)
275     {
276         Eina.Log.Debug($"called with 0x{klass.ToInt64():x} {type}");
277         Efl.Eo.NativeClass nativeClass = get_native_class(type.BaseType);
278
279         if (nativeClass != null)
280         {
281             Eina.Log.Debug("nativeClass != null");
282             var descs = nativeClass.GetEoOps(type);
283             var count = descs.Count;
284
285             var all_interfaces = type.GetInterfaces();
286             var base_interfaces = type.BaseType.GetInterfaces();
287             foreach (var iface in all_interfaces)
288             {
289                 if (!System.Array.Exists(base_interfaces, element => element == iface))
290                 {
291                     var nc = get_native_class(iface);
292                     if(nc != null)
293                     {
294                         var moredescs = nc.GetEoOps(type);
295                         Eina.Log.Debug($"adding {moredescs.Count} more descs to registration");
296                         descs.AddRange(moredescs);
297                         count = descs.Count;
298                     }
299                 }
300             }
301
302             IntPtr descs_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(descs[0])*count);
303             IntPtr ptr = descs_ptr;
304             for(int i = 0; i != count; ++i)
305             {
306                Marshal.StructureToPtr(descs[i], ptr, false);
307                ptr = IntPtr.Add(ptr, Marshal.SizeOf(descs[0]));
308             }
309             Efl_Object_Ops ops;
310             ops.descs = descs_ptr;
311             ops.count = (UIntPtr)count;
312             IntPtr ops_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(ops));
313             Marshal.StructureToPtr(ops, ops_ptr, false);
314             Efl.Eo.Globals.efl_class_functions_set(klass, ops_ptr, IntPtr.Zero);
315             //EoKlass = klass;
316         }
317         else
318             Eina.Log.Debug("nativeClass == null");
319
320        return 1;
321     }
322     public static IntPtr call_efl_class_new(IntPtr desc, IntPtr bk, List<IntPtr> il = null)
323     {
324         IntPtr nul = IntPtr.Zero;
325         int iface_list_count = (il == null ? 0 : il.Count);
326         switch(iface_list_count)
327         {
328         default: return nul;
329         case  0: return EoG.efl_class_new(desc, bk, nul);
330         case  1: return EoG.efl_class_new(desc, bk, il[0], nul);
331         case  2: return EoG.efl_class_new(desc, bk, il[0], il[1], nul);
332         case  3: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], nul);
333         case  4: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], nul);
334         case  5: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], nul);
335         case  6: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], nul);
336         case  7: return EoG.efl_class_new(desc, bk, il[0], il[1], il[2], il[3], il[4], il[5], il[6], nul);
337         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);
338         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);
339         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);
340         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);
341         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);
342         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);
343         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);
344         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);
345         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);
346         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);
347         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);
348         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);
349         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);
350         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);
351         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);
352         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);
353         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);
354         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);
355         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);
356         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);
357         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);
358         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);
359         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);
360         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);
361         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);
362         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);
363         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);
364         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);
365         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);
366         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);
367         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);
368         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);
369         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);
370         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);
371         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);
372         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);
373         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);
374         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);
375         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);
376         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);
377         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);
378         }
379     }
380     public static IntPtr instantiate_start(IntPtr klass, Efl.Object parent)
381     {
382         Eina.Log.Debug($"Instantiating from klass 0x{klass.ToInt64():x}");
383         System.IntPtr parent_ptr = System.IntPtr.Zero;
384         if(parent != null)
385             parent_ptr = parent.NativeHandle;
386
387         System.IntPtr eo = Efl.Eo.Globals._efl_add_internal_start("file", 0, klass, parent_ptr, 1, 0);
388         if (eo == System.IntPtr.Zero)
389         {
390             throw new Exception("Instantiation failed");
391         }
392
393         Eina.Log.Debug($"Eo instance right after internal_start 0x{eo.ToInt64():x} with refcount {Efl.Eo.Globals.efl_ref_count(eo)}");
394         Eina.Log.Debug($"Parent was 0x{parent_ptr.ToInt64()}");
395         return eo;
396     }
397
398     public static IntPtr instantiate_end(IntPtr eo) {
399         Eina.Log.Debug("calling efl_add_internal_end");
400         eo = Efl.Eo.Globals._efl_add_end(eo, 1, 0);
401         Eina.Log.Debug($"efl_add_end returned eo 0x{eo.ToInt64():x}");
402         return eo;
403     }
404     public static void data_set(Efl.Eo.IWrapper obj)
405     {
406       Eina.Log.Debug($"Calling data_scope_get with obj {obj.NativeHandle.ToInt64():x} and klass {obj.NativeClass.ToInt64():x}");
407       IntPtr pd = Efl.Eo.Globals.efl_data_scope_get(obj.NativeHandle, obj.NativeClass);
408       {
409           GCHandle gch = GCHandle.Alloc(obj);
410           EolianPD epd;
411           epd.pointer = GCHandle.ToIntPtr(gch);
412           Marshal.StructureToPtr(epd, pd, false);
413       }
414     }
415     public static Efl.Eo.IWrapper data_get(IntPtr pd)
416     {
417         EolianPD epd = (EolianPD)Marshal.PtrToStructure(pd, typeof(EolianPD));
418         if(epd.pointer != IntPtr.Zero)
419         {
420             GCHandle gch = GCHandle.FromIntPtr(epd.pointer);
421             return (Efl.Eo.IWrapper)gch.Target;
422         }
423         else
424             return null;
425     }
426
427     public static void free_dict_values(Dictionary<String, IntPtr> dict)
428     {
429         foreach(IntPtr ptr in dict.Values)
430         {
431             Eina.MemoryNative.Free(ptr);
432         }
433     }
434
435     public static void free_stringshare_values(Dictionary<String, IntPtr> dict)
436     {
437         foreach(IntPtr ptr in dict.Values)
438         {
439             Eina.Stringshare.eina_stringshare_del(ptr);
440         }
441     }
442
443     public static void free_gchandle(IntPtr ptr)
444     {
445         GCHandle handle = GCHandle.FromIntPtr(ptr);
446         handle.Free();
447     }
448
449     public static System.Threading.Tasks.Task<Eina.Value> WrapAsync(Eina.Future future, CancellationToken token)
450     {
451         // Creates a task that will wait for SetResult for completion.
452         // TaskCompletionSource is used to create tasks for 'external' Task sources.
453         var tcs = new System.Threading.Tasks.TaskCompletionSource<Eina.Value>();
454
455         // Flag to be passed to the cancell callback
456         bool fulfilled = false;
457
458         future.Then((Eina.Value received) => {
459                 lock (future)
460                 {
461                     // Convert an failed Future to a failed Task.
462                     if (received.GetValueType() == Eina.ValueType.Error)
463                     {
464                         Eina.Error err;
465                         received.Get(out err);
466                         if (err == Eina.Error.ECANCELED)
467                             tcs.SetCanceled();
468                         else
469                             tcs.TrySetException(new Efl.FutureException(received));
470                     }
471                     else
472                     {
473                         // Will mark the returned task below as completed.
474                         tcs.SetResult(received);
475                     }
476                     fulfilled = true;
477                     return received;
478                 }
479         });
480         // Callback to be called when the token is cancelled.
481         token.Register(() => {
482                 lock (future)
483                 {
484                     // Will trigger the Then callback above with an Eina.Error
485                     if (!fulfilled)
486                         future.Cancel();
487                 }
488         });
489
490         return tcs.Task;
491     }
492 } // Globals
493
494 public static class Config
495 {
496     public static void Init()
497     {
498         Globals.efl_object_init();
499     }
500
501     public static void Shutdown()
502     {
503         Globals.efl_object_shutdown();
504     }
505 }
506
507 [System.AttributeUsage(System.AttributeTargets.Class |
508                        System.AttributeTargets.Interface,
509                        AllowMultiple = false,
510                        Inherited = true)
511 ]
512 public abstract class NativeClass : System.Attribute
513 {
514     public abstract IntPtr GetEflClass();
515     public abstract System.Collections.Generic.List<Efl_Op_Description> GetEoOps(System.Type type);
516 }
517
518 public interface IWrapper
519 {
520     /// <summary>Pointer to internal Eo instance.</summary>
521     IntPtr NativeHandle
522     {
523         get;
524     }
525     /// <summary>Pointer to internal Eo class.</summary>
526     IntPtr NativeClass
527     {
528         get;
529     }
530 }
531
532 public static class ClassRegister
533 {
534     public static System.Type GetManagedType(IntPtr klass)
535     {
536         System.Type t;
537         if (Efl.Eo.ClassRegister.typeFromKlass.TryGetValue(klass, out t))
538             return t;
539
540         // If it isn't on the dictionary then it is a Native binding class
541         IntPtr namePtr = Efl.Eo.Globals.efl_class_name_get(klass);
542         if (namePtr == IntPtr.Zero) {
543             throw new System.InvalidOperationException($"Could not get Native class name. Handle: {klass}");
544         }
545
546         string name = Eina.StringConversion.NativeUtf8ToManagedString(namePtr)
547                       .Replace("_", ""); // Convert Efl C name to C# name
548
549         var curr_asm = typeof(IWrapper).Assembly;
550         t = curr_asm.GetType(name);
551         if (t == null)
552         {
553             foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
554             {
555                 if (assembly == curr_asm)
556                     continue;
557
558                 t = assembly.GetType(name);
559                 if (t != null)
560                     break;
561             }
562             if (t == null) {
563                 throw new System.InvalidOperationException($"Could not find the C# binding class for the EFL class: {name}");
564             }
565         }
566         AddToKlassTypeBiDictionary(klass, t); // Cache it in the dictionary
567         return t;
568     }
569
570     public static IntPtr GetKlass(System.Type objectType)
571     {
572         IntPtr klass;
573         if (klassFromType.TryGetValue(objectType, out klass))
574             return klass;
575
576         // Check if it is a Native binding class
577         klass = GetNativeKlassPtr(objectType);
578         if (klass != IntPtr.Zero) {
579             // Add to the dictionary cache
580             AddToKlassTypeBiDictionary(klass, objectType);
581             return klass;
582         }
583
584         // Unregistered Inherited class, let's register it
585         IntPtr baseKlass = GetNativeBaseKlassPtr(objectType);
586         if (baseKlass == IntPtr.Zero)
587             throw new System.InvalidOperationException($"Could not get base C# binding class for Inherited type: {objectType.FullName}");
588         return RegisterKlass(baseKlass, objectType);
589     }
590
591     public static IntPtr GetInheritKlassOrRegister(IntPtr baseKlass, System.Type objectType)
592     {
593         IntPtr klass;
594         if (klassFromType.TryGetValue(objectType, out klass))
595             return klass;
596
597         return RegisterKlass(baseKlass, objectType);
598     }
599
600     private static IntPtr RegisterKlass(IntPtr baseKlass, System.Type objectType)
601     {
602         lock (klassAllocLock) {
603             IntPtr newKlass = Efl.Eo.Globals.register_class(objectType.FullName, baseKlass, objectType);
604             if (newKlass == IntPtr.Zero) {
605                 throw new System.InvalidOperationException($"Failed to register class '{objectType.FullName}'");
606             }
607             AddToKlassTypeBiDictionary(newKlass, objectType);
608             return newKlass;
609         }
610     }
611
612     private static IntPtr GetNativeBaseKlassPtr(System.Type objectType)
613     {
614         for (System.Type t = objectType.BaseType; t != null; t = t.BaseType)
615         {
616             var method = t.GetMethod("GetEflClassStatic",
617                                      System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
618             if (method != null)
619                 return (IntPtr) method.Invoke(null, null);
620         }
621         throw new System.InvalidOperationException($"Class '{objectType.FullName}' is not an Efl object");
622     }
623
624     private static IntPtr GetNativeKlassPtr(System.Type objectType)
625     {
626         var method = objectType.GetMethod("GetEflClassStatic",
627                                           System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
628         return (IntPtr) method?.Invoke(null, null);
629     }
630
631     public static void AddToKlassTypeBiDictionary(IntPtr klassPtr, System.Type objectType)
632     {
633         klassFromType[objectType] = klassPtr;
634         typeFromKlass[klassPtr] = objectType;
635     }
636
637     public static System.Collections.Concurrent.ConcurrentDictionary<System.Type, System.IntPtr> klassFromType
638         = new System.Collections.Concurrent.ConcurrentDictionary<System.Type, System.IntPtr>();
639
640     public static System.Collections.Concurrent.ConcurrentDictionary<System.IntPtr, System.Type> typeFromKlass
641         = new System.Collections.Concurrent.ConcurrentDictionary<System.IntPtr, System.Type>();
642
643     private static readonly object klassAllocLock = new object();
644 }
645
646 public interface IOwnershipTag
647 {
648 }
649
650 public class OwnTag : IOwnershipTag
651 {
652 }
653
654 public class NonOwnTag : IOwnershipTag
655 {
656 }
657
658 public class MarshalTest<T, U> : ICustomMarshaler
659     where U : IOwnershipTag
660 {
661     public static ICustomMarshaler GetInstance(string cookie)
662     {
663         Eina.Log.Debug("MarshalTest.GetInstace cookie " + cookie);
664         return new MarshalTest<T, U>();
665     }
666     public void CleanUpManagedData(object ManagedObj)
667     {
668         //Eina.Log.Warning("MarshalTest.CleanUpManagedData not implemented");
669         //throw new NotImplementedException();
670     }
671
672     public void CleanUpNativeData(IntPtr pNativeData)
673     {
674         //Eina.Log.Warning("MarshalTest.CleanUpNativeData not implemented");
675         //throw new NotImplementedException();
676     }
677
678     public int GetNativeDataSize()
679     {
680         Eina.Log.Debug("MarshalTest.GetNativeDataSize");
681         return 0;
682         //return 8;
683     }
684
685     public IntPtr MarshalManagedToNative(object ManagedObj)
686     {
687         Eina.Log.Debug("MarshalTest.MarshallManagedToNative");
688         var r = ((IWrapper)ManagedObj).NativeHandle;
689         if (typeof(U) == typeof(OwnTag))
690             Efl.Eo.Globals.efl_ref(r);
691         return r;
692     }
693
694     public object MarshalNativeToManaged(IntPtr pNativeData)
695     {
696         Eina.Log.Debug("MarshalTest.MarshalNativeToManaged");
697         if (typeof(U) != typeof(OwnTag))
698             Efl.Eo.Globals.efl_ref(pNativeData);
699         return Activator.CreateInstance(typeof(T), new System.Object[] {pNativeData});
700 //        return null;
701     }
702 }
703
704 ///<summary>Marshals between System.Type instances and Eo classes (IntPtrs).</summary>
705 public class MarshalEflClass : ICustomMarshaler
706 {
707     public static ICustomMarshaler GetInstance(string cookie)
708     {
709         Eina.Log.Debug("MarshalTest.GetInstance cookie " + cookie);
710         return new MarshalEflClass();
711     }
712     public void CleanUpManagedData(object ManagedObj)
713     {
714     }
715
716     public void CleanUpNativeData(IntPtr pNativeData)
717     {
718     }
719
720     public int GetNativeDataSize()
721     {
722         Eina.Log.Debug("MarshalTest.GetNativeDataSize");
723         return 0;
724     }
725
726     public IntPtr MarshalManagedToNative(object ManagedObj)
727     {
728         Eina.Log.Debug("MarshalTest.MarshallManagedToNative");
729         if (ManagedObj == null)
730             return IntPtr.Zero;
731         var t = (System.Type) ManagedObj;
732         return Efl.Eo.ClassRegister.GetKlass(t);
733     }
734
735     public object MarshalNativeToManaged(IntPtr pNativeData)
736     {
737         Eina.Log.Debug("MarshalTest.MarshalNativeToManaged");
738         if (pNativeData == IntPtr.Zero)
739             return null;
740         return Efl.Eo.ClassRegister.GetManagedType(pNativeData);
741     }
742 }
743
744 public class StringPassOwnershipMarshaler : ICustomMarshaler {
745     public object MarshalNativeToManaged(IntPtr pNativeData) {
746         var ret = Eina.StringConversion.NativeUtf8ToManagedString(pNativeData);
747         Eina.MemoryNative.Free(pNativeData);
748         return ret;
749     }
750
751     public IntPtr MarshalManagedToNative(object managedObj) {
752         return Eina.MemoryNative.StrDup((string)managedObj);
753     }
754
755     public void CleanUpNativeData(IntPtr pNativeData) {
756         // No need to cleanup. C will take care of it.
757     }
758
759     public void CleanUpManagedData(object managedObj) {
760     }
761
762     public int GetNativeDataSize() {
763         return -1;
764     }
765
766     public static ICustomMarshaler GetInstance(string cookie) {
767         if (marshaler == null) {
768             marshaler = new StringPassOwnershipMarshaler();
769         }
770         return marshaler;
771     }
772     static private StringPassOwnershipMarshaler marshaler;
773 }
774
775 public class StringKeepOwnershipMarshaler: ICustomMarshaler {
776     public object MarshalNativeToManaged(IntPtr pNativeData) {
777         return Eina.StringConversion.NativeUtf8ToManagedString(pNativeData);
778     }
779
780     public IntPtr MarshalManagedToNative(object managedObj) {
781         return Eina.StringConversion.ManagedStringToNativeUtf8Alloc((string)managedObj);
782     }
783
784     public void CleanUpNativeData(IntPtr pNativeData) {
785         // No need to free. The Native side will keep the ownership.
786     }
787
788     public void CleanUpManagedData(object managedObj) {
789     }
790
791     public int GetNativeDataSize() {
792         return -1;
793     }
794
795     public static ICustomMarshaler GetInstance(string cookie) {
796         if (marshaler == null) {
797             marshaler = new StringKeepOwnershipMarshaler();
798         }
799         return marshaler;
800     }
801     static private StringKeepOwnershipMarshaler marshaler;
802 }
803
804 public class StringsharePassOwnershipMarshaler : ICustomMarshaler {
805     public object MarshalNativeToManaged(IntPtr pNativeData) {
806         var ret = Eina.StringConversion.NativeUtf8ToManagedString(pNativeData);
807         Eina.Stringshare.eina_stringshare_del(pNativeData);
808         return ret;
809     }
810
811     public IntPtr MarshalManagedToNative(object managedObj) {
812         return Eina.Stringshare.eina_stringshare_add((string)managedObj);
813     }
814
815     public void CleanUpNativeData(IntPtr pNativeData) {
816         // No need to free as it's for own() parameters.
817     }
818
819     public void CleanUpManagedData(object managedObj) {
820     }
821
822     public int GetNativeDataSize() {
823         return -1;
824     }
825
826     public static ICustomMarshaler GetInstance(string cookie) {
827         if (marshaler == null) {
828             marshaler = new StringsharePassOwnershipMarshaler();
829         }
830         return marshaler;
831     }
832     static private StringsharePassOwnershipMarshaler marshaler;
833 }
834
835 public class StringshareKeepOwnershipMarshaler : ICustomMarshaler {
836     public object MarshalNativeToManaged(IntPtr pNativeData) {
837         return Eina.StringConversion.NativeUtf8ToManagedString(pNativeData);
838     }
839
840     public IntPtr MarshalManagedToNative(object managedObj) {
841         return Eina.Stringshare.eina_stringshare_add((string)managedObj);
842     }
843
844     public void CleanUpNativeData(IntPtr pNativeData) {
845         // No need to free, as the native side will keep ownership.
846     }
847
848     public void CleanUpManagedData(object managedObj) {
849     }
850
851     public int GetNativeDataSize() {
852         return -1;
853     }
854
855     public static ICustomMarshaler GetInstance(string cookie) {
856         if (marshaler == null) {
857             marshaler = new StringshareKeepOwnershipMarshaler();
858         }
859         return marshaler;
860     }
861     static private StringshareKeepOwnershipMarshaler marshaler;
862 }
863
864 public class StrbufPassOwnershipMarshaler : ICustomMarshaler {
865     public object MarshalNativeToManaged(IntPtr pNativeData) {
866         return new Eina.Strbuf(pNativeData, Eina.Ownership.Managed);
867     }
868
869     public IntPtr MarshalManagedToNative(object managedObj) {
870         Eina.Strbuf buf = managedObj as Eina.Strbuf;
871         buf.ReleaseOwnership();
872         return buf.Handle;
873     }
874
875     public void CleanUpNativeData(IntPtr pNativeData) {
876         // No need to cleanup. C will take care of it.
877     }
878
879     public void CleanUpManagedData(object managedObj) {
880     }
881
882     public int GetNativeDataSize() {
883         return -1;
884     }
885
886     public static ICustomMarshaler GetInstance(string cookie) {
887         if (marshaler == null) {
888             marshaler = new StrbufPassOwnershipMarshaler();
889         }
890         return marshaler;
891     }
892     static private StrbufPassOwnershipMarshaler marshaler;
893 }
894
895 public class StrbufKeepOwnershipMarshaler: ICustomMarshaler {
896     public object MarshalNativeToManaged(IntPtr pNativeData) {
897         return new Eina.Strbuf(pNativeData, Eina.Ownership.Unmanaged);
898     }
899
900     public IntPtr MarshalManagedToNative(object managedObj) {
901         Eina.Strbuf buf = managedObj as Eina.Strbuf;
902         return buf.Handle;
903     }
904
905     public void CleanUpNativeData(IntPtr pNativeData) {
906         // No need to free. The Native side will keep the ownership.
907     }
908
909     public void CleanUpManagedData(object managedObj) {
910     }
911
912     public int GetNativeDataSize() {
913         return -1;
914     }
915
916     public static ICustomMarshaler GetInstance(string cookie) {
917         if (marshaler == null) {
918             marshaler = new StrbufKeepOwnershipMarshaler();
919         }
920         return marshaler;
921     }
922     static private StrbufKeepOwnershipMarshaler marshaler;
923 }
924
925
926
927 } // namespace eo
928
929 /// <summary>General exception for errors inside the binding.</summary>
930 public class EflException : Exception
931 {
932     /// <summary>Create a new EflException with the given message.</summary>
933     public EflException(string message) : base(message)
934     {
935     }
936 }
937
938 /// <summary>Exception to be raised when a Task fails due to a failed Eina.Future.</summary>
939 public class FutureException : EflException
940 {
941     /// <summary>The error code returned by the failed Eina.Future.</summary>
942     public Eina.Error Error { get; private set; }
943
944     /// <summary>Construct a new exception from the Eina.Error stored in the given Eina.Value.</summary>
945     public FutureException(Eina.Value value) : base("Future failed.")
946     {
947         if (value.GetValueType() != Eina.ValueType.Error)
948             throw new ArgumentException("FutureException must receive an Eina.Value with Eina.Error.");
949         Eina.Error err;
950         value.Get(out err);
951         Error = err;
952     }
953 }
954
955 } // namespace efl