client: Enable setting attribute handles
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Mon, 28 Jan 2019 18:52:23 +0000 (20:52 +0200)
committerhimanshu <h.himanshu@samsung.com>
Wed, 22 Jan 2020 13:45:29 +0000 (19:15 +0530)
This emulates application setting their attribute handles.

Change-Id: Ia5e84fbc3ed591856680fb025238b12f451f1e7c
Signed-off-by: himanshu <h.himanshu@samsung.com>
client/gatt.c
client/main.c
src/gatt-database.c

index 28e4638..4f8566b 100755 (executable)
@@ -1409,6 +1409,9 @@ void gatt_register_service(DBusConnection *conn, GDBusProxy *proxy,
        service->path = g_strdup_printf("%s/service%p", APP_PATH, service);
        service->primary = primary;
 
+       if (argc > 2)
+               service->handle = atoi(argv[2]);
+
        if (g_dbus_register_interface(conn, service->path,
                                        SERVICE_INTERFACE, NULL, NULL,
                                        service_properties, service,
@@ -1692,7 +1695,7 @@ static gboolean chrc_notify_acquired_exists(const GDBusPropertyTable *property,
 }
 
 static const GDBusPropertyTable chrc_properties[] = {
-       { "Handle", "s", chrc_get_handle, chrc_set_handle, NULL },
+       { "Handle", "q", chrc_get_handle, chrc_set_handle, NULL },
        { "UUID", "s", chrc_get_uuid, NULL, NULL },
        { "Service", "o", chrc_get_service, NULL, NULL },
        { "Value", "ay", chrc_get_value, NULL, NULL },
@@ -2288,6 +2291,9 @@ void gatt_register_chrc(DBusConnection *conn, GDBusProxy *proxy,
        chrc->flags = g_strsplit(argv[2], ",", -1);
        chrc->authorization_req = attr_authorization_flag_exists(chrc->flags);
 
+       if (argc > 3)
+               chrc->handle = atoi(argv[3]);
+
        if (g_dbus_register_interface(conn, chrc->path, CHRC_INTERFACE,
                                        chrc_methods, NULL, chrc_properties,
                                        chrc, chrc_free) == FALSE) {
@@ -2554,6 +2560,9 @@ void gatt_register_desc(DBusConnection *conn, GDBusProxy *proxy,
        desc->path = g_strdup_printf("%s/desc%p", desc->chrc->path, desc);
        desc->flags = g_strsplit(argv[2], ",", -1);
 
+       if (argc > 3)
+               desc->handle = atoi(argv[3]);
+
        if (g_dbus_register_interface(conn, desc->path, DESC_INTERFACE,
                                        desc_methods, NULL, desc_properties,
                                        desc, desc_free) == FALSE) {
index 248c23a..0ee417b 100644 (file)
@@ -2624,22 +2624,23 @@ static const struct bt_shell_menu gatt_menu = {
                                                "Register profile to connect" },
        { "unregister-application", NULL, cmd_unregister_app,
                                                "Unregister profile" },
-       { "register-service", "<UUID>", cmd_register_service,
+       { "register-service", "<UUID> [handle]", cmd_register_service,
                                        "Register application service."  },
        { "unregister-service", "<UUID/object>", cmd_unregister_service,
                                        "Unregister application service" },
-       { "register-includes", "<UUID>", cmd_register_includes,
+       { "register-includes", "<UUID> [handle]", 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...> "
-                                       , cmd_register_characteristic,
-                                       "Register application characteristic" },
+       { "register-characteristic",
+                       "<UUID> <Flags=read,write,notify...> [handle]",
+                       cmd_register_characteristic,
+                       "Register application characteristic" },
        { "unregister-characteristic", "<UUID/object>",
                                cmd_unregister_characteristic,
                                "Unregister application characteristic" },
-       { "register-descriptor", "<UUID> <Flags=read,write...>",
+       { "register-descriptor", "<UUID> <Flags=read,write...> [handle]",
                                        cmd_register_descriptor,
                                        "Register application descriptor" },
        { "unregister-descriptor", "<UUID/object>",
index 6db9366..4a656a8 100644 (file)
@@ -2199,17 +2199,16 @@ static bool parse_handle(GDBusProxy *proxy, uint16_t *handle)
 {
        DBusMessageIter iter;
 
+       *handle = 0;
+
        /* Handle property is optional */
-       if (!g_dbus_proxy_get_property(proxy, "Handle", &iter)) {
-               *handle = 0;
+       if (!g_dbus_proxy_get_property(proxy, "Handle", &iter))
                return true;
-       }
-
 
        if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_UINT16)
                return false;
 
-       dbus_message_iter_get_basic(&iter, &handle);
+       dbus_message_iter_get_basic(&iter, handle);
 
        return true;
 }
@@ -3172,6 +3171,7 @@ static bool database_add_desc(struct external_service *service,
 {
        uint16_t handle;
        bt_uuid_t uuid;
+       char str[MAX_LEN_UUID_STR];
 
        if (!parse_handle(desc->proxy, &handle)) {
                error("Failed to read \"Handle\" property of descriptor");
@@ -3200,6 +3200,10 @@ static bool database_add_desc(struct external_service *service,
                write_handle(desc->proxy, handle);
        }
 
+       bt_uuid_to_string(&uuid, str, sizeof(str));
+
+       DBG("handle 0x%04x UUID %s", handle, str);
+
        return true;
 }
 
@@ -3357,6 +3361,7 @@ static bool database_add_chrc(struct external_service *service,
 {
        uint16_t handle;
        bt_uuid_t uuid;
+       char str[MAX_LEN_UUID_STR];
        const struct queue_entry *entry;
 
        if (!parse_handle(chrc->proxy, &handle)) {
@@ -3399,6 +3404,10 @@ static bool database_add_chrc(struct external_service *service,
                write_handle(chrc->proxy, handle);
        }
 
+       bt_uuid_to_string(&uuid, str, sizeof(str));
+
+       DBG("handle 0x%04x UUID %s", handle, str);
+
        /* Handle the descriptors that belong to this characteristic. */
        for (entry = queue_get_entries(service->descs); entry;
                                                        entry = entry->next) {
@@ -3447,6 +3456,7 @@ static bool database_add_service(struct external_service *service)
        bool primary;
        uint16_t handle;
        const struct queue_entry *entry;
+       char str[MAX_LEN_UUID_STR];
 
        if (!parse_uuid(service->proxy, &uuid)) {
                error("Failed to read \"UUID\" property of service");
@@ -3479,6 +3489,10 @@ static bool database_add_service(struct external_service *service)
                write_handle(service->proxy, handle);
        }
 
+       bt_uuid_to_string(&uuid, str, sizeof(str));
+
+       DBG("handle 0x%04x UUID %s", handle, str);
+
        database_add_includes(service);
 
        entry = queue_get_entries(service->chrcs);