/*
- * Bluetooth-telephony
- *
- * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact: Hocheol Seo <hocheol.seo@samsung.com>
- * Jaganath K <jaganath.k@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.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
-#include <dbus/dbus.h>
-#include <dbus/dbus-glib-bindings.h>
#include <unistd.h>
#include <vconf.h>
#include <vconf-keys.h>
#include "bt-common.h"
#include "bluetooth-telephony-api.h"
#include "marshal.h"
+#include "bt-internal-types.h"
#define BT_SCO_TIMEOUT 3000
#define BT_TELEPHONY_CHECK_ENABLED() \
do { \
- if (bluetooth_check_adapter() == BLUETOOTH_ADAPTER_DISABLED) \
- { \
+ if (bluetooth_check_adapter() == BLUETOOTH_ADAPTER_DISABLED) { \
BT_ERR("BT is not enabled"); \
return BLUETOOTH_TELEPHONY_ERROR_NOT_ENABLED; \
} \
static gboolean is_initialized = FALSE;
#define BT_TELEPHONY_CHECK_INITIALIZED() \
do { \
- if (is_initialized == FALSE) \
- { \
+ if (is_initialized == FALSE) { \
BT_ERR("Bluetooth telephony not initilized"); \
return BLUETOOTH_TELEPHONY_ERROR_NOT_INITIALIZED; \
} \
if (!reply) {
BT_ERR("Error returned in method call");
if (err) {
+ g_dbus_error_strip_remote_error(err);
ret = __bt_telephony_get_error(err->message);
g_error_free(err);
return ret;
const char *interface, const char *method,
GError **err, GVariant *parameters)
{
-#ifdef TIZEN_WEARABLE
- int timeout = 4000;
-#else
int timeout = -1;
-#endif
+
+ if (TIZEN_PROFILE_WEARABLE || TIZEN_PROFILE_IVI)
+ timeout = 4000;
+
GVariant *reply;
GDBusProxy *proxy;
GDBusConnection *conn;
if (!reply) {
BT_ERR("Error returned in method call");
if (err) {
+ g_dbus_error_strip_remote_error(err);
ret = __bt_telephony_get_error(err->message);
g_error_free(err);
return ret;
node_info = __bt_telephony_create_method_node_info(
bt_telephony_introspection_xml);
-
if (node_info == NULL) {
BT_ERR("node_info NULL");
return BLUETOOTH_TELEPHONY_ERROR_INVALID_PARAM;
if (__bluetooth_telephony_register_object(TRUE, node_info) !=
BLUETOOTH_TELEPHONY_ERROR_NONE) {
BT_ERR("Registation of Method Failed");
+ g_dbus_node_info_unref(node_info);
return BLUETOOTH_TELEPHONY_ERROR_INTERNAL;
}
FN_END;
+ g_dbus_node_info_unref(node_info);
return BLUETOOTH_TELEPHONY_ERROR_NONE;
}
if (!reply) {
BT_ERR("Error returned in method call");
if (err) {
+ g_dbus_error_strip_remote_error(err);
ret = __bt_telephony_get_error(err->message);
BT_ERR("Error here %d\n", ret);
g_error_free(err);
if (!reply) {
BT_ERR("Error returned in method call");
if (err) {
+ g_dbus_error_strip_remote_error(err);
ret = __bt_telephony_get_error(err->message);
g_error_free(err);
return ret;
return BLUETOOTH_TELEPHONY_ERROR_NONE;
}
-#ifndef TIZEN_WEARABLE
static void __bluetooth_telephony_init_headset_state(void)
{
GVariant *reply;
if (!reply) {
BT_ERR("Error returned in method call\n");
if (err) {
- __bt_telephony_get_error(err->message);
+ BT_ERR("Error message = %s", err->message);
g_error_free(err);
}
return;
FN_END;
}
-#endif
static gboolean __bluetooth_telephony_is_headset(uint32_t device_class)
{
BT_ERR("Unable to allocate new proxy \n");
ret = BLUETOOTH_TELEPHONY_ERROR_INTERNAL;
if (error) {
+ g_dbus_error_strip_remote_error(error);
ret = __bt_telephony_get_error(error->message);
BT_ERR("Error here %d\n", ret);
g_error_free(error);
BT_ERR("Can't get managed objects");
ret = BLUETOOTH_TELEPHONY_ERROR_INTERNAL;
if (error) {
+ g_dbus_error_strip_remote_error(error);
ret = __bt_telephony_get_error(error->message);
BT_ERR("Error here %d\n", ret);
g_error_free(error);
BT_ERR("Unable to allocate new proxy \n");
ret = BLUETOOTH_TELEPHONY_ERROR_INTERNAL;
if (error) {
+ g_dbus_error_strip_remote_error(error);
ret = __bt_telephony_get_error(error->message);
BT_ERR("Error here %d\n", ret);
g_error_free(error);
BT_ERR("Can't get managed objects");
ret = BLUETOOTH_TELEPHONY_ERROR_INTERNAL;
if (error) {
+ g_dbus_error_strip_remote_error(error);
ret = __bt_telephony_get_error(error->message);
BT_ERR("Error here %d\n", ret);
g_error_free(error);
BT_ERR("Unable to allocate new headset_agent_proxy");
ret = BLUETOOTH_TELEPHONY_ERROR_INTERNAL;
if (error) {
+ g_dbus_error_strip_remote_error(error);
ret = __bt_telephony_get_error(error->message);
BT_ERR("Error here %d\n", ret);
g_error_free(error);
BT_ERR("Can't get managed objects");
ret = BLUETOOTH_TELEPHONY_ERROR_INTERNAL;
if (error) {
+ g_dbus_error_strip_remote_error(error);
ret = __bt_telephony_get_error(error->message);
BT_ERR("Error here %d\n", ret);
g_error_free(error);
BT_ERR("Can't get managed objects");
ret = BLUETOOTH_TELEPHONY_ERROR_INTERNAL;
if (error) {
+ g_dbus_error_strip_remote_error(error);
ret = __bt_telephony_get_error(error->message);
BT_ERR("Error here %d\n", ret);
g_error_free(error);
if (proxy == NULL) {
BT_ERR("Unable to allocate new proxy");
if (error) {
+ g_dbus_error_strip_remote_error(error);
ret = __bt_telephony_get_error(error->message);
BT_ERR("Error here %d\n", ret);
g_error_free(error);
if (conn == NULL)
return -1;
- static int subscribe_adapter_id = -1;
+ static guint subscribe_adapter_id = 0;
+
if (subscribe == TRUE) {
- if (subscribe_adapter_id == -1) {
+ if (subscribe_adapter_id == 0) {
subscribe_adapter_id = g_dbus_connection_signal_subscribe(conn,
NULL, "org.freedesktop.DBus.ObjectManager",
"InterfacesAdded", NULL, NULL, 0,
}
return BLUETOOTH_TELEPHONY_ERROR_NONE;
} else {
- if (subscribe_adapter_id != -1) {
+ if (subscribe_adapter_id > 0) {
g_dbus_connection_signal_unsubscribe(conn,
subscribe_adapter_id);
- subscribe_adapter_id = -1;
+ subscribe_adapter_id = 0;
}
return BLUETOOTH_TELEPHONY_ERROR_NONE;
}
if (conn == NULL)
return -1;
- static int subscribe_event1_id = -1;
- static int subscribe_event2_id = -1;
- static int subscribe_event3_id = -1;
- static int subscribe_event4_id = -1;
- static int subscribe_event5_id = -1;
- static int subscribe_event6_id = -1;
+ static guint subscribe_event1_id = 0;
+ static guint subscribe_event2_id = 0;
+ static guint subscribe_event3_id = 0;
+ static guint subscribe_event4_id = 0;
+ static guint subscribe_event5_id = 0;
+ static guint subscribe_event6_id = 0;
+
if (subscribe == TRUE) {
- if (subscribe_event1_id == -1) {
+ if (subscribe_event1_id == 0) {
subscribe_event1_id = g_dbus_connection_signal_subscribe(conn,
NULL, BLUEZ_HEADSET_INTERFACE,
"PropertyChanged", NULL, NULL, 0,
__bluetooth_telephony_event_filter,
NULL, NULL);
}
- if (subscribe_event2_id == -1) {
+ if (subscribe_event2_id == 0) {
subscribe_event2_id = g_dbus_connection_signal_subscribe(conn,
NULL, HFP_AGENT_SERVICE,
HFP_NREC_STATUS_CHANGE, NULL, NULL, 0,
NULL, NULL);
}
- if (subscribe_event3_id == -1) {
+ if (subscribe_event3_id == 0) {
subscribe_event3_id = g_dbus_connection_signal_subscribe(conn,
NULL, HFP_AGENT_SERVICE,
HFP_ANSWER_CALL, NULL, NULL, 0,
__bluetooth_telephony_event_filter,
NULL, NULL);
}
- if (subscribe_event4_id == -1) {
+ if (subscribe_event4_id == 0) {
subscribe_event4_id = g_dbus_connection_signal_subscribe(conn,
NULL, HFP_AGENT_SERVICE,
HFP_REJECT_CALL, NULL, NULL, 0,
__bluetooth_telephony_event_filter,
NULL, NULL);
}
- if (subscribe_event5_id == -1) {
+ if (subscribe_event5_id == 0) {
subscribe_event5_id = g_dbus_connection_signal_subscribe(conn,
NULL, HFP_AGENT_SERVICE,
HFP_RELEASE_CALL, NULL, NULL, 0,
__bluetooth_telephony_event_filter,
NULL, NULL);
}
- if (subscribe_event6_id == -1) {
+ if (subscribe_event6_id == 0) {
subscribe_event6_id = g_dbus_connection_signal_subscribe(conn,
NULL, HFP_AGENT_SERVICE,
HFP_THREEWAY_CALL, NULL, NULL, 0,
return BLUETOOTH_TELEPHONY_ERROR_NONE;
} else {
- if (subscribe_event1_id != -1) {
+ if (subscribe_event1_id > 0) {
g_dbus_connection_signal_unsubscribe(conn,
subscribe_event1_id);
- subscribe_event1_id = -1;
+ subscribe_event1_id = 0;
}
- if (subscribe_event2_id != -1) {
+ if (subscribe_event2_id > 0) {
g_dbus_connection_signal_unsubscribe(conn,
subscribe_event2_id);
- subscribe_event2_id = -1;
+ subscribe_event2_id = 0;
}
- if (subscribe_event3_id != -1) {
+ if (subscribe_event3_id > 0) {
g_dbus_connection_signal_unsubscribe(conn,
subscribe_event3_id);
- subscribe_event3_id = -1;
+ subscribe_event3_id = 0;
}
- if (subscribe_event4_id != -1) {
+ if (subscribe_event4_id > 0) {
g_dbus_connection_signal_unsubscribe(conn,
subscribe_event4_id);
- subscribe_event4_id = -1;
+ subscribe_event4_id = 0;
}
- if (subscribe_event5_id != -1) {
+ if (subscribe_event5_id > 0) {
g_dbus_connection_signal_unsubscribe(conn,
subscribe_event5_id);
- subscribe_event5_id = -1;
+ subscribe_event5_id = 0;
}
- if (subscribe_event6_id != -1) {
+ if (subscribe_event6_id > 0) {
g_dbus_connection_signal_unsubscribe(conn,
subscribe_event6_id);
- subscribe_event6_id = -1;
+ subscribe_event6_id = 0;
}
return BLUETOOTH_TELEPHONY_ERROR_NONE;
}
if (is_initialized == TRUE) {
BT_ERR("Bluetooth telephony already initilized");
- return BLUETOOTH_TELEPHONY_ERROR_ALREADY_INITIALIZED;
+ return BLUETOOTH_TELEPHONY_ERROR_NONE;
}
is_initialized = TRUE;
/* Call Path */
snprintf(telephony_info.call_path, sizeof(telephony_info.call_path),
CSD_CALL_APP_PATH, getpid());
- BT_DBG("Call Path = %s", telephony_info.call_path);
+ BT_INFO("Call Path = %s", telephony_info.call_path);
memset(telephony_info.address, 0x00, sizeof(telephony_info.address));
if (__bluetooth_telephony_proxy_init()) {
telephony_dbus_info.conn = NULL;
is_initialized = FALSE;
if (error) {
+ g_dbus_error_strip_remote_error(error);
ret = __bt_telephony_get_error(error->message);
BT_ERR("Error here %d\n", ret);
g_error_free(error);
telephony_dbus_info.dbus_proxy = g_dbus_proxy_new_sync(
telephony_dbus_info.conn,
G_DBUS_PROXY_FLAGS_NONE, NULL,
- DBUS_SERVICE_DBUS, DBUS_PATH_DBUS,
- DBUS_INTERFACE_DBUS, NULL, &error);
+ BT_EVENT_FREEDESKTOP, BT_FREEDESKTOP_PATH,
+ BT_EVENT_FREEDESKTOP, NULL, &error);
if (NULL == telephony_dbus_info.dbus_proxy) {
__bluetooth_telephony_proxy_deinit();
telephony_dbus_info.conn = NULL;
goto fail;
}
-#ifndef TIZEN_WEARABLE
- __bluetooth_telephony_init_headset_state();
-#endif
+ if (TIZEN_PROFILE_WEARABLE || TIZEN_PROFILE_IVI)
+ __bluetooth_telephony_init_headset_state();
FN_END;
return ret;
telephony_dbus_info.manager_proxy = NULL;
}
- if (telephony_dbus_info.conn != NULL) {
+ if (telephony_dbus_info.conn != NULL)
telephony_dbus_info.conn = NULL;
- }
if (telephony_dbus_info.dbus_proxy != NULL) {
g_object_unref(telephony_dbus_info.dbus_proxy);
if (!reply) {
BT_ERR("Error returned in method call\n");
if (err) {
- __bt_telephony_get_error(err->message);
+ BT_ERR("Error message = %s", err->message);
g_error_free(err);
}
return FALSE;
g_variant_get(reply, "(b)", &status);
g_variant_unref(reply);
-#ifdef TIZEN_WEARABLE
- if (status == TRUE && telephony_info.headset_state != BLUETOOTH_STATE_PLAYING)
- telephony_info.headset_state = BLUETOOTH_STATE_PLAYING;
-#endif
+ if (TIZEN_PROFILE_WEARABLE || TIZEN_PROFILE_IVI)
+ if (status == TRUE && telephony_info.headset_state != BLUETOOTH_STATE_PLAYING)
+ telephony_info.headset_state = BLUETOOTH_STATE_PLAYING;
BT_INFO("SCO Connected Status = [%d]", status);
return status;
{
GError *error = NULL;
GVariant *reply, *parameters;
+ int ret = BLUETOOTH_TELEPHONY_ERROR_NONE;
FN_START;
g_variant_unref(reply);
+ if (error) {
+ g_dbus_error_strip_remote_error(error);
+ ret = __bt_telephony_get_error(error->message);
+ BT_ERR("Error here %d\n", ret);
+ g_error_free(error);
+ }
+
FN_END;
- return BLUETOOTH_TELEPHONY_ERROR_NONE;
+ return ret;
}
BT_EXPORT_API int bluetooth_telephony_start_voice_recognition(void)
if (!reply) {
BT_ERR("Error returned in method call\n");
if (err) {
+ g_dbus_error_strip_remote_error(err);
ret = __bt_telephony_get_error(err->message);
g_error_free(err);
return ret;
if (!reply) {
BT_ERR("Error returned in method call\n");
if (err) {
+ g_dbus_error_strip_remote_error(err);
ret = __bt_telephony_get_error(err->message);
g_error_free(err);
return ret;
GAsyncResult *res, gpointer user_data)
{
GError *error = NULL;
- GVariant *value;
+ GVariant *value = NULL;
value = g_dbus_proxy_call_finish(proxy, res, &error);
if (value == NULL) {
} else {
BT_ERR("SCo Start Failed");
}
+ g_object_unref(proxy);
+ return;
}
BT_DBG("sco_start_cb : -");
if (proxy == NULL) {
BT_ERR("Unable to allocate new proxy");
if (err) {
+ g_dbus_error_strip_remote_error(err);
ret = __bt_telephony_get_error(err->message);
BT_ERR("Error here %d\n", ret);
g_error_free(err);
GAsyncResult *res, gpointer user_data)
{
GError *error = NULL;
- GVariant *value;
+ GVariant *value = NULL;
value = g_dbus_proxy_call_finish(proxy, res, &error);
if (value == NULL) {
} else {
BT_ERR("SCo close Failed");
}
+ g_object_unref(proxy);
+ return;
}
BT_DBG("sco_close_cb : -");
if (proxy == NULL) {
BT_ERR("Unable to allocate new proxy");
if (err) {
+ g_dbus_error_strip_remote_error(err);
ret = __bt_telephony_get_error(err->message);
BT_ERR("Error here %d\n", ret);
g_error_free(err);
/*Make sure SCO is already connected */
ret = __bluetooth_telephony_send_call_status(
CSD_CALL_STATUS_MO_ALERTING, call_id, NULL);
- if (ret != BLUETOOTH_TELEPHONY_ERROR_NONE) {
+
+ if (ret != BLUETOOTH_TELEPHONY_ERROR_NONE)
BT_ERR("send call status Failed = [%d]", ret);
- return BLUETOOTH_TELEPHONY_ERROR_INTERNAL;
- }
+
FN_END;
- return BLUETOOTH_TELEPHONY_ERROR_NONE;
+ return ret;
}
BT_EXPORT_API int bluetooth_telephony_call_answered(unsigned int call_id,
if (bt_audio) {
if (!bluetooth_telephony_is_sco_connected()) {
ret = bluetooth_telephony_audio_open();
- if (ret != 0) {
+ if (ret != BLUETOOTH_TELEPHONY_ERROR_NONE)
BT_ERR("Audio connection call Failed[%d]", ret);
- return BLUETOOTH_TELEPHONY_ERROR_INTERNAL;
- }
}
}
ret = __bluetooth_telephony_send_call_status(CSD_CALL_STATUS_MT_RELEASE,
call_id, NULL);
- if (ret != BLUETOOTH_TELEPHONY_ERROR_NONE) {
+ if (ret != BLUETOOTH_TELEPHONY_ERROR_NONE)
BT_ERR("send call status Failed = [%d]", ret);
- return ret;
- }
FN_END;
return ret;
GVariant *param;
GError *err = NULL;
const char *path = telephony_info.call_path;
- int ret;
+ int ret = BLUETOOTH_TELEPHONY_ERROR_NONE;
FN_START;
if (!reply) {
BT_ERR("Error returned in method call\n");
if (err) {
+ g_dbus_error_strip_remote_error(err);
ret = __bt_telephony_get_error(err->message);
g_error_free(err);
return ret;
if (bt_audio) {
if (!bluetooth_telephony_is_sco_connected()) {
ret = bluetooth_telephony_audio_open();
- if (ret != 0) {
+ if (ret != 0)
BT_ERR(" Audio connection Failed = %d", ret);
- return BLUETOOTH_TELEPHONY_ERROR_INTERNAL;
- }
}
}
FN_END;
- return BLUETOOTH_TELEPHONY_ERROR_NONE;
+ return ret;
}
BT_EXPORT_API int bluetooth_telephony_indicate_incoming_call(
if (!reply) {
BT_ERR("Error returned in method call\n");
if (err) {
+ g_dbus_error_strip_remote_error(err);
ret = __bt_telephony_get_error(err->message);
g_error_free(err);
return ret;
if (!reply) {
BT_ERR("Error returned in method call\n");
if (err) {
+ g_dbus_error_strip_remote_error(err);
ret = __bt_telephony_get_error(err->message);
g_error_free(err);
return ret;
if (!reply) {
BT_ERR("Error returned in method call\n");
if (err) {
+ g_dbus_error_strip_remote_error(err);
ret = __bt_telephony_get_error(err->message);
g_error_free(err);
return ret;
if (!reply) {
BT_ERR("Error returned in method call\n");
if (err) {
+ g_dbus_error_strip_remote_error(err);
ret = __bt_telephony_get_error(err->message);
g_error_free(err);
return ret;
return BLUETOOTH_ERROR_NONE;
}
+BT_EXPORT_API int bluetooth_telephony_set_active_headset(const char *remote_addr)
+{
+#ifdef TIZEN_BT_DUAL_HEADSET_CONNECT
+ GVariant *reply;
+ GVariant *param;
+ GError *err = NULL;
+ int ret;
+
+ BT_CHECK_ENABLED(return);
+
+ if (NULL == remote_addr)
+ return BLUETOOTH_TELEPHONY_ERROR_INVALID_PARAM;
+
+ param = g_variant_new("(s)", remote_addr);
+ reply = __bluetooth_telephony_dbus_method_send(
+ HFP_AGENT_PATH, HFP_AGENT_INTERFACE,
+ "SwapHeadset", &err, param);
+
+ if (!reply) {
+ BT_ERR("Error returned in method call\n");
+ if (err) {
+ g_dbus_error_strip_remote_error(err);
+ ret = __bt_telephony_get_error(err->message);
+ g_error_free(err);
+ return ret;
+ }
+ return BLUETOOTH_TELEPHONY_ERROR_INTERNAL;
+ }
+
+ g_variant_unref(reply);
+ return BLUETOOTH_TELEPHONY_ERROR_NONE;
+#else
+ return BLUETOOTH_ERROR_NOT_SUPPORT;
+#endif
+}
+
static void __bt_telephony_adapter_filter(GDBusConnection *connection,
const gchar *sender_name,
const gchar *object_path,
if (ret != BLUETOOTH_TELEPHONY_ERROR_NONE)
BT_ERR("__bluetooth_telephony_register failed");
}
+
+ g_variant_unref(optional_param);
}
FN_END;