4 using System.Runtime.InteropServices;
5 using System.Diagnostics;
6 using System.Collections;
7 using System.Threading;
8 using System.Reflection;
9 using System.Reflection.Emit;
13 private Connection connection;
15 private bool local = false;
16 private Hashtable registeredHandlers = new Hashtable();
17 private DBusHandleMessageFunction filterCalled;
18 public delegate void SignalCalledHandler(Signal signal);
19 public event SignalCalledHandler SignalCalled;
20 private static AssemblyBuilder proxyAssembly;
21 private ModuleBuilder module = null;
23 // Add a match for signals. FIXME: Can we filter the service?
24 private const string MatchRule = "type='signal'";
26 internal Service(string name, Connection connection)
29 this.connection = connection;
33 public Service(Connection connection, string name)
35 Error error = new Error();
38 // This isn't used for now
41 if (dbus_bus_request_name (connection.RawConnection, name, flags, ref error) == -1) {
42 throw new DBusException(error);
45 this.connection = connection;
50 public static bool HasOwner(Connection connection, string name)
52 Error error = new Error();
55 if (dbus_bus_name_has_owner(connection.RawConnection,
61 throw new DBusException(error);
67 public static Service Get(Connection connection, string name)
69 if (HasOwner(connection, name)) {
70 return new Service(name, connection);
72 throw new ApplicationException("Name '" + name + "' does not exist.");
76 public void UnregisterObject(object handledObject)
78 registeredHandlers.Remove(handledObject);
81 public void RegisterObject(object handledObject,
84 Handler handler = new Handler(handledObject, pathName, this);
85 registeredHandlers.Add(handledObject, handler);
88 internal Handler GetHandler(object handledObject)
90 if (!registeredHandlers.Contains(handledObject)) {
91 throw new ArgumentException("No handler registered for object: " + handledObject);
94 return (Handler) registeredHandlers[handledObject];
97 public object GetObject(Type type, string pathName)
99 ProxyBuilder builder = new ProxyBuilder(this, type, pathName);
100 object proxy = builder.GetProxy();
104 private void AddFilter()
106 // Setup the filter function
107 this.filterCalled = new DBusHandleMessageFunction(Service_FilterCalled);
108 Connection.AddFilter (this.filterCalled);
109 // Add a match for signals. FIXME: Can we filter the service?
110 Connection.AddMatch ("type='signal'");
113 private int Service_FilterCalled(IntPtr rawConnection,
117 Message message = Message.Wrap(rawMessage, this);
119 if (message.Type == Message.MessageType.Signal) {
120 // We're only interested in signals
121 Signal signal = (Signal) message;
122 if (SignalCalled != null) {
123 Message.Push (message);
124 SignalCalled(signal);
131 return (int) Result.NotYetHandled;
142 public Connection Connection
151 this.connection = value;
155 internal AssemblyBuilder ProxyAssembly
158 if (proxyAssembly == null){
159 AssemblyName assemblyName = new AssemblyName();
160 assemblyName.Name = "DBusProxy";
161 proxyAssembly = Thread.GetDomain().DefineDynamicAssembly(assemblyName,
162 AssemblyBuilderAccess.RunAndSave);
165 return proxyAssembly;
169 internal ModuleBuilder Module
172 if (this.module == null) {
173 this.module = ProxyAssembly.DefineDynamicModule(Name, Name + ".proxy.dll", true);
180 [DllImport("dbus-1")]
181 private extern static int dbus_bus_request_name(IntPtr rawConnection,
183 uint flags, ref Error error);
185 [DllImport("dbus-1")]
186 private extern static bool dbus_bus_name_has_owner(IntPtr rawConnection,