summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClaudio Takahasi <claudio.takahasi@openbossa.org>2006-09-04 20:33:44 +0000
committerClaudio Takahasi <claudio.takahasi@openbossa.org>2006-09-04 20:33:44 +0000
commitee054b5500ecbb56672e1c2674167b295d489c2c (patch)
tree46cf82c78a68dc9afd274f638e1667ffbfd6b0a1
parent287671bee4169d7c247b680b59ffe09300e9ae9c (diff)
Fixed CancelDiscovery
-rw-r--r--hcid/dbus-adapter.c49
-rw-r--r--hcid/dbus.c5
-rw-r--r--hcid/dbus.h6
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);