X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bt-service-adaptation%2Fservices%2Fbt-request-handler.c;h=752f5de73d6e0369dd7634f2236f27ecf2917a32;hb=e3503dd377cadd114917a37fd27f25967a315606;hp=2bcb912530ee49479d53c82cb9b4cfe294b2bb71;hpb=88e199f4c7f068554243790c2fc3d01a64faf897;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git diff --git a/bt-service-adaptation/services/bt-request-handler.c b/bt-service-adaptation/services/bt-request-handler.c index 2bcb912..752f5de 100644 --- a/bt-service-adaptation/services/bt-request-handler.c +++ b/bt-service-adaptation/services/bt-request-handler.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "bluetooth-api.h" #include "bluetooth-audio-api.h" @@ -54,6 +55,8 @@ #include "bt-service-pbap.h" #include "bt-service-oob.h" +#include "bt-service-battery-monitor.h" + #ifdef TIZEN_FEATURE_BT_PAN_NAP #include "bt-service-network.h" #endif @@ -69,7 +72,6 @@ static guint owner_id = 0; static guint owner_sig_id = 0; static gboolean is_le_intended = FALSE; - static cynara *p_cynara; static cynara_configuration *conf; @@ -155,7 +157,6 @@ void _bt_free_info_from_invocation_list(invocation_info_t *req_info) { GSList *l; invocation_info_t *info; - ret_if(NULL == req_info); ret_if(NULL == req_info->sender); @@ -193,9 +194,7 @@ static void __bt_service_get_parameters(GVariant *in_param, static gboolean __bt_is_sync_function(int service_function) { /*TODO: Keep adding sync methods with expect replies from bluetooth service */ - if (service_function == BT_ENABLE_ADAPTER - || service_function == BT_DISABLE_ADAPTER - || service_function == BT_GET_LOCAL_ADDRESS + if (service_function == BT_GET_LOCAL_ADDRESS || service_function == BT_GET_LOCAL_NAME || service_function == BT_GET_LOCAL_VERSION || service_function == BT_GET_BONDED_DEVICES @@ -254,6 +253,29 @@ void _bt_save_invocation_context(GDBusMethodInvocation *invocation, int result, } +static int __bt_bm_request_data(_bt_battery_data_t *latest) +{ + int ret = _bt_bm_read_data(latest); + if (ret == BLUETOOTH_ERROR_NONE) { + BT_DBG("Received data from bluetooth battery monitor: %ld %ld %d %d", + latest->session_start_time, latest->session_end_time, + latest->session_scan_time, latest->session_connected_time); + + if (latest->atm_list == NULL) { + BT_DBG("No app data transaction for this session"); + return ret; + } + + for (GSList *l = latest->atm_list; l != NULL; l = g_slist_next(l)) { + _bt_battery_app_data_t *t = (_bt_battery_app_data_t *)(l->data); + BT_DBG("%ld %ld %d %d", (long int)(t->uid), (long int)(t->pid), t->rx_bytes, t->tx_bytes); + } + } + else + BT_ERR("Error encountered"); + return ret; +} + static void __bt_service_method(GDBusConnection *connection, const gchar *sender, const gchar *object_path, @@ -418,24 +440,10 @@ int __bt_bluez_request(int function_name, switch (function_name) { case BT_ENABLE_ADAPTER: { result = _bt_enable_adapter(); - /* Save invocation */ - if (result == BLUETOOTH_ERROR_NONE) { - BT_DBG("_bt_enable_adapter scheduled successfully! save invocation context"); - sender = (char*)g_dbus_method_invocation_get_sender(context); - _bt_save_invocation_context(context, result, sender, - function_name, NULL); - } break; } case BT_DISABLE_ADAPTER: { result = _bt_disable_adapter(); - /* Save invocation */ - if (result == BLUETOOTH_ERROR_NONE) { - BT_DBG("_bt_disable_adapter scheduled successfully! save invocation context"); - sender = (char*)g_dbus_method_invocation_get_sender(context); - _bt_save_invocation_context(context, result, sender, - function_name, NULL); - } break; } case BT_RECOVER_ADAPTER: @@ -444,6 +452,32 @@ int __bt_bluez_request(int function_name, case BT_RESET_ADAPTER: result = _bt_reset_adapter(); break; + case BT_BATTERY_READ_DATA: { + _bt_battery_data_t *data = NULL; + data = g_malloc0(sizeof(_bt_battery_data_t)); + result = __bt_bm_request_data(data); + + bt_battery_dbus_data_t dbus_data; + memset(&dbus_data, 0, sizeof(bt_battery_dbus_data_t)); + dbus_data.session_start_time = data->session_start_time; + dbus_data.session_end_time = data->session_end_time; + dbus_data.session_scan_time = data->session_scan_time; + dbus_data.session_connected_time = data->session_connected_time; + + /*Populating app data*/ + int n = 0; + for (GSList *l = data->atm_list; l != NULL; l = g_slist_next(l)) { + bt_battery_app_data *t = (bt_battery_app_data *)(l->data); + memcpy(&dbus_data.app_data[n], t, sizeof(bt_battery_app_data)); + n++; + } + dbus_data.num_app = n; + g_array_append_vals(*out_param1, &dbus_data, sizeof(bt_battery_dbus_data_t)); + g_slist_free(data->atm_list); + g_free(data); + data = NULL; + break; + } case BT_CHECK_ADAPTER: { int enabled = BT_ADAPTER_DISABLED; result = _bt_check_adapter(&enabled); @@ -822,6 +856,68 @@ int __bt_bluez_request(int function_name, result = _bt_set_authorization(&address, authorize); break; } + case BT_SET_LE_PRIVACY: { + gboolean set_privacy; + __bt_service_get_parameters(in_param1, &set_privacy, + sizeof(gboolean)); + result = _bt_set_le_privacy(set_privacy); + break; + } + case BT_ADD_WHITE_LIST: { + bluetooth_device_address_t address = { {0} }; + int address_type = 0; + bool is_add = true; + __bt_service_get_parameters(in_param1, + &address, sizeof(bluetooth_device_address_t)); + __bt_service_get_parameters(in_param2, + &address_type, sizeof(int)); + result = _bt_set_white_list(&address, address_type, is_add); + break; + } + case BT_REMOVE_WHITE_LIST: { + bluetooth_device_address_t address = { {0} }; + int address_type = 0; + bool is_add = false; + __bt_service_get_parameters(in_param1, + &address, sizeof(bluetooth_device_address_t)); + __bt_service_get_parameters(in_param2, + &address_type, sizeof(int)); + result = _bt_set_white_list(&address, address_type, is_add); + break; + } + case BT_UPDATE_LE_CONNECTION_MODE: { + char *sender = NULL; + bluetooth_device_address_t remote_address = { { 0 } }; + bluetooth_le_connection_param_t parameters = { 0 }; + bluetooth_le_connection_mode_t mode = BLUETOOTH_LE_CONNECTION_MODE_BALANCED; + + __bt_service_get_parameters(in_param1, &remote_address, + sizeof(bluetooth_device_address_t)); + __bt_service_get_parameters(in_param2, &mode, + sizeof(bluetooth_le_connection_mode_t)); + + result = _bt_get_le_connection_parameter(mode, ¶meters); + if (result != BLUETOOTH_ERROR_NONE) + break; + + sender = (char *)g_dbus_method_invocation_get_sender(context); + + result = _bt_le_connection_update(sender, + remote_address.addr, + parameters.interval_min, + parameters.interval_max, + parameters.latency, + parameters.timeout); + break; + } + case BT_SET_MANUFACTURER_DATA: { + bluetooth_manufacturer_data_t m_data = { 0 }; + __bt_service_get_parameters(in_param1, + &m_data, sizeof(bluetooth_manufacturer_data_t)); + result = _bt_set_manufacturer_data(&m_data); + break; + } + case BT_IS_DEVICE_CONNECTED: { bluetooth_device_address_t address = { {0} }; gboolean connected = FALSE; @@ -865,6 +961,17 @@ int __bt_bluez_request(int function_name, } break; } + case BT_IS_SCAN_FILTER_SUPPORTED:{ + int is_supported = 0; + + if (_bt_is_scan_filter_supported() == TRUE) + is_supported = 1; + + g_array_append_vals(*out_param1, + &is_supported, sizeof(int)); + + break; + } case BT_ENABLE_RSSI: { bluetooth_device_address_t bd_addr; int link_type; @@ -1372,6 +1479,28 @@ int __bt_bluez_request(int function_name, result = BLUETOOTH_ERROR_NONE; break; } + case BT_RFCOMM_SEND_RX_DETAILS: { + uid_t uid; + pid_t pid; + int size; + __bt_service_get_parameters(in_param1, &uid, sizeof(uid_t)); + __bt_service_get_parameters(in_param2, &pid, sizeof(pid_t)); + __bt_service_get_parameters(in_param3, &size, sizeof(int)); + BT_DBG("Sending details to bluetooth battery monitor: %ld, %ld, %d", (long int)uid, (long int)pid, size); + _bt_bm_add_transaction_details(uid, pid, size, RX_DATA); + break; + } + case BT_RFCOMM_SEND_TX_DETAILS: { + uid_t uid; + pid_t pid; + int size; + __bt_service_get_parameters(in_param1, &uid, sizeof(uid_t)); + __bt_service_get_parameters(in_param2, &pid, sizeof(pid_t)); + __bt_service_get_parameters(in_param3, &size, sizeof(int)); + BT_DBG("Sending details to bluetooth battery monitor: %ld, %ld, %d", (long int)uid, (long int)pid, size); + _bt_bm_add_transaction_details(uid, pid, size, TX_DATA); + break; + } case BT_AUDIO_SELECT_ROLE: { bluetooth_audio_role_t role; @@ -1547,6 +1676,46 @@ int __bt_bluez_request(int function_name, } break; } + case BT_HF_CONNECT: { + bluetooth_device_address_t address = { {0} }; + + __bt_service_get_parameters(in_param1, + &address, sizeof(bluetooth_device_address_t)); + + result = _bt_hf_connect(&address); + if (result != BLUETOOTH_ERROR_NONE) { + char addr[BT_ADDRESS_STRING_SIZE]; + _bt_convert_addr_type_to_string(addr, address.addr); + g_array_append_vals(*out_param1, addr, BT_ADDRESS_STRING_SIZE); + } else { + char *addr = g_malloc0(BT_ADDRESS_STRING_SIZE); + _bt_convert_addr_type_to_string(addr, address.addr); + sender = (char*)g_dbus_method_invocation_get_sender(context); + _bt_save_invocation_context(context, result, sender, + function_name, (gpointer)addr); + } + break; + } + case BT_HF_DISCONNECT: { + bluetooth_device_address_t address = { {0} }; + + __bt_service_get_parameters(in_param1, + &address, sizeof(bluetooth_device_address_t)); + + result = _bt_hf_disconnect(&address); + if (result != BLUETOOTH_ERROR_NONE) { + char addr[BT_ADDRESS_STRING_SIZE]; + _bt_convert_addr_type_to_string(addr, address.addr); + g_array_append_vals(*out_param1, addr, BT_ADDRESS_STRING_SIZE); + } else { + char *addr = g_malloc0(BT_ADDRESS_STRING_SIZE); + _bt_convert_addr_type_to_string(addr, address.addr); + sender = (char*)g_dbus_method_invocation_get_sender(context); + _bt_save_invocation_context(context, result, sender, + function_name, (gpointer)addr); + } + break; + } case BT_AVRCP_TARGET_CONNECT: { bluetooth_device_address_t address = { {0} }; @@ -1849,6 +2018,33 @@ int __bt_bluez_request(int function_name, break; } + case BT_LE_OOB_READ_LOCAL_DATA: { + bt_oob_data_t local_oob_data; + + memset(&local_oob_data, 0x00, sizeof(bt_oob_data_t)); + result = _bt_le_oob_read_local_data(&local_oob_data); + + g_array_append_vals(*out_param1, &local_oob_data, + sizeof(bt_oob_data_t)); + + break; + } + case BT_LE_OOB_ADD_REMOTE_DATA: { + bluetooth_device_address_t address = { {0} }; + unsigned short address_type; + bt_oob_data_t remote_oob_data; + + __bt_service_get_parameters(in_param1, + &address, sizeof(bluetooth_device_address_t)); + __bt_service_get_parameters(in_param2, + &address_type, sizeof(unsigned short)); + __bt_service_get_parameters(in_param3, + &remote_oob_data, sizeof(bt_oob_data_t)); + + result = _bt_oob_add_remote_data(&address, address_type, &remote_oob_data); + + break; + } case BT_AVRCP_SET_TRACK_INFO: { media_metadata_t data; media_metadata_attributes_t meta_data; @@ -2022,9 +2218,9 @@ int __bt_bluez_request(int function_name, __bt_service_get_parameters(in_param4, &use_reserved_slot, sizeof(gboolean)); - BT_DBG("bluetooth_advertising_params_t [%f %f %d %d]", + BT_DBG("bluetooth_advertising_params_t [%f %f %d %d %d]", adv_params.interval_min, adv_params.interval_max, - adv_params.filter_policy, adv_params.type); + adv_params.filter_policy, adv_params.type, adv_params.tx_power_level); result = _bt_set_custom_advertising(app, *adv_handle, enable, &adv_params, use_reserved_slot); if (result != BLUETOOTH_ERROR_NONE) { @@ -2408,6 +2604,16 @@ int __bt_bluez_request(int function_name, } break; } + case BT_SET_LE_STATIC_RANDOM_ADDRESS: { + gboolean is_enable; + + __bt_service_get_parameters(in_param1, &is_enable, + sizeof(gboolean)); + + result = _bt_set_le_static_random_address(is_enable); + + break; + } #ifdef TIZEN_GATT_CLIENT /* Local Async */ case BT_GATT_CLIENT_REGISTER: { @@ -2838,13 +3044,22 @@ normal: } case BT_SET_SCAN_PARAMETERS: { bluetooth_le_scan_params_t scan_params; - __bt_service_get_parameters(in_param1, &scan_params, sizeof(bluetooth_le_scan_params_t)); + BT_DBG("bluetooth_le_scan_params_t [%f %f %d]", scan_params.interval, scan_params.window, scan_params.type); - result = _bt_set_scan_parameters(&scan_params); + + result = _bt_prepare_scan_parameters(&scan_params, 0); + break; + } + case BT_SET_SCAN_TYPE: { + int scan_type = 0; + __bt_service_get_parameters(in_param1, &scan_type, sizeof(int)); + + BT_DBG("bluetooth_le_scan_type [%d]", scan_type); + result = _bt_prepare_scan_parameters(NULL, scan_type); break; } #ifdef TIZEN_FEATURE_BT_PAN_NAP @@ -2942,6 +3157,29 @@ normal: g_array_append_vals(*out_param1, &is_coded_phy_supported, sizeof(gboolean)); break; } + case BT_DISCONNECT_DEVICE: { + bluetooth_device_address_t address = { {0} }; + + __bt_service_get_parameters(in_param1, + &address, sizeof(bluetooth_device_address_t)); + + result = _bt_disconnect_device(&address); + break; + } + case BT_REGISTER_SCAN_FILTER: { + bluetooth_le_scan_filter_t scan_filter; + + sender = (char*)g_dbus_method_invocation_get_sender(context); + __bt_service_get_parameters(in_param1, &scan_filter, + sizeof(bluetooth_le_scan_filter_t)); + + BT_DBG("bluetooth_le_scan_filter_t [features : 0x%.2x]", + scan_filter.added_features); + + result = _bt_register_scan_filter(sender, &scan_filter); + + break; + } default: BT_INFO("UnSupported function [%d]", function_name); result = BLUETOOTH_ERROR_NOT_SUPPORT; @@ -3439,7 +3677,7 @@ int __bt_core_request(int function_name, case BT_ENABLE_ADAPTER: { bt_status_t status; - + _bt_set_adapter_request_state(TRUE); status = _bt_adapter_get_status(); if (status == BT_ACTIVATING) { @@ -3450,10 +3688,6 @@ int __bt_core_request(int function_name, result = BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED; } else { _bt_adapter_set_status(BT_ACTIVATING); - -#if TODO_40 /* Need to add this function */ - _bt_adapter_start_enable_timer(); -#endif result = BLUETOOTH_ERROR_NONE; } @@ -3462,7 +3696,6 @@ int __bt_core_request(int function_name, case BT_DISABLE_ADAPTER: { bt_status_t status; - status = _bt_adapter_get_status(); if (status == BT_DEACTIVATING) { BT_DBG("Disabling in progress"); @@ -3480,7 +3713,7 @@ int __bt_core_request(int function_name, case BT_ENABLE_ADAPTER_LE: { bt_le_status_t le_status; - + _bt_set_le_request_state(TRUE); le_status = _bt_adapter_get_le_status(); if (le_status == BT_LE_ACTIVATING) { BT_DBG("Enabling in progress"); @@ -3490,10 +3723,6 @@ int __bt_core_request(int function_name, result = BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED; } else { _bt_adapter_set_le_status(BT_LE_ACTIVATING); - -#if TODO_40 /* Need to add this function */ - _bt_adapter_start_le_enable_timer(); -#endif result = BLUETOOTH_ERROR_NONE; } @@ -3581,12 +3810,14 @@ gboolean __bt_service_check_privilege(int function_name, case BT_CANCEL_DISCOVERY: case BT_OOB_ADD_REMOTE_DATA: case BT_OOB_REMOVE_REMOTE_DATA: + case BT_OOB_READ_LOCAL_DATA: case BT_SET_ADVERTISING: case BT_SET_CUSTOM_ADVERTISING: case BT_SET_ADVERTISING_PARAMETERS: case BT_START_LE_DISCOVERY: case BT_STOP_LE_DISCOVERY: case BT_SET_SCAN_PARAMETERS: + case BT_SET_SCAN_TYPE: case BT_BOND_DEVICE: case BT_CANCEL_BONDING: @@ -3775,10 +4006,13 @@ gboolean __bt_service_check_privilege(int function_name, } break; + case BT_RFCOMM_SEND_RX_DETAILS: + case BT_RFCOMM_SEND_TX_DETAILS: case BT_ENABLE_ADAPTER: case BT_DISABLE_ADAPTER: case BT_RESET_ADAPTER: case BT_RECOVER_ADAPTER: + case BT_BATTERY_READ_DATA: case BT_ENABLE_ADAPTER_LE: case BT_DISABLE_ADAPTER_LE: case BT_SET_CONNECTABLE: @@ -3790,6 +4024,7 @@ gboolean __bt_service_check_privilege(int function_name, case BT_CANCEL_SEARCH_SERVICE: case BT_ENABLE_RSSI: + case BT_DISCONNECT_DEVICE: case BT_RFCOMM_ACCEPT_CONNECTION: case BT_RFCOMM_REJECT_CONNECTION: @@ -3813,6 +4048,8 @@ gboolean __bt_service_check_privilege(int function_name, case BT_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH: case BT_LE_READ_HOST_SUGGESTED_DATA_LENGTH: case BT_LE_SET_DATA_LENGTH: + case BT_LE_OOB_READ_LOCAL_DATA: + case BT_LE_OOB_ADD_REMOTE_DATA: case BT_LE_IPSP_INIT: case BT_LE_IPSP_DEINIT: @@ -3889,7 +4126,6 @@ gboolean __bt_service_check_privilege(int function_name, case BT_GET_PROFILE_TRUSTED: case BT_GET_SPEAKER_GAIN: case BT_SET_SPEAKER_GAIN: - case BT_OOB_READ_LOCAL_DATA: case BT_RFCOMM_CLIENT_IS_CONNECTED: case BT_RFCOMM_IS_UUID_AVAILABLE: case BT_GET_ADVERTISING_DATA: @@ -3898,8 +4134,6 @@ gboolean __bt_service_check_privilege(int function_name, case BT_IS_LE_2M_PHY_SUPPORTED: case BT_IS_LE_CODED_PHY_SUPPORTED: case BT_REGISTER_SCAN_FILTER: - case BT_UNREGISTER_SCAN_FILTER: - case BT_UNREGISTER_ALL_SCAN_FILTERS: case BT_IS_SCAN_FILTER_SUPPORTED: case BT_GET_ATT_MTU: @@ -4035,6 +4269,19 @@ gboolean _is_name_acquired(void) return name_acquired; } +void _bt_service_unref_connection(void) +{ + BT_INFO("+"); + + if (bt_service_conn) { + g_dbus_connection_flush_sync(bt_service_conn, NULL, NULL); + g_object_unref(bt_service_conn); + bt_service_conn = NULL; + } + + BT_INFO("-"); +} + int _bt_service_register(void) { GDBusConnection *conn; @@ -4076,21 +4323,20 @@ fail: void _bt_service_unregister(void) { if (bt_service_conn) { + sd_notify(0, "STOPPING=1"); + if (owner_sig_id > 0) { g_dbus_connection_signal_unsubscribe( bt_service_conn, owner_sig_id); owner_sig_id = 0; } - __bt_service_register_object(bt_service_conn, NULL, FALSE); - if (bt_service_conn) { - g_object_unref(bt_service_conn); - bt_service_conn = NULL; - } if (owner_id > 0) { g_bus_unown_name(owner_id); owner_id = 0; } + + __bt_service_register_object(bt_service_conn, NULL, FALSE); } }