[OTP] Handle GattConnected event 01/142101/3
authorGowtham Anandha Babu <gowtham.ab@samsung.com>
Wed, 2 Aug 2017 12:06:21 +0000 (17:36 +0530)
committerGowtham Anandha Babu <gowtham.ab@samsung.com>
Thu, 3 Aug 2017 06:50:08 +0000 (12:20 +0530)
Change-Id: I3002836c52408c0e8c9697adcb6cc247e209ded9
Signed-off-by: Gowtham Anandha Babu <gowtham.ab@samsung.com>
bt-otp/bt-otpserver.c
bt-otp/bt-otpserver.h

index 5095f87..4de7302 100644 (file)
@@ -64,6 +64,7 @@ static GDBusConnection *g_conn;
 static int property_sub_id = -1;
 static int adapter_sub_id = -1;
 static int device_sub_id = -1;
+static int device_property_sub_id = -1;
 static guint g_owner_id = 0;
 static guint server_watch_id = 0;
 
@@ -1048,9 +1049,9 @@ fail:
 static bool __bt_oacp_create_timeout_cb(gpointer user_data)
 {
        /* Delete the EMPTY object */
-       oacp_create = FALSE;
+       BT_INFO("+");
        _bt_otp_restore_old_object();
-       return TRUE;
+       return FALSE;
 }
 
 static void _bt_otp_free_oacp_op()
@@ -1197,6 +1198,7 @@ void _bt_otp_restore_old_object()
 
        index = 0;
        object = _bt_otp_client_find_object(otp_object_list, prev_obj_id, &index);
+       oacp_create = FALSE;
        update_obj_metadata_charc_value(object);
        selected_object = object;
        curr_obj_index = index;
@@ -1777,7 +1779,7 @@ static struct otp_char_info *otp_get_char_value(const char *path)
        return NULL;
 }
 
-int _bt_otp_read_cb(const char *obj_path, char **value, int *len)
+int _bt_otp_read_cb(const char *obj_path, char **value, int *len, uint16_t offset)
 {
        struct otp_char_info *info = NULL;
 
@@ -1804,7 +1806,10 @@ int _bt_otp_read_cb(const char *obj_path, char **value, int *len)
                if (info->char_value == NULL || info->value_length == 0)
                        return BLUETOOTH_ATT_ERROR_INTERNAL;
 
-               *len = info->value_length;
+               if (offset > info->value_length)
+                       return BLUETOOTH_ATT_ERROR_INVALID_OFFSET;
+
+               *len = info->value_length - offset;
                *value = (char *)malloc(sizeof(char)*(*len));
                memcpy(*value, info->char_value, *len);
 
@@ -1971,7 +1976,7 @@ void _bt_otp_gatt_char_property_changed_event(GVariant *msg,
                        g_variant_get(var, "(&s&s&syq)", &char_path,
                                        &svc_handle, &addr, &req_id, &offset);
 
-                       result = _bt_otp_read_cb(char_path, &value, &len);
+                       result = _bt_otp_read_cb(char_path, &value, &len, offset);
 
                        if (result != BLUETOOTH_ATT_ERROR_NONE) {
                                BT_ERR("ReadValue failed %s", char_path);
@@ -2074,6 +2079,51 @@ void _bt_otc_disconnected_cb(GDBusConnection *connection,
        }
 }
 
+void _bt_otp_device_property_event_filter(GDBusConnection *connection,
+                                       const gchar *sender_name,
+                                       const gchar *object_path,
+                                       const gchar *interface_name,
+                                       const gchar *signal_name,
+                                       GVariant *parameters,
+                                       gpointer user_data)
+{
+       char *interfacename = NULL;
+       GVariant *val = NULL;
+
+       g_variant_get(parameters, "(&s@a{sv}@as)", &interfacename, &val, NULL);
+
+       if (strcasecmp(interfacename, BT_DEVICE_INTERFACE) == 0) {
+               GVariantIter value_iter;
+               GVariant *val1;
+               char *property = NULL;
+
+               g_variant_iter_init(&value_iter, val);
+               while ((g_variant_iter_loop(&value_iter, "{sv}", &property, &val1))) {
+                       if (strcasecmp(property, "GattConnected") == 0) {
+                               gboolean gatt_connected = FALSE;
+                               char *address = NULL;
+
+                               g_variant_get(val1, "b", &gatt_connected);
+
+                               address = g_malloc0(BT_ADDRESS_STRING_SIZE);
+
+                               _bt_convert_device_path_to_address(object_path, address);
+
+                               BT_DBG("gatt_connected: %d", gatt_connected);
+                               BT_DBG("address: %s", address);
+                               if (!gatt_connected) {
+                                       if (oacp_create)
+                                               _bt_otp_restore_old_object();
+
+                                       if (oacp_create_timeout_id > 0)
+                                               g_source_remove(oacp_create_timeout_id);
+                               }
+                               g_free(address);
+                       }
+               }
+       }
+}
+
 int _bt_otp_init_event_receiver()
 {
        BT_DBG("+");
@@ -2110,6 +2160,12 @@ int _bt_otp_init_event_receiver()
                                        _bt_otc_disconnected_cb,
                                        NULL, NULL);
 
+       device_property_sub_id = g_dbus_connection_signal_subscribe(conn,
+                               NULL, BT_PROPERTIES_INTERFACE,
+                               PROPERTIES_CHANGED, NULL, NULL, 0,
+                               _bt_otp_device_property_event_filter,
+                               NULL, NULL);
+
        BT_DBG("-");
        return 0;
 }
@@ -2121,6 +2177,7 @@ void _bt_otp_deinit_event_receiver(void)
        g_dbus_connection_signal_unsubscribe(conn, property_sub_id);
        g_dbus_connection_signal_unsubscribe(conn, adapter_sub_id);
        g_dbus_connection_signal_unsubscribe(conn, device_sub_id);
+       g_dbus_connection_signal_unsubscribe(conn, device_property_sub_id);
        conn = NULL;
 
        BT_DBG("-");
index 0a80eb0..e72bc4e 100755 (executable)
@@ -27,6 +27,7 @@
 #define BT_MANAGER_INTERFACE "org.freedesktop.DBus.ObjectManager"
 #define BT_BLUEZ_NAME "org.bluez"
 #define BT_DEVICE_INTERFACE "org.bluez.Device1"
+#define BT_PROPERTIES_INTERFACE "org.freedesktop.DBus.Properties"
 
 #define BT_OTC_INTERFACE_NAME  "org.projectx.otc_channel"
 
 #define OTP_CP_CCC_DESC_UUID           "2902"
 
 /* OTP Object Type Custom UUIDs */
-/* In SIG Assigned numbers not available */
-#define UNSUPPORTED_OBJECT_TYPE_UUID   "000019aa-0000-1001-8000-00805f9b34fb"
-#define FIRMWARE_UUID                  "000019ab-0000-1001-8000-00805f9b34fb"
-#define ROUTE_GPX_UUID                 "000019ac-0000-1001-8000-00805f9b34fb"
-#define TRACK_GPX_UUID                 "000019ad-0000-1001-8000-00805f9b34fb"
+/* SIG has not defined any UUID so far */
+#define UNSUPPORTED_OBJECT_TYPE_UUID   "00007fb0-0000-1001-8000-00805f9b34fb"
+#define FIRMWARE_UUID                  "00007fb1-0000-1001-8000-00805f9b34fb"
+#define ROUTE_GPX_UUID                 "00007fb2-0000-1001-8000-00805f9b34fb"
+#define TRACK_GPX_UUID                 "00007fb3-0000-1001-8000-00805f9b34fb"
 
 /* Object Metadata Length */
 #define OTP_FEATURE_LENGTH             8