[Bluetooth][Non-ACR] Fix no data exception issue (#787)
[platform/core/csapi/tizenfx.git] / internals / src / EflSharp / EflSharp / efl / eldbus_object.cs
1
2 #pragma warning disable 1591
3
4 using System.Runtime.InteropServices;
5
6 using static eldbus.EldbusObjectNativeFunctions;
7
8 using IntPtr = System.IntPtr;
9
10 namespace eldbus
11 {
12
13 public static class EldbusObjectNativeFunctions
14 {
15     [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
16         eldbus_object_get(IntPtr conn, string bus, string path);
17
18     [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
19         eldbus_object_ref(IntPtr obj);
20
21     [DllImport(efl.Libs.Eldbus)] public static extern void
22         eldbus_object_unref(IntPtr obj);
23
24     [DllImport(efl.Libs.Eldbus)] public static extern void
25         eldbus_object_free_cb_add(IntPtr obj, IntPtr cb, IntPtr data);
26
27     [DllImport(efl.Libs.Eldbus)] public static extern void
28         eldbus_object_free_cb_del(IntPtr obj, IntPtr cb, IntPtr data);
29
30 // typedef enum
31 // {
32 //    ELDBUS_OBJECT_EVENT_IFACE_ADDED = 0, /**< a parent path must have a ObjectManager interface */
33 //    ELDBUS_OBJECT_EVENT_IFACE_REMOVED, /**< a parent path must have a ObjectManager interface */
34 //    ELDBUS_OBJECT_EVENT_PROPERTY_CHANGED, /**< a property has changes */
35 //    ELDBUS_OBJECT_EVENT_PROPERTY_REMOVED, /**< a property was removed */
36 //    ELDBUS_OBJECT_EVENT_DEL,
37 //    ELDBUS_OBJECT_EVENT_LAST    /**< sentinel, not a real event type */
38 // } Eldbus_Object_Event_Type;
39 //
40 //     [DllImport(efl.Libs.Eldbus)] public static extern void
41 //         eldbus_object_event_callback_add(IntPtr obj, Eldbus_Object_Event_Type type, IntPtr cb, IntPtr cb_data);
42 //
43 //     [DllImport(efl.Libs.Eldbus)] public static extern void
44 //         eldbus_object_event_callback_del(IntPtr obj, Eldbus_Object_Event_Type type, IntPtr cb, IntPtr cb_data);
45
46     [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
47         eldbus_object_connection_get(IntPtr obj);
48
49     [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
50         eldbus_object_bus_name_get(IntPtr obj);
51
52     [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
53         eldbus_object_path_get(IntPtr obj);
54
55     [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
56         eldbus_object_send(IntPtr obj, IntPtr msg, IntPtr cb, IntPtr cb_data, double timeout);
57
58     [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
59         eldbus_object_signal_handler_add(IntPtr obj, string _interface, string member, IntPtr cb, IntPtr cb_data);
60
61     [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
62         eldbus_object_method_call_new(IntPtr obj, string _interface, string member);
63
64     // FreeDesktop.Org Methods
65
66     [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
67         eldbus_object_peer_ping(IntPtr obj, IntPtr cb, IntPtr data);
68
69     [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
70         eldbus_object_peer_machine_id_get(IntPtr obj, IntPtr cb, IntPtr data);
71
72     [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
73         eldbus_object_introspect(IntPtr obj, IntPtr cb, IntPtr data);
74
75     [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
76         eldbus_object_managed_objects_get(IntPtr obj, IntPtr cb, IntPtr data);
77
78 //     [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
79 //         eldbus_object_manager_interfaces_added(IntPtr obj, Eldbus_Signal_Cb cb, IntPtr cb_data);
80 //
81 //     [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
82 //         eldbus_object_manager_interfaces_removed(IntPtr obj, Eldbus_Signal_Cb cb, IntPtr cb_data);
83 }
84
85
86 public class Object : System.IDisposable
87 {
88
89     public IntPtr Handle {get;set;} = IntPtr.Zero;
90     public bool Own {get;set;} = true;
91
92     private void InitNew(IntPtr handle, bool own)
93     {
94         Handle = handle;
95         Own = own;
96         CheckHandle();
97     }
98
99     private void CheckHandle()
100     {
101         if (Handle == IntPtr.Zero)
102         {
103             eldbus.Common.RaiseNullHandle();
104         }
105     }
106
107     public Object(IntPtr handle, bool own)
108     {
109         InitNew(handle, own);
110     }
111
112     public Object(eldbus.Connection conn, string bus, string path)
113     {
114         if (conn == null)
115         {
116             throw new System.ArgumentNullException("conn");
117         }
118
119         if (bus == null)
120         {
121             throw new System.ArgumentNullException("bus");
122         }
123
124         if (path == null)
125         {
126             throw new System.ArgumentNullException("path");
127         }
128
129         var handle = eldbus_object_get(conn.Handle, bus, path);
130
131         if (handle == IntPtr.Zero)
132         {
133             throw new SEHException("Eldbus: could not get `Object' object from eldbus_object_get");
134         }
135
136         InitNew(handle, true);
137     }
138
139     ~Object()
140     {
141         Dispose(false);
142     }
143
144     protected virtual void Dispose(bool disposing)
145     {
146         IntPtr h = Handle;
147         Handle = IntPtr.Zero;
148         if (h == IntPtr.Zero)
149         {
150             return;
151         }
152
153         if (Own)
154         {
155             eldbus_object_unref(h);
156         }
157     }
158
159     public void Dispose()
160     {
161         Dispose(true);
162         System.GC.SuppressFinalize(this);
163     }
164
165     public void Free()
166     {
167         Dispose();
168     }
169
170     public IntPtr Release()
171     {
172         IntPtr h = Handle;
173         Handle = IntPtr.Zero;
174         return h;
175     }
176
177     public eldbus.Connection GetConnection()
178     {
179         CheckHandle();
180         var conn = eldbus_object_connection_get(Handle);
181
182         if (conn == IntPtr.Zero)
183         {
184             throw new SEHException("Eldbus: could not get `Connection' object from eldbus_object_connection_get");
185         }
186
187         return new eldbus.Connection(conn, false);
188     }
189
190     public string GetBusName()
191     {
192         CheckHandle();
193         var ptr = eldbus_object_bus_name_get(Handle);
194         return Eina.StringConversion.NativeUtf8ToManagedString(ptr);
195     }
196
197     public string GetPath()
198     {
199         CheckHandle();
200         var ptr = eldbus_object_path_get(Handle);
201         return Eina.StringConversion.NativeUtf8ToManagedString(ptr);
202     }
203
204     public void Ref()
205     {
206         CheckHandle();
207         eldbus_object_ref(Handle);
208     }
209
210     public void Unref()
211     {
212         CheckHandle();
213         eldbus_object_unref(Handle);
214     }
215
216     public eldbus.Pending Send(eldbus.Message msg, eldbus.MessageDelegate dlgt = null, double timeout = -1)
217     {
218         CheckHandle();
219
220         if (msg == null)
221         {
222             throw new System.ArgumentNullException("msg");
223         }
224
225         IntPtr cb_wrapper = dlgt == null ? IntPtr.Zero : eldbus.Common.GetMessageCbWrapperPtr();
226         IntPtr cb_data = dlgt == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(dlgt);
227
228         var pending_hdl = eldbus_object_send(Handle, msg.Handle, cb_wrapper, cb_data, timeout);
229
230         if (pending_hdl == IntPtr.Zero)
231         {
232             throw new SEHException("Eldbus: could not get `Pending' object from eldbus_object_send");
233         }
234
235         return new eldbus.Pending(pending_hdl, false);
236     }
237
238     public eldbus.Message NewMethodCall(string _interface, string member)
239     {
240         CheckHandle();
241
242         var hdl = eldbus_object_method_call_new(Handle, _interface, member);
243
244         if (hdl == IntPtr.Zero)
245         {
246             throw new SEHException("Eldbus: could not get `Message' object from eldbus_object_method_call_new");
247         }
248
249         return new eldbus.Message(hdl, false);
250     }
251
252     public eldbus.Pending PeerPing(eldbus.MessageDelegate dlgt = null)
253     {
254         CheckHandle();
255
256         IntPtr cb_wrapper = dlgt == null ? IntPtr.Zero : eldbus.Common.GetMessageCbWrapperPtr();
257         IntPtr cb_data = dlgt == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(dlgt);
258
259         var pending_hdl = eldbus_object_peer_ping(Handle, cb_wrapper, cb_data);
260
261         if (pending_hdl == IntPtr.Zero)
262         {
263             throw new SEHException("Eldbus: could not get `Pending' object from eldbus_object_peer_ping");
264         }
265
266         return new eldbus.Pending(pending_hdl, false);
267     }
268
269     public eldbus.Pending GetPeerMachineId(eldbus.MessageDelegate dlgt = null)
270     {
271         CheckHandle();
272
273         IntPtr cb_wrapper = dlgt == null ? IntPtr.Zero : eldbus.Common.GetMessageCbWrapperPtr();
274         IntPtr cb_data = dlgt == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(dlgt);
275
276         var pending_hdl = eldbus_object_peer_machine_id_get(Handle, cb_wrapper, cb_data);
277
278         if (pending_hdl == IntPtr.Zero)
279         {
280             throw new SEHException("Eldbus: could not get `Pending' object from eldbus_object_peer_machine_id_get");
281         }
282
283         return new eldbus.Pending(pending_hdl, false);
284     }
285
286     public eldbus.Pending Introspect(eldbus.MessageDelegate dlgt = null)
287     {
288         CheckHandle();
289
290         IntPtr cb_wrapper = dlgt == null ? IntPtr.Zero : eldbus.Common.GetMessageCbWrapperPtr();
291         IntPtr cb_data = dlgt == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(dlgt);
292
293         var pending_hdl = eldbus_object_introspect(Handle, cb_wrapper, cb_data);
294
295         if (pending_hdl == IntPtr.Zero)
296         {
297             throw new SEHException("Eldbus: could not get `Pending' object from eldbus_object_introspect");
298         }
299
300         return new eldbus.Pending(pending_hdl, false);
301     }
302
303     public eldbus.Pending GetManagedObjects(eldbus.MessageDelegate dlgt = null)
304     {
305         CheckHandle();
306
307         IntPtr cb_wrapper = dlgt == null ? IntPtr.Zero : eldbus.Common.GetMessageCbWrapperPtr();
308         IntPtr cb_data = dlgt == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(dlgt);
309
310         var pending_hdl = eldbus_object_managed_objects_get(Handle, cb_wrapper, cb_data);
311
312         if (pending_hdl == IntPtr.Zero)
313         {
314             throw new SEHException("Eldbus: could not get `Pending' object from eldbus_object_managed_objects_get");
315         }
316
317         return new eldbus.Pending(pending_hdl, false);
318     }
319 }
320
321 }