Add support for auto-coverage in Bluetooth-Agent
[platform/core/connectivity/bluetooth-agent.git] / ag-agent / bluetooth-ag-agent.c
old mode 100755 (executable)
new mode 100644 (file)
index 809577c..70a7c4a
@@ -29,6 +29,7 @@
 #include <bundle_internal.h>
 #include "bluetooth-ag-agent.h"
 #include "bluetooth-ag-handler.h"
+#include "bluetooth-agent-profile.h"
 
 #include <TapiUtility.h>
 #include <ITapiSim.h>
@@ -43,8 +44,9 @@
 
 static GMainLoop *gmain_loop = NULL;
 static GDBusProxy *service_gproxy;
-static int owner_sig_id = -1;
-static int name_owner_sig_id = -1;
+static guint interface_added_sig_id = 0;
+static guint interface_removed_sig_id = 0;
+static guint name_owner_sig_id = 0;
 GDBusConnection *ag_dbus_conn = NULL;
 gchar *remote_dev_path = NULL;
 gboolean wbs_en;
@@ -63,8 +65,8 @@ static guint hf_bluez_id;
 static guint hs_bluez_id;
 static guint app_id;
 #ifdef TIZEN_FEATURE_BT_MEDIA_ENHANCE
-static int media_sig_id = -1;
-static int media_state_sig_id = -1;
+static guint media_sig_id = 0;
+static guint media_state_sig_id = 0;
 static bt_ag_media_transport_state_t transport_state;
 #endif
 
@@ -74,10 +76,7 @@ static bt_ag_media_transport_state_t transport_state;
 #define A2DP_SINK_UUID "0000110b-0000-1000-8000-00805f9b34fb"
 #endif
 #define DEFAULT_ADAPTER_OBJECT_PATH "/org/bluez/hci0"
-
-#ifdef TIZEN_FEATURE_BT_LUNAR_DEVICE
 #define VCONF_KEY_BT_LUNAR_ENABLED "db/wms/bt_loop_device_hfp_connected"
-#endif
 
 #if defined(TIZEN_PROFILE_WEARABLE) && defined(TIZEN_FEATURE_BT_HFP_AG)
 #define CALL_APP_ID "org.tizen.call-ui"
@@ -172,6 +171,9 @@ static const gchar ag_agent_app_introspection_xml[] =
 "      </method>"
 "      <method name='CheckPrivilege'>"
 "      </method>"
+"     <method name='SwapHeadset'>"
+"          <arg type='s' name='remote_addr' direction='in'/>"
+"     </method>"
 "  </interface>"
 "</node>";
 
@@ -223,6 +225,7 @@ static void __bt_ag_name_owner_changed_cb(GDBusConnection *connection,
                                        GVariant *parameters,
                                        gpointer user_data);
 
+/* LCOV_EXCL_START */
 static void __bt_convert_addr_type_to_rev_string(char *address,
                                unsigned char *addr)
 {
@@ -320,6 +323,7 @@ static int __bt_ag_agent_gdbus_method_send(const char *service,
        }
        return BT_HFP_AGENT_ERROR_NONE;
 }
+/* LCOV_EXCL_STOP */
 
 gboolean _bt_ag_agent_emit_signal(
                                GDBusConnection *connection,
@@ -338,10 +342,12 @@ gboolean _bt_ag_agent_emit_signal(
                                &error);
        if (!ret) {
                if (error != NULL) {
+                       /* LCOV_EXCL_START */
                        /* dBUS gives error cause */
                        ERR("D-Bus API failure: errCode[%x], message[%s]",
                                error->code, error->message);
                        g_clear_error(&error);
+                       /* LCOV_EXCL_STOP */
                }
        }
        INFO_C("Emit Signal done = [%s]", name);
@@ -371,6 +377,7 @@ gboolean _bt_ag_agent_emit_property_changed(
        return ret;
 }
 
+/* LCOV_EXCL_START */
 static void __bt_ag_agent_start_watch(bt_ag_info_t *bt_ag_info)
 {
        bt_ag_info->watch_id = g_io_add_watch(bt_ag_info->io_chan,
@@ -401,9 +408,12 @@ gboolean __bt_ag_agent_is_companion_device(const char *addr)
 
        if (g_strcmp0(host_device_address, addr) == 0) {
                INFO("addr[%s] is companion device", addr);
+               free(host_device_address);
                return TRUE;
        }
 
+       free(host_device_address);
+
        return FALSE;
 #else
        /* TODO : Need to add companion device check condition for Phone models */
@@ -467,10 +477,10 @@ gboolean __bt_ag_agent_check_dual_hf_condition(const gchar *device_path)
                if (!is_companion_device)
                        return FALSE;
        }
-
        return TRUE;
 }
 #endif /* TIZEN_SUPPORT_DUAL_HF */
+/* LCOV_EXCL_STOP */
 
 static gboolean __bt_is_phone_locked(int *phone_lock_state)
 {
@@ -482,8 +492,10 @@ static gboolean __bt_is_phone_locked(int *phone_lock_state)
 
        ret = vconf_get_int(VCONFKEY_IDLE_LOCK_STATE, phone_lock_state);
        if (ret != 0) {
+               /* LCOV_EXCL_START */
                ERR("Failed to read  [%s]\n", VCONFKEY_IDLE_LOCK_STATE);
                return FALSE;
+               /* LCOV_EXCL_STOP */
        }
 
        FN_END;
@@ -553,7 +565,7 @@ static gboolean __bt_get_outgoing_call_condition(int *condition)
 #endif
 }
 
-#if defined(TIZEN_PROFILE_WEARABLE) && defined(TIZEN_TELEPHONY_ENABLED)
+/* LCOV_EXCL_START */
 static gboolean  __bt_ag_agent_launch_call_app(const char *number)
 {
        FN_START;
@@ -579,7 +591,6 @@ static gboolean  __bt_ag_agent_launch_call_app(const char *number)
        FN_END;
        return TRUE;
 }
-#endif
 
 static void *__bt_ag_agent_launch_call_req(void *arg)
 {
@@ -597,14 +608,13 @@ static gboolean __bt_ag_agent_make_call(const char *number)
 {
        FN_START;
 
-#if defined(TIZEN_PROFILE_WEARABLE) && defined(TIZEN_FEATURE_BT_HFP_AG)
-       FN_END;
-       return __bt_ag_agent_launch_call_app(number);
-#else
        char telnum[BT_MAX_TEL_NUM_STRING];
        bundle *b;
        pthread_t thread_id;
 
+       if (TIZEN_PROFILE_WEARABLE)
+               return __bt_ag_agent_launch_call_app(number);
+
        if (call_launch_requested == TRUE) {
                DBG("Launch request is in progress");
                return TRUE;
@@ -632,7 +642,6 @@ static gboolean __bt_ag_agent_make_call(const char *number)
 
        FN_END;
        return TRUE;
-#endif
 }
 
 static gboolean __bt_ag_agent_make_video_call(const char *mo_number)
@@ -668,7 +677,7 @@ gboolean _bt_ag_agent_answer_call(unsigned int call_id,
        DBG("Sender = %s", sender);
 
        _bt_ag_agent_emit_signal(ag_dbus_conn, path,
-                                       BT_AG_SERVICE_NAME, "Answer",
+                                       BT_HEADSET_INTERFACE, "Answer",
                                        g_variant_new("(u)", call_id));
        FN_END;
        return TRUE;
@@ -689,7 +698,7 @@ gboolean _bt_ag_agent_reject_call(unsigned int call_id,
        DBG("Sender = %s", sender);
 
        _bt_ag_agent_emit_signal(ag_dbus_conn, path,
-                                       BT_AG_SERVICE_NAME, "Reject",
+                                       BT_HEADSET_INTERFACE, "Reject",
                                        g_variant_new("(u)", call_id));
        FN_END;
        return TRUE;
@@ -710,12 +719,13 @@ gboolean _bt_ag_agent_release_call(unsigned int call_id,
        DBG("Sender = %s", sender);
 
        _bt_ag_agent_emit_signal(ag_dbus_conn, path,
-                                       BT_AG_SERVICE_NAME, "Release",
+                                       BT_HEADSET_INTERFACE, "Release",
                                        g_variant_new("(u)", call_id));
 
        FN_END;
        return TRUE;
 }
+/* LCOV_EXCL_STOP */
 
 bt_hfp_agent_error_t _bt_ag_agent_dial_num(const gchar *number, guint flags)
 {
@@ -756,6 +766,7 @@ bt_hfp_agent_error_t _bt_ag_agent_dial_num(const gchar *number, guint flags)
                goto fail;
        }
 
+       /* LCOV_EXCL_START */
        if (callapp_type == BT_VIDEO_CALL) {
                if (!__bt_ag_agent_make_video_call(number)) {
                        ERR("Problem launching application");
@@ -769,6 +780,7 @@ bt_hfp_agent_error_t _bt_ag_agent_dial_num(const gchar *number, guint flags)
                        goto fail;
                }
        }
+       /* LCOV_EXCL_STOP */
 
 fail:
        FN_END;
@@ -797,6 +809,7 @@ bt_hfp_agent_error_t _bt_ag_agent_dial_memory(unsigned int location)
                return BT_HFP_AGENT_ERROR_INTERNAL;
        }
 
+       /* LCOV_EXCL_START */
        contacts_filter_create(_contacts_speeddial._uri, &filter);
 
        if (filter == NULL)
@@ -880,8 +893,10 @@ done:
        FN_END;
 
        return error_code;
+       /* LCOV_EXCL_STOP */
 }
 
+/* LCOV_EXCL_START */
 bt_hfp_agent_error_t _bt_ag_agent_send_dtmf(const gchar *dtmf,
                                const gchar *path, const gchar *sender)
 {
@@ -891,7 +906,7 @@ bt_hfp_agent_error_t _bt_ag_agent_send_dtmf(const gchar *dtmf,
 
        if (dtmf == NULL || path == NULL || sender == NULL) {
                ERR("Invalid Argument");
-               return FALSE;
+               return BT_HFP_AGENT_ERROR_INVALID_PARAM;
        }
 
        DBG("Dtmf = %s", dtmf);
@@ -931,11 +946,12 @@ gboolean _bt_ag_agent_threeway_call(unsigned int chld_value,
                return FALSE;
 #endif
        _bt_ag_agent_emit_signal(ag_dbus_conn, path,
-                                       BT_AG_SERVICE_NAME, "Threeway",
+                                       BT_HEADSET_INTERFACE, "Threeway",
                                        g_variant_new("(u)", chld_value));
        FN_END;
        return TRUE;
 }
+/* LCOV_EXCL_STOP */
 
 bt_hfp_agent_error_t _bt_ag_agent_dial_last_num(void *device)
 {
@@ -962,6 +978,7 @@ bt_hfp_agent_error_t _bt_ag_agent_dial_last_num(void *device)
                return err_code;
        }
 
+       /* LCOV_EXCL_START */
        contacts_filter_create(_contacts_phone_log._uri, &filter);
 
        if (filter == NULL)
@@ -1129,8 +1146,10 @@ done:
        FN_END;
 
        return err_code;
+       /* LCOV_EXCL_STOP */
 }
 
+/* LCOV_EXCL_START */
 bt_hfp_agent_error_t _bt_ag_agent_vendor_cmd(const gchar *cmd,
                const gchar *path, const gchar *sender)
 {
@@ -1154,6 +1173,7 @@ bt_hfp_agent_error_t _bt_ag_agent_vendor_cmd(const gchar *cmd,
        FN_END;
        return ret;
 }
+/* LCOV_EXCL_STOP */
 
 gboolean _bt_ag_agent_get_signal_quality(void *device)
 {
@@ -1162,7 +1182,7 @@ gboolean _bt_ag_agent_get_signal_quality(void *device)
        FN_START;
 
        if (vconf_get_int(VCONFKEY_TELEPHONY_RSSI, &rssi)) {
-               DBG("VCONFKEY_TELEPHONY_RSSI failed\n");
+               DBG("VCONFKEY_TELEPHONY_RSSI failed\n"); /* LCOV_EXCL_LINE */
                goto fail;
        }
 
@@ -1174,9 +1194,11 @@ gboolean _bt_ag_agent_get_signal_quality(void *device)
        FN_END;
        return TRUE;
 fail:
+       /* LCOV_EXCL_START */
        FN_END;
        _bt_hfp_signal_quality_reply(-1, -1, device);
        return FALSE;
+       /* LCOV_EXCL_STOP */
 }
 
 gboolean _bt_ag_agent_get_battery_status(void *device)
@@ -1188,7 +1210,7 @@ gboolean _bt_ag_agent_get_battery_status(void *device)
 
        if (vconf_get_int(VCONFKEY_SYSMAN_BATTERY_CHARGE_NOW,
                                                &battery_chrg_status)) {
-               DBG("VCONFKEY_SYSMAN_BATTERY_CHARGE_NOW failed\n");
+               DBG("VCONFKEY_SYSMAN_BATTERY_CHARGE_NOW failed\n"); /* LCOV_EXCL_LINE */
                goto fail;
        }
 
@@ -1196,7 +1218,7 @@ gboolean _bt_ag_agent_get_battery_status(void *device)
 
        if (vconf_get_int(VCONFKEY_SYSMAN_BATTERY_CAPACITY,
                                                &battery_capacity)) {
-               DBG("VCONFKEY_SYSMAN_BATTERY_CAPACITY failed\n");
+               DBG("VCONFKEY_SYSMAN_BATTERY_CAPACITY failed\n"); /* LCOV_EXCL_LINE */
                goto fail;
        }
 
@@ -1208,9 +1230,11 @@ gboolean _bt_ag_agent_get_battery_status(void *device)
        return TRUE;
 
 fail:
+       /* LCOV_EXCL_START */
        _bt_hfp_battery_property_reply(device, -1, -1);
        FN_END;
        return FALSE;
+       /* LCOV_EXCL_STOP */
 }
 
 gboolean _bt_ag_agent_get_operator_name(void *device)
@@ -1220,9 +1244,11 @@ gboolean _bt_ag_agent_get_operator_name(void *device)
 
        operator_name = vconf_get_str(VCONFKEY_TELEPHONY_NWNAME);
        if (NULL == operator_name) {
+               /* LCOV_EXCL_START */
                DBG("vconf_get_str failed");
                _bt_hfp_operator_reply(NULL, device);
                return FALSE;
+               /* LCOV_EXCL_STOP */
        }
 
        DBG("operator_name  = [%s]", operator_name);
@@ -1247,8 +1273,9 @@ gboolean _bt_hfp_agent_nrec_status(gboolean status,
        else
                hs->nrec_status = TRUE;
 
-       _bt_ag_agent_emit_signal(ag_dbus_conn, hs->path,
-                                       BT_AG_SERVICE_NAME, "NrecStatusChanged",
+       if (ag_dbus_conn)
+               _bt_ag_agent_emit_signal(ag_dbus_conn, hs->path,
+                                       BT_HEADSET_INTERFACE, "NrecStatusChanged",
                                        g_variant_new("(b)", status));
        FN_END;
        return TRUE;
@@ -1265,6 +1292,7 @@ gboolean _bt_ag_agent_get_imei_number(void *device)
                goto fail;
        }
 
+       /* LCOV_EXCL_START */
        if (!g_utf8_validate(imei_number, -1, NULL)) {
                free(imei_number);
                ERR("get_imei_number : invalid UTF8");
@@ -1276,7 +1304,7 @@ gboolean _bt_ag_agent_get_imei_number(void *device)
        free(imei_number);
        FN_END;
        return TRUE;
-
+       /* LCOV_EXCL_STOP */
 fail:
        _bt_hfp_get_imei_number_reply(NULL, device);
        FN_END;
@@ -1286,21 +1314,25 @@ fail:
 void _bt_ag_agent_get_manufacturer_name(void *device)
 {
        FN_START;
-       char *manufacturer_name;
+       char *manufacturer_name = NULL;
        int ret;
 
        ret = system_info_get_platform_string("http://tizen.org/system/manufacturer",
                                                &manufacturer_name);
        if (SYSTEM_INFO_ERROR_NONE != ret) {
+               /* LCOV_EXCL_START */
                ERR("Get manufacturer_name failed : %d", ret);
                if (NULL != manufacturer_name)
                        free(manufacturer_name);
 
                manufacturer_name = g_strdup("Unknown");
+               /* LCOV_EXCL_STOP */
        } else if (!g_utf8_validate(manufacturer_name, -1, NULL)) {
+               /* LCOV_EXCL_START */
                free(manufacturer_name);
                manufacturer_name = g_strdup("Unknown");
                ERR("get_manufacturer_name : invalid UTF8");
+               /* LCOV_EXCL_STOP */
        }
 
        DBG_SECURE("manufacturer_name  = [%s]", manufacturer_name);
@@ -1318,16 +1350,19 @@ void _bt_ag_agent_get_imsi(void *device)
                ERR("tel_get_sim_imsi failed");
                goto fail;
        }
+       /* LCOV_EXCL_START */
        DBG_SECURE("tapi values %s %s %s", imsi.szMcc, imsi.szMnc, imsi.szMsin);
 
        _bt_hfp_get_imsi_reply(imsi.szMcc, imsi.szMnc, imsi.szMsin, device);
        FN_END;
        return;
+       /* LCOV_EXCL_STOP */
 fail:
        _bt_hfp_get_imsi_reply(NULL, NULL, NULL, device);
        FN_END;
 }
 
+/* LCOV_EXCL_START */
 int _bt_ag_agent_registration_status_convert(int result)
 {
        switch (result) {
@@ -1344,6 +1379,7 @@ int _bt_ag_agent_registration_status_convert(int result)
        }
        return result;
 }
+/* LCOV_EXCL_STOP */
 
 void _bt_ag_agent_get_creg_status(void *device)
 {
@@ -1360,6 +1396,7 @@ void _bt_ag_agent_get_creg_status(void *device)
                ERR("tel_get_property_int failed");
                return;
        }
+       /* LCOV_EXCL_START */
        registration_status =
                        _bt_ag_agent_registration_status_convert(result);
 
@@ -1383,12 +1420,13 @@ void _bt_ag_agent_get_creg_status(void *device)
 
        FN_END;
        return;
+       /* LCOV_EXCL_STOP */
 }
 
 void _bt_ag_agent_get_model_name(void *device)
 {
        FN_START;
-       char *model_name;
+       char *model_name = NULL;
        int ret;
 
        ret = system_info_get_platform_string("http://tizen.org/system/model_name", &model_name);
@@ -1413,7 +1451,7 @@ void _bt_ag_agent_get_model_name(void *device)
 void _bt_ag_agent_get_revision_information(void *device)
 {
        FN_START;
-       char *revision_info;
+       char *revision_info = NULL;
        int ret;
 
        ret = system_info_get_platform_string("http://tizen.org/system/build.string",
@@ -1507,6 +1545,7 @@ gboolean _bt_ag_agent_voice_dial(gboolean activate)
        return __bt_ag_agent_launch_voice_dial(activate);
 }
 
+/* LCOV_EXCL_START */
 static void __bt_ag_codec_negotiation_info_reset(bt_ag_info_t *hs,
                                        gboolean reset)
 {
@@ -1634,16 +1673,16 @@ static bt_hfp_agent_error_t __bt_hfp_send_bcs_command(bt_ag_info_t *hs,
                        gboolean init_by_hf)
 {
        uint32_t codec;
-       struct ag_codec *data = g_new0(struct ag_codec, 1);
+       struct ag_codec *data = NULL;;
 
-#ifdef TIZEN_FEATURE_BT_KIRAN_DEVICE
-       codec = BT_CVSD_CODEC_ID;
-#else
-       if (hs->codec_info.remote_codecs & BT_MSBC_CODEC_MASK)
-               codec = BT_MSBC_CODEC_ID;
-       else
+       if (TIZEN_MODEL_NAME_TM1) {
                codec = BT_CVSD_CODEC_ID;
-#endif
+       } else {
+               if (hs->codec_info.remote_codecs & BT_MSBC_CODEC_MASK)
+                       codec = BT_MSBC_CODEC_ID;
+               else
+                       codec = BT_CVSD_CODEC_ID;
+       }
 
        if (wbs_opts.wbs_enable == FALSE)
                codec = BT_CVSD_CODEC_ID;
@@ -1661,6 +1700,10 @@ static bt_hfp_agent_error_t __bt_hfp_send_bcs_command(bt_ag_info_t *hs,
        hs->codec_info.requested_by_hf = init_by_hf;
        hs->codec_info.final_codec = codec;
 
+       data = g_new0(struct ag_codec, 1);
+       if (data == NULL)
+               return BT_HFP_AGENT_ERROR_NO_MEMORY;
+
        data->bt_ag_info = hs;
        data->codec_status = g_strdup("timeout");
 
@@ -1820,6 +1863,7 @@ static void __bt_ag_str2ba(const char *str, bt_addr *ba)
        for (i = 5; i >= 0; i--, str += 3)
                ba->b[i] = strtol(str, NULL, 16);
 }
+/* LCOV_EXCL_STOP */
 
 static const char *__bt_ag_state2str(hs_state_t state)
 {
@@ -1859,6 +1903,7 @@ void _bt_convert_addr_string_to_type_rev(unsigned char *addr,
        }
 }
 
+/* LCOV_EXCL_START */
 static gboolean __bt_ag_check_nval(GIOChannel *chan)
 {
        struct pollfd file_desc;
@@ -1982,6 +2027,9 @@ static void __bt_ag_close_sco(bt_ag_info_t *hs)
 
        if (hs->sco_id)
                __bt_ag_agent_remove_watch(&hs->sco_id);
+
+       if (hs->sco_incoming_id)
+               __bt_ag_agent_remove_watch(&hs->sco_incoming_id);
 }
 
 static gboolean __bt_ag_sco_server_conn_cb(GIOChannel *chan,
@@ -1998,6 +2046,9 @@ static gboolean __bt_ag_sco_server_conn_cb(GIOChannel *chan,
                if (ag_info->sco_id)
                        __bt_ag_agent_remove_watch(&ag_info->sco_id);
 
+               if (ag_info->sco_incoming_id)
+                       __bt_ag_agent_remove_watch(&ag_info->sco_incoming_id);
+
                if (ag_info->watch_id)
                        _bt_ag_set_headset_state(ag_info, HEADSET_STATE_CONNECTED);
                return FALSE;
@@ -2059,7 +2110,7 @@ static gboolean __bt_ag_sco_server_cb(GIOChannel *chan,
        }
 
        ag_info->sco = sco_io;
-       ag_info->sco_id = g_io_add_watch(sco_io, G_IO_HUP | G_IO_ERR | G_IO_NVAL,
+       ag_info->sco_incoming_id = g_io_add_watch(sco_io, G_IO_HUP | G_IO_ERR | G_IO_NVAL,
                                        __bt_ag_sco_server_conn_cb, ag_info);
 
        if (remote_dev_path)
@@ -2071,6 +2122,7 @@ static gboolean __bt_ag_sco_server_cb(GIOChannel *chan,
 
        return TRUE;
 }
+/* LCOV_EXCL_STOP */
 
 static int __bt_ag_start_sco_server(bt_ag_info_t *hs)
 {
@@ -2129,6 +2181,7 @@ error:
        return BT_HFP_AGENT_ERROR_INTERNAL;
 }
 
+/* LCOV_EXCL_START */
 void __bt_ag_stop_sco_server(bt_ag_info_t *hs)
 {
        DBG("Stop SCO server");
@@ -2309,6 +2362,7 @@ void _bt_ag_set_headset_state(bt_ag_info_t *hs, hs_state_t state)
        INFO("STATE CHANGED from [%s(%d)] to [%s(%d)]",
                __bt_ag_state2str(org_state), org_state, __bt_ag_state2str(state), state);
 }
+/* LCOV_EXCL_STOP */
 
 static struct event at_event_callbacks[] = {
        { "AT+BRSF", _bt_hfp_supported_features },
@@ -2357,7 +2411,8 @@ static struct event at_event_callbacks[] = {
 int num_of_secure_command = 4;
 static const char* secure_command[] = {"CLCC", "CLIP", "CPBR", "CCWA"};
 
-void __bt_ag_agent_print_at_buffer(char *message, const char *buf)
+/* LCOV_EXCL_START */
+static void __bt_ag_agent_print_at_buffer(char *message, const char *buf)
 {
 
        int i = 0;
@@ -2414,7 +2469,7 @@ void __bt_ag_agent_print_at_buffer(char *message, const char *buf)
                i++;
        }
        if (message)
-               INFO("%s Buffer = [%s], Len(%d)", message, s, strlen(s));
+               INFO("%s Buffer = [%s], Len(%zd)", message, s, strlen(s));
        else
                INFO("[%s]", s);
 }
@@ -2432,6 +2487,7 @@ static int __bt_ag_at_handler(bt_ag_info_t *hs, const char *buf)
 
        return -EINVAL;
 }
+/* LCOV_EXCL_STOP */
 
 static int __bt_ag_send_at_valist(bt_ag_info_t *hdset, va_list list,
                        char *list_format)
@@ -2443,7 +2499,7 @@ static int __bt_ag_send_at_valist(bt_ag_info_t *hdset, va_list list,
 
        count = vsnprintf(rsp_buffer, sizeof(rsp_buffer), list_format, list);
        if (count < 0) {
-               ERR("count is %d", count);
+               ERR("count is %zd", count);
                return -EINVAL;
        }
 
@@ -2539,6 +2595,7 @@ int _bt_ag_send_response(bt_ag_info_t *hs, hfp_state_manager_err_t err)
        }
 }
 
+/* LCOV_EXCL_START */
 static gboolean __bt_ag_event_handler(GIOChannel *channel,
                                GIOCondition cond, void *user_data)
 {
@@ -2548,6 +2605,7 @@ static gboolean __bt_ag_event_handler(GIOChannel *channel,
        size_t available_buffer;
        int fd;
        bt_ag_info_t *bt_ag_info = (bt_ag_info_t *)user_data;
+       int err_return = 0;
 
 
        if (cond & G_IO_NVAL)
@@ -2575,7 +2633,7 @@ static gboolean __bt_ag_event_handler(GIOChannel *channel,
                goto failed;
        }
 
-       memcpy(&slconn->buffer[slconn->start], event_buf, len);
+       memcpy(&slconn->buffer[slconn->start + slconn->length], event_buf, len);
        slconn->length += len;
 
        slconn->buffer[slconn->start + slconn->length] = '\0';
@@ -2586,11 +2644,13 @@ static gboolean __bt_ag_event_handler(GIOChannel *channel,
                off_t cmd_len;
 
                get_cr = strchr(&slconn->buffer[slconn->start], '\r');
-               if (!get_cr)
+               if (!get_cr) {
+                       ERR("Broken AT command received, break");
                        break;
+               }
 
-               cmd_len = 1 + (off_t) get_cr -
-                       (off_t) &slconn->buffer[slconn->start];
+               cmd_len = 1 + (off_t)(intptr_t)get_cr -
+                       (off_t)(intptr_t)&slconn->buffer[slconn->start];
                *get_cr = '\0';
 
                if (cmd_len > 1) {
@@ -2602,22 +2662,31 @@ static gboolean __bt_ag_event_handler(GIOChannel *channel,
                        err = 0;
                }
 
-               if (err == -EINVAL) {
-                       ERR("Unrecognized command: %s",
-                               &slconn->buffer[slconn->start]);
-                       err = _bt_ag_send_response(bt_ag_info,
-                                       HFP_STATE_MNGR_ERR_NOT_SUPPORTED);
-                       if (err < 0)
-                               goto failed;
-               } else if (err < 0)
+               if (err < 0) {
+                       switch (err) {
+                       case -EINVAL:
+                               err_return = HFP_STATE_MNGR_ERR_NOT_SUPPORTED;
+                               break;
+                       case -EACCES:
+                               err_return = HFP_STATE_MNGR_ERR_NOT_ALLOWED;
+                               break;
+                       default:
+                               err_return = HFP_STATE_MNGR_ERR_NOT_SUPPORTED;
+                               break;
+                       }
                        ERR("Error handling command %s: %s (%d)",
                                                &slconn->buffer[slconn->start],
                                                strerror(-err), -err);
+                       err = _bt_ag_send_response(bt_ag_info,
+                                       err_return);
+                       if (err < 0)
+                               goto failed;
+               }
 
                slconn->start += cmd_len;
                slconn->length -= cmd_len;
 
-               if (!slconn->length)
+               if (slconn->length <= 0)
                        slconn->start = 0;
        }
        return TRUE;
@@ -2723,7 +2792,7 @@ static gboolean __bt_ag_agent_is_device_vr_blacklisted(const char *lap_addr)
 
        rewind(fp);
 
-       buffer = g_malloc0(sizeof(char) * size);
+       buffer = g_malloc0((sizeof(char) * size) + 1);
        if (buffer == NULL) {
                ERR("g_malloc0 is failed");
                fclose(fp);
@@ -2790,6 +2859,7 @@ static gboolean __bt_sco_open_delay_timeout_cb(gpointer user_data)
 
        return FALSE;
 }
+/* LCOV_EXCL_STOP */
 
 /*
 * Service level connection complete
@@ -2818,6 +2888,7 @@ void _bt_ag_slconn_complete(bt_ag_info_t *hs)
        _bt_ag_set_headset_state(hs, HEADSET_STATE_CONNECTED);
 }
 
+/* LCOV_EXCL_START */
 static gboolean __bt_ag_agent_connection_release(bt_ag_info_t *hs)
 {
 
@@ -2828,7 +2899,6 @@ static gboolean __bt_ag_agent_connection_release(bt_ag_info_t *hs)
        if (hs->sco) {
                __bt_ag_close_sco(hs);
                _bt_ag_set_headset_state(hs, HEADSET_STATE_CONNECTED);
-               hs->sco = NULL;
        }
        __bt_ag_agent_remove_watch(&hs->watch_id);
 
@@ -2952,7 +3022,12 @@ static void __bt_ag_agent_method(GDBusConnection *connection,
 
                g_variant_get(parameters, "(oha{sv})",
                                                &device_path, &index, &options);
-#if defined(TIZEN_SUPPORT_DUAL_HF)
+
+#if defined(TIZEN_SUPPORT_DUAL_HF) && defined(TIZEN_PROFILE_WEARABLE)
+               /*
+                * Below code is not required for dual HF support for
+                * mobile devices
+                */
                if (device_count &&
                        __bt_ag_agent_check_dual_hf_condition(device_path) == FALSE) {
                        INFO("not allow to connect 2nd HF connection");
@@ -3117,6 +3192,9 @@ static void __bt_ag_agent_method(GDBusConnection *connection,
 
                        g_free(codec);
                        g_free(nrec);
+               } else {
+                       ret = BT_HFP_AGENT_ERROR_NOT_CONNECTED;
+                       goto fail;
                }
        } else if (g_strcmp0(method_name, "Disconnect") == 0) {
                char hdset_address[18] = { 0, };
@@ -3422,6 +3500,43 @@ static void __bt_ag_agent_method(GDBusConnection *connection,
                DBG("Already pass dbus SMACK for bt-service::platform");
                /* Return success */
                g_dbus_method_invocation_return_value(invocation, NULL);
+       }  else if (g_strcmp0(method_name, "SwapHeadset") == 0) {
+               GSList *l;
+               const gchar *addr = NULL;
+               char address[BT_ADDRESS_STRING_SIZE];
+               char remote_addr[BT_ADDRESS_STRING_SIZE];
+               gboolean device_found = FALSE;
+
+               g_variant_get(parameters, "(&s)", &addr);
+               g_strlcpy(address, addr, sizeof(address));
+               DBG("Sender = %s", sender);
+
+               /* Loop through connected headset list
+                * If found, update the remote_dev_path.
+                */
+               for (l = active_devices ; l; l = l->next) {
+                       bt_ag_info_t *data = l->data;
+                       g_strlcpy(remote_addr, data->remote_addr, sizeof(remote_addr));
+                       if (g_strcmp0(remote_addr, address) == 0) {
+                               DBG("Active device found");
+                               if (data->path == NULL) {
+                                       DBG("device path is null");
+                                       ret = BT_HFP_AGENT_ERROR_INTERNAL;
+                                       goto fail;
+                               }
+                               remote_dev_path = g_strdup(data->path);
+                               DBG("Setting device path %s as active device path", remote_dev_path);
+                               device_found = TRUE;
+                               break;
+                       }
+               }
+
+               if (!device_found) {
+                       ret = BT_HFP_AGENT_ERROR_NOT_CONNECTED;
+                       goto fail;
+               }
+
+               g_dbus_method_invocation_return_value(invocation, NULL);
        }
 
        INFO("-");
@@ -3706,7 +3821,6 @@ static void __bt_ag_agent_network_signal_status_cb(keynode_t *node)
        _bt_hfp_set_property_value("SignalBarsChanged", signal_bar);
 }
 
-#ifdef TIZEN_FEATURE_BT_LUNAR_DEVICE
 static void __bt_ag_agent_lunar_connection_status_cb(keynode_t *node)
 {
        gboolean status = vconf_keynode_get_bool(node);
@@ -3720,7 +3834,6 @@ static void __bt_ag_agent_lunar_connection_status_cb(keynode_t *node)
                }
        }
 }
-#endif
 
 static void __bt_ag_agent_network_register_status_cb(keynode_t *node)
 {
@@ -3779,13 +3892,12 @@ static void __bt_ag_agent_subscribe_vconf_updates(void)
        if (0 != ret)
                ERR("Subsrciption to network failed err =  [%d]\n", ret);
 
-#ifdef TIZEN_FEATURE_BT_LUNAR_DEVICE
-       ret = vconf_notify_key_changed(VCONF_KEY_BT_LUNAR_ENABLED,
-                       (void *)__bt_ag_agent_lunar_connection_status_cb, NULL);
-       if (0 != ret)
-               ERR("Subsrciption to lunar connection failed err =  [%d]\n", ret);
-
-#endif
+       if (TIZEN_PROFILE_WEARABLE) {
+               ret = vconf_notify_key_changed(VCONF_KEY_BT_LUNAR_ENABLED,
+                               (void *)__bt_ag_agent_lunar_connection_status_cb, NULL);
+               if (0 != ret)
+                       ERR("Subsrciption to lunar connection failed err =  [%d]\n", ret);
+       }
 }
 
 static void __bt_ag_agent_release_vconf_updates(void)
@@ -3933,14 +4045,14 @@ static void __bt_ag_name_owner_changed_cb(GDBusConnection *connection,
                                        gpointer user_data)
 {
        FN_START;
-       char *name_owner = NULL;
-       char *old_owner = NULL;
-       char *new_owner = NULL;
+       const char *name_owner = NULL;
+       const char *old_owner = NULL;
+       const char *new_owner = NULL;
 
        if (strcasecmp(signal_name, "NameOwnerChanged") == 0) {
                GSList *l;
 
-               g_variant_get(parameters, "(sss)", &name_owner, &old_owner, &new_owner);
+               g_variant_get(parameters, "(&s&s&s)", &name_owner, &old_owner, &new_owner);
 
                _bt_hfp_release_all_calls_by_sender(name_owner);
 
@@ -3981,9 +4093,7 @@ static void __bt_ag_agent_filter_cb(GDBusConnection *connection,
        GVariant *optional_param = NULL;
 
        if (strcasecmp(signal_name, "InterfacesAdded") == 0) {
-
-               g_variant_get(parameters, "(&o@a{sa{sv}})",
-                                                       &path, &optional_param);
+               g_variant_get(parameters, "(&o@a{sa{sv}})", &path, &optional_param);
                if (!path) {
                        if (optional_param)
                                g_variant_unref(optional_param);
@@ -3993,12 +4103,12 @@ static void __bt_ag_agent_filter_cb(GDBusConnection *connection,
 
                INFO("Adapter Path = [%s]", path);
                if (strcasecmp(path, DEFAULT_ADAPTER_OBJECT_PATH) == 0) {
-                       gchar *path = g_strdup(BT_AG_AGENT_OBJECT_PATH);
-                       __bt_ag_agent_register(path, hfp_ver,
+                       gchar *obj_path = g_strdup(BT_AG_AGENT_OBJECT_PATH);
+                       __bt_ag_agent_register(obj_path, hfp_ver,
                                 HFP_AG_UUID, "Hands-Free Audio Gateway");
 
-                       path =  g_strdup(BT_HS_AG_AGENT_OBJECT_PATH);
-                       __bt_ag_agent_register(path, hsp_ver,
+                       obj_path =  g_strdup(BT_HS_AG_AGENT_OBJECT_PATH);
+                       __bt_ag_agent_register(obj_path, hsp_ver,
                                HSP_AG_UUID, "Headset Audio Gateway");
                }
        } else if (strcasecmp(signal_name, "InterfacesRemoved") == 0) {
@@ -4012,11 +4122,11 @@ static void __bt_ag_agent_filter_cb(GDBusConnection *connection,
 
                INFO("Adapter Path = [%s]", path);
                if (strcasecmp(path, DEFAULT_ADAPTER_OBJECT_PATH) == 0) {
-                       gchar *path = g_strdup(BT_AG_AGENT_OBJECT_PATH);
-                       __bt_ag_agent_unregister(path);
+                       gchar *obj_path = g_strdup(BT_AG_AGENT_OBJECT_PATH);
+                       __bt_ag_agent_unregister(obj_path);
 
-                       path =  g_strdup(BT_HS_AG_AGENT_OBJECT_PATH);
-                       __bt_ag_agent_unregister(path);
+                       obj_path =  g_strdup(BT_HS_AG_AGENT_OBJECT_PATH);
+                       __bt_ag_agent_unregister(obj_path);
                }
        }
 
@@ -4042,23 +4152,32 @@ static void __bt_ag_agent_dbus_deinit(void)
        if (ag_dbus_conn) {
                __bt_ag_unregister_profile_methods();
 
-               if (owner_sig_id != -1)
+               if (interface_added_sig_id)
                        g_dbus_connection_signal_unsubscribe(ag_dbus_conn,
-                                               owner_sig_id);
+                                               interface_added_sig_id);
 
-               if (name_owner_sig_id != -1)
+               if (interface_removed_sig_id)
+                       g_dbus_connection_signal_unsubscribe(ag_dbus_conn,
+                                               interface_removed_sig_id);
+
+               if (name_owner_sig_id)
                        g_dbus_connection_signal_unsubscribe(ag_dbus_conn,
                                                name_owner_sig_id);
 #ifdef TIZEN_FEATURE_BT_MEDIA_ENHANCE
-               if (media_sig_id != -1)
+               if (media_sig_id)
                        g_dbus_connection_signal_unsubscribe(ag_dbus_conn,
                                                media_sig_id);
+               media_sig_id = 0;
 
-               if (media_state_sig_id != -1)
+               if (media_state_sig_id)
                        g_dbus_connection_signal_unsubscribe(ag_dbus_conn,
                                                media_state_sig_id);
+               media_state_sig_id = 0;
 #endif
-               name_owner_sig_id = -1;
+
+               interface_added_sig_id = 0;
+               interface_removed_sig_id = 0;
+               name_owner_sig_id = 0;
                g_free(sco_owner);
                sco_owner = NULL;
 
@@ -4134,8 +4253,10 @@ fail:
        return BT_HFP_AGENT_ERROR_INTERNAL;
 
 }
+/* LCOV_EXCL_STOP */
 
 #ifdef TIZEN_FEATURE_BT_MEDIA_ENHANCE
+/* LCOV_EXCL_START */
 void _bt_ag_agent_check_transport_state(void)
 {
        FN_START;
@@ -4146,7 +4267,7 @@ void _bt_ag_agent_check_transport_state(void)
 
                proxy =  g_dbus_proxy_new_sync(ag_dbus_conn,
                                G_DBUS_PROXY_FLAGS_NONE, NULL,
-                               "org.PulseAudio2", A2DP_SOURCE_ENDPOINT,
+                               "org.pulseaudio.Server", A2DP_SOURCE_ENDPOINT,
                                BLUEZ_MEDIA_ENDPOINT_INTERFACE, NULL, &err);
 
                if (!proxy) {
@@ -4223,7 +4344,6 @@ static void __bt_ag_agent_media_filter_cb(GDBusConnection *connection,
                                }
                        }
                        g_variant_iter_free(iter);
-                       g_variant_unref(dict_param);
                }
        } else if (strcasecmp(signal_name, "ProfileStateChanged") == 0) {
                char *profile_uuid = NULL;
@@ -4245,7 +4365,10 @@ static void __bt_ag_agent_media_filter_cb(GDBusConnection *connection,
 
        FN_END;
 }
+/* LCOV_EXCL_STOP */
 #endif
+
+/* LCOV_EXCL_START */
 static void __bt_ag_agent_dbus_init(void)
 {
        FN_START;
@@ -4270,12 +4393,19 @@ static void __bt_ag_agent_dbus_init(void)
                        HSP_AG_UUID, "Headset Audio Gateway");
        }
 
-       owner_sig_id = g_dbus_connection_signal_subscribe(ag_dbus_conn,
-                               NULL, BT_MANAGER_INTERFACE, NULL, NULL, NULL, 0,
+       interface_added_sig_id = g_dbus_connection_signal_subscribe(ag_dbus_conn,
+                               NULL, BT_MANAGER_INTERFACE,
+                               BT_INTERFACES_ADDED, NULL, NULL, 0,
+                               __bt_ag_agent_filter_cb, NULL, NULL);
+
+       interface_removed_sig_id = g_dbus_connection_signal_subscribe(ag_dbus_conn,
+                               NULL, BT_MANAGER_INTERFACE,
+                               BT_INTERFACES_REMOVED, NULL, NULL, 0,
                                __bt_ag_agent_filter_cb, NULL, NULL);
+
 #ifdef TIZEN_FEATURE_BT_MEDIA_ENHANCE
        media_sig_id = g_dbus_connection_signal_subscribe(ag_dbus_conn,
-                               NULL, BT_PROPERTIES_INTERFACE, NULL, NULL,
+                               BLUEZ_SERVICE_NAME, BT_PROPERTIES_INTERFACE, NULL, NULL,
                                NULL, 0, __bt_ag_agent_media_filter_cb,
                                NULL, NULL);
 
@@ -4293,28 +4423,41 @@ static void __bt_ag_agent_dbus_init(void)
 static uint32_t __bt_ag_agent_get_ag_features(void)
 {
 
-       uint32_t ag_features = BT_AG_FEATURE_EC_AND_NR |
+       uint32_t ag_features;
+
+       if (TIZEN_MODEL_NAME_TM1) {
+               ag_features = BT_AG_FEATURE_EC_AND_NR |
+                               BT_AG_FEATURE_REJECT_CALL |
+                               BT_AG_FEATURE_ENHANCED_CALL_STATUS |
+                               BT_AG_FEATURE_THREE_WAY_CALL |
+                               BT_AG_FEATURE_EXTENDED_ERROR_RESULT_CODES;
+       } else {
+               ag_features = BT_AG_FEATURE_EC_AND_NR |
                                BT_AG_FEATURE_REJECT_CALL |
                                BT_AG_FEATURE_ENHANCED_CALL_STATUS |
                                BT_AG_FEATURE_THREE_WAY_CALL |
-#ifndef TIZEN_FEATURE_BT_KIRAN_DEVICE
                                BT_AG_FEATURE_VOICE_RECOGNITION |
-#endif
                                BT_AG_FEATURE_EXTENDED_ERROR_RESULT_CODES;
+       }
 
        wbs_en = TRUE;
 #if defined(TIZEN_FEATURE_BT_HFP_AG)
-       hfp_ver = HFP_VERSION_1_6;
+       hfp_ver = HFP_VERSION_1_7;
 #else
        hfp_ver = HFP_VERSION_1_5;
 #endif
        hsp_ver = HSP_VERSION_1_2;
 
-       if (hfp_ver == HFP_VERSION_1_6)
+       if (hfp_ver > HFP_VERSION_1_5)
                ag_features |= BT_AG_FEATURE_CODEC_NEGOTIATION;
+       if (hfp_ver == HFP_VERSION_1_7)
+               ag_features |= BT_AG_FEATURE_ESCO_S4_T2_SUPPORT;
+
        return ag_features;
 }
+/* LCOV_EXCL_STOP */
 
+/* LCOV_EXCL_START */
 void *__bt_ag_agent_telephony_init(void *arg)
 {
 
@@ -4339,7 +4482,7 @@ int main(void)
        int i;
        uint32_t ag_features;
        struct sigaction sa;
-       pthread_t thread_id;
+       pthread_t thread_id = 0;
 
        INFO_C("### Starting Bluetooth AG agent");
 
@@ -4347,7 +4490,7 @@ int main(void)
 
        ag.sdp_features = (uint16_t) ag_features & 0x1F;
 
-       if (hfp_ver == HFP_VERSION_1_6 && wbs_en == TRUE)
+       if (hfp_ver >= HFP_VERSION_1_6 && wbs_en == TRUE)
                ag.sdp_features |= BT_AG_FEATURE_SDP_WIDEBAND_SPEECH;
 
        memset(&sa, 0, sizeof(sa));
@@ -4394,3 +4537,4 @@ int main(void)
        INFO_C("### Terminating Bluetooth AG agent");
        return 0;
 }
+/* LCOV_EXCL_STOP */