diff options
author | Miao-chen Chou <mcchou@chromium.org> | 2020-09-11 23:51:27 -0700 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2020-09-14 12:38:25 -0700 |
commit | 1601b5ba301e3e9e290c9c009d944fb766bf146c (patch) | |
tree | f587a42f75e3bd0646a571beefe7b1e91fcfe124 /src/adv_monitor.c | |
parent | 0633cf2a0f0fc58e73efc2ed354c20fde463b20a (diff) | |
download | bluez-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.c | 37 |
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) }, { } }; |