2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
22 #include <stacktrim.h>
23 #include <syspopup_caller.h>
27 #include "bt-internal-types.h"
28 #include "bt-service-common.h"
29 #include "bt-service-event.h"
30 #include "bt-service-pbap.h"
34 #define PBAP_OBEX_CLIENT_SERVICE "org.bluez.obex"
35 #define PBAP_OBEX_CLIENT_PATH "/org/bluez/obex"
36 #define PBAP_OBEX_CLIENT_INTERFACE "org.bluez.obex.Client1"
38 #define PBAP_SESSION_SERVICE "org.bluez.obex"
39 #define PBAP_SESSION_INTERFACE "org.bluez.obex.PhonebookAccess1"
40 #define PBAP_VCARDLIST_MAXLENGTH 256
42 #define PBAP_NUM_OF_FIELDS_ENTRY 29
43 #define PBAP_FIELD_ALL (0xFFFFFFFFFFFFFFFFULL)
45 #define PBAP_DEFAULT_DOWNLAOD_PATH "/opt/usr/home/owner/media/Downloads"
46 #define PBAP_DEFAULT_FILE_NAME "pb.vcf"
77 "X-IRMC-CALL-DATETIME", /* 29 */
86 "pb", //Phonebook for the saved contacts
87 "ich", //Incoming call history
88 "och", //Outgoing call history
89 "mch", //Missed call history
90 "cch", //Combined Call History cch = ich + och + mch
94 "vcard21", // vCard Format 2.1 (Default)
95 "vcard30", // vCard Format 3.0
99 "indexed", // Index (default)
100 "alphanumeric", // Alphanumeric
101 "phonetic", // Phonetic
104 char *SEARCH_FIELD[] = {
105 "name", // Search by Name(default)
106 "number", // Search by Phone Number
107 "sound", // Search by phonetic sound
110 static char *g_pbap_session_path = NULL;
111 static char *g_pbap_server_address = NULL;
112 static GDBusProxy *g_pbap_proxy = NULL;
113 static gboolean g_is_pbap_connecting;
118 } selected_path = { -1, -1};
127 } bt_pbap_operation_e;
130 bt_pbap_operation_e operation;
139 bt_pbap_operation_e operation;
140 } bt_pbap_transfer_info_t;
142 static GSList *transfers;
144 int __bt_pbap_call_get_phonebook_size(GDBusProxy *proxy, bt_pbap_data_t *pbap_data);
145 int __bt_pbap_call_get_phonebook(GDBusProxy *proxy, bt_pbap_data_t *pbap_data);
146 int __bt_pbap_call_get_vcards_list(GDBusProxy *proxy, bt_pbap_data_t *pbap_data);
147 int __bt_pbap_call_get_vcard(GDBusProxy *proxy, bt_pbap_data_t *pbap_data);
148 int __bt_pbap_call_search_phonebook(GDBusProxy *proxy, bt_pbap_data_t *pbap_data);
150 static void __bt_pbap_free_data(bt_pbap_data_t *pbap_data)
152 g_free(pbap_data->app_param);
153 g_free(pbap_data->data);
157 static bt_pbap_transfer_info_t *__bt_find_transfer_by_path(const char *transfer_path)
160 bt_pbap_transfer_info_t *transfer;
162 retv_if(transfer_path == NULL, NULL);
164 for (l = transfers; l != NULL; l = l->next) {
167 if (transfer == NULL)
170 if (g_strcmp0(transfer->path, transfer_path) == 0)
177 static void __bt_free_transfer_info(bt_pbap_transfer_info_t *transfer_info)
179 ret_if(transfer_info == NULL);
181 g_free(transfer_info->path);
182 g_free(transfer_info->filename);
183 g_free(transfer_info->remote_device);
184 g_free(transfer_info);
187 void _bt_pbap_obex_transfer_completed(const char *transfer_path, gboolean transfer_status)
189 bt_pbap_transfer_info_t *transfer_info;
191 int success = transfer_status;
192 GVariant *signal = NULL;
193 BT_DBG("Transfer [%s] Success [%d] \n", transfer_path, success);
195 result = (success == TRUE) ? BLUETOOTH_ERROR_NONE
196 : BLUETOOTH_ERROR_INTERNAL;
198 transfer_info = __bt_find_transfer_by_path(transfer_path);
199 ret_if(transfer_info == NULL);
201 BT_DBG("Remote Device [%s] FileName: [%s] Operation[%d]",
202 transfer_info->remote_device, transfer_info->filename,
203 transfer_info->operation);
205 signal = g_variant_new("(issi)", result,
206 transfer_info->remote_device,
207 transfer_info->filename, success);
208 switch (transfer_info->operation) {
210 _bt_send_event(BT_PBAP_CLIENT_EVENT,
211 BLUETOOTH_PBAP_PHONEBOOK_PULL,
216 _bt_send_event(BT_PBAP_CLIENT_EVENT,
217 BLUETOOTH_PBAP_VCARD_PULL,
222 BT_INFO("Case not handled");
227 transfers = g_slist_remove(transfers, transfer_info);
228 __bt_free_transfer_info(transfer_info);
231 void _bt_obex_pbap_client_disconnect(char *path)
233 if (g_strcmp0(g_pbap_session_path, path) == 0) {
234 int result = BLUETOOTH_ERROR_NONE;
235 GVariant *signal = g_variant_new("(is)", result,
236 g_pbap_server_address);
238 _bt_send_event(BT_PBAP_CLIENT_EVENT,
239 BLUETOOTH_PBAP_DISCONNECTED,
242 g_free(g_pbap_session_path);
243 g_pbap_session_path = NULL;
245 g_free(g_pbap_server_address);
246 g_pbap_server_address = NULL;
248 g_object_unref(g_pbap_proxy);
251 selected_path.folder = -1;
252 selected_path.type = -1;
257 static int __bt_pbap_get_error(const char *error_message)
259 if (error_message == NULL) {
260 BT_ERR("Error message NULL");
261 return BLUETOOTH_ERROR_INTERNAL;
264 BT_ERR("Error message = %s", error_message);
265 if (g_strcmp0(error_message, "Unable to find service record") == 0)
266 return BLUETOOTH_ERROR_SERVICE_NOT_FOUND;
267 else if (g_strcmp0(error_message, "Transport got disconnected") == 0)
268 return BLUETOOTH_ERROR_AUTHORIZATION_REJECTED;
269 else if (g_str_has_prefix(error_message, "Connection refused") == 0)
270 return BLUETOOTH_ERROR_AUTHENTICATION_REJECTED;
271 else if (g_strcmp0(error_message, "Timed out waiting for response") == 0)
272 return BLUETOOTH_ERROR_TIMEOUT;
274 return BLUETOOTH_ERROR_INTERNAL;
277 void __bt_pbap_connect_cb(GDBusProxy *proxy,
278 GAsyncResult *res, gpointer user_data)
280 char *session_path = NULL;
281 char *address_string = user_data;
282 GError *error = NULL;
284 GVariant *signal = NULL;
285 int result = BLUETOOTH_ERROR_INTERNAL;
287 value = g_dbus_proxy_call_finish(proxy, res, &error);
288 BT_DBG("Address = %s", address_string);
291 BT_ERR("g_dbus_proxy_call_finish failed");
293 g_dbus_error_strip_remote_error(error);
294 result = __bt_pbap_get_error(error->message);
295 BT_ERR("Failed to coonect with error[0x%x][%s]",
296 result, error->message);
299 g_object_unref(g_pbap_proxy);
302 g_variant_get(value, "(&o)", &session_path);
304 g_pbap_session_path = g_strdup(session_path);
305 BT_DBG("Session Path = %s\n", g_pbap_session_path);
306 result = BLUETOOTH_ERROR_NONE;
307 g_pbap_server_address = g_strdup(address_string);
309 g_variant_unref(value);
312 signal = g_variant_new("(is)", result, address_string);
314 _bt_send_event(BT_PBAP_CLIENT_EVENT,
315 BLUETOOTH_PBAP_CONNECTED,
318 g_free(address_string);
321 g_is_pbap_connecting = FALSE;
324 int _bt_pbap_connect(const bluetooth_device_address_t *address)
327 GDBusConnection *g_conn;
328 GError *error = NULL;
329 char address_string[18] = { 0, };
331 GVariantBuilder builder;
334 BT_CHECK_PARAMETER(address, return);
336 /* check if already connected */
337 if (g_pbap_session_path)
338 return BLUETOOTH_ERROR_ALREADY_CONNECT;
340 if (g_is_pbap_connecting == TRUE)
341 return BLUETOOTH_ERROR_IN_PROGRESS;
343 BT_DBG("BD Address [%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X]",
344 address->addr[0], address->addr[1],
345 address->addr[2], address->addr[3],
346 address->addr[4], address->addr[5]);
348 _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr);
349 BT_DBG("Address String: %s", address_string);
350 g_conn = _bt_gdbus_get_session_gconn();
351 if (g_conn == NULL) {
352 BT_ERR("Couldn't connect to session bus");
353 return BLUETOOTH_ERROR_INTERNAL;
355 g_pbap_proxy = g_dbus_proxy_new_sync(g_conn,
356 G_DBUS_PROXY_FLAGS_NONE, NULL,
357 PBAP_OBEX_CLIENT_SERVICE, PBAP_OBEX_CLIENT_PATH,
358 PBAP_OBEX_CLIENT_INTERFACE, NULL, &error);
360 BT_ERR("Failed to get a proxy for D-Bus\n");
362 ERR("Unable to create proxy: %s", error->message);
363 g_clear_error(&error);
365 return BLUETOOTH_ERROR_INTERNAL;
369 g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
370 g_variant_builder_add(&builder, "{sv}", "Target",
371 g_variant_new("s", "pbap"));
372 args = g_variant_builder_end(&builder);
374 ptr = g_strdup(address_string);
376 GVariant *temp = g_variant_new("(s@a{sv})", ptr, args);
378 g_is_pbap_connecting = TRUE;
379 g_dbus_proxy_call(g_pbap_proxy, "CreateSession",
381 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
382 (GAsyncReadyCallback)__bt_pbap_connect_cb, ptr);
385 return BLUETOOTH_ERROR_NONE;
388 void __bt_pbap_disconnect_cb(GDBusProxy *proxy,
389 GAsyncResult *res, gpointer user_data)
391 char *address_string = user_data;
392 GError *error = NULL;
394 int result = BLUETOOTH_ERROR_INTERNAL ;
396 BT_DBG("Address = %s", address_string);
398 value = g_dbus_proxy_call_finish(proxy, res, &error);
399 BT_DBG("Address = %s", address_string);
402 BT_ERR("g_dbus_proxy_call_finish failed");
404 BT_ERR("errCode[%x], message[%s]\n",
405 error->code, error->message);
406 g_clear_error(&error);
409 g_object_unref(g_pbap_proxy);
412 g_free(g_pbap_session_path);
413 g_pbap_session_path = NULL;
415 g_free(g_pbap_server_address);
416 g_pbap_server_address = NULL;
418 result = BLUETOOTH_ERROR_NONE;
419 selected_path.folder = -1;
420 selected_path.type = -1;
422 g_variant_unref(value);
425 /* If the result is success, the event reciever will send the disconnect event */
426 if (result != BLUETOOTH_ERROR_NONE) {
427 GVariant *signal = NULL;
429 signal = g_variant_new("(is)", result, address_string);
430 _bt_send_event(BT_PBAP_CLIENT_EVENT,
431 BLUETOOTH_PBAP_DISCONNECTED,
435 g_free(address_string);
439 int _bt_pbap_disconnect(const bluetooth_device_address_t *address)
442 char address_string[18] = { 0, };
444 BT_CHECK_PARAMETER(address, return);
446 /* check if connected */
447 if (g_pbap_session_path == NULL)
448 return BLUETOOTH_ERROR_NOT_CONNECTED;
450 BT_DBG("BD Address [%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X]",
451 address->addr[0], address->addr[1],
452 address->addr[2], address->addr[3],
453 address->addr[4], address->addr[5]);
455 _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr);
456 BT_DBG("Address String: %s", address_string);
457 BT_DBG("Session Path: %s", g_pbap_session_path);
459 ptr = g_strdup(address_string);
461 g_dbus_proxy_call(g_pbap_proxy, "RemoveSession",
462 g_variant_new("(o)", g_pbap_session_path),
463 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
464 (GAsyncReadyCallback)__bt_pbap_disconnect_cb, ptr);
466 return BLUETOOTH_ERROR_NONE;
469 void __bt_pbap_select_cb(GDBusProxy *proxy,
470 GAsyncResult *res, gpointer user_data)
473 GError *error = NULL;
475 bt_pbap_data_t *pbap_data = user_data;
476 char *address_string = pbap_data->data;
478 BT_DBG("Address = %s", address_string);
480 value = g_dbus_proxy_call_finish(proxy, res, &error);
482 BT_ERR("g_dbus_proxy_call_finish failed");
484 BT_ERR("errCode[%x], message[%s]\n",
485 error->code, error->message);
486 g_clear_error(&error);
489 selected_path.folder = -1;
490 selected_path.type = -1;
492 g_object_unref(proxy);
493 __bt_pbap_free_data(pbap_data);
497 switch (pbap_data->operation) {
499 __bt_pbap_call_get_phonebook_size(proxy, pbap_data);
503 __bt_pbap_call_get_phonebook(proxy, pbap_data);
507 __bt_pbap_call_get_vcards_list(proxy, pbap_data);
511 __bt_pbap_call_get_vcard(proxy, pbap_data);
515 __bt_pbap_call_search_phonebook(proxy, pbap_data);
519 selected_path.folder = -1;
520 selected_path.type = -1;
521 g_object_unref(proxy);
522 __bt_pbap_free_data(pbap_data);
526 g_variant_unref(value);
531 void __bt_pbap_get_phonebook_size_cb(GDBusProxy *proxy,
532 GAsyncResult *res, gpointer user_data)
535 GError *error = NULL;
536 int result = BLUETOOTH_ERROR_INTERNAL;
537 bt_pbap_data_t *pbap_data = user_data;
538 char *address_string = pbap_data->data;
539 unsigned short int size = 0;
541 GVariant *signal = NULL;
543 BT_DBG("Address = %s", address_string);
544 value = g_dbus_proxy_call_finish(proxy, res, &error);
547 BT_ERR("g_dbus_proxy_call_finish failed");
549 BT_ERR("errCode[%x], message[%s]\n",
550 error->code, error->message);
551 g_clear_error(&error);
554 g_variant_get(value, "(q)", &size);
555 result = BLUETOOTH_ERROR_NONE;
558 BT_DBG("Size of Phonebook: %d", size);
560 signal = g_variant_new("(isi)", result, address_string, size);
561 _bt_send_event(BT_PBAP_CLIENT_EVENT,
562 BLUETOOTH_PBAP_PHONEBOOK_SIZE,
565 g_variant_unref(value);
566 g_object_unref(proxy);
567 __bt_pbap_free_data(pbap_data);
571 void __bt_pbap_get_phonebook_cb(GDBusProxy *proxy,
572 GAsyncResult *res, gpointer user_data)
575 GError *error = NULL;
576 bt_pbap_data_t *pbap_data = user_data;
577 char *address_string = pbap_data->data;
578 bt_pbap_transfer_info_t *transfer_info;
579 char *transfer = NULL;
580 const gchar *filename = NULL;
582 GVariant *properties;
584 BT_DBG("Address = %s", address_string);
585 value = g_dbus_proxy_call_finish(proxy, res, &error);
587 BT_ERR("g_dbus_proxy_call_finish failed");
589 BT_ERR("errCode[%x], message[%s]\n",
590 error->code, error->message);
591 g_clear_error(&error);
594 g_variant_get(value, "(o@a{sv})", &transfer, &properties);
596 if (g_variant_lookup(properties, "Filename", "s", &filename) == FALSE)
599 BT_DBG("Transfer Path: %s", transfer);
600 BT_DBG("File Name: %s", filename);
601 transfer_info = g_new0(bt_pbap_transfer_info_t, 1);
602 transfer_info->path = transfer;
603 transfer_info->remote_device = g_strdup(address_string);
604 transfer_info->filename = (char *)filename;
605 transfer_info->operation = PULL_ALL;
606 transfers = g_slist_append(transfers, transfer_info);
608 g_variant_unref(value);
611 g_object_unref(proxy);
612 __bt_pbap_free_data(pbap_data);
616 void __bt_pbap_get_vcard_list_cb(GDBusProxy *proxy,
617 GAsyncResult *res, gpointer user_data)
620 GError *error = NULL;
622 int result = BLUETOOTH_ERROR_INTERNAL;
623 bt_pbap_data_t *pbap_data = user_data;
624 char *address_string = pbap_data->data;
625 char **vcard_list = NULL;
626 char list_entry[PBAP_VCARDLIST_MAXLENGTH] = { 0, };
629 GVariant *signal = NULL;
631 value = g_dbus_proxy_call_finish(proxy, res, &error);
633 BT_ERR("g_dbus_proxy_call_finish failed");
635 BT_ERR("errCode[%x], message[%s]\n",
636 error->code, error->message);
637 g_clear_error(&error);
640 result = BLUETOOTH_ERROR_NONE;
641 gchar *elname, *elval;
644 GVariant *child = NULL;
645 GVariant *value1 = NULL;
647 g_variant_get(value, "(@a(ss))", &value1); /* Format for value1 a(ss)*/
648 gsize items = g_variant_iter_init(&iter, value1);
649 vcard_list = g_new0(char *, items + 1);
651 for (i = 0; (child = g_variant_iter_next_value(&iter)) != NULL; i++) {
652 g_variant_get(child, "(&s&s)", &elname, &elval);
654 memset(list_entry, 0, PBAP_VCARDLIST_MAXLENGTH);
656 g_snprintf(list_entry, PBAP_VCARDLIST_MAXLENGTH - 1,
657 "<card handle = \"%s\" name = \"%s\"/>", elname, elval);
659 g_snprintf(list_entry, PBAP_VCARDLIST_MAXLENGTH - 1,
662 //If possible send as Array of <STRING, STRING>
663 BT_DBG("%s", list_entry);
664 vcard_list[i] = g_strdup(list_entry);
665 g_variant_unref(child);
669 g_variant_unref(value1);
670 g_variant_unref(value);
673 BT_DBG("Address = %s", address_string);
674 GVariant *temp = g_variant_new_strv((const gchar * const *)vcard_list, length);
675 signal = g_variant_new("(isv)", result, address_string, temp);
677 _bt_send_event(BT_PBAP_CLIENT_EVENT,
678 BLUETOOTH_PBAP_VCARD_LIST,
681 for (i = 0; i < length; i++)
682 g_free(vcard_list[i]);
685 g_object_unref(proxy);
686 __bt_pbap_free_data(pbap_data);
690 void __bt_pbap_get_vcard_cb(GDBusProxy *proxy,
691 GAsyncResult *res, gpointer user_data)
694 GError *error = NULL;
695 bt_pbap_data_t *pbap_data = user_data;
696 char *address_string = pbap_data->data;
697 bt_pbap_transfer_info_t *transfer_info;
698 char *transfer = NULL;
699 const gchar *filename = NULL;
701 GVariant *properties;
703 BT_DBG("Address = %s", address_string);
704 value = g_dbus_proxy_call_finish(proxy, res, &error);
706 BT_ERR("g_dbus_proxy_call_finish failed");
708 BT_ERR("errCode[%x], message[%s]\n",
709 error->code, error->message);
710 g_clear_error(&error);
713 g_variant_get(value, "(o@a{sv})", &transfer, &properties);
715 if (g_variant_lookup(properties, "Filename", "s", &filename) == FALSE)
718 BT_DBG("Transfer Path: %s", transfer);
719 BT_DBG("File Name: %s", filename);
720 transfer_info = g_new0(bt_pbap_transfer_info_t, 1);
721 transfer_info->path = transfer;
722 transfer_info->remote_device = g_strdup(address_string);
723 transfer_info->filename = (char *)filename;
724 transfer_info->operation = GET_VCARD;
725 transfers = g_slist_append(transfers, transfer_info);
727 g_variant_unref(properties);
728 g_variant_unref(value);
731 g_object_unref(proxy);
732 __bt_pbap_free_data(pbap_data);
736 void __bt_pbap_search_phonebook_cb(GDBusProxy *proxy,
737 GAsyncResult *res, gpointer user_data)
740 GError *error = NULL;
742 bt_pbap_data_t *pbap_data = user_data;
743 char *address_string = pbap_data->data;
744 char **vcard_list = NULL;
745 char list_entry[PBAP_VCARDLIST_MAXLENGTH] = { 0, };
747 int result = BLUETOOTH_ERROR_INTERNAL;
749 GVariant *signal = NULL;
751 value = g_dbus_proxy_call_finish(proxy, res, &error);
753 BT_ERR("g_dbus_proxy_call_finish failed");
755 BT_ERR("errCode[%x], message[%s]\n",
756 error->code, error->message);
757 g_clear_error(&error);
760 result = BLUETOOTH_ERROR_NONE;
761 gchar *elname, *elval;
764 GVariant *child = NULL;
765 GVariant *value1 = NULL;
767 g_variant_get(value, "(@a(ss))", &value1);
768 gsize items = g_variant_iter_init(&iter, value1);
769 vcard_list = g_new0(char *, items + 1);
771 for (i = 0; (child = g_variant_iter_next_value(&iter)) != NULL; i++) {
772 g_variant_get(child, "(&s&s)", &elname, &elval);
774 memset(list_entry, 0, PBAP_VCARDLIST_MAXLENGTH);
775 g_snprintf(list_entry, PBAP_VCARDLIST_MAXLENGTH - 1,
776 "<card handle = \"%s\" name = \"%s\"/>", elname, elval);
777 //If possible send as Array of <STRING, STRING>
778 BT_DBG("%s", list_entry);
779 vcard_list[i] = g_strdup(list_entry);
781 g_variant_unref(child);
784 g_variant_unref(value1);
785 g_variant_unref(value);
788 BT_DBG("Address = %s", address_string);
790 signal = g_variant_new("(is@as)", result, address_string,
791 g_variant_new_strv((const gchar * const *)vcard_list, length));
793 _bt_send_event(BT_PBAP_CLIENT_EVENT,
794 BLUETOOTH_PBAP_PHONEBOOK_SEARCH,
797 for (i = 0; i < length; i++)
798 g_free(vcard_list[i]);
801 g_object_unref(proxy);
802 __bt_pbap_free_data(pbap_data);
806 int __bt_pbap_call_get_phonebook_size(GDBusProxy *proxy, bt_pbap_data_t *pbap_data)
810 g_dbus_proxy_call(proxy, "GetSize",
811 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL,
812 (GAsyncReadyCallback)__bt_pbap_get_phonebook_size_cb,
816 return BLUETOOTH_ERROR_NONE;
819 int __bt_pbap_call_get_phonebook(GDBusProxy *proxy, bt_pbap_data_t *pbap_data)
825 char *format_str = NULL;
826 char *fields_str = NULL;
827 char *order_str = NULL;
828 char *download_path = NULL;
829 char *target_file = NULL;
830 bt_pbap_pull_parameters_t *app_param = pbap_data->app_param;
831 GVariantBuilder builder;
832 GVariantBuilder inner_builder;
836 g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
837 g_variant_builder_init(&inner_builder, G_VARIANT_TYPE_ARRAY);
839 /* Add MaxlistCount*/
840 g_variant_builder_add(&builder, "{sv}", "MaxCount",
841 g_variant_new("u", app_param->maxlist));
843 /* Add Order Filter only if other than Indexed (default)*/
844 if (app_param->order > 0) {
845 order_str = g_strdup(ORDER[app_param->order]);
846 g_variant_builder_add(&builder, "{sv}", "Order",
847 g_variant_new("s", order_str));
850 /* Add Offset Filter only if other than 0 (default)*/
851 if (app_param->offset > 0) {
852 g_variant_builder_add(&builder, "{sv}", "Offset",
853 g_variant_new("u", app_param->offset));
856 /* Add Format Filter only if other than vCard 2.1 (default)*/
857 if (app_param->format > 0) {
858 format_str = g_strdup(FORMAT[app_param->format]);
859 g_variant_builder_add(&builder, "{sv}", "Format",
860 g_variant_new("s", format_str));
863 /* Add Filter AttributeMask (64bit) */
864 if (app_param->fields > 0) {
865 if (app_param->fields == PBAP_FIELD_ALL) {
866 BT_DBG("** CHECKED ALL **");
867 fields_str = g_strdup("ALL");
868 g_variant_builder_add(&inner_builder, "s", fields_str);
871 for (i = 0; i < PBAP_NUM_OF_FIELDS_ENTRY; i++) {
872 if (app_param->fields & (1ULL << i)) {
873 BT_DBG("** CHECKED[%d]", i);
874 fields_str = g_strdup(FIELDS[i]);
875 g_variant_builder_add(&inner_builder, "s", fields_str);
881 g_variant_builder_add(&builder, "{sv}", "Fields",
882 g_variant_new("as", &inner_builder));
885 filters = g_variant_builder_end(&builder);
887 //****************************
888 // Add code for Fields
890 //****************************
892 ret = storage_get_directory(STORAGE_TYPE_INTERNAL,
893 STORAGE_DIRECTORY_DOWNLOADS, &download_path);
895 if (ret != STORAGE_ERROR_NONE) {
896 target_file = g_strdup_printf("%s/%s", PBAP_DEFAULT_DOWNLAOD_PATH,
897 PBAP_DEFAULT_FILE_NAME);
899 target_file = g_strdup_printf("%s/%s", download_path,
900 PBAP_DEFAULT_FILE_NAME);
906 DBG_SECURE("Target flie: %s", target_file);
908 g_dbus_proxy_call(proxy, "PullAll",
909 g_variant_new("(s@a{sv})", target_file, filters),
910 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
911 (GAsyncReadyCallback)__bt_pbap_get_phonebook_cb,
919 return BLUETOOTH_ERROR_NONE;
922 int __bt_pbap_call_get_vcards_list(GDBusProxy *proxy, bt_pbap_data_t *pbap_data)
925 char *order_str = NULL;
927 GVariantBuilder builder;
930 bt_pbap_list_parameters_t *app_param = pbap_data->app_param;
932 g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
934 /* Add MaxlistCount*/
935 g_variant_builder_add(&builder, "{sv}", "MaxCount",
936 g_variant_new("u", app_param->maxlist));
938 /* Add Order Filter only if other than Indexed (default)*/
939 if (app_param->order > 0) {
940 order_str = g_strdup(ORDER[app_param->order]);
941 g_variant_builder_add(&builder, "{sv}", "Order",
942 g_variant_new("s", order_str));
945 /* Add Offset Filter only if other than 0 (default)*/
946 if (app_param->offset > 0) {
947 g_variant_builder_add(&builder, "{sv}", "Offset",
948 g_variant_new("u", app_param->offset));
951 filters = g_variant_builder_end(&builder);
953 folder = g_strdup(TYPE[selected_path.type]);
954 BT_DBG("Folder: %s", folder);
957 g_dbus_proxy_call(proxy, "List",
958 g_variant_new("(s@a{sv})", folder, filters),
959 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
960 (GAsyncReadyCallback)__bt_pbap_get_vcard_list_cb,
965 g_hash_table_unref((GHashTable *)filters);
966 /* In _bt_pbap_get_list(), path(type) is set to "nil", but current type is not null.
967 The path should be reset here */
968 selected_path.type = -1;
971 return BLUETOOTH_ERROR_NONE;
974 int __bt_pbap_call_get_vcard(GDBusProxy *proxy, bt_pbap_data_t *pbap_data)
980 char *format_str = NULL;
981 char *fields_str = NULL;
982 char *target_file = NULL;
983 char *download_path = NULL;
984 char *vcard_handle = NULL;
985 char vcard[20] = { 0, };
986 GVariantBuilder builder;
987 GVariantBuilder inner_builder;
989 bt_pbap_pull_vcard_parameters_t *app_param = pbap_data->app_param;
991 g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
992 g_variant_builder_init(&inner_builder, G_VARIANT_TYPE_ARRAY);
994 /* Add Format Filter only if other than vCard 2.1 (default)*/
995 // if (app_param->format > 0) {
996 format_str = g_strdup(FORMAT[app_param->format]);
997 g_variant_builder_add(&builder, "{sv}", "Format",
998 g_variant_new("s", format_str));
1001 /* Add Filter AttributeMask (64bit) */
1002 if (app_param->fields > 0) {
1003 if (app_param->fields == PBAP_FIELD_ALL) {
1004 BT_DBG("** CHECKED ALL **");
1005 fields_str = g_strdup("ALL");
1006 g_variant_builder_add(&inner_builder, "s", fields_str);
1009 for (i = 0; i < PBAP_NUM_OF_FIELDS_ENTRY; i++) {
1010 if (app_param->fields & (1ULL << i)) {
1011 BT_DBG("** CHECKED[%d]", i);
1012 fields_str = g_strdup(FIELDS[i]);
1013 g_variant_builder_add(&inner_builder, "s", fields_str);
1019 g_variant_builder_add(&builder, "{sv}", "Fields",
1020 g_variant_new("as", &inner_builder));
1023 filters = g_variant_builder_end(&builder);
1025 //****************************
1026 // Add code for Fields
1028 //****************************
1030 sprintf(vcard, "%d.vcf", app_param->index);
1031 BT_DBG("Handle: %s", vcard);
1032 vcard_handle = g_strdup(vcard);
1033 BT_DBG("vcard_handle: %s", vcard_handle);
1035 ret = storage_get_directory(STORAGE_TYPE_INTERNAL,
1036 STORAGE_DIRECTORY_DOWNLOADS, &download_path);
1038 if (ret != STORAGE_ERROR_NONE) {
1039 target_file = g_strdup_printf("%s/%s", PBAP_DEFAULT_DOWNLAOD_PATH,
1040 PBAP_DEFAULT_FILE_NAME);
1043 target_file = g_strdup_printf("%s/%s", download_path,
1046 target_file = g_strdup_printf("%s/%s", download_path,
1047 PBAP_DEFAULT_FILE_NAME);
1050 free(download_path);
1053 DBG_SECURE("Target flie: %s", target_file);
1055 GVariant *temp = g_variant_new("(ss@a{sv})", vcard_handle, target_file, filters);
1057 g_dbus_proxy_call(proxy, "Pull",
1059 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
1060 (GAsyncReadyCallback)__bt_pbap_get_vcard_cb,
1064 g_free(vcard_handle);
1065 g_free(target_file);
1068 return BLUETOOTH_ERROR_NONE;
1071 int __bt_pbap_call_search_phonebook(GDBusProxy *proxy, bt_pbap_data_t *pbap_data)
1075 char *order_str = NULL;
1078 bt_pbap_search_parameters_t *app_param = pbap_data->app_param;
1079 GVariantBuilder builder;
1082 g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
1084 /* Add MaxlistCount*/
1085 g_variant_builder_add(&builder, "{sv}", "MaxCount",
1086 g_variant_new("u", app_param->maxlist));
1088 /* Add Order Filter only if other than Indexed (default)*/
1089 if (app_param->order > 0) {
1090 order_str = g_strdup(ORDER[app_param->order]);
1091 g_variant_builder_add(&builder, "{sv}", "Order",
1092 g_variant_new("s", order_str));
1095 /* Add Offset Filter only if other than 0 (default)*/
1096 if (app_param->offset > 0) {
1097 g_variant_builder_add(&builder, "{sv}", "Offset",
1098 g_variant_new("u", app_param->offset));
1101 filters = g_variant_builder_end(&builder);
1103 field = g_strdup(SEARCH_FIELD[app_param->search_attribute]);
1104 value = g_strdup(app_param->search_value);
1106 g_dbus_proxy_call(proxy, "Search",
1107 g_variant_new("(ss@a{sv})", field, value, filters),
1108 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
1109 (GAsyncReadyCallback)__bt_pbap_search_phonebook_cb,
1117 return BLUETOOTH_ERROR_NONE;
1120 int _bt_pbap_is_connected(bluetooth_device_address_t *device_address,
1121 gboolean *connected)
1123 char address_string[18] = { 0, };
1125 BT_CHECK_PARAMETER(device_address, return);
1126 BT_CHECK_PARAMETER(connected, return);
1128 /* In now, only 1 pbap connection is allowed */
1129 if (g_pbap_server_address == NULL) {
1134 _bt_convert_addr_type_to_string(address_string,
1135 (unsigned char *)device_address->addr);
1136 BT_DBG("Address String: %s", address_string);
1138 if (g_strcmp0(address_string, g_pbap_server_address) == 0)
1146 int _bt_pbap_get_phonebook_size(const bluetooth_device_address_t *address,
1147 int source, int type)
1150 GDBusConnection *g_conn;
1151 GDBusProxy *g_pbap_session_proxy = NULL;
1152 char address_string[18] = { 0, };
1153 char *source_string = NULL;
1154 char *type_string = NULL;
1156 bt_pbap_data_t *pbap_data = NULL;
1158 BT_CHECK_PARAMETER(address, return);
1160 /* check if connected */
1161 if (g_pbap_session_path == NULL) {
1162 BT_ERR("NOT CONNECTED");
1163 return BLUETOOTH_ERROR_NOT_CONNECTED;
1166 BT_DBG("BD Address [%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X]",
1167 address->addr[0], address->addr[1],
1168 address->addr[2], address->addr[3],
1169 address->addr[4], address->addr[5]);
1171 _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr);
1172 BT_DBG("Address String: %s", address_string);
1173 source_string = g_strdup(SOURCE[source]);
1174 type_string = g_strdup(TYPE[type]);
1176 BT_DBG("Address[%s] Source[%s] Type[%s]",
1177 address_string, source_string, type_string);
1178 BT_DBG("Session Path = %s\n", g_pbap_session_path);
1180 g_conn = _bt_gdbus_get_session_gconn();
1181 if (g_conn == NULL) {
1182 BT_ERR("Couldn't connect to session bus");
1183 g_free(source_string);
1184 g_free(type_string);
1187 g_pbap_session_proxy = g_dbus_proxy_new_sync(g_conn,
1188 G_DBUS_PROXY_FLAGS_NONE, NULL,
1189 PBAP_SESSION_SERVICE, g_pbap_session_path,
1190 PBAP_SESSION_INTERFACE, NULL, &err);
1192 if (!g_pbap_session_proxy) {
1193 BT_ERR("Failed to get a proxy for D-Bus\n");
1195 ERR("Unable to create proxy: %s", err->message);
1196 g_clear_error(&err);
1198 g_free(source_string);
1199 g_free(type_string);
1203 BT_DBG("Prepare PBAP data");
1204 pbap_data = g_new0(bt_pbap_data_t, 1);
1205 pbap_data->operation = GET_SIZE;
1206 pbap_data->data = g_strdup(address_string);
1208 if (source == selected_path.folder && type == selected_path.type) {
1209 BT_DBG("Call get_phonebook_size directly");
1210 g_free(source_string);
1211 g_free(type_string);
1212 return __bt_pbap_call_get_phonebook_size(g_pbap_session_proxy, pbap_data);
1215 BT_DBG("Call SELECT");
1216 g_dbus_proxy_call(g_pbap_session_proxy, "Select",
1217 g_variant_new("(ss)", source_string, type_string),
1218 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
1219 (GAsyncReadyCallback)__bt_pbap_select_cb,
1222 BT_DBG("Set Folders");
1223 selected_path.folder = source;
1224 selected_path.type = type;
1226 g_free(source_string);
1227 g_free(type_string);
1231 int _bt_pbap_get_phonebook(const bluetooth_device_address_t *address,
1232 int source, int type, bt_pbap_pull_parameters_t *app_param)
1235 GDBusConnection *g_conn;
1236 GDBusProxy *g_pbap_session_proxy = NULL;
1237 char address_string[18] = { 0, };
1238 char *source_string = NULL;
1239 char *type_string = NULL;
1242 bt_pbap_data_t *pbap_data = NULL;
1243 bt_pbap_pull_parameters_t *param = NULL;
1245 BT_CHECK_PARAMETER(address, return);
1247 /* check if connected */
1248 if (g_pbap_session_path == NULL) {
1249 BT_ERR("NOT CONNECTED");
1250 return BLUETOOTH_ERROR_NOT_CONNECTED;
1253 BT_DBG("BD Address [%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X]",
1254 address->addr[0], address->addr[1],
1255 address->addr[2], address->addr[3],
1256 address->addr[4], address->addr[5]);
1258 _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr);
1259 BT_DBG("Address String: %s", address_string);
1261 source_string = g_strdup(SOURCE[source]);
1262 type_string = g_strdup(TYPE[type]);
1264 BT_DBG("Address[%s] Source[%s] Type[%s]",
1265 address_string, source_string, type_string);
1267 BT_DBG("Session Path = %s\n", g_pbap_session_path);
1269 g_conn = _bt_gdbus_get_session_gconn();
1270 if (g_conn == NULL) {
1271 BT_ERR("Couldn't connect to session bus");
1272 g_free(source_string);
1273 g_free(type_string);
1276 g_pbap_session_proxy = g_dbus_proxy_new_sync(g_conn,
1277 G_DBUS_PROXY_FLAGS_NONE, NULL,
1278 PBAP_SESSION_SERVICE, g_pbap_session_path,
1279 PBAP_SESSION_INTERFACE, NULL, &err);
1281 if (!g_pbap_session_proxy) {
1282 BT_ERR("Failed to get a proxy for D-Bus\n");
1284 ERR("Unable to create proxy: %s", err->message);
1285 g_clear_error(&err);
1287 g_free(source_string);
1288 g_free(type_string);
1292 pbap_data = g_new0(bt_pbap_data_t, 1);
1293 pbap_data->operation = PULL_ALL;
1294 pbap_data->data = g_strdup(address_string);
1295 param = g_new0(bt_pbap_pull_parameters_t, 1);
1296 memcpy(param, app_param, sizeof(bt_pbap_pull_parameters_t));
1297 pbap_data->app_param = param;
1299 if (source == selected_path.folder && type == selected_path.type) {
1300 g_free(source_string);
1301 g_free(type_string);
1302 return __bt_pbap_call_get_phonebook(g_pbap_session_proxy, pbap_data);
1305 g_dbus_proxy_call(g_pbap_session_proxy, "Select",
1306 g_variant_new("(ss)", source_string, type_string),
1307 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
1308 (GAsyncReadyCallback)__bt_pbap_select_cb,
1311 selected_path.folder = source;
1312 selected_path.type = type;
1313 g_free(source_string);
1314 g_free(type_string);
1319 int _bt_pbap_get_list(const bluetooth_device_address_t *address, int source,
1320 int type, bt_pbap_list_parameters_t *app_param)
1323 GDBusConnection *g_conn;
1324 GDBusProxy *g_pbap_session_proxy = NULL;
1325 char address_string[18] = { 0, };
1326 char *source_string = NULL;
1327 char *type_string = NULL;
1330 bt_pbap_data_t *pbap_data = NULL;
1331 bt_pbap_list_parameters_t *param = NULL;
1333 BT_CHECK_PARAMETER(address, return);
1335 /* check if connected */
1336 if (g_pbap_session_path == NULL) {
1337 BT_ERR("NOT CONNECTED");
1338 return BLUETOOTH_ERROR_NOT_CONNECTED;
1341 BT_DBG("BD Address [%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X]",
1342 address->addr[0], address->addr[1],
1343 address->addr[2], address->addr[3],
1344 address->addr[4], address->addr[5]);
1346 _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr);
1347 BT_DBG("Address String: %s", address_string);
1349 source_string = g_strdup(SOURCE[source]);
1350 type_string = g_strdup("nil");
1352 BT_DBG("Address[%s] Source[%s] Type[%s]",
1353 address_string, source_string, type_string);
1355 BT_DBG("Session Path = %s\n", g_pbap_session_path);
1357 g_conn = _bt_gdbus_get_session_gconn();
1358 if (g_conn == NULL) {
1359 BT_ERR("Couldn't connect to session bus");
1360 g_free(source_string);
1361 g_free(type_string);
1364 g_pbap_session_proxy = g_dbus_proxy_new_sync(g_conn,
1365 G_DBUS_PROXY_FLAGS_NONE, NULL,
1366 PBAP_SESSION_SERVICE, g_pbap_session_path,
1367 PBAP_SESSION_INTERFACE, NULL, &err);
1369 if (!g_pbap_session_proxy) {
1370 BT_ERR("Failed to get a proxy for D-Bus\n");
1372 ERR("Unable to create proxy: %s", err->message);
1373 g_clear_error(&err);
1375 g_free(source_string);
1376 g_free(type_string);
1380 BT_DBG("Set PBAP Data");
1381 pbap_data = g_new0(bt_pbap_data_t, 1);
1382 pbap_data->operation = GET_LIST;
1383 pbap_data->data = g_strdup(address_string);
1384 param = g_new0(bt_pbap_list_parameters_t, 1);
1385 memcpy(param, app_param, sizeof(bt_pbap_list_parameters_t));
1386 pbap_data->app_param = param;
1388 /* Always Call Select for vCardListing
1389 if (source == selected_path.folder && type == selected_path.type) {
1390 BT_DBG("Call Directly");
1391 return __bt_pbap_call_get_vcards_list(g_pbap_session_proxy, pbap_data);
1393 BT_DBG("Call SELECT");
1394 g_dbus_proxy_call(g_pbap_session_proxy, "Select",
1395 g_variant_new("(ss)", source_string, type_string),
1396 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
1397 (GAsyncReadyCallback)__bt_pbap_select_cb,
1399 BT_DBG("Set Folders");
1400 selected_path.folder = source;
1401 selected_path.type = type;
1402 g_free(source_string);
1403 g_free(type_string);
1409 int _bt_pbap_pull_vcard(const bluetooth_device_address_t *address,
1410 int source, int type, bt_pbap_pull_vcard_parameters_t *app_param)
1413 GDBusConnection *g_conn;
1414 GDBusProxy *g_pbap_session_proxy = NULL;
1415 char address_string[18] = { 0, };
1416 char *source_string = NULL;
1417 char *type_string = NULL;
1418 bt_pbap_data_t *pbap_data = NULL;
1419 bt_pbap_pull_vcard_parameters_t *param = NULL;
1422 BT_CHECK_PARAMETER(address, return);
1424 /* check if connected */
1425 if (g_pbap_session_path == NULL) {
1426 BT_ERR("NOT CONNECTED");
1427 return BLUETOOTH_ERROR_NOT_CONNECTED;
1430 BT_DBG("BD Address [%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X]",
1431 address->addr[0], address->addr[1],
1432 address->addr[2], address->addr[3],
1433 address->addr[4], address->addr[5]);
1435 _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr);
1436 BT_DBG("Address String: %s", address_string);
1438 source_string = g_strdup(SOURCE[source]);
1439 type_string = g_strdup(TYPE[type]);
1441 BT_DBG("Address[%s] Source[%s] Type[%s]",
1442 address_string, source_string, type_string);
1444 BT_DBG("Session Path = %s\n", g_pbap_session_path);
1446 g_conn = _bt_gdbus_get_session_gconn();
1447 if (g_conn == NULL) {
1448 BT_ERR("Couldn't connect to session bus");
1449 g_free(source_string);
1450 g_free(type_string);
1453 g_pbap_session_proxy = g_dbus_proxy_new_sync(g_conn,
1454 G_DBUS_PROXY_FLAGS_NONE, NULL,
1455 PBAP_SESSION_SERVICE, g_pbap_session_path,
1456 PBAP_SESSION_INTERFACE, NULL, &err);
1458 if (!g_pbap_session_proxy) {
1459 BT_ERR("Failed to get a proxy for D-Bus\n");
1461 ERR("Unable to create proxy: %s", err->message);
1462 g_clear_error(&err);
1464 g_free(source_string);
1465 g_free(type_string);
1469 pbap_data = g_new0(bt_pbap_data_t, 1);
1470 pbap_data->operation = GET_VCARD;
1471 pbap_data->data = g_strdup(address_string);
1472 param = g_new0(bt_pbap_pull_vcard_parameters_t, 1);
1473 memcpy(param, app_param, sizeof(bt_pbap_pull_vcard_parameters_t));
1474 pbap_data->app_param = param;
1476 if (source == selected_path.folder && type == selected_path.type) {
1477 g_free(source_string);
1478 g_free(type_string);
1479 return __bt_pbap_call_get_vcard(g_pbap_session_proxy, pbap_data);
1482 g_dbus_proxy_call(g_pbap_session_proxy, "Select",
1483 g_variant_new("(ss)", source_string, type_string),
1484 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
1485 (GAsyncReadyCallback)__bt_pbap_select_cb,
1488 selected_path.folder = source;
1489 selected_path.type = type;
1490 g_free(source_string);
1491 g_free(type_string);
1496 int _bt_pbap_phonebook_search(const bluetooth_device_address_t *address,
1497 int source, int type, bt_pbap_search_parameters_t *app_param)
1500 GDBusConnection *g_conn;
1501 GDBusProxy *g_pbap_session_proxy = NULL;
1502 char address_string[18] = { 0, };
1503 char *source_string = NULL;
1504 char *type_string = NULL;
1505 bt_pbap_data_t *pbap_data = NULL;
1506 bt_pbap_search_parameters_t *param = NULL;
1509 BT_CHECK_PARAMETER(address, return);
1511 /* check if connected */
1512 if (g_pbap_session_path == NULL) {
1513 BT_ERR("NOT CONNECTED");
1514 return BLUETOOTH_ERROR_NOT_CONNECTED;
1517 BT_DBG("BD Address [%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X]",
1518 address->addr[0], address->addr[1],
1519 address->addr[2], address->addr[3],
1520 address->addr[4], address->addr[5]);
1522 _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr);
1523 BT_DBG("Address String: %s", address_string);
1525 source_string = g_strdup(SOURCE[source]);
1526 type_string = g_strdup(TYPE[type]);
1528 BT_DBG("Address[%s] Source[%s] Type[%s]",
1529 address_string, source_string, type_string);
1531 BT_DBG("Session Path = %s\n", g_pbap_session_path);
1533 g_conn = _bt_gdbus_get_session_gconn();
1534 if (g_conn == NULL) {
1535 BT_ERR("Couldn't connect to session bus");
1536 g_free(source_string);
1537 g_free(type_string);
1540 g_pbap_session_proxy = g_dbus_proxy_new_sync(g_conn,
1541 G_DBUS_PROXY_FLAGS_NONE, NULL,
1542 PBAP_SESSION_SERVICE, g_pbap_session_path,
1543 PBAP_SESSION_INTERFACE, NULL, &err);
1545 if (!g_pbap_session_proxy) {
1546 BT_ERR("Failed to get a proxy for D-Bus\n");
1548 ERR("Unable to create proxy: %s", err->message);
1549 g_clear_error(&err);
1551 g_free(source_string);
1552 g_free(type_string);
1556 pbap_data = g_new0(bt_pbap_data_t, 1);
1557 pbap_data->operation = PB_SEARCH;
1558 pbap_data->data = g_strdup(address_string);
1559 param = g_new0(bt_pbap_search_parameters_t, 1);
1560 memcpy(param, app_param, sizeof(bt_pbap_search_parameters_t));
1561 pbap_data->app_param = param;
1563 /* Call Select for vCardListing
1564 if (source == selected_path.folder && type == selected_path.type) {
1565 return __bt_pbap_call_search_phonebook(g_pbap_session_proxy, pbap_data);
1568 g_dbus_proxy_call(g_pbap_session_proxy, "Select",
1569 g_variant_new("(ss)", source_string, type_string),
1570 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
1571 (GAsyncReadyCallback)__bt_pbap_select_cb,
1574 selected_path.folder = source;
1575 selected_path.type = type;
1577 g_free(source_string);
1578 g_free(type_string);