summaryrefslogtreecommitdiff
path: root/src/devices/bluetooth/nm-bluez-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bluetooth/nm-bluez-manager.c')
-rw-r--r--src/devices/bluetooth/nm-bluez-manager.c59
1 files changed, 46 insertions, 13 deletions
diff --git a/src/devices/bluetooth/nm-bluez-manager.c b/src/devices/bluetooth/nm-bluez-manager.c
index ef087d83e9..1c494a11d7 100644
--- a/src/devices/bluetooth/nm-bluez-manager.c
+++ b/src/devices/bluetooth/nm-bluez-manager.c
@@ -2071,9 +2071,12 @@ _dbus_handle_interface_removed (NMBluezManager *self,
}
static void
-_dbus_managed_objects_changed_cb (const char *object_path,
- GVariant *added_interfaces_and_properties,
- const char *const*removed_interfaces,
+_dbus_managed_objects_changed_cb (GDBusConnection *connection,
+ const char *sender_name,
+ const char *arg_object_path,
+ const char *interface_name,
+ const char *signal_name,
+ GVariant *parameters,
gpointer user_data)
{
NMBluezManager *self = user_data;
@@ -2081,17 +2084,46 @@ _dbus_managed_objects_changed_cb (const char *object_path,
BzDBusObj *bzobj = NULL;
gboolean changed;
+ nm_assert (nm_streq0 (interface_name, DBUS_INTERFACE_OBJECT_MANAGER));
+
if (priv->get_managed_objects_cancellable) {
/* we still wait for the initial GetManagedObjects(). Ignore the event. */
return;
}
- if (!added_interfaces_and_properties) {
- changed = _dbus_handle_interface_removed (self, object_path, &bzobj, removed_interfaces);
+ if (nm_streq (signal_name, "InterfacesAdded")) {
+ gs_unref_variant GVariant *interfaces_and_properties = NULL;
+ const char *object_path;
+
+ if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(oa{sa{sv}})")))
+ return;
+
+ g_variant_get (parameters,
+ "(&o@a{sa{sv}})",
+ &object_path,
+ &interfaces_and_properties);
+
+ _dbus_handle_interface_added (self, object_path, interfaces_and_properties, FALSE);
+ return;
+ }
+
+ if (nm_streq (signal_name, "InterfacesRemoved")) {
+ gs_free const char **interfaces = NULL;
+ const char *object_path;
+
+ if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(oas)")))
+ return;
+
+ g_variant_get (parameters,
+ "(&o^a&s)",
+ &object_path,
+ &interfaces);
+
+ changed = _dbus_handle_interface_removed (self, object_path, &bzobj, interfaces);
if (changed)
_dbus_process_changes (self, bzobj, "dbus-iface-removed");
- } else
- _dbus_handle_interface_added (self, object_path, added_interfaces_and_properties, FALSE);
+ return;
+ }
}
static void
@@ -2231,12 +2263,13 @@ name_owner_changed (NMBluezManager *self,
priv->get_managed_objects_cancellable = g_cancellable_new ();
- priv->managed_objects_changed_id = nm_dbus_connection_signal_subscribe_object_manager (priv->dbus_connection,
- priv->name_owner,
- NM_BLUEZ_MANAGER_PATH,
- _dbus_managed_objects_changed_cb,
- self,
- NULL);
+ priv->managed_objects_changed_id = nm_dbus_connection_signal_subscribe_object_manager_plain (priv->dbus_connection,
+ priv->name_owner,
+ NM_BLUEZ_MANAGER_PATH,
+ NULL,
+ _dbus_managed_objects_changed_cb,
+ self,
+ NULL);
priv->properties_changed_id = nm_dbus_connection_signal_subscribe_properties_changed (priv->dbus_connection,
priv->name_owner,