diff options
author | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2006-04-11 14:11:39 +0000 |
---|---|---|
committer | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2006-04-11 14:11:39 +0000 |
commit | 13739c6505927f1e87151a74044a66c03f88d997 (patch) | |
tree | c440c0bf5d6a99988ac19ff827cc5365907d0f55 | |
parent | d8119fa65ac1ab57e656f42abdfeb1ab3b544804 (diff) |
Added local Bluetooth adapter address in the D-Bus data path
-rw-r--r-- | hcid/dbus-adapter.c | 122 | ||||
-rw-r--r-- | hcid/dbus-todo.txt | 6 | ||||
-rw-r--r-- | hcid/dbus.c | 29 | ||||
-rw-r--r-- | hcid/dbus.h | 1 |
4 files changed, 53 insertions, 105 deletions
diff --git a/hcid/dbus-adapter.c b/hcid/dbus-adapter.c index e0cce6bb..a43170bd 100644 --- a/hcid/dbus-adapter.c +++ b/hcid/dbus-adapter.c @@ -144,19 +144,14 @@ static struct bonding_request_info *bonding_request_new(bdaddr_t *peer) static DBusHandlerResult handle_dev_get_address_req(DBusConnection *conn, DBusMessage *msg, void *data) { struct hci_dbus_data *dbus_data = data; + const char *paddr = dbus_data->address; DBusMessage *reply; - char str[18], *str_ptr = str; - int err; - - err = get_device_address(dbus_data->dev_id, str, sizeof(str)); - if (err < 0) - return error_failed(conn, msg, -err); reply = dbus_message_new_method_return(msg); if (!reply) return error_out_of_memory(conn, msg); - dbus_message_append_args(reply, DBUS_TYPE_STRING, &str_ptr, + dbus_message_append_args(reply, DBUS_TYPE_STRING, &paddr, DBUS_TYPE_INVALID); return send_reply_and_unref(conn, reply); @@ -829,11 +824,10 @@ static DBusHandlerResult handle_dev_get_remote_version_req(DBusConnection *conn, DBusMessage *reply; DBusError err; char filename[PATH_MAX + 1]; - char addr[18], *addr_ptr, *str; + char *addr_ptr, *str; const char *str_ver; char info_array[64], *info = info_array; int compid, ver, subver; - int ecode; uint8_t features; dbus_error_init(&err); @@ -853,11 +847,7 @@ static DBusHandlerResult handle_dev_get_remote_version_req(DBusConnection *conn, if (check_address(addr_ptr) < 0) return error_invalid_arguments(conn, msg); - ecode = get_device_address(dbus_data->dev_id, addr, sizeof(addr)); - if (ecode < 0) - return error_failed(conn, msg, -ecode); - - snprintf(filename, PATH_MAX, "%s/%s/manufacturers", STORAGEDIR, addr); + snprintf(filename, PATH_MAX, "%s/%s/manufacturers", STORAGEDIR, dbus_data->address); str = textfile_get(filename, addr_ptr); if (!str) @@ -876,7 +866,7 @@ static DBusHandlerResult handle_dev_get_remote_version_req(DBusConnection *conn, /* default value */ snprintf(info, 64, "Bluetooth %s", str_ver); - snprintf(filename, PATH_MAX, "%s/%s/features", STORAGEDIR, addr); + snprintf(filename, PATH_MAX, "%s/%s/features", STORAGEDIR, dbus_data->address); str = textfile_get(filename, addr_ptr); if (!str) @@ -910,10 +900,9 @@ static DBusHandlerResult handle_dev_get_remote_revision_req(DBusConnection *conn DBusMessage *reply; DBusError err; char filename[PATH_MAX + 1]; - char addr[18], *addr_ptr, *str; + char *addr_ptr, *str; char info_array[16], *info = info_array; int compid, ver, subver; - int ecode; dbus_error_init(&err); @@ -932,11 +921,7 @@ static DBusHandlerResult handle_dev_get_remote_revision_req(DBusConnection *conn if (check_address(addr_ptr) < 0) return error_invalid_arguments(conn, msg); - ecode = get_device_address(dbus_data->dev_id, addr, sizeof(addr)); - if (ecode < 0) - return error_failed(conn, msg, -ecode); - - snprintf(filename, PATH_MAX, "%s/%s/manufacturers", STORAGEDIR, addr); + snprintf(filename, PATH_MAX, "%s/%s/manufacturers", STORAGEDIR, dbus_data->address); str = textfile_get(filename, addr_ptr); if (!str) @@ -963,10 +948,9 @@ static DBusHandlerResult handle_dev_get_remote_manufacturer_req(DBusConnection * DBusMessage *reply; DBusError err; char filename[PATH_MAX + 1]; - char addr[18], *addr_ptr, *str; + char *addr_ptr, *str; char info_array[64], *info = info_array; int compid, ver, subver; - int ecode; dbus_error_init(&err); memset(info_array, 0, 64); @@ -984,11 +968,7 @@ static DBusHandlerResult handle_dev_get_remote_manufacturer_req(DBusConnection * if (check_address(addr_ptr) < 0) return error_invalid_arguments(conn, msg); - ecode = get_device_address(dbus_data->dev_id, addr, sizeof(addr)); - if (ecode < 0) - return error_failed(conn, msg, -ecode); - - snprintf(filename, PATH_MAX, "%s/%s/manufacturers", STORAGEDIR, addr); + snprintf(filename, PATH_MAX, "%s/%s/manufacturers", STORAGEDIR, dbus_data->address); str = textfile_get(filename, addr_ptr); if (!str) @@ -1051,7 +1031,7 @@ static DBusHandlerResult handle_dev_get_remote_company_req(DBusConnection *conn, static int get_remote_class(DBusConnection *conn, DBusMessage *msg, void *data, uint32_t *class) { struct hci_dbus_data *dbus_data = data; - char addr_local[18], *addr_peer; + char *addr_peer; DBusError err; bdaddr_t local, peer; int ecode; @@ -1073,14 +1053,8 @@ static int get_remote_class(DBusConnection *conn, DBusMessage *msg, void *data, return -1; } - ecode = get_device_address(dbus_data->dev_id, addr_local, sizeof(addr_local)); - if (ecode < 0) { - error_failed(conn, msg, -ecode); - return -1; - } - str2ba(addr_peer, &peer); - str2ba(addr_local, &local); + str2ba(dbus_data->address, &local); ecode = read_remote_class(&local, &peer, class); if (ecode < 0) { @@ -1175,14 +1149,13 @@ static DBusHandlerResult handle_dev_get_remote_service_cls_req(DBusConnection *c static DBusHandlerResult handle_dev_get_remote_name_req(DBusConnection *conn, DBusMessage *msg, void *data) { - char filename[PATH_MAX + 1], addr[18]; + char filename[PATH_MAX + 1]; struct hci_dbus_data *dbus_data = data; DBusMessage *reply = NULL; DBusError err; const char *peer_addr; bdaddr_t peer_bdaddr; char *str; - int ecode; dbus_error_init(&err); dbus_message_get_args(msg, &err, @@ -1198,12 +1171,8 @@ static DBusHandlerResult handle_dev_get_remote_name_req(DBusConnection *conn, DB if (check_address(peer_addr) < 0) return error_invalid_arguments(conn, msg); - ecode = get_device_address(dbus_data->dev_id, addr, sizeof(addr)); - if (ecode < 0) - return error_failed(conn, msg, -ecode); - /* check if it is a unknown address */ - snprintf(filename, PATH_MAX, "%s/%s/lastseen", STORAGEDIR, addr); + snprintf(filename, PATH_MAX, "%s/%s/lastseen", STORAGEDIR, dbus_data->address); str = textfile_get(filename, peer_addr); @@ -1213,7 +1182,7 @@ static DBusHandlerResult handle_dev_get_remote_name_req(DBusConnection *conn, DB free(str); /* check if it is in the cache */ - snprintf(filename, PATH_MAX, "%s/%s/names", STORAGEDIR, addr); + snprintf(filename, PATH_MAX, "%s/%s/names", STORAGEDIR, dbus_data->address); str = textfile_get(filename, peer_addr); @@ -1397,8 +1366,7 @@ static DBusHandlerResult handle_dev_last_seen_req(DBusConnection *conn, DBusMess DBusMessage *reply; DBusError err; char filename[PATH_MAX + 1]; - char addr[18], *addr_ptr, *str; - int ecode; + char *addr_ptr, *str; dbus_error_init(&err); dbus_message_get_args(msg, &err, @@ -1414,11 +1382,7 @@ static DBusHandlerResult handle_dev_last_seen_req(DBusConnection *conn, DBusMess if (check_address(addr_ptr) < 0) return error_invalid_arguments(conn, msg); - ecode = get_device_address(dbus_data->dev_id, addr, sizeof(addr)); - if (ecode < 0) - return error_failed(conn, msg, -ecode); - - snprintf(filename, PATH_MAX, "%s/%s/lastseen", STORAGEDIR, addr); + snprintf(filename, PATH_MAX, "%s/%s/lastseen", STORAGEDIR, dbus_data->address); str = textfile_get(filename, addr_ptr); if (!str) @@ -1444,8 +1408,7 @@ static DBusHandlerResult handle_dev_last_used_req(DBusConnection *conn, DBusMess DBusMessage *reply; DBusError err; char filename[PATH_MAX + 1]; - char addr[18], *addr_ptr, *str; - int ecode; + char *addr_ptr, *str; dbus_error_init(&err); dbus_message_get_args(msg, &err, @@ -1461,12 +1424,7 @@ static DBusHandlerResult handle_dev_last_used_req(DBusConnection *conn, DBusMess if (check_address(addr_ptr) < 0) return error_invalid_arguments(conn, msg); - ecode = get_device_address(dbus_data->dev_id, addr, sizeof(addr)); - if (ecode < 0) - return error_failed(conn, msg, -ecode); - - snprintf(filename, PATH_MAX, "%s/%s/lastused", STORAGEDIR, addr); - + snprintf(filename, PATH_MAX, "%s/%s/lastused", STORAGEDIR, dbus_data->address); str = textfile_get(filename, addr_ptr); if (!str) @@ -1546,7 +1504,6 @@ static DBusHandlerResult handle_dev_disconnect_remote_device_req(DBusConnection static DBusHandlerResult handle_dev_create_bonding_req(DBusConnection *conn, DBusMessage *msg, void *data) { char filename[PATH_MAX + 1]; - char local_addr[18]; struct hci_request rq; create_conn_cp cc_cp; auth_requested_cp ar_cp; @@ -1557,7 +1514,7 @@ static DBusHandlerResult handle_dev_create_bonding_req(DBusConnection *conn, DBu struct hci_dbus_data *dbus_data = data; struct slist *l; bdaddr_t peer_bdaddr; - int dd, ecode, disconnect; + int dd, disconnect; dbus_error_init(&err); dbus_message_get_args(msg, &err, @@ -1583,12 +1540,8 @@ static DBusHandlerResult handle_dev_create_bonding_req(DBusConnection *conn, DBu if (dbus_data->discover_state != STATE_IDLE || dbus_data->requestor_name) return error_discover_in_progress(conn, msg); - ecode = get_device_address(dbus_data->dev_id, local_addr, sizeof(local_addr)); - if (ecode < 0) - return error_failed(conn, msg, -ecode); - /* check if a link key already exists */ - snprintf(filename, PATH_MAX, "%s/%s/linkkeys", STORAGEDIR, local_addr); + snprintf(filename, PATH_MAX, "%s/%s/linkkeys", STORAGEDIR, dbus_data->address); str = textfile_get(filename, peer_addr); if (str) { @@ -1597,7 +1550,7 @@ static DBusHandlerResult handle_dev_create_bonding_req(DBusConnection *conn, DBu } /* check if the address belongs to the last seen cache */ - snprintf(filename, PATH_MAX, "%s/%s/lastseen", STORAGEDIR, local_addr); + snprintf(filename, PATH_MAX, "%s/%s/lastseen", STORAGEDIR, dbus_data->address); str = textfile_get(filename, peer_addr); if (!str) return error_unknown_address(conn, msg); @@ -1777,7 +1730,7 @@ static DBusHandlerResult handle_dev_remove_bonding_req(DBusConnection *conn, DBu DBusMessage *signal; DBusError err; char filename[PATH_MAX + 1]; - char addr[18], *addr_ptr; + char *addr_ptr; bdaddr_t bdaddr; int dd; @@ -1799,9 +1752,7 @@ static DBusHandlerResult handle_dev_remove_bonding_req(DBusConnection *conn, DBu if (dd < 0) return error_no_such_adapter(conn, msg); - get_device_address(dbus_data->dev_id, addr, sizeof(addr)); - - snprintf(filename, PATH_MAX, "%s/%s/linkkeys", STORAGEDIR, addr); + snprintf(filename, PATH_MAX, "%s/%s/linkkeys", STORAGEDIR, dbus_data->address); /* Delete the link key from storage */ if (textfile_del(filename, addr_ptr)) { @@ -1849,9 +1800,8 @@ static DBusHandlerResult handle_dev_has_bonding_req(DBusConnection *conn, DBusMe DBusMessage *reply; DBusError err; char filename[PATH_MAX + 1]; - char addr[18], *addr_ptr, *str; + char *addr_ptr, *str; dbus_bool_t result; - int ecode; dbus_error_init(&err); dbus_message_get_args(msg, &err, @@ -1867,11 +1817,7 @@ static DBusHandlerResult handle_dev_has_bonding_req(DBusConnection *conn, DBusMe if (check_address(addr_ptr) < 0) return error_invalid_arguments(conn, msg); - ecode = get_device_address(dbus_data->dev_id, addr, sizeof(addr)); - if (ecode < 0) - return error_failed(conn, msg, -ecode); - - snprintf(filename, PATH_MAX, "%s/%s/linkkeys", STORAGEDIR, addr); + snprintf(filename, PATH_MAX, "%s/%s/linkkeys", STORAGEDIR, dbus_data->address); str = textfile_get(filename, addr_ptr); if (str) { @@ -1902,14 +1848,8 @@ static DBusHandlerResult handle_dev_list_bondings_req(DBusConnection *conn, DBus DBusMessageIter array_iter; DBusMessage *reply; char filename[PATH_MAX + 1]; - char addr[18]; - int ecode; - ecode = get_device_address(dbus_data->dev_id, addr, sizeof(addr)); - if (ecode < 0) - return error_failed(conn, msg, -ecode); - - snprintf(filename, PATH_MAX, "%s/%s/linkkeys", STORAGEDIR, addr); + snprintf(filename, PATH_MAX, "%s/%s/linkkeys", STORAGEDIR, dbus_data->address); reply = dbus_message_new_method_return(msg); @@ -1931,9 +1871,9 @@ static DBusHandlerResult handle_dev_get_pin_code_length_req(DBusConnection *conn DBusMessage *reply; DBusError err; bdaddr_t local, peer; - char addr[18], *addr_ptr; + char *addr_ptr; uint8_t length; - int len, ecode; + int len; dbus_error_init(&err); dbus_message_get_args(msg, &err, @@ -1949,11 +1889,7 @@ static DBusHandlerResult handle_dev_get_pin_code_length_req(DBusConnection *conn if (check_address(addr_ptr) < 0) return error_invalid_arguments(conn, msg); - ecode = get_device_address(dbus_data->dev_id, addr, sizeof(addr)); - if (ecode < 0) - return error_failed(conn, msg, -ecode); - - str2ba(addr, &local); + str2ba(dbus_data->address, &local); str2ba(addr_ptr, &peer); diff --git a/hcid/dbus-todo.txt b/hcid/dbus-todo.txt index db18c74a..94d5597c 100644 --- a/hcid/dbus-todo.txt +++ b/hcid/dbus-todo.txt @@ -7,12 +7,6 @@ an out of memory error Date: 2006/04/11 Description: This method is not implemented -* get_device_address -Date: 2006/04/11 -Description: This function is called frequently. Verify if it's -possible add a new field in the D-Bus data path structure to -store this information. - * record doesn't exist and not available Date: 2006/04/11 Description: Review these errors. The usage of "Does not exists" diff --git a/hcid/dbus.c b/hcid/dbus.c index b5928367..1143502f 100644 --- a/hcid/dbus.c +++ b/hcid/dbus.c @@ -411,9 +411,9 @@ gboolean hcid_dbus_register_device(uint16_t id) { char path[MAX_PATH_LENGTH]; char *pptr = path; - gboolean ret; + gboolean ret = FALSE; DBusMessage *message = NULL; - int i, dd = -1; + int i, err, dd = -1; read_scan_enable_rp rp; struct hci_request rq; struct hci_dbus_data* pdata; @@ -421,7 +421,8 @@ gboolean hcid_dbus_register_device(uint16_t id) struct hci_conn_info *ci = NULL; snprintf(path, sizeof(path), "%s/hci%d", ADAPTER_PATH, id); - ret = register_dbus_path(path, ADAPTER_PATH_ID, id, &obj_dev_vtable, FALSE); + if (!register_dbus_path(path, ADAPTER_PATH_ID, id, &obj_dev_vtable, FALSE)) + return FALSE; dd = hci_open_dev(id); if (dd < 0) { @@ -445,11 +446,23 @@ gboolean hcid_dbus_register_device(uint16_t id) } } - if (!dbus_connection_get_object_path_data(connection, path, (void *) &pdata)) + if (!dbus_connection_get_object_path_data(connection, path, (void *) &pdata)) { error("Getting %s path data failed!", path); - else - pdata->mode = rp.enable; /* Keep the current scan status */ + goto failed; + } + + pdata->mode = rp.enable; /* Keep the current scan status */ + /* + * Get the adapter Bluetooth address + */ + err = get_device_address(pdata->dev_id, pdata->address, sizeof(pdata->address)); + if (err < 0) + goto failed; + + /* + * Send the adapter added signal + */ message = dbus_message_new_signal(MANAGER_PATH, MANAGER_INTERFACE, "AdapterAdded"); if (message == NULL) { @@ -491,7 +504,11 @@ gboolean hcid_dbus_register_device(uint16_t id) for (i = 0; i < cl->conn_num; i++, ci++) active_conn_append(&pdata->active_conn, &ci->bdaddr, ci->handle); + ret = TRUE; failed: + if (!ret) + dbus_connection_unregister_object_path(connection, path); + if (message) dbus_message_unref(message); diff --git a/hcid/dbus.h b/hcid/dbus.h index 677c3220..7a347648 100644 --- a/hcid/dbus.h +++ b/hcid/dbus.h @@ -105,6 +105,7 @@ struct active_conn_info { struct hci_dbus_data { uint16_t dev_id; uint16_t path_id; + char address[18]; /* adapter Bluetooth Address */ uint32_t timeout_id; /* discoverable timeout id */ uint32_t discoverable_timeout; /* discoverable time(msec) */ uint8_t mode; /* scan mode */ |