X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bt-service%2Fbt-service-event-receiver.c;h=86d33baabeea4b2fc0ed051e06d3fb3b67b5d19f;hb=e724e0c9e646830f7a7d67016e648392f2f8d28a;hp=ac8ba5676be685d315877f4815ca5a2dcdb5f8e4;hpb=f8e885220ef2550196796eb81c4f0d89e3060bce;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git diff --git a/bt-service/bt-service-event-receiver.c b/bt-service/bt-service-event-receiver.c index ac8ba56..86d33ba 100644 --- a/bt-service/bt-service-event-receiver.c +++ b/bt-service/bt-service-event-receiver.c @@ -597,76 +597,6 @@ static int __bt_get_agent_signal_info(DBusMessage *msg, char **address, return BLUETOOTH_ERROR_NONE; } -void _bt_handle_adapter_event(DBusMessage *msg) -{ - int result = BLUETOOTH_ERROR_NONE; - DBusMessageIter item_iter; - const char *member = dbus_message_get_member(msg); - - ret_if(member == NULL); - - if (strcasecmp(member, "DeviceCreated") == 0) { - const char *object_path = NULL; - char *address; - bt_remote_dev_info_t *remote_dev_info; - - ret_if(_bt_is_device_creating() == FALSE); - - /* Bonding from remote device */ - address = g_malloc0(BT_ADDRESS_STRING_SIZE); - - dbus_message_iter_init(msg, &item_iter); - dbus_message_iter_get_basic(&item_iter, &object_path); - dbus_message_iter_next(&item_iter); - - _bt_convert_device_path_to_address(object_path, address); - - remote_dev_info = _bt_get_remote_device_info(address); - if (remote_dev_info == NULL) { - g_free(address); - return; - } - - _bt_free_device_info(remote_dev_info); - g_free(address); - } else if (strcasecmp(member, "InterfacesRemoved") == 0) { - const char *object_path = NULL; - char *address; - bt_remote_dev_info_t * dev_info; - GList * node; - - /* Bonding from remote device */ - address = g_malloc0(BT_ADDRESS_STRING_SIZE); - - dbus_message_iter_init(msg, &item_iter); - dbus_message_iter_get_basic(&item_iter, &object_path); - dbus_message_iter_next(&item_iter); - - _bt_convert_device_path_to_address(object_path, address); - - _bt_send_event(BT_ADAPTER_EVENT, - BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED, - DBUS_TYPE_INT32, &result, - DBUS_TYPE_STRING, &address, - DBUS_TYPE_INVALID); - - node = g_list_first(g_list); - - while (node != NULL){ - dev_info = (bt_remote_dev_info_t *)node->data; - if (strcasecmp(dev_info->address, - address) == 0) { - g_list = g_list_remove(g_list, dev_info); - _bt_free_device_info(dev_info); - break; - } - node = g_list_next(node); - } - - g_free(address); - } -} - gboolean _bt_stop_discovery_timeout_cb(gpointer user_data) { DBusGProxy *adapter_proxy; @@ -774,20 +704,17 @@ void __bt_adapter_property_changed_event(DBusMessageIter *msg_iter, const char * DBUS_TYPE_INVALID); } else if (strcasecmp(property, "Powered") == 0) { gboolean power = FALSE; - int power_event; dbus_message_iter_recurse(&dict_iter, &value_iter); dbus_message_iter_get_basic(&value_iter, &power); - power_event = (power == TRUE) ? BLUETOOTH_EVENT_ENABLED : - BLUETOOTH_EVENT_DISABLED; + BT_DBG("power state changed: %d", power); + + if (power == TRUE) + _bt_set_enabled(); + else + _bt_set_disabled(); - BT_ERR("send power state: %d", power); - /* Send event to application */ - _bt_send_event(BT_ADAPTER_EVENT, - power_event, - DBUS_TYPE_INT32, &result, - DBUS_TYPE_INVALID); } else if (strcasecmp(property, "Discoverable") == 0) { gboolean discoverable = FALSE; @@ -939,7 +866,10 @@ void __bt_device_property_changed_event(DBusMessageIter *msg_iter, const char *p } else if (strcasecmp(property, "Paired") == 0) { gboolean paired = FALSE; - bt_remote_dev_info_t *remote_dev_info; + + GList *node; + bt_remote_dev_info_t *dev_info; + bt_remote_dev_info_t *new_dev_info; dbus_message_iter_recurse(&dict_iter, &value_iter); dbus_message_iter_get_basic(&value_iter, &paired); @@ -954,11 +884,6 @@ void __bt_device_property_changed_event(DBusMessageIter *msg_iter, const char *p return; } - if (_bt_is_device_creating() == TRUE) { - BT_DBG("Try to Pair by me"); - return; - } - address = g_malloc0(BT_ADDRESS_STRING_SIZE); _bt_convert_device_path_to_address(path, address); @@ -969,19 +894,41 @@ void __bt_device_property_changed_event(DBusMessageIter *msg_iter, const char *p return; } - _bt_send_event(BT_ADAPTER_EVENT, - BLUETOOTH_EVENT_BONDING_FINISHED, - DBUS_TYPE_INT32, &result, - DBUS_TYPE_STRING, &address, - DBUS_TYPE_UINT32, &remote_dev_info->class, - DBUS_TYPE_INT16, &remote_dev_info->rssi, - DBUS_TYPE_STRING, &remote_dev_info->name, - DBUS_TYPE_BOOLEAN, &remote_dev_info->paired, - DBUS_TYPE_BOOLEAN, &remote_dev_info->connected, - DBUS_TYPE_BOOLEAN, &remote_dev_info->trust, - DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, - &remote_dev_info->uuids, remote_dev_info->uuid_count, - DBUS_TYPE_INVALID); + node = g_list_first(g_list); + + while (node != NULL) { + dev_info = (bt_remote_dev_info_t *)node->data; + if (strcasecmp(dev_info->address, address) == 0) { + g_list = g_list_remove(g_list, dev_info); + _bt_free_device_info(dev_info); + + new_dev_info = _bt_get_remote_device_info(address); + if (new_dev_info == NULL) { + g_free(address); + return; + } + g_list = g_list_append(g_list, new_dev_info); + } + node = g_list_next(node); + } + + if (_bt_is_device_creating() == TRUE) { + BT_DBG("Try to Pair by me or already paired"); + } else { + _bt_send_event(BT_ADAPTER_EVENT, + BLUETOOTH_EVENT_BONDING_FINISHED, + DBUS_TYPE_INT32, &result, + DBUS_TYPE_STRING, &address, + DBUS_TYPE_UINT32, &remote_dev_info->class, + DBUS_TYPE_INT16, &remote_dev_info->rssi, + DBUS_TYPE_STRING, &remote_dev_info->name, + DBUS_TYPE_BOOLEAN, &remote_dev_info->paired, + DBUS_TYPE_BOOLEAN, &remote_dev_info->connected, + DBUS_TYPE_BOOLEAN, &remote_dev_info->trust, + DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, + &remote_dev_info->uuids, remote_dev_info->uuid_count, + DBUS_TYPE_INVALID); + } _bt_free_device_info(remote_dev_info); g_free(address); @@ -1626,68 +1573,125 @@ static DBusHandlerResult __bt_manager_event_filter(DBusConnection *conn, retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED); + BT_DBG("interface: %s | member: %s", dbus_message_get_interface(msg), member); + if (strcasecmp(member, "InterfacesAdded") == 0) { char *object_path = NULL; - BT_DBG("InterfacesAdded"); - if (__bt_get_object_path(msg, &object_path)) { BT_ERR("Fail to get the path"); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } - if (strcasecmp(object_path, BT_BLUEZ_HCI_PATH) == 0) { - _bt_handle_adapter_added(); - } else { - bt_event = __bt_parse_event(msg); - - if (bt_event == BT_DEVICE_EVENT) { - bt_remote_dev_info_t *dev_info; - int result = BLUETOOTH_ERROR_NONE; + bt_event = __bt_parse_event(msg); - retv_if(_bt_is_discovering() == FALSE, - DBUS_HANDLER_RESULT_NOT_YET_HANDLED); + if (bt_event == BT_DEVICE_EVENT) { + bt_remote_dev_info_t *dev_info; + int result = BLUETOOTH_ERROR_NONE; - dev_info = __bt_parse_interface(msg); + retv_if(_bt_is_discovering() == FALSE, + DBUS_HANDLER_RESULT_NOT_YET_HANDLED); - if (dev_info == NULL) { - BT_ERR("Fail to parse the properies"); - return - DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - } + dev_info = __bt_parse_interface(msg); - if (dev_info->name == NULL) - dev_info->name = g_strdup(""); + if (dev_info == NULL) { + BT_ERR("Fail to parse the properies"); + return + DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } - _bt_send_event(BT_ADAPTER_EVENT, - BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND, - DBUS_TYPE_INT32, &result, - DBUS_TYPE_STRING, &dev_info->address, - DBUS_TYPE_UINT32, &dev_info->class, - DBUS_TYPE_INT16, &dev_info->rssi, - DBUS_TYPE_STRING, &dev_info->name, - DBUS_TYPE_BOOLEAN, &dev_info->paired, - DBUS_TYPE_BOOLEAN, - &dev_info->connected, - DBUS_TYPE_BOOLEAN, &dev_info->trust, - DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, - &dev_info->uuids, dev_info->uuid_count, - DBUS_TYPE_INVALID); + if (dev_info->name == NULL) + dev_info->name = g_strdup(""); - g_list = g_list_append(g_list, dev_info); - }else if (bt_event == BT_MEDIA_TRANSFER_EVENT) { - __bt_parse_audio_properties(msg); - } + _bt_send_event(BT_ADAPTER_EVENT, + BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND, + DBUS_TYPE_INT32, &result, + DBUS_TYPE_STRING, &dev_info->address, + DBUS_TYPE_UINT32, &dev_info->class, + DBUS_TYPE_INT16, &dev_info->rssi, + DBUS_TYPE_STRING, &dev_info->name, + DBUS_TYPE_BOOLEAN, &dev_info->paired, + DBUS_TYPE_BOOLEAN, + &dev_info->connected, + DBUS_TYPE_BOOLEAN, &dev_info->trust, + DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, + &dev_info->uuids, dev_info->uuid_count, + DBUS_TYPE_INVALID); + g_list = g_list_append(g_list, dev_info); + } else if (bt_event == BT_MEDIA_TRANSFER_EVENT) { + __bt_parse_audio_properties(msg); } + } else if (strcasecmp(member, "InterfacesRemoved") == 0) { - BT_DBG("InterfacesRemoved"); + bt_event = __bt_parse_remove_event(msg); if (bt_event == BT_MEDIA_TRANSFER_EVENT){ _bt_parse_audio_remove_properties(msg); - }else{ - _bt_handle_adapter_event(msg); - } + } else if (bt_event == BT_DEVICE_EVENT) { + char *object_path = NULL; + if (__bt_get_object_path(msg, &object_path)) { + BT_ERR("Fail to get the path"); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + + if (strncasecmp(object_path, BT_BLUEZ_HCI_DEV_PATH, strlen(BT_BLUEZ_HCI_DEV_PATH)) == 0) { + int result = BLUETOOTH_ERROR_NONE; + char *address; + bt_remote_dev_info_t * dev_info; + GList * node; + + BT_DBG("device interface removed | path: %s", object_path); + + /* Remove bonding from remote device */ + address = g_malloc0(BT_ADDRESS_STRING_SIZE); + + _bt_convert_device_path_to_address(object_path, address); + + node = g_list_first(g_list); + + while (node != NULL){ + dev_info = (bt_remote_dev_info_t *)node->data; + if (strcasecmp(dev_info->address, address) == 0) { + if (dev_info->paired) { + BT_DBG("send bt bond destroy event"); + _bt_send_event(BT_ADAPTER_EVENT, + BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED, + DBUS_TYPE_INT32, &result, + DBUS_TYPE_STRING, &address, + DBUS_TYPE_INVALID); + } else { + BT_DBG("Bluez removes device %s, send device disappear event", dev_info->name); + _bt_send_event(BT_ADAPTER_EVENT, + BLUETOOTH_EVENT_REMOTE_DEVICE_DISAPPEARED, + DBUS_TYPE_INT32, &result, + DBUS_TYPE_STRING, &dev_info->address, + DBUS_TYPE_UINT32, &dev_info->class, + DBUS_TYPE_INT16, &dev_info->rssi, + DBUS_TYPE_STRING, &dev_info->name, + DBUS_TYPE_BOOLEAN, &dev_info->paired, + DBUS_TYPE_BOOLEAN, &dev_info->connected, + DBUS_TYPE_BOOLEAN, &dev_info->trust, + DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, + &dev_info->uuids, dev_info->uuid_count, + DBUS_TYPE_INVALID); + } + g_list = g_list_remove(g_list, dev_info); + _bt_free_device_info(dev_info); + break; + } + node = g_list_next(node); + } + + g_free(address); + } + } else { + char *object_path = NULL; + if (__bt_get_object_path(msg, &object_path)) { + BT_ERR("Fail to get the path"); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + } } else if (strcasecmp(member, "NameOwnerChanged") == 0) { gboolean value; char *name = NULL; @@ -1725,8 +1729,6 @@ static DBusHandlerResult __bt_manager_event_filter(DBusConnection *conn, } } else if (dbus_message_has_interface(msg, BT_PROPERTIES_INTERFACE)) { _bt_handle_property_changed_event(msg); - } else if (dbus_message_has_interface(msg, BT_ADAPTER_INTERFACE)) { - _bt_handle_adapter_event(msg); } else if (dbus_message_has_interface(msg, BT_INPUT_INTERFACE)) { _bt_handle_input_event(msg); } else if (dbus_message_has_interface(msg, BT_NETWORK_SERVER_INTERFACE)) { @@ -2279,23 +2281,26 @@ void _bt_get_temp_remote_devinfo(void) node = g_list_first(g_list); - while (node != NULL){ + while (node != NULL) { dev_info = (bt_remote_dev_info_t *)node->data; - - _bt_send_event(BT_ADAPTER_EVENT, - BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND, - DBUS_TYPE_INT32, &result, - DBUS_TYPE_STRING, &dev_info->address, - DBUS_TYPE_UINT32, &dev_info->class, - DBUS_TYPE_INT16, &dev_info->rssi, - DBUS_TYPE_STRING, &dev_info->name, - DBUS_TYPE_BOOLEAN, &dev_info->paired, - DBUS_TYPE_BOOLEAN, &dev_info->connected, - DBUS_TYPE_BOOLEAN, &dev_info->trust, - DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, - &dev_info->uuids, dev_info->uuid_count, - DBUS_TYPE_INVALID); - + /* do not search paired devices. + * Paired devices are in g_list in order to trig device disappear + * or remove bonding events */ + if (!dev_info->paired) { + _bt_send_event(BT_ADAPTER_EVENT, + BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND, + DBUS_TYPE_INT32, &result, + DBUS_TYPE_STRING, &dev_info->address, + DBUS_TYPE_UINT32, &dev_info->class, + DBUS_TYPE_INT16, &dev_info->rssi, + DBUS_TYPE_STRING, &dev_info->name, + DBUS_TYPE_BOOLEAN, &dev_info->paired, + DBUS_TYPE_BOOLEAN, &dev_info->connected, + DBUS_TYPE_BOOLEAN, &dev_info->trust, + DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, + &dev_info->uuids, dev_info->uuid_count, + DBUS_TYPE_INVALID); + } node = g_list_next(node); } }