X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bt-service%2Fbt-service-agent.c;h=92ee46f0700fe2969d3b361995ebdaed12a94fa7;hb=36c15f73c2ba3eddfec7af4afb9e05d4e82b4ce0;hp=767f359ae9084bb9524a80477e8c4c26337abdf3;hpb=51d5539b3529f2df578d37ce18aeb4322aa5c255;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git diff --git a/bt-service/bt-service-agent.c b/bt-service/bt-service-agent.c index 767f359..92ee46f 100644 --- a/bt-service/bt-service-agent.c +++ b/bt-service/bt-service-agent.c @@ -20,22 +20,9 @@ #include #include #include - -#if defined(LIBNOTIFY_SUPPORT) -#include "bt-popup.h" -#elif defined(LIBNOTIFICATION_SUPPORT) -#include "bt-service-agent-notification.h" -#else -#include -#endif - #include #include -#ifdef TIZEN_NETWORK_TETHERING_ENABLE -#include -#endif - #include "bt-internal-types.h" #include "bt-service-common.h" #include "bt-service-agent.h" @@ -46,7 +33,7 @@ #include "bt-service-device.h" #include "bt-service-audio.h" -#ifdef TIZEN_DPM_ENABLE +#ifdef TIZEN_FEATURE_BT_DPM #include "bt-service-dpm.h" #endif @@ -66,8 +53,10 @@ #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" @@ -76,20 +65,20 @@ #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 gboolean syspopup_mode = TRUE; - 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); @@ -104,262 +93,6 @@ static void __bt_agent_release_memory(void) stack_trim(); } -static gboolean __bt_agent_system_popup_timer_cb(gpointer user_data) -{ - int ret; - static int retry_count; - bundle *b = (bundle *)user_data; - retv_if(user_data == NULL, FALSE); - - ++retry_count; -#if defined(LIBNOTIFY_SUPPORT) - ret = notify_launch(b); -#elif defined(LIBNOTIFICATION_SUPPORT) - ret = notification_launch(b); -#else - ret = syspopup_launch("bt-syspopup", b); -#endif - 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_popup_event_filter(GDBusConnection *connection, - const gchar *sender_name, - const gchar *object_path, - const gchar *interface_name, - const gchar *signal_name, - GVariant *parameters, - gpointer user_data) -{ - BT_DBG("Sender Name[%s] Object Path[%s] Interface[%s] Signal[%s]", - sender_name, object_path, interface_name, signal_name); - - if (g_strcmp0(interface_name, "User.Bluetooth.syspopup") == 0 && - g_strcmp0(signal_name, "ResetResponse") == 0) { - int response; - - g_variant_get(parameters, "(i)", &response); - BT_DBG("response = %d", response); - } -} - -int __bt_service_subscribe_popup(GDBusConnection *conn, - gboolean subscribe) -{ - static guint subs_interface_added_id = 0; - - if (conn == NULL) - return BLUETOOTH_ERROR_INVALID_PARAM; - - if (subscribe) { - if (subs_interface_added_id == 0) { - subs_interface_added_id = g_dbus_connection_signal_subscribe(conn, - NULL, "User.Bluetooth.syspopup", "ResetResponse", NULL, NULL, 0, - __bt_popup_event_filter, NULL, NULL); - } - } else { - if (subs_interface_added_id > 0) { - g_dbus_connection_signal_unsubscribe(conn, - subs_interface_added_id); - subs_interface_added_id = 0; - } - } - return BLUETOOTH_ERROR_NONE; -} - -static void __bt_register_popup_event_signal(void) -{ - GDBusConnection *conn; - - BT_DBG("+\n"); - - conn = _bt_get_system_gconn(); - if (conn == NULL) - return; - - __bt_service_subscribe_popup(conn, TRUE); - - BT_DBG("-\n"); - return; -} - -#if 0 -static gboolean __is_reset_required(const gchar *address) -{ - 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; -} -#endif -#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]; - - b = bundle_create(); - if (!b) { - BT_ERR("Launching system popup failed"); - return -1; - } - - 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_AUTO_ACCEPTED: - g_strlcpy(event_str, "passkey-auto-accepted", - 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; - - default: - BT_ERR("Invalid event type"); - bundle_free(b); - return -1; - - } - - bundle_add(b, "event-type", event_str); - -#if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT) - ret = syspopup_launch("bt-syspopup", b); -#endif - 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 GVariant *__bt_service_getall(GDBusProxy *device, const char *interface) { GError *error = NULL; @@ -385,18 +118,23 @@ static GVariant *__bt_service_getall(GDBusProxy *device, const char *interface) static gboolean __pincode_request(GapAgentPrivate *agent, GDBusProxy *device) { uint32_t device_class; - const gchar *address; - const gchar *name; + gchar *address = NULL; + unsigned char auth_info[5] = {0, }; + gchar *name = NULL; GVariant *reply = NULL; GVariant *reply_temp = NULL; GVariant *tmp_value; - GVariant *param; - int result = BLUETOOTH_ERROR_NONE; + 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 BT_DBG("+"); -#ifdef TIZEN_DPM_ENABLE - if (_bt_dpm_get_bluetooth_pairing_state() == DPM_RESTRICTED) { +#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(); @@ -429,9 +167,19 @@ static gboolean __pincode_request(GapAgentPrivate *agent, GDBusProxy *device) 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; + 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)) { @@ -454,40 +202,38 @@ static gboolean __pincode_request(GapAgentPrivate *agent, GDBusProxy *device) gap_agent_reply_pin_code(agent, GAP_AGENT_ACCEPT, str_passkey, NULL); -#ifdef AUTO_ACCEPT - gap_agent_reply_pin_code(agent, GAP_AGENT_ACCEPT, "0000", - NULL); -#else - if (syspopup_mode) { - BT_DBG("LAUNCH SYSPOPUP"); - _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 { - BT_DBG("Send BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY"); - param = g_variant_new("(isss)", result, address, name, str_passkey); - _bt_send_event(BT_ADAPTER_EVENT, - BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY, param); + 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); } -#endif + } 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_DBG("Show Pin entry"); - - if (syspopup_mode) { - BT_DBG("LAUNCH SYSPOPUP"); - _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_DBG("Send BLUETOOTH_EVENT_PIN_REQUEST"); - param = g_variant_new("(iss)", result, address, name); - _bt_send_event(BT_ADAPTER_EVENT, - BLUETOOTH_EVENT_PIN_REQUEST, param); + 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_variant_unref(reply); g_variant_unref(reply_temp); + g_free(address); + g_free(name); __bt_agent_release_memory(); BT_DBG("-"); @@ -496,15 +242,22 @@ done: static gboolean __passkey_request(GapAgentPrivate *agent, GDBusProxy *device) { - const gchar *address; - const gchar *name; + 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("+"); -#ifdef TIZEN_DPM_ENABLE - if (_bt_dpm_get_bluetooth_pairing_state() == DPM_RESTRICTED) { +#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(); @@ -534,30 +287,26 @@ static gboolean __passkey_request(GapAgentPrivate *agent, GDBusProxy *device) g_variant_get(tmp_value, "s", &name); G_VARIANT_UNREF(tmp_value); if (!name) - name = address; + name = g_strdup(address); -#ifdef AUTO_ACCEPT - gap_agent_reply_pin_code(agent, GAP_AGENT_ACCEPT, "0000", - NULL); -#else - if (syspopup_mode) { - BT_DBG("LAUNCH SYSPOPUP"); - _bt_launch_system_popup(BT_AGENT_EVENT_PASSKEY_REQUEST, name, NULL, NULL, - _gap_agent_get_path(agent)); - } else { - int result = BLUETOOTH_ERROR_NONE; - GVariant *param; + __bt_get_auth_info(reply, (char *)auth_info); - BT_DBG("Send BLUETOOTH_EVENT_PASSKEY_REQUEST"); - param = g_variant_new("(iss)", result, address, name); - _bt_send_event(BT_ADAPTER_EVENT, - BLUETOOTH_EVENT_PASSKEY_REQUEST, param); + 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); } -#endif + done: g_variant_unref(reply); g_variant_unref(reply_temp); + g_free(address); + g_free(name); __bt_agent_release_memory(); BT_DBG("-"); @@ -567,12 +316,14 @@ done: static gboolean __display_request(GapAgentPrivate *agent, GDBusProxy *device, guint passkey) { - const gchar *address; - const gchar *name; + 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("+"); @@ -597,35 +348,39 @@ static gboolean __display_request(GapAgentPrivate *agent, GDBusProxy *device, 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); -#ifdef AUTO_ACCEPT - gap_agent_reply_pin_code(agent, GAP_AGENT_ACCEPT, str_passkey, - NULL); -#else - if (syspopup_mode) { - BT_DBG("LAUNCH SYSPOPUP"); - _bt_launch_system_popup(BT_AGENT_EVENT_KEYBOARD_PASSKEY_REQUEST, name, - str_passkey, NULL, - _gap_agent_get_path(agent)); - } else { - int result = BLUETOOTH_ERROR_NONE; - GVariant *param; + str_passkey = g_strdup_printf("%06d", passkey); - BT_DBG("Send BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY"); - param = g_variant_new("(isss)", result, address, name, str_passkey); - _bt_send_event(BT_ADAPTER_EVENT, - BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY, param); + 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); + } } -#endif g_free(str_passkey); done: g_variant_unref(reply); g_variant_unref(reply_temp); + g_free(address); + g_free(name); __bt_agent_release_memory(); BT_DBG("-"); @@ -635,16 +390,22 @@ done: static gboolean __confirm_request(GapAgentPrivate *agent, GDBusProxy *device, guint passkey) { - const gchar *address; - const gchar *name; + 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_DPM_ENABLE - if (_bt_dpm_get_bluetooth_pairing_state() == DPM_RESTRICTED) { +#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(); @@ -677,16 +438,26 @@ static gboolean __confirm_request(GapAgentPrivate *agent, GDBusProxy *device, 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); - BT_DBG("LAUNCH SYSPOPUP"); - _bt_launch_system_popup(BT_AGENT_EVENT_PASSKEY_CONFIRM_REQUEST, name, - str_passkey, NULL, - _gap_agent_get_path(agent)); + 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_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); + } done: g_variant_unref(reply); g_variant_unref(reply_temp); + g_free(address); + g_free(name); __bt_agent_release_memory(); BT_DBG("-"); @@ -697,9 +468,8 @@ static gboolean __pairing_cancel_request(GapAgentPrivate *agent, const char *add { BT_DBG("On Going Pairing is cancelled by remote\n"); -#if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT) - syspopup_destroy_all(); -#endif + if (headed_plugin_info->plugin_headed_enabled) + headed_plugin_info->headed_plugin->bt_destroy_popup_all(); __bt_agent_release_memory(); @@ -712,33 +482,52 @@ static gboolean __a2dp_authorize_request_check(void) return _bt_is_headset_type_connected(BT_AUDIO_A2DP, NULL); } +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) { - const gchar *address; - const gchar *name; + gchar *address = NULL; + gchar *name = NULL; + unsigned char auth_info[5] = {0, }; gboolean trust; - gboolean paired; GVariant *reply = NULL; GVariant *reply_temp = NULL; GVariant *tmp_value; -#ifdef TIZEN_NETWORK_TETHERING_ENABLE - bool enabled; - tethering_h tethering = NULL; -#endif int result = BLUETOOTH_ERROR_NONE; -#ifndef AUTO_ACCEPT int request_type = BT_AGENT_EVENT_AUTHORIZE_REQUEST; -#endif BT_DBG("+"); -#ifdef AUTO_ACCEPT - gap_agent_reply_authorize(agent, GAP_AGENT_ACCEPT, - NULL); - goto done; -#endif - /* Check if already Media connection exsist */ if (!strcasecmp(uuid, A2DP_UUID)) { gboolean ret = FALSE; @@ -754,14 +543,26 @@ static gboolean __authorize_request(GapAgentPrivate *agent, GDBusProxy *device, } /* 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, @@ -775,44 +576,29 @@ static gboolean __authorize_request(GapAgentPrivate *agent, GDBusProxy *device, !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 } reply_temp = __bt_service_getall(device, BT_DEVICE_INTERFACE); @@ -836,21 +622,13 @@ fail: g_variant_get(tmp_value, "s", &name); G_VARIANT_UNREF(tmp_value); if (!name) - name = address; + name = g_strdup(address); tmp_value = g_variant_lookup_value(reply, "Trusted", G_VARIANT_TYPE_BOOLEAN); g_variant_get(tmp_value, "b", &trust); G_VARIANT_UNREF(tmp_value); - tmp_value = g_variant_lookup_value(reply, "Paired", G_VARIANT_TYPE_BOOLEAN); - g_variant_get(tmp_value, "b", &paired); - G_VARIANT_UNREF(tmp_value); - 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); @@ -863,6 +641,7 @@ fail: goto done; } + /* TODO: MAP? see above */ if (_gap_agent_exist_osp_server(agent, BT_RFCOMM_SERVER, (char *)uuid) == TRUE) { @@ -880,29 +659,36 @@ fail: goto done; } - if (trust) { - BT_INFO("Trusted device, so authorize\n"); + if (!strcasecmp(uuid, OPP_UUID)) + request_type = BT_AGENT_EVENT_EXCHANGE_REQUEST; + else if (!strcasecmp(uuid, PBAP_UUID)) + 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 || !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 { -#ifdef AUTO_ACCEPT - gap_agent_reply_authorize(agent, GAP_AGENT_ACCEPT, NULL); -#else - if (!strcasecmp(uuid, OPP_UUID)) - request_type = BT_AGENT_EVENT_EXCHANGE_REQUEST; - else if (!strcasecmp(uuid, PBAP_UUID)) - request_type = BT_AGENT_EVENT_PBAP_REQUEST; - else if (!strcasecmp(uuid, MAP_UUID)) - request_type = BT_AGENT_EVENT_MAP_REQUEST; - - _bt_launch_system_popup(request_type, name, NULL, NULL, - _gap_agent_get_path(agent)); -#endif + + 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: - g_variant_unref(reply); - g_variant_unref(reply_temp); + 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("-"); @@ -916,9 +702,8 @@ static gboolean __authorization_cancel_request(GapAgentPrivate *agent, gap_agent_reply_authorize(agent, GAP_AGENT_CANCEL, NULL); -#if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT) - syspopup_destroy_all(); -#endif + if (headed_plugin_info->plugin_headed_enabled) + headed_plugin_info->headed_plugin->bt_destroy_popup_all(); __bt_agent_release_memory(); @@ -1120,12 +905,6 @@ static gboolean __bt_agent_is_device_blacklist(const char *address, rewind(fp); buffer = g_malloc0(sizeof(char) * size); - /* Fix : NULL_RETURNS */ - if (buffer == NULL) { - BT_ERR("Fail to allocate memory"); - fclose(fp); - return FALSE; - } result = fread((char *)buffer, 1, size, fp); fclose(fp); if (result != size) { @@ -1274,3 +1053,17 @@ static int __bt_agent_generate_passkey(char *passkey, int size) 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; +}