From 5fca83cd4aca5f276be73d99cd5ca04302bed6f3 Mon Sep 17 00:00:00 2001 From: Matt Ranostay Date: Mon, 25 Feb 2019 21:11:29 -0800 Subject: binding: bluetooth: add adapter_changes event adapter_changes event allows clients to know when an adapter's status changes as in addition or removal. Bug-AGL: SPEC-1763 Change-Id: I7a442ece7cf6b508d6290130a939fccc1bddebb9 Signed-off-by: Matt Ranostay --- binding/bluetooth-api.c | 26 +++++++++++++++++++++++--- binding/bluetooth-api.h | 8 ++++++++ binding/bluetooth-common.h | 1 + 3 files changed, 32 insertions(+), 3 deletions(-) (limited to 'binding') diff --git a/binding/bluetooth-api.c b/binding/bluetooth-api.c index 9ce0541..4c1165c 100644 --- a/binding/bluetooth-api.c +++ b/binding/bluetooth-api.c @@ -249,6 +249,9 @@ void call_work_destroy(struct call_work *cw) static afb_event_t get_event_from_value(struct bluetooth_state *ns, const char *value) { + if (!g_strcmp0(value, "adapter_changes")) + return ns->adapter_changes_event; + if (!g_strcmp0(value, "device_changes")) return ns->device_changes_event; @@ -305,18 +308,27 @@ static void bluez_devices_signal_callback( GVariant *val = NULL; if (g_strcmp0(key, BLUEZ_DEVICE_INTERFACE) && - g_strcmp0(key, BLUEZ_MEDIATRANSPORT_INTERFACE)) + g_strcmp0(key, BLUEZ_MEDIATRANSPORT_INTERFACE) && + g_strcmp0(key, BLUEZ_ADAPTER_INTERFACE)) continue; array1 = g_variant_iter_new(var); while (g_variant_iter_next(array1, "{&sv}", &name, &val)) { - if (!g_strcmp0(key, BLUEZ_DEVICE_INTERFACE)) + if (!g_strcmp0(key, BLUEZ_DEVICE_INTERFACE)) { ret = device_property_dbus2json(jobj, name, val, &is_config, &error); - else + } else if (!g_strcmp0(key, BLUEZ_MEDIATRANSPORT_INTERFACE)) { ret = mediatransport_property_dbus2json(jobj, name, val, &is_config, &error); + } else if (!g_strcmp0(key, BLUEZ_ADAPTER_INTERFACE)) { + ret = adapter_property_dbus2json(jobj, + name, val, &is_config, &error); + event = ns->adapter_changes_event; + } else { + ret = TRUE; + } + g_variant_unref(val); if (!ret) { AFB_DEBUG("%s property %s - %s", @@ -383,6 +395,12 @@ static void bluez_devices_signal_callback( json_object_object_add(jresp, "type", json_object_new_string("playback")); event = ns->media_event; + /* adapter removal */ + } else if (split_length(path) == 4) { + json_object_object_add(jresp, "action", + json_object_new_string("removed")); + event = ns->adapter_changes_event; + /* device removal */ } else if (split_length(path) == 5) { json_object_object_add(jresp, "action", json_object_new_string("removed")); @@ -515,6 +533,8 @@ static struct bluetooth_state *bluetooth_init(GMainLoop *loop) AFB_INFO("connected to dbus"); + ns->adapter_changes_event = + afb_daemon_make_event("adapter_changes"); ns->device_changes_event = afb_daemon_make_event("device_changes"); ns->media_event = diff --git a/binding/bluetooth-api.h b/binding/bluetooth-api.h index 31418ae..6b24d13 100644 --- a/binding/bluetooth-api.h +++ b/binding/bluetooth-api.h @@ -194,6 +194,14 @@ static inline gboolean device_property_dbus2json(json_object *jprop, jprop, key, var, is_config, error); } +static inline gboolean adapter_property_dbus2json(json_object *jprop, + const gchar *key, GVariant *var, gboolean *is_config, + GError **error) +{ + return bluez_property_dbus2json(BLUEZ_AT_ADAPTER, + jprop, key, var, is_config, error); +} + static inline gboolean agent_property_dbus2json(json_object *jprop, const gchar *key, GVariant *var, gboolean *is_config, GError **error) diff --git a/binding/bluetooth-common.h b/binding/bluetooth-common.h index 8b21656..5ff1c27 100644 --- a/binding/bluetooth-common.h +++ b/binding/bluetooth-common.h @@ -40,6 +40,7 @@ struct bluetooth_state { guint device_sub; guint autoconnect_sub; + afb_event_t adapter_changes_event; afb_event_t device_changes_event; afb_event_t media_event; afb_event_t agent_event; -- cgit 1.2.3-korg