X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=bt-api%2Fbt-event-handler.c;h=79ce01ad4159fcf27a18b12ddd5e9ca338131390;hb=89402339a81775d534510fb74c539f10655ef6c2;hp=c0df9272882c4ada0fa33715fd9bd9ec46fc3fee;hpb=6d2d19a0849d91417d12151ffa584158d5641608;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git diff --git a/bt-api/bt-event-handler.c b/bt-api/bt-event-handler.c index c0df927..79ce01a 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,370 @@ 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.appkey_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_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); + } + BT_INFO("Mesh event handler Exit <<"); +} + void __bt_adapter_event_filter(GDBusConnection *connection, const gchar *sender_name, const gchar *object_path, @@ -474,6 +840,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.", @@ -497,7 +866,7 @@ void __bt_adapter_event_filter(GDBusConnection *connection, BT_INFO("App-wise data transaction details:"); for (GSList *l = data->atm_list; l != NULL; l = g_slist_next(l)) { bt_battery_app_data *t = (bt_battery_app_data *)(l->data); - BT_DBG("%ld %ld %d %d", (long int)(t->uid), (long int)(t->pid), t->rx_bytes, t->tx_bytes); + BT_DBG("%ld %ld %d %d %u", (long int)(t->uid), (long int)(t->pid), t->rx_bytes, t->tx_bytes, t->time); } } @@ -506,6 +875,7 @@ void __bt_adapter_event_filter(GDBusConnection *connection, event_info->cb, event_info->user_data); g_slist_free(data->atm_list); g_free(data); + g_array_free(dbus_data, TRUE); } else if (strcasecmp(signal_name, BT_DISCOVERABLE_MODE_CHANGED) == 0) { int mode = 0; @@ -818,6 +1188,7 @@ void __bt_adapter_le_event_filter(GDBusConnection *connection, BLUETOOTH_ERROR_NONE, NULL, event_info->cb, event_info->user_data); } else if (strcasecmp(signal_name, BT_LE_DISCOVERY_FINISHED) == 0) { + _bt_set_le_scan_status(FALSE); g_variant_get(parameters, "(i)", &result); _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISCOVERY_FINISHED, result, NULL, @@ -873,7 +1244,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} }; @@ -881,7 +1252,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); @@ -892,7 +1262,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); @@ -903,7 +1272,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); @@ -914,34 +1282,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} }; @@ -1017,7 +1360,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); @@ -1027,8 +1369,9 @@ void __bt_device_event_filter(GDBusConnection *connection, unsigned char addr_type; bt_connection_info_t conn_info; bluetooth_device_address_t dev_address = { {0} }; - BT_DBG("BT_DEVICE_DISCONNECTED"); - g_variant_get(parameters, "(i&sy)", &result, &address, &addr_type); + int rssi; + 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); @@ -1041,7 +1384,7 @@ void __bt_device_event_filter(GDBusConnection *connection, conn_info.addr_type = addr_type; conn_info.disc_reason = result; - BT_DBG("Sending Event to Framework, disconnect reason [0x%x]", result); + conn_info.rssi = rssi; _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_DISCONNECTED, result, &conn_info, event_info->cb, event_info->user_data); @@ -1052,7 +1395,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]", @@ -1071,7 +1414,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; @@ -1089,7 +1432,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]", @@ -1236,7 +1579,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); @@ -1390,6 +1733,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); } } @@ -2232,7 +2590,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); } @@ -2251,6 +2609,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) { @@ -2279,6 +2638,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, @@ -2409,9 +2769,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, @@ -3111,7 +3474,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; @@ -3120,13 +3482,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); @@ -3558,7 +3913,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, @@ -3567,8 +3921,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; @@ -3577,7 +3929,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; @@ -3586,7 +3938,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)); @@ -3604,8 +3955,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 */ @@ -3618,16 +3969,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; @@ -3636,7 +3987,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)); @@ -3654,11 +4004,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); } @@ -3669,16 +4018,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; @@ -3714,9 +4063,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; @@ -3728,7 +4080,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)); @@ -3768,16 +4119,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; @@ -3807,8 +4159,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); @@ -3824,13 +4176,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, @@ -3841,42 +4213,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; @@ -3915,13 +4262,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} }; @@ -4027,8 +4372,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 @@ -4106,41 +4449,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; @@ -4150,13 +4486,14 @@ 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; @@ -4257,7 +4594,7 @@ void _bt_register_name_owner_changed(void) 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); }