From c6923a75ae058a292c725061dd13785c6306c611 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Mon, 5 Jan 2015 14:34:01 -0200 Subject: [PATCH] client: Add support for GattCharacteristic1 This add support for GattCharacteristici1 interface detection and prints when they are added or removed --- client/gatt.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ client/gatt.h | 3 +++ client/main.c | 4 ++++ 3 files changed, 73 insertions(+) diff --git a/client/gatt.c b/client/gatt.c index 7de5c7b1e..8fd113f49 100644 --- a/client/gatt.c +++ b/client/gatt.c @@ -46,6 +46,7 @@ #define COLORED_DEL COLOR_RED "DEL" COLOR_OFF static GList *services; +static GList *characteristics; static void print_service(GDBusProxy *proxy, const char *description) { @@ -88,3 +89,68 @@ void gatt_remove_service(GDBusProxy *proxy) print_service(proxy, COLORED_DEL); } + +static void print_characteristic(GDBusProxy *proxy, const char *description) +{ + DBusMessageIter iter; + const char *uuid, *text; + + if (g_dbus_proxy_get_property(proxy, "UUID", &iter) == FALSE) + return; + + dbus_message_iter_get_basic(&iter, &uuid); + + text = uuidstr_to_str(uuid); + if (!text) + text = uuid; + + rl_printf("%s%s%sCharacteristic %s %s\n", + description ? "[" : "", + description ? : "", + description ? "] " : "", + g_dbus_proxy_get_path(proxy), + text); +} + +static gboolean characteristic_is_child(GDBusProxy *characteristic) +{ + GList *l; + DBusMessageIter iter; + const char *service, *path; + + if (!g_dbus_proxy_get_property(characteristic, "Service", &iter)) + return FALSE; + + dbus_message_iter_get_basic(&iter, &service); + + for (l = services; l; l = g_list_next(l)) { + GDBusProxy *proxy = l->data; + + path = g_dbus_proxy_get_path(proxy); + + if (!strcmp(path, service)) + return TRUE; + } + + return FALSE; +} + +void gatt_add_characteristic(GDBusProxy *proxy) +{ + if (!characteristic_is_child(proxy)) + return; + + characteristics = g_list_append(characteristics, proxy); + + print_characteristic(proxy, COLORED_NEW); +} + +void gatt_remove_characteristic(GDBusProxy *proxy) +{ + if (!characteristic_is_child(proxy)) + return; + + characteristics = g_list_remove(characteristics, proxy); + + print_characteristic(proxy, COLORED_DEL); +} diff --git a/client/gatt.h b/client/gatt.h index f049039c4..924c4d9c1 100644 --- a/client/gatt.h +++ b/client/gatt.h @@ -23,3 +23,6 @@ void gatt_add_service(GDBusProxy *proxy); void gatt_remove_service(GDBusProxy *proxy); + +void gatt_add_characteristic(GDBusProxy *proxy); +void gatt_remove_characteristic(GDBusProxy *proxy); diff --git a/client/main.c b/client/main.c index ab644ba9b..3db18affe 100644 --- a/client/main.c +++ b/client/main.c @@ -338,6 +338,8 @@ static void proxy_added(GDBusProxy *proxy, void *user_data) } else if (!strcmp(interface, "org.bluez.GattService1")) { if (service_is_child(proxy)) gatt_add_service(proxy); + } else if (!strcmp(interface, "org.bluez.GattCharacteristic1")) { + gatt_add_characteristic(proxy); } } @@ -373,6 +375,8 @@ static void proxy_removed(GDBusProxy *proxy, void *user_data) } else if (!strcmp(interface, "org.bluez.GattService1")) { if (service_is_child(proxy)) gatt_remove_service(proxy); + } else if (!strcmp(interface, "org.bluez.GattCharacteristic1")) { + gatt_remove_characteristic(proxy); } } -- 2.47.3