#include <string.h>
#include <malloc.h>
#include <stacktrim.h>
-#if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT)
#include <syspopup_caller.h>
-#endif
#include <vconf.h>
+#include <storage.h>
#include "bt-internal-types.h"
#include "bt-service-common.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_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",
static char *g_pbap_session_path = NULL;
static char *g_pbap_server_address = NULL;
-static GDBusConnection *dbus_connection = NULL;
static GDBusProxy *g_pbap_proxy = NULL;
+static gboolean g_is_pbap_connecting;
static struct {
int type;
signal = g_variant_new("(issi)", result,
transfer_info->remote_device,
transfer_info->filename, success);
- switch(transfer_info->operation) {
+ switch (transfer_info->operation) {
case PULL_ALL: {
_bt_send_event(BT_PBAP_CLIENT_EVENT,
BLUETOOTH_PBAP_PHONEBOOK_PULL,
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)
{
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);
+ 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;
BT_DBG("Session Path = %s\n", g_pbap_session_path);
result = BLUETOOTH_ERROR_NONE;
g_pbap_server_address = g_strdup(address_string);
+
+ g_variant_unref(value);
}
signal = g_variant_new("(is)", result, address_string);
g_free(address_string);
BT_DBG("-");
+
+ g_is_pbap_connecting = FALSE;
}
int _bt_pbap_connect(const bluetooth_device_address_t *address)
{
BT_DBG("+");
+ GDBusConnection *g_conn;
GError *error = NULL;
char address_string[18] = { 0, };
char *ptr = NULL;
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 = _bt_get_session_gconn();
- if (dbus_connection == NULL) {
- BT_ERR("Couldn't connect to system bus");
- 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;
}
-
- g_pbap_proxy = g_dbus_proxy_new_sync(dbus_connection,
+ 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);
ERR("Unable to create proxy: %s", error->message);
g_clear_error(&error);
}
- return -1;
+ return BLUETOOTH_ERROR_INTERNAL;
}
/* Create 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);
- g_free(ptr);
BT_DBG("-");
- return 0;
+ return BLUETOOTH_ERROR_NONE;
}
void __bt_pbap_disconnect_cb(GDBusProxy *proxy,
char *address_string = user_data;
GError *error = NULL;
GVariant *value;
- GVariant *signal = NULL;
int result = BLUETOOTH_ERROR_INTERNAL ;
BT_DBG("Address = %s", address_string);
result = BLUETOOTH_ERROR_NONE;
selected_path.folder = -1;
selected_path.type = -1;
+
+ g_variant_unref(value);
}
- signal = g_variant_new("(is)", result, address_string);
- _bt_send_event(BT_PBAP_CLIENT_EVENT,
- BLUETOOTH_PBAP_DISCONNECTED,
- signal);
+ /* 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("-");
G_DBUS_CALL_FLAGS_NONE, -1, NULL,
(GAsyncReadyCallback)__bt_pbap_disconnect_cb, ptr);
- return 0;
+ return BLUETOOTH_ERROR_NONE;
}
void __bt_pbap_select_cb(GDBusProxy *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);
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);
+ 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);
+ 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,
+#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);
}
BT_DBG("Address = %s", address_string);
- GVariant *temp = g_variant_new_strv((const gchar * const*)vcard_list, length);
+ 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,
} else {
g_variant_get(value, "(o@a{sv})", &transfer, &properties);
- if (g_variant_lookup (properties, "Filename", "s", &filename) == FALSE)
+ if (g_variant_lookup(properties, "Filename", "s", &filename) == FALSE)
filename = NULL;
BT_DBG("Transfer Path: %s", transfer);
GVariant *child = NULL;
GVariant *value1 = NULL;
- g_variant_get(value ,"(@a(ss))", &value1);
- gsize items = g_variant_iter_init (&iter, value1);
+ 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++) {
+ 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,
+ 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);
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));
+ g_variant_new_strv((const gchar * const *)vcard_list, length));
_bt_send_event(BT_PBAP_CLIENT_EVENT,
BLUETOOTH_PBAP_PHONEBOOK_SEARCH,
BT_DBG("+");
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;
- g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
- g_variant_builder_init (&inner_builder, G_VARIANT_TYPE_ARRAY);
+
+ 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));
+ 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]);
g_variant_builder_add(&builder, "{sv}", "Order",
- g_variant_new("s",order_str));
+ g_variant_new("s", order_str));
}
/* Add Offset Filter only if other than 0 (default)*/
if (app_param->offset > 0) {
g_variant_builder_add(&builder, "{sv}", "Offset",
- g_variant_new("u",app_param->offset));
+ g_variant_new("u", app_param->offset));
}
/* Add Format Filter only if other than vCard 2.1 (default)*/
//
//****************************
+ 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);
+ }
+
+ 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,
g_free(format_str);
g_free(order_str);
- g_hash_table_destroy(filters);
+ g_free(target_file);
BT_DBG("-");
return BLUETOOTH_ERROR_NONE;
bt_pbap_list_parameters_t *app_param = pbap_data->app_param;
- g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
+ 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));
+ 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]);
g_variant_builder_add(&builder, "{sv}", "Order",
- g_variant_new("s",order_str));
+ g_variant_new("s", order_str));
}
/* Add Offset Filter only if other than 0 (default)*/
if (app_param->offset > 0) {
g_variant_builder_add(&builder, "{sv}", "Offset",
- g_variant_new("u",app_param->offset));
+ g_variant_new("u", app_param->offset));
}
filters = g_variant_builder_end(&builder);
g_free(folder);
g_free(order_str);
- g_hash_table_unref(filters);
+ 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;
BT_DBG("+");
int i;
+ int ret;
char *format_str = NULL;
char *fields_str = NULL;
- char *target_file = "/opt/usr/media/Downloads/pb.vcf";
+ 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;
- g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
- g_variant_builder_init (&inner_builder, G_VARIANT_TYPE_ARRAY);
+ 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) {
BT_DBG("Handle: %s", vcard);
vcard_handle = g_strdup(vcard);
BT_DBG("vcard_handle: %s", vcard_handle);
+
+ 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);
+ }
+
+ 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",
g_free(format_str);
g_free(vcard_handle);
- g_hash_table_destroy(filters);
+ g_free(target_file);
BT_DBG("-");
return BLUETOOTH_ERROR_NONE;
GVariantBuilder builder;
GVariant *filters;
- g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
+ 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));
+ 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]);
g_variant_builder_add(&builder, "{sv}", "Order",
- g_variant_new("s",order_str));
+ g_variant_new("s", order_str));
}
/* Add Offset Filter only if other than 0 (default)*/
if (app_param->offset > 0) {
g_variant_builder_add(&builder, "{sv}", "Offset",
- g_variant_new("u",app_param->offset));
+ g_variant_new("u", app_param->offset));
}
filters = g_variant_builder_end(&builder);
g_free(value);
g_free(order_str);
g_free(field);
- g_hash_table_destroy(filters);
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("+");
+ GDBusConnection *g_conn;
GDBusProxy *g_pbap_session_proxy = NULL;
char address_string[18] = { 0, };
char *source_string = NULL;
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 = g_dbus_proxy_new_sync(dbus_connection,
+
+ 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);
int source, int type, bt_pbap_pull_parameters_t *app_param)
{
BT_DBG("+");
+ GDBusConnection *g_conn;
GDBusProxy *g_pbap_session_proxy = NULL;
char address_string[18] = { 0, };
char *source_string = NULL;
address_string, source_string, type_string);
BT_DBG("Session Path = %s\n", g_pbap_session_path);
- g_pbap_session_proxy = g_dbus_proxy_new_sync(dbus_connection,
+
+ 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);
pbap_data->app_param = param;
if (source == selected_path.folder && type == selected_path.type) {
+ g_free(source_string);
+ g_free(type_string);
return __bt_pbap_call_get_phonebook(g_pbap_session_proxy, pbap_data);
}
int type, bt_pbap_list_parameters_t *app_param)
{
BT_DBG("+");
+ GDBusConnection *g_conn;
GDBusProxy *g_pbap_session_proxy = NULL;
char address_string[18] = { 0, };
char *source_string = NULL;
address_string, source_string, type_string);
BT_DBG("Session Path = %s\n", g_pbap_session_path);
- g_pbap_session_proxy = g_dbus_proxy_new_sync(dbus_connection,
+
+ 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);
int source, int type, bt_pbap_pull_vcard_parameters_t *app_param)
{
BT_DBG("+");
+ GDBusConnection *g_conn;
GDBusProxy *g_pbap_session_proxy = NULL;
char address_string[18] = { 0, };
char *source_string = NULL;
address_string, source_string, type_string);
BT_DBG("Session Path = %s\n", g_pbap_session_path);
- g_pbap_session_proxy = g_dbus_proxy_new_sync(dbus_connection,
+
+ 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);
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) {
+ g_free(source_string);
+ g_free(type_string);
return __bt_pbap_call_get_vcard(g_pbap_session_proxy, pbap_data);
}
int source, int type, bt_pbap_search_parameters_t *app_param)
{
BT_DBG("+");
+ GDBusConnection *g_conn;
GDBusProxy *g_pbap_session_proxy = NULL;
char address_string[18] = { 0, };
char *source_string = NULL;
BT_DBG("Address String: %s", address_string);
source_string = g_strdup(SOURCE[source]);
- type_string = g_strdup("nil");
+ 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 = g_dbus_proxy_new_sync(dbus_connection,
+ 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);