JIRA issue S1-13098 - Fix dbus add match rule overflow
[platform/core/connectivity/bluetooth-frwk.git] / bt-api / bt-telephony.c
index b1bdca2..c20a8ed 100644 (file)
@@ -172,6 +172,7 @@ static int __bluetooth_telephony_register(void);
 static int __bluetooth_telephony_unregister(void);
 static int __bluetooth_get_default_adapter_path(DBusGConnection *GConn,
                                                        char *path);
+static gboolean __bluetooth_telephony_is_headset(uint32_t device_class);
 static int __bluetooth_telephony_get_connected_device(void);
 static DBusGProxy *__bluetooth_telephony_get_connected_device_proxy(void);
 
@@ -513,7 +514,7 @@ static DBusHandlerResult __bluetooth_telephony_event_filter(
        if (dbus_message_is_signal(msg, HFP_AGENT_SERVICE,
                                HFP_NREC_STATUS_CHANGE)) {
                __bluetooth_handle_nrec_status_change(msg);
-               return DBUS_HANDLER_RESULT_HANDLED;
+               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
        }
 
        if (!dbus_message_has_interface(msg, BLUEZ_HEADSET_INTERFACE))
@@ -566,7 +567,7 @@ static DBusHandlerResult __bluetooth_telephony_event_filter(
                        telephony_info.headset_state = BLUETOOTH_STATE_DISCONNETED;
                }
 
-               return DBUS_HANDLER_RESULT_HANDLED;
+               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
        }
 
        if (g_strcmp0(property, "Connected") == 0) {
@@ -624,7 +625,7 @@ static DBusHandlerResult __bluetooth_telephony_event_filter(
                                        BLUETOOTH_EVENT_TELEPHONY_HFP_DISCONNECTED,
                                        BLUETOOTH_TELEPHONY_ERROR_NONE, NULL);
                }
-               return DBUS_HANDLER_RESULT_HANDLED;
+               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
        }
 
        if (g_strcmp0(property, "SpeakerGain") == 0) {
@@ -642,7 +643,7 @@ static DBusHandlerResult __bluetooth_telephony_event_filter(
                                        BLUETOOTH_TELEPHONY_ERROR_NONE,
                                        (void *)&spkr_gain);
 
-               return DBUS_HANDLER_RESULT_HANDLED;
+               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
        }
 
        if (g_strcmp0(property, "MicrophoneGain") == 0) {
@@ -660,7 +661,7 @@ static DBusHandlerResult __bluetooth_telephony_event_filter(
                                        BLUETOOTH_TELEPHONY_ERROR_NONE,
                                        (void *)&mic_gain);
 
-               return DBUS_HANDLER_RESULT_HANDLED;
+               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
        }
 
        if (g_strcmp0(property, "Playing") == 0) {
@@ -694,7 +695,7 @@ static DBusHandlerResult __bluetooth_telephony_event_filter(
                                BLUETOOTH_TELEPHONY_ERROR_NONE, NULL);
                }
 
-               return DBUS_HANDLER_RESULT_HANDLED;
+               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
        }
        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
@@ -703,8 +704,6 @@ static void __bluetooth_telephony_adapter_added_cb(DBusGProxy *manager_proxy,
                                const char *adapter_path, gpointer user_data)
 {
        int ret;
-       DBusError dbus_error;
-       DBusConnection *conn;
 
        BT_DBG("Adapter added [%s] \n", adapter_path);
 
@@ -717,27 +716,6 @@ static void __bluetooth_telephony_adapter_added_cb(DBusGProxy *manager_proxy,
                        BT_DBG("__bluetooth_telephony_register failed\n");
                        return;
                }
-
-               dbus_error_init(&dbus_error);
-               conn = dbus_g_connection_get_connection(telephony_dbus_info.conn);
-               dbus_connection_add_filter(conn, __bluetooth_telephony_event_filter,
-                               NULL, NULL);
-
-               dbus_bus_add_match(conn,
-                               "type='signal',interface='" BLUEZ_HEADSET_INTERFACE
-                               "',member='PropertyChanged'", &dbus_error);
-               dbus_bus_add_match(conn,
-                       "type='signal',interface='"HFP_AGENT_SERVICE
-                       "',member='"HFP_NREC_STATUS_CHANGE"'" , &dbus_error);
-
-               if (dbus_error_is_set(&dbus_error)) {
-                       BT_DBG("Fail to add dbus filter signal\n");
-                       dbus_error_free(&dbus_error);
-                       __bluetooth_telephony_unregister();
-                       dbus_connection_remove_filter(dbus_g_connection_get_connection(
-                                       telephony_dbus_info.conn),
-                                       __bluetooth_telephony_event_filter, NULL);
-               }
        }
 }
 
@@ -870,6 +848,35 @@ static int __bluetooth_get_default_adapter_path(DBusGConnection *GConn,
        return BLUETOOTH_TELEPHONY_ERROR_NONE;
 }
 
+static gboolean __bluetooth_telephony_is_headset(uint32_t device_class)
+{
+       gboolean flag = FALSE;
+       BT_DBG("+");
+
+       switch ((device_class & 0x1f00) >> 8) {
+       case 0x04:
+               switch ((device_class & 0xfc) >> 2) {
+               case 0x01:
+               case 0x02:
+                       flag = TRUE;
+                       break;
+               case 0x06:
+                       flag = TRUE;
+                       break;
+               case 0x0b:
+               case 0x0c:
+               case 0x0d:
+                       break;
+               default:
+                       flag = TRUE;
+                       break;
+               }
+               break;
+       }
+       BT_DBG("-");
+       return flag;
+}
+
 static int __bluetooth_telephony_get_connected_device(void)
 {
        DBusGProxy *list_proxy = NULL;
@@ -880,6 +887,7 @@ static int __bluetooth_telephony_get_connected_device(void)
        GHashTable *list_hash;
        GHashTable *device_hash;
        GValue *value = {0};
+       uint32_t device_class;
        gboolean playing = FALSE;
        gboolean connected = FALSE;
        const gchar *address;
@@ -938,6 +946,18 @@ static int __bluetooth_telephony_get_connected_device(void)
                if (list_hash == NULL)
                        goto done;
 
+               value = g_hash_table_lookup(list_hash, "Class");
+               device_class = value ? g_value_get_uint(value) : 0;
+
+               if (!__bluetooth_telephony_is_headset(device_class)) {
+                       g_object_unref(proxy);
+                       proxy = NULL;
+                       g_free(gp_path);
+                       gp_path = NULL;
+                       g_hash_table_destroy(list_hash);
+                       continue;
+               }
+
                /*Check for Connection*/
                device_proxy = dbus_g_proxy_new_for_name(
                                telephony_dbus_info.conn,
@@ -1167,9 +1187,6 @@ BT_EXPORT_API int bluetooth_telephony_init(bt_telephony_func_ptr cb,
        if (dbus_error_is_set(&dbus_error)) {
                BT_ERR("Fail to add dbus filter signal\n");
                dbus_error_free(&dbus_error);
-               dbus_connection_remove_filter(dbus_g_connection_get_connection(
-                               telephony_dbus_info.conn),
-                               __bluetooth_telephony_event_filter, NULL);
                goto fail;
        }
 
@@ -1191,40 +1208,31 @@ BT_EXPORT_API int bluetooth_telephony_init(bt_telephony_func_ptr cb,
        BT_DBG("-");
        return ret;
 fail:
-       telephony_info.cb = NULL;
-       telephony_info.user_data = NULL;
-       telephony_info.call_count = 0;
-
-       __bluetooth_telephony_proxy_deinit();
-
-       /*Remove BT enabled signal*/
-       dbus_g_proxy_disconnect_signal(
-               telephony_dbus_info.manager_proxy,
-               "AdapterAdded",
-               G_CALLBACK(__bluetooth_telephony_adapter_added_cb),
-               NULL);
-
-       dbus_g_connection_unref(telephony_dbus_info.conn);
-       telephony_dbus_info.conn = NULL;
-       g_object_unref(telephony_dbus_info.manager_proxy);
-       telephony_dbus_info.manager_proxy = NULL;
-       g_object_unref(telephony_dbus_info.dbus_proxy);
-       telephony_dbus_info.dbus_proxy = NULL;
-       is_initialized = FALSE;
+       bluetooth_telephony_deinit();
        return ret;
 }
 
 BT_EXPORT_API int bluetooth_telephony_deinit(void)
 {
        BT_DBG("+");
+       DBusConnection *conn;
 
        BT_TELEPHONY_CHECK_INITIALIZED();
 
        is_initialized = FALSE;
 
-       dbus_connection_remove_filter(dbus_g_connection_get_connection(
-                               telephony_dbus_info.conn),
-                               __bluetooth_telephony_event_filter, NULL);
+       conn = dbus_g_connection_get_connection(telephony_dbus_info.conn);
+
+       dbus_bus_remove_match(conn,
+                               "type='signal',interface='" BLUEZ_HEADSET_INTERFACE
+                               "',member='PropertyChanged'", NULL);
+
+       dbus_bus_remove_match(conn,
+                       "type='signal',interface='"HFP_AGENT_SERVICE
+                       "',member='"HFP_NREC_STATUS_CHANGE"'", NULL);
+
+       dbus_connection_remove_filter(conn, __bluetooth_telephony_event_filter,
+                NULL);
 
        if (bluetooth_check_adapter() == BLUETOOTH_ADAPTER_ENABLED)
                __bluetooth_telephony_unregister();