diff options
author | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2006-09-04 20:33:44 +0000 |
---|---|---|
committer | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2006-09-04 20:33:44 +0000 |
commit | ee054b5500ecbb56672e1c2674167b295d489c2c (patch) | |
tree | 46cf82c78a68dc9afd274f638e1667ffbfd6b0a1 | |
parent | 287671bee4169d7c247b680b59ffe09300e9ae9c (diff) |
Fixed CancelDiscovery
-rw-r--r-- | hcid/dbus-adapter.c | 49 | ||||
-rw-r--r-- | hcid/dbus.c | 5 | ||||
-rw-r--r-- | hcid/dbus.h | 6 |
3 files changed, 41 insertions, 19 deletions
diff --git a/hcid/dbus-adapter.c b/hcid/dbus-adapter.c index d52a8f6a..6a1573f3 100644 --- a/hcid/dbus-adapter.c +++ b/hcid/dbus-adapter.c @@ -2244,12 +2244,14 @@ static DBusHandlerResult handle_dev_cancel_discovery_req(DBusConnection *conn, D { DBusMessage *reply = NULL; const char *requestor_name; - const struct discovered_dev_info *dev; + struct discovered_dev_info *dev, match; + struct slist *l; struct hci_request rq; remote_name_req_cancel_cp cp; struct hci_dbus_data *dbus_data = data; uint8_t status = 0x00; int dd = -1; + DBusHandlerResult ret_val = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; if (!dbus_data->up) return error_not_ready(conn, msg); @@ -2275,21 +2277,32 @@ static DBusHandlerResult handle_dev_cancel_discovery_req(DBusConnection *conn, D memset(&rq, 0, sizeof(rq)); memset(&cp, 0, sizeof(cp)); + rq.ogf = OGF_LINK_CTL; + rq.rparam = &status; rq.rlen = sizeof(status); + rq.event = EVT_CMD_COMPLETE; switch (dbus_data->discover_state) { case STATE_RESOLVING_NAMES: - /* get the first element */ - dev = (struct discovered_dev_info *) (dbus_data->disc_devices)->data; + /* find the pending remote name request */ + memset(&match, 0, sizeof(struct discovered_dev_info)); + bacpy(&match.bdaddr, BDADDR_ANY); + match.name_status = NAME_REQUESTED; + match.discover_type = RESOLVE_NAME; + + l = slist_find(dbus_data->disc_devices, &match, (cmp_func_t) disc_device_find); + if (!l) + goto done; /* no request pending */ + + dev = l->data; bacpy(&cp.bdaddr, &dev->bdaddr); rq.ocf = OCF_REMOTE_NAME_REQ_CANCEL; rq.cparam = &cp; rq.clen = REMOTE_NAME_REQ_CANCEL_CP_SIZE; - rq.event = EVT_CMD_STATUS; break; default: /* STATE_DISCOVER */ rq.ocf = OCF_INQUIRY_CANCEL; @@ -2298,29 +2311,33 @@ static DBusHandlerResult handle_dev_cancel_discovery_req(DBusConnection *conn, D if (hci_send_req(dd, &rq, 100) < 0) { error("Sending command failed: %s (%d)", strerror(errno), errno); - hci_close_dev(dd); - return error_failed(conn, msg, errno); + ret_val = error_failed(conn, msg, errno); + goto cleanup; } - hci_close_dev(dd); - if (status) { error("Cancel failed with status 0x%02x", status); - return error_failed(conn, msg, bt_error(status)); + ret_val = error_failed(conn, msg, bt_error(status)); + goto cleanup; } +done: + reply = dbus_message_new_method_return(msg); + ret_val = send_reply_and_unref(conn, reply); + +cleanup: + /* + * Reset discovery_requestor and discover_state in the remote name + * request event handler or in the inquiry complete handler. + */ slist_foreach(dbus_data->disc_devices, (slist_func_t) free, NULL); slist_free(dbus_data->disc_devices); dbus_data->disc_devices = NULL; - if (dbus_data->discovery_requestor) { - free(dbus_data->discovery_requestor); - dbus_data->discovery_requestor = NULL; - } - - reply = dbus_message_new_method_return(msg); + if (dd >= 0) + hci_close_dev(dd); - return send_reply_and_unref(conn, reply); + return ret_val; } const char *major_class_str(uint32_t class) diff --git a/hcid/dbus.c b/hcid/dbus.c index b9d5d905..23bd4f32 100644 --- a/hcid/dbus.c +++ b/hcid/dbus.c @@ -85,7 +85,7 @@ void bonding_request_free(struct bonding_request_info *dev ) } } -static int disc_device_find(const struct discovered_dev_info *d1, const struct discovered_dev_info *d2) +int disc_device_find(const struct discovered_dev_info *d1, const struct discovered_dev_info *d2) { int ret; @@ -909,6 +909,9 @@ int disc_device_req_name(struct hci_dbus_data *dbus_data) /* send at least one request or return failed if the list is empty */ do { + /* flag to indicate the current remote name requested */ + dev->name_status = NAME_REQUESTED; + req_sent = 1; memset(&cp, 0, sizeof(cp)); diff --git a/hcid/dbus.h b/hcid/dbus.h index 4dc0ff51..ecaf008b 100644 --- a/hcid/dbus.h +++ b/hcid/dbus.h @@ -73,8 +73,9 @@ typedef enum { typedef enum { NAME_ANY, - NAME_PENDING, - NAME_SENT + NAME_PENDING, /* remote name needs be resolved */ + NAME_REQUESTED, /* HCI remote name request was sent */ + NAME_SENT /* D-Bus signal RemoteNameUpdated sent */ } name_status_t; struct discovered_dev_info { @@ -225,6 +226,7 @@ int active_conn_find_by_bdaddr(const void *data, const void *user_data); void bonding_request_free(struct bonding_request_info *dev); int pending_bonding_cmp(const void *p1, const void *p2); int disc_device_append(struct slist **list, bdaddr_t *bdaddr, name_status_t name_status, int discover_type); +int disc_device_find(const struct discovered_dev_info *d1, const struct discovered_dev_info *d2); int disc_device_req_name(struct hci_dbus_data *dbus_data); int discoverable_timeout_handler(void *data); |