X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bt-api%2Fbt-event-handler.c;h=1c4f3293a584038a14ccf930532e9f5413bbe707;hb=62a00d2e3430ed504bc220bcfe67387dd0507e22;hp=0827627a673c4e1654ae135f8ed3ffe428adb916;hpb=c4c81d78b2562ba6cf6b1fee4cff837f6b46fff6;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git diff --git a/bt-api/bt-event-handler.c b/bt-api/bt-event-handler.c index 0827627..1c4f329 100644 --- a/bt-api/bt-event-handler.c +++ b/bt-api/bt-event-handler.c @@ -30,6 +30,8 @@ #include "bluetooth-gatt-server-api.h" #endif +#include "bluetooth-mesh-api.h" + #include "bt-common.h" #include "bt-event-handler.h" #include "bt-gatt-client.h" @@ -400,6 +402,374 @@ static void __bt_fill_garray_from_variant(GVariant *var, GArray *param) } } +/* Mesh Event Handler */ +static void __bt_mesh_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_INFO("Mesh event handler Entry >>"); + bt_event_info_t *event_info; + + event_info = (bt_event_info_t *)user_data; + ret_if(event_info == NULL); + + if (strcasecmp(signal_name, BT_MESH_SCAN_STARTED) == 0) { + int result; + GVariant *param = NULL; + GArray *dbus_data = NULL; + bluetooth_mesh_network_t *info = NULL; + + g_variant_get(parameters, "(iv)", &result, ¶m); + dbus_data = g_array_new(TRUE, TRUE, sizeof(gchar)); + + __bt_fill_garray_from_variant(param, dbus_data); + g_variant_unref(param); + + info = &g_array_index(dbus_data, bluetooth_mesh_network_t, 0); + + _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_SCAN_STARTED, + result, info, + event_info->cb, event_info->user_data); + } else if (strcasecmp(signal_name, BT_MESH_SCAN_FINISHED) == 0) { + int result; + GVariant *param = NULL; + GArray *dbus_data = NULL; + bluetooth_mesh_network_t *info = NULL; + + g_variant_get(parameters, "(iv)", &result, ¶m); + dbus_data = g_array_new(TRUE, TRUE, sizeof(gchar)); + + __bt_fill_garray_from_variant(param, dbus_data); + g_variant_unref(param); + + info = &g_array_index(dbus_data, bluetooth_mesh_network_t, 0); + + _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_SCAN_FINISHED, + result, info, + event_info->cb, event_info->user_data); + } else if (strcasecmp(signal_name, BT_MESH_SCAN_RESULT) == 0) { + int result; + GVariant *param = NULL; + GArray *dbus_data = NULL; + bluetooth_mesh_scan_result_t *info = NULL; + BT_INFO("Mesh: BT_MESH_SCAN_RESULT"); + + g_variant_get(parameters, "(iv)", &result, ¶m); + dbus_data = g_array_new(TRUE, TRUE, sizeof(gchar)); + + __bt_fill_garray_from_variant(param, dbus_data); + g_variant_unref(param); + + info = &g_array_index(dbus_data, bluetooth_mesh_scan_result_t, 0); + + _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_SCAN_RESULT, + result, info, + event_info->cb, event_info->user_data); + } else if (strcasecmp(signal_name, BT_MESH_AUTHENTICATION_REQ) == 0) { + int result; + GVariant *param = NULL; + GArray *dbus_data = NULL; + bluetooth_mesh_authentication_request_t *info = NULL; + BT_INFO("Mesh: BT_MESH_AUTHENTICATION_REQ"); + + g_variant_get(parameters, "(iv)", &result, ¶m); + dbus_data = g_array_new(TRUE, TRUE, sizeof(gchar)); + + __bt_fill_garray_from_variant(param, dbus_data); + g_variant_unref(param); + + info = &g_array_index(dbus_data, bluetooth_mesh_authentication_request_t, 0); + BT_INFO("Mesh: Authentication Type [%d]", info->auth_type); + + _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_AUTHENTICATION_REQUEST, + result, info, + event_info->cb, event_info->user_data); + } else if (strcasecmp(signal_name, BT_MESH_PROVISIONING_RESULT) == 0) { + int result; + GVariant *param = NULL; + GArray *dbus_data = NULL; + bluetooth_mesh_provisioning_result_t *info = NULL; + BT_INFO("Mesh: BT_MESH_PROVISIONING_RESULT"); + + g_variant_get(parameters, "(iv)", &result, ¶m); + dbus_data = g_array_new(TRUE, TRUE, sizeof(gchar)); + + __bt_fill_garray_from_variant(param, dbus_data); + g_variant_unref(param); + + info = &g_array_index(dbus_data, bluetooth_mesh_provisioning_result_t, 0); + + _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_PROVISIONING_FINISHED, + result, info, + event_info->cb, event_info->user_data); + } else if (strcasecmp(signal_name, BT_MESH_NODE_BROWSED) == 0) { + int result; + GVariant *param = NULL; + GArray *dbus_data = NULL; + bluetooth_mesh_node_discover_t *info = NULL; + BT_INFO("Mesh: Node browsed event"); + g_variant_get(parameters, "(iv)", &result, ¶m); + dbus_data = g_array_new(TRUE, TRUE, sizeof(gchar)); + + __bt_fill_garray_from_variant(param, dbus_data); + g_variant_unref(param); + + info = &g_array_index(dbus_data, bluetooth_mesh_node_discover_t, 0); + + BT_INFO("Mesh: Send Node Browse event: Net UID [%s], Node UUID [%s]", + info->net_uuid, info->dev_uuid); + _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_NODE_BROWSED, + result, info, + event_info->cb, event_info->user_data); + } else if (strcasecmp(signal_name, BT_MESH_NODE_VEND_FEATS) == 0) { + int result; + GVariant *param = NULL; + GArray *dbus_data = NULL; + bluetooth_mesh_node_features_t *info = NULL; + + g_variant_get(parameters, "(iv)", &result, ¶m); + dbus_data = g_array_new(TRUE, TRUE, sizeof(gchar)); + + __bt_fill_garray_from_variant(param, dbus_data); + g_variant_unref(param); + + info = &g_array_index(dbus_data, bluetooth_mesh_node_features_t, 0); + + _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_NODE_VENDOR_FEATURES, + result, info, + event_info->cb, event_info->user_data); + } else if (strcasecmp(signal_name, BT_MESH_NODE_KEY_CONFIGURED) == 0) { + int result; + GVariant *param = NULL; + GArray *dbus_data = NULL; + bluetooth_mesh_key_configure_t *info = NULL; + + g_variant_get(parameters, "(iv)", &result, ¶m); + dbus_data = g_array_new(TRUE, TRUE, sizeof(gchar)); + + __bt_fill_garray_from_variant(param, dbus_data); + g_variant_unref(param); + + info = &g_array_index(dbus_data, bluetooth_mesh_key_configure_t, 0); + + _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_NODE_KEY_CONFIGURED, + result, info, + event_info->cb, event_info->user_data); + } else if (strcasecmp(signal_name, BT_MESH_MODEL_APPKEY_CONFIGURED) == 0) { + int result; + GVariant *param = NULL; + GArray *dbus_data = NULL; + bluetooth_mesh_model_configure_t *info = NULL; + + g_variant_get(parameters, "(iv)", &result, ¶m); + dbus_data = g_array_new(TRUE, TRUE, sizeof(gchar)); + + __bt_fill_garray_from_variant(param, dbus_data); + g_variant_unref(param); + + info = &g_array_index(dbus_data, bluetooth_mesh_model_configure_t, 0); + + _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_MODEL_APPKEY_BIND, + result, info, + event_info->cb, event_info->user_data); + } else if (strcasecmp(signal_name, BT_MESH_MODEL_APPKEY_LIST) == 0) { + int result; + GVariantIter *iter = NULL; + bluetooth_mesh_model_configure_t info; + uint16_t node_unicast; + int elem_idx; + uint32_t model; + const char *net_uuid = NULL; + int total = 0; + uint16_t appkey_idx; + int i; + + g_variant_get(parameters, "(i&sqiui(aq))", &result, &net_uuid, + &node_unicast, &elem_idx, &model, &total, &iter); + + memset(&info, 0x00, sizeof(bluetooth_mesh_model_configure_t)); + info.primary_unicast = node_unicast; + g_strlcpy(info.net_uuid, net_uuid, 33); + info.elem_index = elem_idx; + info.model = model; + info.appkeylist_count = total; + BT_INFO("Mesh: Total appkeys bound to model [%d]", total); + if (total) { + info.appkey_list = (uint16_t**)g_malloc0(sizeof(uint16_t*) * total); + + for (i = 0; i < total && g_variant_iter_loop(iter, "q", &appkey_idx); ++i) { + info.appkey_list[i] = g_malloc0(sizeof(uint16_t)); + *info.appkey_list[i] = appkey_idx; + } + } + + _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_MODEL_APPKEY_LIST, + result, &info, + event_info->cb, event_info->user_data); + + for (i = 0; i < total; i++) + g_free(info.appkey_list[i]); + if (info.appkey_list) { + g_free(info.appkey_list); + g_variant_iter_free(iter); + } + + } else if (strcasecmp(signal_name, BT_MESH_MODEL_SUB_LIST) == 0) { + int result; + GVariantIter *iter = NULL; + bluetooth_mesh_model_configure_t info; + uint16_t node_unicast; + int elem_idx; + uint32_t model; + const char *net_uuid = NULL; + int total = 0; + uint16_t sub_addr; + int i; + + g_variant_get(parameters, "(i&sqiui(aq))", &result, &net_uuid, + &node_unicast, &elem_idx, &model, &total, &iter); + + memset(&info, 0x00, sizeof(bluetooth_mesh_model_configure_t)); + info.primary_unicast = node_unicast; + g_strlcpy(info.net_uuid, net_uuid, 33); + info.elem_index = elem_idx; + info.model = model; + info.sublist_count = total; + + BT_INFO("Mesh: Total Subscriptions Bound to model [%d]", total); + if (total) { + info.sub_list = (uint16_t**)g_malloc0(sizeof(uint16_t*) * total); + for (i = 0; i < total && g_variant_iter_loop(iter, "q", &sub_addr); ++i) { + info.sub_list[i] = g_malloc0(sizeof(uint16_t)); + *info.sub_list[i] = sub_addr; + BT_INFO("Mesh: Subscription Address [0x%2.2x]", sub_addr); + } + } + + _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_MODEL_SUBSCRIPTION_LIST, + result, &info, + event_info->cb, event_info->user_data); + + for (i = 0; i < total; i++) + g_free(info.sub_list[i]); + if (info.sub_list) { + g_free(info.sub_list); + g_variant_iter_free(iter); + } + } else if (strcasecmp(signal_name, BT_MESH_NODE_TTL_CONFIGURED) == 0) { + int result; + GVariant *param = NULL; + GArray *dbus_data = NULL; + bluetooth_mesh_node_ttl_info_t *info = NULL; + + g_variant_get(parameters, "(iv)", &result, ¶m); + dbus_data = g_array_new(TRUE, TRUE, sizeof(gchar)); + + __bt_fill_garray_from_variant(param, dbus_data); + g_variant_unref(param); + + info = &g_array_index(dbus_data, bluetooth_mesh_node_ttl_info_t, 0); + + _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_NODE_TTL_CONFIGURED, + result, info, + event_info->cb, event_info->user_data); + } else if (strcasecmp(signal_name, BT_MESH_MODEL_SUB_CONF) == 0) { + int result; + GVariant *param = NULL; + GArray *dbus_data = NULL; + bluetooth_mesh_key_configure_t *info = NULL; + + g_variant_get(parameters, "(iv)", &result, ¶m); + dbus_data = g_array_new(TRUE, TRUE, sizeof(gchar)); + + __bt_fill_garray_from_variant(param, dbus_data); + g_variant_unref(param); + + info = &g_array_index(dbus_data, bluetooth_mesh_key_configure_t, 0); + + _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_MODEL_SUBSCRIPTION_CONFGURED, + result, info, + event_info->cb, event_info->user_data); + } else if (strcasecmp(signal_name, BT_MESH_MODEL_VIR_SUB_CONF) == 0) { + int result; + GVariant *param = NULL; + GArray *dbus_data = NULL; + bluetooth_mesh_key_configure_t *info = NULL; + + g_variant_get(parameters, "(iv)", &result, ¶m); + dbus_data = g_array_new(TRUE, TRUE, sizeof(gchar)); + + __bt_fill_garray_from_variant(param, dbus_data); + g_variant_unref(param); + + info = &g_array_index(dbus_data, bluetooth_mesh_key_configure_t, 0); + + _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_MODEL_VIRTUAL_SUBSCRIPTION_CONFGURED, + result, info, + event_info->cb, event_info->user_data); + } else if (strcasecmp(signal_name, BT_MESH_MODEL_PUB_STATUS) == 0) { + int result; + GVariant *param = NULL; + GArray *dbus_data = NULL; + bluetooth_mesh_key_configure_t *info = NULL; + + g_variant_get(parameters, "(iv)", &result, ¶m); + dbus_data = g_array_new(TRUE, TRUE, sizeof(gchar)); + + __bt_fill_garray_from_variant(param, dbus_data); + g_variant_unref(param); + + info = &g_array_index(dbus_data, bluetooth_mesh_key_configure_t, 0); + + _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_MODEL_PUBLICATION_STATUS, + result, info, + event_info->cb, event_info->user_data); + } else if (strcasecmp(signal_name, BT_MESH_MODEL_MSG_EXECUTED) == 0) { + int result; + GVariant *param = NULL; + GArray *dbus_data = NULL; + bluetooth_mesh_model_msg_t *info = NULL; + + g_variant_get(parameters, "(iv)", &result, ¶m); + dbus_data = g_array_new(TRUE, TRUE, sizeof(gchar)); + + __bt_fill_garray_from_variant(param, dbus_data); + g_variant_unref(param); + + info = &g_array_index(dbus_data, bluetooth_mesh_model_msg_t, 0); + + _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_MODEL_MSG_EXECUTED, + result, info, + event_info->cb, event_info->user_data); + } else if (strcasecmp(signal_name, BT_MESH_JOIN_COMPLETED) == 0) { + int result; + GVariant *param = NULL; + GArray *dbus_data = NULL; + BT_INFO("Mesh: JOIN event"); + bluetooth_mesh_network_t *info = NULL; + + g_variant_get(parameters, "(iv)", &result, ¶m); + dbus_data = g_array_new(TRUE, TRUE, sizeof(gchar)); + + __bt_fill_garray_from_variant(param, dbus_data); + g_variant_unref(param); + + info = &g_array_index(dbus_data, bluetooth_mesh_network_t, 0); + + if (!info) + BT_INFO("Mesh: info is null"); + + _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_JOIN_COMPLETED, + result, info, + event_info->cb, event_info->user_data); + } + BT_INFO("Mesh event handler Exit <<"); +} + void __bt_adapter_event_filter(GDBusConnection *connection, const gchar *sender_name, const gchar *object_path, @@ -474,6 +844,9 @@ void __bt_adapter_event_filter(GDBusConnection *connection, data->session_end_time = info->session_end_time; data->session_scan_time = info->session_scan_time; data->session_connected_time = info->session_connected_time; + data->tx_time = info->tx_time; + data->rx_time = info->rx_time; + data->idle_time = info->idle_time; data->atm_list = NULL; BT_INFO("Received battery data in bt-api: %ld %ld %d %d.", @@ -875,7 +1248,7 @@ void __bt_device_event_filter(GDBusConnection *connection, #endif ret_if(signal_name == NULL); -#ifdef TIZEN_GATT_CLIENT + if (strcasecmp(signal_name, BT_GATT_SERVER_CONNECTED) == 0) { const char *address = NULL; bluetooth_device_address_t dev_address = { {0} }; @@ -883,7 +1256,6 @@ void __bt_device_event_filter(GDBusConnection *connection, g_variant_get(parameters, "(i&s)", &result, &address); _bt_convert_addr_string_to_type(dev_address.addr, address); - BT_DBG("Sending Event to Framework"); _bt_common_event_cb(BLUETOOTH_EVENT_GATT_SERVER_CONNECTED, result, &dev_address, event_info->cb, event_info->user_data); @@ -894,7 +1266,6 @@ void __bt_device_event_filter(GDBusConnection *connection, g_variant_get(parameters, "(i&s)", &result, &address); _bt_convert_addr_string_to_type(dev_address.addr, address); - BT_DBG("Sending Event to Framework"); _bt_common_event_cb(BLUETOOTH_EVENT_GATT_SERVER_DISCONNECTED, result, &dev_address, event_info->cb, event_info->user_data); @@ -905,7 +1276,6 @@ void __bt_device_event_filter(GDBusConnection *connection, g_variant_get(parameters, "(i&s)", &result, &address); _bt_convert_addr_string_to_type(dev_address.addr, address); - BT_DBG("Sending Event to Framework"); _bt_common_event_cb(BLUETOOTH_EVENT_GATT_CLIENT_CONNECTED, result, &dev_address, event_info->cb, event_info->user_data); @@ -916,34 +1286,9 @@ void __bt_device_event_filter(GDBusConnection *connection, g_variant_get(parameters, "(i&s)", &result, &address); _bt_convert_addr_string_to_type(dev_address.addr, address); - BT_DBG("Sending Event to Framework"); _bt_common_event_cb(BLUETOOTH_EVENT_GATT_CLIENT_DISCONNECTED, result, &dev_address, event_info->cb, event_info->user_data); -#else - if (strcasecmp(signal_name, BT_GATT_CONNECTED) == 0) { - const char *address = NULL; - bluetooth_device_address_t dev_address = { {0} }; - BT_DBG("BT_GATT_CONNECTED"); - g_variant_get(parameters, "(i&s)", &result, &address); - - _bt_convert_addr_string_to_type(dev_address.addr, address); - BT_DBG("Sending Event to Framework"); - _bt_common_event_cb(BLUETOOTH_EVENT_GATT_CONNECTED, - result, &dev_address, - event_info->cb, event_info->user_data); - } else if (strcasecmp(signal_name, BT_GATT_DISCONNECTED) == 0) { - const char *address = NULL; - bluetooth_device_address_t dev_address = { {0} }; - BT_DBG("BT_GATT_DISCONNECTED"); - g_variant_get(parameters, "(i&s)", &result, &address); - - _bt_convert_addr_string_to_type(dev_address.addr, address); - BT_DBG("Sending Event to Framework"); - _bt_common_event_cb(BLUETOOTH_EVENT_GATT_DISCONNECTED, - result, &dev_address, - event_info->cb, event_info->user_data); -#endif } else if (strcasecmp(signal_name, BT_GATT_REQ_ATT_MTU_CHANGED) == 0) { const char *address = NULL; bluetooth_device_address_t dev_address = { {0} }; @@ -1019,7 +1364,6 @@ void __bt_device_event_filter(GDBusConnection *connection, conn_info.addr_type = addr_type; conn_info.disc_reason = 0; - BT_DBG("Sending Event to Framework"); _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_CONNECTED, result, &conn_info, event_info->cb, event_info->user_data); @@ -1030,8 +1374,8 @@ void __bt_device_event_filter(GDBusConnection *connection, bt_connection_info_t conn_info; bluetooth_device_address_t dev_address = { {0} }; int rssi; - BT_DBG("BT_DEVICE_DISCONNECTED"); g_variant_get(parameters, "(i&syi)", &result, &address, &addr_type, &rssi); + BT_DBG("BT_DEVICE_DISCONNECTED reason(%d)", result); _bt_convert_addr_string_to_type(dev_address.addr, address); @@ -1045,7 +1389,6 @@ void __bt_device_event_filter(GDBusConnection *connection, conn_info.addr_type = addr_type; conn_info.disc_reason = result; conn_info.rssi = rssi; - BT_DBG("Sending Event to Framework, disconnect reason [0x%x]", result); _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_DISCONNECTED, result, &conn_info, event_info->cb, event_info->user_data); @@ -1056,7 +1399,7 @@ void __bt_device_event_filter(GDBusConnection *connection, int link_type; gboolean rssi_enabled = FALSE; - g_variant_get(parameters, "(isib)", &result, &address, + g_variant_get(parameters, "(i&sib)", &result, &address, &link_type, &rssi_enabled); BT_DBG("RSSI Enabled[Address:%s LinkType:%d RSSI_dbm:%d]", @@ -1075,7 +1418,7 @@ void __bt_device_event_filter(GDBusConnection *connection, int link_type; bt_rssi_alert_t alert = { 0, }; - g_variant_get(parameters, "(isiii)", &result, &address, + g_variant_get(parameters, "(i&siii)", &result, &address, &link_type, &alert_type, &rssi_dbm); alert.alert_type = alert_type; @@ -1093,7 +1436,7 @@ void __bt_device_event_filter(GDBusConnection *connection, char *address; bt_raw_rssi_t raw_rssi = { 0, }; - g_variant_get(parameters, "(isii)", &result, + g_variant_get(parameters, "(i&sii)", &result, &address, &link_type, &rssi_dbm); BT_DBG("Address [%s] Link Type[%d] dBm[%d]", @@ -1240,7 +1583,7 @@ void __bt_device_event_filter(GDBusConnection *connection, BT_DBG("BT_PXP_PROPERTY_CHANGED"); - g_variant_get(parameters, "(isiii)", &result, &address, &role, &type, &level); + g_variant_get(parameters, "(i&siii)", &result, &address, &role, &type, &level); _bt_convert_addr_string_to_type(dev_address.addr, address); memcpy(¶ms.device_address, &dev_address, BLUETOOTH_ADDRESS_LENGTH); @@ -1394,6 +1737,21 @@ void __bt_headset_event_filter(GDBusConnection *connection, _bt_headset_event_cb(BLUETOOTH_EVENT_AG_MIC_GAIN, result, &gain, event_info->cb, event_info->user_data); + } else if (strcasecmp(signal_name, BT_AUDIO_AVC_MODE_CHANGED) == 0) { + bool mode; + + g_variant_get(parameters, "(b)", &mode); + + _bt_headset_event_cb(BLUETOOTH_EVENT_AUDIO_AVC_STATUS, + result, &mode, + event_info->cb, event_info->user_data); + } else if (strcasecmp(signal_name, BT_MEDIA_VOLUME_CHANGE) == 0) { + unsigned int volume; + + g_variant_get(parameters, "(u)", &volume); + _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_VOLUME_CHANGED, + result, &volume, + event_info->cb, event_info->user_data); } } @@ -2236,7 +2594,7 @@ void __bt_map_client_event_filter(GDBusConnection *connection, GVariant* value = NULL; while (g_variant_iter_loop(res, "{sv}", &key, &value)) { char* string_value = NULL; - g_variant_get(value, "s", &string_value); + g_variant_get(value, "&s", &string_value); BT_DBG("got folder name: %s", string_value); folders_struct.names[i] = strdup(string_value); } @@ -2255,6 +2613,7 @@ void __bt_map_client_event_filter(GDBusConnection *connection, } g_free(folders_struct.names); + g_variant_iter_free(iter); g_variant_unref(folder_list_var); } else if (strcasecmp(signal_name, BT_MAP_FILTER_FIELDS_COMPLETE) == 0) { @@ -2283,6 +2642,7 @@ void __bt_map_client_event_filter(GDBusConnection *connection, fields_info.fields[i] = strdup(field); i++; } + g_variant_iter_free(iter); } _bt_common_event_cb(BLUETOOTH_EVENT_MAP_LIST_FILTER_FIELD_COMPLETE, @@ -2413,9 +2773,12 @@ void __bt_map_client_event_filter(GDBusConnection *connection, messages_struct.message_items[i].is_protected = value_bool ? 1 : 0; BT_DBG(" Protected: %s", value_bool ? "true" : "false"); } + + g_free(value_string); } ++i; } + g_variant_iter_free(iter); _bt_common_event_cb(BLUETOOTH_EVENT_MAP_LIST_MESSAGES_COMPLETE, result, &messages_struct, @@ -3115,7 +3478,6 @@ static void __bt_tds_event_filter(GDBusConnection *connection, const char *address = NULL; char *data; int data_len = 0; - int k; GVariant *var = NULL; bluetooth_tds_transport_data_info_t *info = NULL; @@ -3124,13 +3486,6 @@ static void __bt_tds_event_filter(GDBusConnection *connection, data = (char *)g_variant_get_data(var); if (data) { - BT_DBG("Address [%s]", address); - BT_DBG("Data len [%d]", data_len); - - /* DEBUG */ - for (k = 0; k < data_len ; k++) - BT_DBG("Data[%d] [0x%x]", k, data[k]); - if (data_len == 0) { BT_ERR("No data"); g_variant_unref(var); @@ -3369,6 +3724,11 @@ static void __bt_otp_event_filter(GDBusConnection *connection, _bt_common_event_cb(BLUETOOTH_EVENT_OTC_STATE_CHANGED, result, otc_info, event_info->cb, event_info->user_data); + if (otc_info->address) + g_free(otc_info->address); + + if (otc_info) + g_free(otc_info); } BT_DBG("-"); @@ -3562,7 +3922,6 @@ static void __bt_event_data_free(void *data) g_free(cb_data); } -#ifdef TIZEN_GATT_CLIENT static void __bt_gatt_client_event_filter(GDBusConnection *connection, const gchar *sender_name, const gchar *object_path, @@ -3571,8 +3930,6 @@ static void __bt_gatt_client_event_filter(GDBusConnection *connection, GVariant *parameters, gpointer user_data) { - BT_DBG("GATT Client event handler Entry >>"); - bt_event_info_t *event_info; int result = BLUETOOTH_ERROR_NONE; @@ -3581,7 +3938,7 @@ static void __bt_gatt_client_event_filter(GDBusConnection *connection, if (strcasecmp(signal_name, BT_GATT_CHAR_VAL_CHANGED) == 0) { /* Done */ /* Event: BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED */ - BT_INFO("GATT Client event[BT_GATT_CHAR_VAL_CHANGED]"); + BT_DBG("GATT Client event[BT_GATT_CHAR_VAL_CHANGED]"); bt_gatt_char_property_t char_prop; const char *address = NULL; GVariant *data_var = NULL; @@ -3590,7 +3947,6 @@ static void __bt_gatt_client_event_filter(GDBusConnection *connection, GVariant *char_uuid_var = NULL; int svc_uuid_len = 0; int char_uuid_len = 0; - unsigned int i; memset(&char_prop, 0x00, sizeof(bt_gatt_char_property_t)); @@ -3608,8 +3964,8 @@ static void __bt_gatt_client_event_filter(GDBusConnection *connection, &data_var); g_strlcpy(char_prop.address, address, BT_ADDRESS_STRING_SIZE); - BT_INFO("GATT Client Char value changed in remote Server [%s]", address); - BT_INFO("GATT Client Char Val len: [%d]", char_prop.val_len); + BT_DBG("GATT Client Char value changed in remote Server [%s]", address); + BT_DBG("GATT Client Char Val len: [%d]", char_prop.val_len); if (char_prop.val_len > 0) { /* Copy Data */ @@ -3622,16 +3978,16 @@ static void __bt_gatt_client_event_filter(GDBusConnection *connection, memcpy(&char_prop.svc_prop.uuid, g_variant_get_data(svc_uuid_var), 16); char_prop.svc_prop.instance_id = svc_inst; - /* DEBUG */ - for (i = 0; i < char_prop.val_len; i++) - BT_INFO("Data[%d] = [0x%x]", i, char_prop.value[i]); - _bt_gatt_client_event_cb(BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED, result, &char_prop, event_info->cb, event_info->user_data); + + g_variant_unref(svc_uuid_var); + g_variant_unref(char_uuid_var); + g_variant_unref(data_var); } else if (strcasecmp(signal_name, BT_GATT_CLIENT_READ_CHAR) == 0) { /* Done */ /* Event: BLUETOOTH_EVENT_GATT_READ_CHAR */ - BT_INFO("GATT Client event[BT_GATT_CLIENT_READ_CHAR]"); + BT_DBG("GATT Client event[BT_GATT_CLIENT_READ_CHAR]"); bt_gatt_char_property_t char_prop; const char *address = NULL; GVariant *data_var = NULL; @@ -3640,7 +3996,6 @@ static void __bt_gatt_client_event_filter(GDBusConnection *connection, GVariant *char_uuid_var = NULL; int svc_uuid_len = 0; int char_uuid_len = 0; - unsigned int i; memset(&char_prop, 0x00, sizeof(bt_gatt_char_property_t)); @@ -3658,11 +4013,10 @@ static void __bt_gatt_client_event_filter(GDBusConnection *connection, &data_var); g_strlcpy(char_prop.address, address, BT_ADDRESS_STRING_SIZE); - BT_INFO("GATT Client Read Callback from [%s] svc inst [%d] char val len [%d] char inst [%d]", + BT_DBG("GATT Client Read Callback from [%s] svc inst [%d] char val len [%d] char inst [%d]", address, svc_inst, char_prop.val_len, char_prop.prop.instance_id); if (char_prop.val_len > 0) { - BT_INFO("Get the read data"); /* Copy Data */ memcpy(&char_prop.value, g_variant_get_data(data_var), char_prop.val_len); } @@ -3673,16 +4027,16 @@ static void __bt_gatt_client_event_filter(GDBusConnection *connection, memcpy(&char_prop.svc_prop.uuid, g_variant_get_data(svc_uuid_var), 16); char_prop.svc_prop.instance_id = svc_inst; - /* DEBUG */ - for (i = 0; i < char_prop.val_len; i++) - BT_INFO("Data[%d] = [0x%x]", i, char_prop.value[i]); - _bt_gatt_client_event_cb(BLUETOOTH_EVENT_GATT_READ_CHAR, result, &char_prop, event_info->cb, event_info->user_data); + + g_variant_unref(svc_uuid_var); + g_variant_unref(char_uuid_var); + g_variant_unref(data_var); } else if (strcasecmp(signal_name, BT_GATT_CLIENT_WRITE_CHAR) == 0) { /* Done */ /* Event: BLUETOOTH_EVENT_GATT_WRITE_CHAR */ - BT_INFO("GATT Client event[BT_GATT_CLIENT_WRITE_CHAR]"); + BT_DBG("GATT Client event[BT_GATT_CLIENT_WRITE_CHAR]"); bt_gatt_char_property_t char_prop; const char *address = NULL; GVariant *svc_uuid_var = NULL; @@ -3718,9 +4072,12 @@ static void __bt_gatt_client_event_filter(GDBusConnection *connection, _bt_gatt_client_event_cb(BLUETOOTH_EVENT_GATT_WRITE_CHAR, result, &char_prop, event_info->cb, event_info->user_data); + + g_variant_unref(svc_uuid_var); + g_variant_unref(char_uuid_var); } else if (strcasecmp(signal_name, BT_GATT_CLIENT_READ_DESC) == 0) { /* Done */ /* Event: BLUETOOTH_EVENT_GATT_READ_DESC */ - BT_INFO("GATT Client event[BT_GATT_CLIENT_READ_DESC]"); + BT_DBG("GATT Client event[BT_GATT_CLIENT_READ_DESC]"); bt_gatt_char_descriptor_property_t desc_prop; const char *address = NULL; GVariant *data_var = NULL; @@ -3732,7 +4089,6 @@ static void __bt_gatt_client_event_filter(GDBusConnection *connection, int svc_uuid_len = 0; int char_uuid_len = 0; int desc_uuid_len = 0; - unsigned int i; memset(&desc_prop, 0x00, sizeof(bt_gatt_char_descriptor_property_t)); @@ -3772,16 +4128,17 @@ static void __bt_gatt_client_event_filter(GDBusConnection *connection, memcpy(&desc_prop.svc_prop.uuid, g_variant_get_data(svc_uuid_var), 16); desc_prop.svc_prop.instance_id = svc_inst; - /* DEBUG */ - for (i = 0; i < desc_prop.val_len; i++) - BT_INFO("Data[%d] = [0x%x]", i, desc_prop.value[i]); - _bt_gatt_client_event_cb(BLUETOOTH_EVENT_GATT_READ_DESC, result, &desc_prop, event_info->cb, event_info->user_data); + + g_variant_unref(svc_uuid_var); + g_variant_unref(char_uuid_var); + g_variant_unref(desc_uuid_var); + g_variant_unref(data_var); } else if (strcasecmp(signal_name, BT_GATT_CLIENT_WRITE_DESC) == 0) { /* Done */ /* Event: BLUETOOTH_EVENT_GATT_WRITE_DESC */ - BT_INFO("GATT Client event[BT_GATT_CLIENT_WRITE_DESC]"); + BT_DBG("GATT Client event[BT_GATT_CLIENT_WRITE_DESC]"); bt_gatt_char_descriptor_property_t desc_prop; const char *address = NULL; GVariant *svc_uuid_var = NULL; @@ -3811,8 +4168,8 @@ static void __bt_gatt_client_event_filter(GDBusConnection *connection, g_strlcpy(desc_prop.address, address, BT_ADDRESS_STRING_SIZE); - BT_INFO("GATT Client Write Descriptor Callback from [%s]", address); - BT_INFO("GATT Client Descriptor Val len: [%d]", desc_prop.val_len); + BT_DBG("GATT Client Write Descriptor Callback from [%s]", address); + BT_DBG("GATT Client Descriptor Val len: [%d]", desc_prop.val_len); /* Copy Data */ memcpy(&desc_prop.prop.uuid, g_variant_get_data(desc_uuid_var), 16); @@ -3828,13 +4185,33 @@ static void __bt_gatt_client_event_filter(GDBusConnection *connection, _bt_gatt_client_event_cb(BLUETOOTH_EVENT_GATT_WRITE_DESC, result, &desc_prop, event_info->cb, event_info->user_data); - } - BT_DBG("GATT Client event handler Exit <<"); -} + g_variant_unref(svc_uuid_var); + g_variant_unref(char_uuid_var); + g_variant_unref(desc_uuid_var); + } else if (strcasecmp(signal_name, BT_GATT_CLIENT_SERVICE_CHANGED) == 0) { + bt_gatt_service_change_t change = {0, }; + char *address_str = NULL; + char *name = NULL; -#endif + g_variant_get(parameters, "(ii&s&s)", &change.inst_id, &change.change_type, &address_str, &change.uuid); + + _bt_convert_addr_string_to_type(change.device_addr.addr, address_str); + + if (_bluetooth_gatt_check_service_change_watcher_address(&change.device_addr) == FALSE) { + BT_DBG("GATT Service changed, but no watcher for %s", address_str); + return; + } + + bluetooth_get_uuid_name(change.uuid, &name); + BT_INFO(" ### GATT Service %s [%s]", change.change_type ? "Added" : "Removed", name); + g_free(name); + _bt_gatt_client_event_cb(BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED, + BLUETOOTH_ERROR_NONE, &change, + event_info->cb, event_info->user_data); + } +} #ifndef GATT_DIRECT static void __bt_gatt_server_event_filter(GDBusConnection *connection, @@ -3845,42 +4222,17 @@ static void __bt_gatt_server_event_filter(GDBusConnection *connection, GVariant *parameters, gpointer user_data) { - BT_INFO("GATT Server event handler Entry >>"); + BT_DBG("Signal : %s", signal_name); bt_event_info_t *event_info; int result = BLUETOOTH_ERROR_NONE; event_info = (bt_event_info_t *)user_data; ret_if(event_info == NULL); -#ifdef TIZEN_GATT_CLIENT - if (strcasecmp(signal_name, BT_GATT_VALUE_CHANGED) == 0) { -#else - if (strcasecmp(signal_name, BT_GATT_CONNECTED) == 0) { - const char *address = NULL; - bluetooth_device_address_t dev_address = { {0} }; - BT_DBG("BT_GATT_CONNECTED"); - g_variant_get(parameters, "(i&s)", &result, &address); - _bt_convert_addr_string_to_type(dev_address.addr, address); - _bt_gatt_server_event_cb(BLUETOOTH_EVENT_GATT_CONNECTED, - result, &dev_address, - event_info->cb, event_info->user_data); - } else if (strcasecmp(signal_name, BT_GATT_DISCONNECTED) == 0) { - const char *address = NULL; - bluetooth_device_address_t dev_address = { {0} }; - BT_DBG("BT_GATT_DISCONNECTED"); - g_variant_get(parameters, "(i&s)", &result, &address); - - _bt_convert_addr_string_to_type(dev_address.addr, address); - _bt_gatt_server_event_cb(BLUETOOTH_EVENT_GATT_DISCONNECTED, - result, &dev_address, - event_info->cb, event_info->user_data); - } else if (strcasecmp(signal_name, BT_GATT_VALUE_CHANGED) == 0) { -#endif - BT_INFO("GATT Server event[BT_GATT_SERVER_WRITE_REQUESTED]"); + if (strcasecmp(signal_name, BT_GATT_VALUE_CHANGED) == 0) { const char *address = NULL; GVariant *data_var = NULL; - int i; bluetooth_device_address_t dev_address = { {0} }; bluetooth_gatt_server_write_requested_info_t write_info; @@ -3919,13 +4271,11 @@ static void __bt_gatt_server_event_filter(GDBusConnection *connection, dev_address.addr, BLUETOOTH_ADDRESS_LENGTH); - /* DEBUG */ - for (i = 0; i < write_info.length; i++) - BT_DBG("Data[%d] = [0x%x]", i, write_info.data.data[i]); - _bt_gatt_server_event_cb(BLUETOOTH_EVENT_GATT_SERVER_VALUE_CHANGED, BLUETOOTH_ERROR_NONE, &write_info, event_info->cb, event_info->user_data); + + g_variant_unref(data_var); } else if (strcasecmp(signal_name, BT_GATT_SERVER_READ_REQ) == 0) { const char *address = NULL; bluetooth_device_address_t dev_address = { {0} }; @@ -4031,8 +4381,6 @@ static void __bt_gatt_server_event_filter(GDBusConnection *connection, event_info->cb, event_info->user_data); } - - BT_INFO("GATT Server event handler Exit <<"); } #endif @@ -4044,8 +4392,17 @@ int _bt_register_event(int event_type, void *event_cb, void *user_data) const char *path; const char *interface = BT_EVENT_SERVICE; - if (is_initialized == FALSE) - _bt_init_event_handler(); + if (is_initialized == FALSE) { + int ret; + + ret = _bt_init_event_handler(); + + if (ret != BLUETOOTH_ERROR_NONE && + ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) { + BT_ERR("Fail to init the event handler"); + return ret; + } + } if (__bt_event_is_registered(event_type) == TRUE) { BT_ERR("The event is already registed"); @@ -4110,41 +4467,34 @@ int _bt_register_event(int event_type, void *event_cb, void *user_data) path = BT_RFCOMM_SERVER_PATH; break; case BT_HF_AGENT_EVENT: - BT_DBG("BT_HF_AGENT_EVENT\n"); event_func = __bt_hf_agent_event_filter; path = BT_HF_AGENT_PATH; interface = BT_HF_SERVICE_INTERFACE; break; case BT_A2DP_SOURCE_EVENT: - BT_DBG("BT_A2DP_SOURCE_EVENT"); event_func = __bt_a2dp_source_event_filter; path = BT_A2DP_SOURCE_PATH; break; case BT_HID_DEVICE_EVENT: - BT_DBG("BT_HID_DEVICE_EVENT"); event_func = __bt_hid_device_event_filter; path = BT_HID_DEVICE_PATH; break; #ifdef GATT_NO_RELAY case BT_GATT_BLUEZ_EVENT: - BT_DBG("BT_GATT_BLUEZ_EVENT"); event_func = __bt_device_event_filter; interface = BT_GATT_CHARACTERISTIC_INTERFACE; path = NULL; break; #endif case BT_TDS_EVENT: - BT_DBG("BT_TDS_EVENT"); event_func = __bt_tds_event_filter; path = BT_TDS_PATH; break; case BT_OTP_EVENT: - BT_DBG("BT_OTP_EVENT"); event_func = __bt_otp_event_filter; path = BT_OTP_PATH; break; case BT_HDP_EVENT: - BT_DBG("BT_HDP_EVENT"); event_func = __bt_hdp_event_filter; path = BT_HDP_DEVICE_PATH; break; @@ -4154,19 +4504,20 @@ int _bt_register_event(int event_type, void *event_cb, void *user_data) path = BT_GATT_SERVER_PATH; break; #endif - -#ifdef TIZEN_GATT_CLIENT case BT_GATT_CLIENT_EVENT: event_func = __bt_gatt_client_event_filter; path = BT_GATT_CLIENT_PATH; break; -#endif + case BT_MESH_EVENT: + event_func = __bt_mesh_event_filter; + path = BT_MESH_PATH; + break; default: BT_ERR("Unknown event"); return BLUETOOTH_ERROR_INTERNAL; } - connection_type = _bt_get_system_private_conn(); + connection_type = _bt_get_system_common_conn(); if (connection_type == NULL) return BLUETOOTH_ERROR_INTERNAL; @@ -4207,7 +4558,7 @@ int _bt_unregister_event(int event_type) return BLUETOOTH_ERROR_INTERNAL; } - connection_type = _bt_get_system_private_conn(); + connection_type = _bt_get_system_common_conn(); event_list = g_slist_remove(event_list, (void *)cb_data); @@ -4255,13 +4606,13 @@ void _bt_register_name_owner_changed(void) { GDBusConnection *connection_type; - connection_type = _bt_get_system_private_conn(); + connection_type = _bt_get_system_common_conn(); if (connection_type == NULL) { BT_ERR("Unable to get the bus"); return; } owner_sig_id = g_dbus_connection_signal_subscribe(connection_type, - NULL, BT_EVENT_FREEDESKTOP, + BT_DBUS_NAME, BT_EVENT_FREEDESKTOP, BT_NAME_OWNER_CHANGED, NULL, NULL, 0, __bt_name_owner_changed, NULL, NULL); } @@ -4270,7 +4621,7 @@ void _bt_unregister_name_owner_changed(void) { GDBusConnection *connection_type; - connection_type = _bt_get_system_private_conn(); + connection_type = _bt_get_system_common_conn(); if (connection_type != NULL && owner_sig_id > 0) { g_dbus_connection_signal_unsubscribe(connection_type, owner_sig_id); @@ -4286,7 +4637,7 @@ static void __bt_gatt_get_uuid_from_path(char *path, char **service_uuid) GVariant *ret = NULL; GVariant *value = NULL; - g_conn = _bt_get_system_private_conn(); + g_conn = _bt_get_system_common_conn(); ret_if(g_conn == NULL); proxy = g_dbus_proxy_new_sync(g_conn, @@ -4408,7 +4759,7 @@ int _bt_register_manager_subscribe_signal(gboolean subscribe) static guint service_added_id = 0; static guint interface_removed_id = 0; - g_conn = _bt_get_system_private_conn(); + g_conn = _bt_get_system_common_conn(); if (g_conn == NULL) return BLUETOOTH_ERROR_INTERNAL;