diff --git a/src/gatt-database.c b/src/gatt-database.c
index c7b2223..d4dd661 100644
--- a/src/gatt-database.c
+++ b/src/gatt-database.c
ccc_cb_free);
}
-static bool match_service_path(const void *a, const void *b)
+struct svc_match_data {
+ const char *path;
+ const char *sender;
+};
+
+static bool match_service(const void *a, const void *b)
{
const struct external_service *service = a;
- const char *path = b;
+ const struct svc_match_data *data = b;
- return g_strcmp0(service->path, path) == 0;
+ return g_strcmp0(service->path, data->path) == 0 &&
+ g_strcmp0(service->owner, data->sender) == 0;
}
static gboolean service_free_idle_cb(void *data)
DBusMessage *msg, void *user_data)
{
struct btd_gatt_database *database = user_data;
+ const char *sender = dbus_message_get_sender(msg);
DBusMessageIter args;
const char *path;
struct external_service *service;
+ struct svc_match_data match_data;
if (!dbus_message_iter_init(msg, &args))
return btd_error_invalid_args(msg);
dbus_message_iter_get_basic(&args, &path);
- if (queue_find(database->services, match_service_path, path))
+ match_data.path = path;
+ match_data.sender = sender;
+
+ if (queue_find(database->services, match_service, &match_data))
return btd_error_already_exists(msg);
dbus_message_iter_next(&args);
static DBusMessage *manager_unregister_service(DBusConnection *conn,
DBusMessage *msg, void *user_data)
{
- DBG("UnregisterService");
+ struct btd_gatt_database *database = user_data;
+ const char *sender = dbus_message_get_sender(msg);
+ const char *path;
+ DBusMessageIter args;
+ struct external_service *service;
+ struct svc_match_data match_data;
- /* TODO */
- return NULL;
+ if (!dbus_message_iter_init(msg, &args))
+ return btd_error_invalid_args(msg);
+
+ if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_OBJECT_PATH)
+ return btd_error_invalid_args(msg);
+
+ dbus_message_iter_get_basic(&args, &path);
+
+ match_data.path = path;
+ match_data.sender = sender;
+
+ service = queue_remove_if(database->services, match_service,
+ &match_data);
+ if (!service)
+ return btd_error_does_not_exist(msg);
+
+ service_free(service);
+
+ return dbus_message_new_method_return(msg);
}
static const GDBusMethodTable manager_methods[] = {