static void __bt_bond_device_cb(GDBusProxy *proxy, GAsyncResult *res,
gpointer user_data);
-static int __bt_retry_bond(void);
-
-
/*static void __bt_decline_pair_request()
{
GVariant *out_param1;
return dev_info;
}
-char *_bt_get_bonded_device_name(char *address)
+char *_bt_get_device_name(const char *bdaddress)
{
- bluetooth_device_address_t device_address = { {0} };
- bluetooth_device_info_t dev_info;
+ char *device_path = NULL;
+ const gchar *name = NULL;
+ gchar *dev_name = NULL;
+ gsize name_len = 0;
+ GVariant *result = NULL;
+ GError *err = NULL;
+ GDBusProxy *device_proxy;
+ GDBusConnection *conn;
- retv_if(address == NULL, strdup(""));
+ retv_if(bdaddress == NULL, NULL);
- _bt_convert_addr_string_to_type(device_address.addr, address);
+ device_path = _bt_get_device_object_path((char *)bdaddress);
+ retv_if(device_path == NULL, NULL);
- memset(&dev_info, 0x00, sizeof(bluetooth_device_info_t));
+ conn = _bt_gdbus_get_system_gconn();
+ retv_if(conn == NULL, NULL);
+ INFO_SECURE("Device_path %s", device_path);
+ device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+ NULL, BT_BLUEZ_NAME, device_path,
+ BT_PROPERTIES_INTERFACE, NULL, &err);
+
+ g_free(device_path);
+ retv_if(device_proxy == NULL, NULL);
+
+ result = g_dbus_proxy_call_sync(device_proxy, "Get",
+ g_variant_new("(ss)", BT_DEVICE_INTERFACE, "Alias"),
+ G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
+ if (err) {
+ BT_ERR("DBus Error : %s", err->message);
+ g_clear_error(&err);
+ } else {
+ GVariant *value;
+ g_variant_get(result, "(v)", &value);
+ name = g_variant_get_string(value, &name_len);
+ INFO_SECURE("Alias Name [%s]", name);
+ if (name_len)
+ dev_name = g_strdup(name);
+ g_variant_unref(value);
+ g_variant_unref(result);
+ }
- _bt_get_bonded_device_info(&device_address, &dev_info);
+ if (name_len == 0) {
+ GVariant *value;
+ result = g_dbus_proxy_call_sync(device_proxy, "Get",
+ g_variant_new("(ss)", BT_DEVICE_INTERFACE, "Name"),
+ G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
+ if (err) {
+ ERR("DBus Error : %s", err->message);
+ g_clear_error(&err);
+ } else {
+ g_variant_get(result, "(v)", &value);
+ name = g_variant_get_string(value, &name_len);
+ INFO_SECURE("Name = %s", name);
+ if (name_len)
+ dev_name = g_strdup(name);
+ g_variant_unref(value);
+ g_variant_unref(result);
+ }
+ }
- return g_strdup(dev_info.device_name.name);
+ g_object_unref(device_proxy);
+ return dev_name;
}
static gboolean __ignore_auto_pairing_request(const char *address)
return BLUETOOTH_ERROR_NONE;
}
-static int __bt_retry_bond(void)
-{
- BT_CHECK_PARAMETER(bonding_info, return);
- BT_CHECK_PARAMETER(bonding_info->addr, return);
-
- g_dbus_proxy_call(bonding_info->device_proxy, "Pair",
- g_variant_new("(y)", bonding_info->conn_type),
- G_DBUS_CALL_FLAGS_NONE,
- BT_MAX_DBUS_TIMEOUT,
- NULL,
- (GAsyncReadyCallback)__bt_bond_device_cb,
- NULL);
-
- return BLUETOOTH_ERROR_NONE;
-}
-
-
-static int __bt_remove_and_bond(void)
-{
- GDBusProxy *adapter_proxy;
- GVariant *result = NULL;
- GError *err = NULL;
- char *device_path = NULL;
-
- BT_CHECK_PARAMETER(bonding_info, return);
- BT_CHECK_PARAMETER(bonding_info->addr, return);
-
- adapter_proxy = _bt_get_adapter_proxy();
- retv_if(adapter_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
-
- result = g_dbus_proxy_call_sync(adapter_proxy, "FindDevice",
- g_variant_new("(s)", bonding_info->addr),
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- NULL);
- if (result == NULL)
- return BLUETOOTH_ERROR_INTERNAL;
-
- g_variant_get(result , "(o)", &device_path);
- g_variant_unref(result);
-
- retv_if(device_path == NULL, BLUETOOTH_ERROR_INTERNAL);
-
- result = g_dbus_proxy_call_sync(adapter_proxy, "UnpairDevice",
- g_variant_new("(o)", device_path),
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- &err);
- g_free(device_path);
- if (err != NULL) {
- BT_ERR("UnpairDevice Fail: %s", err->message);
- g_error_free(err);
- return BLUETOOTH_ERROR_INTERNAL;
- }
-
- return __bt_retry_bond();
-}
-
-static int __bt_cancel_and_bond(void)
-{
- int ret = BLUETOOTH_ERROR_NONE;
-
- ret = _bt_agent_reply_cancellation();
- if (ret != BLUETOOTH_ERROR_NONE) {
- BT_ERR("Fail to call reply cancellation");
- return ret;
- }
- return __bt_retry_bond();
-}
-
-
static void __bt_bond_device_cb(GDBusProxy *proxy, GAsyncResult *res,
gpointer user_data)
{
GVariant *out_param1;
request_info_t *req_info;
bluetooth_device_info_t dev_info;
- bt_remote_dev_info_t *remote_dev_info;
- GVariant *manufacture_data;
- GVariant *param;
/* Terminate ALL system popup */
syspopup_destroy_all();
BT_ERR("Error occured in CreateBonding [%s]", err->message);
if (g_strrstr(err->message, "Already Exists")) {
- BT_INFO("Existing Bond, remove and retry");
- ret_if(__bt_remove_and_bond() == BLUETOOTH_ERROR_NONE);
-
- result = BLUETOOTH_ERROR_PARING_FAILED;
+ BT_INFO("Existing Bond");
+ result = BLUETOOTH_ERROR_ALREADY_CONNECT;
} else if (_bt_agent_is_canceled() ||
g_strrstr(err->message, "Authentication Canceled")) {
BT_INFO("Cancelled by USER");
BT_INFO("REJECTED");
result = BLUETOOTH_ERROR_ACCESS_DENIED;
} else if (g_strrstr(err->message, "In Progress")) {
- BT_INFO("Bond in progress, cancel and retry");
- ret_if(__bt_cancel_and_bond() == BLUETOOTH_ERROR_NONE);
-
- result = BLUETOOTH_ERROR_PARING_FAILED;
+ BT_INFO("Bond in progress");
+ result = BLUETOOTH_ERROR_IN_PROGRESS;
} else if (g_strrstr(err->message, "Authentication Failed")) {
BT_INFO("Authentication Failed");
if (bonding_info->is_autopair == TRUE) {
goto dbus_return;
}
- remote_dev_info = _bt_get_remote_device_info(bonding_info->addr);
- if (!remote_dev_info)
- goto dbus_return;
-
- GVariant *uuids = NULL;
- GVariantBuilder *builder = NULL;
- int i = 0;
- builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
- for (i = 0; i < remote_dev_info->uuid_count; i++) {
- g_variant_builder_add(builder, "s",
- remote_dev_info->uuids[i]);
- }
- uuids = g_variant_new("as", builder);
- g_variant_builder_unref(builder);
- manufacture_data = g_variant_new_from_data((const GVariantType *)"ay",
- remote_dev_info->manufacturer_data, remote_dev_info->manufacturer_data_len,
- TRUE, NULL, NULL);
-
- param = g_variant_new("(isunsbub@asn@ay)",
- result,
- bonding_info->addr,
- remote_dev_info->class,
- remote_dev_info->rssi,
- remote_dev_info->name,
- remote_dev_info->paired,
- remote_dev_info->connected,
- remote_dev_info->trust,
- uuids,
- remote_dev_info->manufacturer_data_len,
- manufacture_data);
-
-
- /* Send the event to application */
- _bt_send_event(BT_ADAPTER_EVENT,
- BLUETOOTH_EVENT_BONDING_FINISHED,
- param);
-
- _bt_free_device_info(remote_dev_info);
-
dbus_return:
if (req_info->context == NULL)
goto done;
g_timeout_add(1000, __bt_connect_le_timer_cb, NULL);
return BLUETOOTH_ERROR_NONE;
+ } else if (ret != BLUETOOTH_ERROR_NOT_IN_OPERATION) {
+ BT_ERR("Unable to hold advertising");
}
- BT_ERR("Unable to hold advertising");
-
return __bt_connect_le_device_internal(req_id, bd_addr, auto_connect);
}
return BLUETOOTH_ERROR_NONE;
}
+int _bt_disconnect_all(char *address)
+{
+ int ret = BLUETOOTH_ERROR_NONE;
+ char *object_path;
+ GDBusProxy *proxy;
+ GDBusConnection *conn;
+ GVariant *result = NULL;
+ GError *err = NULL;
+
+ BT_DBG("");
+ conn = _bt_gdbus_get_system_gconn();
+ retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+ object_path = _bt_get_device_object_path(address);
+ retv_if(object_path == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+ proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+ NULL, BT_BLUEZ_NAME,
+ object_path, BT_DEVICE_INTERFACE, NULL, NULL);
+ g_free(object_path);
+ retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+ result = g_dbus_proxy_call_sync(proxy, "Disconnect",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1, NULL,
+ &err);
+
+ if (err != NULL) {
+ BT_ERR("Dbus Call Error:[%s]", err->message);
+ g_error_free(err);
+ ret = BLUETOOTH_ERROR_INTERNAL;
+ }
+
+ g_object_unref(proxy);
+ if (result)
+ g_variant_unref(result);
+
+ return ret;
+}
+
int _bt_disconnect_profile(char *address, char *uuid,
void *cb, gpointer func_data)
{
BT_CHECK_PARAMETER(device_address, return);
- BT_INFO("Sender %s, Min interval: %f, Max interval: %f, Latency: %u, Supervision timeout: %u",
+ BT_DBG("Sender %s, Min interval: %f, Max interval: %f, Latency: %u, Supervision timeout: %u",
sender, interval_min, interval_max, latency, time_out);
if (interval_min > interval_max ||
BT_DBG("ATT MTU : %d", *mtu);
g_variant_unref(value);
g_variant_unref(result);
+
+ if (*mtu == 0) {
+ g_object_unref(device_proxy);
+ return BLUETOOTH_ERROR_NOT_CONNECTED;
+ }
}
g_object_unref(device_proxy);
G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
if (result == NULL) {
BT_ERR("Failed to get device ID address");
+
+ ret = BLUETOOTH_ERROR_INTERNAL;
if (error != NULL) {
+ g_dbus_error_strip_remote_error(error);
BT_ERR("Error occured in Proxy call [%s]", error->message);
+ if (g_strcmp0(error->message, "Does Not Exist") == 0)
+ ret = BLUETOOTH_ERROR_NOT_PAIRED;
g_error_free(error);
}
g_object_unref(device_proxy);
- return BLUETOOTH_ERROR_INTERNAL;
+ return ret;
}
g_variant_get(result , "(&s)", &idaddress);
- if (idaddress == NULL) {
- BT_ERR("No paired device");
- ret = BLUETOOTH_ERROR_NOT_PAIRED;
- } else {
- DBG_SECURE("ID Address : %s", idaddress);
- _bt_convert_addr_string_to_type(id_address->addr, idaddress);
- }
+
+ DBG_SECURE("ID Address : %s", idaddress);
+ _bt_convert_addr_string_to_type(id_address->addr, idaddress);
g_variant_unref(result);
g_object_unref(device_proxy);