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