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);  | 
