Fix adapter state mismatch issue 37/286337/4 accepted/tizen/unified/20230109.151000
authorWootak Jung <wootak.jung@samsung.com>
Thu, 5 Jan 2023 02:34:43 +0000 (11:34 +0900)
committerWootak Jung <wootak.jung@samsung.com>
Thu, 5 Jan 2023 04:56:31 +0000 (13:56 +0900)
if bt-service crashed, adapter disabled event is coming.
but, right after receiving the event, adapter state is enabled
add service available check logic

Change-Id: I729b10c5fa0b0a4971c4bd37c60836acac8c1c96
Signed-off-by: Wootak Jung <wootak.jung@samsung.com>
bt-api/bt-adapter.c
bt-service/services/bt-request-handler.c
include/bt-internal-types.h

index ee839db..55d58e0 100644 (file)
@@ -71,13 +71,91 @@ static int __bt_fill_device_list(GArray *out_param2, GPtrArray **dev_list)
        return BLUETOOTH_ERROR_NONE;
 }
 
+static gboolean __bt_get_check_service_available()
+{
+       GDBusConnection *service_gconn;
+       GDBusProxy *proxy;
+       GError *err = NULL;
+       GArray *in_param5 = NULL;
+       GVariant *ret, *param1, *param2, *param3, *param4, *param5;
+
+       service_gconn = _bt_get_system_common_conn();
+       if (!service_gconn)
+               return FALSE;
+
+       /* G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START
+        * method call will be failed not auto activation
+        * if service is unavailble. */
+       proxy = g_dbus_proxy_new_sync(service_gconn,
+                       G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, NULL,
+                       BT_DBUS_NAME,
+                       BT_SERVICE_PATH,
+                       BT_DBUS_NAME,
+                       NULL, &err);
+       if (!proxy) {
+               if (err) {
+                        BT_ERR("Unable to create proxy: %s", err->message);
+                        g_clear_error(&err);
+               }
+
+               return FALSE;
+       }
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       in_param5 = g_array_new(TRUE, TRUE, sizeof(gchar));
+
+       param1 = g_variant_new_from_data((const GVariantType *)"ay",
+                       in_param1->data, in_param1->len,
+                       TRUE, NULL, NULL);
+       param2 = g_variant_new_from_data((const GVariantType *)"ay",
+                       in_param2->data, in_param2->len,
+                       TRUE, NULL, NULL);
+       param3 = g_variant_new_from_data((const GVariantType *)"ay",
+                       in_param3->data, in_param3->len,
+                       TRUE, NULL, NULL);
+       param4 = g_variant_new_from_data((const GVariantType *)"ay",
+                       in_param4->data, in_param4->len,
+                       TRUE, NULL, NULL);
+       param5 = g_variant_new_from_data((const GVariantType *)"ay",
+                       in_param5->data, in_param5->len,
+                       TRUE, NULL, NULL);
+
+       ret = g_dbus_proxy_call_sync(proxy, "service_request",
+                       g_variant_new("(iii@ay@ay@ay@ay@ay)",
+                                       BT_BLUEZ_SERVICE, BT_CHECK_AVAILABLE,
+                                       BT_SYNC_REQ, param1,
+                                       param2, param3,
+                                       param4, param5),
+                       G_DBUS_CALL_FLAGS_NONE, -1,
+                       NULL, &err);
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+       g_array_free(in_param5, TRUE);
+
+       if (ret == NULL) {
+               if (err) {
+                       BT_ERR("D-Bus API failure: errCode[%x], message[%s]",
+                                       err->code, err->message);
+                       g_clear_error(&err);
+               }
+               BT_ERR("bt-service is unavailable");
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
 BT_EXPORT_API int bluetooth_check_adapter(void)
 {
 #ifndef TIZEN_BLUEDROID_PORTING
        int ret;
+       gboolean is_service_avail;
        ret = _bt_get_adapter_path(_bt_get_system_common_conn(), NULL);
-       return ret == BLUETOOTH_ERROR_NONE ? BLUETOOTH_ADAPTER_ENABLED :
-                                               BLUETOOTH_ADAPTER_DISABLED;
+       is_service_avail = __bt_get_check_service_available();
+       return (ret == BLUETOOTH_ERROR_NONE && is_service_avail) ?
+                       BLUETOOTH_ADAPTER_ENABLED : BLUETOOTH_ADAPTER_DISABLED;
 #else
        int value = VCONFKEY_BT_STATUS_OFF;
 
index 9b5d5b2..c088620 100644 (file)
@@ -499,6 +499,11 @@ int __bt_bluez_request(int function_name,
        char *sender = NULL;
 
        switch (function_name) {
+       case BT_CHECK_AVAILABLE: {
+               int available = true;
+               g_array_append_vals(*out_param1, &available, sizeof(int));
+               break;
+       }
        case BT_ENABLE_ADAPTER: {
                result = _bt_enable_adapter();
                _bt_adapter_start_enable_timer();
@@ -5717,6 +5722,7 @@ gboolean __bt_service_check_privilege(int function_name,
        break;
 
        case BT_CHECK_ADAPTER:
+       case BT_CHECK_AVAILABLE:
        case BT_GET_RSSI:
 
        case BT_GET_LOCAL_NAME:
index 70cc7d3..4b7b8ce 100644 (file)
@@ -170,6 +170,7 @@ typedef enum {
 
 typedef enum {
        BT_CHECK_ADAPTER = BT_FUNC_BASE,
+       BT_CHECK_AVAILABLE,
        BT_ENABLE_ADAPTER,
        BT_DISABLE_ADAPTER,
        BT_RECOVER_ADAPTER,