/*
-
- * Bluetooth-frwk
- *
- * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact: Hocheol Seo <hocheol.seo@samsung.com>
- * Girishashok Joshi <girish.joshi@samsung.com>
- * Chanyeol Park <chanyeol.park@samsung.com>
+ * 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.
#include <stacktrim.h>
#include <syspopup_caller.h>
#include <vconf.h>
+#include <storage.h>
#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 <glib.h>
#include <gio/gio.h>
-#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
};
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;
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)
{
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);
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:
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);
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],
_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("-");
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);
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);
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;
-
- vcard_list = g_new0(char *, length + 1);
-
- 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,
- "<card handle = \"%s\" name = \"%s\"/>", elname, elval);
- //If possible send as Array of <STRING, STRING>
- BT_DBG("%s", list_entry);
- vcard_list[i] = g_strdup(list_entry);
- }
+
+ GVariantIter iter;
+ GVariant *child = NULL;
+ GVariant *value1 = NULL;
+
+ 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,
+ "<card handle = \"%s\" name = \"%s\"/>", elname, elval);
+#else
+ g_snprintf(list_entry, PBAP_VCARDLIST_MAXLENGTH - 1,
+ "%s", elval);
+#endif
+ //If possible send as Array of <STRING, STRING>
+ 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);
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);
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,
- "<card handle = \"%s\" name = \"%s\"/>", elname, elval);
- //If possible send as Array of <STRING, STRING>
- 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,
+ "<card handle = \"%s\" name = \"%s\"/>", elname, elval);
+ //If possible send as Array of <STRING, STRING>
+ 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
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;
- 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));
}
+ 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);
_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;
}
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;
_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;
}
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);
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;
_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);
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);
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);
_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;
}
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);
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);
_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;
}
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;