From f71b0700e2b824ffc25de43dd6d91186b5e2d63e Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 23 Sep 2008 14:10:06 -0700 Subject: Fix ReleaseSession documentation. --- doc/adapter-api.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/adapter-api.txt b/doc/adapter-api.txt index 16f35918..fe19de2f 100644 --- a/doc/adapter-api.txt +++ b/doc/adapter-api.txt @@ -62,7 +62,7 @@ Methods dict GetProperties() Possible Errors: org.bluez.Error.Rejected - void ReleaseSession{} + void ReleaseSession() Release a previous requested session. -- cgit From 1906413abac75b33c05908d458fa74dc5de004c4 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 23 Sep 2008 14:12:06 -0700 Subject: Mark RequestMode/ReleaseMode as deprecated. --- src/adapter.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index 4a6ea8c2..c02d0c2d 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -1981,8 +1981,10 @@ static GDBusMethodTable adapter_methods[] = { { "SetProperty", "sv", "", set_property, G_DBUS_METHOD_FLAG_ASYNC}, { "RequestMode", "s", "", request_mode, - G_DBUS_METHOD_FLAG_ASYNC}, - { "ReleaseMode", "", "", release_mode }, + G_DBUS_METHOD_FLAG_ASYNC | + G_DBUS_METHOD_FLAG_DEPRECATED}, + { "ReleaseMode", "", "", release_mode, + G_DBUS_METHOD_FLAG_DEPRECATED}, { "StartDiscovery", "", "", adapter_start_discovery }, { "StopDiscovery", "", "", adapter_stop_discovery, G_DBUS_METHOD_FLAG_ASYNC}, -- cgit From a34ec607308e143df09848025decbeae9c2d98f2 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 23 Sep 2008 15:20:20 -0700 Subject: Make Powered/Discoverable property available in GetProperty. --- src/adapter.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index c02d0c2d..eb40f854 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -1509,7 +1509,7 @@ static DBusMessage *get_properties(DBusConnection *conn, DBusMessageIter iter; DBusMessageIter dict; char str[249], srcaddr[18]; - gboolean discov_active; + gboolean bproperty; char **devices; int i; GSList *l; @@ -1549,18 +1549,28 @@ static DBusMessage *get_properties(DBusConnection *conn, dbus_message_iter_append_dict_entry(&dict, "Mode", DBUS_TYPE_STRING, &property); + /* Powered */ + bproperty = adapter->up ? TRUE : FALSE; + dbus_message_iter_append_dict_entry(&dict, "Powered", + DBUS_TYPE_BOOLEAN, &bproperty); + + /* Discoverable */ + bproperty = adapter->scan_mode == SCAN_INQUIRY ? TRUE : FALSE; + dbus_message_iter_append_dict_entry(&dict, "Discoverable", + DBUS_TYPE_BOOLEAN, &bproperty); + /* DiscoverableTimeout */ dbus_message_iter_append_dict_entry(&dict, "DiscoverableTimeout", DBUS_TYPE_UINT32, &adapter->discov_timeout); if (adapter->state & PERIODIC_INQUIRY || adapter->state & STD_INQUIRY) - discov_active = TRUE; + bproperty = TRUE; else - discov_active = FALSE; + bproperty = FALSE; /* Discovering */ dbus_message_iter_append_dict_entry(&dict, "Discovering", - DBUS_TYPE_BOOLEAN, &discov_active); + DBUS_TYPE_BOOLEAN, &bproperty); /* Devices */ devices = g_new0(char *, g_slist_length(adapter->devices) + 1); -- cgit From 76e387a844f84c8115442058f5b13f4e3170d1e3 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 23 Sep 2008 16:19:11 -0700 Subject: Make Powered/Discoverable properties changeable via SetProperty. --- src/adapter.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/adapter.c b/src/adapter.c index eb40f854..b4a74a36 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -597,6 +597,36 @@ done: return dbus_message_new_method_return(msg); } +static DBusMessage *set_powered(DBusConnection *conn, DBusMessage *msg, + gboolean powered, void *data) +{ + struct btd_adapter *adapter = data; + uint8_t mode; + + mode = powered ? get_mode(&adapter->bdaddr, "on") : MODE_OFF; + + if (mode == adapter->mode) + return dbus_message_new_method_return(msg); + + return set_mode(conn, msg, mode, data); +} + +static DBusMessage *set_discoverable(DBusConnection *conn, DBusMessage *msg, + gboolean discoverable, void *data) +{ + struct btd_adapter *adapter = data; + const char *strmode; + uint8_t mode; + + strmode = discoverable ? "discoverable" : "connectable"; + mode = get_mode(&adapter->bdaddr, strmode); + + if (mode == adapter->mode) + return dbus_message_new_method_return(msg); + + return set_mode(conn, msg, mode, data); +} + static struct session_req *find_session(GSList *list, DBusMessage *msg) { GSList *l; @@ -1645,6 +1675,24 @@ static DBusMessage *set_property(DBusConnection *conn, return set_mode(conn, msg, get_mode(&adapter->bdaddr, mode), data); + } else if (g_str_equal("Powered", property)) { + gboolean powered; + + if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN) + return invalid_args(msg); + + dbus_message_iter_get_basic(&sub, &powered); + + return set_powered(conn, msg, powered, data); + } else if (g_str_equal("Discoverable", property)) { + gboolean discoverable; + + if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN) + return invalid_args(msg); + + dbus_message_iter_get_basic(&sub, &discoverable); + + return set_discoverable(conn, msg, discoverable, data); } return invalid_args(msg); -- cgit From 7f0d09f7816445818c3c96a54d5f7c7eee733266 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 23 Sep 2008 17:02:24 -0700 Subject: Emit PropertyChanged for Powered and Discoverable. --- src/adapter.c | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index b4a74a36..9575336f 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -2981,17 +2981,33 @@ void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode) { const char *mode; const gchar *path = adapter_get_path(adapter); - - adapter_set_scan_mode(adapter, scan_mode); + gboolean powered; + gboolean 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); 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); + } break; case (SCAN_PAGE | SCAN_INQUIRY): @@ -3004,6 +3020,17 @@ void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode) 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); break; case SCAN_INQUIRY: /* Address the scenario where another app changed the scan mode */ @@ -3019,6 +3046,8 @@ void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode) dbus_connection_emit_property_changed(connection, path, ADAPTER_INTERFACE, "Mode", DBUS_TYPE_STRING, &mode); + + adapter_set_scan_mode(adapter, scan_mode); } struct agent *adapter_get_agent(struct btd_adapter *adapter) -- cgit From a8a26772d1a5ff139284ec702b269b832fa18dd7 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 23 Sep 2008 17:42:09 -0700 Subject: Emit Powered and Discoverable properly when adapter comes up and down. --- src/adapter.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/adapter.c b/src/adapter.c index 9575336f..0cb0ccbe 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -2293,6 +2293,8 @@ static void adapter_up(struct btd_adapter *adapter, int dd) const char *pmode; char mode[14], srcaddr[18]; int i; + gboolean powered; + gboolean discoverable; ba2str(&adapter->bdaddr, srcaddr); @@ -2365,6 +2367,19 @@ static void adapter_up(struct btd_adapter *adapter, int dd) ADAPTER_INTERFACE, "Mode", DBUS_TYPE_STRING, &pmode); + powered = adapter->scan_mode == SCAN_DISABLED ? FALSE : TRUE; + + dbus_connection_emit_property_changed(connection, adapter->path, + ADAPTER_INTERFACE, "Powered", + DBUS_TYPE_BOOLEAN, &powered); + + discoverable = adapter->scan_mode == (SCAN_PAGE | SCAN_INQUIRY) ? TRUE + : FALSE; + + dbus_connection_emit_property_changed(connection, adapter->path, + ADAPTER_INTERFACE, "Discoverable", + DBUS_TYPE_BOOLEAN, &discoverable); + load_drivers(adapter); load_devices(adapter); } @@ -2533,6 +2548,7 @@ static void unload_drivers(struct btd_adapter *adapter) int adapter_stop(struct btd_adapter *adapter) { const char *mode = "off"; + gboolean powered, discoverable; /* cancel pending timeout */ if (adapter->discov_timeout_id) { @@ -2578,6 +2594,20 @@ int adapter_stop(struct btd_adapter *adapter) ADAPTER_INTERFACE, "Mode", DBUS_TYPE_STRING, &mode); + powered = FALSE; + + dbus_connection_emit_property_changed(connection, adapter->path, + ADAPTER_INTERFACE, "Powered", + DBUS_TYPE_BOOLEAN, &powered); + + if (adapter->scan_mode == (SCAN_PAGE | SCAN_INQUIRY)) { + discoverable = FALSE; + + dbus_connection_emit_property_changed(connection, adapter->path, + ADAPTER_INTERFACE, "Discoverable", + DBUS_TYPE_BOOLEAN, &discoverable); + } + adapter->up = 0; adapter->scan_mode = SCAN_DISABLED; adapter->mode = MODE_OFF; -- cgit From 71812b42755cf65c694873ac66bcaa6bf3c817ca Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 23 Sep 2008 17:52:45 -0700 Subject: Fix invalid read when passing a path which happens to be freed on destroy callback function. --- serial/proxy.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/serial/proxy.c b/serial/proxy.c index 7128bdbc..643e19aa 100644 --- a/serial/proxy.c +++ b/serial/proxy.c @@ -1002,9 +1002,11 @@ static void manager_path_unregister(void *data) /* Remove proxy objects */ for (l = adapter->proxies; l; l = l->next) { struct serial_proxy *prx = l->data; + char *path = g_strdup(prx->path); - g_dbus_unregister_interface(adapter->conn, prx->path, + g_dbus_unregister_interface(adapter->conn, path, SERIAL_PROXY_INTERFACE); + g_free(path); } if (adapter->conn) -- cgit From 3686ae20cd9a72a28d9d018ac88b06e5eed1768a Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 23 Sep 2008 18:25:30 -0700 Subject: Introduce RequestSession and ReleaseSession. --- src/adapter.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index 0cb0ccbe..94171eb7 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -1698,10 +1698,10 @@ static DBusMessage *set_property(DBusConnection *conn, return invalid_args(msg); } -static DBusMessage *request_mode(DBusConnection *conn, - DBusMessage *msg, void *data) +static DBusMessage *mode_request(DBusConnection *conn, + DBusMessage *msg, const char *mode, + void *data) { - const char *mode; struct btd_adapter *adapter = data; struct session_req *req; uint8_t new_mode; @@ -1710,10 +1710,6 @@ static DBusMessage *request_mode(DBusConnection *conn, ba2str(&adapter->bdaddr, srcaddr); - if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &mode, - DBUS_TYPE_INVALID)) - return invalid_args(msg); - new_mode = get_mode(&adapter->bdaddr, mode); if (new_mode != MODE_CONNECTABLE && new_mode != MODE_DISCOVERABLE) return invalid_args(msg); @@ -1753,7 +1749,25 @@ static DBusMessage *request_mode(DBusConnection *conn, return NULL; } -static DBusMessage *release_mode(DBusConnection *conn, +static DBusMessage *request_mode(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + const char *mode; + + if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &mode, + DBUS_TYPE_INVALID)) + return invalid_args(msg); + + return mode_request(conn, msg, mode, data); +} + +static DBusMessage *request_session(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + return mode_request(conn, msg, "connectable", data); +} + +static DBusMessage *release_session(DBusConnection *conn, DBusMessage *msg, void *data) { struct btd_adapter *adapter = data; @@ -2041,8 +2055,11 @@ static GDBusMethodTable adapter_methods[] = { { "RequestMode", "s", "", request_mode, G_DBUS_METHOD_FLAG_ASYNC | G_DBUS_METHOD_FLAG_DEPRECATED}, - { "ReleaseMode", "", "", release_mode, + { "ReleaseMode", "", "", release_session, G_DBUS_METHOD_FLAG_DEPRECATED}, + { "RequestSession", "", "", request_session, + G_DBUS_METHOD_FLAG_ASYNC}, + { "ReleaseSession", "", "", release_session }, { "StartDiscovery", "", "", adapter_start_discovery }, { "StopDiscovery", "", "", adapter_stop_discovery, G_DBUS_METHOD_FLAG_ASYNC}, -- cgit