Hi, On Tue, May 15, 2018 at 8:39 PM Avichal Agarwal <avichal.a@xxxxxxxxxxx> wrote: > ping > -----Original Message----- > From: linux-bluetooth-owner@xxxxxxxxxxxxxxx [mailto: linux-bluetooth-owner@xxxxxxxxxxxxxxx] On Behalf Of Avichal Agarwal > Sent: Friday, April 13, 2018 2:23 PM > To: linux-bluetooth@xxxxxxxxxxxxxxx > Cc: sachin.dev@xxxxxxxxxxx; anupam.r@xxxxxxxxxxx; Avichal Agarwal > Subject: [PATCH Bluez] client/gatt : Add support for Included Service > included service support implemented at service registration > --- > client/gatt.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > client/gatt.h | 5 ++ > client/main.c | 20 ++++++++ > 3 files changed, 172 insertions(+) > diff --git a/client/gatt.c b/client/gatt.c index 80c1243..b762b4f 100644 > --- a/client/gatt.c > +++ b/client/gatt.c > @@ -85,6 +85,7 @@ struct service { > char *uuid; > bool primary; > GList *chrcs; > + GList *inc; > }; > static GList *local_services; > @@ -127,6 +128,29 @@ static void print_service(struct service *service, const char *description) > service->path, service->uuid, text); } > +static void print_inc_service(struct service *service, const char > +*description) { > + const char *text; > + > + text = bt_uuidstr_to_str(service->uuid); > + if (!text) > + bt_shell_printf("%s%s%s%s Included Service\n\t%s\n\t%s\n", > + description ? "[" : "", > + description ? : "", > + description ? "] " : "", > + service->primary ? "Primary" : > + "Secondary", > + service->path, service->uuid); > + else > + bt_shell_printf("%s%s%s%s Included Service\n\t%s\n\t%s\n\t%s\n", > + description ? "[" : "", > + description ? : "", > + description ? "] " : "", > + service->primary ? "Primary" : > + "Secondary", > + service->path, service->uuid, text); } > + > static void print_service_proxy(GDBusProxy *proxy, const char *description) { > struct service service; > @@ -1153,11 +1177,19 @@ static void chrc_unregister(void *data) > CHRC_INTERFACE); > } > +static void inc_unregister(void *data) > +{ > + char *path = data; > + > + g_free(path); > +} > + > static void service_free(void *data) > { > struct service *service = data; > g_list_free_full(service->chrcs, chrc_unregister); > + g_list_free_full(service->inc, inc_unregister); > g_free(service->path); > g_free(service->uuid); > g_free(service); > @@ -1186,9 +1218,53 @@ static gboolean service_get_primary(const GDBusPropertyTable *property, > return TRUE; > } > + > +static gboolean service_get_includes(const GDBusPropertyTable *property, > + DBusMessageIter *iter, void *data) { > + DBusMessageIter array; > + struct service *service = data; > + char *inc = NULL; > + GList *l; > + > + if (service->inc) { > + for (l = service->inc ; l; l = g_list_next(l)) { > + > + inc = l->data; > + dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, > + DBUS_TYPE_OBJECT_PATH_AS_STRING, &array); > + > + dbus_message_iter_append_basic(&array, DBUS_TYPE_OBJECT_PATH, > + &inc); > + > + } > + > + dbus_message_iter_close_container(iter, &array); > + > + return TRUE; > + } > + > + return FALSE; > + > +} > + > +static gboolean service_exist_includes(const GDBusPropertyTable *property, > + void *data) > +{ > + struct service *service = data; > + > + if (service->inc) > + return TRUE; > + else > + return FALSE; > + > +} > + > + > static const GDBusPropertyTable service_properties[] = { > { "UUID", "s", service_get_uuid }, > { "Primary", "b", service_get_primary }, > + { "Includes", "ao", service_get_includes, NULL, service_exist_includes }, > { } > }; > @@ -1280,6 +1356,77 @@ void gatt_unregister_service(DBusConnection *conn, GDBusProxy *proxy, > return bt_shell_noninteractive_quit(EXIT_SUCCESS); > } > +static char *inc_find(struct service *serv, char *path) { > + GList *lc; > + > + for (lc = serv->inc; lc; lc = g_list_next(lc)) { > + char *incp = lc->data; > + /* match object path */ > + if (!strcmp(incp, path)) > + return incp; > + } > + > + return NULL; > +} > + > +void gatt_register_include(DBusConnection *conn, GDBusProxy *proxy, > + int argc, char *argv[]) > +{ > + struct service *service, *inc_service; > + char *inc_path; > + > + if (!local_services) { > + bt_shell_printf("No service registered\n"); > + return bt_shell_noninteractive_quit(EXIT_FAILURE); > + } > + > + service = g_list_last(local_services)->data; > + > + > + inc_service = service_find(argv[1]); > + if (!inc_service) { > + bt_shell_printf("Failed to find service object\n"); > + return bt_shell_noninteractive_quit(EXIT_FAILURE); > + } > + > + inc_path = g_strdup(service->path); > + > + inc_service->inc = g_list_append(inc_service->inc, inc_path); > + > + print_service(inc_service, COLORED_NEW); > + print_inc_service(service, COLORED_NEW); > + > + return bt_shell_noninteractive_quit(EXIT_SUCCESS); > +} > + > +void gatt_unregister_include(DBusConnection *conn, GDBusProxy *proxy, > + int argc, char *argv[]) > +{ > + struct service *ser_inc, *service; > + char *path = NULL; > + > + service = service_find(argv[1]); > + if (!service) { > + bt_shell_printf("Failed to unregister include service object\n"); > + return bt_shell_noninteractive_quit(EXIT_FAILURE); > + } > + > + ser_inc = service_find(argv[2]); > + if (!ser_inc) { > + bt_shell_printf("Failed to find include service object\n"); > + return bt_shell_noninteractive_quit(EXIT_FAILURE); > + } > + > + path = inc_find(service, ser_inc->path); > + if (path) { > + service->inc = g_list_remove(service->inc, path); > + inc_unregister(path); > + } > + > + return bt_shell_noninteractive_quit(EXIT_SUCCESS); > +} > + > static gboolean chrc_get_uuid(const GDBusPropertyTable *property, > DBusMessageIter *iter, void *data) { diff --git a/client/gatt.h b/client/gatt.h index f4c36b8..d169552 100644 > --- a/client/gatt.h > +++ b/client/gatt.h > @@ -65,3 +65,8 @@ void gatt_register_desc(DBusConnection *conn, GDBusProxy *proxy, > int argc, char *argv[]); > void gatt_unregister_desc(DBusConnection *conn, GDBusProxy *proxy, > int argc, char *argv[]); > + > +void gatt_register_include(DBusConnection *conn, GDBusProxy *proxy, > + int argc, char *argv[]); > +void gatt_unregister_include(DBusConnection *conn, GDBusProxy *proxy, > + int argc, char *argv[]); > diff --git a/client/main.c b/client/main.c index b96278d..9d0220d 100644 > --- a/client/main.c > +++ b/client/main.c > @@ -2000,6 +2000,22 @@ static void cmd_register_service(int argc, char *argv[]) > gatt_register_service(dbus_conn, default_ctrl->proxy, argc, argv); } > +static void cmd_register_includes(int argc, char *argv[]) { > + if (check_default_ctrl() == FALSE) > + return bt_shell_noninteractive_quit(EXIT_FAILURE); > + > + gatt_register_include(dbus_conn, default_ctrl->proxy, argc, argv); } > + > +static void cmd_unregister_includes(int argc, char *argv[]) { > + if (check_default_ctrl() == FALSE) > + return bt_shell_noninteractive_quit(EXIT_FAILURE); > + > + gatt_unregister_include(dbus_conn, default_ctrl->proxy, argc, argv); } > + > static void cmd_unregister_service(int argc, char *argv[]) { > if (check_default_ctrl() == FALSE) > @@ -2436,6 +2452,10 @@ static const struct bt_shell_menu gatt_menu = { > "Register application service." }, > { "unregister-service", "<UUID/object>", cmd_unregister_service, > "Unregister application service" }, > + { "register-includes", "<UUID>", cmd_register_includes, > + "Register as Included service in." }, > + { "unregister-includes", "<Service-UUID><Inc-UUID>", cmd_unregister_includes, > + "Unregister Included service." }, > { "register-characteristic", "<UUID> <Flags=read,write,notify...> " > "[authorize]", cmd_register_characteristic, > "Register application characteristic" }, > -- > 2.7.4 This has code style problems: WARNING:LONG_LINE: line over 80 characters #81: FILE: client/gatt.c:1261: + DBUS_TYPE_OBJECT_PATH_AS_STRING, &array); WARNING:LONG_LINE: line over 80 characters #83: FILE: client/gatt.c:1263: + dbus_message_iter_append_basic(&array, DBUS_TYPE_OBJECT_PATH, WARNING:LONG_LINE: line over 80 characters #84: FILE: client/gatt.c:1264: + &inc); WARNING:LONG_LINE: line over 80 characters #113: FILE: client/gatt.c:1293: + { "Includes", "ao", service_get_includes, NULL, service_exist_includes }, WARNING:LONG_LINE_STRING: line over 80 characters #173: FILE: client/gatt.c:1437: + bt_shell_printf("Failed to unregister include service object\n"); WARNING:LONG_LINE: line over 80 characters #241: FILE: client/main.c:2472: + { "unregister-includes", "<Service-UUID><Inc-UUID>", cmd_unregister_includes, WARNING:LONG_LINE: line over 80 characters #242: FILE: client/main.c:2473: + "Unregister Included service." }, -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html