Update AG and HF agent codes from wearable product
[platform/core/connectivity/bluetooth-agent.git] / ag-agent / bluetooth-ag-manager.c
index 5ba4477..f58a500 100644 (file)
 #include <string.h>
 #include "bluetooth-ag-agent.h"
 #include "bluetooth-ag-handler.h"
-#include <dbus/dbus.h>
+#include "bluetooth-agent-profile.h"
+#include <glib.h>
+
+#include "bluetooth-ag-phonebook.h"
+
+#include <TapiUtility.h>
+#include <ITapiSim.h>
+
+#include <device/battery.h>
+#include <device-error.h>
 
 #define PHONEBOOK_AGENT_BUS_NAME "org.bluez.pb_agent"
 #define PHONEBOOK_AGENT_PATH    "/org/bluez/pb_agent"
@@ -116,20 +125,20 @@ static struct {
        .signal_strength = 0,
 };
 
+#ifdef TIZEN_FEATURE_BT_PBAP_SIM
+static const char *agent_pb_store_list[] =  {
+       "\"ME\"", "\"DC\"", "\"MC\"", "\"SM\"", "\"RC\""
+};
+#else
 static const char *agent_pb_store_list[] =  {
        "\"ME\"", "\"DC\"", "\"MC\"", "\"RC\""
 };
+#endif
 
 static const char *agent_supported_character_set[] = {
        "\"UTF-8\"", "\"IRA\""
 };
 
-#if defined(TIZEN_PROFILE_WEARABLE) && defined(TIZEN_FEATURE_BT_HFP_AG)
-static const char *ag_chld_str = "0,1,2";
-#else
-static const char *ag_chld_str = "0,1,2,3";
-#endif
-
 #define AGENT_PB_STORE_LIST_SIZE (sizeof(agent_pb_store_list) \
                                /sizeof(const char *))
 #define AGENT_SUPPORTED_CHARACTER_SET_SIZE ( \
@@ -154,6 +163,33 @@ static struct {
        .charset_id = 0
 };
 
+void __bt_hfp_print_callpath(const char *call_path, const char *call_sender)
+{
+       GSList *sender_list = call_senders_paths;
+       sender_info_t *sender;
+
+       INFO("=============================");
+       INFO("call path is  = %s\n", call_path);
+       INFO("sender is  = %s\n", call_sender);
+
+       if (call_path == NULL || call_sender == NULL) {
+               ERR("Invalid Parameters");
+               return;
+       }
+
+       while (sender_list != NULL) {
+               sender = sender_list->data;
+
+               if (sender == NULL)
+                       break;
+
+               INFO("sender->sender_path [%s] ", sender->sender_path);
+               sender_list = sender_list->next;
+       }
+       INFO("=============================");
+       return;
+}
+
 static gboolean __bt_hfp_check_for_callpath(const char *call_path,
                                        const char *call_sender)
 {
@@ -185,7 +221,7 @@ static gboolean __bt_hfp_check_for_callpath(const char *call_path,
                sender_list = sender_list->next;
        }
 
-       ERR("Call path is not already registered");
+       ERR("Call path [%s] is not registered", call_path);
        return FALSE;
 }
 
@@ -230,19 +266,24 @@ void _bt_hfp_device_disconnected(void *t_device)
        __bt_hfp_reset_indicators();
 }
 
-void _bt_hfp_initialize_telephony_manager(uint32_t ag_features)
+void _bt_hfp_initialize_telephony_manager(uint32_t ag_features, TapiHandle *handler)
 {
        int index;
        int value;
        int ret;
+       char *ag_chld_str;
+
+       if (TIZEN_PROFILE_WEARABLE)
+               ag_chld_str = "0,1,2";
+       else
+               ag_chld_str = "0,1,2,3";
 
        /* Reset the indicator values */
        for (index = 0; hfp_ag_ind[index].indicator_desc != NULL; index++) {
                if (g_str_equal(hfp_ag_ind[index].indicator_desc, "battchg")) {
-                       ret = vconf_get_int(VCONFKEY_SYSMAN_BATTERY_CAPACITY,
-                                                                       &value);
-                       if (ret != 0) {
-                               ERR("Get battery status failed : %d\n", ret);
+                       ret = device_battery_get_percent(&value);
+                       if (ret != DEVICE_ERROR_NONE) {
+                               ERR("Get battery status failed. Err = %d\n", ret);
                        } else {
                                /* Send battery status ranging from 0-5 */
                                if (value < 5)
@@ -253,28 +294,28 @@ void _bt_hfp_initialize_telephony_manager(uint32_t ag_features)
                                        hfp_ag_ind[index].hfp_value = value / 20 + 1;
                        }
                } else if (g_str_equal(hfp_ag_ind[index].indicator_desc, "signal")) {
-                       ret = vconf_get_int(VCONFKEY_TELEPHONY_RSSI, &value);
-                       if (ret != 0) {
+                       ret = tel_get_property_int(handler, TAPI_PROP_NETWORK_SIGNALSTRENGTH_LEVEL, &value);
+                       if (ret != TAPI_API_SUCCESS) {
                                ERR("Get signal status failed err = %d\n", ret);
                        } else {
                                BT_CHECK_SIGNAL_STRENGTH(value);
                                hfp_ag_ind[index].hfp_value = value;
                        }
                } else if (g_str_equal(hfp_ag_ind[index].indicator_desc, "roam")) {
-                       ret = vconf_get_int(VCONFKEY_TELEPHONY_SVC_ROAM, &value);
-                       if (ret != 0)
+                       ret = tel_get_property_int(handler, TAPI_PROP_NETWORK_ROAMING_STATUS, &value);
+                       if (ret != TAPI_API_SUCCESS)
                                ERR("Get roaming status failed err = %d\n", ret);
                        else
                                hfp_ag_ind[index].hfp_value = value;
                } else if (g_str_equal(hfp_ag_ind[index].indicator_desc, "service")) {
-                       ret = vconf_get_int(VCONFKEY_TELEPHONY_SVCTYPE, &value);
-                       if (ret != 0) {
+                       ret = tel_get_property_int(handler, TAPI_PROP_NETWORK_SERVICE_TYPE, &value);
+                       if (ret != TAPI_API_SUCCESS) {
                                ERR("Get Service status failed : %d\n", ret);
                        } else {
                                switch (value) {
-                               case VCONFKEY_TELEPHONY_SVCTYPE_NONE:
-                               case VCONFKEY_TELEPHONY_SVCTYPE_NOSVC:
-                               case VCONFKEY_TELEPHONY_SVCTYPE_SEARCH:
+                               case TAPI_NETWORK_SERVICE_TYPE_UNKNOWN:
+                               case TAPI_NETWORK_SERVICE_TYPE_NO_SERVICE:
+                               case TAPI_NETWORK_SERVICE_TYPE_SEARCH:
                                        hfp_ag_ind[index].hfp_value =
                                                INDICATOR_EVENT_SERVICE_NONE;
                                        break;
@@ -335,22 +376,21 @@ bt_hfp_agent_error_t _bt_hfp_register_telephony_agent(gboolean register_flag,
        if (sender == NULL || path_to_register == NULL)
                return BT_HFP_AGENT_ERROR_INVALID_PARAM;
 
-       DBG(" register_flag = %d", register_flag);
-       DBG(" path_to_register = %s", path_to_register);
-       DBG(" sender = %s", sender);
+       INFO(" register_flag = %d", register_flag);
+       INFO(" path_to_register = %s", path_to_register);
+       INFO(" sender = %s", sender);
 
        if (register_flag) {
                if (__bt_hfp_check_for_callpath(path_to_register, sender))
                        return BT_HFP_AGENT_ERROR_ALREADY_EXSIST;
 
                /* add call path to the senders list*/
-               DBG("Call path doesn't exist. Add path %s to global path",
+               INFO("Call path doesn't exist. Add path %s to global path",
                                                path_to_register);
                sender_info = g_new0(sender_info_t, 1);
                sender_info->sender_path = g_strdup(path_to_register);
                sender_info->sender_name = g_strdup(sender);
-               call_senders_paths = g_slist_append(call_senders_paths,
-                                                               sender_info);
+               call_senders_paths = g_slist_append(call_senders_paths, sender_info);
 
                return BT_HFP_AGENT_ERROR_NONE;
        } else {
@@ -365,10 +405,12 @@ bt_hfp_agent_error_t _bt_hfp_register_telephony_agent(gboolean register_flag,
 
                        if (g_strcmp0(sender_info->sender_path,
                                        path_to_register) == 0) {
+                               INFO("Remove path [%s]", path_to_register);
                                call_senders_paths = g_slist_remove(
                                                        call_senders_paths,
                                                        sender_info);
                                __bt_hfp_clear_sender_path(sender_info);
+
                                return BT_HFP_AGENT_ERROR_NONE;
                        }
                        s_list = s_list->next;
@@ -764,15 +806,17 @@ bt_hfp_agent_error_t _bt_hfp_incoming_call(const char *call_path,
                const char *sender)
 {
        struct telephony_call *t_call = NULL;
-       bt_hfp_agent_error_t hfp_err = BT_HFP_AGENT_ERROR_NOT_AVAILABLE;
+       bt_hfp_agent_error_t hfp_err = BT_HFP_AGENT_ERROR_NONE;
        int t_number = AGENT_NUMBER_TYPE_TELEPHONY;
        int error;
 
        if (sender == NULL || call_path == NULL)
                return BT_HFP_AGENT_ERROR_INVALID_PARAM;
 
-       if (!__bt_hfp_check_for_callpath(call_path, sender))
+       if (!__bt_hfp_check_for_callpath(call_path, sender)) {
+               __bt_hfp_print_callpath(call_path, sender);
                return BT_HFP_AGENT_ERROR_NOT_AVAILABLE;
+       }
 
        if (!__bt_hfp_is_call_allowed(call_path))
                return BT_HFP_AGENT_ERROR_NOT_AVAILABLE;
@@ -840,11 +884,11 @@ bt_hfp_agent_error_t _bt_hfp_outgoing_call(const char *call_path,
        bt_hfp_agent_error_t ret =  BT_HFP_AGENT_ERROR_NONE;
        gboolean err = FALSE;
 
-
        err = __bt_hfp_check_for_callpath(call_path, sender);
-       if (!err)
+       if (!err) {
+               __bt_hfp_print_callpath(call_path, sender);
                return BT_HFP_AGENT_ERROR_NOT_AVAILABLE;
-
+       }
        /*check if the call_path exisits in the active call list, if not
        don't allow as the call may be initated by some other application*/
 
@@ -878,8 +922,10 @@ bt_hfp_agent_error_t _bt_hfp_change_call_status(const char *call_path,
 
        ret = __bt_hfp_check_for_callpath(call_path, sender);
 
-       if (!ret)
+       if (!ret) {
+               __bt_hfp_print_callpath(call_path, sender);
                return BT_HFP_AGENT_ERROR_NOT_AVAILABLE;
+       }
 
        ret = __bt_hfp_is_call_allowed(call_path);
        if (!ret)
@@ -1048,7 +1094,7 @@ int _bt_hfp_set_property_name(const char *property, const char *operator_name)
        if (g_str_equal("SubscriberNumberChanged", property)) {
                g_free(ag_subscriber_num);
                ag_subscriber_num = g_strdup(operator_name);
-               DBG("HFP: subscriber_number updated: %s", ag_subscriber_num);
+               DBG_SECURE("HFP: subscriber_number updated: %s", ag_subscriber_num);
                ret = 1;
        }
        return ret;
@@ -1179,12 +1225,16 @@ static int __bt_hfp_release_call(struct telephony_call *t_call)
 static int __bt_hfp_release_conference(void)
 {
        GSList *temp_list = existing_call_list;
+       int ret = 0;
 
        while (temp_list != NULL) {
                struct telephony_call *t_call = temp_list->data;
 
-               if (t_call->call_conference)
-                       __bt_hfp_release_call(t_call);
+               if (t_call->call_conference) {
+                       ret = __bt_hfp_release_call(t_call);
+                       if (ret < 0)
+                               ERR("Seems like there are no active calls.");
+               }
 
                temp_list = temp_list->next;
        }
@@ -1524,8 +1574,6 @@ void _bt_hfp_release_all_calls_by_sender(const char *sender)
        if (!sender)
                return;
 
-       DBG("sender [%s]", sender);
-
        while (temp_list != NULL) {
                struct telephony_call *t_call = temp_list->data;
 
@@ -1611,57 +1659,27 @@ fail:
 static int __bt_hfp_get_phonebook_count(const char *path, uint32_t *max_size,
                                uint32_t *used)
 {
-#ifndef TIZEN_PROFILE_WEARABLE
-       GDBusConnection *g_conn;
-       GDBusProxy *g_proxy;
-       GError *err = NULL;
-       GVariant *ret = NULL;
+       FN_START;
+       PhoneBookType pb_type = TELECOM_NONE;
+       guint count = 0;
        uint32_t max = 0;
-       uint32_t size = 0;
-
-       g_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
 
-       if (!g_conn) {
-               if (err) {
-                       ERR("Unable to connect to gdbus: %s", err->message);
-                       g_clear_error(&err);
-               }
-               return -1;
+       INFO("name: %s\n", path);
+       if (contacts_connect() != CONTACTS_ERROR_NONE) {
+               ERR("Can not connect contacts server\n");
+               return 0;
        }
 
-       g_proxy =  g_dbus_proxy_new_sync(g_conn,
-                       G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       PHONEBOOK_AGENT_BUS_NAME, PHONEBOOK_AGENT_PATH,
-                       PHONEBOOK_AGENT_INTERFACE, NULL, &err);
+       pb_type = __bluetooth_pb_get_storage_pb_type(path);
 
-       if (!g_proxy) {
-               if (err) {
-                       ERR("Unable to connect to gdbus: %s", err->message);
-                       g_clear_error(&err);
-               }
-               return -1;
+       if (__bluetooth_pb_get_count(pb_type, &count) == FALSE) {
+               ERR("unable to get count");
+               if (contacts_disconnect() != CONTACTS_ERROR_NONE)
+                       ERR("contacts_disconnect failed");
+               return 0;
        }
 
-       ret = g_dbus_proxy_call_sync(g_proxy, "GetPhonebookSizeAt",
-                       g_variant_new("(s)",
-                       path),
-                       G_DBUS_CALL_FLAGS_NONE, -1,
-                       NULL, &err);
-
-       if (ret == NULL) {
-               ERR("dbus call failed");
-               if (err != NULL) {
-                       ERR("D-Bus API failure: errCode[%x], message[%s]",
-                              err->code, err->message);
-
-                       g_clear_error(&err);
-               }
-       }
-       if (ret != NULL) {
-               g_variant_get(ret, "(u)", &size);
-               g_variant_unref(ret);
-       }
-       DBG("Size returned %d", size);
+       DBG("Size returned %d", count);
        if ((g_strcmp0(path, "\"SM\"") == 0) ||
                        (g_strcmp0(path, "\"ME\"") == 0)) {
                max = AGENT_MAX_PB_COUNT;
@@ -1674,17 +1692,14 @@ static int __bt_hfp_get_phonebook_count(const char *path, uint32_t *max_size,
        if (max_size)
                *max_size = max;
        if (used) {
-               if (size > max)
+               if (count > max)
                        *used = max;
                else
-                       *used = size;
+                       *used = count;
        }
-
-       if (g_conn)
-               g_object_unref(g_conn);
-       if (g_proxy)
-               g_object_unref(g_proxy);
-#endif
+       if (contacts_disconnect() != CONTACTS_ERROR_NONE)
+               ERR("contacts_disconnect failed");
+       FN_END;
        return 0;
 }
 
@@ -1790,96 +1805,33 @@ void _bt_hfp_read_phonebook_entries_list(void *t_device)
 
 static int __bt_hfp_get_phonebook_entries(int start_index, int end_index)
 {
-#ifdef TIZEN_PROFILE_WEARABLE
-       int count = 0;
-#else
-       GDBusConnection *g_conn;
-       GDBusProxy *g_proxy;
-       GError *err = NULL;
-       GVariant *ret = NULL;
+       FN_START;
        int count = 0;
-       GVariant *value = NULL;
-       GVariant *tuple = NULL;
-       const char *name = NULL;
-       const char *number = NULL;
-
-       char *uni_name;
-       char *uni_number;
-
-       uint32_t handle = 0;
+       PhoneBookType pb_type = TELECOM_NONE;
 
-       g_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
+       DBG("command: %s, start_index: %d, end_index: %d\n",
+               agent_pb_store_list[ag_pb_info.path_id], start_index, end_index);
 
-       if (!g_conn) {
-               if (err) {
-                       ERR("Unable to connect to gdbus: %s", err->message);
-                       g_clear_error(&err);
-               }
-               return -1;
+       if (contacts_connect() != CONTACTS_ERROR_NONE) {
+               ERR("Can not connect contacts server");
+               return 0;
        }
 
-       g_proxy =  g_dbus_proxy_new_sync(g_conn,
-                       G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       PHONEBOOK_AGENT_BUS_NAME, PHONEBOOK_AGENT_PATH,
-                       PHONEBOOK_AGENT_INTERFACE, NULL, &err);
-       if (!g_proxy) {
-               if (err) {
-                       ERR("Unable to connect to gdbus: %s", err->message);
-                       g_clear_error(&err);
-               }
-               return -1;
-       }
+       pb_type = __bluetooth_pb_get_storage_pb_type(
+                               agent_pb_store_list[ag_pb_info.path_id]);
 
-       ret = g_dbus_proxy_call_sync(g_proxy, "GetPhonebookEntriesAt",
-                       g_variant_new("(sii)",
-                       agent_pb_store_list[ag_pb_info.path_id],
-                       start_index, end_index),
-                       G_DBUS_CALL_FLAGS_NONE, -1,
-                       NULL, &err);
+       if (pb_type == TELECOM_NONE || pb_type == TELECOM_CCH) {
+               if (contacts_disconnect() != CONTACTS_ERROR_NONE)
+                       ERR("contacts_disconnect failed");
+               return 0;
+       }
 
-       if (ret == NULL) {
-               ERR("Dbus call failed");
-               if (err != NULL) {
-                       ERR("D-Bus API failure: errCode[%x], message[%s]",
-                                  err->code, err->message);
+       __bluetooth_pb_get_list_number(pb_type,
+                       start_index, end_index, &count);
 
-                       g_clear_error(&err);
-               } else {
-                       ERR("error returned was NULL");
-               }
-               return -1;
-       } else {
-               tuple = g_variant_get_child_value(ret, 0);
-               if (tuple != NULL) {
-                       int number_contacts = g_variant_n_children(tuple);
-                       DBG("number of contacts %d", number_contacts);
-                       while (count < number_contacts) {
-                               value = NULL;
-
-                               value = g_variant_get_child_value(tuple, count);
-
-                               g_variant_get(value, "(ssu)", &name, &number, &handle);
-                               count++;
-                               uni_name = g_strndup(name, AGENT_PB_NAME_MAX_LENGTH);
-                               uni_number = g_strndup(number, AGENT_PB_NAME_MAX_LENGTH);
-
-                               _bt_read_phonebook_entries_indicator(uni_name,
-                                               uni_number, handle);
-                               g_variant_unref(value);
-                               g_free(uni_name);
-                               g_free(uni_number);
-                               g_free((gpointer)name);
-                               g_free((gpointer)number);
-                       }
-                       g_variant_unref(tuple);
-               }
-       }
-       g_variant_unref(ret);
-       if (g_conn)
-               g_object_unref(g_conn);
-       if (g_proxy)
-               g_object_unref(g_proxy);
-#endif
+       if (contacts_disconnect() != CONTACTS_ERROR_NONE)
+               ERR("contacts_disconnect failed");
+       FN_END;
        return count;
 }
 
@@ -1934,8 +1886,47 @@ void _bt_hfp_find_phonebook_entries_status(void *t_device)
                                                HFP_STATE_MNGR_ERR_NONE);
 }
 
+static int __bt_hfp_get_phonebook_entries_by_name(int start_index,
+                                       int end_index,
+                                       const char *str)
+{
+       FN_START;
+       int count = 0;
+       PhoneBookType pb_type = TELECOM_NONE;
+
+       DBG("command: %s, start_index: %d, end_index: %d\n",
+               agent_pb_store_list[ag_pb_info.path_id], start_index, end_index);
+
+       if (contacts_connect() != CONTACTS_ERROR_NONE) {
+               ERR("Can not connect contacts server");
+               return 0;
+       }
+
+       pb_type = __bluetooth_pb_get_storage_pb_type(
+                               agent_pb_store_list[ag_pb_info.path_id]);
+
+       if (pb_type == TELECOM_NONE || pb_type == TELECOM_CCH) {
+               if (contacts_disconnect() != CONTACTS_ERROR_NONE)
+                       ERR("contacts_disconnect failed");
+               return 0;
+       }
+
+       __bluetooth_pb_get_list_entries_by_name(pb_type,
+                       start_index, end_index, str, &count);
+
+       if (contacts_disconnect() != CONTACTS_ERROR_NONE)
+               ERR("contacts_disconnect failed");
+       FN_END;
+       return count;
+}
+
 static int __bt_hfp_find_pb_entries(const char *str)
 {
+       char *search = g_ascii_strup(str, strlen(str));
+
+       /* No limit on number of searched item and need to search complete list*/
+       __bt_hfp_get_phonebook_entries_by_name(0, 0, search);
+       g_free(search);
        return 0;
 }