From 020f5a684116b25941a5911a9b1430e077e0c628 Mon Sep 17 00:00:00 2001 From: Wootak Jung Date: Fri, 6 Jan 2023 13:58:37 +0900 Subject: [PATCH] Change the adapter state check logic Change-Id: If283fa348962eec9a175119ff1e9e2c6880697db Signed-off-by: Wootak Jung --- bt-api/bt-adapter.c | 86 +++---------------- bt-api/bt-request-sender.c | 136 +++++++++++++++++++++++++++++++ bt-api/include/bt-request-sender.h | 12 +++ bt-service/services/bt-request-handler.c | 6 -- include/bt-internal-types.h | 1 - 5 files changed, 158 insertions(+), 83 deletions(-) diff --git a/bt-api/bt-adapter.c b/bt-api/bt-adapter.c index 55d58e0..76ab25e 100644 --- a/bt-api/bt-adapter.c +++ b/bt-api/bt-adapter.c @@ -71,91 +71,25 @@ static int __bt_fill_device_list(GArray *out_param2, GPtrArray **dev_list) return BLUETOOTH_ERROR_NONE; } -static gboolean __bt_get_check_service_available() +BT_EXPORT_API int bluetooth_check_adapter(void) { - 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; - } +#ifndef TIZEN_BLUEDROID_PORTING + int result; + bluetooth_adapter_state_t state = BLUETOOTH_ADAPTER_DISABLED; 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); + result = _bt_send_request_not_autostart(BT_BLUEZ_SERVICE, BT_CHECK_ADAPTER, + in_param1, in_param2, in_param3, in_param4, &out_param); - 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; + if (result == BLUETOOTH_ERROR_NONE) { + state = g_array_index(out_param, bluetooth_adapter_state_t, 0); } - return TRUE; -} + BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); -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); - is_service_avail = __bt_get_check_service_available(); - return (ret == BLUETOOTH_ERROR_NONE && is_service_avail) ? - BLUETOOTH_ADAPTER_ENABLED : BLUETOOTH_ADAPTER_DISABLED; + return state ? BLUETOOTH_ADAPTER_ENABLED : BLUETOOTH_ADAPTER_DISABLED; #else int value = VCONFKEY_BT_STATUS_OFF; diff --git a/bt-api/bt-request-sender.c b/bt-api/bt-request-sender.c index bbfd821..d98d939 100644 --- a/bt-api/bt-request-sender.c +++ b/bt-api/bt-request-sender.c @@ -35,6 +35,7 @@ static GSList *sending_requests; static GDBusProxy *service_gproxy; +static GDBusProxy *service_gproxy_not_autostart; static GDBusProxy *__bt_gdbus_init_service_proxy(void) { @@ -67,11 +68,50 @@ static GDBusProxy *__bt_gdbus_init_service_proxy(void) return proxy; } +static GDBusProxy *__bt_gdbus_init_service_proxy_not_autostart(void) +{ + GDBusConnection *service_gconn; + GDBusProxy *proxy; + GError *err = NULL; + + service_gconn = _bt_get_system_common_conn(); + + if (!service_gconn) + return NULL; + + /* 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 NULL; + } + + service_gproxy_not_autostart = proxy; + + return proxy; +} + static GDBusProxy *__bt_gdbus_get_service_proxy(void) { return (service_gproxy) ? service_gproxy : __bt_gdbus_init_service_proxy(); } +static GDBusProxy *__bt_gdbus_get_service_proxy_not_autostart(void) +{ + return (service_gproxy_not_autostart) ? service_gproxy_not_autostart : __bt_gdbus_init_service_proxy_not_autostart(); +} + void _bt_gdbus_deinit_proxys(void) { if (service_gproxy) { @@ -945,3 +985,99 @@ int _bt_sync_send_request_with_unix_fd_list( return result; } + +int _bt_sync_send_request_not_autostart(int service_type, int service_function, + GArray *in_param1, GArray *in_param2, + GArray *in_param3, GArray *in_param4, + GArray **out_param1) +{ + int result = BLUETOOTH_ERROR_NONE; + GError *error = NULL; + GArray *in_param5 = NULL; +// GArray *out_param2 = NULL; + + GDBusProxy *proxy; + GVariant *ret; + GVariant *param1; + GVariant *param2; + GVariant *param3; + GVariant *param4; + GVariant *param5; + + switch (service_type) { + case BT_BLUEZ_SERVICE: + case BT_OBEX_SERVICE: + case BT_AGENT_SERVICE: + case BT_CHECK_PRIVILEGE: + proxy = __bt_gdbus_get_service_proxy_not_autostart(); + if (!proxy) + return BLUETOOTH_ERROR_INTERNAL; + + 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)", + service_type, service_function, + BT_SYNC_REQ, param1, + param2, param3, + param4, param5), + G_DBUS_CALL_FLAGS_NONE, -1, + NULL, &error); + + g_array_free(in_param5, TRUE); + + if (ret == NULL) { + if (error != NULL) + g_clear_error(&error); + BT_DBG("bt-service is not available"); + return BLUETOOTH_ERROR_INTERNAL; + } + + param1 = NULL; +// param2 = NULL; + + g_variant_get(ret, "(iv)", &result, ¶m1); + + if (param1) { + *out_param1 = g_array_new(TRUE, TRUE, sizeof(gchar)); + __bt_fill_garray_from_variant(param1, *out_param1); + g_variant_unref(param1); + } + +// if (param2) { +// out_param2 = g_array_new(TRUE, TRUE, sizeof(gchar)); +// __bt_fill_garray_from_variant(param2, out_param2); +// result = g_array_index(out_param2, int, 0); +// g_variant_unref(param2); +// g_array_free(out_param2, TRUE); +// } else { +// result = BLUETOOTH_ERROR_INTERNAL; +// } + + g_variant_unref(ret); + break; + default: + BT_ERR("Unknown service type"); + return BLUETOOTH_ERROR_INTERNAL; + } + + return result; +} diff --git a/bt-api/include/bt-request-sender.h b/bt-api/include/bt-request-sender.h index bc5599b..647cf82 100644 --- a/bt-api/include/bt-request-sender.h +++ b/bt-api/include/bt-request-sender.h @@ -98,6 +98,18 @@ int _bt_async_send_request_with_unix_fd_list(int service_type, int service_funct } \ ) +int _bt_sync_send_request_not_autostart(int service_type, int service_function, + GArray *in_param1, GArray *in_param2, + GArray *in_param3, GArray *in_param4, + GArray **out_param1); + +/* The caller of this should pass #define macro/enum types as the first two params */ +#define _bt_send_request_not_autostart(a, b, format ...) ( \ + { \ + _bt_sync_send_request_not_autostart(a, b, format); \ + } \ + ) + #ifdef __cplusplus } #endif diff --git a/bt-service/services/bt-request-handler.c b/bt-service/services/bt-request-handler.c index c088620..9b5d5b2 100644 --- a/bt-service/services/bt-request-handler.c +++ b/bt-service/services/bt-request-handler.c @@ -499,11 +499,6 @@ 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(); @@ -5722,7 +5717,6 @@ 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: diff --git a/include/bt-internal-types.h b/include/bt-internal-types.h index 4b7b8ce..70cc7d3 100644 --- a/include/bt-internal-types.h +++ b/include/bt-internal-types.h @@ -170,7 +170,6 @@ typedef enum { typedef enum { BT_CHECK_ADAPTER = BT_FUNC_BASE, - BT_CHECK_AVAILABLE, BT_ENABLE_ADAPTER, BT_DISABLE_ADAPTER, BT_RECOVER_ADAPTER, -- 2.7.4