From 747ce6f32a88e5f2c7df6bc94ca006bbdaff5bd6 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Mon, 29 Sep 2008 08:28:40 +0200 Subject: Fix signal emission for Powered and Discoverable --- src/adapter.c | 107 +++++++++++++++++++++++++++------------------------------- 1 file changed, 50 insertions(+), 57 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index 63039fec..f192ccba 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -491,7 +491,7 @@ static DBusMessage *set_mode(DBusConnection *conn, DBusMessage *msg, int err, dd; const char *mode; - switch(new_mode) { + switch (new_mode) { case MODE_OFF: scan_enable = SCAN_DISABLED; break; @@ -1556,7 +1556,7 @@ static DBusMessage *get_properties(DBusConnection *conn, DBusMessageIter iter; DBusMessageIter dict; char str[249], srcaddr[18]; - gboolean bproperty; + gboolean value; char **devices; int i; GSList *l; @@ -1597,27 +1597,30 @@ static DBusMessage *get_properties(DBusConnection *conn, DBUS_TYPE_STRING, &property); /* Powered */ - bproperty = adapter->up ? TRUE : FALSE; + if (main_opts.offmode == HCID_OFFMODE_DEVDOWN) + value = adapter->up ? TRUE : FALSE; + else + value = adapter->scan_mode == SCAN_DISABLED ? FALSE : TRUE; dbus_message_iter_append_dict_entry(&dict, "Powered", - DBUS_TYPE_BOOLEAN, &bproperty); + DBUS_TYPE_BOOLEAN, &value); /* Discoverable */ - bproperty = adapter->scan_mode == SCAN_INQUIRY ? TRUE : FALSE; + value = adapter->scan_mode & SCAN_INQUIRY ? TRUE : FALSE; dbus_message_iter_append_dict_entry(&dict, "Discoverable", - DBUS_TYPE_BOOLEAN, &bproperty); + DBUS_TYPE_BOOLEAN, &value); /* DiscoverableTimeout */ dbus_message_iter_append_dict_entry(&dict, "DiscoverableTimeout", DBUS_TYPE_UINT32, &adapter->discov_timeout); if (adapter->state & PERIODIC_INQUIRY || adapter->state & STD_INQUIRY) - bproperty = TRUE; + value = TRUE; else - bproperty = FALSE; + value = FALSE; /* Discovering */ dbus_message_iter_append_dict_entry(&dict, "Discovering", - DBUS_TYPE_BOOLEAN, &bproperty); + DBUS_TYPE_BOOLEAN, &value); /* Devices */ devices = g_new0(char *, g_slist_length(adapter->devices) + 1); @@ -1666,14 +1669,6 @@ static DBusMessage *set_property(DBusConnection *conn, dbus_message_iter_get_basic(&sub, &name); return set_name(conn, msg, name, data); - } else if (g_str_equal("DiscoverableTimeout", property)) { - uint32_t timeout; - - if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_UINT32) - return invalid_args(msg); - dbus_message_iter_get_basic(&sub, &timeout); - - return set_discoverable_timeout(conn, msg, timeout, data); } else if (g_str_equal("Mode", property)) { const char *mode; @@ -1690,8 +1685,8 @@ static DBusMessage *set_property(DBusConnection *conn, if (adapter->mode_sessions && adapter->global_mode < adapter->mode) return confirm_mode(conn, msg, mode, data); - return set_mode(conn, msg, get_mode(&adapter->bdaddr, mode), - data); + return set_mode(conn, msg, + get_mode(&adapter->bdaddr, mode), data); } else if (g_str_equal("Powered", property)) { gboolean powered; @@ -1710,6 +1705,15 @@ static DBusMessage *set_property(DBusConnection *conn, dbus_message_iter_get_basic(&sub, &discoverable); return set_discoverable(conn, msg, discoverable, data); + } else if (g_str_equal("DiscoverableTimeout", property)) { + uint32_t timeout; + + if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_UINT32) + return invalid_args(msg); + + dbus_message_iter_get_basic(&sub, &timeout); + + return set_discoverable_timeout(conn, msg, timeout, data); } return invalid_args(msg); @@ -3087,73 +3091,62 @@ void adapter_remove_oor_device(struct btd_adapter *adapter, char *peer_addr) void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode) { - const char *mode; const gchar *path = adapter_get_path(adapter); - gboolean powered; - gboolean discoverable; + const char *mode; + gboolean powered, discoverable; switch (scan_mode) { case SCAN_DISABLED: mode = "off"; adapter_set_mode(adapter, MODE_OFF); powered = FALSE; - dbus_connection_emit_property_changed(connection, path, - ADAPTER_INTERFACE, "Powered", - DBUS_TYPE_BOOLEAN, &powered); + discoverable = FALSE; break; case SCAN_PAGE: mode = "connectable"; adapter_set_mode(adapter, MODE_CONNECTABLE); - - if (adapter->scan_mode == SCAN_DISABLED) { - powered = TRUE; - dbus_connection_emit_property_changed(connection, path, - ADAPTER_INTERFACE, "Powered", - DBUS_TYPE_BOOLEAN, &powered); - } else { - discoverable = FALSE; - dbus_connection_emit_property_changed(connection, path, - ADAPTER_INTERFACE, "Discoverable", - DBUS_TYPE_BOOLEAN, &discoverable); - } + powered = TRUE; + discoverable = FALSE; break; case (SCAN_PAGE | SCAN_INQUIRY): - - if (adapter->discov_timeout != 0) - adapter_set_discov_timeout(adapter, adapter->discov_timeout * 1000); - + powered = TRUE; + discoverable = TRUE; if (adapter_get_mode(adapter) == MODE_LIMITED) { mode = "limited"; } else { adapter_set_mode(adapter, MODE_DISCOVERABLE); mode = "discoverable"; } - - if (adapter->scan_mode == SCAN_DISABLED) { - powered = TRUE; - dbus_connection_emit_property_changed(connection, path, - ADAPTER_INTERFACE, "powered", - DBUS_TYPE_BOOLEAN, &powered); - } - discoverable = TRUE; - dbus_connection_emit_property_changed(connection, path, - ADAPTER_INTERFACE, "Discoverable", - DBUS_TYPE_BOOLEAN, &discoverable); + if (adapter->discov_timeout != 0) + adapter_set_discov_timeout(adapter, + adapter->discov_timeout * 1000); break; case SCAN_INQUIRY: - /* Address the scenario where another app changed the scan mode */ + /* Address the scenario where a low-level application like + * hciconfig changed the scan mode */ if (adapter->discov_timeout != 0) - adapter_set_discov_timeout(adapter, adapter->discov_timeout * 1000); + adapter_set_discov_timeout(adapter, + adapter->discov_timeout * 1000); - /* ignore, this event should not be sent*/ + /* ignore, this event should not be sent */ default: /* ignore, reserved */ return; } dbus_connection_emit_property_changed(connection, path, - ADAPTER_INTERFACE, "Mode", - DBUS_TYPE_STRING, &mode); + ADAPTER_INTERFACE, "Mode", + DBUS_TYPE_STRING, &mode); + + if (powered == FALSE || adapter->scan_mode == SCAN_DISABLED) { + dbus_connection_emit_property_changed(connection, path, + ADAPTER_INTERFACE, "Powered", + DBUS_TYPE_BOOLEAN, &powered); + } + + dbus_connection_emit_property_changed(connection, path, + ADAPTER_INTERFACE, "Discoverable", + DBUS_TYPE_BOOLEAN, &discoverable); adapter_set_scan_mode(adapter, scan_mode); } -- cgit