* qt/Makfile.am:
[platform/upstream/dbus.git] / mono / Server.cs
1 namespace DBus
2 {
3   using System;
4   using System.Runtime.InteropServices;
5   using System.Diagnostics;
6   
7   public class Server
8   {
9     private IntPtr rawServer;
10     
11     /// <summary>
12     /// The current slot number
13     /// </summary>
14     private static int slot = -1;
15
16     private string address = null;
17     
18     private Server(IntPtr rawServer)
19     {
20       RawServer = rawServer;
21     }
22     
23     public Server(string address)
24     {
25       Error error = new Error();
26       error.Init();
27       RawServer = dbus_server_listen(address, ref error);
28       if (RawServer != IntPtr.Zero){
29         dbus_server_unref(RawServer);
30       } else {
31         throw new DBusException(error);
32       }
33     }
34     
35     ~Server()
36     {
37       if (RawServer != IntPtr.Zero) {
38         dbus_server_unref(rawServer);
39       }
40       
41       RawServer = IntPtr.Zero;
42     }
43     
44     public string Address 
45     {
46       get
47         {
48           if (address == null) {
49             address = dbus_server_get_address(rawServer);
50           }
51           
52           return address;
53         }
54     }
55
56     private int Slot
57     {
58       get 
59         {
60           if (slot == -1) 
61             {
62               // We need to initialize the slot
63               if (!dbus_server_allocate_data_slot (ref slot))
64                 throw new OutOfMemoryException ();
65               
66               Debug.Assert (slot >= 0);
67             }
68           
69           return slot;
70         }
71     }
72
73     internal IntPtr RawServer 
74     {
75       get 
76         {
77           return rawServer;
78         }
79       set 
80         {
81           if (value == rawServer)
82             return;
83           
84           if (rawServer != IntPtr.Zero) 
85             {
86               // Get the reference to this
87               IntPtr rawThis = dbus_server_get_data (rawServer, Slot);
88               Debug.Assert (rawThis != IntPtr.Zero);
89               
90               // Blank over the reference
91               dbus_server_set_data (rawServer, Slot, IntPtr.Zero, IntPtr.Zero);
92               
93               // Free the reference
94               ((GCHandle) rawThis).Free();
95               
96               // Unref the connection
97               dbus_server_unref(rawServer);
98             }
99           
100           this.rawServer = value;
101           
102           if (rawServer != IntPtr.Zero) 
103             {
104               GCHandle rawThis;
105               
106               dbus_server_ref (rawServer);
107               
108               // We store a weak reference to the C# object on the C object
109               rawThis = GCHandle.Alloc (this, GCHandleType.WeakTrackResurrection);
110               
111               dbus_server_set_data(rawServer, Slot, (IntPtr) rawThis, IntPtr.Zero);
112             }
113         }
114     }
115
116     [DllImport ("dbus-1", EntryPoint="dbus_server_listen")]
117     private extern static IntPtr dbus_server_listen(string address, ref Error error);
118
119     [DllImport ("dbus-1", EntryPoint="dbus_server_unref")]
120     private extern static IntPtr dbus_server_unref(IntPtr rawServer);
121
122     [DllImport ("dbus-1", EntryPoint="dbus_server_ref")]
123     private extern static void dbus_server_ref(IntPtr rawServer);
124
125     [DllImport ("dbus-1", EntryPoint="dbus_server_disconnect")]
126     private extern static void dbus_server_disconnect(IntPtr rawServer);
127
128     [DllImport ("dbus-1", EntryPoint="dbus_server_get_address")]
129     private extern static string dbus_server_get_address(IntPtr rawServer);
130
131     [DllImport ("dbus-1", EntryPoint="dbus_server_set_data")]
132     private extern static bool dbus_server_set_data(IntPtr rawServer,
133                                                     int slot,
134                                                     IntPtr data,
135                                                     IntPtr freeDataFunc);
136
137     [DllImport ("dbus-1", EntryPoint="dbus_server_get_data")]
138     private extern static IntPtr dbus_server_get_data(IntPtr rawServer,
139                                                       int slot);
140
141     [DllImport ("dbus-1", EntryPoint="dbus_server_allocate_data_slot")]
142     private extern static bool dbus_server_allocate_data_slot (ref int slot);
143     
144     [DllImport ("dbus-1", EntryPoint="dbus_server_free_data_slot")]
145     private extern static void dbus_server_free_data_slot (ref int slot);
146
147   }
148 }