diff options
| author | Cidorvan Leite <cidorvan.leite@openbossa.org> | 2008-04-10 22:36:58 +0000 | 
|---|---|---|
| committer | Cidorvan Leite <cidorvan.leite@openbossa.org> | 2008-04-10 22:36:58 +0000 | 
| commit | fb27732e05fb7b69c3b784ed8a6aaed2d9d939ae (patch) | |
| tree | f6d262f6a6bf0733c761399b8e15b7ed130ae0c9 | |
| parent | 61a6576b2b7badd8963219873b631e6a51df612c (diff) | |
Added local agent in CreatePairedDevice
| -rw-r--r-- | hcid/adapter.c | 48 | ||||
| -rw-r--r-- | hcid/adapter.h | 3 | ||||
| -rw-r--r-- | hcid/agent.c | 19 | ||||
| -rw-r--r-- | hcid/dbus-hci.c | 22 | ||||
| -rw-r--r-- | hcid/device.c | 3 | ||||
| -rw-r--r-- | hcid/device.h | 1 | 
6 files changed, 61 insertions, 35 deletions
| diff --git a/hcid/adapter.c b/hcid/adapter.c index 66ac4d0e..0934ad02 100644 --- a/hcid/adapter.c +++ b/hcid/adapter.c @@ -231,10 +231,17 @@ int pending_remote_name_cancel(struct adapter *adapter)  	return err;  } +static void device_agent_removed(struct agent *agent, struct device *device) +{ +	if (device->agent == agent) +		device->agent = NULL; +} +  static struct bonding_request_info *bonding_request_new(DBusConnection *conn,  							DBusMessage *msg,  							struct adapter *adapter, -							const char *address) +							const char *address, +							const char *agent_path)  {  	struct bonding_request_info *bonding;  	struct device *device; @@ -244,10 +251,18 @@ static struct bonding_request_info *bonding_request_new(DBusConnection *conn,  	bonding->conn = dbus_connection_ref(conn);  	bonding->msg = dbus_message_ref(msg); -	/* FIXME: should be removed on 4.0 */  	if (hcid_dbus_use_experimental()) {  		device = adapter_get_device(conn, adapter, address); +		if (!device) +			return NULL; +  		device->temporary = TRUE; + +		if (agent_path && strcmp(agent_path, "/")) +			device->agent = agent_create(adapter, +				dbus_message_get_sender(msg), agent_path, +				NULL, (agent_remove_cb) device_agent_removed, +				device);  	}  	str2ba(address, &bonding->bdaddr); @@ -2277,19 +2292,12 @@ struct device *adapter_find_device(struct adapter *adapter, const char *dest)  	return device;  } -struct device *adapter_get_device(DBusConnection *conn, -				struct adapter *adapter, const gchar *address) +struct device *adapter_create_device(DBusConnection *conn, +				struct adapter *adapter, const char *address)  {  	struct device *device;  	char path[MAX_PATH_LENGTH]; -	if (!adapter) -		return NULL; - -	device = adapter_find_device(adapter, address); -	if (device) -		return device; -  	device = device_create(conn, adapter, address, NULL);  	if (!device)  		return NULL; @@ -2326,6 +2334,21 @@ void adapter_remove_device(DBusConnection *conn, struct adapter *adapter,  	adapter->devices = g_slist_remove(adapter->devices, device);  } +struct device *adapter_get_device(DBusConnection *conn, +				struct adapter *adapter, const gchar *address) +{ +	struct device *device; + +	if (!adapter) +		return NULL; + +	device = adapter_find_device(adapter, address); +	if (device) +		return device; + +	return adapter_create_device(conn, adapter, address); +} +  static gboolean create_bonding_conn_complete(GIOChannel *io, GIOCondition cond,  						struct adapter *adapter)  { @@ -2495,7 +2518,8 @@ static DBusHandlerResult create_bonding(DBusConnection *conn, DBusMessage *msg,  	if (sk < 0)  		return error_connection_attempt_failed(conn, msg, 0); -	adapter->bonding = bonding_request_new(conn, msg, adapter, address); +	adapter->bonding = bonding_request_new(conn, msg, adapter, address, +						agent_path);  	if (!adapter->bonding) {  		close(sk);  		return DBUS_HANDLER_RESULT_NEED_MEMORY; diff --git a/hcid/adapter.h b/hcid/adapter.h index 9a40ed4b..767cbde7 100644 --- a/hcid/adapter.h +++ b/hcid/adapter.h @@ -118,6 +118,9 @@ struct device *adapter_get_device(DBusConnection *conn,  struct device *adapter_find_device(struct adapter *adapter, const char *dest); +struct device *adapter_create_device(DBusConnection *conn, +				struct adapter *adapter, const char *address); +  void adapter_remove_device(DBusConnection *conn, struct adapter *adapter,  				struct device *device); diff --git a/hcid/agent.c b/hcid/agent.c index 3b85ebd4..f560f8d8 100644 --- a/hcid/agent.c +++ b/hcid/agent.c @@ -129,12 +129,9 @@ static void agent_request_free(struct agent_request *req)  static void agent_exited(const char *name, struct agent *agent)  { -	struct adapter *adapter = agent->adapter; -  	debug("Agent %s exited without calling Unregister", name);  	agent_destroy(agent, TRUE); -	adapter->agent = NULL;  }  static void agent_free(struct agent *agent) @@ -142,6 +139,9 @@ static void agent_free(struct agent *agent)  	if (!agent)  		return; +	if (agent->remove_cb) +		agent->remove_cb(agent, agent->remove_cb_data); +  	if (agent->request) {  		DBusError err; @@ -189,9 +189,6 @@ static gboolean agent_timeout(struct agent *agent)  	agent->timeout = 0; -	if (agent->remove_cb) -		agent->remove_cb(agent, agent->remove_cb_data); -  	agent_free(agent);  	return FALSE; @@ -331,11 +328,8 @@ done:  	agent->request = NULL;  	agent_request_free(req); -	if (agent->addr) { -		if (agent->remove_cb) -			agent->remove_cb(agent, agent->remove_cb_data); +	if (agent->addr)  		agent_free(agent); -	}  }  int agent_authorize(struct agent *agent, @@ -454,11 +448,8 @@ done:  	dbus_pending_call_cancel(req->call);  	agent_request_free(req); -	if (agent->addr) { -		if (agent->remove_cb) -			agent->remove_cb(agent, agent->remove_cb_data); +	if (agent->addr)  		agent_free(agent); -	}  }  int agent_request_passkey(struct agent *agent, struct device *device, diff --git a/hcid/dbus-hci.c b/hcid/dbus-hci.c index 0a06138a..9b48a11f 100644 --- a/hcid/dbus-hci.c +++ b/hcid/dbus-hci.c @@ -962,8 +962,6 @@ static void passkey_cb(struct agent *agent, DBusError *err, const char *passkey,  		goto done;  	} -	device->temporary = FALSE; -  	len = strlen(passkey);  	set_pin_length(&sba, len); @@ -983,6 +981,7 @@ int hcid_dbus_request_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci)  	char path[MAX_PATH_LENGTH], addr[18];  	struct adapter *adapter;  	struct device *device; +	struct agent *agent;  	int id;  	ba2str(sba, addr); @@ -1004,16 +1003,20 @@ int hcid_dbus_request_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci)  		goto old_fallback;  	} -	if (!adapter->agent) -		goto old_fallback; -  	ba2str(&ci->bdaddr, addr); -	device = adapter_get_device(connection, adapter, addr); -	if (!device) -		return -ENODEV; +	device = adapter_find_device(adapter, addr); +	agent = device && device->agent ? device->agent : adapter->agent; +	if (!agent) +		goto old_fallback; -	return agent_request_passkey(adapter->agent, device, +	if (!device) { +		device = adapter_create_device(connection, adapter, addr); +		if (!device) +			return -ENODEV; +	} + +	return agent_request_passkey(agent, device,  					(agent_passkey_cb) passkey_cb,  					device); @@ -1093,6 +1096,7 @@ void hcid_dbus_bonding_process_complete(bdaddr_t *local, bdaddr_t *peer,  		device = adapter_get_device(connection, adapter, paddr);  		if (device) { +			device->temporary = FALSE;  			dbus_connection_emit_property_changed(connection,  				device->path, DEVICE_INTERFACE,  				"Paired", DBUS_TYPE_BOOLEAN, &paired); diff --git a/hcid/device.c b/hcid/device.c index 1a0840e5..1e80b51e 100644 --- a/hcid/device.c +++ b/hcid/device.c @@ -60,6 +60,7 @@  #include "dbus-hci.h"  #include "error.h"  #include "glib-helper.h" +#include "agent.h"  #define MAX_DEVICES 16 @@ -737,6 +738,8 @@ int get_encryption_key_size(uint16_t dev_id, const bdaddr_t *baddr)  static void device_free(struct device *device)  { +	if (device->agent) +		agent_destroy(device->agent, FALSE);  	g_slist_foreach(device->uuids, (GFunc) g_free, NULL);  	g_slist_free(device->uuids);  	g_free(device->address); diff --git a/hcid/device.h b/hcid/device.h index 273d23d5..4bfa9feb 100644 --- a/hcid/device.h +++ b/hcid/device.h @@ -30,6 +30,7 @@ struct device {  	struct adapter	*adapter;  	GSList		*uuids;  	gboolean	temporary; +	struct agent	*agent;  };  struct device *device_create(DBusConnection *conn, struct adapter *adapter, | 
