diff options
| author | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2008-03-12 21:37:20 +0000 | 
|---|---|---|
| committer | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2008-03-12 21:37:20 +0000 | 
| commit | 6bfa88d706cc57a0c975c980dabec5d8ed67dcc0 (patch) | |
| tree | a8ce186c452fa2fdd57dee93bfc7e9a4498c332d | |
| parent | 45e65bdb0940fc3a815e75c58842ed0e56dd4dab (diff) | |
Keep a list of device's structure pointers instead of paths
| -rw-r--r-- | hcid/adapter.c | 51 | ||||
| -rw-r--r-- | hcid/adapter.h | 2 | ||||
| -rw-r--r-- | hcid/dbus-common.c | 2 | ||||
| -rw-r--r-- | hcid/dbus-hci.c | 17 | ||||
| -rw-r--r-- | hcid/device.c | 72 | ||||
| -rw-r--r-- | hcid/device.h | 7 | 
6 files changed, 47 insertions, 104 deletions
| diff --git a/hcid/adapter.c b/hcid/adapter.c index 4304388a..b589a721 100644 --- a/hcid/adapter.c +++ b/hcid/adapter.c @@ -3170,13 +3170,6 @@ static DBusHandlerResult adapter_list_trusts(DBusConnection *conn,  	return send_message_and_unref(conn, reply);  } -static void do_append_device(struct device *device, DBusMessageIter *iter) -{ -	const char *path = device->path; - -	dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, &path); -} -  static DBusHandlerResult get_properties(DBusConnection *conn,  					DBusMessage *msg, void *data)  { @@ -3298,7 +3291,9 @@ static DBusHandlerResult set_property(DBusConnection *conn,  static DBusHandlerResult list_devices(DBusConnection *conn,  						DBusMessage *msg, void *data)  { +	struct adapter *adapter = data;  	DBusMessage *reply; +	GSList *l;  	DBusMessageIter iter;  	DBusMessageIter array_iter; @@ -3316,7 +3311,11 @@ static DBusHandlerResult list_devices(DBusConnection *conn,  	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,  				DBUS_TYPE_OBJECT_PATH_AS_STRING, &array_iter); -	device_foreach((GFunc) do_append_device, &array_iter); +	for (l = adapter->devices; l; l = l->next) { +		struct device *device = l->data; +		dbus_message_iter_append_basic(&array_iter, +				DBUS_TYPE_OBJECT_PATH, &device->path); +	}  	dbus_message_iter_close_container(&iter, &array_iter); @@ -3327,9 +3326,9 @@ static void discover_services_cb(gpointer user_data, sdp_list_t *recs, int err)  {  	sdp_list_t *seq, *next, *svcclass;  	struct adapter *adapter = user_data; +	struct device *device;  	DBusMessage *reply;  	GSList *uuids; -	const char *path;  	bdaddr_t src, dst;  	if (err < 0) { @@ -3359,8 +3358,8 @@ static void discover_services_cb(gpointer user_data, sdp_list_t *recs, int err)  	sdp_list_free(recs, (sdp_free_func_t) sdp_record_free); -	path = device_create(adapter, adapter->create->address, uuids); -	if (!path) +	device = device_create(adapter, adapter->create->address, uuids); +	if (!device)  		goto failed;  	/* Reply create device request */ @@ -3368,7 +3367,7 @@ static void discover_services_cb(gpointer user_data, sdp_list_t *recs, int err)  	if (!reply)  		goto failed; -	dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path, +	dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &device->path,  					DBUS_TYPE_INVALID);  	send_message_and_unref(adapter->create->conn, reply); @@ -3376,10 +3375,10 @@ static void discover_services_cb(gpointer user_data, sdp_list_t *recs, int err)  				dbus_message_get_path(adapter->create->msg),  				ADAPTER_INTERFACE,  				"DeviceCreated", -				DBUS_TYPE_OBJECT_PATH, &path, +				DBUS_TYPE_OBJECT_PATH, &device->path,  				DBUS_TYPE_INVALID); -	adapter->devices = g_slist_append(adapter->devices, g_strdup(path)); +	adapter->devices = g_slist_append(adapter->devices, device);  	/* Store the device's profiles in the filesystem */  	str2ba(adapter->address, &src); @@ -3398,6 +3397,11 @@ failed:  	adapter->create = NULL;  } +static gint device_address_cmp(struct device *device, const gchar *address) +{ +	return strcasecmp(device->address, address); +} +  static DBusHandlerResult create_device(DBusConnection *conn,  					DBusMessage *msg, void *data)  { @@ -3420,7 +3424,8 @@ static DBusHandlerResult create_device(DBusConnection *conn,  	if (check_address(address) < 0)  		return error_invalid_arguments(conn, msg, NULL); -	if (device_find(address)) +	if (g_slist_find_custom(adapter->devices, +				address, (GCompareFunc) device_address_cmp))  		return error_already_exists(conn, msg, "Device already exists");  	str2ba(adapter->address, &src); @@ -3441,10 +3446,16 @@ static DBusHandlerResult create_device(DBusConnection *conn,  	return DBUS_HANDLER_RESULT_HANDLED;  } +static gint device_path_cmp(struct device *device, const gchar *path) +{ +	return strcasecmp(device->path, path); +} +  static DBusHandlerResult remove_device(DBusConnection *conn,  						DBusMessage *msg, void *data)  {  	struct adapter *adapter = data; +	struct device *device;  	DBusMessage *reply;  	const char *path;  	GSList *l; @@ -3456,10 +3467,13 @@ static DBusHandlerResult remove_device(DBusConnection *conn,  						DBUS_TYPE_INVALID) == FALSE)  		return error_invalid_arguments(conn, msg, NULL); -	l = g_slist_find_custom(adapter->devices, path, (GCompareFunc) strcmp); +	l = g_slist_find_custom(adapter->devices, +			path, (GCompareFunc) device_path_cmp);  	if (!l)  		return error_device_does_not_exist(conn, msg); +	device = l->data; +  	reply = dbus_message_new_method_return(msg);  	if (!reply)  		return DBUS_HANDLER_RESULT_NEED_MEMORY; @@ -3467,9 +3481,8 @@ static DBusHandlerResult remove_device(DBusConnection *conn,  	/* FIXME: Remove from filesystem */  	/* FIXME: Remove linkkeys */ -	device_remove(path); -	g_free(l->data); -	adapter->devices = g_slist_remove(adapter->devices, l->data); +	device_destroy(device); +	adapter->devices = g_slist_remove(adapter->devices, device);  	return send_message_and_unref(conn, reply);  } diff --git a/hcid/adapter.h b/hcid/adapter.h index c9ceea0f..9353fcdd 100644 --- a/hcid/adapter.h +++ b/hcid/adapter.h @@ -113,7 +113,7 @@ struct adapter {  	GSList *pin_reqs;  	struct pending_dc_info *pending_dc;  	struct create_device_req *create; -	GSList *devices;		/* Devices paths */ +	GSList *devices;		/* Devices structure pointers */  };  dbus_bool_t adapter_init(DBusConnection *conn, const char *path); diff --git a/hcid/dbus-common.c b/hcid/dbus-common.c index 31a9c0c7..166d7184 100644 --- a/hcid/dbus-common.c +++ b/hcid/dbus-common.c @@ -306,8 +306,6 @@ void hcid_dbus_exit(void)  	release_default_auth_agent();  	release_services(conn); -	device_cleanup(); -  	/* Unregister all paths in Adapter path hierarchy */  	if (!dbus_connection_list_registered(conn, BASE_PATH, &children))  		goto done; diff --git a/hcid/dbus-hci.c b/hcid/dbus-hci.c index 92aed10f..837d47af 100644 --- a/hcid/dbus-hci.c +++ b/hcid/dbus-hci.c @@ -451,7 +451,7 @@ int unregister_adapter_path(const char *path)  	}  	if (adapter->devices) { -		g_slist_foreach(adapter->devices, (GFunc) free, NULL); +		g_slist_foreach(adapter->devices, (GFunc) device_destroy, NULL);  		g_slist_free(adapter->devices);  	} @@ -575,11 +575,11 @@ static void create_stored_device(char *key, char *value, void *user_data)  {  	struct adapter *adapter = user_data;  	GSList *uuids = bt_string2list(value); -	const gchar *path; +	struct device *device; -	path = device_create(adapter, key, uuids); - -	adapter->devices = g_slist_append(adapter->devices, g_strdup(path)); +	device = device_create(adapter, key, uuids); +	if (device) +		adapter->devices = g_slist_append(adapter->devices, device);  }  static void register_devices(bdaddr_t *src, struct adapter *adapter) @@ -783,13 +783,6 @@ int hcid_dbus_stop_device(uint16_t id)  		adapter->active_conn = NULL;  	} -	if (adapter->devices) { -		g_slist_foreach(adapter->devices, (GFunc) device_remove, NULL); -		g_slist_foreach(adapter->devices, (GFunc) free, NULL); -		g_slist_free(adapter->devices); -		adapter->devices = NULL; -	} -  	send_adapter_signal(connection, adapter->dev_id, "ModeChanged",  				DBUS_TYPE_STRING, &mode,  				DBUS_TYPE_INVALID); diff --git a/hcid/device.c b/hcid/device.c index 3f4e5ba4..5e129ab5 100644 --- a/hcid/device.c +++ b/hcid/device.c @@ -713,10 +713,9 @@ int get_encryption_key_size(uint16_t dev_id, const bdaddr_t *baddr)  static DBusConnection *connection = NULL; -static GSList *device_list = NULL; -  gboolean device_init(DBusConnection *conn)  { +	/* FIXME: It's not necessary keep a connection reference */  	connection = dbus_connection_ref(conn);  	if (connection == NULL)  		return FALSE; @@ -724,45 +723,6 @@ gboolean device_init(DBusConnection *conn)  	return TRUE;  } -static void device_destroy(struct device *device) -{ -	debug("Removing device %s", device->path); - -	dbus_connection_destroy_object_path(connection, device->path); -} - -void device_cleanup(void) -{ -	if (connection == NULL) -		return; - -	g_slist_foreach(device_list, (GFunc) device_destroy, NULL); -	g_slist_free(device_list); - -	dbus_connection_unref(connection); -} - -void device_foreach(GFunc func, gpointer user_data) -{ -	g_slist_foreach(device_list, func, user_data); -} - -struct device *device_find(const gchar *address) -{ -	GSList *l; - -	if (!device_list || !address) -		return NULL; - -	for (l = device_list; l; l = l->next) { -		struct device *device = l->data; -		if (strcmp(device->address, address) == 0) -			return device; -	} - -	return NULL; -} -  static void device_free(struct device *device)  {  	g_slist_foreach(device->uuids, (GFunc) g_free, NULL); @@ -774,11 +734,7 @@ static void device_free(struct device *device)  static void device_unregister(DBusConnection *conn, void *user_data)  { -	struct device *device = user_data; - -	device_list = g_slist_remove(device_list, device); - -	device_free(device); +	device_free(user_data);  }  static DBusHandlerResult disconnect(DBusConnection *conn, @@ -901,7 +857,7 @@ static DBusSignalVTable device_signals[] = {  	{ NULL, NULL }  }; -const gchar *device_create(struct adapter *adapter, +struct device *device_create(struct adapter *adapter,  		const gchar *address, GSList *uuids)  {  	struct device *device; @@ -925,30 +881,16 @@ const gchar *device_create(struct adapter *adapter,  	dbus_connection_register_interface(connection, device->path,  			DEVICE_INTERFACE, device_methods, device_signals, NULL); -	device_list = g_slist_append(device_list, device); -  	device->address = g_strdup(address);  	device->adapter = adapter;  	device->uuids = uuids; -	return device->path; +	return device;  } -static gint device_path_cmp(const struct device *device, const char *path) +void device_destroy(struct device *device)  { -	return strcmp(device->path, path); -} + 	debug("Removing device %s", device->path); -void device_remove(const gchar *path) -{ -	GSList *l; - - 	l = g_slist_find_custom(device_list, path, - 				(GCompareFunc) device_path_cmp); - 	if (!l) - 		return; -  - 	dbus_connection_destroy_object_path(connection, path); -  - 	device_list = g_slist_remove(device_list, l->data); +	dbus_connection_destroy_object_path(connection, device->path);  } diff --git a/hcid/device.h b/hcid/device.h index 50795ba6..dc55f0a8 100644 --- a/hcid/device.h +++ b/hcid/device.h @@ -30,9 +30,6 @@ struct device {  };  gboolean device_init(DBusConnection *conn); -void device_cleanup(void); -void device_foreach(GFunc func, gpointer user_data); -struct device *device_find(const gchar *address); -const gchar *device_create(struct adapter *adapter, +struct device *device_create(struct adapter *adapter,  		const gchar *address, GSList *uuids); -void device_remove(const gchar *path); +void device_destroy(struct device *device); | 
