1 #pragma warning disable 1591
4 using System.Runtime.InteropServices;
6 using static eldbus.EldbusProxyNativeFunctions;
11 public static class EldbusProxyNativeFunctions
13 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
14 eldbus_proxy_get(IntPtr obj, string _interface);
16 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
17 eldbus_proxy_ref(IntPtr proxy);
19 [DllImport(efl.Libs.Eldbus)] public static extern void
20 eldbus_proxy_unref(IntPtr proxy);
22 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
23 eldbus_proxy_object_get(IntPtr proxy);
25 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
26 eldbus_proxy_interface_get(IntPtr proxy);
28 [DllImport(efl.Libs.Eldbus)] public static extern void
29 eldbus_proxy_data_set(IntPtr proxy, string key, IntPtr data);
31 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
32 eldbus_proxy_data_get(IntPtr proxy, string key);
34 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
35 eldbus_proxy_data_del(IntPtr proxy, string key);
37 [DllImport(efl.Libs.Eldbus)] public static extern void
38 eldbus_proxy_free_cb_add(IntPtr proxy, IntPtr cb, IntPtr data);
40 [DllImport(efl.Libs.Eldbus)] public static extern void
41 eldbus_proxy_free_cb_del(IntPtr proxy, IntPtr cb, IntPtr data);
43 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
44 eldbus_proxy_method_call_new(IntPtr proxy, string member);
46 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
47 eldbus_proxy_send(IntPtr proxy, IntPtr msg, IntPtr cb, IntPtr cb_data, double timeout);
49 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
50 eldbus_proxy_send_and_block(IntPtr proxy, IntPtr msg, double timeout);
52 // [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
53 // eldbus_proxy_call(IntPtr proxy, string member, IntPtr cb, IntPtr cb_data, double timeout, string signature, ...);
55 // [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
56 // eldbus_proxy_vcall(IntPtr proxy, string member, IntPtr cb, IntPtr cb_data, double timeout, string signature, va_list ap);
58 [DllImport(efl.Libs.Eldbus)] public static extern IntPtr
59 eldbus_proxy_signal_handler_add(IntPtr proxy, string member, IntPtr cb, IntPtr cb_data);
61 [DllImport(efl.Libs.Eldbus)] public static extern void
62 eldbus_proxy_event_callback_add(IntPtr proxy, int type, IntPtr cb, IntPtr cb_data);
64 [DllImport(efl.Libs.Eldbus)] public static extern void
65 eldbus_proxy_event_callback_del(IntPtr proxy, int type, IntPtr cb, IntPtr cb_data);
68 public class Proxy : IDisposable
70 public IntPtr Handle {get;set;} = IntPtr.Zero;
71 public bool Own {get;set;} = true;
73 private void InitNew(IntPtr handle, bool own)
80 private void CheckHandle()
82 if (Handle == IntPtr.Zero)
84 eldbus.Common.RaiseNullHandle();
88 public Proxy(IntPtr handle, bool own)
93 public Proxy(eldbus.Object obj, string _interface)
95 InitNew(eldbus_proxy_get(obj.Handle, _interface), true);
103 protected virtual void Dispose(bool disposing)
106 Handle = IntPtr.Zero;
107 if (h == IntPtr.Zero)
116 eldbus_proxy_unref(h);
120 Efl.Eo.Globals.ThreadSafeFreeCbExec(eldbus_proxy_unref, h);
125 public void Dispose()
128 GC.SuppressFinalize(this);
136 public IntPtr Release()
139 Handle = IntPtr.Zero;
143 eldbus.Object GetObject()
146 var ptr = eldbus_proxy_object_get(Handle);
147 if (ptr == IntPtr.Zero)
149 throw new SEHException("Eldbus: could not get `Object' object from eldbus_proxy_object_get");
152 return new eldbus.Object(ptr, false);
155 string GetInterface()
158 var ptr = eldbus_proxy_interface_get(Handle);
159 return Eina.StringConversion.NativeUtf8ToManagedString(ptr);
162 eldbus.Message NewMethodCall(string member)
168 throw new ArgumentNullException("member");
171 var ptr = eldbus_proxy_method_call_new(Handle, member);
172 if (ptr == IntPtr.Zero)
174 throw new SEHException("Eldbus: could not get `Message' object from eldbus_proxy_method_call_new");
177 return new eldbus.Message(ptr, false);
180 eldbus.Pending Send(eldbus.Message msg, eldbus.MessageDelegate dlgt = null, double timeout = -1)
186 throw new ArgumentNullException("msg");
189 IntPtr cb_wrapper = dlgt == null ? IntPtr.Zero : eldbus.Common.GetMessageCbWrapperPtr();
190 IntPtr cb_data = dlgt == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(dlgt);
192 var pending_hdl = eldbus_proxy_send(Handle, msg.Handle, cb_wrapper, cb_data, timeout);
194 if (pending_hdl == IntPtr.Zero)
196 throw new SEHException("Eldbus: could not get `Pending' object from eldbus_proxy_send");
199 return new eldbus.Pending(pending_hdl, false);
202 eldbus.Message SendAndBlock(eldbus.Message msg, double timeout = -1)
205 var ptr = eldbus_proxy_send_and_block(Handle, msg.Handle, timeout);
206 if (ptr == IntPtr.Zero)
208 throw new SEHException("Eldbus: could not get `Message' object from eldbus_proxy_send_and_block");
211 return new eldbus.Message(ptr, true);
214 eldbus.Pending Call(string member, eldbus.MessageDelegate dlgt, double timeout, params BasicMessageArgument[] args)
218 var msg = NewMethodCall(member);
220 foreach (BasicMessageArgument arg in args)
225 return Send(msg, dlgt, timeout);
228 eldbus.Pending Call(string member, params BasicMessageArgument[] args)
230 return Call(member, null, -1.0, args);