4 using System.Runtime.InteropServices;
5 using System.Diagnostics;
9 private IntPtr rawServer;
12 /// The current slot number
14 private static int slot = -1;
16 private string address = null;
18 private Server(IntPtr rawServer)
20 RawServer = rawServer;
23 public Server(string address)
25 Error error = new Error();
27 RawServer = dbus_server_listen(address, ref error);
28 if (RawServer != IntPtr.Zero){
29 dbus_server_unref(RawServer);
31 throw new DBusException(error);
37 if (RawServer != IntPtr.Zero) {
38 dbus_server_unref(rawServer);
41 RawServer = IntPtr.Zero;
48 if (address == null) {
49 address = dbus_server_get_address(rawServer);
62 // We need to initialize the slot
63 if (!dbus_server_allocate_data_slot (ref slot))
64 throw new OutOfMemoryException ();
66 Debug.Assert (slot >= 0);
73 internal IntPtr RawServer
81 if (value == rawServer)
84 if (rawServer != IntPtr.Zero)
86 // Get the reference to this
87 IntPtr rawThis = dbus_server_get_data (rawServer, Slot);
88 Debug.Assert (rawThis != IntPtr.Zero);
90 // Blank over the reference
91 dbus_server_set_data (rawServer, Slot, IntPtr.Zero, IntPtr.Zero);
94 ((GCHandle) rawThis).Free();
96 // Unref the connection
97 dbus_server_unref(rawServer);
100 this.rawServer = value;
102 if (rawServer != IntPtr.Zero)
106 dbus_server_ref (rawServer);
108 // We store a weak reference to the C# object on the C object
109 rawThis = GCHandle.Alloc (this, GCHandleType.WeakTrackResurrection);
111 dbus_server_set_data(rawServer, Slot, (IntPtr) rawThis, IntPtr.Zero);
116 [DllImport ("dbus-1", EntryPoint="dbus_server_listen")]
117 private extern static IntPtr dbus_server_listen(string address, ref Error error);
119 [DllImport ("dbus-1", EntryPoint="dbus_server_unref")]
120 private extern static IntPtr dbus_server_unref(IntPtr rawServer);
122 [DllImport ("dbus-1", EntryPoint="dbus_server_ref")]
123 private extern static void dbus_server_ref(IntPtr rawServer);
125 [DllImport ("dbus-1", EntryPoint="dbus_server_disconnect")]
126 private extern static void dbus_server_disconnect(IntPtr rawServer);
128 [DllImport ("dbus-1", EntryPoint="dbus_server_get_address")]
129 private extern static string dbus_server_get_address(IntPtr rawServer);
131 [DllImport ("dbus-1", EntryPoint="dbus_server_set_data")]
132 private extern static bool dbus_server_set_data(IntPtr rawServer,
135 IntPtr freeDataFunc);
137 [DllImport ("dbus-1", EntryPoint="dbus_server_get_data")]
138 private extern static IntPtr dbus_server_get_data(IntPtr rawServer,
141 [DllImport ("dbus-1", EntryPoint="dbus_server_allocate_data_slot")]
142 private extern static bool dbus_server_allocate_data_slot (ref int slot);
144 [DllImport ("dbus-1", EntryPoint="dbus_server_free_data_slot")]
145 private extern static void dbus_server_free_data_slot (ref int slot);