#include "bluetooth-gatt-server-api.h"
#endif
-#ifdef TIZEN_GATT_CLIENT
#include "bluetooth-gatt-client-api.h"
-#endif
+#include "bluetooth-mesh-api.h"
#include "bt-common.h"
#include "bt-request-sender.h"
#include "bt-event-handler.h"
-
-#ifdef TIZEN_FEATURE_BT_DPM
#include "bt-dpm.h"
-#endif
static bt_user_info_t user_info[BT_MAX_USER_INFO];
static GDBusConnection *system_shared_conn = NULL;
-static GDBusConnection *system_private_conn = NULL;
+static GDBusConnection *system_common_conn = NULL;
static guint bus_id;
#define DBUS_TIMEOUT 20 * 1000 /* 20 Seconds */
+#if 0 // Remain this code for private connection in later.
static GDBusConnection *g_bus_get_private_conn(void)
{
GError *error = NULL;
return private_gconn;
}
+#endif
-GDBusConnection *_bt_get_system_private_conn(void)
+// TODO: Need to use _bt_get_system_shared_conn in later.
+GDBusConnection *_bt_get_system_common_conn(void)
{
- if (system_private_conn == NULL)
- system_private_conn = g_bus_get_private_conn();
- else if (g_dbus_connection_is_closed(system_private_conn))
- system_private_conn = g_bus_get_private_conn();
-
- return system_private_conn;
+ if (system_common_conn == NULL) {
+ GError *error = NULL;
+ system_common_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+ if (error) {
+ BT_ERR("GDBus connection Error : %s \n", error->message);
+ g_clear_error(&error);
+ return NULL;
+ }
+ }
+ return system_common_conn;
}
GDBusConnection *_bt_get_system_shared_conn(void)
return &user_info[type];
}
+int _bt_common_send_rfcomm_rx_details(unsigned int len)
+{
+ uid_t uid = getuid();
+ pid_t pid = getpid();
+ unsigned int size = len;
+ int ret = BLUETOOTH_ERROR_NONE;
+
+ BT_INFO("+");
+ BT_CHECK_ENABLED(return);
+ BT_INIT_PARAMS();
+ BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+ g_array_append_vals(in_param1, &uid, sizeof(uid_t));
+ g_array_append_vals(in_param2, &pid, sizeof(pid_t));
+ g_array_append_vals(in_param3, &size, sizeof(unsigned int));
+
+ ret = _bt_send_request(BT_BLUEZ_SERVICE, BT_RFCOMM_SEND_RX_DETAILS,
+ in_param1, in_param2, in_param3, in_param4, &out_param);
+
+ BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+ BT_INFO("-");
+ return ret;
+}
+
+int _bt_common_send_rfcomm_tx_details(unsigned int len)
+{
+ uid_t uid = getuid();
+ pid_t pid = getpid();
+ unsigned int size = len;
+ int ret = BLUETOOTH_ERROR_NONE;
+
+ BT_INFO("+");
+ BT_CHECK_ENABLED(return);
+ BT_INIT_PARAMS();
+ BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+ g_array_append_vals(in_param1, &uid, sizeof(uid_t));
+ g_array_append_vals(in_param2, &pid, sizeof(pid_t));
+ g_array_append_vals(in_param3, &size, sizeof(unsigned int));
+
+ ret = _bt_send_request(BT_BLUEZ_SERVICE, BT_RFCOMM_SEND_TX_DETAILS,
+ in_param1, in_param2, in_param3, in_param4, &out_param);
+
+ BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+ BT_INFO("-");
+ return ret;
+}
+
+int _bt_common_send_rfcomm_conn_info(int role, gboolean connected, int socket_fd)
+{
+ int result = BLUETOOTH_ERROR_NONE;
+
+ if (bluetooth_get_battery_monitor_state() == 0) {
+ BT_DBG("Battery monitor state is off");
+ return BLUETOOTH_ERROR_NONE;
+ }
+
+ BT_INIT_PARAMS();
+ BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+ g_array_append_vals(in_param1, &role, sizeof(int));
+ g_array_append_vals(in_param2, &connected, sizeof(gboolean));
+ g_array_append_vals(in_param3, &socket_fd, sizeof(int));
+
+ result = _bt_send_request(BT_BLUEZ_SERVICE, BT_RFCOMM_UPDATE_CONNECTION_INFO,
+ in_param1, in_param2, in_param3, in_param4, &out_param);
+
+ BT_DBG("result: %x", result);
+
+ BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+ return result;
+}
+
void _bt_common_event_cb(int event, int result, void *param,
void *callback, void *user_data)
{
user_data);
}
-#ifdef TIZEN_GATT_CLIENT
void _bt_gatt_client_event_cb(int event, int result, void *param,
void *callback, void *user_data)
{
BT_ERR("GATT Client event callback is not registered!!!");
}
}
-#endif
#ifndef GATT_DIRECT
void _bt_gatt_server_event_cb(int event, int result, void *param,
void *callback, void *user_data)
{
- BT_INFO("__bt_gatt_server_event_cb");
gatt_server_event_param_t bt_event = { 0, 0, NULL, NULL };
bt_event.event = event;
bt_event.result = result;
bt_event.param_data = param;
if (callback) {
- BT_INFO("GATT Server event callback is registered");
((gatt_server_cb_func_ptr)callback)(bt_event.event, &bt_event,
user_data);
} else {
}
#endif
+void _bt_mesh_event_cb(int event, int result, void *param,
+ void *callback, void *user_data)
+{
+ BT_DBG("_bt_mesh_event_cb");
+ mesh_event_param_t bt_event = { 0, 0, NULL, NULL };
+ bt_event.event = event;
+ bt_event.result = result;
+ bt_event.param_data = param;
+ if (callback) {
+ BT_DBG("Mesh event callback is registered");
+ ((mesh_cb_func_ptr)callback)(bt_event.event, &bt_event,
+ user_data);
+ } else {
+ BT_ERR("Mesh event callback is not registered!!!");
+ }
+}
+
void _bt_divide_device_class(bluetooth_device_class_t *device_class,
unsigned int cod)
{
{BT_GET_ADVERTISING_DATA, "BT_GET_ADVERTISING_DATA"},
{BT_SET_ADVERTISING_DATA, "BT_SET_ADVERTISING_DATA"},
{BT_SET_SCAN_PARAMETERS, "BT_SET_SCAN_PARAMETERS"},
+ {BT_SET_SCAN_TYPE, "BT_SET_SCAN_TYPE"},
{BT_GET_SCAN_RESPONSE_DATA, "BT_GET_SCAN_RESPONSE_DATA"},
{BT_SET_SCAN_RESPONSE_DATA, "BT_SET_SCAN_RESPONSE_DATA"},
{BT_IS_ADVERTISING, "BT_IS_ADVERTISING"},
{BT_REMOVE_WHITE_LIST, "BT_REMOVE_WHITE_LIST"},
{BT_CLEAR_WHITE_LIST, "BT_CLEAR_WHITE_LIST"},
{BT_REGISTER_SCAN_FILTER, "BT_REGISTER_SCAN_FILTER"},
- {BT_UNREGISTER_SCAN_FILTER, "BT_UNREGISTER_SCAN_FILTER"},
- {BT_UNREGISTER_ALL_SCAN_FILTERS, "BT_UNREGISTER_ALL_SCAN_FILTERS"},
{BT_IS_SCAN_FILTER_SUPPORTED, "BT_IS_SCAN_FILTER_SUPPORTED"},
{BT_GET_PROFILE_CONNECTED_DEVICES, "BT_GET_PROFILE_CONNECTED_DEVICES"},
{BT_ENABLE_FORCE_HCI_DUMP, "BT_ENABLE_FORCE_HCI_DUMP"},
{BT_SET_SPEAKER_GAIN, "BT_SET_SPEAKER_GAIN"},
{BT_SET_CONTENT_PROTECT, "BT_SET_CONTENT_PROTECT"},
{BT_AUDIO_SELECT_ROLE, "BT_AUDIO_SELECT_ROLE"},
+ {BT_AUDIO_SET_ABSOLUTE_VOLUME, "BT_AUDIO_SET_ABSOLUTE_VOLUME"},
+ {BT_AUDIO_GET_ABSOLUTE_VOLUME, "BT_AUDIO_GET_ABSOLUTE_VOLUME"},
+ {BT_AUDIO_IS_AVC_ACTIVATED, "BT_AUDIO_IS_AVC_ACTIVATED"},
{BT_OOB_READ_LOCAL_DATA, "BT_OOB_READ_LOCAL_DATA"},
{BT_OOB_ADD_REMOTE_DATA, "BT_OOB_ADD_REMOTE_DATA"},
{BT_OOB_REMOVE_REMOTE_DATA, "BT_OOB_REMOVE_REMOTE_DATA"},
+ {BT_LE_OOB_READ_LOCAL_DATA, "BT_LE_OOB_READ_LOCAL_DATA"},
+ {BT_LE_OOB_ADD_REMOTE_DATA, "BT_LE_OOB_ADD_REMOTE_DATA"},
{BT_AVRCP_SET_TRACK_INFO, "BT_AVRCP_SET_TRACK_INFO"},
{BT_AVRCP_SET_PROPERTY, "BT_AVRCP_SET_PROPERTY"},
{BT_AVRCP_SET_PROPERTIES, "BT_AVRCP_SET_PROPERTIES"},
return TRUE;
}
-
static GDBusProxy *profile_gproxy;
static int latest_id = -1;
#define BT_RFCOMM_ID_MAX 245
if (profile_gproxy)
return profile_gproxy;
- gconn = _bt_get_system_private_conn();
+ /* Shared connection should be used because rfcomm interface was registered
+ * on shared connection not private. Otherwise, dbus rejection is occured
+ * because dbus policy is only applied on shared connection not private. */
+ gconn = _bt_get_system_shared_conn();
if (gconn == NULL)
return NULL;
GError *err = NULL;
GDBusProxy *device_gproxy;
- gconn = _bt_get_system_private_conn();
+ gconn = _bt_get_system_common_conn();
if (gconn == NULL)
return NULL;
GVariant *result = NULL;
char *adapter_path = NULL;
- conn = _bt_get_system_private_conn();
+ conn = _bt_get_system_common_conn();
retv_if(conn == NULL, NULL);
manager_proxy = g_dbus_proxy_new_sync(conn,
NULL, &err);
if (err) {
g_dbus_error_strip_remote_error(err);
- BT_ERR("RegisterProfile failed: %s", err->message);
+ BT_ERR("RegisterProfile2 failed: %s", err->message);
if (g_strrstr(err->message, BT_ACCESS_DENIED_MSG))
result = BLUETOOTH_ERROR_ACCESS_DENIED;
if (err) {
g_dbus_error_strip_remote_error(err);
- BT_ERR("RegisterProfile failed: %s", err->message);
+ BT_ERR("RegisterProfile1 failed: %s", err->message);
if (g_strrstr(err->message, BT_ACCESS_DENIED_MSG))
result = BLUETOOTH_ERROR_ACCESS_DENIED;
return;
}
+void _bt_print_api_caller_name(void)
+{
+ FILE *fp = NULL;
+ char *path = NULL;
+ char buf[256] = {0, };
+ char **str_list = NULL;
+
+ path = g_strdup_printf("/proc/%d/cmdline", getpid());
+ fp = fopen(path, "r");
+ if (fp == NULL) {
+ g_free(path);
+ return;
+ }
+
+ if (fgets(buf, 256, fp) != NULL) {
+ str_list = g_strsplit(buf, " ", -1);
+ if (str_list[0] != NULL)
+ BT_INFO("Caller : %s", str_list[0]);
+ g_strfreev(str_list);
+ }
+
+ fclose(fp);
+ g_free(path);
+ return;
+}
+
int _bt_connect_profile(char *address, char *uuid, void *cb,
gpointer func_data)
{
DBUS_TIMEOUT, NULL,
(GAsyncReadyCallback)cb,
func_data);
+ if (cb == NULL)
+ g_object_unref(proxy);
BT_DBG("-");
return BLUETOOTH_ERROR_NONE;
}
DBUS_TIMEOUT, NULL,
(GAsyncReadyCallback)cb,
func_data);
+ if (cb == NULL)
+ g_object_unref(proxy);
BT_DBG("-");
return BLUETOOTH_ERROR_NONE;
}
GVariant *value = NULL;
GVariant *ret = NULL;
int result = BLUETOOTH_ERROR_INTERNAL;
- BT_INFO("+");
+
retv_if(remote_uuid == NULL, BLUETOOTH_ERROR_INTERNAL);
- gconn = _bt_get_system_private_conn();
+ gconn = _bt_get_system_common_conn();
retv_if(gconn == NULL, BLUETOOTH_ERROR_INTERNAL);
object_path = _bt_get_device_object_path(address);
retv_if(object_path == NULL, BLUETOOTH_ERROR_INTERNAL);
unsigned int class = 0x00;
int ret = BLUETOOTH_ERROR_NONE;
- gconn = _bt_get_system_private_conn();
+ gconn = _bt_get_system_common_conn();
retv_if(gconn == NULL, BLUETOOTH_ERROR_INTERNAL);
object_path = _bt_get_device_object_path(address);
DBUS_TIMEOUT, NULL,
(GAsyncReadyCallback)cb,
func_data);
+ if (cb == NULL)
+ g_object_unref(proxy);
BT_DBG("-");
return BLUETOOTH_ERROR_NONE;
}
{
GDBusProxy *proxy;
char *object_path;
+ GDBusConnection *gconn;
+ GError *err = NULL;
object_path = _bt_get_device_object_path(address);
if (object_path == NULL)
return BLUETOOTH_ERROR_INTERNAL;
- proxy = __bt_gdbus_get_device_proxy(object_path);
+ gconn = _bt_get_system_shared_conn();
+ if (gconn == NULL) {
+ g_free(object_path);
+ return BLUETOOTH_ERROR_INTERNAL;
+ }
+
+ proxy = g_dbus_proxy_new_sync(gconn, G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
+ NULL, BT_BLUEZ_NAME,
+ object_path,
+ BT_DEVICE_INTERFACE,
+ NULL, &err);
+
g_free(object_path);
- if (proxy == NULL) {
- BT_ERR("Error while getting proxy");
+
+ if (proxy == NULL && err) {
+ BT_ERR("Unable to create proxy: %s", err->message);
+ g_clear_error(&err);
return BLUETOOTH_ERROR_INTERNAL;
}
g_variant_new("(o)", path),
G_DBUS_CALL_FLAGS_NONE,
DBUS_TIMEOUT, NULL, NULL, NULL);
+ g_object_unref(proxy);
BT_DBG("-");
return BLUETOOTH_ERROR_NONE;
}
GDBusConnection *conn = NULL;
char *object_path = NULL;
- conn = _bt_get_system_private_conn();
+ conn = _bt_get_system_common_conn();
retv_if(conn == NULL, NULL);
proxy = g_dbus_proxy_new_sync(conn,
BT_DBG("+");
- g_conn = _bt_get_system_private_conn();
+ g_conn = _bt_get_system_common_conn();
retv_if(g_conn == NULL, NULL);
manager_proxy = g_dbus_proxy_new_sync(g_conn,
BT_EXPORT_API int bluetooth_get_uuid_name(const char *uuid, char **name)
{
-#define SHORT_UUID_COUNT 162
+#define SHORT_UUID_COUNT 199
#define LONG_UUID_COUNT 17
int offset = 0;
{"181D", "Weight Scale"},
{"181E", "Bond Management"},
{"181F", "Continuous Glucose Monitoring"},
+ {"1820", "Internet Protocol Support Service"},
+ {"1821", "Indoor Positioning"},
+ {"1822", "Pulse Oximeter Service"},
+ {"1823", "HTTP Proxy"},
+ {"1824", "Transport Discovery"},
+ {"1825", "Object Transfer Service"},
+ {"1826", "Fitness Machine"},
+ {"1827", "Mesh Provisioning Service"},
+ {"1828", "Mesh Proxy Service"},
+ {"1829", "Reconnection Configuration"},
+ {"183A", "Insulin Delivery"},
/* GATT Declarations */
{"2800", "Primary Service Declaration"},
{"2A68", "Navigation"},
{"2A6D", "Pressure"},
{"2A6E", "Temperature"},
+ {"2A8E", "Height"},
+ {"2A90", "Last Name"},
+ {"2A91", "Maximum Recommended Heart Rate"},
+ {"2A92", "Resting Heart Rate"},
+ {"2A98", "Weight"},
+ {"2A9B", "Body Composition Feature"},
+ {"2A9C", "Body Composition Measurement"},
+ {"2A9D", "Weight Measurement"},
+ {"2AA2", "Language"},
+ {"2AA4", "Bond Management Control Point"},
+ {"2AA5", "Bond Management Features"},
+ {"2AA6", "Central Address Resolution"},
+ {"2AAD", "Indoor Positioning Configuration"},
+ {"2AB5", "Location Name"},
+ {"2AB6", "URI"},
+ {"2ABC", "TDS Control Point"},
+ {"2AC9", "Resolvable Private Address Only"},
+ {"2ACC", "Fitness Machine Feature"},
+ {"2ACE", "Cross Trainer Data"},
+ {"2AD3", "Training Status"},
+ {"2AD7", "Supported Heart Rate Range"},
+ {"2AD9", "Fitness Machine Control Point"},
+ {"2ADA", "Fitness Machine Status"},
+ {"2B1D", "RC Feature"},
+ {"2B1E", "RC Settings"},
+ {"2B1F", "Reconnection Configuration Control Point"},
};
static uuid_name_s long_uuid_name[LONG_UUID_COUNT] = {
// List should be sorted by UUID
start = p + 1;
}
- BT_INFO("Unknown uuid : %s", uuid);
*name = g_strdup("Unknown");
return BLUETOOTH_ERROR_NONE;
}
{
int ret;
- _bt_get_system_private_conn();
+ _bt_get_system_common_conn();
ret = _bt_init_event_handler();
if (ret != BLUETOOTH_ERROR_NONE &&
{
int ret;
-
ret = _bt_deinit_event_handler();
if (ret != BLUETOOTH_ERROR_NONE)
BT_ERR("Fail to deinit the event handler");
_bt_set_obex_server_id(BT_NO_SERVER);
+ _bt_reset_battery_monitor_info();
+
_bt_gdbus_deinit_proxys();
- if (system_private_conn) {
- g_object_unref(system_private_conn);
- system_private_conn = NULL;
+ if (profile_gproxy) {
+ g_object_unref(profile_gproxy);
+ profile_gproxy = NULL;
+ }
+
+ if (system_common_conn) {
+ g_object_unref(system_common_conn);
+ system_common_conn = NULL;
}
return BLUETOOTH_ERROR_NONE;
}
-