X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bt-service%2Fbt-service-pbap.c;h=9132225643b201259022f29f51480aaf61d18435;hb=e808cd1dcf0cc5e04b27b4900305fd77e19e5a3f;hp=adf3102aaf111c78c6d6641060b5d751ae94ece1;hpb=45b67c424f9352ccdce42e96542132ac069ddd2b;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git diff --git a/bt-service/bt-service-pbap.c b/bt-service/bt-service-pbap.c index adf3102..9132225 100644 --- a/bt-service/bt-service-pbap.c +++ b/bt-service/bt-service-pbap.c @@ -1,12 +1,5 @@ /* - - * Bluetooth-frwk - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Hocheol Seo - * Girishashok Joshi - * 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. @@ -27,65 +20,62 @@ #include #include #include -#if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT) #include -#endif #include +#include #include "bt-internal-types.h" #include "bt-service-common.h" -//#include "bt-service-agent.h" -//#include "bt-service-gap-agent.h" -//#include "bt-service-adapter.h" #include "bt-service-event.h" -//#include "bt-service-rfcomm-server.h" -//#include "bt-service-device.h" -//#include "bt-service-audio.h" #include "bt-service-pbap.h" #include #include -#define PBAP_UUID "0000112f-0000-1000-8000-00805f9b34fb" #define PBAP_OBEX_CLIENT_SERVICE "org.bluez.obex" #define PBAP_OBEX_CLIENT_PATH "/org/bluez/obex" #define PBAP_OBEX_CLIENT_INTERFACE "org.bluez.obex.Client1" #define PBAP_SESSION_SERVICE "org.bluez.obex" #define PBAP_SESSION_INTERFACE "org.bluez.obex.PhonebookAccess1" -#define PBAP_VCARDLIST_MAXLENGTH 256 - -typedef enum { -PBAP_FIELD_ALL, -PBAP_FIELD_VERSION, -PBAP_FIELD_FN, -PBAP_FIELD_N, -PBAP_FIELD_PHOTO, -PBAP_FIELD_BDAY, -PBAP_FIELD_ADR, -PBAP_FIELD_LABEL, -PBAP_FIELD_TEL, -PBAP_FIELD_EMAIL, -PBAP_FIELD_MAILER, -PBAP_FIELD_TZ, -PBAP_FIELD_GEO, -PBAP_FIELD_TITLE, -PBAP_FIELD_ROLE, -PBAP_FIELD_LOGO, -PBAP_FIELD_AGENT, -PBAP_FIELD_ORG, -PBAP_FIELD_NOTE, -PBAP_FIELD_REV, -PBAP_FIELD_SOUND, -PBAP_FIELD_URL, -PBAP_FIELD_UID, -PBAP_FIELD_KEY, -PBAP_FIELD_NICKNAME, -PBAP_FIELD_CATEGORIES, -PBAP_FIELD_PROID, -PBAP_FIELD_CLASS, -PBAP_FIELD_SORT_STRING, -PBAP_FIELD_X_IRMC_CALL_DATETIME, -} bt_pbap_field_e; +#define PBAP_VCARDLIST_MAXLENGTH 256 + +#define PBAP_NUM_OF_FIELDS_ENTRY 29 +#define PBAP_FIELD_ALL (0xFFFFFFFFFFFFFFFFULL) + +#define PBAP_DEFAULT_DOWNLAOD_PATH "/opt/usr/home/owner/media/Downloads" +#define PBAP_DEFAULT_FILE_NAME "pb.vcf" + +char *FIELDS[] = { + "VERSION", + "FN", + "N", + "PHOTO", + "BDAY", + "ADR", + "LABEL", + "TEL", + "EMAIL", + "MAILER", + "TZ", + "GEO", + "TITLE", + "ROLE", + "LOGO", + "AGENT", + "ORG", + "NOTE", + "REV", + "SOUND", + "URL", + "UID", + "KEY", + "NICKNAME", + "CATEGORIES", + "PROID", + "CLASS", + "SORT-STRING", + "X-IRMC-CALL-DATETIME", /* 29 */ +}; char *SOURCE[] = { "int", //Phone memory @@ -118,8 +108,9 @@ char *SEARCH_FIELD[] = { }; static char *g_pbap_session_path = NULL; -static DBusGConnection *dbus_connection = NULL; -static DBusGProxy *g_pbap_proxy = NULL; +static char *g_pbap_server_address = NULL; +static GDBusProxy *g_pbap_proxy = NULL; +static gboolean g_is_pbap_connecting; static struct { int type; @@ -150,11 +141,11 @@ typedef struct { static GSList *transfers; -int __bt_pbap_call_get_phonebook_size(DBusGProxy *proxy, bt_pbap_data_t *pbap_data); -int __bt_pbap_call_get_phonebook(DBusGProxy *proxy, bt_pbap_data_t *pbap_data); -int __bt_pbap_call_get_vcards_list(DBusGProxy *proxy, bt_pbap_data_t *pbap_data); -int __bt_pbap_call_get_vcard(DBusGProxy *proxy, bt_pbap_data_t *pbap_data); -int __bt_pbap_call_search_phonebook(DBusGProxy *proxy, bt_pbap_data_t *pbap_data); +int __bt_pbap_call_get_phonebook_size(GDBusProxy *proxy, bt_pbap_data_t *pbap_data); +int __bt_pbap_call_get_phonebook(GDBusProxy *proxy, bt_pbap_data_t *pbap_data); +int __bt_pbap_call_get_vcards_list(GDBusProxy *proxy, bt_pbap_data_t *pbap_data); +int __bt_pbap_call_get_vcard(GDBusProxy *proxy, bt_pbap_data_t *pbap_data); +int __bt_pbap_call_search_phonebook(GDBusProxy *proxy, bt_pbap_data_t *pbap_data); static void __bt_pbap_free_data(bt_pbap_data_t *pbap_data) { @@ -198,10 +189,11 @@ void _bt_pbap_obex_transfer_completed(const char *transfer_path, gboolean transf bt_pbap_transfer_info_t *transfer_info; int result = 0; int success = transfer_status; + GVariant *signal = NULL; BT_DBG("Transfer [%s] Success [%d] \n", transfer_path, success); result = (success == TRUE) ? BLUETOOTH_ERROR_NONE - : BLUETOOTH_ERROR_CANCEL; + : BLUETOOTH_ERROR_INTERNAL; transfer_info = __bt_find_transfer_by_path(transfer_path); ret_if(transfer_info == NULL); @@ -210,25 +202,20 @@ void _bt_pbap_obex_transfer_completed(const char *transfer_path, gboolean transf transfer_info->remote_device, transfer_info->filename, transfer_info->operation); - switch(transfer_info->operation) { + signal = g_variant_new("(issi)", result, + transfer_info->remote_device, + transfer_info->filename, success); + switch (transfer_info->operation) { case PULL_ALL: { _bt_send_event(BT_PBAP_CLIENT_EVENT, BLUETOOTH_PBAP_PHONEBOOK_PULL, - DBUS_TYPE_INT32, &result, - DBUS_TYPE_STRING, &transfer_info->remote_device, - DBUS_TYPE_STRING, &transfer_info->filename, - DBUS_TYPE_INT32, &success, - DBUS_TYPE_INVALID); + signal); break; } case GET_VCARD: { _bt_send_event(BT_PBAP_CLIENT_EVENT, BLUETOOTH_PBAP_VCARD_PULL, - DBUS_TYPE_INT32, &result, - DBUS_TYPE_STRING, &transfer_info->remote_device, - DBUS_TYPE_STRING, &transfer_info->filename, - DBUS_TYPE_INT32, &success, - DBUS_TYPE_INVALID); + signal); break; } default: @@ -236,52 +223,113 @@ void _bt_pbap_obex_transfer_completed(const char *transfer_path, gboolean transf break; } + transfers = g_slist_remove(transfers, transfer_info); __bt_free_transfer_info(transfer_info); } -void __bt_pbap_connect_cb(DBusGProxy *proxy, - DBusGProxyCall *call, void *user_data) +void _bt_obex_pbap_client_disconnect(char *path) +{ + if (g_strcmp0(g_pbap_session_path, path) == 0) { + int result = BLUETOOTH_ERROR_NONE; + GVariant *signal = g_variant_new("(is)", result, + g_pbap_server_address); + + _bt_send_event(BT_PBAP_CLIENT_EVENT, + BLUETOOTH_PBAP_DISCONNECTED, + signal); + + g_free(g_pbap_session_path); + g_pbap_session_path = NULL; + + g_free(g_pbap_server_address); + g_pbap_server_address = NULL; + + g_object_unref(g_pbap_proxy); + g_pbap_proxy = NULL; + + selected_path.folder = -1; + selected_path.type = -1; + } + BT_DBG("-"); +} + +static int __bt_pbap_get_error(const char *error_message) +{ + if (error_message == NULL) { + BT_ERR("Error message NULL"); + return BLUETOOTH_ERROR_INTERNAL; + } + + BT_ERR("Error message = %s", error_message); + if (g_strcmp0(error_message, "Unable to find service record") == 0) + return BLUETOOTH_ERROR_SERVICE_NOT_FOUND; + else if (g_strcmp0(error_message, "Transport got disconnected") == 0) + return BLUETOOTH_ERROR_AUTHORIZATION_REJECTED; + else if (g_str_has_prefix(error_message, "Connection refused") == 0) + return BLUETOOTH_ERROR_AUTHENTICATION_REJECTED; + else if (g_strcmp0(error_message, "Timed out waiting for response") == 0) + return BLUETOOTH_ERROR_TIMEOUT; + else + return BLUETOOTH_ERROR_INTERNAL; +} + +void __bt_pbap_connect_cb(GDBusProxy *proxy, + GAsyncResult *res, gpointer user_data) { char *session_path = NULL; char *address_string = user_data; - GError *g_error = NULL; - int connected = -1; - int result = BLUETOOTH_ERROR_CANCEL; + GError *error = NULL; + GVariant *value; + GVariant *signal = NULL; + int result = BLUETOOTH_ERROR_INTERNAL; + value = g_dbus_proxy_call_finish(proxy, res, &error); BT_DBG("Address = %s", address_string); - if (!dbus_g_proxy_end_call(proxy, call, &g_error, - DBUS_TYPE_G_OBJECT_PATH, &session_path, - G_TYPE_INVALID)) { - BT_ERR("Error Code[%d]: Message %s \n", g_error->code, g_error->message); - g_error_free(g_error); + + if (value == NULL) { + BT_ERR("g_dbus_proxy_call_finish failed"); + if (error) { + g_dbus_error_strip_remote_error(error); + result = __bt_pbap_get_error(error->message); + BT_ERR("Failed to coonect with error[0x%x][%s]", + result, error->message); + g_error_free(error); + } + g_object_unref(g_pbap_proxy); + g_pbap_proxy = NULL; } else { + g_variant_get(value, "(&o)", &session_path); + g_pbap_session_path = g_strdup(session_path); BT_DBG("Session Path = %s\n", g_pbap_session_path); result = BLUETOOTH_ERROR_NONE; - connected = 1; + g_pbap_server_address = g_strdup(address_string); + + g_variant_unref(value); } + signal = g_variant_new("(is)", result, address_string); + _bt_send_event(BT_PBAP_CLIENT_EVENT, BLUETOOTH_PBAP_CONNECTED, - DBUS_TYPE_INT32, &result, - DBUS_TYPE_STRING, &address_string, - DBUS_TYPE_INT32, &connected, - DBUS_TYPE_INVALID); + signal); g_free(address_string); - g_free(session_path); BT_DBG("-"); + + g_is_pbap_connecting = FALSE; } int _bt_pbap_connect(const bluetooth_device_address_t *address) { BT_DBG("+"); - GHashTable *hash; - GValue *tgt_value; + GDBusConnection *g_conn; GError *error = NULL; char address_string[18] = { 0, }; char *ptr = NULL; + GVariantBuilder builder; + GVariant *args; BT_CHECK_PARAMETER(address, return); @@ -289,6 +337,9 @@ int _bt_pbap_connect(const bluetooth_device_address_t *address) if (g_pbap_session_path) return BLUETOOTH_ERROR_ALREADY_CONNECT; + if (g_is_pbap_connecting == TRUE) + return BLUETOOTH_ERROR_IN_PROGRESS; + BT_DBG("BD Address [%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X]", address->addr[0], address->addr[1], address->addr[2], address->addr[3], @@ -296,79 +347,90 @@ int _bt_pbap_connect(const bluetooth_device_address_t *address) _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr); BT_DBG("Address String: %s", address_string); - dbus_connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error); - if (error != NULL) { - BT_ERR("Couldn't connect to system bus[%s]\n", error->message); - g_error_free(error); - return EXIT_FAILURE; + g_conn = _bt_gdbus_get_session_gconn(); + if (g_conn == NULL) { + BT_ERR("Couldn't connect to session bus"); + return BLUETOOTH_ERROR_INTERNAL; } - BT_DBG("#2"); - g_pbap_proxy = dbus_g_proxy_new_for_name(dbus_connection, - PBAP_OBEX_CLIENT_SERVICE, - PBAP_OBEX_CLIENT_PATH, - PBAP_OBEX_CLIENT_INTERFACE); + g_pbap_proxy = g_dbus_proxy_new_sync(g_conn, + G_DBUS_PROXY_FLAGS_NONE, NULL, + PBAP_OBEX_CLIENT_SERVICE, PBAP_OBEX_CLIENT_PATH, + PBAP_OBEX_CLIENT_INTERFACE, NULL, &error); if (!g_pbap_proxy) { BT_ERR("Failed to get a proxy for D-Bus\n"); - return -1; + if (error) { + ERR("Unable to create proxy: %s", error->message); + g_clear_error(&error); + } + return BLUETOOTH_ERROR_INTERNAL; } - BT_DBG("#3"); - hash = g_hash_table_new_full(g_str_hash, g_str_equal, - NULL, (GDestroyNotify)g_free); - BT_DBG("#4"); - tgt_value = g_new0(GValue, 1); - g_value_init(tgt_value, G_TYPE_STRING); - g_value_set_string(tgt_value, "pbap"); - g_hash_table_insert(hash, "Target", tgt_value); - BT_DBG("#5"); + + /* Create Hash*/ + g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY); + g_variant_builder_add(&builder, "{sv}", "Target", + g_variant_new("s", "pbap")); + args = g_variant_builder_end(&builder); ptr = g_strdup(address_string); - if (!dbus_g_proxy_begin_call(g_pbap_proxy, "CreateSession", - (DBusGProxyCallNotify)__bt_pbap_connect_cb, - ptr, NULL, - G_TYPE_STRING, ptr, - dbus_g_type_get_map("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), - hash, G_TYPE_INVALID)) { - BT_ERR("Connect Dbus Call Error"); - g_free(ptr); - g_object_unref(g_pbap_proxy); - g_hash_table_destroy(hash); - return BLUETOOTH_ERROR_INTERNAL; - } - g_hash_table_destroy(hash); + GVariant *temp = g_variant_new("(s@a{sv})", ptr, args); + + g_is_pbap_connecting = TRUE; + g_dbus_proxy_call(g_pbap_proxy, "CreateSession", + temp, + G_DBUS_CALL_FLAGS_NONE, -1, NULL, + (GAsyncReadyCallback)__bt_pbap_connect_cb, ptr); BT_DBG("-"); - return 0; + return BLUETOOTH_ERROR_NONE; } -void __bt_pbap_disconnect_cb(DBusGProxy *proxy, - DBusGProxyCall *call, void *user_data) +void __bt_pbap_disconnect_cb(GDBusProxy *proxy, + GAsyncResult *res, gpointer user_data) { char *address_string = user_data; - GError *g_error = NULL; - int connected = -1; + GError *error = NULL; + GVariant *value; int result = BLUETOOTH_ERROR_INTERNAL ; BT_DBG("Address = %s", address_string); - if (!dbus_g_proxy_end_call(proxy, call, &g_error, G_TYPE_INVALID)) { - BT_ERR("Error Code[%d]: Message %s \n", g_error->code, g_error->message); - g_error_free(g_error); + + value = g_dbus_proxy_call_finish(proxy, res, &error); + BT_DBG("Address = %s", address_string); + + if (value == NULL) { + BT_ERR("g_dbus_proxy_call_finish failed"); + if (error) { + BT_ERR("errCode[%x], message[%s]\n", + error->code, error->message); + g_clear_error(&error); + } } else { + g_object_unref(g_pbap_proxy); + g_pbap_proxy = NULL; + g_free(g_pbap_session_path); g_pbap_session_path = NULL; + + g_free(g_pbap_server_address); + g_pbap_server_address = NULL; + result = BLUETOOTH_ERROR_NONE; selected_path.folder = -1; selected_path.type = -1; - connected = 0; + + g_variant_unref(value); } - g_object_unref(proxy); - _bt_send_event(BT_PBAP_CLIENT_EVENT, - BLUETOOTH_PBAP_CONNECTED, - DBUS_TYPE_INT32, &result, - DBUS_TYPE_STRING, &address_string, - DBUS_TYPE_INT32, &connected, - DBUS_TYPE_INVALID); + /* If the result is success, the event reciever will send the disconnect event */ + if (result != BLUETOOTH_ERROR_NONE) { + GVariant *signal = NULL; + + signal = g_variant_new("(is)", result, address_string); + _bt_send_event(BT_PBAP_CLIENT_EVENT, + BLUETOOTH_PBAP_DISCONNECTED, + signal); + } g_free(address_string); BT_DBG("-"); @@ -395,122 +457,144 @@ int _bt_pbap_disconnect(const bluetooth_device_address_t *address) BT_DBG("Session Path: %s", g_pbap_session_path); ptr = g_strdup(address_string); - if (!dbus_g_proxy_begin_call(g_pbap_proxy, "RemoveSession", - (DBusGProxyCallNotify)__bt_pbap_disconnect_cb, - ptr, NULL, - DBUS_TYPE_G_OBJECT_PATH, g_pbap_session_path, - G_TYPE_INVALID)) { - g_free(ptr); - BT_ERR("Disconnect Dbus Call Error"); - return BLUETOOTH_ERROR_INTERNAL; - } - return 0; + g_dbus_proxy_call(g_pbap_proxy, "RemoveSession", + g_variant_new("(o)", g_pbap_session_path), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, + (GAsyncReadyCallback)__bt_pbap_disconnect_cb, ptr); + + return BLUETOOTH_ERROR_NONE; } -void __bt_pbap_select_cb(DBusGProxy *proxy, - DBusGProxyCall *call, void *user_data) +void __bt_pbap_select_cb(GDBusProxy *proxy, + GAsyncResult *res, gpointer user_data) { BT_DBG("+"); - GError *g_error = NULL; + GError *error = NULL; + GVariant *value; bt_pbap_data_t *pbap_data = user_data; char *address_string = pbap_data->data; BT_DBG("Address = %s", address_string); - if (dbus_g_proxy_end_call(proxy, call, &g_error, G_TYPE_INVALID)) { - switch (pbap_data->operation) { - case GET_SIZE: { - __bt_pbap_call_get_phonebook_size(proxy, pbap_data); - break; - } - case PULL_ALL: { - __bt_pbap_call_get_phonebook(proxy, pbap_data); - break; - } - case GET_LIST: { - __bt_pbap_call_get_vcards_list(proxy, pbap_data); - break; - } - case GET_VCARD: { - __bt_pbap_call_get_vcard(proxy, pbap_data); - break; - } - case PB_SEARCH: { - __bt_pbap_call_search_phonebook(proxy, pbap_data); - break; - } - default: { - g_object_unref(proxy); - __bt_pbap_free_data(pbap_data); + + value = g_dbus_proxy_call_finish(proxy, res, &error); + if (value == NULL) { + BT_ERR("g_dbus_proxy_call_finish failed"); + if (error) { + BT_ERR("errCode[%x], message[%s]\n", + error->code, error->message); + g_clear_error(&error); } - } // End of Case - } else { + + selected_path.folder = -1; + selected_path.type = -1; + + g_object_unref(proxy); + __bt_pbap_free_data(pbap_data); + return; + } + + switch (pbap_data->operation) { + case GET_SIZE: { + __bt_pbap_call_get_phonebook_size(proxy, pbap_data); + break; + } + case PULL_ALL: { + __bt_pbap_call_get_phonebook(proxy, pbap_data); + break; + } + case GET_LIST: { + __bt_pbap_call_get_vcards_list(proxy, pbap_data); + break; + } + case GET_VCARD: { + __bt_pbap_call_get_vcard(proxy, pbap_data); + break; + } + case PB_SEARCH: { + __bt_pbap_call_search_phonebook(proxy, pbap_data); + break; + } + default: { + selected_path.folder = -1; + selected_path.type = -1; g_object_unref(proxy); __bt_pbap_free_data(pbap_data); } + } // End of Case + g_variant_unref(value); BT_DBG("-"); } -void __bt_pbap_get_phonebook_size_cb(DBusGProxy *proxy, - DBusGProxyCall *call, void *user_data) +void __bt_pbap_get_phonebook_size_cb(GDBusProxy *proxy, + GAsyncResult *res, gpointer user_data) { BT_DBG("+"); - GError *g_error = NULL; + GError *error = NULL; int result = BLUETOOTH_ERROR_INTERNAL; bt_pbap_data_t *pbap_data = user_data; char *address_string = pbap_data->data; - unsigned int size = 0; + unsigned short int size = 0; + GVariant *value; + GVariant *signal = NULL; BT_DBG("Address = %s", address_string); - if (!dbus_g_proxy_end_call(proxy, call, &g_error, - G_TYPE_UINT, &size, - G_TYPE_INVALID)) { - BT_ERR("Error Code[%d]: Message %s \n", g_error->code, g_error->message); - g_error_free(g_error); + value = g_dbus_proxy_call_finish(proxy, res, &error); + + if (value == NULL) { + BT_ERR("g_dbus_proxy_call_finish failed"); + if (error) { + BT_ERR("errCode[%x], message[%s]\n", + error->code, error->message); + g_clear_error(&error); + } } else { - BT_ERR("Success"); + g_variant_get(value, "(q)", &size); result = BLUETOOTH_ERROR_NONE; } + BT_DBG("Size of Phonebook: %d", size); + + signal = g_variant_new("(isi)", result, address_string, size); _bt_send_event(BT_PBAP_CLIENT_EVENT, BLUETOOTH_PBAP_PHONEBOOK_SIZE, - DBUS_TYPE_INT32, &result, - DBUS_TYPE_STRING, &address_string, - DBUS_TYPE_INT32, &size, - DBUS_TYPE_INVALID); + signal); + + g_variant_unref(value); g_object_unref(proxy); __bt_pbap_free_data(pbap_data); BT_DBG("-"); } -void __bt_pbap_get_phonebook_cb(DBusGProxy *proxy, - DBusGProxyCall *call, void *user_data) +void __bt_pbap_get_phonebook_cb(GDBusProxy *proxy, + GAsyncResult *res, gpointer user_data) { BT_DBG("+"); - GError *g_error = NULL; + GError *error = NULL; bt_pbap_data_t *pbap_data = user_data; char *address_string = pbap_data->data; - GHashTable *properties; - GValue *value = { 0 }; bt_pbap_transfer_info_t *transfer_info; char *transfer = NULL; const gchar *filename = NULL; + GVariant *value; + GVariant *properties; BT_DBG("Address = %s", address_string); - if (!dbus_g_proxy_end_call(proxy, call, &g_error, - DBUS_TYPE_G_OBJECT_PATH, &transfer, - dbus_g_type_get_map("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), - &properties, - G_TYPE_INVALID)) { - BT_ERR("Error Code[%d]: Message %s \n", g_error->code, g_error->message); - g_error_free(g_error); - } else { - if (properties != NULL) { - value = g_hash_table_lookup(properties, "Filename"); - filename = value ? g_value_get_string(value) : NULL; + value = g_dbus_proxy_call_finish(proxy, res, &error); + if (value == NULL) { + BT_ERR("g_dbus_proxy_call_finish failed"); + if (error) { + BT_ERR("errCode[%x], message[%s]\n", + error->code, error->message); + g_clear_error(&error); } + } else { + g_variant_get(value, "(o@a{sv})", &transfer, &properties); + + if (g_variant_lookup(properties, "Filename", "s", &filename) == FALSE) + filename = NULL; BT_DBG("Transfer Path: %s", transfer); BT_DBG("File Name: %s", filename); @@ -520,6 +604,8 @@ void __bt_pbap_get_phonebook_cb(DBusGProxy *proxy, transfer_info->filename = (char *)filename; transfer_info->operation = PULL_ALL; transfers = g_slist_append(transfers, transfer_info); + + g_variant_unref(value); } g_object_unref(proxy); @@ -527,90 +613,107 @@ void __bt_pbap_get_phonebook_cb(DBusGProxy *proxy, BT_DBG("-"); } -void __bt_pbap_get_vcard_list_cb(DBusGProxy *proxy, - DBusGProxyCall *call, void *user_data) +void __bt_pbap_get_vcard_list_cb(GDBusProxy *proxy, + GAsyncResult *res, gpointer user_data) { BT_DBG("+"); - GError *g_error = NULL; + GError *error = NULL; int i; int result = BLUETOOTH_ERROR_INTERNAL; - GPtrArray *vcardlist = NULL; bt_pbap_data_t *pbap_data = user_data; char *address_string = pbap_data->data; char **vcard_list = NULL; char list_entry[PBAP_VCARDLIST_MAXLENGTH] = { 0, }; int length = 0; - - BT_DBG("Address = %s", address_string); - if (!dbus_g_proxy_end_call(proxy, call, &g_error, - dbus_g_type_get_collection("GPtrArray", dbus_g_type_get_struct("GValueArray", - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID)), - &vcardlist, G_TYPE_INVALID)) { - BT_ERR("Error Code[%d]: Message %s \n", g_error->code, g_error->message); - g_error_free(g_error); - vcard_list = g_new0(char *, length + 1); + GVariant *value; + GVariant *signal = NULL; + + value = g_dbus_proxy_call_finish(proxy, res, &error); + if (value == NULL) { + BT_ERR("g_dbus_proxy_call_finish failed"); + if (error) { + BT_ERR("errCode[%x], message[%s]\n", + error->code, error->message); + g_clear_error(&error); + } } else { - BT_DBG("vcardlist len %d", vcardlist->len); - length = vcardlist->len; result = BLUETOOTH_ERROR_NONE; + gchar *elname, *elval; - vcard_list = g_new0(char *, length + 1); + GVariantIter iter; + GVariant *child = NULL; + GVariant *value1 = NULL; - GValue *v = g_new0(GValue, 1);//g_ptr_array_index(vcardlist, 0); - gchar *elname, *elval; - g_value_init(v, dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID)); - for (i = 0; i < length; i++) { - g_value_set_boxed(v, g_ptr_array_index(vcardlist, i)); - if (dbus_g_type_struct_get (v, 0, &elname, 1, &elval, G_MAXUINT)) { - memset(list_entry, 0, PBAP_VCARDLIST_MAXLENGTH); - g_snprintf (list_entry, PBAP_VCARDLIST_MAXLENGTH - 1, - "", elname, elval); - //If possible send as Array of - BT_DBG("%s", list_entry); - vcard_list[i] = g_strdup(list_entry); - } + g_variant_get(value, "(@a(ss))", &value1); /* Format for value1 a(ss)*/ + gsize items = g_variant_iter_init(&iter, value1); + vcard_list = g_new0(char *, items + 1); + + for (i = 0; (child = g_variant_iter_next_value(&iter)) != NULL; i++) { + g_variant_get(child, "(&s&s)", &elname, &elval); + + memset(list_entry, 0, PBAP_VCARDLIST_MAXLENGTH); +#if 0 + g_snprintf(list_entry, PBAP_VCARDLIST_MAXLENGTH - 1, + "", elname, elval); +#else + g_snprintf(list_entry, PBAP_VCARDLIST_MAXLENGTH - 1, + "%s", elval); +#endif + //If possible send as Array of + BT_DBG("%s", list_entry); + vcard_list[i] = g_strdup(list_entry); + g_variant_unref(child); } + + length = i; + g_variant_unref(value1); + g_variant_unref(value); } + BT_DBG("Address = %s", address_string); + GVariant *temp = g_variant_new_strv((const gchar * const *)vcard_list, length); + signal = g_variant_new("(isv)", result, address_string, temp); + _bt_send_event(BT_PBAP_CLIENT_EVENT, - BLUETOOTH_PBAP_VCARD_LIST, - DBUS_TYPE_INT32, &result, - DBUS_TYPE_STRING, &address_string, - DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, - &vcard_list, length, - DBUS_TYPE_INVALID); + BLUETOOTH_PBAP_VCARD_LIST, + signal); + + for (i = 0; i < length; i++) + g_free(vcard_list[i]); + g_free(vcard_list); g_object_unref(proxy); __bt_pbap_free_data(pbap_data); BT_DBG("-"); } -void __bt_pbap_get_vcard_cb(DBusGProxy *proxy, - DBusGProxyCall *call, void *user_data) +void __bt_pbap_get_vcard_cb(GDBusProxy *proxy, + GAsyncResult *res, gpointer user_data) { BT_DBG("+"); - GError *g_error = NULL; + GError *error = NULL; bt_pbap_data_t *pbap_data = user_data; char *address_string = pbap_data->data; - GHashTable *properties; - GValue *value = { 0 }; bt_pbap_transfer_info_t *transfer_info; char *transfer = NULL; const gchar *filename = NULL; + GVariant *value; + GVariant *properties; BT_DBG("Address = %s", address_string); - if (!dbus_g_proxy_end_call(proxy, call, &g_error, - DBUS_TYPE_G_OBJECT_PATH, &transfer, - dbus_g_type_get_map("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), - &properties, - G_TYPE_INVALID)) { - BT_ERR("Error Code[%d]: Message %s \n", g_error->code, g_error->message); - g_error_free(g_error); - } else { - if (properties != NULL) { - value = g_hash_table_lookup(properties, "Filename"); - filename = value ? g_value_get_string(value) : NULL; + value = g_dbus_proxy_call_finish(proxy, res, &error); + if (value == NULL) { + BT_ERR("g_dbus_proxy_call_finish failed"); + if (error) { + BT_ERR("errCode[%x], message[%s]\n", + error->code, error->message); + g_clear_error(&error); } + } else { + g_variant_get(value, "(o@a{sv})", &transfer, &properties); + + if (g_variant_lookup(properties, "Filename", "s", &filename) == FALSE) + filename = NULL; BT_DBG("Transfer Path: %s", transfer); BT_DBG("File Name: %s", filename); @@ -620,6 +723,9 @@ void __bt_pbap_get_vcard_cb(DBusGProxy *proxy, transfer_info->filename = (char *)filename; transfer_info->operation = GET_VCARD; transfers = g_slist_append(transfers, transfer_info); + + g_variant_unref(properties); + g_variant_unref(value); } g_object_unref(proxy); @@ -627,227 +733,294 @@ void __bt_pbap_get_vcard_cb(DBusGProxy *proxy, BT_DBG("-"); } -void __bt_pbap_search_phonebook_cb(DBusGProxy *proxy, - DBusGProxyCall *call, void *user_data) +void __bt_pbap_search_phonebook_cb(GDBusProxy *proxy, + GAsyncResult *res, gpointer user_data) { BT_DBG("+"); - GError *g_error = NULL; + GError *error = NULL; int i; - GPtrArray *vcardlist = NULL; bt_pbap_data_t *pbap_data = user_data; char *address_string = pbap_data->data; char **vcard_list = NULL; char list_entry[PBAP_VCARDLIST_MAXLENGTH] = { 0, }; int length = 0; int result = BLUETOOTH_ERROR_INTERNAL; - - BT_DBG("Address = %s", address_string); - if (!dbus_g_proxy_end_call(proxy, call, &g_error, - dbus_g_type_get_collection("GPtrArray", dbus_g_type_get_struct("GValueArray", - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID)), - &vcardlist, G_TYPE_INVALID)) { - BT_ERR("Error Code[%d]: Message %s \n", g_error->code, g_error->message); - g_error_free(g_error); + GVariant *value; + GVariant *signal = NULL; + + value = g_dbus_proxy_call_finish(proxy, res, &error); + if (value == NULL) { + BT_ERR("g_dbus_proxy_call_finish failed"); + if (error) { + BT_ERR("errCode[%x], message[%s]\n", + error->code, error->message); + g_clear_error(&error); + } } else { - BT_DBG("vcardlist len %d", vcardlist->len); - length = vcardlist->len; result = BLUETOOTH_ERROR_NONE; + gchar *elname, *elval; - vcard_list = g_new0(char *, length + 1); + GVariantIter iter; + GVariant *child = NULL; + GVariant *value1 = NULL; - GValue *v = g_new0(GValue, 1);//g_ptr_array_index(vcardlist, 0); - gchar *elname, *elval; - g_value_init(v, dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID)); - for (i = 0; i < length; i++) { - g_value_set_boxed(v, g_ptr_array_index(vcardlist, i)); - if (dbus_g_type_struct_get (v, 0, &elname, 1, &elval, G_MAXUINT)) { - memset(list_entry, 0, PBAP_VCARDLIST_MAXLENGTH); - g_snprintf (list_entry, PBAP_VCARDLIST_MAXLENGTH - 1, - "", elname, elval); - //If possible send as Array of - BT_DBG("%s", list_entry); - vcard_list[i] = g_strdup(list_entry); - } + g_variant_get(value, "(@a(ss))", &value1); + gsize items = g_variant_iter_init(&iter, value1); + vcard_list = g_new0(char *, items + 1); + + for (i = 0; (child = g_variant_iter_next_value(&iter)) != NULL; i++) { + g_variant_get(child, "(&s&s)", &elname, &elval); + + memset(list_entry, 0, PBAP_VCARDLIST_MAXLENGTH); + g_snprintf(list_entry, PBAP_VCARDLIST_MAXLENGTH - 1, + "", elname, elval); + //If possible send as Array of + BT_DBG("%s", list_entry); + vcard_list[i] = g_strdup(list_entry); + + g_variant_unref(child); } + length = i; + g_variant_unref(value1); + g_variant_unref(value); } + BT_DBG("Address = %s", address_string); + + signal = g_variant_new("(is@as)", result, address_string, + g_variant_new_strv((const gchar * const *)vcard_list, length)); + _bt_send_event(BT_PBAP_CLIENT_EVENT, BLUETOOTH_PBAP_PHONEBOOK_SEARCH, - DBUS_TYPE_INT32, &result, - DBUS_TYPE_STRING, &address_string, - DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, - &vcard_list, length, - DBUS_TYPE_INVALID); + signal); + + for (i = 0; i < length; i++) + g_free(vcard_list[i]); + + g_free(vcard_list); g_object_unref(proxy); __bt_pbap_free_data(pbap_data); BT_DBG("-"); } -int __bt_pbap_call_get_phonebook_size(DBusGProxy *proxy, bt_pbap_data_t *pbap_data) +int __bt_pbap_call_get_phonebook_size(GDBusProxy *proxy, bt_pbap_data_t *pbap_data) { BT_DBG("+"); - if (!dbus_g_proxy_begin_call(proxy, "GetSize", - (DBusGProxyCallNotify)__bt_pbap_get_phonebook_size_cb, - pbap_data, NULL, - G_TYPE_INVALID)) { - BT_ERR("GetSize Dbus Call Error"); - __bt_pbap_free_data(pbap_data); - return BLUETOOTH_ERROR_INTERNAL; - } - return BLUETOOTH_ERROR_NONE; + g_dbus_proxy_call(proxy, "GetSize", + NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, + (GAsyncReadyCallback)__bt_pbap_get_phonebook_size_cb, + pbap_data); + BT_DBG("-"); + return BLUETOOTH_ERROR_NONE; } -int __bt_pbap_call_get_phonebook(DBusGProxy *proxy, bt_pbap_data_t *pbap_data) +int __bt_pbap_call_get_phonebook(GDBusProxy *proxy, bt_pbap_data_t *pbap_data) { BT_DBG("+"); - GHashTable *filters; - GValue *max_count; - GValue *format; - GValue *order; - GValue *offset; + + int i; + int ret; char *format_str = NULL; + char *fields_str = NULL; char *order_str = NULL; - char *target_file = "/opt/usr/media/Downloads/pb.vcf"; + char *download_path = NULL; + char *target_file = NULL; bt_pbap_pull_parameters_t *app_param = pbap_data->app_param; + GVariantBuilder builder; + GVariantBuilder inner_builder; + GVariant *filters; - filters = g_hash_table_new_full(g_str_hash, g_str_equal, - NULL, (GDestroyNotify)g_free); - /* Add Format Filter only if other than vCard 2.1 (default)*/ - if (app_param->format > 0) { - format_str = g_strdup(FORMAT[app_param->format]); - format = g_new0(GValue, 1); - g_value_init(format, G_TYPE_STRING); - g_value_set_string(format, format_str); - g_hash_table_insert(filters, "Format", format); - g_free(format_str); - } + g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY); + g_variant_builder_init(&inner_builder, G_VARIANT_TYPE_ARRAY); + + /* Add MaxlistCount*/ + g_variant_builder_add(&builder, "{sv}", "MaxCount", + g_variant_new("u", app_param->maxlist)); /* Add Order Filter only if other than Indexed (default)*/ if (app_param->order > 0) { order_str = g_strdup(ORDER[app_param->order]); - order = g_new0(GValue, 1); - g_value_init(order, G_TYPE_STRING); - g_value_set_string(order, order_str); - g_hash_table_insert(filters, "Order", order); - g_free(order_str); + g_variant_builder_add(&builder, "{sv}", "Order", + g_variant_new("s", order_str)); } - max_count = g_new0(GValue, 1); - g_value_init(max_count, G_TYPE_UINT); - g_value_set_uint(max_count, app_param->maxlist); - g_hash_table_insert(filters, "MaxCount", max_count); - /* Add Offset Filter only if other than 0 (default)*/ if (app_param->offset > 0) { - offset = g_new0(GValue, 1); - g_value_init(offset, G_TYPE_UINT); - g_value_set_uint(offset, app_param->offset); - g_hash_table_insert(filters, "Offset", offset); + g_variant_builder_add(&builder, "{sv}", "Offset", + g_variant_new("u", app_param->offset)); + } + + /* Add Format Filter only if other than vCard 2.1 (default)*/ + if (app_param->format > 0) { + format_str = g_strdup(FORMAT[app_param->format]); + g_variant_builder_add(&builder, "{sv}", "Format", + g_variant_new("s", format_str)); + } + + /* Add Filter AttributeMask (64bit) */ + if (app_param->fields > 0) { + if (app_param->fields == PBAP_FIELD_ALL) { + BT_DBG("** CHECKED ALL **"); + fields_str = g_strdup("ALL"); + g_variant_builder_add(&inner_builder, "s", fields_str); + g_free(fields_str); + } else { + for (i = 0; i < PBAP_NUM_OF_FIELDS_ENTRY; i++) { + if (app_param->fields & (1ULL << i)) { + BT_DBG("** CHECKED[%d]", i); + fields_str = g_strdup(FIELDS[i]); + g_variant_builder_add(&inner_builder, "s", fields_str); + g_free(fields_str); + } + } + } + + g_variant_builder_add(&builder, "{sv}", "Fields", + g_variant_new("as", &inner_builder)); } + filters = g_variant_builder_end(&builder); + //**************************** // Add code for Fields // //**************************** - if (!dbus_g_proxy_begin_call(proxy, "PullAll", - (DBusGProxyCallNotify)__bt_pbap_get_phonebook_cb, - pbap_data, NULL, - G_TYPE_STRING, target_file, - dbus_g_type_get_map("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), - filters, - G_TYPE_INVALID)) { - BT_ERR("GetSize Dbus Call Error"); - g_hash_table_destroy(filters); - return BLUETOOTH_ERROR_INTERNAL; + ret = storage_get_directory(STORAGE_TYPE_INTERNAL, + STORAGE_DIRECTORY_DOWNLOADS, &download_path); + + if (ret != STORAGE_ERROR_NONE) { + target_file = g_strdup_printf("%s/%s", PBAP_DEFAULT_DOWNLAOD_PATH, + PBAP_DEFAULT_FILE_NAME); + } else { + target_file = g_strdup_printf("%s/%s", download_path, + PBAP_DEFAULT_FILE_NAME); + + if (download_path) + free(download_path); } - g_hash_table_destroy(filters); - return BLUETOOTH_ERROR_NONE; + DBG_SECURE("Target flie: %s", target_file); + + g_dbus_proxy_call(proxy, "PullAll", + g_variant_new("(s@a{sv})", target_file, filters), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, + (GAsyncReadyCallback)__bt_pbap_get_phonebook_cb, + pbap_data); + + g_free(format_str); + g_free(order_str); + g_free(target_file); + BT_DBG("-"); + return BLUETOOTH_ERROR_NONE; } -int __bt_pbap_call_get_vcards_list(DBusGProxy *proxy, bt_pbap_data_t *pbap_data) +int __bt_pbap_call_get_vcards_list(GDBusProxy *proxy, bt_pbap_data_t *pbap_data) { BT_DBG("+"); - GHashTable *filters; - GValue *max_count; - GValue *order; - GValue *offset; char *order_str = NULL; + char *folder = NULL; + GVariantBuilder builder; + GVariant *filters; + bt_pbap_list_parameters_t *app_param = pbap_data->app_param; - filters = g_hash_table_new_full(g_str_hash, g_str_equal, - NULL, (GDestroyNotify)g_free); + g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY); + + /* Add MaxlistCount*/ + g_variant_builder_add(&builder, "{sv}", "MaxCount", + g_variant_new("u", app_param->maxlist)); /* Add Order Filter only if other than Indexed (default)*/ if (app_param->order > 0) { order_str = g_strdup(ORDER[app_param->order]); - order = g_new0(GValue, 1); - g_value_init(order, G_TYPE_STRING); - g_value_set_string(order, order_str); - g_hash_table_insert(filters, "Order", order); - g_free(order_str); + g_variant_builder_add(&builder, "{sv}", "Order", + g_variant_new("s", order_str)); } - max_count = g_new0(GValue, 1); - g_value_init(max_count, G_TYPE_UINT); - g_value_set_uint(max_count, app_param->maxlist); - g_hash_table_insert(filters, "MaxCount", max_count); - /* Add Offset Filter only if other than 0 (default)*/ if (app_param->offset > 0) { - offset = g_new0(GValue, 1); - g_value_init(offset, G_TYPE_UINT); - g_value_set_uint(offset, app_param->offset); - g_hash_table_insert(filters, "Offset", offset); + g_variant_builder_add(&builder, "{sv}", "Offset", + g_variant_new("u", app_param->offset)); } - if (!dbus_g_proxy_begin_call(proxy, "List", - (DBusGProxyCallNotify)__bt_pbap_get_vcard_list_cb, - pbap_data, NULL, - dbus_g_type_get_map("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), - filters, - G_TYPE_INVALID)) { - BT_ERR("List Dbus Call Error"); - g_hash_table_destroy(filters); - return BLUETOOTH_ERROR_INTERNAL; - } + filters = g_variant_builder_end(&builder); - g_hash_table_destroy(filters); + folder = g_strdup(TYPE[selected_path.type]); + BT_DBG("Folder: %s", folder); + + + g_dbus_proxy_call(proxy, "List", + g_variant_new("(s@a{sv})", folder, filters), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, + (GAsyncReadyCallback)__bt_pbap_get_vcard_list_cb, + pbap_data); + + g_free(folder); + g_free(order_str); + g_hash_table_unref((GHashTable *)filters); + /* In _bt_pbap_get_list(), path(type) is set to "nil", but current type is not null. + The path should be reset here */ + selected_path.type = -1; - return BLUETOOTH_ERROR_NONE; BT_DBG("-"); + return BLUETOOTH_ERROR_NONE; } -int __bt_pbap_call_get_vcard(DBusGProxy *proxy, bt_pbap_data_t *pbap_data) +int __bt_pbap_call_get_vcard(GDBusProxy *proxy, bt_pbap_data_t *pbap_data) { BT_DBG("+"); - GHashTable *filters; - GValue *format; + + int i; + int ret; char *format_str = NULL; - char *target_file = "/opt/usr/media/Downloads/pb.vcf"; + char *fields_str = NULL; + char *target_file = NULL; + char *download_path = NULL; char *vcard_handle = NULL; - char vcard[10] = { 0, }; - + char vcard[20] = { 0, }; + GVariantBuilder builder; + GVariantBuilder inner_builder; + GVariant *filters; bt_pbap_pull_vcard_parameters_t *app_param = pbap_data->app_param; - filters = g_hash_table_new_full(g_str_hash, g_str_equal, - NULL, (GDestroyNotify)g_free); + g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY); + g_variant_builder_init(&inner_builder, G_VARIANT_TYPE_ARRAY); /* Add Format Filter only if other than vCard 2.1 (default)*/ - if (app_param->format > 0) { +// if (app_param->format > 0) { format_str = g_strdup(FORMAT[app_param->format]); - format = g_new0(GValue, 1); - g_value_init(format, G_TYPE_STRING); - g_value_set_string(format, format_str); - g_hash_table_insert(filters, "Format", format); - g_free(format_str); + g_variant_builder_add(&builder, "{sv}", "Format", + g_variant_new("s", format_str)); +// } + + /* Add Filter AttributeMask (64bit) */ + if (app_param->fields > 0) { + if (app_param->fields == PBAP_FIELD_ALL) { + BT_DBG("** CHECKED ALL **"); + fields_str = g_strdup("ALL"); + g_variant_builder_add(&inner_builder, "s", fields_str); + g_free(fields_str); + } else { + for (i = 0; i < PBAP_NUM_OF_FIELDS_ENTRY; i++) { + if (app_param->fields & (1ULL << i)) { + BT_DBG("** CHECKED[%d]", i); + fields_str = g_strdup(FIELDS[i]); + g_variant_builder_add(&inner_builder, "s", fields_str); + g_free(fields_str); + } + } + } + + g_variant_builder_add(&builder, "{sv}", "Fields", + g_variant_new("as", &inner_builder)); } + filters = g_variant_builder_end(&builder); //**************************** // Add code for Fields @@ -857,100 +1030,129 @@ int __bt_pbap_call_get_vcard(DBusGProxy *proxy, bt_pbap_data_t *pbap_data) sprintf(vcard, "%d.vcf", app_param->index); BT_DBG("Handle: %s", vcard); vcard_handle = g_strdup(vcard); + BT_DBG("vcard_handle: %s", vcard_handle); - if (!dbus_g_proxy_begin_call(proxy, "Pull", - (DBusGProxyCallNotify)__bt_pbap_get_vcard_cb, - pbap_data, NULL, - G_TYPE_STRING, vcard_handle, - G_TYPE_STRING, target_file, - dbus_g_type_get_map("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), - filters, - G_TYPE_INVALID)) { - BT_ERR("GetSize Dbus Call Error"); - g_hash_table_destroy(filters); - g_free(vcard_handle); - return BLUETOOTH_ERROR_INTERNAL; + ret = storage_get_directory(STORAGE_TYPE_INTERNAL, + STORAGE_DIRECTORY_DOWNLOADS, &download_path); + + if (ret != STORAGE_ERROR_NONE) { + target_file = g_strdup_printf("%s/%s", PBAP_DEFAULT_DOWNLAOD_PATH, + PBAP_DEFAULT_FILE_NAME); + } else { + if (vcard_handle) + target_file = g_strdup_printf("%s/%s", download_path, + vcard_handle); + else + target_file = g_strdup_printf("%s/%s", download_path, + PBAP_DEFAULT_FILE_NAME); + + if (download_path) + free(download_path); } - g_hash_table_destroy(filters); + DBG_SECURE("Target flie: %s", target_file); + + GVariant *temp = g_variant_new("(ss@a{sv})", vcard_handle, target_file, filters); + + g_dbus_proxy_call(proxy, "Pull", + temp, + G_DBUS_CALL_FLAGS_NONE, -1, NULL, + (GAsyncReadyCallback)__bt_pbap_get_vcard_cb, + pbap_data); + + g_free(format_str); g_free(vcard_handle); + g_free(target_file); - return BLUETOOTH_ERROR_NONE; BT_DBG("-"); - + return BLUETOOTH_ERROR_NONE; } -int __bt_pbap_call_search_phonebook(DBusGProxy *proxy, bt_pbap_data_t *pbap_data) +int __bt_pbap_call_search_phonebook(GDBusProxy *proxy, bt_pbap_data_t *pbap_data) { BT_DBG("+"); - GHashTable *filters; - GValue *max_count; - GValue *order; - GValue *offset; + char *order_str = NULL; char *field = NULL; char *value = NULL; bt_pbap_search_parameters_t *app_param = pbap_data->app_param; + GVariantBuilder builder; + GVariant *filters; + + g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY); - filters = g_hash_table_new_full(g_str_hash, g_str_equal, - NULL, (GDestroyNotify)g_free); + /* Add MaxlistCount*/ + g_variant_builder_add(&builder, "{sv}", "MaxCount", + g_variant_new("u", app_param->maxlist)); /* Add Order Filter only if other than Indexed (default)*/ if (app_param->order > 0) { order_str = g_strdup(ORDER[app_param->order]); - order = g_new0(GValue, 1); - g_value_init(order, G_TYPE_STRING); - g_value_set_string(order, order_str); - g_hash_table_insert(filters, "Order", order); - g_free(order_str); + g_variant_builder_add(&builder, "{sv}", "Order", + g_variant_new("s", order_str)); } - max_count = g_new0(GValue, 1); - g_value_init(max_count, G_TYPE_UINT); - g_value_set_uint(max_count, app_param->maxlist); - g_hash_table_insert(filters, "MaxCount", max_count); - /* Add Offset Filter only if other than 0 (default)*/ if (app_param->offset > 0) { - offset = g_new0(GValue, 1); - g_value_init(offset, G_TYPE_UINT); - g_value_set_uint(offset, app_param->offset); - g_hash_table_insert(filters, "Offset", offset); + g_variant_builder_add(&builder, "{sv}", "Offset", + g_variant_new("u", app_param->offset)); } + filters = g_variant_builder_end(&builder); + field = g_strdup(SEARCH_FIELD[app_param->search_attribute]); value = g_strdup(app_param->search_value); - if (!dbus_g_proxy_begin_call(proxy, "Search", - (DBusGProxyCallNotify)__bt_pbap_search_phonebook_cb, - pbap_data, NULL, - G_TYPE_STRING, field, - G_TYPE_STRING, value, - dbus_g_type_get_map("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), - filters, - G_TYPE_INVALID)) { - BT_ERR("List Dbus Call Error"); - g_hash_table_destroy(filters); - g_free(field); - g_free(value); - return BLUETOOTH_ERROR_INTERNAL; - } - g_hash_table_destroy(filters); - g_free(field); + g_dbus_proxy_call(proxy, "Search", + g_variant_new("(ss@a{sv})", field, value, filters), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, + (GAsyncReadyCallback)__bt_pbap_search_phonebook_cb, + pbap_data); + g_free(value); + g_free(order_str); + g_free(field); - return BLUETOOTH_ERROR_NONE; BT_DBG("-"); + return BLUETOOTH_ERROR_NONE; +} + +int _bt_pbap_is_connected(bluetooth_device_address_t *device_address, + gboolean *connected) +{ + char address_string[18] = { 0, }; + + BT_CHECK_PARAMETER(device_address, return); + BT_CHECK_PARAMETER(connected, return); + + /* In now, only 1 pbap connection is allowed */ + if (g_pbap_server_address == NULL) { + *connected = FALSE; + return 0; + } + + _bt_convert_addr_type_to_string(address_string, + (unsigned char *)device_address->addr); + BT_DBG("Address String: %s", address_string); + + if (g_strcmp0(address_string, g_pbap_server_address) == 0) + *connected = TRUE; + else + *connected = FALSE; + + return 0; } int _bt_pbap_get_phonebook_size(const bluetooth_device_address_t *address, int source, int type) { BT_DBG("+"); - DBusGProxy *g_pbap_session_proxy = NULL; + GDBusConnection *g_conn; + GDBusProxy *g_pbap_session_proxy = NULL; char address_string[18] = { 0, }; char *source_string = NULL; char *type_string = NULL; + GError *err = NULL; bt_pbap_data_t *pbap_data = NULL; BT_CHECK_PARAMETER(address, return); @@ -968,49 +1170,61 @@ int _bt_pbap_get_phonebook_size(const bluetooth_device_address_t *address, _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr); BT_DBG("Address String: %s", address_string); + source_string = g_strdup(SOURCE[source]); + type_string = g_strdup(TYPE[type]); + + BT_DBG("Address[%s] Source[%s] Type[%s]", + address_string, source_string, type_string); BT_DBG("Session Path = %s\n", g_pbap_session_path); - g_pbap_session_proxy = dbus_g_proxy_new_for_name(dbus_connection, - PBAP_SESSION_SERVICE, - g_pbap_session_path, - PBAP_SESSION_INTERFACE); + + g_conn = _bt_gdbus_get_session_gconn(); + if (g_conn == NULL) { + BT_ERR("Couldn't connect to session bus"); + g_free(source_string); + g_free(type_string); + return 0; + } + g_pbap_session_proxy = g_dbus_proxy_new_sync(g_conn, + G_DBUS_PROXY_FLAGS_NONE, NULL, + PBAP_SESSION_SERVICE, g_pbap_session_path, + PBAP_SESSION_INTERFACE, NULL, &err); + if (!g_pbap_session_proxy) { BT_ERR("Failed to get a proxy for D-Bus\n"); + if (err) { + ERR("Unable to create proxy: %s", err->message); + g_clear_error(&err); + } + g_free(source_string); + g_free(type_string); return -1; } + BT_DBG("Prepare PBAP data"); pbap_data = g_new0(bt_pbap_data_t, 1); pbap_data->operation = GET_SIZE; pbap_data->data = g_strdup(address_string); if (source == selected_path.folder && type == selected_path.type) { - return __bt_pbap_call_get_phonebook_size(g_pbap_session_proxy, pbap_data); - } - - source_string = g_strdup(SOURCE[source]); - type_string = g_strdup(TYPE[type]); - - BT_DBG("Address[%s] Source[%s] Type[%s]", - address_string, source_string, type_string); - - if (!dbus_g_proxy_begin_call(g_pbap_session_proxy, "Select", - (DBusGProxyCallNotify)__bt_pbap_select_cb, - pbap_data, NULL, - G_TYPE_STRING, source_string, - G_TYPE_STRING, type_string, - G_TYPE_INVALID)) { - BT_ERR("Select Dbus Call Error"); + BT_DBG("Call get_phonebook_size directly"); g_free(source_string); g_free(type_string); - g_object_unref(g_pbap_session_proxy); - return BLUETOOTH_ERROR_INTERNAL; + return __bt_pbap_call_get_phonebook_size(g_pbap_session_proxy, pbap_data); } + BT_DBG("Call SELECT"); + g_dbus_proxy_call(g_pbap_session_proxy, "Select", + g_variant_new("(ss)", source_string, type_string), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, + (GAsyncReadyCallback)__bt_pbap_select_cb, + pbap_data); + + BT_DBG("Set Folders"); selected_path.folder = source; selected_path.type = type; g_free(source_string); g_free(type_string); - return 0; } @@ -1018,10 +1232,12 @@ int _bt_pbap_get_phonebook(const bluetooth_device_address_t *address, int source, int type, bt_pbap_pull_parameters_t *app_param) { BT_DBG("+"); - DBusGProxy *g_pbap_session_proxy = NULL; + GDBusConnection *g_conn; + GDBusProxy *g_pbap_session_proxy = NULL; char address_string[18] = { 0, }; char *source_string = NULL; char *type_string = NULL; + GError *err = NULL; bt_pbap_data_t *pbap_data = NULL; bt_pbap_pull_parameters_t *param = NULL; @@ -1042,13 +1258,34 @@ int _bt_pbap_get_phonebook(const bluetooth_device_address_t *address, _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr); BT_DBG("Address String: %s", address_string); + source_string = g_strdup(SOURCE[source]); + type_string = g_strdup(TYPE[type]); + + BT_DBG("Address[%s] Source[%s] Type[%s]", + address_string, source_string, type_string); + BT_DBG("Session Path = %s\n", g_pbap_session_path); - g_pbap_session_proxy = dbus_g_proxy_new_for_name(dbus_connection, - PBAP_SESSION_SERVICE, - g_pbap_session_path, - PBAP_SESSION_INTERFACE); + + g_conn = _bt_gdbus_get_session_gconn(); + if (g_conn == NULL) { + BT_ERR("Couldn't connect to session bus"); + g_free(source_string); + g_free(type_string); + return 0; + } + g_pbap_session_proxy = g_dbus_proxy_new_sync(g_conn, + G_DBUS_PROXY_FLAGS_NONE, NULL, + PBAP_SESSION_SERVICE, g_pbap_session_path, + PBAP_SESSION_INTERFACE, NULL, &err); + if (!g_pbap_session_proxy) { BT_ERR("Failed to get a proxy for D-Bus\n"); + if (err) { + ERR("Unable to create proxy: %s", err->message); + g_clear_error(&err); + } + g_free(source_string); + g_free(type_string); return -1; } @@ -1060,31 +1297,19 @@ int _bt_pbap_get_phonebook(const bluetooth_device_address_t *address, pbap_data->app_param = param; if (source == selected_path.folder && type == selected_path.type) { - return __bt_pbap_call_get_phonebook(g_pbap_session_proxy, pbap_data); - } - - source_string = g_strdup(SOURCE[source]); - type_string = g_strdup(TYPE[type]); - - BT_DBG("Address[%s] Source[%s] Type[%s]", - address_string, source_string, type_string); - - if (!dbus_g_proxy_begin_call(g_pbap_session_proxy, "Select", - (DBusGProxyCallNotify)__bt_pbap_select_cb, - pbap_data, NULL, - G_TYPE_STRING, source_string, - G_TYPE_STRING, type_string, - G_TYPE_INVALID)) { - BT_ERR("Select Dbus Call Error"); g_free(source_string); g_free(type_string); - g_object_unref(g_pbap_session_proxy); - return BLUETOOTH_ERROR_INTERNAL; + return __bt_pbap_call_get_phonebook(g_pbap_session_proxy, pbap_data); } + g_dbus_proxy_call(g_pbap_session_proxy, "Select", + g_variant_new("(ss)", source_string, type_string), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, + (GAsyncReadyCallback)__bt_pbap_select_cb, + pbap_data); + selected_path.folder = source; selected_path.type = type; - g_free(source_string); g_free(type_string); @@ -1095,10 +1320,12 @@ int _bt_pbap_get_list(const bluetooth_device_address_t *address, int source, int type, bt_pbap_list_parameters_t *app_param) { BT_DBG("+"); - DBusGProxy *g_pbap_session_proxy = NULL; + GDBusConnection *g_conn; + GDBusProxy *g_pbap_session_proxy = NULL; char address_string[18] = { 0, }; char *source_string = NULL; char *type_string = NULL; + GError *err = NULL; bt_pbap_data_t *pbap_data = NULL; bt_pbap_list_parameters_t *param = NULL; @@ -1119,16 +1346,38 @@ int _bt_pbap_get_list(const bluetooth_device_address_t *address, int source, _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr); BT_DBG("Address String: %s", address_string); + source_string = g_strdup(SOURCE[source]); + type_string = g_strdup("nil"); + + BT_DBG("Address[%s] Source[%s] Type[%s]", + address_string, source_string, type_string); + BT_DBG("Session Path = %s\n", g_pbap_session_path); - g_pbap_session_proxy = dbus_g_proxy_new_for_name(dbus_connection, - PBAP_SESSION_SERVICE, - g_pbap_session_path, - PBAP_SESSION_INTERFACE); + + g_conn = _bt_gdbus_get_session_gconn(); + if (g_conn == NULL) { + BT_ERR("Couldn't connect to session bus"); + g_free(source_string); + g_free(type_string); + return 0; + } + g_pbap_session_proxy = g_dbus_proxy_new_sync(g_conn, + G_DBUS_PROXY_FLAGS_NONE, NULL, + PBAP_SESSION_SERVICE, g_pbap_session_path, + PBAP_SESSION_INTERFACE, NULL, &err); + if (!g_pbap_session_proxy) { BT_ERR("Failed to get a proxy for D-Bus\n"); + if (err) { + ERR("Unable to create proxy: %s", err->message); + g_clear_error(&err); + } + g_free(source_string); + g_free(type_string); return -1; } + BT_DBG("Set PBAP Data"); pbap_data = g_new0(bt_pbap_data_t, 1); pbap_data->operation = GET_LIST; pbap_data->data = g_strdup(address_string); @@ -1136,32 +1385,20 @@ int _bt_pbap_get_list(const bluetooth_device_address_t *address, int source, memcpy(param, app_param, sizeof(bt_pbap_list_parameters_t)); pbap_data->app_param = param; + /* Always Call Select for vCardListing if (source == selected_path.folder && type == selected_path.type) { + BT_DBG("Call Directly"); return __bt_pbap_call_get_vcards_list(g_pbap_session_proxy, pbap_data); - } - - source_string = g_strdup(SOURCE[source]); - type_string = g_strdup(TYPE[type]); - - BT_DBG("Address[%s] Source[%s] Type[%s]", - address_string, source_string, type_string); - - if (!dbus_g_proxy_begin_call(g_pbap_session_proxy, "Select", - (DBusGProxyCallNotify)__bt_pbap_select_cb, - pbap_data, NULL, - G_TYPE_STRING, source_string, - G_TYPE_STRING, type_string, - G_TYPE_INVALID)) { - BT_ERR("Select Dbus Call Error"); - g_free(source_string); - g_free(type_string); - g_object_unref(g_pbap_session_proxy); - return BLUETOOTH_ERROR_INTERNAL; - } - + } */ + BT_DBG("Call SELECT"); + g_dbus_proxy_call(g_pbap_session_proxy, "Select", + g_variant_new("(ss)", source_string, type_string), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, + (GAsyncReadyCallback)__bt_pbap_select_cb, + pbap_data); + BT_DBG("Set Folders"); selected_path.folder = source; selected_path.type = type; - g_free(source_string); g_free(type_string); @@ -1173,12 +1410,14 @@ int _bt_pbap_pull_vcard(const bluetooth_device_address_t *address, int source, int type, bt_pbap_pull_vcard_parameters_t *app_param) { BT_DBG("+"); - DBusGProxy *g_pbap_session_proxy = NULL; + GDBusConnection *g_conn; + GDBusProxy *g_pbap_session_proxy = NULL; char address_string[18] = { 0, }; char *source_string = NULL; char *type_string = NULL; bt_pbap_data_t *pbap_data = NULL; bt_pbap_pull_vcard_parameters_t *param = NULL; + GError *err = NULL; BT_CHECK_PARAMETER(address, return); @@ -1196,13 +1435,34 @@ int _bt_pbap_pull_vcard(const bluetooth_device_address_t *address, _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr); BT_DBG("Address String: %s", address_string); + source_string = g_strdup(SOURCE[source]); + type_string = g_strdup(TYPE[type]); + + BT_DBG("Address[%s] Source[%s] Type[%s]", + address_string, source_string, type_string); + BT_DBG("Session Path = %s\n", g_pbap_session_path); - g_pbap_session_proxy = dbus_g_proxy_new_for_name(dbus_connection, - PBAP_SESSION_SERVICE, - g_pbap_session_path, - PBAP_SESSION_INTERFACE); + + g_conn = _bt_gdbus_get_session_gconn(); + if (g_conn == NULL) { + BT_ERR("Couldn't connect to session bus"); + g_free(source_string); + g_free(type_string); + return 0; + } + g_pbap_session_proxy = g_dbus_proxy_new_sync(g_conn, + G_DBUS_PROXY_FLAGS_NONE, NULL, + PBAP_SESSION_SERVICE, g_pbap_session_path, + PBAP_SESSION_INTERFACE, NULL, &err); + if (!g_pbap_session_proxy) { BT_ERR("Failed to get a proxy for D-Bus\n"); + if (err) { + ERR("Unable to create proxy: %s", err->message); + g_clear_error(&err); + } + g_free(source_string); + g_free(type_string); return -1; } @@ -1214,31 +1474,19 @@ int _bt_pbap_pull_vcard(const bluetooth_device_address_t *address, pbap_data->app_param = param; if (source == selected_path.folder && type == selected_path.type) { - return __bt_pbap_call_get_vcard(g_pbap_session_proxy, pbap_data); - } - - source_string = g_strdup(SOURCE[source]); - type_string = g_strdup(TYPE[type]); - - BT_DBG("Address[%s] Source[%s] Type[%s]", - address_string, source_string, type_string); - - if (!dbus_g_proxy_begin_call(g_pbap_session_proxy, "Select", - (DBusGProxyCallNotify)__bt_pbap_select_cb, - pbap_data, NULL, - G_TYPE_STRING, source_string, - G_TYPE_STRING, type_string, - G_TYPE_INVALID)) { - BT_ERR("Select Dbus Call Error"); g_free(source_string); g_free(type_string); - g_object_unref(g_pbap_session_proxy); - return BLUETOOTH_ERROR_INTERNAL; + return __bt_pbap_call_get_vcard(g_pbap_session_proxy, pbap_data); } + g_dbus_proxy_call(g_pbap_session_proxy, "Select", + g_variant_new("(ss)", source_string, type_string), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, + (GAsyncReadyCallback)__bt_pbap_select_cb, + pbap_data); + selected_path.folder = source; selected_path.type = type; - g_free(source_string); g_free(type_string); @@ -1249,12 +1497,14 @@ int _bt_pbap_phonebook_search(const bluetooth_device_address_t *address, int source, int type, bt_pbap_search_parameters_t *app_param) { BT_DBG("+"); - DBusGProxy *g_pbap_session_proxy = NULL; + GDBusConnection *g_conn; + GDBusProxy *g_pbap_session_proxy = NULL; char address_string[18] = { 0, }; char *source_string = NULL; char *type_string = NULL; bt_pbap_data_t *pbap_data = NULL; bt_pbap_search_parameters_t *param = NULL; + GError *err = NULL; BT_CHECK_PARAMETER(address, return); @@ -1272,13 +1522,34 @@ int _bt_pbap_phonebook_search(const bluetooth_device_address_t *address, _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr); BT_DBG("Address String: %s", address_string); + source_string = g_strdup(SOURCE[source]); + type_string = g_strdup(TYPE[type]); + + BT_DBG("Address[%s] Source[%s] Type[%s]", + address_string, source_string, type_string); + BT_DBG("Session Path = %s\n", g_pbap_session_path); - g_pbap_session_proxy = dbus_g_proxy_new_for_name(dbus_connection, - PBAP_SESSION_SERVICE, - g_pbap_session_path, - PBAP_SESSION_INTERFACE); + + g_conn = _bt_gdbus_get_session_gconn(); + if (g_conn == NULL) { + BT_ERR("Couldn't connect to session bus"); + g_free(source_string); + g_free(type_string); + return 0; + } + g_pbap_session_proxy = g_dbus_proxy_new_sync(g_conn, + G_DBUS_PROXY_FLAGS_NONE, NULL, + PBAP_SESSION_SERVICE, g_pbap_session_path, + PBAP_SESSION_INTERFACE, NULL, &err); + if (!g_pbap_session_proxy) { BT_ERR("Failed to get a proxy for D-Bus\n"); + if (err) { + ERR("Unable to create proxy: %s", err->message); + g_clear_error(&err); + } + g_free(source_string); + g_free(type_string); return -1; } @@ -1289,28 +1560,16 @@ int _bt_pbap_phonebook_search(const bluetooth_device_address_t *address, memcpy(param, app_param, sizeof(bt_pbap_search_parameters_t)); pbap_data->app_param = param; + /* Call Select for vCardListing if (source == selected_path.folder && type == selected_path.type) { return __bt_pbap_call_search_phonebook(g_pbap_session_proxy, pbap_data); - } - - source_string = g_strdup(SOURCE[source]); - type_string = g_strdup(TYPE[type]); + }*/ - BT_DBG("Address[%s] Source[%s] Type[%s]", - address_string, source_string, type_string); - - if (!dbus_g_proxy_begin_call(g_pbap_session_proxy, "Select", - (DBusGProxyCallNotify)__bt_pbap_select_cb, - pbap_data, NULL, - G_TYPE_STRING, source_string, - G_TYPE_STRING, type_string, - G_TYPE_INVALID)) { - BT_ERR("Select Dbus Call Error"); - g_object_unref(g_pbap_session_proxy); - g_free(source_string); - g_free(type_string); - return BLUETOOTH_ERROR_INTERNAL; - } + g_dbus_proxy_call(g_pbap_session_proxy, "Select", + g_variant_new("(ss)", source_string, type_string), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, + (GAsyncReadyCallback)__bt_pbap_select_cb, + pbap_data); selected_path.folder = source; selected_path.type = type;