Modify gdbus proxy flag to G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES
[platform/core/connectivity/bluetooth-frwk.git] / bt-api / bt-telephony.c
index 0e22c2e..673e787 100644 (file)
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
-#include <dbus/dbus.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
 
@@ -68,7 +67,6 @@ char *src_addr = NULL;
 #define HFP_AGENT_PATH "/org/bluez/hfp_agent"
 #define HFP_AGENT_INTERFACE "Org.Hfp.App.Interface"
 
-#define TELEPHONY_APP_INTERFACE "org.tizen.csd.Call.Instance"
 #define CSD_CALL_APP_PATH "/org/tizen/csd/%d"
 #define HFP_NREC_STATUS_CHANGE "NrecStatusChanged"
 #define HFP_ANSWER_CALL "Answer"
@@ -308,11 +306,11 @@ static GVariant *__bluetooth_telephony_dbus_method_send(const char *path,
                const char *interface, const char *method,
                GError **err, GVariant *parameters)
 {
-#if defined(TIZEN_PROFILE_WEARABLE) || defined(TIZEN_PROFILE_IVI)
-       int timeout = 4000;
-#else
        int timeout = -1;
-#endif
+
+       if (TIZEN_PROFILE_WEARABLE || TIZEN_PROFILE_IVI)
+               timeout = 4000;
+
        GVariant *reply;
        GDBusProxy *proxy;
        GDBusConnection *conn;
@@ -322,7 +320,7 @@ static GVariant *__bluetooth_telephony_dbus_method_send(const char *path,
        conn = telephony_dbus_info.conn;
        retv_if(conn == NULL, NULL);
 
-       proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+       proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
                        NULL, HFP_AGENT_SERVICE, path, interface, NULL, err);
        if (proxy == NULL) {
                BT_ERR("Unable to allocate new proxy");
@@ -692,19 +690,10 @@ int __bluetooth_telephony_register_object(int reg, GDBusNodeInfo *node_info)
 static int __bluetooth_telephony_proxy_init(void)
 {
        FN_START;
-       guint owner_id;
        GDBusNodeInfo *node_info;
 
-       owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
-                               TELEPHONY_APP_INTERFACE,
-                               G_BUS_NAME_OWNER_FLAGS_NONE,
-                               NULL, NULL, NULL,
-                               NULL, NULL);
-       BT_DBG("owner_id is [%d]", owner_id);
-
        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;
@@ -712,10 +701,12 @@ static int __bluetooth_telephony_proxy_init(void)
        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;
 }
 
@@ -800,7 +791,6 @@ static  int __bluetooth_telephony_unregister(void)
        return BLUETOOTH_TELEPHONY_ERROR_NONE;
 }
 
-#if defined(TIZEN_PROFILE_WEARABLE) || defined(TIZEN_PROFILE_IVI)
 static void __bluetooth_telephony_init_headset_state(void)
 {
        GVariant *reply;
@@ -840,7 +830,6 @@ static void __bluetooth_telephony_init_headset_state(void)
 
        FN_END;
 }
-#endif
 
 static gboolean __bluetooth_telephony_is_headset(uint32_t device_class)
 {
@@ -939,7 +928,7 @@ static int __bluetooth_telephony_get_connected_device(void)
        retv_if(conn == NULL, BLUETOOTH_TELEPHONY_ERROR_INTERNAL);
 
        manager_proxy = g_dbus_proxy_new_sync(
-                       conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       conn, G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, NULL,
                        BLUEZ_SERVICE_NAME, "/",
                        BLUEZ_MANAGER_INTERFACE, NULL, &error);
        if (manager_proxy == NULL) {
@@ -993,7 +982,7 @@ static int __bluetooth_telephony_get_connected_device(void)
                        g_variant_unref(path_values); /* path_values unused*/
 
                        proxy = g_dbus_proxy_new_sync(telephony_dbus_info.conn,
-                                       G_DBUS_PROXY_FLAGS_NONE, NULL,
+                                       G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, NULL,
                                        BLUEZ_SERVICE_NAME, object_path,
                                        BLUEZ_PROPERTIES_INTERFACE, NULL, &error);
                        if (proxy == NULL) {
@@ -1061,7 +1050,7 @@ static int __bluetooth_telephony_get_connected_device(void)
 
                        /* this is headset; Check for Connection */
                        headset_agent_proxy = g_dbus_proxy_new_sync(telephony_dbus_info.conn,
-                                       G_DBUS_PROXY_FLAGS_NONE, NULL,
+                                       G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, NULL,
                                        HFP_AGENT_SERVICE, object_path,
                                        HFP_AGENT_INTERFACE, NULL, &error);
                        if (headset_agent_proxy == NULL) {
@@ -1162,7 +1151,7 @@ static GDBusProxy *__bluetooth_telephony_get_connected_device_proxy(void)
                return NULL;
 
        proxy = g_dbus_proxy_new_sync(telephony_dbus_info.conn,
-                       G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, NULL,
                        HFP_AGENT_SERVICE, HFP_AGENT_PATH,
                        HFP_AGENT_INTERFACE, NULL, &error);
        if (proxy == NULL) {
@@ -1186,9 +1175,10 @@ int __bt_telephony_subscribe_adapter_signal(GDBusConnection *conn,
        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,
@@ -1197,10 +1187,10 @@ int __bt_telephony_subscribe_adapter_signal(GDBusConnection *conn,
                }
                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;
        }
@@ -1212,21 +1202,22 @@ int __bt_telephony_event_subscribe_signal(GDBusConnection *conn,
        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,
@@ -1234,28 +1225,28 @@ int __bt_telephony_event_subscribe_signal(GDBusConnection *conn,
                                        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,
@@ -1265,35 +1256,35 @@ int __bt_telephony_event_subscribe_signal(GDBusConnection *conn,
 
                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;
        }
@@ -1311,7 +1302,7 @@ BT_EXPORT_API int bluetooth_telephony_init(bt_telephony_func_ptr cb,
 
        if (is_initialized == TRUE) {
                BT_ERR("Bluetooth telephony already initilized");
-               return BLUETOOTH_TELEPHONY_ERROR_ALREADY_INITIALIZED;
+               return BLUETOOTH_TELEPHONY_ERROR_NONE;
        }
 
        is_initialized = TRUE;
@@ -1326,7 +1317,7 @@ BT_EXPORT_API int bluetooth_telephony_init(bt_telephony_func_ptr cb,
        /* 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()) {
@@ -1338,7 +1329,7 @@ BT_EXPORT_API int bluetooth_telephony_init(bt_telephony_func_ptr cb,
 
        telephony_dbus_info.manager_proxy = g_dbus_proxy_new_sync(
                        telephony_dbus_info.conn,
-                       G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, NULL,
                        BLUEZ_SERVICE_NAME, "/",
                        BLUEZ_MANAGER_INTERFACE, NULL, &error);
        if (telephony_dbus_info.manager_proxy == NULL) {
@@ -1358,9 +1349,9 @@ BT_EXPORT_API int bluetooth_telephony_init(bt_telephony_func_ptr cb,
 
        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);
+                       G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, NULL,
+                       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;
@@ -1406,9 +1397,8 @@ BT_EXPORT_API int bluetooth_telephony_init(bt_telephony_func_ptr cb,
                goto fail;
        }
 
-#if defined(TIZEN_PROFILE_WEARABLE) || defined(TIZEN_PROFILE_IVI)
-       __bluetooth_telephony_init_headset_state();
-#endif
+       if (TIZEN_PROFILE_WEARABLE || TIZEN_PROFILE_IVI)
+               __bluetooth_telephony_init_headset_state();
 
        FN_END;
        return ret;
@@ -1450,9 +1440,8 @@ BT_EXPORT_API int bluetooth_telephony_deinit(void)
                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);
@@ -1489,10 +1478,9 @@ BT_EXPORT_API gboolean bluetooth_telephony_is_sco_connected(void)
        g_variant_get(reply, "(b)", &status);
        g_variant_unref(reply);
 
-#if defined(TIZEN_PROFILE_WEARABLE) || defined(TIZEN_PROFILE_IVI)
-       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;
@@ -1615,6 +1603,7 @@ BT_EXPORT_API int bluetooth_telephony_send_vendor_cmd(const char *cmd)
 {
        GError *error = NULL;
        GVariant *reply, *parameters;
+       int ret = BLUETOOTH_TELEPHONY_ERROR_NONE;
 
        FN_START;
 
@@ -1637,8 +1626,15 @@ BT_EXPORT_API int bluetooth_telephony_send_vendor_cmd(const char *cmd)
 
        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)
@@ -1714,7 +1710,7 @@ static void __bluetooth_telephony_sco_start_cb(GDBusProxy *proxy,
                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) {
@@ -1725,6 +1721,8 @@ static void __bluetooth_telephony_sco_start_cb(GDBusProxy *proxy,
                } else {
                        BT_ERR("SCo Start Failed");
                }
+               g_object_unref(proxy);
+               return;
        }
 
        BT_DBG("sco_start_cb : -");
@@ -1760,7 +1758,7 @@ BT_EXPORT_API int bluetooth_telephony_audio_open(void)
        if (telephony_info.headset_state == BLUETOOTH_STATE_PLAYING)
                return BLUETOOTH_TELEPHONY_ERROR_ALREADY_CONNECTED;
 
-       proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+       proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, NULL,
                        HFP_AGENT_SERVICE, HFP_AGENT_PATH,
                        HFP_AGENT_INTERFACE, NULL, &err);
        if (proxy == NULL) {
@@ -1786,7 +1784,7 @@ static void __bluetooth_telephony_sco_close_cb(GDBusProxy *proxy,
                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) {
@@ -1797,6 +1795,8 @@ static void __bluetooth_telephony_sco_close_cb(GDBusProxy *proxy,
                } else {
                        BT_ERR("SCo close Failed");
                }
+               g_object_unref(proxy);
+               return;
        }
 
        BT_DBG("sco_close_cb : -");
@@ -1831,7 +1831,7 @@ BT_EXPORT_API int bluetooth_telephony_audio_close(void)
        if (telephony_info.headset_state != BLUETOOTH_STATE_PLAYING)
                return BLUETOOTH_TELEPHONY_ERROR_NOT_CONNECTED;
 
-       proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+       proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, NULL,
                        HFP_AGENT_SERVICE, HFP_AGENT_PATH,
                        HFP_AGENT_INTERFACE, NULL, &err);
        if (proxy == NULL) {
@@ -1868,12 +1868,12 @@ BT_EXPORT_API int bluetooth_telephony_call_remote_ringing(unsigned int call_id)
        /*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,
@@ -1897,10 +1897,8 @@ 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;
-                       }
                }
        }
 
@@ -1931,10 +1929,8 @@ BT_EXPORT_API int bluetooth_telephony_call_end(unsigned int call_id)
 
        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;
@@ -2084,7 +2080,7 @@ BT_EXPORT_API int bluetooth_telephony_indicate_outgoing_call(
        GVariant *param;
        GError *err = NULL;
        const char *path = telephony_info.call_path;
-       int ret;
+       int ret = BLUETOOTH_TELEPHONY_ERROR_NONE;
 
        FN_START;
 
@@ -2118,15 +2114,13 @@ BT_EXPORT_API int bluetooth_telephony_indicate_outgoing_call(
        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(
@@ -2275,6 +2269,42 @@ BT_EXPORT_API int bluetooth_telephony_is_connected(gboolean *ag_connected)
        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,
@@ -2307,6 +2337,8 @@ static void __bt_telephony_adapter_filter(GDBusConnection *connection,
                        if (ret != BLUETOOTH_TELEPHONY_ERROR_NONE)
                                BT_ERR("__bluetooth_telephony_register failed");
                }
+
+               g_variant_unref(optional_param);
        }
 
        FN_END;