X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bt-oal%2Fbluez_hal%2Fsrc%2Fbt-hal-event-receiver.c;h=a63455250ab4658cc26637f5ff8846a98cc5ee6b;hb=4da5859a5659765615d14ac0f845c9c6b3dbaab0;hp=8161fdc7eb6a9ece7eedea317d01d129492c620d;hpb=410e813ab3ba0213105c9b0d62afc2d8e5385591;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git diff --git a/bt-oal/bluez_hal/src/bt-hal-event-receiver.c b/bt-oal/bluez_hal/src/bt-hal-event-receiver.c index 8161fdc..a634552 100644 --- a/bt-oal/bluez_hal/src/bt-hal-event-receiver.c +++ b/bt-oal/bluez_hal/src/bt-hal-event-receiver.c @@ -435,7 +435,7 @@ static void __bt_hal_adapter_property_changed_event(GVariant *msg) GVariantIter *iter = NULL; g_variant_get(value, "as", &iter); bt_local_le_features_t le_features; - gboolean le_features_present = FALSE; + gboolean le_features_present = FALSE; if (iter == NULL) continue; @@ -906,6 +906,36 @@ static gboolean __bt_hal_parse_interface(GVariant *msg) return FALSE; } +void __bt_hal_handle_gatt_char_event(GVariant *parameters, const char *signal_name) +{ + DBG("+"); + + if (signal_name == NULL) + return; + + if (strcasecmp(signal_name, "GattValueChanged") == 0) { + DBG("GattValueChanged event received"); + + int result = 0; + const char *char_handle = NULL; + GVariant *char_value_var = NULL; + int len = 0; + char *char_value = NULL; + + g_variant_get(parameters, "(i&s@ay)", &result, &char_handle, &char_value_var); + DBG("char handle: %s", char_handle); + + len = g_variant_get_size(char_value_var); + if (len > 0) + char_value = (char *)g_variant_get_data(char_value_var); + + _bt_hal_handle_gattc_value_changed_event(result, char_handle, char_value, len); + + g_variant_unref(char_value_var); + } +} + + static gboolean __bt_hal_event_manager(gpointer data) { bt_hal_event_type_t bt_event = 0x00; @@ -1011,6 +1041,9 @@ static gboolean __bt_hal_event_manager(gpointer data) } else if (g_strcmp0(param->interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) { DBG("Manager Event: Interface Name: BT_HAL_MEDIATRANSPORT_INTERFACE"); __bt_hal_handle_avrcp_transport_events(param->parameters, param->signal_name, param->object_path); + } else if (g_strcmp0(param->interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) { + DBG("Manager Event: Interface Name: BT_HAL_GATT_CHAR_INTERFACE"); + __bt_hal_handle_gatt_char_event(param->parameters, param->signal_name); } @@ -1259,6 +1292,34 @@ static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int s return 0; } +static int __bt_hal_register_gatt_subscribe_signal(GDBusConnection *conn, + int subscribe) +{ + static int subs_gatt_id = -1; + + DBG("+"); + + if (subscribe) { + if (subs_gatt_id == -1) { + subs_gatt_id = g_dbus_connection_signal_subscribe(conn, + NULL, BT_HAL_GATT_CHAR_INTERFACE, + NULL, NULL, NULL, 0, + __bt_hal_manager_event_filter, + NULL, NULL); + } + } else { + if (subs_gatt_id == -1) { + g_dbus_connection_signal_unsubscribe(conn, + subs_gatt_id); + subs_gatt_id = -1; + } + } + + return BT_HAL_ERROR_NONE; +} + + + static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type) { DBG("+"); @@ -1280,6 +1341,9 @@ static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_ty case BT_HAL_HEADSET_EVENT: __bt_hal_register_audio_subscribe_signal(g_conn, TRUE); break; + case BT_HAL_GATT_EVENT: + __bt_hal_register_gatt_subscribe_signal(g_conn, TRUE); + break; default: INFO_C("Register Event: event_type [%d]", event_type); return BT_HAL_ERROR_NOT_SUPPORT; @@ -1355,6 +1419,9 @@ static int __bt_hal_initialize_manager_receiver(void) if (__bt_hal_register_service_event(manager_conn, BT_HAL_HEADSET_EVENT) != BT_HAL_ERROR_NONE) goto fail; + if (__bt_hal_register_service_event(manager_conn, + BT_HAL_GATT_EVENT) != BT_HAL_ERROR_NONE) + goto fail; return BT_HAL_ERROR_NONE; fail: if (manager_conn) {