DPM: Fix API naming convention.
[platform/core/connectivity/bluetooth-frwk.git] / bt-api / bt-event-handler.c
old mode 100644 (file)
new mode 100755 (executable)
index 3292c6f..ec16d4f
@@ -1,11 +1,5 @@
 /*
- * Bluetooth-frwk
- *
- * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact:  Hocheol Seo <hocheol.seo@samsung.com>
- *              Girishashok Joshi <girish.joshi@samsung.com>
- *              Chanyeol Park <chanyeol.park@samsung.com>
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,8 +16,6 @@
  */
 
 #include <string.h>
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
 #include <dbus/dbus.h>
 #include <glib.h>
 #include <dlog.h>
@@ -55,6 +47,7 @@ static GSList *sending_list = NULL;
 static GSList *server_list = NULL;
 static GSList *event_list = NULL;
 static int owner_sig_id = -1;
+static gboolean is_adapter_enabled = TRUE;
 
 void _bt_add_push_request_id(int request_id)
 {
@@ -234,6 +227,9 @@ static int __bt_call_list_add(bt_hf_call_list_s *list, char * number,
        }
        handle = (bt_hf_call_list_s *)list;
        call_status = g_malloc0(sizeof(bt_hf_call_status_info_t));
+       /* Fix : NULL_RETURNS */
+       retv_if(call_status == NULL, BLUETOOTH_ERROR_MEMORY_ALLOCATION);
+
        call_status->number = g_strdup(number);
        call_status->direction= dir;
        call_status->status = status;
@@ -252,7 +248,7 @@ static bluetooth_device_info_t *__bt_get_device_info_in_message(GVariant *parame
        unsigned int dev_class = 0;
        short rssi = 0;
        gboolean paired = FALSE;
-       gboolean connected = FALSE;
+       guint connected = 0;
        gboolean trust = FALSE;
        gsize uuid_count;
        int result = BLUETOOTH_ERROR_NONE;
@@ -262,7 +258,7 @@ static bluetooth_device_info_t *__bt_get_device_info_in_message(GVariant *parame
        GVariant *manufacturer_var = NULL;
        const char *manufacturer_data = NULL;
 
-       g_variant_get(parameters, "(i&sun&sbbb@asn@ay)", &result, &address,
+       g_variant_get(parameters, "(isunsbub@asn@ay)", &result, &address,
                        &dev_class, &rssi, &name, &paired,
                        &connected, &trust,  &string_var, &manufacturer_data_len, &manufacturer_var);
 
@@ -278,6 +274,11 @@ static bluetooth_device_info_t *__bt_get_device_info_in_message(GVariant *parame
                manufacturer_data = (char *)g_variant_get_data(manufacturer_var);
 
        dev_info = g_malloc0(sizeof(bluetooth_device_info_t));
+       /* Fix : NULL_RETURNS */
+       if (dev_info == NULL) {
+               result = BLUETOOTH_ERROR_MEMORY_ALLOCATION;
+               goto done;
+       }
 
        dev_info->rssi = rssi;
        dev_info->paired = paired;
@@ -303,7 +304,7 @@ static bluetooth_device_info_t *__bt_get_device_info_in_message(GVariant *parame
        if (manufacturer_data)
                for (i = 0; i < manufacturer_data_len; i++)
                        dev_info->manufacturer_data.data[i] = manufacturer_data[i];
-
+done:
        *ret = result;
        g_free(uuids);
        g_variant_unref(string_var);
@@ -339,7 +340,11 @@ static bluetooth_le_device_info_t *__bt_get_le_device_info_in_message(GVariant *
                scan_data = (char *)g_variant_get_data(scan_var);
 
        le_dev_info = g_malloc0(sizeof(bluetooth_le_device_info_t));
-
+       /* Fix : NULL_RETURNS */
+       if (le_dev_info == NULL) {
+               result = BLUETOOTH_ERROR_MEMORY_ALLOCATION;
+               goto done;
+       }
        _bt_convert_addr_string_to_type(le_dev_info->device_address.addr, address);
        le_dev_info->addr_type = addr_type;
        le_dev_info->rssi = rssi;
@@ -355,6 +360,7 @@ static bluetooth_le_device_info_t *__bt_get_le_device_info_in_message(GVariant *
                if (scan_data)
                        le_dev_info->scan_resp_data.data.data[i] = scan_data[i];
 
+done:
        *ret = result;
 
        g_variant_unref(adv_var);
@@ -367,13 +373,18 @@ gboolean __bt_reliable_disable_cb(gpointer user_data)
        BT_DBG("+");
        bt_event_info_t *event_info = user_data;
 
+       _bt_set_le_scan_status(FALSE);
+
        if (is_initialized != FALSE) {
-               _bt_common_event_cb(BLUETOOTH_EVENT_DISABLED,
-                               BLUETOOTH_ERROR_NONE, NULL,
-                               event_info->cb, event_info->user_data);
-               _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISABLED,
-                               BLUETOOTH_ERROR_NONE, NULL,
-                               event_info->cb, event_info->user_data);
+               if (is_adapter_enabled == TRUE) {
+                       is_adapter_enabled = FALSE;
+                       _bt_common_event_cb(BLUETOOTH_EVENT_DISABLED,
+                                       BLUETOOTH_ERROR_NONE, NULL,
+                                       event_info->cb, event_info->user_data);
+                       _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISABLED,
+                                       BLUETOOTH_ERROR_NONE, NULL,
+                                       event_info->cb, event_info->user_data);
+               }
        }
 
        obex_server_id = BT_NO_SERVER;
@@ -419,6 +430,8 @@ void __bt_adapter_event_filter(GDBusConnection *connection,
                                BT_ERR("Set vconf failed");
                }
 
+               is_adapter_enabled = TRUE;
+
                _bt_common_event_cb(BLUETOOTH_EVENT_ENABLED,
                                result, NULL,
                                event_info->cb, event_info->user_data);
@@ -443,7 +456,14 @@ void __bt_adapter_event_filter(GDBusConnection *connection,
                        disable_timer_id = g_timeout_add(BT_RELIABLE_DISABLE_TIME,
                                        (GSourceFunc)__bt_reliable_disable_cb,
                                        event_info);
+               } else {
+                       is_adapter_enabled = FALSE;
+
+                       _bt_common_event_cb(BLUETOOTH_EVENT_DISABLED,
+                                       result, NULL,
+                                       event_info->cb, event_info->user_data);
                }
+
                _bt_common_event_cb(BLUETOOTH_EVENT_DISABLED,
                                result, NULL,
                                event_info->cb, event_info->user_data);
@@ -487,19 +507,18 @@ void __bt_adapter_event_filter(GDBusConnection *connection,
                                result, NULL,
                                event_info->cb, event_info->user_data);
        } else if (strcasecmp(signal_name, BT_ADVERTISING_STARTED) == 0) {
-               bluetooth_advertising_params_t adv_params = {0, };
-
-               g_variant_get(parameters, "(idd)", &result,
-                               &adv_params.interval_min,
-                               &adv_params.interval_max);
+               int adv_handle;
 
+               g_variant_get(parameters, "(ii)", &result, &adv_handle);
                _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_STARTED,
-                               result, &adv_params,
+                               result, &adv_handle,
                                event_info->cb, event_info->user_data);
        } else if (strcasecmp(signal_name, BT_ADVERTISING_STOPPED) == 0) {
-               g_variant_get(parameters, "(i)", &result);
+               int adv_handle;
+
+               g_variant_get(parameters, "(ii)", &result, &adv_handle);
                _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_STOPPED,
-                               result, NULL,
+                               result, &adv_handle,
                                event_info->cb, event_info->user_data);
        } else if (strcasecmp(signal_name, BT_ADVERTISING_MANUFACTURER_DATA_CHANGED) == 0) {
                GVariant *var = NULL;
@@ -561,16 +580,6 @@ void __bt_adapter_event_filter(GDBusConnection *connection,
                                event_info->cb, event_info->user_data);
 
                g_free(device_info);
-       } else if (strcasecmp(signal_name, BT_DEVICE_DISAPPEARED) == 0) {
-               bluetooth_device_info_t *device_info;
-
-               device_info = __bt_get_device_info_in_message(parameters, &result);
-               ret_if(device_info == NULL);
-
-               _bt_common_event_cb(BLUETOOTH_EVENT_REMOTE_DEVICE_DISAPPEARED,
-                               result, device_info,
-                               event_info->cb, event_info->user_data);
-               g_free(device_info);
        } else if (strcasecmp(signal_name, BT_BOND_CREATED) == 0) {
                bluetooth_device_info_t *device_info;
 
@@ -624,6 +633,87 @@ void __bt_adapter_event_filter(GDBusConnection *connection,
                                event_info->cb, event_info->user_data);
 
                g_free(device_info);
+       } else if (strcasecmp(signal_name, BT_IPSP_INITIALIZED) == 0) {
+               gboolean ipsp_intialized = FALSE;
+               g_variant_get(parameters, "(b)", &ipsp_intialized);
+
+               BT_DBG("IPSP init state changed to : %d", ipsp_intialized);
+
+               _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_INIT_STATE_CHANGED,
+                               BLUETOOTH_ERROR_NONE, &ipsp_intialized,
+                               event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, BT_KBD_PASSKEY_DISPLAY_REQ_RECEIVED) == 0) {
+               const char *address =  NULL;
+               const char *name =  NULL;
+               const char *str_passkey = NULL;
+
+               bluetooth_authentication_request_info_t auth_info;
+               memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
+
+               g_variant_get(parameters, "(i&s&s&s)", &result, &address, &name, &str_passkey);
+
+               g_strlcpy(auth_info.device_name.name, name,
+                       BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
+               _bt_convert_addr_string_to_type(auth_info.device_address.addr,
+                       address);
+               g_strlcpy(auth_info.str_passkey, str_passkey, strlen(str_passkey)+1);
+
+               _bt_common_event_cb(BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY,
+                       result, &auth_info,
+                       event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, BT_PIN_REQ_RECEIVED) == 0) {
+               const char *address =  NULL;
+               const char *name =  NULL;
+
+               bluetooth_authentication_request_info_t auth_info;
+               memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
+
+               g_variant_get(parameters, "(i&s&s)", &result, &address, &name);
+
+               g_strlcpy(auth_info.device_name.name, name,
+                       BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
+               _bt_convert_addr_string_to_type(auth_info.device_address.addr,
+                       address);
+
+               _bt_common_event_cb(BLUETOOTH_EVENT_PIN_REQUEST,
+                       result, &auth_info,
+                       event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, BT_PASSKEY_REQ_RECEIVED) == 0) {
+               const char *address = NULL;
+               const char *name =  NULL;
+
+               bluetooth_authentication_request_info_t auth_info;
+               memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
+
+               g_variant_get(parameters, "(i&s&s)", &result, &address, &name);
+
+               g_strlcpy(auth_info.device_name.name, name,
+                       BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
+               _bt_convert_addr_string_to_type(auth_info.device_address.addr,
+                       address);
+
+               _bt_common_event_cb(BLUETOOTH_EVENT_PASSKEY_REQUEST,
+                       result, &auth_info,
+                       event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, BT_PASSKEY_CFM_REQ_RECEIVED) == 0) {
+               const char *address =  NULL;
+               const char *name =  NULL;
+               const char *str_passkey = NULL;
+
+               bluetooth_authentication_request_info_t auth_info;
+               memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
+
+               g_variant_get(parameters, "(i&s&s&s)", &result, &address, &name, &str_passkey);
+
+               g_strlcpy(auth_info.device_name.name, name,
+                       BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
+               _bt_convert_addr_string_to_type(auth_info.device_address.addr,
+                       address);
+               g_strlcpy(auth_info.str_passkey, str_passkey, strlen(str_passkey)+1);
+
+               _bt_common_event_cb(BLUETOOTH_EVENT_PASSKEY_CONFIRM_REQUEST,
+                       result, &auth_info,
+                       event_info->cb, event_info->user_data);
        }
 }
 
@@ -695,10 +785,24 @@ void __bt_device_event_filter(GDBusConnection *connection,
        event_info = (bt_event_info_t *)user_data;
        ret_if(event_info == NULL);
 
+#ifdef GATT_NO_RELAY
+       gboolean gatt_interface = FALSE;
+
+       if (strcasecmp(interface_name, BT_GATT_CHARACTERISTIC_INTERFACE) == 0)
+               gatt_interface = TRUE;
+
+       if (strcasecmp(object_path, BT_DEVICE_PATH) != 0 &&
+                gatt_interface == FALSE)
+               return;
+       if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0 &&
+                gatt_interface == FALSE)
+               return;
+#else
        if (strcasecmp(object_path, BT_DEVICE_PATH) != 0)
                return;
        if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
                return;
+#endif
 
        ret_if(signal_name == NULL);
 
@@ -724,6 +828,46 @@ void __bt_device_event_filter(GDBusConnection *connection,
                _bt_common_event_cb(BLUETOOTH_EVENT_GATT_DISCONNECTED,
                                result, &dev_address,
                                event_info->cb, event_info->user_data);
+#ifdef GATT_NO_RELAY
+       } else if (strcasecmp(signal_name, BT_GATT_BLUEZ_CHAR_VAL_CHANGED) == 0) {
+#else
+       } else if (strcasecmp(signal_name, BT_GATT_CHAR_VAL_CHANGED) == 0) {
+#endif
+               const char *char_handle = NULL;
+               int len = 0;
+               const char * value = NULL;
+               GVariant *char_value_var = NULL;
+               bt_gatt_char_value_t char_val = { 0, };
+               BT_DBG("BT_GATT_CHAR_VAL_CHANGED");
+
+               g_variant_get(parameters, "(i&s@ay)", &result, &char_handle, &char_value_var);
+
+               len = g_variant_get_size(char_value_var);
+               if (len > 0)
+                       value = (char *)g_variant_get_data(char_value_var);
+
+               char_val.char_handle = g_strdup(char_handle);
+               char_val.val_len = len;
+               /* Fix : FORWARD_NULL : g_variant_get_data can return NULL */
+               if (char_val.val_len > 0 && value != NULL) {
+                       char_val.char_value = (unsigned char*) g_malloc0(char_val.val_len);
+                       /* Fix : NULL_RETURNS */
+                       if (char_val.char_value == NULL) {
+                               BT_ERR("BLUETOOTH_ERROR_OUT_OF_MEMORY");
+                               g_free(char_val.char_handle);
+                               if (char_value_var)
+                                       g_variant_unref(char_value_var);
+                               return;
+                       }
+                       memcpy(char_val.char_value, value, len);
+                       _bt_common_event_cb(BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED,
+                                       result, &char_val,
+                                       event_info->cb, event_info->user_data);
+                       g_free(char_val.char_value);
+                       if (char_value_var)
+                               g_variant_unref(char_value_var);
+               }
+               g_free(char_val.char_handle);
        } else if (strcasecmp(signal_name, BT_DEVICE_CONNECTED) == 0) {
                const char *address = NULL;
                unsigned char addr_type;
@@ -852,6 +996,56 @@ void __bt_device_event_filter(GDBusConnection *connection,
                _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_UNAUTHORIZED,
                                result, &dev_address,
                                event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, BT_IPSP_CONNECTED) == 0) {
+               const char *address = NULL;
+               bluetooth_device_address_t dev_address = { {0} };
+
+               BT_DBG("BT_IPSP_CONNECTED");
+               g_variant_get(parameters, "(i&s)", &result, &address);
+
+               _bt_convert_addr_string_to_type(dev_address.addr, address);
+
+               _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_CONNECTED,
+                               result, &dev_address,
+                               event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, BT_IPSP_DISCONNECTED) == 0) {
+               const char *address = NULL;
+               bluetooth_device_address_t dev_address = { {0} };
+               BT_DBG("BT_IPSP_DISCONNECTED");
+
+               g_variant_get(parameters, "(i&s)", &result, &address);
+
+               _bt_convert_addr_string_to_type(dev_address.addr, address);
+
+               _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_DISCONNECTED,
+                               result, &dev_address,
+                               event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, BT_LE_DATA_LENGTH_CHANGED) == 0) {
+               const char *address = NULL;
+               bluetooth_device_address_t dev_address = { {0} };
+               uint tx_octets = 0;
+               uint tx_time = 0;
+               uint rx_octets = 0;
+               uint rx_time = 0;
+               bt_le_data_length_params_t params;
+
+               BT_DBG("BT_LE_DATA_LENGTH_CHANGED");
+
+               g_variant_get(parameters, "(i&sqqqq)", &result, &address,
+                               tx_octets, tx_time, rx_octets, rx_time);
+
+               params.max_tx_octets = tx_octets;
+               params.max_tx_time = tx_time;
+               params.max_rx_octets = rx_octets;
+               params.max_rx_time = rx_time;
+
+               _bt_convert_addr_string_to_type(dev_address.addr, address);
+
+               memcpy(&params.device_address,
+                       &dev_address, BLUETOOTH_ADDRESS_LENGTH);
+
+               _bt_common_event_cb(BLUETOOTH_EVENT_LE_DATA_LENGTH_CHANGED,
+                               result, &params, event_info->cb, event_info->user_data);
        }
 }
 
@@ -957,6 +1151,21 @@ void __bt_headset_event_filter(GDBusConnection *connection,
                _bt_headset_event_cb(BLUETOOTH_EVENT_AV_DISCONNECTED,
                                result, address,
                                event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, BT_A2DP_SOURCE_CONNECTED) == 0) {
+               char *address = NULL;
+
+               g_variant_get(parameters, "(i&s)", &result, &address);
+               _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_CONNECTED,
+                                               result, address,
+                                               event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, BT_A2DP_SOURCE_DISCONNECTED) == 0) {
+               char *address = NULL;
+
+               g_variant_get(parameters, "(i&s)", &result, &address);
+
+               _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED,
+                                               result, address,
+                                               event_info->cb, event_info->user_data);
        } else if (strcasecmp(signal_name, BT_SPEAKER_GAIN) == 0) {
                unsigned int gain;
                guint16 spkr_gain;
@@ -984,6 +1193,93 @@ void __bt_headset_event_filter(GDBusConnection *connection,
        }
 }
 
+void __bt_hid_device_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_event_info_t *event_info;
+       int result = BLUETOOTH_ERROR_NONE;
+
+       event_info = (bt_event_info_t *)user_data;
+       ret_if(event_info == NULL);
+
+       if (strcasecmp(object_path, BT_HID_DEVICE_PATH) != 0)
+               return;
+       if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
+               return;
+
+       ret_if(signal_name == NULL);
+
+       if (strcasecmp(signal_name, BT_HID_DEVICE_CONNECTED) == 0) {
+               const char *address = NULL;
+               bluetooth_device_address_t dev_address = { {0} };
+
+               g_variant_get(parameters, "(i&s)", &result, &address);
+
+               _bt_convert_addr_string_to_type(dev_address.addr,
+                                               address);
+
+               _bt_input_event_cb(BLUETOOTH_HID_DEVICE_CONNECTED,
+                               result, &dev_address,
+                               event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, BT_HID_DEVICE_DISCONNECTED) == 0) {
+               const char *address = NULL;
+               bluetooth_device_address_t dev_address = { {0} };
+
+               g_variant_get(parameters, "(i&s)", &result, &address);
+
+               BT_DBG("address: %s", address);
+
+               _bt_convert_addr_string_to_type(dev_address.addr,
+                                               address);
+
+               _bt_input_event_cb(BLUETOOTH_HID_DEVICE_DISCONNECTED,
+                               result, &dev_address,
+                               event_info->cb, event_info->user_data);
+       }
+}
+void __bt_a2dp_source_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_event_info_t *event_info;
+       int result = BLUETOOTH_ERROR_NONE;
+       event_info = (bt_event_info_t *)user_data;
+       ret_if(event_info == NULL);
+
+       if (strcasecmp(object_path, BT_A2DP_SOURCE_PATH) != 0)
+               return;
+       if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
+               return;
+
+       ret_if(signal_name == NULL);
+
+       if (strcasecmp(signal_name, BT_A2DP_SOURCE_CONNECTED) == 0) {
+               char *address = NULL;
+
+               g_variant_get(parameters, "(i&s)", &result, &address);
+               _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_CONNECTED,
+                                               result, address,
+                                               event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, BT_A2DP_SOURCE_DISCONNECTED) == 0) {
+               char *address = NULL;
+
+               g_variant_get(parameters, "(i&s)", &result, &address);
+
+               _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED,
+                                               result, address,
+                                               event_info->cb, event_info->user_data);
+       }
+}
+
 void __bt_network_event_filter(GDBusConnection *connection,
                                                 const gchar *sender_name,
                                                 const gchar *object_path,
@@ -1216,7 +1512,6 @@ void __bt_avrcp_control_event_filter(GDBusConnection *connection,
                                result, &status,
                                event_info->cb, event_info->user_data);
        } else if (strcasecmp(signal_name, BT_MEDIA_TRACK_CHANGE) == 0) {
-               GVariant *var = NULL;
                media_metadata_attributes_t metadata;
                const char *title;
                const char *artist;
@@ -1581,30 +1876,44 @@ void __bt_pbap_client_event_filter(GDBusConnection *connection,
                return;
 
        ret_if(signal_name == NULL);
-
+       BT_DBG("Type: %s", g_variant_get_type_string(parameters));
        if (strcasecmp(signal_name, BT_PBAP_CONNECTED) == 0) {
                bt_pbap_connected_t connected = { { { 0 }, }, };
                char *address = NULL;
-               int enabled = -1;
-
-               g_variant_get(parameters, "(i&si)", &result, &address, &enabled);
 
+               g_variant_get(parameters, "(is)", &result, &address);
                BT_DBG("address: %s", address);
-               BT_DBG("enabled: %d", enabled);
 
                _bt_convert_addr_string_to_type(connected.btaddr.addr,
                                                address);
-               connected.connected = enabled;
+               if (result == 0)
+                       connected.connected = 1;
+               else
+                       connected.connected = 0;
 
                _bt_common_event_cb(BLUETOOTH_PBAP_CONNECTED,
                                result, &connected,
                                event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, BT_PBAP_DISCONNECTED) == 0) {
+               bt_pbap_connected_t disconnected = { { { 0 }, }, };
+               char *address = NULL;
+
+               g_variant_get(parameters, "(is)", &result, &address);
+               BT_DBG("address: %s", address);
+
+               _bt_convert_addr_string_to_type(disconnected.btaddr.addr,
+                                               address);
+               disconnected.connected = 0;
+
+               _bt_common_event_cb(BLUETOOTH_PBAP_CONNECTED,
+                               result, &disconnected,
+                               event_info->cb, event_info->user_data);
        } else if (strcasecmp(signal_name, BT_PBAP_PHONEBOOK_SIZE) == 0) {
                bt_pbap_phonebook_size_t pb_size = { { { 0 }, }, };
                char *address = NULL;
                int size = 0;
 
-               g_variant_get(parameters, "(i&si)", &result, &address, &size);
+               g_variant_get(parameters, "(isi)", &result, &address, &size);
 
                BT_DBG("address: %s", address);
                BT_DBG("size: %d", size);
@@ -1622,7 +1931,7 @@ void __bt_pbap_client_event_filter(GDBusConnection *connection,
                char *vcf_file = NULL;
                int success = -1;
 
-               g_variant_get(parameters, "(i&s&si)", &result, &address, &vcf_file, &success);
+               g_variant_get(parameters, "(issi)", &result, &address, &vcf_file, &success);
 
                BT_DBG("address: %s", address);
                BT_DBG("vcf_file: %s", vcf_file);
@@ -1638,18 +1947,20 @@ void __bt_pbap_client_event_filter(GDBusConnection *connection,
        } else if (strcasecmp(signal_name, BT_PBAP_VCARD_LIST) == 0) {
                bt_pbap_vcard_list_t vc_list = { { { 0 } }, };
                char *address = NULL;
-               unsigned int count = 0;
+               gsize count = 0;
                gchar **list = NULL;
                GVariant *string_var;
                int success = -1;
                int i = 0;
 
-               g_variant_get(parameters, "(i&s@as)", &result, &address, &string_var);
+               g_variant_get(parameters, "(isv)", &result, &address, &string_var);
 
                list = (gchar **)g_variant_get_strv(string_var, &count);
 
                success = !result;
                BT_DBG("address: %s", address);
+               BT_DBG("result: %d", result);
+               BT_DBG("count: %d", count);
                for(i = 0; i < count; i++)
                        BT_DBG("%s", list[i]);
                BT_DBG("success: %d", success);
@@ -1671,7 +1982,7 @@ void __bt_pbap_client_event_filter(GDBusConnection *connection,
                char *vcf_file = NULL;
                int success = -1;
 
-               g_variant_get(parameters, "(i&s&si)", &result, &address, &vcf_file, &success);
+               g_variant_get(parameters, "(issi)", &result, &address, &vcf_file, &success);
 
                BT_DBG("address: %s", address);
                BT_DBG("vcf_file: %s", vcf_file);
@@ -1687,13 +1998,13 @@ void __bt_pbap_client_event_filter(GDBusConnection *connection,
        } else if (strcasecmp(signal_name, BT_PBAP_SEARCH_PHONEBOOK) == 0) {
                bt_pbap_phonebook_search_list_t vc_list = { { { 0 } }, };
                char *address = NULL;
-               unsigned int count = 0;
+               gsize count = 0;
                gchar **list = NULL;
                GVariant *string_var;
                int success = -1;
                int i = 0;
 
-               g_variant_get(parameters, "(i&s@as)", &result, &address, &string_var);
+               g_variant_get(parameters, "(is@as)", &result, &address, &string_var);
 
                list = (gchar **)g_variant_get_strv(string_var, &count);
                success = !result;
@@ -2198,13 +2509,11 @@ static void __bt_event_data_free(void *data)
 
        ret_if(cb_data == NULL);
 
-       g_object_unref(cb_data->conn);
        g_free(cb_data);
 }
 
 int _bt_register_event(int event_type, void *event_cb, void *user_data)
 {
-       GError *error = NULL;
        GDBusConnection *connection_type;
        GDBusSignalCallback event_func;
        bt_event_info_t *cb_data;
@@ -2278,24 +2587,36 @@ int _bt_register_event(int event_type, void *event_cb, void *user_data)
                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
        default:
                BT_ERR("Unknown event");
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       connection_type = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
-       if (connection_type == NULL) {
-               if (error) {
-                       BT_ERR("Unable to get the bus: %s", error->message);
-                       g_clear_error(&error);
-               }
+       connection_type = _bt_gdbus_get_system_gconn();
+       if (connection_type == NULL)
                return BLUETOOTH_ERROR_INTERNAL;
-       }
 
        cb_data = g_new0(bt_event_info_t, 1);
 
        cb_data->event_type = event_type;
-       cb_data->conn = connection_type;
        cb_data->cb = event_cb;
        cb_data->user_data = user_data;
 
@@ -2330,7 +2651,7 @@ int _bt_unregister_event(int event_type)
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       connection_type = cb_data->conn;
+       connection_type = _bt_gdbus_get_system_gconn();
 
        event_list = g_slist_remove(event_list, (void *)cb_data);