Main Page | Modules | Namespace List | Class Hierarchy | Data Structures | Directories | File List | Namespace Members | Data Fields | Related Pages

Server.cs

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               // We need to initialize the slot
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               // Get the reference to this
00087               IntPtr rawThis = dbus_server_get_data (rawServer, Slot);
00088               Debug.Assert (rawThis != IntPtr.Zero);
00089               
00090               // Blank over the reference
00091               dbus_server_set_data (rawServer, Slot, IntPtr.Zero, IntPtr.Zero);
00092               
00093               // Free the reference
00094               ((GCHandle) rawThis).Free();
00095               
00096               // Unref the connection
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               // We store a weak reference to the C# object on the C object
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 }

Generated on Tue Sep 13 01:28:08 2005 for D-BUS by  doxygen 1.4.4