summaryrefslogtreecommitdiffstats
path: root/mono/Server.cs
diff options
context:
space:
mode:
authorOwen Fraser-Green <owen@discobabe.net>2004-03-23 12:10:32 +0000
committerOwen Fraser-Green <owen@discobabe.net>2004-03-23 12:10:32 +0000
commitc916037773d7d3d8d37ca2c5a8899b7b728e377d (patch)
tree21c37372ab9795583e724e8459578b7fe0be330b /mono/Server.cs
parent2195cf0dbde2ae26b5a684c6d914c1711f44c28d (diff)
First checkin of the Mono bindings.
Diffstat (limited to 'mono/Server.cs')
-rw-r--r--mono/Server.cs148
1 files changed, 148 insertions, 0 deletions
diff --git a/mono/Server.cs b/mono/Server.cs
new file mode 100644
index 00000000..e39b7ca2
--- /dev/null
+++ b/mono/Server.cs
@@ -0,0 +1,148 @@
+namespace DBus
+{
+ using System;
+ using System.Runtime.InteropServices;
+ using System.Diagnostics;
+
+ public class Server
+ {
+ private IntPtr rawServer;
+
+ /// <summary>
+ /// The current slot number
+ /// </summary>
+ private static int slot = -1;
+
+ private string address = null;
+
+ private Server(IntPtr rawServer)
+ {
+ RawServer = rawServer;
+ }
+
+ public Server(string address)
+ {
+ Error error = new Error();
+ error.Init();
+ RawServer = dbus_server_listen(address, ref error);
+ if (RawServer != IntPtr.Zero){
+ dbus_server_unref(RawServer);
+ } else {
+ throw new DBusException(error);
+ }
+ }
+
+ ~Server()
+ {
+ if (RawServer != IntPtr.Zero) {
+ dbus_server_unref(rawServer);
+ }
+
+ RawServer = IntPtr.Zero;
+ }
+
+ public string Address
+ {
+ get
+ {
+ if (address == null) {
+ address = dbus_server_get_address(rawServer);
+ }
+
+ return address;
+ }
+ }
+
+ private int Slot
+ {
+ get
+ {
+ if (slot == -1)
+ {
+ // We need to initialize the slot
+ if (!dbus_server_allocate_data_slot (ref slot))
+ throw new OutOfMemoryException ();
+
+ Debug.Assert (slot >= 0);
+ }
+
+ return slot;
+ }
+ }
+
+ internal IntPtr RawServer
+ {
+ get
+ {
+ return rawServer;
+ }
+ set
+ {
+ if (value == rawServer)
+ return;
+
+ if (rawServer != IntPtr.Zero)
+ {
+ // Get the reference to this
+ IntPtr rawThis = dbus_server_get_data (rawServer, Slot);
+ Debug.Assert (rawThis != IntPtr.Zero);
+
+ // Blank over the reference
+ dbus_server_set_data (rawServer, Slot, IntPtr.Zero, IntPtr.Zero);
+
+ // Free the reference
+ ((GCHandle) rawThis).Free();
+
+ // Unref the connection
+ dbus_server_unref(rawServer);
+ }
+
+ this.rawServer = value;
+
+ if (rawServer != IntPtr.Zero)
+ {
+ GCHandle rawThis;
+
+ dbus_server_ref (rawServer);
+
+ // We store a weak reference to the C# object on the C object
+ rawThis = GCHandle.Alloc (this, GCHandleType.WeakTrackResurrection);
+
+ dbus_server_set_data(rawServer, Slot, (IntPtr) rawThis, IntPtr.Zero);
+ }
+ }
+ }
+
+ [DllImport ("dbus-1", EntryPoint="dbus_server_listen")]
+ private extern static IntPtr dbus_server_listen(string address, ref Error error);
+
+ [DllImport ("dbus-1", EntryPoint="dbus_server_unref")]
+ private extern static IntPtr dbus_server_unref(IntPtr rawServer);
+
+ [DllImport ("dbus-1", EntryPoint="dbus_server_ref")]
+ private extern static void dbus_server_ref(IntPtr rawServer);
+
+ [DllImport ("dbus-1", EntryPoint="dbus_server_disconnect")]
+ private extern static void dbus_server_disconnect(IntPtr rawServer);
+
+ [DllImport ("dbus-1", EntryPoint="dbus_server_get_address")]
+ private extern static string dbus_server_get_address(IntPtr rawServer);
+
+ [DllImport ("dbus-1", EntryPoint="dbus_server_set_data")]
+ private extern static bool dbus_server_set_data(IntPtr rawServer,
+ int slot,
+ IntPtr data,
+ IntPtr freeDataFunc);
+
+ [DllImport ("dbus-1", EntryPoint="dbus_server_get_data")]
+ private extern static IntPtr dbus_server_get_data(IntPtr rawServer,
+ int slot);
+
+ [DllImport ("dbus-1", EntryPoint="dbus_server_allocate_data_slot")]
+ private extern static bool dbus_server_allocate_data_slot (ref int slot);
+
+ [DllImport ("dbus-1", EntryPoint="dbus_server_free_data_slot")]
+ private extern static void dbus_server_free_data_slot (ref int slot);
+
+ }
+}