diff options
author | Joe Shaw <joeshaw@novell.com> | 2005-02-12 00:51:33 +0000 |
---|---|---|
committer | Joe Shaw <joeshaw@novell.com> | 2005-02-12 00:51:33 +0000 |
commit | 0242b82152e7d1bd529a2248e97a7db0c5b6e4be (patch) | |
tree | 733cf07dc3a854026262d4451e7f140e3be39853 /mono/Connection.cs | |
parent | 38dad64aced7360e43de5670c10d484caff3defe (diff) |
2005-02-11 Joe Shaw <joeshaw@novell.com>
* mono/Connection.cs: The unpredictability of finalizers in mono
prevents us from deterministically disconnecting the filters from
the Service class's finalizer, so move tracking of filters and
matches here. Add API for that.
* mono/Service.cs: Remove the code, add code which calls the
methods now on the Connection class.
Diffstat (limited to 'mono/Connection.cs')
-rw-r--r-- | mono/Connection.cs | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/mono/Connection.cs b/mono/Connection.cs index 2d98f646..699fee9e 100644 --- a/mono/Connection.cs +++ b/mono/Connection.cs @@ -8,6 +8,10 @@ namespace DBus using System.IO; using System.Collections; + public delegate int DBusHandleMessageFunction (IntPtr rawConnection, + IntPtr rawMessage, + IntPtr userData); + public class Connection { /// <summary> @@ -22,6 +26,9 @@ namespace DBus private int timeout = -1; + private ArrayList filters = new ArrayList (); // of DBusHandleMessageFunction + private ArrayList matches = new ArrayList (); // of string + internal Connection(IntPtr rawConnection) { RawConnection = rawConnection; @@ -56,6 +63,12 @@ namespace DBus { if (RawConnection != IntPtr.Zero) { + foreach (DBusHandleMessageFunction func in this.filters) + RemoveFilter (func); + + foreach (string match_rule in this.matches) + RemoveMatch (match_rule); + dbus_connection_disconnect(rawConnection); } RawConnection = IntPtr.Zero; // free the native object @@ -76,6 +89,38 @@ namespace DBus return new Connection(rawConnection); } + public void AddFilter (DBusHandleMessageFunction func) + { + if (!dbus_connection_add_filter (RawConnection, + func, + IntPtr.Zero, + IntPtr.Zero)) + throw new OutOfMemoryException (); + + this.filters.Add (func); + } + + public void RemoveFilter (DBusHandleMessageFunction func) + { + dbus_connection_remove_filter (RawConnection, func, IntPtr.Zero); + + this.filters.Remove (func); + } + + public void AddMatch (string match_rule) + { + dbus_bus_add_match (RawConnection, match_rule, IntPtr.Zero); + + this.matches.Add (match_rule); + } + + public void RemoveMatch (string match_rule) + { + dbus_bus_remove_match (RawConnection, match_rule, IntPtr.Zero); + + this.matches.Remove (match_rule); + } + public string UniqueName { get @@ -193,5 +238,26 @@ namespace DBus [DllImport ("dbus-1")] private extern static IntPtr dbus_bus_get_unique_name (IntPtr ptr); + + [DllImport("dbus-1")] + private extern static bool dbus_connection_add_filter(IntPtr rawConnection, + DBusHandleMessageFunction filter, + IntPtr userData, + IntPtr freeData); + + [DllImport("dbus-1")] + private extern static void dbus_connection_remove_filter(IntPtr rawConnection, + DBusHandleMessageFunction filter, + IntPtr userData); + + [DllImport("dbus-1")] + private extern static void dbus_bus_add_match(IntPtr rawConnection, + string rule, + IntPtr erro); + + [DllImport("dbus-1")] + private extern static void dbus_bus_remove_match(IntPtr rawConnection, + string rule, + IntPtr erro); } } |