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);
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))
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) {
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) {
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) {
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) {
BLUETOOTH_TELEPHONY_ERROR_NONE, NULL);
}
- return DBUS_HANDLER_RESULT_HANDLED;
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
const char *adapter_path, gpointer user_data)
{
int ret;
- DBusError dbus_error;
- DBusConnection *conn;
BT_DBG("Adapter added [%s] \n", adapter_path);
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);
- }
}
}
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;
GHashTable *list_hash;
GHashTable *device_hash;
GValue *value = {0};
+ uint32_t device_class;
gboolean playing = FALSE;
gboolean connected = FALSE;
const gchar *address;
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,
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;
}
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();