summaryrefslogtreecommitdiff
path: root/src/adv_monitor.c
diff options
context:
space:
mode:
authorMiao-chen Chou <mcchou@chromium.org>2020-09-11 23:51:27 -0700
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2020-09-14 12:38:25 -0700
commit1601b5ba301e3e9e290c9c009d944fb766bf146c (patch)
treef587a42f75e3bd0646a571beefe7b1e91fcfe124 /src/adv_monitor.c
parent0633cf2a0f0fc58e73efc2ed354c20fde463b20a (diff)
downloadbluez-1601b5ba301e3e9e290c9c009d944fb766bf146c.tar.gz
adv_monitor: Implement UnregisterMonitor()
This implements the UnregisterMonitor() method handler of ADV monitor manager interface. The following tests were performed. - Issue a UnregisterMonitor() call with a nonexistent path and expect org.bluez.Error.DoesNotExist as the return. - Issue a UnregisterMonitor() call with a invalid path and expect org.bluez.Error.InvalidArguments as the return. - Issue RegisterMonitor() with a path, issue UnregisterMonitor() and expect a successful method call return.
Diffstat (limited to 'src/adv_monitor.c')
-rw-r--r--src/adv_monitor.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/src/adv_monitor.c b/src/adv_monitor.c
index b9bffe9ba..d9c5c7262 100644
--- a/src/adv_monitor.c
+++ b/src/adv_monitor.c
@@ -212,13 +212,48 @@ static DBusMessage *register_monitor(DBusConnection *conn, DBusMessage *msg,
return dbus_message_new_method_return(msg);
}
+/* Handles UnregisterMonitor D-Bus call */
+static DBusMessage *unregister_monitor(DBusConnection *conn,
+ DBusMessage *msg, void *user_data)
+{
+ DBusMessageIter args;
+ struct app_match_data match;
+ struct adv_monitor_app *app;
+ struct btd_adv_monitor_manager *manager = user_data;
+
+ 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, &match.path);
+
+ if (!strlen(match.path) || !g_str_has_prefix(match.path, "/"))
+ return btd_error_invalid_args(msg);
+
+ match.owner = dbus_message_get_sender(msg);
+
+ app = queue_find(manager->apps, app_match, &match);
+ if (!app)
+ return btd_error_does_not_exist(msg);
+
+ queue_remove(manager->apps, app);
+ app_destroy(app);
+
+ btd_info(manager->adapter_id, "Path %s removed along with Adv Monitor "
+ "app %s", match.path, match.owner);
+
+ return dbus_message_new_method_return(msg);
+}
+
static const GDBusMethodTable adv_monitor_methods[] = {
{ GDBUS_EXPERIMENTAL_METHOD("RegisterMonitor",
GDBUS_ARGS({ "application", "o" }),
NULL, register_monitor) },
{ GDBUS_EXPERIMENTAL_ASYNC_METHOD("UnregisterMonitor",
GDBUS_ARGS({ "application", "o" }),
- NULL, NULL) },
+ NULL, unregister_monitor) },
{ }
};