2 #pragma warning disable 1591
4 using System.Runtime.InteropServices;
6 using static eldbus.EldbusObjectNativeFunctions;
8 using IntPtr = System.IntPtr;
13 public static class EldbusObjectNativeFunctions
15 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
16 eldbus_object_get(IntPtr conn, string bus, string path);
18 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
19 eldbus_object_ref(IntPtr obj);
21 [DllImport(efl.Libs.Eldbus)] public static extern void
22 eldbus_object_unref(IntPtr obj);
24 [DllImport(efl.Libs.Eldbus)] public static extern void
25 eldbus_object_free_cb_add(IntPtr obj, IntPtr cb, IntPtr data);
27 [DllImport(efl.Libs.Eldbus)] public static extern void
28 eldbus_object_free_cb_del(IntPtr obj, IntPtr cb, IntPtr data);
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;
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);
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);
46 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
47 eldbus_object_connection_get(IntPtr obj);
49 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
50 eldbus_object_bus_name_get(IntPtr obj);
52 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
53 eldbus_object_path_get(IntPtr obj);
55 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
56 eldbus_object_send(IntPtr obj, IntPtr msg, IntPtr cb, IntPtr cb_data, double timeout);
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);
61 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
62 eldbus_object_method_call_new(IntPtr obj, string _interface, string member);
64 // FreeDesktop.Org Methods
66 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
67 eldbus_object_peer_ping(IntPtr obj, IntPtr cb, IntPtr data);
69 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
70 eldbus_object_peer_machine_id_get(IntPtr obj, IntPtr cb, IntPtr data);
72 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
73 eldbus_object_introspect(IntPtr obj, IntPtr cb, IntPtr data);
75 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
76 eldbus_object_managed_objects_get(IntPtr obj, IntPtr cb, IntPtr data);
78 // [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
79 // eldbus_object_manager_interfaces_added(IntPtr obj, Eldbus_Signal_Cb cb, IntPtr cb_data);
81 // [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
82 // eldbus_object_manager_interfaces_removed(IntPtr obj, Eldbus_Signal_Cb cb, IntPtr cb_data);
86 public class Object : System.IDisposable
89 public IntPtr Handle {get;set;} = IntPtr.Zero;
90 public bool Own {get;set;} = true;
92 private void InitNew(IntPtr handle, bool own)
99 private void CheckHandle()
101 if (Handle == IntPtr.Zero)
103 eldbus.Common.RaiseNullHandle();
107 public Object(IntPtr handle, bool own)
109 InitNew(handle, own);
112 public Object(eldbus.Connection conn, string bus, string path)
116 throw new System.ArgumentNullException("conn");
121 throw new System.ArgumentNullException("bus");
126 throw new System.ArgumentNullException("path");
129 var handle = eldbus_object_get(conn.Handle, bus, path);
131 if (handle == IntPtr.Zero)
133 throw new SEHException("Eldbus: could not get `Object' object from eldbus_object_get");
136 InitNew(handle, true);
144 protected virtual void Dispose(bool disposing)
147 Handle = IntPtr.Zero;
148 if (h == IntPtr.Zero)
155 eldbus_object_unref(h);
159 public void Dispose()
162 System.GC.SuppressFinalize(this);
170 public IntPtr Release()
173 Handle = IntPtr.Zero;
177 public eldbus.Connection GetConnection()
180 var conn = eldbus_object_connection_get(Handle);
182 if (conn == IntPtr.Zero)
184 throw new SEHException("Eldbus: could not get `Connection' object from eldbus_object_connection_get");
187 return new eldbus.Connection(conn, false);
190 public string GetBusName()
193 var ptr = eldbus_object_bus_name_get(Handle);
194 return Eina.StringConversion.NativeUtf8ToManagedString(ptr);
197 public string GetPath()
200 var ptr = eldbus_object_path_get(Handle);
201 return Eina.StringConversion.NativeUtf8ToManagedString(ptr);
207 eldbus_object_ref(Handle);
213 eldbus_object_unref(Handle);
216 public eldbus.Pending Send(eldbus.Message msg, eldbus.MessageDelegate dlgt = null, double timeout = -1)
222 throw new System.ArgumentNullException("msg");
225 IntPtr cb_wrapper = dlgt == null ? IntPtr.Zero : eldbus.Common.GetMessageCbWrapperPtr();
226 IntPtr cb_data = dlgt == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(dlgt);
228 var pending_hdl = eldbus_object_send(Handle, msg.Handle, cb_wrapper, cb_data, timeout);
230 if (pending_hdl == IntPtr.Zero)
232 throw new SEHException("Eldbus: could not get `Pending' object from eldbus_object_send");
235 return new eldbus.Pending(pending_hdl, false);
238 public eldbus.Message NewMethodCall(string _interface, string member)
242 var hdl = eldbus_object_method_call_new(Handle, _interface, member);
244 if (hdl == IntPtr.Zero)
246 throw new SEHException("Eldbus: could not get `Message' object from eldbus_object_method_call_new");
249 return new eldbus.Message(hdl, false);
252 public eldbus.Pending PeerPing(eldbus.MessageDelegate dlgt = null)
256 IntPtr cb_wrapper = dlgt == null ? IntPtr.Zero : eldbus.Common.GetMessageCbWrapperPtr();
257 IntPtr cb_data = dlgt == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(dlgt);
259 var pending_hdl = eldbus_object_peer_ping(Handle, cb_wrapper, cb_data);
261 if (pending_hdl == IntPtr.Zero)
263 throw new SEHException("Eldbus: could not get `Pending' object from eldbus_object_peer_ping");
266 return new eldbus.Pending(pending_hdl, false);
269 public eldbus.Pending GetPeerMachineId(eldbus.MessageDelegate dlgt = null)
273 IntPtr cb_wrapper = dlgt == null ? IntPtr.Zero : eldbus.Common.GetMessageCbWrapperPtr();
274 IntPtr cb_data = dlgt == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(dlgt);
276 var pending_hdl = eldbus_object_peer_machine_id_get(Handle, cb_wrapper, cb_data);
278 if (pending_hdl == IntPtr.Zero)
280 throw new SEHException("Eldbus: could not get `Pending' object from eldbus_object_peer_machine_id_get");
283 return new eldbus.Pending(pending_hdl, false);
286 public eldbus.Pending Introspect(eldbus.MessageDelegate dlgt = null)
290 IntPtr cb_wrapper = dlgt == null ? IntPtr.Zero : eldbus.Common.GetMessageCbWrapperPtr();
291 IntPtr cb_data = dlgt == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(dlgt);
293 var pending_hdl = eldbus_object_introspect(Handle, cb_wrapper, cb_data);
295 if (pending_hdl == IntPtr.Zero)
297 throw new SEHException("Eldbus: could not get `Pending' object from eldbus_object_introspect");
300 return new eldbus.Pending(pending_hdl, false);
303 public eldbus.Pending GetManagedObjects(eldbus.MessageDelegate dlgt = null)
307 IntPtr cb_wrapper = dlgt == null ? IntPtr.Zero : eldbus.Common.GetMessageCbWrapperPtr();
308 IntPtr cb_data = dlgt == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(dlgt);
310 var pending_hdl = eldbus_object_managed_objects_get(Handle, cb_wrapper, cb_data);
312 if (pending_hdl == IntPtr.Zero)
314 throw new SEHException("Eldbus: could not get `Pending' object from eldbus_object_managed_objects_get");
317 return new eldbus.Pending(pending_hdl, false);