summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Ranostay <matt.ranostay@konsulko.com>2018-10-30 11:39:25 -0700
committerMatt Ranostay <matt.ranostay@konsulko.com>2018-11-23 08:49:14 -0800
commitc19902405ebe92a17efe041cae9a3584c3b182e5 (patch)
treef0135d733f77a938bac29a64a24d9e2f3afed421
parent9796db317ac252bd99584471421fb757a19d23d3 (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>
-rw-r--r--README.md14
-rw-r--r--binding/bluetooth-api.c36
-rw-r--r--binding/bluetooth-bluez.c1
-rw-r--r--binding/bluetooth-common.h2
-rw-r--r--binding/bluetooth-util.c15
5 files changed, 60 insertions, 8 deletions
diff --git a/README.md b/README.md
index 5e206cd..6634b43 100644
--- a/README.md
+++ b/README.md
@@ -116,13 +116,13 @@ This verb allows an client to get initial paired devices, and discovered unpaire
adapter_state verb allows setting and retrieving of requested adapter settings:
-| Name | Description |
-|-----------------|------------------------------------------------------------------|
-| adapter | Must be the name of the adapter (i.e. hci0) |
-| discovery | Discover nearby broadcasting devices |
-| discoverable | Allow other devices to detect this device |
-| powered | Adapter power state (optional, rfkill should be disabled already |
-
+| Name | Description |
+|-----------------|------------------------------------------------------------------------|
+| adapter | Must be the name of the adapter (i.e. hci0) |
+| discovery | Discover nearby broadcasting devices |
+| discoverable | Allow other devices to detect this device |
+| powered | Adapter power state (optional, rfkill should be disabled already) |
+| filter | Display devices only with respective UUIDS listed (write only setting) |
### connect/disconnect verbs
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);
}
diff --git a/binding/bluetooth-bluez.c b/binding/bluetooth-bluez.c
index 7640046..37c4469 100644
--- a/binding/bluetooth-bluez.c
+++ b/binding/bluetooth-bluez.c
@@ -147,6 +147,7 @@ void bluez_decode_call_error(struct bluetooth_state *ns,
} else if (!strcmp(method, "StartDiscovery") ||
!strcmp(method, "StopDiscovery") ||
+ !strcmp(method, "SetDiscoveryFilter") ||
!strcmp(method, "RegisterAgent")) {
g_clear_error(error);
diff --git a/binding/bluetooth-common.h b/binding/bluetooth-common.h
index bd64f83..e6fb97a 100644
--- a/binding/bluetooth-common.h
+++ b/binding/bluetooth-common.h
@@ -114,6 +114,8 @@ void json_process_path(json_object *jresp, const char *path);
gchar *return_bluez_path(afb_req_t request);
+gchar **json_array_to_strv(json_object *jobj);
+
/**
* Structure for converting from dbus properties to json
* and vice-versa.
diff --git a/binding/bluetooth-util.c b/binding/bluetooth-util.c
index f57b43e..21aae6c 100644
--- a/binding/bluetooth-util.c
+++ b/binding/bluetooth-util.c
@@ -1051,3 +1051,18 @@ gchar *return_bluez_path(afb_req_t request) {
return g_strconcat("/org/bluez/", adapter, "/", device, NULL);
}
+
+gchar **json_array_to_strv(json_object *jobj)
+{
+ int len = json_object_array_length(jobj);
+ gchar **val = g_malloc0(sizeof(gchar *) * (len + 1));
+ int i;
+
+ for (i = 0; i < len; i++) {
+ json_object *jstr = json_object_array_get_idx(jobj, i);
+ const char *str = json_object_get_string(jstr);
+ val[i] = g_strdup(str);
+ }
+
+ return val;
+}