5 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
7 * Contact: Hocheol Seo <hocheol.seo@samsung.com>
8 * Girishashok Joshi <girish.joshi@samsung.com>
9 * Chanyeol Park <chanyeol.park@samsung.com>
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
15 * http://www.apache.org/licenses/LICENSE-2.0
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
29 #include <stacktrim.h>
30 #if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT)
31 #include <syspopup_caller.h>
35 #include "bt-internal-types.h"
36 #include "bt-service-common.h"
37 #include "bt-service-event.h"
38 #include "bt-service-pbap.h"
42 #define PBAP_UUID "0000112f-0000-1000-8000-00805f9b34fb"
43 #define PBAP_OBEX_CLIENT_SERVICE "org.bluez.obex"
44 #define PBAP_OBEX_CLIENT_PATH "/org/bluez/obex"
45 #define PBAP_OBEX_CLIENT_INTERFACE "org.bluez.obex.Client1"
47 #define PBAP_SESSION_SERVICE "org.bluez.obex"
48 #define PBAP_SESSION_INTERFACE "org.bluez.obex.PhonebookAccess1"
49 #define PBAP_VCARDLIST_MAXLENGTH 256
77 PBAP_FIELD_CATEGORIES,
80 PBAP_FIELD_SORT_STRING,
81 PBAP_FIELD_X_IRMC_CALL_DATETIME,
90 "pb", //Phonebook for the saved contacts
91 "ich", //Incoming call history
92 "och", //Outgoing call history
93 "mch", //Missed call history
94 "cch", //Combined Call History cch = ich + och + mch
98 "vcard21", // vCard Format 2.1 (Default)
99 "vcard30", // vCard Format 3.0
103 "indexed", // Index (default)
104 "alphanumeric", // Alphanumeric
105 "phonetic", // Phonetic
108 char *SEARCH_FIELD[] = {
109 "name", // Search by Name(default)
110 "number", // Search by Phone Number
111 "sound", // Search by phonetic sound
114 static char *g_pbap_session_path = NULL;
115 static char *g_pbap_server_address = NULL;
116 static GDBusConnection *dbus_connection = NULL;
117 static GDBusProxy *g_pbap_proxy = NULL;
122 } selected_path = { -1, -1};
131 } bt_pbap_operation_e;
134 bt_pbap_operation_e operation;
143 bt_pbap_operation_e operation;
144 } bt_pbap_transfer_info_t;
146 static GSList *transfers;
148 int __bt_pbap_call_get_phonebook_size(GDBusProxy *proxy, bt_pbap_data_t *pbap_data);
149 int __bt_pbap_call_get_phonebook(GDBusProxy *proxy, bt_pbap_data_t *pbap_data);
150 int __bt_pbap_call_get_vcards_list(GDBusProxy *proxy, bt_pbap_data_t *pbap_data);
151 int __bt_pbap_call_get_vcard(GDBusProxy *proxy, bt_pbap_data_t *pbap_data);
152 int __bt_pbap_call_search_phonebook(GDBusProxy *proxy, bt_pbap_data_t *pbap_data);
154 static void __bt_pbap_free_data(bt_pbap_data_t *pbap_data)
156 g_free(pbap_data->app_param);
157 g_free(pbap_data->data);
161 static bt_pbap_transfer_info_t *__bt_find_transfer_by_path(const char *transfer_path)
164 bt_pbap_transfer_info_t *transfer;
166 retv_if(transfer_path == NULL, NULL);
168 for (l = transfers; l != NULL; l = l->next) {
171 if (transfer == NULL)
174 if (g_strcmp0(transfer->path, transfer_path) == 0)
181 static void __bt_free_transfer_info(bt_pbap_transfer_info_t *transfer_info)
183 ret_if(transfer_info == NULL);
185 g_free(transfer_info->path);
186 g_free(transfer_info->filename);
187 g_free(transfer_info->remote_device);
188 g_free(transfer_info);
191 void _bt_pbap_obex_transfer_completed(const char *transfer_path, gboolean transfer_status)
193 bt_pbap_transfer_info_t *transfer_info;
195 int success = transfer_status;
196 GVariant *signal = NULL;
197 BT_DBG("Transfer [%s] Success [%d] \n", transfer_path, success);
199 result = (success == TRUE) ? BLUETOOTH_ERROR_NONE
200 : BLUETOOTH_ERROR_INTERNAL;
202 transfer_info = __bt_find_transfer_by_path(transfer_path);
203 ret_if(transfer_info == NULL);
205 BT_DBG("Remote Device [%s] FileName: [%s] Operation[%d]",
206 transfer_info->remote_device, transfer_info->filename,
207 transfer_info->operation);
209 signal = g_variant_new("(issi)", result,
210 transfer_info->remote_device,
211 transfer_info->filename, success);
212 switch(transfer_info->operation) {
214 _bt_send_event(BT_PBAP_CLIENT_EVENT,
215 BLUETOOTH_PBAP_PHONEBOOK_PULL,
220 _bt_send_event(BT_PBAP_CLIENT_EVENT,
221 BLUETOOTH_PBAP_VCARD_PULL,
226 BT_INFO("Case not handled");
231 transfers = g_slist_remove(transfers, transfer_info);
232 __bt_free_transfer_info(transfer_info);
235 void _bt_obex_pbap_client_disconnect(char *path)
237 if (g_strcmp0(g_pbap_session_path, path) == 0) {
238 int result = BLUETOOTH_ERROR_NONE;
239 GVariant *signal = g_variant_new("(is)", result,
240 g_pbap_server_address);
242 _bt_send_event(BT_PBAP_CLIENT_EVENT,
243 BLUETOOTH_PBAP_DISCONNECTED,
246 g_free(g_pbap_session_path);
247 g_pbap_session_path = NULL;
249 g_free(g_pbap_server_address);
250 g_pbap_server_address = NULL;
252 g_object_unref(g_pbap_proxy);
255 selected_path.folder = -1;
256 selected_path.type = -1;
261 void __bt_pbap_connect_cb(GDBusProxy *proxy,
262 GAsyncResult *res, gpointer user_data)
264 char *session_path = NULL;
265 char *address_string = user_data;
266 GError *error = NULL;
268 GVariant *signal = NULL;
269 int result = BLUETOOTH_ERROR_INTERNAL;
271 value = g_dbus_proxy_call_finish(proxy, res, &error);
272 BT_DBG("Address = %s", address_string);
275 BT_ERR("g_dbus_proxy_call_finish failed");
277 BT_ERR("errCode[%x], message[%s]\n",
278 error->code, error->message);
279 g_clear_error(&error);
281 g_object_unref(g_pbap_proxy);
284 g_variant_get(value, "(&o)", &session_path);
286 g_pbap_session_path = g_strdup(session_path);
287 BT_DBG("Session Path = %s\n", g_pbap_session_path);
288 result = BLUETOOTH_ERROR_NONE;
289 g_pbap_server_address = g_strdup(address_string);
292 signal = g_variant_new("(is)", result, address_string);
294 _bt_send_event(BT_PBAP_CLIENT_EVENT,
295 BLUETOOTH_PBAP_CONNECTED,
298 g_free(address_string);
302 int _bt_pbap_connect(const bluetooth_device_address_t *address)
305 GError *error = NULL;
306 char address_string[18] = { 0, };
308 GVariantBuilder builder;
311 BT_CHECK_PARAMETER(address, return);
313 /* check if already connected */
314 if (g_pbap_session_path)
315 return BLUETOOTH_ERROR_ALREADY_CONNECT;
317 BT_DBG("BD Address [%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X]",
318 address->addr[0], address->addr[1],
319 address->addr[2], address->addr[3],
320 address->addr[4], address->addr[5]);
322 _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr);
323 BT_DBG("Address String: %s", address_string);
324 dbus_connection = _bt_get_session_gconn();
325 if (dbus_connection == NULL) {
326 BT_ERR("Couldn't connect to system bus");
330 g_pbap_proxy = g_dbus_proxy_new_sync(dbus_connection,
331 G_DBUS_PROXY_FLAGS_NONE, NULL,
332 PBAP_OBEX_CLIENT_SERVICE, PBAP_OBEX_CLIENT_PATH,
333 PBAP_OBEX_CLIENT_INTERFACE, NULL, &error);
335 BT_ERR("Failed to get a proxy for D-Bus\n");
337 ERR("Unable to create proxy: %s", error->message);
338 g_clear_error(&error);
344 g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
345 g_variant_builder_add(&builder, "{sv}", "Target",
346 g_variant_new("s", "pbap"));
347 args = g_variant_builder_end(&builder);
349 ptr = g_strdup(address_string);
351 GVariant *temp = g_variant_new("(s@a{sv})", ptr, args);
353 g_dbus_proxy_call(g_pbap_proxy, "CreateSession",
355 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
356 (GAsyncReadyCallback)__bt_pbap_connect_cb, ptr);
363 void __bt_pbap_disconnect_cb(GDBusProxy *proxy,
364 GAsyncResult *res, gpointer user_data)
366 char *address_string = user_data;
367 GError *error = NULL;
369 GVariant *signal = NULL;
370 int result = BLUETOOTH_ERROR_INTERNAL ;
372 BT_DBG("Address = %s", address_string);
374 value = g_dbus_proxy_call_finish(proxy, res, &error);
375 BT_DBG("Address = %s", address_string);
378 BT_ERR("g_dbus_proxy_call_finish failed");
380 BT_ERR("errCode[%x], message[%s]\n",
381 error->code, error->message);
382 g_clear_error(&error);
385 g_object_unref(g_pbap_proxy);
388 g_free(g_pbap_session_path);
389 g_pbap_session_path = NULL;
391 g_free(g_pbap_server_address);
392 g_pbap_server_address = NULL;
394 result = BLUETOOTH_ERROR_NONE;
395 selected_path.folder = -1;
396 selected_path.type = -1;
399 signal = g_variant_new("(is)", result, address_string);
400 _bt_send_event(BT_PBAP_CLIENT_EVENT,
401 BLUETOOTH_PBAP_DISCONNECTED,
404 g_free(address_string);
408 int _bt_pbap_disconnect(const bluetooth_device_address_t *address)
411 char address_string[18] = { 0, };
413 BT_CHECK_PARAMETER(address, return);
415 /* check if connected */
416 if (g_pbap_session_path == NULL)
417 return BLUETOOTH_ERROR_NOT_CONNECTED;
419 BT_DBG("BD Address [%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X]",
420 address->addr[0], address->addr[1],
421 address->addr[2], address->addr[3],
422 address->addr[4], address->addr[5]);
424 _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr);
425 BT_DBG("Address String: %s", address_string);
426 BT_DBG("Session Path: %s", g_pbap_session_path);
428 ptr = g_strdup(address_string);
430 g_dbus_proxy_call(g_pbap_proxy, "RemoveSession",
431 g_variant_new("(o)", g_pbap_session_path),
432 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
433 (GAsyncReadyCallback)__bt_pbap_disconnect_cb, ptr);
438 void __bt_pbap_select_cb(GDBusProxy *proxy,
439 GAsyncResult *res, gpointer user_data)
442 GError *error = NULL;
444 bt_pbap_data_t *pbap_data = user_data;
445 char *address_string = pbap_data->data;
447 BT_DBG("Address = %s", address_string);
449 value = g_dbus_proxy_call_finish(proxy, res, &error);
451 BT_ERR("g_dbus_proxy_call_finish failed");
453 BT_ERR("errCode[%x], message[%s]\n",
454 error->code, error->message);
455 g_clear_error(&error);
458 selected_path.folder = -1;
459 selected_path.type = -1;
461 g_object_unref(proxy);
462 __bt_pbap_free_data(pbap_data);
466 switch (pbap_data->operation) {
468 __bt_pbap_call_get_phonebook_size(proxy, pbap_data);
472 __bt_pbap_call_get_phonebook(proxy, pbap_data);
476 __bt_pbap_call_get_vcards_list(proxy, pbap_data);
480 __bt_pbap_call_get_vcard(proxy, pbap_data);
484 __bt_pbap_call_search_phonebook(proxy, pbap_data);
488 selected_path.folder = -1;
489 selected_path.type = -1;
490 g_object_unref(proxy);
491 __bt_pbap_free_data(pbap_data);
495 g_variant_unref(value);
500 void __bt_pbap_get_phonebook_size_cb(GDBusProxy *proxy,
501 GAsyncResult *res, gpointer user_data)
504 GError *error = NULL;
505 int result = BLUETOOTH_ERROR_INTERNAL;
506 bt_pbap_data_t *pbap_data = user_data;
507 char *address_string = pbap_data->data;
508 unsigned short int size = 0;
510 GVariant *signal = NULL;
512 BT_DBG("Address = %s", address_string);
513 value = g_dbus_proxy_call_finish(proxy, res, &error);
516 BT_ERR("g_dbus_proxy_call_finish failed");
518 BT_ERR("errCode[%x], message[%s]\n",
519 error->code, error->message);
520 g_clear_error(&error);
523 g_variant_get(value, "(q)", &size);
524 result = BLUETOOTH_ERROR_NONE;
527 BT_DBG("Size of Phonebook: %d", size);
529 signal = g_variant_new("(isi)", result, address_string, size);
530 _bt_send_event(BT_PBAP_CLIENT_EVENT,
531 BLUETOOTH_PBAP_PHONEBOOK_SIZE,
534 g_variant_unref(value);
535 g_object_unref(proxy);
536 __bt_pbap_free_data(pbap_data);
540 void __bt_pbap_get_phonebook_cb(GDBusProxy *proxy,
541 GAsyncResult *res, gpointer user_data)
544 GError *error = NULL;
545 bt_pbap_data_t *pbap_data = user_data;
546 char *address_string = pbap_data->data;
547 bt_pbap_transfer_info_t *transfer_info;
548 char *transfer = NULL;
549 const gchar *filename = NULL;
551 GVariant *properties;
553 BT_DBG("Address = %s", address_string);
554 value = g_dbus_proxy_call_finish(proxy, res, &error);
556 BT_ERR("g_dbus_proxy_call_finish failed");
558 BT_ERR("errCode[%x], message[%s]\n",
559 error->code, error->message);
560 g_clear_error(&error);
563 g_variant_get(value, "(o@a{sv})", &transfer, &properties);
565 if (g_variant_lookup(properties, "Filename", "s", &filename) == FALSE)
568 BT_DBG("Transfer Path: %s", transfer);
569 BT_DBG("File Name: %s", filename);
570 transfer_info = g_new0(bt_pbap_transfer_info_t, 1);
571 transfer_info->path = transfer;
572 transfer_info->remote_device = g_strdup(address_string);
573 transfer_info->filename = (char *)filename;
574 transfer_info->operation = PULL_ALL;
575 transfers = g_slist_append(transfers, transfer_info);
578 g_object_unref(proxy);
579 __bt_pbap_free_data(pbap_data);
583 void __bt_pbap_get_vcard_list_cb(GDBusProxy *proxy,
584 GAsyncResult *res, gpointer user_data)
587 GError *error = NULL;
589 int result = BLUETOOTH_ERROR_INTERNAL;
590 bt_pbap_data_t *pbap_data = user_data;
591 char *address_string = pbap_data->data;
592 char **vcard_list = NULL;
593 char list_entry[PBAP_VCARDLIST_MAXLENGTH] = { 0, };
596 GVariant *signal = NULL;
598 value = g_dbus_proxy_call_finish(proxy, res, &error);
600 BT_ERR("g_dbus_proxy_call_finish failed");
602 BT_ERR("errCode[%x], message[%s]\n",
603 error->code, error->message);
604 g_clear_error(&error);
607 result = BLUETOOTH_ERROR_NONE;
608 gchar *elname, *elval;
611 GVariant *child = NULL;
612 GVariant *value1 = NULL;
614 g_variant_get(value ,"(@a(ss))", &value1); /* Format for value1 a(ss)*/
615 gsize items = g_variant_iter_init (&iter, value1);
616 vcard_list = g_new0(char *, items + 1);
618 for (i = 0; (child = g_variant_iter_next_value (&iter)) != NULL; i++) {
619 g_variant_get(child ,"(&s&s)", &elname, &elval);
621 memset(list_entry, 0, PBAP_VCARDLIST_MAXLENGTH);
622 g_snprintf (list_entry, PBAP_VCARDLIST_MAXLENGTH - 1,
623 "<card handle = \"%s\" name = \"%s\"/>", elname, elval);
624 //If possible send as Array of <STRING, STRING>
625 BT_DBG("%s", list_entry);
626 vcard_list[i] = g_strdup(list_entry);
627 g_variant_unref(child);
631 g_variant_unref(value1);
632 g_variant_unref(value);
635 BT_DBG("Address = %s", address_string);
636 GVariant *temp = g_variant_new_strv((const gchar * const*)vcard_list, length);
637 signal = g_variant_new("(isv)", result, address_string, temp);
639 _bt_send_event(BT_PBAP_CLIENT_EVENT,
640 BLUETOOTH_PBAP_VCARD_LIST,
643 for (i = 0; i < length; i++)
644 g_free(vcard_list[i]);
647 g_object_unref(proxy);
648 __bt_pbap_free_data(pbap_data);
652 void __bt_pbap_get_vcard_cb(GDBusProxy *proxy,
653 GAsyncResult *res, gpointer user_data)
656 GError *error = NULL;
657 bt_pbap_data_t *pbap_data = user_data;
658 char *address_string = pbap_data->data;
659 bt_pbap_transfer_info_t *transfer_info;
660 char *transfer = NULL;
661 const gchar *filename = NULL;
663 GVariant *properties;
665 BT_DBG("Address = %s", address_string);
666 value = g_dbus_proxy_call_finish(proxy, res, &error);
668 BT_ERR("g_dbus_proxy_call_finish failed");
670 BT_ERR("errCode[%x], message[%s]\n",
671 error->code, error->message);
672 g_clear_error(&error);
675 g_variant_get(value, "(o@a{sv})", &transfer, &properties);
677 if (g_variant_lookup (properties, "Filename", "s", &filename) == FALSE)
680 BT_DBG("Transfer Path: %s", transfer);
681 BT_DBG("File Name: %s", filename);
682 transfer_info = g_new0(bt_pbap_transfer_info_t, 1);
683 transfer_info->path = transfer;
684 transfer_info->remote_device = g_strdup(address_string);
685 transfer_info->filename = (char *)filename;
686 transfer_info->operation = GET_VCARD;
687 transfers = g_slist_append(transfers, transfer_info);
689 g_variant_unref(properties);
690 g_variant_unref(value);
693 g_object_unref(proxy);
694 __bt_pbap_free_data(pbap_data);
698 void __bt_pbap_search_phonebook_cb(GDBusProxy *proxy,
699 GAsyncResult *res, gpointer user_data)
702 GError *error = NULL;
704 bt_pbap_data_t *pbap_data = user_data;
705 char *address_string = pbap_data->data;
706 char **vcard_list = NULL;
707 char list_entry[PBAP_VCARDLIST_MAXLENGTH] = { 0, };
709 int result = BLUETOOTH_ERROR_INTERNAL;
711 GVariant *signal = NULL;
713 value = g_dbus_proxy_call_finish(proxy, res, &error);
715 BT_ERR("g_dbus_proxy_call_finish failed");
717 BT_ERR("errCode[%x], message[%s]\n",
718 error->code, error->message);
719 g_clear_error(&error);
722 result = BLUETOOTH_ERROR_NONE;
723 gchar *elname, *elval;
726 GVariant *child = NULL;
727 GVariant *value1 = NULL;
729 g_variant_get(value ,"(@a(ss))", &value1);
730 gsize items = g_variant_iter_init (&iter, value1);
731 vcard_list = g_new0(char *, items + 1);
733 for (i = 0; (child = g_variant_iter_next_value (&iter)) != NULL; i++) {
734 g_variant_get(child, "(&s&s)", &elname, &elval);
736 memset(list_entry, 0, PBAP_VCARDLIST_MAXLENGTH);
737 g_snprintf (list_entry, PBAP_VCARDLIST_MAXLENGTH - 1,
738 "<card handle = \"%s\" name = \"%s\"/>", elname, elval);
739 //If possible send as Array of <STRING, STRING>
740 BT_DBG("%s", list_entry);
741 vcard_list[i] = g_strdup(list_entry);
743 g_variant_unref(child);
746 g_variant_unref(value1);
747 g_variant_unref(value);
750 BT_DBG("Address = %s", address_string);
752 signal = g_variant_new("(is@as)", result, address_string,
753 g_variant_new_strv((const gchar * const*)vcard_list, length));
755 _bt_send_event(BT_PBAP_CLIENT_EVENT,
756 BLUETOOTH_PBAP_PHONEBOOK_SEARCH,
759 for (i = 0; i < length; i++)
760 g_free(vcard_list[i]);
763 g_object_unref(proxy);
764 __bt_pbap_free_data(pbap_data);
768 int __bt_pbap_call_get_phonebook_size(GDBusProxy *proxy, bt_pbap_data_t *pbap_data)
772 g_dbus_proxy_call(proxy, "GetSize",
773 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL,
774 (GAsyncReadyCallback)__bt_pbap_get_phonebook_size_cb,
778 return BLUETOOTH_ERROR_NONE;
781 int __bt_pbap_call_get_phonebook(GDBusProxy *proxy, bt_pbap_data_t *pbap_data)
785 char *format_str = NULL;
786 char *order_str = NULL;
787 char *target_file = "/opt/usr/media/Downloads/pb.vcf";
788 bt_pbap_pull_parameters_t *app_param = pbap_data->app_param;
789 GVariantBuilder builder;
792 g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
794 /* Add MaxlistCount*/
795 g_variant_builder_add(&builder, "{sv}", "MaxCount",
796 g_variant_new("u",app_param->maxlist));
798 /* Add Order Filter only if other than Indexed (default)*/
799 if (app_param->order > 0) {
800 order_str = g_strdup(ORDER[app_param->order]);
801 g_variant_builder_add(&builder, "{sv}", "Order",
802 g_variant_new("s",order_str));
805 /* Add Offset Filter only if other than 0 (default)*/
806 if (app_param->offset > 0) {
807 g_variant_builder_add(&builder, "{sv}", "Offset",
808 g_variant_new("u",app_param->offset));
811 /* Add Format Filter only if other than vCard 2.1 (default)*/
812 if (app_param->format > 0) {
813 format_str = g_strdup(FORMAT[app_param->format]);
814 g_variant_builder_add(&builder, "{sv}", "Format",
815 g_variant_new("s", format_str));
818 filters = g_variant_builder_end(&builder);
820 //****************************
821 // Add code for Fields
823 //****************************
825 g_dbus_proxy_call(proxy, "PullAll",
826 g_variant_new("(s@a{sv})", target_file, filters),
827 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
828 (GAsyncReadyCallback)__bt_pbap_get_phonebook_cb,
833 g_hash_table_destroy(filters);
836 return BLUETOOTH_ERROR_NONE;
839 int __bt_pbap_call_get_vcards_list(GDBusProxy *proxy, bt_pbap_data_t *pbap_data)
842 char *order_str = NULL;
844 GVariantBuilder builder;
847 bt_pbap_list_parameters_t *app_param = pbap_data->app_param;
849 g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
851 /* Add MaxlistCount*/
852 g_variant_builder_add(&builder, "{sv}", "MaxCount",
853 g_variant_new("u",app_param->maxlist));
855 /* Add Order Filter only if other than Indexed (default)*/
856 if (app_param->order > 0) {
857 order_str = g_strdup(ORDER[app_param->order]);
858 g_variant_builder_add(&builder, "{sv}", "Order",
859 g_variant_new("s",order_str));
862 /* Add Offset Filter only if other than 0 (default)*/
863 if (app_param->offset > 0) {
864 g_variant_builder_add(&builder, "{sv}", "Offset",
865 g_variant_new("u",app_param->offset));
868 filters = g_variant_builder_end(&builder);
870 folder = g_strdup(TYPE[selected_path.type]);
871 BT_DBG("Folder: %s", folder);
874 g_dbus_proxy_call(proxy, "List",
875 g_variant_new("(s@a{sv})", folder, filters),
876 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
877 (GAsyncReadyCallback)__bt_pbap_get_vcard_list_cb,
882 g_hash_table_unref(filters);
885 return BLUETOOTH_ERROR_NONE;
888 int __bt_pbap_call_get_vcard(GDBusProxy *proxy, bt_pbap_data_t *pbap_data)
892 char *format_str = NULL;
893 char *target_file = "/opt/usr/media/Downloads/pb.vcf";
894 char *vcard_handle = NULL;
895 char vcard[10] = { 0, };
896 GVariantBuilder builder;
898 bt_pbap_pull_vcard_parameters_t *app_param = pbap_data->app_param;
900 g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
902 /* Add Format Filter only if other than vCard 2.1 (default)*/
903 // if (app_param->format > 0) {
904 format_str = g_strdup(FORMAT[app_param->format]);
905 g_variant_builder_add(&builder, "{sv}", "Format",
906 g_variant_new("s", format_str));
908 filters = g_variant_builder_end(&builder);
910 //****************************
911 // Add code for Fields
913 //****************************
915 sprintf(vcard, "%d.vcf", app_param->index);
916 BT_DBG("Handle: %s", vcard);
917 vcard_handle = g_strdup(vcard);
918 BT_DBG("vcard_handle: %s", vcard_handle);
919 GVariant *temp = g_variant_new("(ss@a{sv})", vcard_handle, target_file, filters);
921 g_dbus_proxy_call(proxy, "Pull",
923 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
924 (GAsyncReadyCallback)__bt_pbap_get_vcard_cb,
928 g_free(vcard_handle);
929 g_hash_table_destroy(filters);
932 return BLUETOOTH_ERROR_NONE;
935 int __bt_pbap_call_search_phonebook(GDBusProxy *proxy, bt_pbap_data_t *pbap_data)
939 char *order_str = NULL;
942 bt_pbap_search_parameters_t *app_param = pbap_data->app_param;
943 GVariantBuilder builder;
946 g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
948 /* Add MaxlistCount*/
949 g_variant_builder_add(&builder, "{sv}", "MaxCount",
950 g_variant_new("u",app_param->maxlist));
952 /* Add Order Filter only if other than Indexed (default)*/
953 if (app_param->order > 0) {
954 order_str = g_strdup(ORDER[app_param->order]);
955 g_variant_builder_add(&builder, "{sv}", "Order",
956 g_variant_new("s",order_str));
959 /* Add Offset Filter only if other than 0 (default)*/
960 if (app_param->offset > 0) {
961 g_variant_builder_add(&builder, "{sv}", "Offset",
962 g_variant_new("u",app_param->offset));
965 filters = g_variant_builder_end(&builder);
967 field = g_strdup(SEARCH_FIELD[app_param->search_attribute]);
968 value = g_strdup(app_param->search_value);
970 g_dbus_proxy_call(proxy, "Search",
971 g_variant_new("(ss@a{sv})", field, value, filters),
972 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
973 (GAsyncReadyCallback)__bt_pbap_search_phonebook_cb,
979 g_hash_table_destroy(filters);
982 return BLUETOOTH_ERROR_NONE;
985 int _bt_pbap_get_phonebook_size(const bluetooth_device_address_t *address,
986 int source, int type)
989 GDBusProxy *g_pbap_session_proxy = NULL;
990 char address_string[18] = { 0, };
991 char *source_string = NULL;
992 char *type_string = NULL;
994 bt_pbap_data_t *pbap_data = NULL;
996 BT_CHECK_PARAMETER(address, return);
998 /* check if connected */
999 if (g_pbap_session_path == NULL) {
1000 BT_ERR("NOT CONNECTED");
1001 return BLUETOOTH_ERROR_NOT_CONNECTED;
1004 BT_DBG("BD Address [%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X]",
1005 address->addr[0], address->addr[1],
1006 address->addr[2], address->addr[3],
1007 address->addr[4], address->addr[5]);
1009 _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr);
1010 BT_DBG("Address String: %s", address_string);
1011 source_string = g_strdup(SOURCE[source]);
1012 type_string = g_strdup(TYPE[type]);
1014 BT_DBG("Address[%s] Source[%s] Type[%s]",
1015 address_string, source_string, type_string);
1016 BT_DBG("Session Path = %s\n", g_pbap_session_path);
1017 g_pbap_session_proxy = g_dbus_proxy_new_sync(dbus_connection,
1018 G_DBUS_PROXY_FLAGS_NONE, NULL,
1019 PBAP_SESSION_SERVICE, g_pbap_session_path,
1020 PBAP_SESSION_INTERFACE, NULL, &err);
1022 if (!g_pbap_session_proxy) {
1023 BT_ERR("Failed to get a proxy for D-Bus\n");
1025 ERR("Unable to create proxy: %s", err->message);
1026 g_clear_error(&err);
1028 g_free(source_string);
1029 g_free(type_string);
1033 BT_DBG("Prepare PBAP data");
1034 pbap_data = g_new0(bt_pbap_data_t, 1);
1035 pbap_data->operation = GET_SIZE;
1036 pbap_data->data = g_strdup(address_string);
1038 if (source == selected_path.folder && type == selected_path.type) {
1039 BT_DBG("Call get_phonebook_size directly");
1040 g_free(source_string);
1041 g_free(type_string);
1042 return __bt_pbap_call_get_phonebook_size(g_pbap_session_proxy, pbap_data);
1045 BT_DBG("Call SELECT");
1046 g_dbus_proxy_call(g_pbap_session_proxy, "Select",
1047 g_variant_new("(ss)", source_string, type_string),
1048 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
1049 (GAsyncReadyCallback)__bt_pbap_select_cb,
1052 BT_DBG("Set Folders");
1053 selected_path.folder = source;
1054 selected_path.type = type;
1056 g_free(source_string);
1057 g_free(type_string);
1061 int _bt_pbap_get_phonebook(const bluetooth_device_address_t *address,
1062 int source, int type, bt_pbap_pull_parameters_t *app_param)
1065 GDBusProxy *g_pbap_session_proxy = NULL;
1066 char address_string[18] = { 0, };
1067 char *source_string = NULL;
1068 char *type_string = NULL;
1071 bt_pbap_data_t *pbap_data = NULL;
1072 bt_pbap_pull_parameters_t *param = NULL;
1074 BT_CHECK_PARAMETER(address, return);
1076 /* check if connected */
1077 if (g_pbap_session_path == NULL) {
1078 BT_ERR("NOT CONNECTED");
1079 return BLUETOOTH_ERROR_NOT_CONNECTED;
1082 BT_DBG("BD Address [%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X]",
1083 address->addr[0], address->addr[1],
1084 address->addr[2], address->addr[3],
1085 address->addr[4], address->addr[5]);
1087 _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr);
1088 BT_DBG("Address String: %s", address_string);
1090 source_string = g_strdup(SOURCE[source]);
1091 type_string = g_strdup(TYPE[type]);
1093 BT_DBG("Address[%s] Source[%s] Type[%s]",
1094 address_string, source_string, type_string);
1096 BT_DBG("Session Path = %s\n", g_pbap_session_path);
1097 g_pbap_session_proxy = g_dbus_proxy_new_sync(dbus_connection,
1098 G_DBUS_PROXY_FLAGS_NONE, NULL,
1099 PBAP_SESSION_SERVICE, g_pbap_session_path,
1100 PBAP_SESSION_INTERFACE, NULL, &err);
1102 if (!g_pbap_session_proxy) {
1103 BT_ERR("Failed to get a proxy for D-Bus\n");
1105 ERR("Unable to create proxy: %s", err->message);
1106 g_clear_error(&err);
1108 g_free(source_string);
1109 g_free(type_string);
1113 pbap_data = g_new0(bt_pbap_data_t, 1);
1114 pbap_data->operation = PULL_ALL;
1115 pbap_data->data = g_strdup(address_string);
1116 param = g_new0(bt_pbap_pull_parameters_t, 1);
1117 memcpy(param, app_param, sizeof(bt_pbap_pull_parameters_t));
1118 pbap_data->app_param = param;
1120 if (source == selected_path.folder && type == selected_path.type) {
1121 return __bt_pbap_call_get_phonebook(g_pbap_session_proxy, pbap_data);
1124 g_dbus_proxy_call(g_pbap_session_proxy, "Select",
1125 g_variant_new("(ss)", source_string, type_string),
1126 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
1127 (GAsyncReadyCallback)__bt_pbap_select_cb,
1130 selected_path.folder = source;
1131 selected_path.type = type;
1132 g_free(source_string);
1133 g_free(type_string);
1138 int _bt_pbap_get_list(const bluetooth_device_address_t *address, int source,
1139 int type, bt_pbap_list_parameters_t *app_param)
1142 GDBusProxy *g_pbap_session_proxy = NULL;
1143 char address_string[18] = { 0, };
1144 char *source_string = NULL;
1145 char *type_string = NULL;
1148 bt_pbap_data_t *pbap_data = NULL;
1149 bt_pbap_list_parameters_t *param = NULL;
1151 BT_CHECK_PARAMETER(address, return);
1153 /* check if connected */
1154 if (g_pbap_session_path == NULL) {
1155 BT_ERR("NOT CONNECTED");
1156 return BLUETOOTH_ERROR_NOT_CONNECTED;
1159 BT_DBG("BD Address [%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X]",
1160 address->addr[0], address->addr[1],
1161 address->addr[2], address->addr[3],
1162 address->addr[4], address->addr[5]);
1164 _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr);
1165 BT_DBG("Address String: %s", address_string);
1167 source_string = g_strdup(SOURCE[source]);
1168 type_string = g_strdup("nil");
1170 BT_DBG("Address[%s] Source[%s] Type[%s]",
1171 address_string, source_string, type_string);
1173 BT_DBG("Session Path = %s\n", g_pbap_session_path);
1174 g_pbap_session_proxy = g_dbus_proxy_new_sync(dbus_connection,
1175 G_DBUS_PROXY_FLAGS_NONE, NULL,
1176 PBAP_SESSION_SERVICE, g_pbap_session_path,
1177 PBAP_SESSION_INTERFACE, NULL, &err);
1179 if (!g_pbap_session_proxy) {
1180 BT_ERR("Failed to get a proxy for D-Bus\n");
1182 ERR("Unable to create proxy: %s", err->message);
1183 g_clear_error(&err);
1185 g_free(source_string);
1186 g_free(type_string);
1190 BT_DBG("Set PBAP Data");
1191 pbap_data = g_new0(bt_pbap_data_t, 1);
1192 pbap_data->operation = GET_LIST;
1193 pbap_data->data = g_strdup(address_string);
1194 param = g_new0(bt_pbap_list_parameters_t, 1);
1195 memcpy(param, app_param, sizeof(bt_pbap_list_parameters_t));
1196 pbap_data->app_param = param;
1198 /* Always Call Select for vCardListing
1199 if (source == selected_path.folder && type == selected_path.type) {
1200 BT_DBG("Call Directly");
1201 return __bt_pbap_call_get_vcards_list(g_pbap_session_proxy, pbap_data);
1203 BT_DBG("Call SELECT");
1204 g_dbus_proxy_call(g_pbap_session_proxy, "Select",
1205 g_variant_new("(ss)", source_string, type_string),
1206 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
1207 (GAsyncReadyCallback)__bt_pbap_select_cb,
1209 BT_DBG("Set Folders");
1210 selected_path.folder = source;
1211 selected_path.type = type;
1212 g_free(source_string);
1213 g_free(type_string);
1219 int _bt_pbap_pull_vcard(const bluetooth_device_address_t *address,
1220 int source, int type, bt_pbap_pull_vcard_parameters_t *app_param)
1223 GDBusProxy *g_pbap_session_proxy = NULL;
1224 char address_string[18] = { 0, };
1225 char *source_string = NULL;
1226 char *type_string = NULL;
1227 bt_pbap_data_t *pbap_data = NULL;
1228 bt_pbap_pull_vcard_parameters_t *param = NULL;
1231 BT_CHECK_PARAMETER(address, return);
1233 /* check if connected */
1234 if (g_pbap_session_path == NULL) {
1235 BT_ERR("NOT CONNECTED");
1236 return BLUETOOTH_ERROR_NOT_CONNECTED;
1239 BT_DBG("BD Address [%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X]",
1240 address->addr[0], address->addr[1],
1241 address->addr[2], address->addr[3],
1242 address->addr[4], address->addr[5]);
1244 _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr);
1245 BT_DBG("Address String: %s", address_string);
1247 source_string = g_strdup(SOURCE[source]);
1248 type_string = g_strdup(TYPE[type]);
1250 BT_DBG("Address[%s] Source[%s] Type[%s]",
1251 address_string, source_string, type_string);
1253 BT_DBG("Session Path = %s\n", g_pbap_session_path);
1254 g_pbap_session_proxy = g_dbus_proxy_new_sync(dbus_connection,
1255 G_DBUS_PROXY_FLAGS_NONE, NULL,
1256 PBAP_SESSION_SERVICE, g_pbap_session_path,
1257 PBAP_SESSION_INTERFACE, NULL, &err);
1259 if (!g_pbap_session_proxy) {
1260 BT_ERR("Failed to get a proxy for D-Bus\n");
1262 ERR("Unable to create proxy: %s", err->message);
1263 g_clear_error(&err);
1268 pbap_data = g_new0(bt_pbap_data_t, 1);
1269 pbap_data->operation = GET_VCARD;
1270 pbap_data->data = g_strdup(address_string);
1271 param = g_new0(bt_pbap_pull_vcard_parameters_t, 1);
1272 memcpy(param, app_param, sizeof(bt_pbap_pull_vcard_parameters_t));
1273 pbap_data->app_param = param;
1275 if (source == selected_path.folder && type == selected_path.type) {
1276 return __bt_pbap_call_get_vcard(g_pbap_session_proxy, pbap_data);
1279 g_dbus_proxy_call(g_pbap_session_proxy, "Select",
1280 g_variant_new("(ss)", source_string, type_string),
1281 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
1282 (GAsyncReadyCallback)__bt_pbap_select_cb,
1285 selected_path.folder = source;
1286 selected_path.type = type;
1287 g_free(source_string);
1288 g_free(type_string);
1293 int _bt_pbap_phonebook_search(const bluetooth_device_address_t *address,
1294 int source, int type, bt_pbap_search_parameters_t *app_param)
1297 GDBusProxy *g_pbap_session_proxy = NULL;
1298 char address_string[18] = { 0, };
1299 char *source_string = NULL;
1300 char *type_string = NULL;
1301 bt_pbap_data_t *pbap_data = NULL;
1302 bt_pbap_search_parameters_t *param = NULL;
1305 BT_CHECK_PARAMETER(address, return);
1307 /* check if connected */
1308 if (g_pbap_session_path == NULL) {
1309 BT_ERR("NOT CONNECTED");
1310 return BLUETOOTH_ERROR_NOT_CONNECTED;
1313 BT_DBG("BD Address [%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X]",
1314 address->addr[0], address->addr[1],
1315 address->addr[2], address->addr[3],
1316 address->addr[4], address->addr[5]);
1318 _bt_convert_addr_type_to_string(address_string, (unsigned char *)address->addr);
1319 BT_DBG("Address String: %s", address_string);
1321 source_string = g_strdup(SOURCE[source]);
1322 type_string = g_strdup("nil");
1324 BT_DBG("Address[%s] Source[%s] Type[%s]",
1325 address_string, source_string, type_string);
1327 BT_DBG("Session Path = %s\n", g_pbap_session_path);
1329 g_pbap_session_proxy = g_dbus_proxy_new_sync(dbus_connection,
1330 G_DBUS_PROXY_FLAGS_NONE, NULL,
1331 PBAP_SESSION_SERVICE, g_pbap_session_path,
1332 PBAP_SESSION_INTERFACE, NULL, &err);
1334 if (!g_pbap_session_proxy) {
1335 BT_ERR("Failed to get a proxy for D-Bus\n");
1337 ERR("Unable to create proxy: %s", err->message);
1338 g_clear_error(&err);
1340 g_free(source_string);
1341 g_free(type_string);
1345 pbap_data = g_new0(bt_pbap_data_t, 1);
1346 pbap_data->operation = PB_SEARCH;
1347 pbap_data->data = g_strdup(address_string);
1348 param = g_new0(bt_pbap_search_parameters_t, 1);
1349 memcpy(param, app_param, sizeof(bt_pbap_search_parameters_t));
1350 pbap_data->app_param = param;
1352 /* Call Select for vCardListing
1353 if (source == selected_path.folder && type == selected_path.type) {
1354 return __bt_pbap_call_search_phonebook(g_pbap_session_proxy, pbap_data);
1357 g_dbus_proxy_call(g_pbap_session_proxy, "Select",
1358 g_variant_new("(ss)", source_string, type_string),
1359 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
1360 (GAsyncReadyCallback)__bt_pbap_select_cb,
1363 selected_path.folder = source;
1364 selected_path.type = type;
1366 g_free(source_string);
1367 g_free(type_string);