/*
- * Bluetooth-frwk
- *
- * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact: Hocheol Seo <hocheol.seo@samsung.com>
- * Girishashok Joshi <girish.joshi@samsung.com>
- * Chanyeol Park <chanyeol.park@samsung.com>
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include <string.h>
#include <malloc.h>
#include <stacktrim.h>
-#include <syspopup_caller.h>
#include <vconf.h>
-#include <package-manager.h>
-
-#ifdef TIZEN_NETWORK_TETHERING_ENABLE
-#include <tethering.h>
-#endif
+#include <bundle_internal.h>
#include "bt-internal-types.h"
#include "bt-service-common.h"
#include "bt-service-device.h"
#include "bt-service-audio.h"
+#ifdef TIZEN_FEATURE_BT_DPM
+#include "bt-service-dpm.h"
+#endif
+
#define BT_APP_AUTHENTICATION_TIMEOUT 35
#define BT_APP_AUTHORIZATION_TIMEOUT 15
#define GN_UUID "00001117-0000-1000-8000-00805f9b34fb"
#define BNEP_UUID "0000000f-0000-1000-8000-00805f9b34fb"
#define HID_UUID "00001124-0000-1000-8000-00805f9b34fb"
+#define HID_DEVICE_UUID "00001124-0000-1000-8000-00805f9b43bf"
#define SAP_UUID_OLD "a49eb41e-cb06-495c-9f4f-bb80a90cdf00"
#define SAP_UUID_NEW "a49eb41e-cb06-495c-9f4f-aa80a90cdf4a"
+#define IOTIVITY_UUID "12341234-1C25-481F-9DFB-59193D238280"
#define BT_AGENT_OBJECT "/org/bluez/agent/frwk_agent"
#define BT_AGENT_SIGNAL_RFCOMM_AUTHORIZE "RfcommAuthorize"
#define BT_AGENT_SIGNAL_OBEX_AUTHORIZE "ObexAuthorize"
-#define BT_PIN_MAX_LENGTH 16
#define BT_PASSKEY_MAX_LENGTH 4
#define BT_AGENT_SYSPOPUP_TIMEOUT_FOR_MULTIPLE_POPUPS 200
#define BT_AGENT_SYSPOPUP_MAX_ATTEMPT 3
#define BT_PAN_MAX_CONNECTION 4
+
extern guint nap_connected_device_count;
+static char *passkey_watcher;
+
+#define G_VARIANT_UNREF(variant) \
+ g_variant_unref(variant); \
+ variant = NULL
+
static int __bt_agent_is_auto_response(uint32_t dev_class, const gchar *address,
const gchar *name);
static gboolean __bt_agent_is_hid_keyboard(uint32_t dev_class);
stack_trim();
}
-static gboolean __bt_agent_system_popup_timer_cb(gpointer user_data)
+static GVariant *__bt_service_getall(GDBusProxy *device, const char *interface)
{
- int ret;
- static int retry_count;
- bundle *b = (bundle *)user_data;
- retv_if(user_data == NULL, FALSE);
-
- ++retry_count;
-
- ret = syspopup_launch("bt-syspopup", b);
- if (ret < 0) {
- BT_ERR("Sorry! Can't launch popup, ret=%d, Re-try[%d] time..",
- ret, retry_count);
- if (retry_count >= BT_AGENT_SYSPOPUP_MAX_ATTEMPT) {
- BT_ERR("Sorry!! Max retry %d reached", retry_count);
- bundle_free(b);
- retry_count = 0;
- return FALSE;
- }
- } else {
- BT_DBG("Hurray!! Finally Popup launched");
- retry_count = 0;
- bundle_free(b);
- }
-
- return (ret < 0) ? TRUE : FALSE;
-}
-
-#ifdef TIZEN_WEARABLE
-static void __bt_unbond_cb(DBusGProxy *proxy, DBusGProxyCall *call,
- gpointer user_data)
-{
- GError *err = NULL;
-
- dbus_g_proxy_end_call(proxy, call, &err, G_TYPE_INVALID);
- if (err != NULL) {
- BT_ERR("Error occured in RemoveBonding [%s]\n", err->message);
- g_error_free(err);
- return;
- }
-
- BT_INFO("Unbonding is done");
- return;
-}
-
-static gboolean __bt_unpair_device(void)
-{
- GArray *device_list;
- int no_of_device;
- int i;
-
- device_list = g_array_new(FALSE, FALSE, sizeof(gchar));
- if (device_list == NULL) {
- BT_ERR("g_array_new is failed");
- return FALSE;
- }
-
- if (_bt_get_bonded_devices(&device_list) != BLUETOOTH_ERROR_NONE) {
- BT_ERR("_bt_get_bonded_devices is failed");
- g_array_free(device_list, TRUE);
- return FALSE;
- }
-
- no_of_device = device_list->len / sizeof(bluetooth_device_info_t);
- for (i = 0; i < no_of_device; i++) {
- DBusGProxy *adapter_proxy;
- bluetooth_device_info_t info;
- char addr[BT_ADDRESS_STRING_SIZE] = { 0 };
- char *device_path = NULL;
-
- info = g_array_index(device_list, bluetooth_device_info_t, i);
- if (info.device_class.major_class ==
- BLUETOOTH_DEVICE_MAJOR_CLASS_AUDIO)
- continue;
-
- adapter_proxy = _bt_get_adapter_proxy();
- if (!adapter_proxy) {
- BT_ERR("adapter_proxy is NULL");
- g_array_free(device_list, TRUE);
- return FALSE;
- }
-
- _bt_convert_addr_type_to_string(addr, info.device_address.addr);
- device_path = _bt_get_device_object_path(addr);
- if (device_path == NULL) {
- BT_ERR("device_path is NULL");
- g_array_free(device_list, TRUE);
- return FALSE;
- }
-
- if (!dbus_g_proxy_begin_call(adapter_proxy, "UnpairDevice",
- (DBusGProxyCallNotify)__bt_unbond_cb,
- NULL, NULL,
- DBUS_TYPE_G_OBJECT_PATH, device_path,
- G_TYPE_INVALID)) {
- BT_ERR("RemoveBonding begin failed\n");
- g_array_free(device_list, TRUE);
- return FALSE;
+ GError *error = NULL;
+ GVariant *reply;
+
+ reply = g_dbus_proxy_call_sync(device,
+ "GetAll", g_variant_new("(s)", interface),
+ G_DBUS_CALL_FLAGS_NONE, -1,
+ NULL, &error);
+ if (reply == NULL) {
+ ERR("GetAll dBUS-RPC failed");
+ if (error) {
+ ERR("D-Bus API failure: errCode[%x], message[%s]",
+ error->code, error->message);
+ g_clear_error(&error);
}
- BT_INFO("unbonding %s is requested", addr);
-
- g_array_free(device_list, TRUE);
- return TRUE;
- }
-
- g_array_free(device_list, TRUE);
- return FALSE;
-}
-
-static DBusHandlerResult __bt_popup_event_filter(DBusConnection *conn,
- DBusMessage *msg, void *data)
-{
- int response;
-
- BT_DBG("+");
-
- if (msg == NULL)
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
- if (!dbus_message_is_signal(msg, "User.Bluetooth.syspopup", "ResetResponse"))
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
- if (!dbus_message_get_args(msg, NULL,
- DBUS_TYPE_INT32, &response,
- DBUS_TYPE_INVALID)) {
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
- }
-
- BT_DBG("response = %d", response);
-
- BT_DBG("-");
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static void __bt_register_popup_event_signal(void)
-{
- DBusError dbus_error;
- DBusGConnection *gconn;
- DBusConnection *conn;
-
- BT_DBG("+\n");
-
- gconn = _bt_get_system_gconn();
- if (gconn == NULL)
- return;
-
- conn = dbus_g_connection_get_connection(gconn);
- if (conn == NULL)
- return;
-
- dbus_connection_add_filter(conn, __bt_popup_event_filter, NULL, NULL);
-
- dbus_error_init(&dbus_error);
- dbus_bus_add_match(conn,
- "type='signal',interface='User.Bluetooth.syspopup'"
- ",member='ResetResponse'", &dbus_error);
- if (dbus_error_is_set(&dbus_error)) {
- BT_ERR("Error: %s\n", dbus_error.message);
- dbus_error_free(&dbus_error);
- return;
+ return NULL;
}
- BT_DBG("-\n");
- return;
+ return reply;
}
-static gboolean __is_reset_required(const gchar *address)
+static gboolean __pincode_request(GapAgentPrivate *agent, GDBusProxy *device)
{
- GArray *device_list;
- uint32_t no_of_device;
- uint32_t i;
- bluetooth_device_info_t info;
- gboolean is_required = FALSE;
-
- device_list = g_array_new(FALSE, FALSE, sizeof(gchar));
- if (device_list == NULL) {
- BT_ERR("g_array_new is failed");
- return FALSE;
- }
-
- if (_bt_get_bonded_devices(&device_list) != BLUETOOTH_ERROR_NONE) {
- BT_ERR("_bt_get_bonded_devices is failed");
- g_array_free(device_list, TRUE);
- return FALSE;
- }
-
- no_of_device = device_list->len / sizeof(bluetooth_device_info_t);
- for (i = 0; i < no_of_device; i++) {
- char addr[BT_ADDRESS_STRING_SIZE] = { 0 };
-
- info = g_array_index(device_list, bluetooth_device_info_t, i);
-
- _bt_convert_addr_type_to_string(addr, info.device_address.addr);
- if (g_strcmp0(address, addr) == 0) {
- BT_DBG("This device is already in paired list");
- is_required = FALSE;
- break;
- }
-
- if (info.device_class.major_class != BLUETOOTH_DEVICE_MAJOR_CLASS_AUDIO) {
- is_required = TRUE;
- break;
- }
- }
- g_array_free(device_list, TRUE);
-
- return is_required;
-}
+ uint32_t device_class;
+ gchar *address = NULL;
+ unsigned char auth_info[5] = {0, };
+ gchar *name = NULL;
+ GVariant *reply = NULL;
+ GVariant *reply_temp = NULL;
+ GVariant *tmp_value;
+ char pin_code[BLUETOOTH_PIN_CODE_MAX_LENGTH + 1];
+ int ret = BLUETOOTH_ERROR_NONE;
+#ifdef TIZEN_FEATURE_BT_DPM
+ int pairing_state = DPM_STATUS_ERROR;
#endif
-int _bt_launch_system_popup(bt_agent_event_type_t event_type,
- const char *device_name,
- char *passkey,
- const char *filename,
- const char *agent_path)
-{
- int ret;
- bundle *b;
- char event_str[BT_MAX_EVENT_STR_LENGTH + 1];
+ BT_DBG("+");
- b = bundle_create();
- if (!b) {
- BT_ERR("Launching system popup failed");
- return -1;
+#ifdef TIZEN_FEATURE_BT_DPM
+ _bt_dpm_get_bluetooth_pairing_state(&pairing_state);
+ if (pairing_state == DPM_RESTRICTED) {
+ BT_ERR("Not allow to pair the device");
+ gap_agent_reply_confirmation(agent, GAP_AGENT_REJECT, NULL);
+ __bt_agent_release_memory();
+ return TRUE;
}
-
- bundle_add(b, "device-name", device_name);
- bundle_add(b, "passkey", passkey);
- bundle_add(b, "file", filename);
- bundle_add(b, "agent-path", agent_path);
-
- switch (event_type) {
- case BT_AGENT_EVENT_PIN_REQUEST:
- g_strlcpy(event_str, "pin-request", sizeof(event_str));
- break;
-
- case BT_AGENT_EVENT_PASSKEY_CONFIRM_REQUEST:
- g_strlcpy(event_str, "passkey-confirm-request",
- sizeof(event_str));
- break;
-
- case BT_AGENT_EVENT_PASSKEY_REQUEST:
- g_strlcpy(event_str, "passkey-request", sizeof(event_str));
- break;
-
- case BT_AGENT_EVENT_PASSKEY_DISPLAY_REQUEST:
- g_strlcpy(event_str, "passkey-display-request",
- sizeof(event_str));
- break;
-
- case BT_AGENT_EVENT_AUTHORIZE_REQUEST:
- g_strlcpy(event_str, "authorize-request",
- sizeof(event_str));
- break;
-
- case BT_AGENT_EVENT_CONFIRM_MODE_REQUEST:
- g_strlcpy(event_str, "confirm-mode-request",
- sizeof(event_str));
- break;
-
- case BT_AGENT_EVENT_FILE_RECEIVED:
- g_strlcpy(event_str, "file-received", sizeof(event_str));
- break;
-
- case BT_AGENT_EVENT_KEYBOARD_PASSKEY_REQUEST:
- g_strlcpy(event_str, "keyboard-passkey-request",
- sizeof(event_str));
- break;
-
- case BT_AGENT_EVENT_TERMINATE:
- g_strlcpy(event_str, "terminate", sizeof(event_str));
- break;
-
- case BT_AGENT_EVENT_EXCHANGE_REQUEST:
- g_strlcpy(event_str, "exchange-request", sizeof(event_str));
- break;
-
- case BT_AGENT_EVENT_PBAP_REQUEST:
- g_strlcpy(event_str, "phonebook-request", sizeof(event_str));
- break;
-
- case BT_AGENT_EVENT_MAP_REQUEST:
- g_strlcpy(event_str, "message-request", sizeof(event_str));
- break;
-
-#ifdef TIZEN_WEARABLE
- case BT_AGENT_EVENT_SYSTEM_RESET_REQUEST:
- __bt_register_popup_event_signal();
- g_strlcpy(event_str, "system-reset-request", sizeof(event_str));
- break;
#endif
- case BT_AGENT_EVENT_LEGACY_PAIR_FAILED_FROM_REMOTE:
- g_strlcpy(event_str, "remote-legacy-pair-failed", sizeof(event_str));
- break;
+ reply_temp = __bt_service_getall(device, BT_DEVICE_INTERFACE);
- default:
- BT_ERR("Invalid event type");
- bundle_free(b);
- return -1;
-
- }
-
- bundle_add(b, "event-type", event_str);
-
- ret = syspopup_launch("bt-syspopup", b);
- if (0 > ret) {
- BT_ERR("Popup launch failed...retry %d", ret);
-
- g_timeout_add(BT_AGENT_SYSPOPUP_TIMEOUT_FOR_MULTIPLE_POPUPS,
- (GSourceFunc)__bt_agent_system_popup_timer_cb, b);
- } else {
- bundle_free(b);
- }
-
- BT_INFO("_bt_agent_launch_system_popup");
- return 0;
-}
-
-static gboolean __pincode_request(GapAgent *agent, DBusGProxy *device)
-{
- uint32_t device_class;
- GHashTable *hash = NULL;
- GValue *value;
- const gchar *address;
- const gchar *name;
- GError *error = NULL;
-
- BT_INFO("+");
-
- dbus_g_proxy_call(device, "GetAll", &error,
- G_TYPE_STRING, BT_DEVICE_INTERFACE,
- G_TYPE_INVALID,
- dbus_g_type_get_map("GHashTable", G_TYPE_STRING,
- G_TYPE_VALUE), &hash, G_TYPE_INVALID);
- if (error) {
- BT_ERR("error in GetBasicProperties [%s]\n", error->message);
- g_error_free(error);
+ if (reply_temp == NULL) {
gap_agent_reply_pin_code(agent, GAP_AGENT_REJECT, "",
- NULL);
+ NULL);
goto done;
}
- value = g_hash_table_lookup(hash, "Class");
- device_class = value ? g_value_get_uint(value) : 0;
+ g_variant_get(reply_temp, "(@a{sv})", &reply); /* Format of reply a{sv}*/
- value = g_hash_table_lookup(hash, "Address");
- address = value ? g_value_get_string(value) : NULL;
+ tmp_value = g_variant_lookup_value(reply, "Class", G_VARIANT_TYPE_UINT32);
+ g_variant_get(tmp_value, "u", &device_class);
+ G_VARIANT_UNREF(tmp_value);
+
+ tmp_value = g_variant_lookup_value(reply, "Address", G_VARIANT_TYPE_STRING);
+ g_variant_get(tmp_value, "s", &address);
+ G_VARIANT_UNREF(tmp_value);
if (!address) {
gap_agent_reply_pin_code(agent, GAP_AGENT_REJECT, "", NULL);
goto done;
}
- value = g_hash_table_lookup(hash, "Name");
- name = value ? g_value_get_string(value) : NULL;
- if (!name)
- name = address;
+ tmp_value = g_variant_lookup_value(reply, "Name", G_VARIANT_TYPE_STRING);
+ g_variant_get(tmp_value, "s", &name);
+ G_VARIANT_UNREF(tmp_value);
+ if (!name) {
+ BT_DBG("Replacing the name with address");
+ name = g_strdup(address);
+ } else {
+ BT_INFO("Name = %s, Address = %s, Class = 0x%x", name, address, device_class);
+ if (name[0] == '\0') {
+ g_free(name);
+ BT_DBG("Name[0]=NULL, Replacing the name with address");
+ name = g_strdup(address);
+ }
+ }
+ __bt_get_auth_info(reply, (char *)auth_info);
if (_bt_is_device_creating() == TRUE &&
_bt_is_bonding_device_address(address) == TRUE &&
__bt_agent_is_auto_response(device_class, address, name)) {
- /* Use Fixed PIN "0000" for basic pairing*/
+ BT_DBG("0000 Auto Pair");
+ /* Use Fixed PIN "0000" for basic pairing */
_bt_set_autopair_status_in_bonding_info(TRUE);
gap_agent_reply_pin_code(agent, GAP_AGENT_ACCEPT, "0000",
NULL);
} else if (__bt_agent_is_hid_keyboard(device_class)) {
+ BT_DBG("HID Keyboard");
char str_passkey[BT_PASSKEY_MAX_LENGTH + 1] = { 0 };
if (__bt_agent_generate_passkey(str_passkey,
gap_agent_reply_pin_code(agent, GAP_AGENT_ACCEPT,
str_passkey, NULL);
- _bt_launch_system_popup(BT_AGENT_EVENT_KEYBOARD_PASSKEY_REQUEST,
- name, str_passkey, NULL,
- _gap_agent_get_path(agent));
+ if (headed_plugin_info->plugin_headed_enabled) {
+ headed_plugin_info->headed_plugin->bt_launch_system_popup(BT_AGENT_EVENT_KEYBOARD_PASSKEY_REQUEST,
+ name, auth_info, str_passkey, NULL, _gap_agent_get_path(agent));
+ } else {
+ GVariant *param = NULL;
+ param = g_variant_new("(isss)", ret, address, name, str_passkey);
+ _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY, param);
+ }
+ } else if (_bt_get_device_pin_code(address, pin_code)
+ == BLUETOOTH_ERROR_NONE) {
+ BT_DBG("Use stored PIN code(%s)", pin_code);
+ gap_agent_reply_pin_code(agent, GAP_AGENT_ACCEPT, pin_code,
+ NULL);
+ goto done;
} else {
- _bt_launch_system_popup(BT_AGENT_EVENT_PIN_REQUEST, name, NULL,
- NULL, _gap_agent_get_path(agent));
+ if (headed_plugin_info->plugin_headed_enabled) {
+ BT_DBG("Show Pin entry");
+ headed_plugin_info->headed_plugin->bt_launch_system_popup(BT_AGENT_EVENT_PIN_REQUEST, name, auth_info,
+ NULL, NULL, _gap_agent_get_path(agent));
+ } else {
+ BT_INFO("Plugin Headed not Enabled");
+ GVariant *param = NULL;
+ param = g_variant_new("(iss)", ret, address, name);
+ _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_PIN_REQUEST, param);
+ }
}
done:
- g_hash_table_destroy(hash);
+ g_variant_unref(reply);
+ g_variant_unref(reply_temp);
+ g_free(address);
+ g_free(name);
__bt_agent_release_memory();
-
BT_DBG("-");
return TRUE;
}
-static gboolean __passkey_request(GapAgent *agent, DBusGProxy *device)
+static gboolean __passkey_request(GapAgentPrivate *agent, GDBusProxy *device)
{
- GHashTable *hash = NULL;
- GValue *value;
- const gchar *address;
- const gchar *name;
- GError *error = NULL;
+ gchar *address = NULL;
+ gchar *name = NULL;
+ unsigned char auth_info[5] = {0, };
+ GVariant *reply = NULL;
+ GVariant *reply_temp = NULL;
+ GVariant *tmp_value;
+ int ret = BLUETOOTH_ERROR_NONE;
+#ifdef TIZEN_FEATURE_BT_DPM
+ int pairing_state = DPM_STATUS_ERROR;
+#endif
BT_DBG("+");
- dbus_g_proxy_call(device, "GetAll", &error,
- G_TYPE_STRING, BT_DEVICE_INTERFACE,
- G_TYPE_INVALID,
- dbus_g_type_get_map("GHashTable", G_TYPE_STRING,
- G_TYPE_VALUE), &hash, G_TYPE_INVALID);
- if (error) {
- BT_ERR("error in GetBasicProperties [%s]\n", error->message);
- g_error_free(error);
+#ifdef TIZEN_FEATURE_BT_DPM
+ _bt_dpm_get_bluetooth_pairing_state(&pairing_state);
+ if (pairing_state == DPM_RESTRICTED) {
+ BT_ERR("Not allow to pair the device");
+ gap_agent_reply_confirmation(agent, GAP_AGENT_REJECT, NULL);
+ __bt_agent_release_memory();
+ return TRUE;
+ }
+#endif
+
+ reply_temp = __bt_service_getall(device, BT_DEVICE_INTERFACE);
+
+ if (reply_temp == NULL) {
gap_agent_reply_pin_code(agent, GAP_AGENT_REJECT, "",
NULL);
goto done;
}
- value = g_hash_table_lookup(hash, "Address");
- address = value ? g_value_get_string(value) : NULL;
+ g_variant_get(reply_temp, "(@a{sv})", &reply); /* Format of reply a{sv}*/
+
+ tmp_value = g_variant_lookup_value(reply, "Address", G_VARIANT_TYPE_STRING);
+ g_variant_get(tmp_value, "s", &address);
+ G_VARIANT_UNREF(tmp_value);
if (!address) {
gap_agent_reply_pin_code(agent, GAP_AGENT_REJECT, "", NULL);
goto done;
}
- value = g_hash_table_lookup(hash, "Name");
- name = value ? g_value_get_string(value) : NULL;
+ tmp_value = g_variant_lookup_value(reply, "Name", G_VARIANT_TYPE_STRING);
+ g_variant_get(tmp_value, "s", &name);
+ G_VARIANT_UNREF(tmp_value);
if (!name)
- name = address;
+ name = g_strdup(address);
+
+ __bt_get_auth_info(reply, (char *)auth_info);
+
+ if (headed_plugin_info->plugin_headed_enabled) {
+ headed_plugin_info->headed_plugin->bt_launch_system_popup(BT_AGENT_EVENT_PASSKEY_REQUEST, name, auth_info,
+ NULL, NULL, _gap_agent_get_path(agent));
+ } else {
+ BT_INFO("Plugin Headed not Enabled");
+ GVariant *param = NULL;
+ param = g_variant_new("(iss)", ret, address, name);
+ _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_PASSKEY_REQUEST, param);
+ }
- _bt_launch_system_popup(BT_AGENT_EVENT_PASSKEY_REQUEST, name, NULL, NULL,
- _gap_agent_get_path(agent));
done:
+ g_variant_unref(reply);
+ g_variant_unref(reply_temp);
+ g_free(address);
+ g_free(name);
__bt_agent_release_memory();
- g_hash_table_destroy(hash);
- BT_DBG("-");
+ BT_DBG("-");
return TRUE;
}
-static gboolean __display_request(GapAgent *agent, DBusGProxy *device,
+static gboolean __display_request(GapAgentPrivate *agent, GDBusProxy *device,
guint passkey)
{
- GHashTable *hash = NULL;
- GValue *value;
- const gchar *address;
- const gchar *name;
- GError *error = NULL;
+ gchar *address = NULL;
+ gchar *name = NULL;
+ unsigned char auth_info[5] = {0, };
char *str_passkey;
+ GVariant *reply = NULL;
+ GVariant *reply_temp = NULL;
+ GVariant *tmp_value = NULL;
+ int ret = BLUETOOTH_ERROR_NONE;
BT_DBG("+");
- dbus_g_proxy_call(device, "GetAll", &error,
- G_TYPE_STRING, BT_DEVICE_INTERFACE,
- G_TYPE_INVALID,
- dbus_g_type_get_map("GHashTable", G_TYPE_STRING,
- G_TYPE_VALUE), &hash, G_TYPE_INVALID);
- if (error) {
- BT_ERR("error in GetBasicProperties [%s]\n", error->message);
- g_error_free(error);
+ reply_temp = __bt_service_getall(device, BT_DEVICE_INTERFACE);
+ if (reply_temp == NULL) {
gap_agent_reply_pin_code(agent, GAP_AGENT_REJECT, "",
NULL);
goto done;
}
- value = g_hash_table_lookup(hash, "Address");
- address = value ? g_value_get_string(value) : NULL;
+ g_variant_get(reply_temp, "(@a{sv})", &reply); /* Format of reply a{sv}*/
+
+ tmp_value = g_variant_lookup_value(reply, "Address", G_VARIANT_TYPE_STRING);
+ g_variant_get(tmp_value, "s", &address);
+ G_VARIANT_UNREF(tmp_value);
if (!address) {
gap_agent_reply_pin_code(agent, GAP_AGENT_REJECT, "", NULL);
goto done;
}
- value = g_hash_table_lookup(hash, "Name");
- name = value ? g_value_get_string(value) : NULL;
+ tmp_value = g_variant_lookup_value(reply, "Name", G_VARIANT_TYPE_STRING);
+ g_variant_get(tmp_value, "s", &name);
+ G_VARIANT_UNREF(tmp_value);
if (!name)
- name = address;
+ name = g_strdup(address);
- str_passkey = g_strdup_printf("%d", passkey);
+ __bt_get_auth_info(reply, (char *)auth_info);
- _bt_launch_system_popup(BT_AGENT_EVENT_KEYBOARD_PASSKEY_REQUEST, name,
- str_passkey, NULL,
- _gap_agent_get_path(agent));
+ str_passkey = g_strdup_printf("%06d", passkey);
+
+ GVariant *param = NULL;
+ param = g_variant_new("(ss)", address, str_passkey);
+
+ if (passkey_watcher) {
+ BT_INFO("Send passkey to %s", passkey_watcher);
+ _bt_send_event_to_dest(passkey_watcher, BT_ADAPTER_EVENT,
+ BLUETOOTH_EVENT_PASSKEY_NOTIFICATION, param);
+ } else {
+ if (headed_plugin_info->plugin_headed_enabled) {
+ BT_INFO("Plugin Headed Enabled");
+ headed_plugin_info->headed_plugin->bt_launch_system_popup(BT_AGENT_EVENT_KEYBOARD_PASSKEY_REQUEST, name,
+ auth_info, str_passkey, NULL, _gap_agent_get_path(agent));
+ } else {
+ BT_INFO("Plugin Headed not Enabled");
+ GVariant *param = NULL;
+ param = g_variant_new("(isss)", ret, address, name, str_passkey);
+ _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY, param);
+ }
+ }
g_free(str_passkey);
done:
+ g_variant_unref(reply);
+ g_variant_unref(reply_temp);
+ g_free(address);
+ g_free(name);
__bt_agent_release_memory();
- g_hash_table_destroy(hash);
- BT_DBG("-");
+ BT_DBG("-");
return TRUE;
}
-static gboolean __confirm_request(GapAgent *agent, DBusGProxy *device,
+static gboolean __confirm_request(GapAgentPrivate *agent, GDBusProxy *device,
guint passkey)
{
- GHashTable *hash = NULL;
- GValue *value;
- const gchar *address;
- const gchar *name;
- GError *error = NULL;
+ gchar *address = NULL;
+ gchar *name = NULL;
+ unsigned char auth_info[5] = {0, };
char str_passkey[7];
-
+ GVariant *reply_temp = NULL;
+ GVariant *reply = NULL;
+ GVariant *tmp_value;
+ int ret = BLUETOOTH_ERROR_NONE;
+#ifdef TIZEN_FEATURE_BT_DPM
+ int pairing_state = DPM_STATUS_ERROR;
+#endif
BT_DBG("+ passkey[%.6d]", passkey);
+#ifdef TIZEN_FEATURE_BT_DPM
+ _bt_dpm_get_bluetooth_pairing_state(&pairing_state);
+ if (pairing_state == DPM_RESTRICTED) {
+ BT_ERR("Not allow to pair the device");
+ gap_agent_reply_confirmation(agent, GAP_AGENT_REJECT, NULL);
+ __bt_agent_release_memory();
+ return TRUE;
+ }
+#endif
+
snprintf(str_passkey, sizeof(str_passkey), "%.6d", passkey);
- dbus_g_proxy_call(device, "GetAll", &error,
- G_TYPE_STRING, BT_DEVICE_INTERFACE,
- G_TYPE_INVALID,
- dbus_g_type_get_map("GHashTable", G_TYPE_STRING,
- G_TYPE_VALUE), &hash, G_TYPE_INVALID);
+ reply_temp = __bt_service_getall(device, BT_DEVICE_INTERFACE);
- if (error) {
- BT_ERR("error in GetBasicProperties [%s]", error->message);
- g_error_free(error);
+ if (reply_temp == NULL) {
+ BT_ERR("Device doesn't exist");
gap_agent_reply_pin_code(agent, GAP_AGENT_REJECT, "",
NULL);
goto done;
}
- value = g_hash_table_lookup(hash, "Address");
- address = value ? g_value_get_string(value) : NULL;
+ g_variant_get(reply_temp, "(@a{sv})", &reply); /* Format of reply a{sv}*/
+
+ tmp_value = g_variant_lookup_value(reply, "Address", G_VARIANT_TYPE_STRING);
+ g_variant_get(tmp_value, "s", &address);
+ G_VARIANT_UNREF(tmp_value);
if (!address) {
gap_agent_reply_pin_code(agent, GAP_AGENT_REJECT, "", NULL);
goto done;
}
- value = g_hash_table_lookup(hash, "Name");
- name = value ? g_value_get_string(value) : NULL;
+ tmp_value = g_variant_lookup_value(reply, "Name", G_VARIANT_TYPE_STRING);
+ g_variant_get(tmp_value, "s", &name);
+ G_VARIANT_UNREF(tmp_value);
if (!name)
- name = address;
-
-#ifdef TIZEN_WEARABLE
- uint32_t device_class = 0x00;
- uint32_t major_class;
-
- value = g_hash_table_lookup(hash, "Class");
- device_class = value ? g_value_get_uint(value) : 0;
-
- BT_INFO("COD : 0x%X", device_class);
-
- major_class = (device_class & 0x1f00) >> 8;
-
- if (major_class == BLUETOOTH_DEVICE_MAJOR_CLASS_AUDIO) {
- BT_DBG("Audio device. Launch passkey pop-up");
- _bt_launch_system_popup(BT_AGENT_EVENT_PASSKEY_CONFIRM_REQUEST, name,
- str_passkey, NULL, _gap_agent_get_path(agent));
- goto done;
- }
-
- if (__is_reset_required(address)) {
- BT_INFO("Launch system reset pop-up");
- _bt_launch_system_popup(BT_AGENT_EVENT_SYSTEM_RESET_REQUEST, name,
- NULL, NULL, _gap_agent_get_path(agent));
+ name = g_strdup(address);
+ __bt_get_auth_info(reply, (char *)auth_info);
+
+ if (headed_plugin_info->plugin_headed_enabled) {
+ BT_DBG("LAUNCH SYSPOPUP");
+ headed_plugin_info->headed_plugin->bt_launch_system_popup(BT_AGENT_EVENT_PASSKEY_CONFIRM_REQUEST, name,
+ auth_info, str_passkey, NULL,
+ _gap_agent_get_path(agent));
} else {
- BT_INFO("Launch passkey pop-up");
- _bt_launch_system_popup(BT_AGENT_EVENT_PASSKEY_CONFIRM_REQUEST, name,
- str_passkey, NULL, _gap_agent_get_path(agent));
+ BT_DBG("Headless Confirmation");
+ GVariant *param = NULL;
+ param = g_variant_new("(isss)", ret, address, name, str_passkey);
+ _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_PASSKEY_CONFIRM_REQUEST, param);
}
-#else
- _bt_launch_system_popup(BT_AGENT_EVENT_PASSKEY_CONFIRM_REQUEST, name,
- str_passkey, NULL,
- _gap_agent_get_path(agent));
-#endif
done:
+ g_variant_unref(reply);
+ g_variant_unref(reply_temp);
+ g_free(address);
+ g_free(name);
__bt_agent_release_memory();
- g_hash_table_destroy(hash);
-
BT_DBG("-");
return TRUE;
}
-static gboolean __pairing_cancel_request(GapAgent *agent, const char *address)
+static gboolean __pairing_cancel_request(GapAgentPrivate *agent, const char *address)
{
BT_DBG("On Going Pairing is cancelled by remote\n");
- syspopup_destroy_all();
+ if (headed_plugin_info->plugin_headed_enabled)
+ headed_plugin_info->headed_plugin->bt_destroy_popup_all();
__bt_agent_release_memory();
return _bt_is_headset_type_connected(BT_AUDIO_A2DP, NULL);
}
-static gboolean __authorize_request(GapAgent *agent, DBusGProxy *device,
+static gboolean __bt_agent_is_hid_device_connectable(void)
+{
+ GDBusProxy *proxy = NULL;
+ GVariant *reply = NULL;
+ GError *err = NULL;
+ gboolean connectable = FALSE;
+
+ proxy = _bt_gdbus_get_hid_agent_proxy();
+ retv_if(proxy == NULL, FALSE);
+
+ reply = g_dbus_proxy_call_sync(proxy, "IsHidConnectable", NULL,
+ G_DBUS_CALL_FLAGS_NONE, 2000, NULL, &err);
+ if (reply == NULL) {
+ BT_ERR("Error returned in method call");
+ if (err != NULL) {
+ BT_ERR("Error message = %s", err->message);
+ g_error_free(err);
+ }
+ connectable = FALSE;
+ } else {
+ g_variant_get(reply, "(b)", &connectable);
+ g_variant_unref(reply);
+ }
+ g_object_unref(proxy);
+
+ BT_INFO("HID Device is %s",
+ connectable ? "Connectable" : "Non-connectable");
+
+ return connectable;
+}
+
+static gboolean __authorize_request(GapAgentPrivate *agent, GDBusProxy *device,
const char *uuid)
{
- GHashTable *hash = NULL;
- GValue *value;
- const gchar *address;
- const gchar *name;
+ gchar *address = NULL;
+ gchar *name = NULL;
+ unsigned char auth_info[5] = {0, };
gboolean trust;
- gboolean paired;
-#ifdef TIZEN_NETWORK_TETHERING_ENABLE
- bool enabled;
- tethering_h tethering = NULL;
- int ret = TETHERING_ERROR_NONE;
-#endif
- GError *error = NULL;
+ GVariant *reply = NULL;
+ GVariant *reply_temp = NULL;
+ GVariant *tmp_value;
int result = BLUETOOTH_ERROR_NONE;
int request_type = BT_AGENT_EVENT_AUTHORIZE_REQUEST;
}
/* Check completed */
+ if (!strcasecmp(uuid, HID_UUID)) {
+ gboolean is_connectable = __bt_agent_is_hid_device_connectable();
+ BT_DBG("Automatically %s authorization for HID",
+ is_connectable ? "accept" : "reject");
+ if (is_connectable == TRUE)
+ gap_agent_reply_authorize(agent, GAP_AGENT_ACCEPT, NULL);
+ else
+ gap_agent_reply_authorize(agent, GAP_AGENT_REJECT, NULL);
+ goto done;
+ }
+
if (!strcasecmp(uuid, HFP_AUDIO_GATEWAY_UUID) ||
!strcasecmp(uuid, HSP_AUDIO_GATEWAY_UUID) ||
!strcasecmp(uuid, HFP_HS_UUID) ||
!strcasecmp(uuid, HSP_HS_UUID) ||
!strcasecmp(uuid, A2DP_UUID) ||
- !strcasecmp(uuid, HID_UUID) ||
+ !strcasecmp(uuid, HID_DEVICE_UUID) ||
!strcasecmp(uuid, SAP_UUID_OLD) ||
!strcasecmp(uuid, SAP_UUID_NEW) ||
+ !strcasecmp(uuid, IOTIVITY_UUID) ||
!strcasecmp(uuid, AVRCP_TARGET_UUID)) {
BT_DBG("Auto accept authorization for audio device (HFP, A2DP, AVRCP) [%s]", uuid);
gap_agent_reply_authorize(agent, GAP_AGENT_ACCEPT,
!strcasecmp(uuid, BNEP_UUID)) {
BT_DBG("Network connection request: %s", uuid);
-#ifdef TIZEN_NETWORK_TETHERING_ENABLE
- if (nap_connected_device_count >=
- BT_PAN_MAX_CONNECTION) {
- BT_ERR("Max connection exceeded");
- goto fail;
- }
- int ret;
- ret = tethering_create(&tethering);
-
- if (ret != TETHERING_ERROR_NONE) {
- BT_ERR("Fail to create tethering: %d", ret);
- goto fail;
- }
-
- enabled = tethering_is_enabled(tethering, TETHERING_TYPE_BT);
-
- ret = tethering_destroy(tethering);
-
- if (ret != TETHERING_ERROR_NONE) {
- BT_ERR("Fail to create tethering: %d", ret);
- }
+ if (TIZEN_FEATURE_NETWORK_TETHERING_ENABLE) {
+ if (nap_connected_device_count >=
+ BT_PAN_MAX_CONNECTION) {
+ BT_ERR("Max connection exceeded");
+ goto fail;
+ }
- if (enabled != true) {
- BT_ERR("BT tethering is not enabled");
- goto fail;
+ if (headed_plugin_info->plugin_headed_enabled) {
+ if (headed_plugin_info->headed_plugin->bt_is_tethering_enabled() == false) {
+ BT_ERR("BT tethering is not enabled");
+ goto fail;
+ }
+ }
}
-#endif
gap_agent_reply_authorize(agent, GAP_AGENT_ACCEPT,
NULL);
goto done;
-#ifdef TIZEN_NETWORK_TETHERING_ENABLE
fail:
gap_agent_reply_authorize(agent, GAP_AGENT_REJECT,
NULL);
goto done;
-#endif
}
- dbus_g_proxy_call(device, "GetAll", &error,
- G_TYPE_STRING, BT_DEVICE_INTERFACE,
- G_TYPE_INVALID,
- dbus_g_type_get_map("GHashTable", G_TYPE_STRING,
- G_TYPE_VALUE), &hash, G_TYPE_INVALID);
- if (error) {
- BT_ERR("error in GetBasicProperties [%s]\n", error->message);
- g_error_free(error);
+ reply_temp = __bt_service_getall(device, BT_DEVICE_INTERFACE);
+ if (reply_temp == NULL) {
gap_agent_reply_pin_code(agent, GAP_AGENT_REJECT, "",
NULL);
goto done;
}
- value = g_hash_table_lookup(hash, "Address");
- address = value ? g_value_get_string(value) : NULL;
+ g_variant_get(reply_temp, "(@a{sv})", &reply); /* Format of reply a{sv}*/
+
+ tmp_value = g_variant_lookup_value(reply, "Address", G_VARIANT_TYPE_STRING);
+ g_variant_get(tmp_value, "s", &address);
+ G_VARIANT_UNREF(tmp_value);
if (!address) {
gap_agent_reply_pin_code(agent, GAP_AGENT_REJECT, "", NULL);
goto done;
}
- value = g_hash_table_lookup(hash, "Alias");
- name = value ? g_value_get_string(value) : NULL;
+ tmp_value = g_variant_lookup_value(reply, "Alias", G_VARIANT_TYPE_STRING);
+ g_variant_get(tmp_value, "s", &name);
+ G_VARIANT_UNREF(tmp_value);
if (!name)
- name = address;
+ name = g_strdup(address);
- value = g_hash_table_lookup(hash, "Trusted");
- trust = value ? g_value_get_boolean(value) : 0;
+ tmp_value = g_variant_lookup_value(reply, "Trusted", G_VARIANT_TYPE_BOOLEAN);
+ g_variant_get(tmp_value, "b", &trust);
+ G_VARIANT_UNREF(tmp_value);
- value = g_hash_table_lookup(hash, "Paired");
- paired = value ? g_value_get_boolean(value) : 0;
- if ((paired == FALSE) && (trust == FALSE)) {
- BT_ERR("No paired & No trusted device");
- gap_agent_reply_authorize(agent,
- GAP_AGENT_REJECT, NULL);
- goto done;
- }
+ __bt_get_auth_info(reply, (char *)auth_info);
- BT_INFO("Authorization request for device [%s] Service:[%s]\n", address,
- uuid);
+ BT_INFO("Authorization request for device [%s] Service:[%s]\n", address, uuid);
if (strcasecmp(uuid, OPP_UUID) == 0 &&
_gap_agent_exist_osp_server(agent, BT_OBEX_SERVER,
NULL) == TRUE) {
_bt_send_event(BT_OPP_SERVER_EVENT,
- BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE,
- DBUS_TYPE_INT32, &result,
- DBUS_TYPE_STRING, &address,
- DBUS_TYPE_STRING, &name,
- DBUS_TYPE_INVALID);
+ BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE,
+ g_variant_new("(iss)", result, address, name));
goto done;
}
+ /* TODO: MAP? see above */
if (_gap_agent_exist_osp_server(agent, BT_RFCOMM_SERVER,
(char *)uuid) == TRUE) {
osp_serv = _gap_agent_get_osp_server(agent,
BT_RFCOMM_SERVER, (char *)uuid);
- _bt_send_event(BT_RFCOMM_SERVER_EVENT,
- BLUETOOTH_EVENT_RFCOMM_AUTHORIZE,
- DBUS_TYPE_INT32, &result,
- DBUS_TYPE_STRING, &address,
- DBUS_TYPE_STRING, &uuid,
- DBUS_TYPE_STRING, &name,
- DBUS_TYPE_STRING, &osp_serv->path,
- DBUS_TYPE_INT16, &osp_serv->fd,
- DBUS_TYPE_INVALID);
+ if (osp_serv) {
+ _bt_send_event(BT_RFCOMM_SERVER_EVENT,
+ BLUETOOTH_EVENT_RFCOMM_AUTHORIZE,
+ g_variant_new("(issssn)", result, address, uuid,
+ name, osp_serv->path, osp_serv->fd));
+ }
goto done;
}
request_type = BT_AGENT_EVENT_PBAP_REQUEST;
else if (!strcasecmp(uuid, MAP_UUID))
request_type = BT_AGENT_EVENT_MAP_REQUEST;
+ /* TODO: MAP is already here */
- if (trust) {
- BT_INFO("Trusted device, so authorize\n");
+ if (trust || !headed_plugin_info->plugin_headed_enabled) {
+ BT_INFO("Trusted or Headless device, so authorize\n");
gap_agent_reply_authorize(agent,
- GAP_AGENT_ACCEPT, NULL);
- } else {
- _bt_launch_system_popup(request_type, name, NULL, NULL,
- _gap_agent_get_path(agent));
+ GAP_AGENT_ACCEPT, NULL);
+
+ goto done;
+ }
+
+ if (headed_plugin_info->plugin_headed_enabled) {
+ headed_plugin_info->headed_plugin->bt_launch_system_popup(request_type, name, auth_info, NULL, NULL,
+ _gap_agent_get_path(agent));
}
done:
- __bt_agent_release_memory();
- g_hash_table_destroy(hash);
+ if (reply)
+ g_variant_unref(reply);
+
+ if (reply_temp)
+ g_variant_unref(reply_temp);
+ g_free(name);
+ g_free(address);
+ __bt_agent_release_memory();
BT_DBG("-");
return TRUE;
}
-static gboolean __authorization_cancel_request(GapAgent *agent,
+static gboolean __authorization_cancel_request(GapAgentPrivate *agent,
const char *address)
{
BT_DBG("On Going Authorization is cancelled by remote\n");
gap_agent_reply_authorize(agent, GAP_AGENT_CANCEL, NULL);
- syspopup_destroy_all();
+ if (headed_plugin_info->plugin_headed_enabled)
+ headed_plugin_info->headed_plugin->bt_destroy_popup_all();
__bt_agent_release_memory();
if (!agent)
return;
- _gap_agent_reset_dbus(agent);
+ _gap_agent_reset_dbus((GapAgentPrivate *)agent);
- g_object_unref(agent);
+ g_free(agent);
}
void* _bt_create_agent(const char *path, gboolean adapter)
{
GAP_AGENT_FUNC_CB func_cb;
- DBusGProxy *adapter_proxy;
- GapAgent* agent;
+ GDBusProxy *adapter_proxy;
+ GapAgentPrivate *agent;
adapter_proxy = _bt_get_adapter_proxy();
if (!adapter_proxy)
func_cb.pairing_cancel_func = __pairing_cancel_request;
func_cb.authorization_cancel_func = __authorization_cancel_request;
- agent = _gap_agent_new();
+ /* Allocate memory*/
+ agent = g_new0(GapAgentPrivate, 1);
_gap_agent_setup_dbus(agent, &func_cb, path, adapter_proxy);
if (adapter) {
if (!_gap_agent_register(agent)) {
_bt_destroy_agent(agent);
- return NULL;
+ agent = NULL;
}
}
gboolean _bt_agent_unregister_osp_server(const gint type, const char *uuid)
{
void *agent = _bt_get_adapter_agent();
+
if (!agent)
return FALSE;
const char *address)
{
char *pch;
- char *last = NULL;
+ char *last;
pch = strtok_r(buffer, "= ,", &last);
const char *partial_name)
{
char *pch;
- char *last = NULL;
+ char *last;
pch = strtok_r(buffer, "= ,", &last);
return 0;
}
+
+int _bt_set_passkey_notification(const char *sender, gboolean enable)
+{
+ BT_INFO("Set passkey notification(sender:%s, %s)",
+ sender, enable ? "Enable" : "Disable");
+
+ g_free(passkey_watcher);
+ if (enable == TRUE)
+ passkey_watcher = g_strdup(sender);
+ else
+ passkey_watcher = NULL;
+
+ return BLUETOOTH_ERROR_NONE;
+}