Diff between 4365fd382ad3448b105ac62257171df5ec0de8df and d2068f26fef0bea3d8329a289257b303195923f1

Changed Files

File Additions Deletions Status
src/adapter.c +13 -16 modified
src/mgmt.c +20 -29 modified

Full Patch

diff --git a/src/adapter.c b/src/adapter.c
index 768fb9e..d9601e1 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -3045,28 +3045,25 @@ void adapter_update_found_devices(struct btd_adapter *adapter,
 void adapter_mode_changed(struct btd_adapter *adapter, bool connectable,
 							bool discoverable)
 {
-	bool emit_pairable;
+	struct DBusConnection *conn = btd_get_dbus_connection();
 
 	DBG("connectable %u (old %u) discoverable %u (old %u)",
 					connectable, adapter->connectable,
 					discoverable, adapter->discoverable);
 
-	if (connectable == adapter->connectable &&
-			discoverable == adapter->discoverable)
-		return;
-
-	/* If connectable gets toggled emit the Pairable property */
-	emit_pairable = adapter->connectable != connectable;
-
-	adapter->connectable = connectable;
-	adapter->discoverable = discoverable;
-
-	if (emit_pairable)
-		g_dbus_emit_property_changed(btd_get_dbus_connection(),
-				adapter->path, ADAPTER_INTERFACE, "Pairable");
+	if (connectable != adapter->connectable) {
+		adapter->connectable = connectable;
+		g_dbus_emit_property_changed(conn, adapter->path,
+						ADAPTER_INTERFACE,
+						"Connectable");
+	}
 
-	g_dbus_emit_property_changed(btd_get_dbus_connection(), adapter->path,
-					ADAPTER_INTERFACE, "Discoverable");
+	if (discoverable != adapter->discoverable) {
+		adapter->discoverable = discoverable;
+		g_dbus_emit_property_changed(conn, adapter->path,
+						ADAPTER_INTERFACE,
+						"Discoverable");
+	}
 }
 
 struct agent *adapter_get_agent(struct btd_adapter *adapter)
diff --git a/src/mgmt.c b/src/mgmt.c
index 7e3f670..f5b368d 100644
--- a/src/mgmt.c
+++ b/src/mgmt.c
@@ -328,10 +328,20 @@ static inline int mgmt_low_energy(uint32_t settings)
 	return (settings & MGMT_SETTING_LE) != 0;
 }
 
+static int mode_changed(uint32_t s1, uint32_t s2)
+{
+	if (mgmt_connectable(s1) != mgmt_connectable(s2))
+		return 1;
+
+	if (mgmt_discoverable(s1) != mgmt_discoverable(s2))
+		return 1;
+
+	return 0;
+}
+
 static void update_settings(struct btd_adapter *adapter, uint32_t settings)
 {
 	struct controller_info *info;
-	gboolean pairable;
 	uint16_t index;
 
 	DBG("new settings %x", settings);
@@ -340,14 +350,12 @@ static void update_settings(struct btd_adapter *adapter, uint32_t settings)
 
 	info = &controllers[index];
 
-	if (mgmt_powered(settings))
+	if (mode_changed(settings, info->current_settings))
 		adapter_mode_changed(adapter, mgmt_connectable(settings),
 						mgmt_discoverable(settings));
 
-	pairable = btd_adapter_get_pairable(adapter);
-
-	if (mgmt_pairable(settings) != pairable)
-		mgmt_set_pairable(index, pairable);
+	if (mgmt_pairable(settings) != mgmt_pairable(info->current_settings))
+		btd_adapter_pairable_changed(adapter, mgmt_pairable(settings));
 
 	if (mgmt_ssp(info->supported_settings) && !mgmt_ssp(settings))
 		mgmt_set_ssp(index, TRUE);
@@ -376,23 +384,12 @@ static void mgmt_update_powered(struct btd_adapter *adapter,
 	update_settings(adapter, settings);
 }
 
-static int mode_changed(uint32_t s1, uint32_t s2)
-{
-	if (mgmt_connectable(s1) != mgmt_connectable(s2))
-		return 1;
-
-	if (mgmt_discoverable(s1) != mgmt_discoverable(s2))
-		return 1;
-
-	return 0;
-}
-
 static void mgmt_new_settings(int sk, uint16_t index, void *buf, size_t len)
 {
 	uint32_t settings, *ev = buf;
 	struct controller_info *info;
 	struct btd_adapter *adapter;
-	gboolean old_power, new_power, old_pairable, new_pairable;
+	gboolean old_power, new_power;
 
 	if (len < sizeof(*ev)) {
 		error("Too small new settings event");
@@ -421,17 +418,8 @@ static void mgmt_new_settings(int sk, uint16_t index, void *buf, size_t len)
 
 	if (new_power != old_power)
 		mgmt_update_powered(adapter, info, settings);
-	else if (new_power && mode_changed(settings, info->current_settings))
-		adapter_mode_changed(adapter, mgmt_connectable(settings),
-						mgmt_discoverable(settings));
-
-	old_pairable = mgmt_pairable(info->current_settings);
-	new_pairable = mgmt_pairable(settings);
-
-	/* Check for pairable change, except when powered went from True
-	 * to False (in which case we always get all settings as False) */
-	if ((!old_power || new_power) && new_pairable != old_pairable)
-		btd_adapter_pairable_changed(adapter, mgmt_pairable(settings));
+	else
+		update_settings(adapter, settings);
 
 	info->current_settings = settings;
 }
@@ -1213,6 +1201,9 @@ static void read_info_complete(int sk, uint16_t index, void *buf, size_t len)
 	btd_adapter_get_major_minor(adapter, &major, &minor);
 	mgmt_set_dev_class(index, major, minor);
 
+	if (!mgmt_pairable(info->current_settings))
+		mgmt_set_pairable(index, TRUE);
+
 	if (mgmt_powered(info->current_settings)) {
 		get_connections(sk, index);
 		btd_adapter_start(adapter);