diff options
author | Matt Ranostay <matt.ranostay@konsulko.com> | 2018-10-30 11:39:25 -0700 |
---|---|---|
committer | Matt Ranostay <matt.ranostay@konsulko.com> | 2018-11-12 03:58:47 -0800 |
commit | 5c95eff5ed022a30cd1194fe99744727691d3a48 (patch) | |
tree | a70c25d9920e9c4161d2c5f8e83d5133f47b8b7c /binding/bluetooth-api.c | |
parent | 3a53bc6731e3413b0d77ea6aabce93e3894d5d36 (diff) |
binding: bluetooth: add initial discovery filter support
Allow clients to request devices only with certain profile UUIDs to be
displayed in an discovery scan. This allows to filter out things like
location tokens, smart scales, and etc which can't possibly have a2dp
or hfp profiles for instance.
NOTE: This is a write only setting. In the future should be read/write
to see current discovery filters.
Bug-AGL: SPEC-1630
Change-Id: Ic8b18656f84ac8047b170d6e601fcc2e63786af0
Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
Diffstat (limited to 'binding/bluetooth-api.c')
-rw-r--r-- | binding/bluetooth-api.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/binding/bluetooth-api.c b/binding/bluetooth-api.c index 58c326c..5c123e3 100644 --- a/binding/bluetooth-api.c +++ b/binding/bluetooth-api.c @@ -618,7 +618,7 @@ static void bluetooth_adapter(afb_req_t request) struct bluetooth_state *ns = bluetooth_get_userdata(request); GError *error = NULL; const char *adapter = afb_req_value(request, "adapter"); - const char *scan, *discoverable, *powered; + const char *scan, *discoverable, *powered, *filter; adapter = BLUEZ_ROOT_PATH(adapter ? adapter : BLUEZ_DEFAULT_ADAPTER); @@ -665,6 +665,40 @@ static void bluetooth_adapter(afb_req_t request) } } + filter = afb_req_value(request, "filter"); + if (filter) { + json_object *jobj = json_tokener_parse(filter); + GVariantBuilder builder; + GVariant *flt, *reply; + gchar **uuid = NULL; + + if (json_object_get_type(jobj) != json_type_array) { + afb_req_fail_f(request, "failed", "invalid discovery filter"); + return; + } + + g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}")); + + uuid = json_array_to_strv(jobj); + g_variant_builder_add(&builder, "{sv}", "UUIDs", + g_variant_new_strv((const gchar * const *) uuid, -1)); + flt = g_variant_builder_end(&builder); + + reply = adapter_call(ns, adapter, "SetDiscoveryFilter", + g_variant_new("(@a{sv})", flt), &error); + + g_strfreev(uuid); + + if (!reply) { + afb_req_fail_f(request, "failed", + "adapter %s SetDiscoveryFilter error %s", + adapter, BLUEZ_ERRMSG(error)); + g_error_free(error); + return; + } + g_variant_unref(reply); + } + bluetooth_state(request); } |