Disconnect HID device service when HID profile is removed. 60/98160/1 accepted/tizen/common/20161117.085347 accepted/tizen/common/20161118.090639 accepted/tizen/ivi/20161121.012013 accepted/tizen/mobile/20161121.011732 accepted/tizen/tv/20161121.011827 accepted/tizen/wearable/20161121.011917 submit/tizen/20161117.015745 submit/tizen/20161118.002314
authorDeokhyun Kim <dukan.kim@samsung.com>
Wed, 16 Nov 2016 05:49:42 +0000 (14:49 +0900)
committerDoHyun Pyun <dh79.pyun@samsung.com>
Wed, 16 Nov 2016 09:11:40 +0000 (18:11 +0900)
 - Even though App which registered HID device profile is terminated abnoramlly,
   HID is still connected. If trying to connect HID again then it fails always.
 - A profile of device structure & a profile registered by App are different.
   A profile of device structure maintains connceted status.
 - If a HID profile registered by App is removed in status of connected,
   disconnect the connection of the profile intentionally.

Change-Id: Ic507032ba46e864e23c142177d9a7ba35ebe5d15
Signed-off-by: Deokhyun Kim <dukan.kim@samsung.com>
src/device.c

index f032f75..4b9b3d2 100644 (file)
@@ -5866,8 +5866,27 @@ void device_remove_profile(gpointer a, gpointer b)
        GSList *l;
 
        l = find_service_with_profile(device->services, profile);
+#ifdef TIZEN_BT_HID_DEVICE_ENABLE
+       if (l == NULL) {
+               if (g_strcmp0(profile->local_uuid , HID_DEVICE_UUID) == 0) {
+                       l = find_service_with_uuid(device->services,
+                                       HID_DEVICE_UUID);
+                       service = l->data;
+
+                       if (btd_service_get_state(service) ==
+                               BTD_SERVICE_STATE_CONNECTED) {
+                               int err;
+                               err = btd_service_disconnect(service);
+                               if (err)
+                                       error("error: %s", strerror(-err));
+                       }
+               }
+               return;
+       }
+#else
        if (l == NULL)
                return;
+#endif
 
        service = l->data;
        device->services = g_slist_delete_link(device->services, l);