X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bt-api%2Fbt-telephony.c;h=498a4223d0c91ea5648076e3c68e3c73bc11d15f;hb=62a00d2e3430ed504bc220bcfe67387dd0507e22;hp=4b1ec993508bf2b54aba7cebf2614ec97268dabe;hpb=41bfe957df119c7d3693451fe94b950bccf70904;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git diff --git a/bt-api/bt-telephony.c b/bt-api/bt-telephony.c index 4b1ec99..498a422 100644 --- a/bt-api/bt-telephony.c +++ b/bt-api/bt-telephony.c @@ -1,11 +1,5 @@ /* - * Bluetooth-telephony - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Hocheol Seo - * Jaganath K - * Chanyeol Park + * 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. @@ -24,14 +18,13 @@ #include #include #include -#include #include #include #include #include "bt-common.h" #include "bluetooth-telephony-api.h" -#include "marshal.h" +#include "bt-internal-types.h" #define BT_SCO_TIMEOUT 3000 @@ -56,8 +49,8 @@ typedef struct { } bt_telephony_info_t; -char *src_addr = NULL; - +static char *src_addr = NULL; +static guint owner_id = 0; #define BLUETOOTH_TELEPHONY_ERROR (__bluetooth_telephony_error_quark()) @@ -74,13 +67,13 @@ 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" #define HFP_REJECT_CALL "Reject" #define HFP_RELEASE_CALL "Release" #define HFP_THREEWAY_CALL "Threeway" +#define HFP_HF_BATTERY_LEVEL_CHANGE "HfBatteryLevelChanged" #define DEFAULT_ADAPTER_OBJECT_PATH "/org/bluez/hci0" @@ -99,8 +92,7 @@ static const gchar bt_telephony_introspection_xml[] = #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; \ } \ @@ -109,8 +101,7 @@ static const gchar bt_telephony_introspection_xml[] = 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; \ } \ @@ -151,8 +142,6 @@ static void __bluetooth_telephony_event_filter(GDBusConnection *connection, GVariant *parameters, gpointer user_data); -static int __bluetooth_telephony_proxy_init(void); -static void __bluetooth_telephony_proxy_deinit(void); static int __bluetooth_telephony_register(void); static int __bluetooth_telephony_unregister(void); @@ -316,11 +305,11 @@ static GVariant *__bluetooth_telephony_dbus_method_send(const char *path, 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; @@ -330,7 +319,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"); @@ -492,6 +481,20 @@ static void __bluetooth_handle_nrec_status_change(GVariant *var) } +static void __bluetooth_telephony_hf_battery_level_change(GVariant *var) +{ + telephony_event_hf_battery_level_t param; + char secure_address[BT_ADDRESS_STRING_SIZE] = { 0 }; + + g_variant_get(var, "(&su)", ¶m.remote_address, ¶m.battery_level); + + _bt_convert_addr_string_to_secure_string(secure_address, param.remote_address); + BT_INFO("address(%s) battery level(%u)", secure_address, param.battery_level); + + __bt_telephony_event_cb(BLUETOOTH_EVENT_TELEPHONY_HF_BATTERY_LEVEL_CHANGED, + BLUETOOTH_TELEPHONY_ERROR_NONE, (void *)¶m); +} + static void __bluetooth_telephony_event_filter(GDBusConnection *connection, const gchar *sender_name, const gchar *object_path, @@ -502,18 +505,7 @@ static void __bluetooth_telephony_event_filter(GDBusConnection *connection, { BT_DBG("+"); - if (strcasecmp(interface_name, HFP_AGENT_SERVICE) == 0) { - if (strcasecmp(signal_name, HFP_NREC_STATUS_CHANGE) == 0) - __bluetooth_handle_nrec_status_change(parameters); - else if (strcasecmp(signal_name, HFP_ANSWER_CALL) == 0) - __bluetooth_telephony_answer_call(parameters); - else if (strcasecmp(signal_name, HFP_REJECT_CALL) == 0) - __bluetooth_telephony_reject_call(parameters); - else if (strcasecmp(signal_name, HFP_RELEASE_CALL) == 0) - __bluetooth_telephony_release_call(parameters); - else if (strcasecmp(signal_name, HFP_THREEWAY_CALL) == 0) - __bluetooth_telephony_threeway_call(parameters); - } else if (strcasecmp(interface_name, BLUEZ_HEADSET_INTERFACE) == 0) { + if (strcasecmp(interface_name, BLUEZ_HEADSET_INTERFACE) == 0) { if (strcasecmp(signal_name, "PropertyChanged") == 0) { GVariant *values; gchar *property; @@ -638,7 +630,18 @@ static void __bluetooth_telephony_event_filter(GDBusConnection *connection, } g_variant_unref(values); - } + } else if (strcasecmp(signal_name, HFP_NREC_STATUS_CHANGE) == 0) + __bluetooth_handle_nrec_status_change(parameters); + else if (strcasecmp(signal_name, HFP_ANSWER_CALL) == 0) + __bluetooth_telephony_answer_call(parameters); + else if (strcasecmp(signal_name, HFP_REJECT_CALL) == 0) + __bluetooth_telephony_reject_call(parameters); + else if (strcasecmp(signal_name, HFP_RELEASE_CALL) == 0) + __bluetooth_telephony_release_call(parameters); + else if (strcasecmp(signal_name, HFP_THREEWAY_CALL) == 0) + __bluetooth_telephony_threeway_call(parameters); + else if (strcasecmp(signal_name, HFP_HF_BATTERY_LEVEL_CHANGE) == 0) + __bluetooth_telephony_hf_battery_level_change(parameters); } BT_DBG("-"); } @@ -673,7 +676,6 @@ int __bluetooth_telephony_register_object(int reg, GDBusNodeInfo *node_info) return BLUETOOTH_TELEPHONY_ERROR_INVALID_PARAM; path = g_strdup(telephony_info.call_path); - BT_DBG("path is [%s]", path); bt_tel_id = g_dbus_connection_register_object(telephony_dbus_info.conn, path, node_info->interfaces[0], @@ -700,19 +702,18 @@ 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; + gchar *name; - 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); + name = g_strdup_printf("org.tizen.csd.Call.Instance.p%d", getpid()); + + owner_id = g_bus_own_name_on_connection(telephony_dbus_info.conn, + name, G_BUS_NAME_OWNER_FLAGS_NONE, NULL, NULL, NULL, NULL); + BT_DBG("well-known name: %s, owner_id: %d", name, owner_id); + g_free(name); 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; @@ -720,10 +721,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; } @@ -732,9 +735,9 @@ static void __bluetooth_telephony_proxy_deinit(void) FN_START; __bluetooth_telephony_register_object(FALSE, NULL); + g_bus_unown_name(owner_id); FN_END; - return; } static int __bluetooth_telephony_register(void) @@ -808,7 +811,6 @@ static int __bluetooth_telephony_unregister(void) return BLUETOOTH_TELEPHONY_ERROR_NONE; } -#ifndef TIZEN_WEARABLE static void __bluetooth_telephony_init_headset_state(void) { GVariant *reply; @@ -848,7 +850,6 @@ static void __bluetooth_telephony_init_headset_state(void) FN_END; } -#endif static gboolean __bluetooth_telephony_is_headset(uint32_t device_class) { @@ -943,11 +944,11 @@ static int __bluetooth_telephony_get_connected_device(void) int ret = BLUETOOTH_TELEPHONY_ERROR_NONE; FN_START; - conn = _bt_gdbus_get_system_gconn(); + conn = _bt_get_system_common_conn(); 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) { @@ -1001,7 +1002,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) { @@ -1069,7 +1070,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) { @@ -1170,7 +1171,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) { @@ -1194,9 +1195,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, @@ -1205,10 +1207,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; } @@ -1220,88 +1222,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 event_id = 0; + if (subscribe == TRUE) { - if (subscribe_event1_id == -1) { - subscribe_event1_id = g_dbus_connection_signal_subscribe(conn, + if (event_id == 0) { + event_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) { - subscribe_event2_id = g_dbus_connection_signal_subscribe(conn, - NULL, HFP_AGENT_SERVICE, - HFP_NREC_STATUS_CHANGE, NULL, NULL, 0, - __bluetooth_telephony_event_filter, - NULL, NULL); - } - - if (subscribe_event3_id == -1) { - 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) { - 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) { - 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) { - subscribe_event6_id = g_dbus_connection_signal_subscribe(conn, - NULL, HFP_AGENT_SERVICE, - HFP_THREEWAY_CALL, NULL, NULL, 0, + NULL, NULL, NULL, 0, __bluetooth_telephony_event_filter, NULL, NULL); } - return BLUETOOTH_TELEPHONY_ERROR_NONE; } else { - if (subscribe_event1_id != -1) { - g_dbus_connection_signal_unsubscribe(conn, - subscribe_event1_id); - subscribe_event1_id = -1; - } - if (subscribe_event2_id != -1) { + if (event_id > 0) { g_dbus_connection_signal_unsubscribe(conn, - subscribe_event2_id); - subscribe_event2_id = -1; - } - if (subscribe_event3_id != -1) { - g_dbus_connection_signal_unsubscribe(conn, - subscribe_event3_id); - subscribe_event3_id = -1; - } - if (subscribe_event4_id != -1) { - g_dbus_connection_signal_unsubscribe(conn, - subscribe_event4_id); - subscribe_event4_id = -1; - } - if (subscribe_event5_id != -1) { - g_dbus_connection_signal_unsubscribe(conn, - subscribe_event5_id); - subscribe_event5_id = -1; - } - if (subscribe_event6_id != -1) { - g_dbus_connection_signal_unsubscribe(conn, - subscribe_event6_id); - subscribe_event6_id = -1; + event_id); + event_id = 0; } return BLUETOOTH_TELEPHONY_ERROR_NONE; } @@ -1319,12 +1255,15 @@ 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; - telephony_dbus_info.conn = _bt_gdbus_init_system_gconn(); + /* As a result of discussion with system team, private connection is not + * suitable in here. It is better to use shared connection. */ + //telephony_dbus_info.conn = _bt_gdbus_init_system_gconn(); + telephony_dbus_info.conn = _bt_get_system_shared_conn(); if (!telephony_dbus_info.conn) { is_initialized = FALSE; BT_ERR("Could not get DBus Connection"); @@ -1334,7 +1273,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()) { @@ -1346,7 +1285,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) { @@ -1366,9 +1305,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; @@ -1414,9 +1353,8 @@ BT_EXPORT_API int bluetooth_telephony_init(bt_telephony_func_ptr cb, 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; @@ -1458,9 +1396,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); @@ -1497,10 +1434,9 @@ BT_EXPORT_API gboolean bluetooth_telephony_is_sco_connected(void) 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; @@ -1623,6 +1559,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; @@ -1645,8 +1582,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) @@ -1722,7 +1666,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) { @@ -1733,6 +1677,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 : -"); @@ -1759,7 +1705,7 @@ BT_EXPORT_API int bluetooth_telephony_audio_open(void) return BLUETOOTH_TELEPHONY_ERROR_PERMISSION_DENIED; } - conn = _bt_gdbus_get_system_gconn(); + conn = _bt_get_system_common_conn(); if (!conn) { BT_DBG("No System Bus found\n"); return BLUETOOTH_TELEPHONY_ERROR_INTERNAL; @@ -1768,7 +1714,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) { @@ -1794,7 +1740,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) { @@ -1805,6 +1751,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 : -"); @@ -1830,7 +1778,7 @@ BT_EXPORT_API int bluetooth_telephony_audio_close(void) return BLUETOOTH_TELEPHONY_ERROR_PERMISSION_DENIED; } - conn = _bt_gdbus_get_system_gconn(); + conn = _bt_get_system_common_conn(); if (!conn) { BT_DBG("No System Bus found\n"); return BLUETOOTH_TELEPHONY_ERROR_INTERNAL; @@ -1839,7 +1787,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) { @@ -1876,12 +1824,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, @@ -1905,10 +1853,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; - } } } @@ -1939,10 +1885,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; @@ -2092,7 +2036,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; @@ -2126,15 +2070,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( @@ -2250,6 +2192,44 @@ BT_EXPORT_API int bluetooth_telephony_get_headset_volume( return BLUETOOTH_TELEPHONY_ERROR_NONE; } +BT_EXPORT_API int bluetooth_telephony_get_battery_level( + const char *remote_address, unsigned int *level) +{ + GVariant *reply; + GError *err = NULL; + GVariant *param = NULL; + int ret; + + FN_START; + + BT_TELEPHONY_CHECK_INITIALIZED(); + BT_TELEPHONY_CHECK_ENABLED(); + + param = g_variant_new("(s)", remote_address); + + reply = __bluetooth_telephony_dbus_method_send( + HFP_AGENT_PATH, HFP_AGENT_INTERFACE, + "GetHfBatteryLevel", &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_get(reply, "(u)", level); + + g_variant_unref(reply); + + FN_END; + return BLUETOOTH_TELEPHONY_ERROR_NONE; +} + BT_EXPORT_API int bluetooth_telephony_is_connected(gboolean *ag_connected) { GVariant *reply; @@ -2283,6 +2263,38 @@ 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) +{ + 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; +} + static void __bt_telephony_adapter_filter(GDBusConnection *connection, const gchar *sender_name, const gchar *object_path, @@ -2306,7 +2318,6 @@ static void __bt_telephony_adapter_filter(GDBusConnection *connection, return; } - BT_INFO("Adapter Path = [%s]", path); if (strcasecmp(path, DEFAULT_ADAPTER_OBJECT_PATH) == 0) { if (__bt_telephony_get_src_addr(optional_param)) BT_ERR("Fail to get the local adapter address"); @@ -2315,6 +2326,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;