00001 namespace DBus
00002 {
00003 using System;
00004 using System.Runtime.InteropServices;
00005 using System.Diagnostics;
00006
00007 public class Server
00008 {
00009 private IntPtr rawServer;
00010
00014 private static int slot = -1;
00015
00016 private string address = null;
00017
00018 private Server(IntPtr rawServer)
00019 {
00020 RawServer = rawServer;
00021 }
00022
00023 public Server(string address)
00024 {
00025 Error error = new Error();
00026 error.Init();
00027 RawServer = dbus_server_listen(address, ref error);
00028 if (RawServer != IntPtr.Zero){
00029 dbus_server_unref(RawServer);
00030 } else {
00031 throw new DBusException(error);
00032 }
00033 }
00034
00035 ~Server()
00036 {
00037 if (RawServer != IntPtr.Zero) {
00038 dbus_server_unref(rawServer);
00039 }
00040
00041 RawServer = IntPtr.Zero;
00042 }
00043
00044 public string Address
00045 {
00046 get
00047 {
00048 if (address == null) {
00049 address = dbus_server_get_address(rawServer);
00050 }
00051
00052 return address;
00053 }
00054 }
00055
00056 private int Slot
00057 {
00058 get
00059 {
00060 if (slot == -1)
00061 {
00062
00063 if (!dbus_server_allocate_data_slot (ref slot))
00064 throw new OutOfMemoryException ();
00065
00066 Debug.Assert (slot >= 0);
00067 }
00068
00069 return slot;
00070 }
00071 }
00072
00073 internal IntPtr RawServer
00074 {
00075 get
00076 {
00077 return rawServer;
00078 }
00079 set
00080 {
00081 if (value == rawServer)
00082 return;
00083
00084 if (rawServer != IntPtr.Zero)
00085 {
00086
00087 IntPtr rawThis = dbus_server_get_data (rawServer, Slot);
00088 Debug.Assert (rawThis != IntPtr.Zero);
00089
00090
00091 dbus_server_set_data (rawServer, Slot, IntPtr.Zero, IntPtr.Zero);
00092
00093
00094 ((GCHandle) rawThis).Free();
00095
00096
00097 dbus_server_unref(rawServer);
00098 }
00099
00100 this.rawServer = value;
00101
00102 if (rawServer != IntPtr.Zero)
00103 {
00104 GCHandle rawThis;
00105
00106 dbus_server_ref (rawServer);
00107
00108
00109 rawThis = GCHandle.Alloc (this, GCHandleType.WeakTrackResurrection);
00110
00111 dbus_server_set_data(rawServer, Slot, (IntPtr) rawThis, IntPtr.Zero);
00112 }
00113 }
00114 }
00115
00116 [DllImport ("dbus-1", EntryPoint="dbus_server_listen")]
00117 private extern static IntPtr dbus_server_listen(string address, ref Error error);
00118
00119 [DllImport ("dbus-1", EntryPoint="dbus_server_unref")]
00120 private extern static IntPtr dbus_server_unref(IntPtr rawServer);
00121
00122 [DllImport ("dbus-1", EntryPoint="dbus_server_ref")]
00123 private extern static void dbus_server_ref(IntPtr rawServer);
00124
00125 [DllImport ("dbus-1", EntryPoint="dbus_server_disconnect")]
00126 private extern static void dbus_server_disconnect(IntPtr rawServer);
00127
00128 [DllImport ("dbus-1", EntryPoint="dbus_server_get_address")]
00129 private extern static string dbus_server_get_address(IntPtr rawServer);
00130
00131 [DllImport ("dbus-1", EntryPoint="dbus_server_set_data")]
00132 private extern static bool dbus_server_set_data(IntPtr rawServer,
00133 int slot,
00134 IntPtr data,
00135 IntPtr freeDataFunc);
00136
00137 [DllImport ("dbus-1", EntryPoint="dbus_server_get_data")]
00138 private extern static IntPtr dbus_server_get_data(IntPtr rawServer,
00139 int slot);
00140
00141 [DllImport ("dbus-1", EntryPoint="dbus_server_allocate_data_slot")]
00142 private extern static bool dbus_server_allocate_data_slot (ref int slot);
00143
00144 [DllImport ("dbus-1", EntryPoint="dbus_server_free_data_slot")]
00145 private extern static void dbus_server_free_data_slot (ref int slot);
00146
00147 }
00148 }