+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.
+
2005-02-11 John (J5) Palmieri <johnp@redhat.com>
* python/dbus.py (class Sender): added to support dbus signals better
using System.IO;
using System.Collections;
+ public delegate int DBusHandleMessageFunction (IntPtr rawConnection,
+ IntPtr rawMessage,
+ IntPtr userData);
+
public class Connection
{
/// <summary>
private int timeout = -1;
+ private ArrayList filters = new ArrayList (); // of DBusHandleMessageFunction
+ private ArrayList matches = new ArrayList (); // of string
+
internal Connection(IntPtr rawConnection)
{
RawConnection = rawConnection;
{
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
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
[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);
}
}
private string name;
private bool local = false;
private Hashtable registeredHandlers = new Hashtable();
- private delegate int DBusHandleMessageFunction(IntPtr rawConnection,
- IntPtr rawMessage,
- IntPtr userData);
private DBusHandleMessageFunction filterCalled;
public delegate void SignalCalledHandler(Signal signal);
public event SignalCalledHandler SignalCalled;
this.local = true;
}
- ~Service ()
- {
- if (this.filterCalled != null)
- RemoveFilter ();
- }
-
public static bool HasOwner(Connection connection, string name)
{
Error error = new Error();
{
// Setup the filter function
this.filterCalled = new DBusHandleMessageFunction(Service_FilterCalled);
- if (!dbus_connection_add_filter(Connection.RawConnection,
- this.filterCalled,
- IntPtr.Zero,
- IntPtr.Zero))
- throw new OutOfMemoryException();
-
- dbus_bus_add_match(connection.RawConnection, MatchRule, IntPtr.Zero);
- }
-
- private void RemoveFilter()
- {
- dbus_connection_remove_filter (Connection.RawConnection,
- this.filterCalled,
- IntPtr.Zero);
- this.filterCalled = null;
-
- dbus_bus_remove_match (connection.RawConnection, MatchRule, IntPtr.Zero);
+ Connection.AddFilter (this.filterCalled);
+ // Add a match for signals. FIXME: Can we filter the service?
+ Connection.AddMatch ("type='signal'");
}
private int Service_FilterCalled(IntPtr rawConnection,
string serviceName,
ref Error error);
- [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);
-
}
}