diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2008-09-24 03:31:50 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2008-09-24 03:31:50 +0200 |
commit | 175702e7b18701999d34e9fd3067098dbd6fa0f0 (patch) | |
tree | ef7552508fd06067add04d4021db9dc79aa1b96f | |
parent | 5475636b22ecf822cb163d4b3a03e3d5a29cbd51 (diff) | |
parent | 3686ae20cd9a72a28d9d018ac88b06e5eed1768a (diff) |
Merge branch 'for-upstream' of git://gitorious.org/bluez/vudentzs-clone
-rw-r--r-- | doc/adapter-api.txt | 2 | ||||
-rw-r--r-- | serial/proxy.c | 4 | ||||
-rw-r--r-- | src/adapter.c | 166 |
3 files changed, 155 insertions, 17 deletions
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. 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) diff --git a/src/adapter.c b/src/adapter.c index 4a6ea8c2..94171eb7 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; @@ -1509,7 +1539,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 +1579,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); @@ -1635,15 +1675,33 @@ 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); } -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; @@ -1652,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); @@ -1695,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; @@ -1981,8 +2053,13 @@ static GDBusMethodTable adapter_methods[] = { { "SetProperty", "sv", "", set_property, G_DBUS_METHOD_FLAG_ASYNC}, { "RequestMode", "s", "", request_mode, + G_DBUS_METHOD_FLAG_ASYNC | + G_DBUS_METHOD_FLAG_DEPRECATED}, + { "ReleaseMode", "", "", release_session, + G_DBUS_METHOD_FLAG_DEPRECATED}, + { "RequestSession", "", "", request_session, G_DBUS_METHOD_FLAG_ASYNC}, - { "ReleaseMode", "", "", release_mode }, + { "ReleaseSession", "", "", release_session }, { "StartDiscovery", "", "", adapter_start_discovery }, { "StopDiscovery", "", "", adapter_stop_discovery, G_DBUS_METHOD_FLAG_ASYNC}, @@ -2233,6 +2310,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); @@ -2305,6 +2384,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); } @@ -2473,6 +2565,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) { @@ -2518,6 +2611,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; @@ -2921,17 +3028,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): @@ -2944,6 +3067,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 */ @@ -2959,6 +3093,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) |