4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Hocheol Seo <hocheol.seo@samsung.com>
7 * Girishashok Joshi <girish.joshi@samsung.com>
8 * Chanyeol Park <chanyeol.park@samsung.com>
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
14 * http://www.apache.org/licenses/LICENSE-2.0
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
26 #include "bluetooth-api.h"
27 #include "bluetooth-audio-api.h"
28 #include "bt-internal-types.h"
30 #include "bt-common.h"
31 #include "bt-request-sender.h"
32 #include "bt-event-handler.h"
34 BT_EXPORT_API int bluetooth_audio_init(bt_audio_func_ptr cb, void *user_data)
39 BT_ERR("callback is NULL");
40 return BLUETOOTH_ERROR_INVALID_PARAM;
42 ret = _bt_init_event_handler();
44 if (ret != BLUETOOTH_ERROR_NONE &&
45 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
46 BT_ERR("Fail to init the event handler");
50 _bt_set_user_data(BT_AUDIO, (void *)cb, user_data);
52 /* Register All events */
53 ret = _bt_register_event(BT_HEADSET_EVENT, (void *)cb, user_data);
54 if (ret != BLUETOOTH_ERROR_NONE &&
55 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
56 _bt_deinit_event_handler();
60 return BLUETOOTH_ERROR_NONE;
63 BT_EXPORT_API int bluetooth_audio_deinit(void)
65 _bt_unregister_event(BT_HEADSET_EVENT);
67 _bt_set_user_data(BT_AUDIO, NULL, NULL);
69 return BLUETOOTH_ERROR_NONE;
72 BT_EXPORT_API int bluetooth_audio_connect(bluetooth_device_address_t *remote_address)
74 int service_function = BT_AUDIO_CONNECT;
76 bt_user_info_t *user_info;
78 BT_CHECK_PARAMETER(remote_address, return);
79 BT_CHECK_ENABLED(return);
81 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AUDIO_CONNECT)
82 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
83 BT_ERR("Don't have a privilege to use this API");
84 return BLUETOOTH_ERROR_PERMISSION_DEINED;
87 user_info = _bt_get_user_data(BT_AUDIO);
88 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
91 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
93 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
95 result = _bt_send_request_async(BT_BLUEZ_SERVICE, service_function,
96 in_param1, in_param2, in_param3, in_param4,
97 user_info->cb, user_info->user_data);
99 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
104 BT_EXPORT_API int bluetooth_audio_disconnect(bluetooth_device_address_t *remote_address)
107 bt_user_info_t *user_info;
109 BT_CHECK_PARAMETER(remote_address, return);
110 BT_CHECK_ENABLED(return);
112 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AUDIO_DISCONNECT)
113 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
114 BT_ERR("Don't have a privilege to use this API");
115 return BLUETOOTH_ERROR_PERMISSION_DEINED;
118 user_info = _bt_get_user_data(BT_AUDIO);
119 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
122 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
124 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
126 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_AUDIO_DISCONNECT,
127 in_param1, in_param2, in_param3, in_param4,
128 user_info->cb, user_info->user_data);
130 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
135 BT_EXPORT_API int bluetooth_ag_connect(bluetooth_device_address_t *remote_address)
138 bt_user_info_t *user_info;
140 BT_CHECK_PARAMETER(remote_address, return);
141 BT_CHECK_ENABLED(return);
143 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AG_CONNECT)
144 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
145 BT_ERR("Don't have a privilege to use this API");
146 return BLUETOOTH_ERROR_PERMISSION_DEINED;
149 user_info = _bt_get_user_data(BT_AUDIO);
150 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
153 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
155 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
157 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_AG_CONNECT,
158 in_param1, in_param2, in_param3, in_param4,
159 user_info->cb, user_info->user_data);
161 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
166 BT_EXPORT_API int bluetooth_ag_disconnect(bluetooth_device_address_t *remote_address)
169 bt_user_info_t *user_info;
171 BT_CHECK_PARAMETER(remote_address, return);
172 BT_CHECK_ENABLED(return);
174 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AG_DISCONNECT)
175 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
176 BT_ERR("Don't have a privilege to use this API");
177 return BLUETOOTH_ERROR_PERMISSION_DEINED;
180 user_info = _bt_get_user_data(BT_AUDIO);
181 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
184 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
186 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
188 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_AG_DISCONNECT,
189 in_param1, in_param2, in_param3, in_param4,
190 user_info->cb, user_info->user_data);
192 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
197 BT_EXPORT_API int bluetooth_av_connect(bluetooth_device_address_t *remote_address)
200 bt_user_info_t *user_info;
202 BT_CHECK_PARAMETER(remote_address, return);
203 BT_CHECK_ENABLED(return);
205 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AV_CONNECT)
206 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
207 BT_ERR("Don't have a privilege to use this API");
208 return BLUETOOTH_ERROR_PERMISSION_DEINED;
211 user_info = _bt_get_user_data(BT_AUDIO);
212 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
215 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
217 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
219 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_AV_CONNECT,
220 in_param1, in_param2, in_param3, in_param4,
221 user_info->cb, user_info->user_data);
223 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
228 BT_EXPORT_API int bluetooth_av_disconnect(bluetooth_device_address_t *remote_address)
231 bt_user_info_t *user_info;
233 BT_CHECK_PARAMETER(remote_address, return);
234 BT_CHECK_ENABLED(return);
236 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AV_DISCONNECT)
237 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
238 BT_ERR("Don't have a privilege to use this API");
239 return BLUETOOTH_ERROR_PERMISSION_DEINED;
242 user_info = _bt_get_user_data(BT_AUDIO);
243 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
246 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
248 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
250 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_AV_DISCONNECT,
251 in_param1, in_param2, in_param3, in_param4,
252 user_info->cb, user_info->user_data);
254 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
259 BT_EXPORT_API int bluetooth_ag_get_headset_volume(unsigned int *speaker_gain)
263 BT_CHECK_PARAMETER(speaker_gain, return);
264 BT_CHECK_ENABLED(return);
267 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
269 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_SPEAKER_GAIN,
270 in_param1, in_param2, in_param3, in_param4, &out_param);
272 if (result == BLUETOOTH_ERROR_NONE) {
273 *speaker_gain = g_array_index(out_param,
277 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
282 BT_EXPORT_API int bluetooth_ag_set_speaker_gain(unsigned int speaker_gain)
286 BT_CHECK_ENABLED(return);
289 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
291 g_array_append_vals(in_param1, &speaker_gain, sizeof(unsigned int));
293 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SPEAKER_GAIN,
294 in_param1, in_param2, in_param3, in_param4, &out_param);
296 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
301 #define BT_HF_SERVICE_NAME "org.bluez.hf_agent"
302 #define BT_HF_OBJECT_PATH "/org/bluez/handsfree_agent"
303 #define BT_HF_INTERFACE "org.tizen.HfApp"
306 static DBusMessage* __bt_hf_agent_dbus_send(const char *path,
307 const char *interface, const char *method, DBusError *err, int type, ...)
313 msg = dbus_message_new_method_call(BT_HF_SERVICE_NAME,
314 path, interface, method);
316 BT_ERR("Unable to allocate new D-Bus %s message \n", method);
320 va_start(args, type);
322 if (!dbus_message_append_args_valist(msg, type, args)) {
323 dbus_message_unref(msg);
330 dbus_error_init(err);
332 BT_DBG("DBus HF API call, method = %s", method);
334 reply = dbus_connection_send_with_reply_and_block(_bt_get_system_conn(),
336 dbus_message_unref(msg);
341 static int __bt_hf_agent_read_call_list(DBusMessage *reply,
342 bt_hf_call_list_s **call_list) {
344 DBusMessageIter iter;
345 DBusMessageIter iter_struct;
350 dbus_message_iter_init(reply, &iter);
351 dbus_message_iter_get_basic(&iter, &call_count);
352 if(call_count <= 0) {
354 return BLUETOOTH_ERROR_NOT_FOUND;
356 BT_DBG("Call count = %d", call_count);
358 *call_list = g_malloc0(sizeof(bt_hf_call_list_s));
359 (*call_list)->count = call_count;
360 dbus_message_iter_next(&iter);
361 dbus_message_iter_recurse(&iter, &iter_struct);
362 while(dbus_message_iter_get_arg_type(&iter_struct) ==
365 gchar *number = NULL;
366 bt_hf_call_status_info_t *call_info;
367 DBusMessageIter entry_iter;
369 call_info = g_malloc0(sizeof(bt_hf_call_status_info_t));
371 dbus_message_iter_recurse(&iter_struct,&entry_iter);
373 dbus_message_iter_get_basic(&entry_iter, &number);
374 call_info->number = g_strdup(number);
375 dbus_message_iter_next(&entry_iter);
376 dbus_message_iter_get_basic(&entry_iter, &call_info->direction);
377 dbus_message_iter_next(&entry_iter);
378 dbus_message_iter_get_basic(&entry_iter, &call_info->status);
379 dbus_message_iter_next(&entry_iter);
380 dbus_message_iter_get_basic(&entry_iter, &call_info->mpart);
381 dbus_message_iter_next(&entry_iter);
382 dbus_message_iter_get_basic(&entry_iter, &call_info->idx);
384 (*call_list)->list = g_list_append((*call_list)->list,
385 (gpointer)call_info);
386 dbus_message_iter_next(&iter_struct);
389 return BLUETOOTH_ERROR_NONE;
392 BT_EXPORT_API int bluetooth_hf_init(bt_hf_func_ptr cb, void *user_data)
397 BT_ERR("callback is NULL");
398 return BLUETOOTH_ERROR_INVALID_PARAM;
401 ret = dbus_threads_init_default();
404 BT_ERR("dbus_thread_init_default Success");
406 BT_ERR("dbus_thread_init_default Fail");
408 ret = _bt_init_event_handler();
410 if (ret != BLUETOOTH_ERROR_NONE &&
411 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
412 BT_ERR("Fail to init the event handler");
416 _bt_set_user_data(BT_HF, (void *)cb, user_data);
418 /* Register All events */
419 ret = _bt_register_event(BT_HF_AGENT_EVENT, (void *)cb, user_data);
420 if (ret != BLUETOOTH_ERROR_NONE &&
421 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
422 _bt_deinit_event_handler();
426 return BLUETOOTH_ERROR_NONE;
429 BT_EXPORT_API int bluetooth_hf_deinit(void)
433 ret = _bt_unregister_event(BT_HF_AGENT_EVENT);
434 if (ret != BLUETOOTH_ERROR_NONE )
435 BT_ERR("_bt_unregister_event failed");
437 _bt_set_user_data(BT_HF, NULL, NULL);
439 return BLUETOOTH_ERROR_NONE;
442 BT_EXPORT_API int bluetooth_hf_connect(bluetooth_device_address_t *remote_address)
445 bt_user_info_t *user_info;
447 BT_CHECK_ENABLED(return);
448 BT_CHECK_PARAMETER(remote_address, return);
450 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_HF_CONNECT)
451 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
452 BT_ERR("Don't have a privilege to use this API");
453 return BLUETOOTH_ERROR_PERMISSION_DEINED;
456 user_info = _bt_get_user_data(BT_HF);
457 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
460 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
462 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
464 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_HF_CONNECT,
465 in_param1, in_param2, in_param3, in_param4,
466 user_info->cb, user_info->user_data);
468 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
473 BT_EXPORT_API int bluetooth_hf_disconnect(bluetooth_device_address_t *remote_address)
476 bt_user_info_t *user_info;
478 BT_CHECK_PARAMETER(remote_address, return);
479 BT_CHECK_ENABLED(return);
481 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_HF_DISCONNECT)
482 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
483 BT_ERR("Don't have a privilege to use this API");
484 return BLUETOOTH_ERROR_PERMISSION_DEINED;
487 user_info = _bt_get_user_data(BT_HF);
488 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
491 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
493 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
495 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_HF_DISCONNECT,
496 in_param1, in_param2, in_param3, in_param4,
497 user_info->cb, user_info->user_data);
499 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
504 BT_EXPORT_API int bluetooth_hf_answer_call()
508 int ret = BLUETOOTH_ERROR_INTERNAL;
510 BT_CHECK_ENABLED(return);
512 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
513 "AnswerCall", &err, DBUS_TYPE_INVALID);
515 BT_ERR("Error returned in method call\n");
516 if (dbus_error_is_set(&err)) {
517 BT_ERR("Error = %s", err.message);
518 if (strcmp(err.message, "Operation not supported") == 0)
519 ret = BLUETOOTH_ERROR_NOT_IN_OPERATION;
520 else if (strcmp(err.message, "Operation not allowed") == 0)
521 ret = BLUETOOTH_ERROR_PERMISSION_DEINED;
523 ret = BLUETOOTH_ERROR_INTERNAL;
524 dbus_error_free(&err);
529 dbus_message_unref(reply);
531 return BLUETOOTH_ERROR_NONE;
535 BT_EXPORT_API int bluetooth_hf_terminate_call()
540 BT_CHECK_ENABLED(return);
542 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
543 "TerminateCall", &err, DBUS_TYPE_INVALID);
545 BT_ERR("Error returned in method call\n");
546 if (dbus_error_is_set(&err)) {
547 BT_ERR("Error = %s", err.message);
548 dbus_error_free(&err);
550 return BLUETOOTH_ERROR_INTERNAL;
553 dbus_message_unref(reply);
555 return BLUETOOTH_ERROR_NONE;
558 BT_EXPORT_API int bluetooth_hf_initiate_call(char *number)
562 int ret = BLUETOOTH_ERROR_INTERNAL;
564 BT_CHECK_ENABLED(return);
569 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
570 "InitiateCall", &err, DBUS_TYPE_STRING, &number, DBUS_TYPE_INVALID);
572 BT_ERR("Error returned in method call");
573 if (dbus_error_is_set(&err)) {
574 BT_ERR("Error = %s", err.message);
575 if (strcmp(err.message, "NotConnected") == 0)
576 ret = BLUETOOTH_ERROR_NOT_CONNECTED;
577 else if (strcmp(err.message, "Operation not allowed") == 0)
578 ret = BLUETOOTH_ERROR_IN_PROGRESS;
580 ret = BLUETOOTH_ERROR_INTERNAL;
581 dbus_error_free(&err);
586 dbus_message_unref(reply);
588 return BLUETOOTH_ERROR_NONE;
591 BT_EXPORT_API int bluetooth_hf_voice_recognition(unsigned int status)
596 BT_CHECK_ENABLED(return);
598 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
599 "VoiceRecognition", &err, DBUS_TYPE_INT32, &status, DBUS_TYPE_INVALID);
601 BT_ERR("Error returned in method call\n");
602 if (dbus_error_is_set(&err)) {
603 BT_ERR("Error = %s", err.message);
604 dbus_error_free(&err);
606 return BLUETOOTH_ERROR_INTERNAL;
609 dbus_message_unref(reply);
611 return BLUETOOTH_ERROR_NONE;
614 BT_EXPORT_API int bluetooth_hf_audio_disconnect(void)
619 BT_CHECK_ENABLED(return);
621 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
622 "ScoDisconnect", &err, DBUS_TYPE_INVALID);
624 BT_ERR("Error returned in method call\n");
625 if (dbus_error_is_set(&err)) {
626 BT_ERR("Error = %s", err.message);
627 dbus_error_free(&err);
629 return BLUETOOTH_ERROR_INTERNAL;
632 dbus_message_unref(reply);
634 return BLUETOOTH_ERROR_NONE;
637 BT_EXPORT_API int bluetooth_hf_set_speaker_gain(unsigned int speaker_gain)
642 BT_CHECK_ENABLED(return);
644 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
645 "SpeakerGain", &err, DBUS_TYPE_UINT32, &speaker_gain, DBUS_TYPE_INVALID);
647 BT_ERR("Error returned in method call\n");
648 if (dbus_error_is_set(&err)) {
649 BT_ERR("Error = %s", err.message);
650 dbus_error_free(&err);
652 return BLUETOOTH_ERROR_INTERNAL;
655 dbus_message_unref(reply);
657 return BLUETOOTH_ERROR_NONE;
660 BT_EXPORT_API int bluetooth_hf_send_dtmf(char *dtmf)
665 BT_CHECK_ENABLED(return);
667 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
668 "SendDtmf", &err, DBUS_TYPE_STRING, &dtmf, DBUS_TYPE_INVALID);
670 BT_ERR("Error returned in method call\n");
671 if (dbus_error_is_set(&err)) {
672 BT_ERR("Error = %s", err.message);
673 dbus_error_free(&err);
675 return BLUETOOTH_ERROR_INTERNAL;
678 dbus_message_unref(reply);
680 return BLUETOOTH_ERROR_NONE;
683 BT_EXPORT_API int bluetooth_hf_send_xsat_cmd(int app_id, char *xsat_cmd)
687 char buffer[200] = {0,};
690 BT_CHECK_ENABLED(return);
692 strcpy(buffer, "AT+XSAT=");
693 snprintf(buffer + strlen(buffer), sizeof(buffer), "%d,", app_id);
694 strncat(buffer, xsat_cmd, (sizeof(buffer) - 1) - strlen(buffer));
695 BT_DBG("Xsat cmd received = %s", buffer);
696 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
697 "SendAtCmd", &err, DBUS_TYPE_STRING,
698 &ptr, DBUS_TYPE_INVALID);
700 BT_ERR("Error returned in method call\n");
701 if (dbus_error_is_set(&err)) {
702 BT_ERR("Error = %s", err.message);
703 dbus_error_free(&err);
705 return BLUETOOTH_ERROR_INTERNAL;
708 dbus_message_unref(reply);
710 return BLUETOOTH_ERROR_NONE;
713 BT_EXPORT_API int bluetooth_hf_release_and_accept(void)
718 BT_CHECK_ENABLED(return);
720 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
721 "ReleaseAndAccept", &err, DBUS_TYPE_INVALID);
723 BT_ERR("Error returned in method call\n");
724 if (dbus_error_is_set(&err)) {
725 BT_ERR("Error = %s", err.message);
726 dbus_error_free(&err);
728 return BLUETOOTH_ERROR_INTERNAL;
731 dbus_message_unref(reply);
733 return BLUETOOTH_ERROR_NONE;
736 BT_EXPORT_API int bluetooth_hf_swap_call(void)
741 BT_CHECK_ENABLED(return);
743 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
744 "CallSwap", &err, DBUS_TYPE_INVALID);
746 BT_ERR("Error returned in method call\n");
747 if (dbus_error_is_set(&err)) {
748 BT_ERR("Error = %s", err.message);
749 dbus_error_free(&err);
751 return BLUETOOTH_ERROR_INTERNAL;
754 dbus_message_unref(reply);
756 return BLUETOOTH_ERROR_NONE;
759 BT_EXPORT_API int bluetooth_hf_release_all_call(void)
764 BT_CHECK_ENABLED(return);
766 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
767 "ReleaseAllCall", &err, DBUS_TYPE_INVALID);
769 BT_ERR("Error returned in method call\n");
770 if (dbus_error_is_set(&err)) {
771 BT_ERR("Error = %s", err.message);
772 dbus_error_free(&err);
774 return BLUETOOTH_ERROR_INTERNAL;
777 dbus_message_unref(reply);
779 return BLUETOOTH_ERROR_NONE;
782 BT_EXPORT_API int bluetooth_hf_join_call(void)
787 BT_CHECK_ENABLED(return);
789 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
790 "JoinCall", &err, DBUS_TYPE_INVALID);
792 BT_ERR("Error returned in method call\n");
793 if (dbus_error_is_set(&err)) {
794 BT_ERR("Error = %s", err.message);
795 dbus_error_free(&err);
797 return BLUETOOTH_ERROR_INTERNAL;
800 dbus_message_unref(reply);
802 return BLUETOOTH_ERROR_NONE;
805 BT_EXPORT_API int bluetooth_hf_get_call_list(void *call_list,
806 bt_hf_call_status_info_t **call_status)
809 GList *list = call_list;
811 bt_hf_call_status_info_t * call_info;
813 BT_CHECK_ENABLED(return);
814 retv_if(list == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
815 retv_if(call_status == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
817 call_count = g_list_length(list);
819 BT_DBG(" call_count = [%d]", call_count);
821 for (i = 0; i < call_count; i++) {
822 call_info = g_list_nth_data(list, i);
823 BT_DBG(" direction = [%d]", call_info->direction);
824 BT_DBG(" status = [%d]", call_info->status);
825 BT_DBG(" mpart = [%d]", call_info->mpart);
826 BT_DBG(" number = [%s]", call_info->number);
827 BT_DBG(" idx = [%d]", call_info->idx);
828 call_status[i] = call_info;
831 return BLUETOOTH_ERROR_NONE;
834 BT_EXPORT_API int bluetooth_hf_free_call_list(bt_hf_call_list_s *call_list)
836 bt_hf_call_list_s *handle;
837 bt_hf_call_status_info_t *call_status;
839 retv_if(call_list == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
841 handle = (bt_hf_call_list_s *)call_list;
843 call_status = (bt_hf_call_status_info_t *)g_list_nth_data(
845 if (call_status == NULL)
847 handle->list = g_list_remove(handle->list, call_status);
848 g_free(call_status->number);
852 return BLUETOOTH_ERROR_NONE;
855 BT_EXPORT_API int bluetooth_hf_request_call_list(
856 bt_hf_call_list_s **call_list)
861 BT_CHECK_ENABLED(return);
863 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
864 "RequestCallList", &err, DBUS_TYPE_INVALID);
866 BT_ERR("dbus Error or call list is null\n");
867 if (dbus_error_is_set(&err)) {
868 BT_ERR("Error = %s", err.message);
869 dbus_error_free(&err);
872 return BLUETOOTH_ERROR_INTERNAL;
874 __bt_hf_agent_read_call_list(reply, call_list);
876 dbus_message_unref(reply);
877 return BLUETOOTH_ERROR_NONE;
880 BT_EXPORT_API int bluetooth_hf_get_codec(unsigned int *codec_id)
884 DBusMessageIter iter;
885 int32_t current_codec;
887 BT_CHECK_ENABLED(return);
889 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
890 "GetCurrentCodec", &err, DBUS_TYPE_INVALID);
892 BT_ERR("Error returned in method call\n");
893 if (dbus_error_is_set(&err)) {
894 BT_ERR("Error = %s", err.message);
895 dbus_error_free(&err);
897 return BLUETOOTH_ERROR_INTERNAL;
899 dbus_message_iter_init(reply, &iter);
900 dbus_message_iter_get_basic(&iter, ¤t_codec);
901 *codec_id = current_codec;
902 BT_DBG(" Codec ID is : %d", *codec_id);
904 dbus_message_unref(reply);
906 return BLUETOOTH_ERROR_NONE;
909 BT_EXPORT_API int bluetooth_hf_get_audio_connected(unsigned int *audio_connected)
913 DBusMessageIter iter;
914 int32_t sco_audio_connected_from_bt_agent;
916 BT_CHECK_ENABLED(return);
918 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
919 "GetAudioConnected", &err, DBUS_TYPE_INVALID);
921 BT_ERR("Error returned in method call\n");
922 if (dbus_error_is_set(&err)) {
923 BT_ERR("Error = %s", err.message);
924 dbus_error_free(&err);
926 return BLUETOOTH_ERROR_INTERNAL;
928 dbus_message_iter_init(reply, &iter);
929 dbus_message_iter_get_basic(&iter, &sco_audio_connected_from_bt_agent);
930 *audio_connected = sco_audio_connected_from_bt_agent;
932 if (*audio_connected == BLUETOOTH_HF_AUDIO_CONNECTED) {
933 BT_DBG("SCO Audio is Connected");
935 BT_DBG("SCO Audio is Disconnected");
938 dbus_message_unref(reply);
940 return BLUETOOTH_ERROR_NONE;
943 BT_EXPORT_API int bluetooth_hf_is_hf_connected(gboolean *hf_connected)
947 DBusMessageIter iter;
948 gboolean hf_connected_from_bt_agent;
950 BT_CHECK_ENABLED(return);
952 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
953 "IsHfConnected", &err, DBUS_TYPE_INVALID);
955 BT_ERR("Error returned in method call\n");
956 if (dbus_error_is_set(&err)) {
957 BT_ERR("Error = %s", err.message);
958 dbus_error_free(&err);
960 return BLUETOOTH_ERROR_INTERNAL;
962 dbus_message_iter_init(reply, &iter);
963 dbus_message_iter_get_basic(&iter, &hf_connected_from_bt_agent);
964 *hf_connected = hf_connected_from_bt_agent;
966 BT_DBG("%s", *hf_connected ? "Connected":"Disconnected");
968 dbus_message_unref(reply);
970 return BLUETOOTH_ERROR_NONE;