diff --git a/src/adapter.c b/src/adapter.c
index 768fb9e..d9601e1 100644
--- a/src/adapter.c
+++ b/src/adapter.c
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
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);
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);
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");
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;
}
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);