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.
20 #include "bluetooth-api.h"
21 #include "bluetooth-audio-api.h"
22 #include "bt-internal-types.h"
24 #include "bt-common.h"
25 #include "bt-request-sender.h"
26 #include "bt-event-handler.h"
28 BT_EXPORT_API int bluetooth_audio_init(bt_audio_func_ptr cb, void *user_data)
33 BT_ERR("callback is NULL");
34 return BLUETOOTH_ERROR_INVALID_PARAM;
36 ret = _bt_init_event_handler();
38 if (ret != BLUETOOTH_ERROR_NONE &&
39 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
40 BT_ERR("Fail to init the event handler");
44 _bt_set_user_data(BT_AUDIO, (void *)cb, user_data);
46 /* Register All events */
47 ret = _bt_register_event(BT_HEADSET_EVENT, (void *)cb, user_data);
48 if (ret != BLUETOOTH_ERROR_NONE &&
49 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
50 _bt_deinit_event_handler();
54 ret = _bt_register_event(BT_A2DP_SOURCE_EVENT, (void *)cb, user_data);
55 if (ret != BLUETOOTH_ERROR_NONE &&
56 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
57 _bt_deinit_event_handler();
61 return BLUETOOTH_ERROR_NONE;
64 BT_EXPORT_API int bluetooth_audio_deinit(void)
66 _bt_unregister_event(BT_HEADSET_EVENT);
67 _bt_unregister_event(BT_A2DP_SOURCE_EVENT);
68 _bt_set_user_data(BT_AUDIO, NULL, NULL);
70 return BLUETOOTH_ERROR_NONE;
73 BT_EXPORT_API int bluetooth_audio_connect(bluetooth_device_address_t *remote_address)
75 int service_function = BT_AUDIO_CONNECT;
77 bt_user_info_t *user_info;
79 BT_CHECK_PARAMETER(remote_address, return);
80 BT_CHECK_ENABLED(return);
82 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AUDIO_CONNECT)
83 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
84 BT_ERR("Don't have a privilege to use this API");
85 return BLUETOOTH_ERROR_PERMISSION_DEINED;
88 user_info = _bt_get_user_data(BT_AUDIO);
89 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
92 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
94 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
96 result = _bt_send_request_async(BT_BLUEZ_SERVICE, service_function,
97 in_param1, in_param2, in_param3, in_param4,
98 user_info->cb, user_info->user_data);
100 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
105 BT_EXPORT_API int bluetooth_audio_disconnect(bluetooth_device_address_t *remote_address)
108 bt_user_info_t *user_info;
110 BT_CHECK_PARAMETER(remote_address, return);
111 BT_CHECK_ENABLED(return);
113 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AUDIO_DISCONNECT)
114 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
115 BT_ERR("Don't have a privilege to use this API");
116 return BLUETOOTH_ERROR_PERMISSION_DEINED;
119 user_info = _bt_get_user_data(BT_AUDIO);
120 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
123 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
125 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
127 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_AUDIO_DISCONNECT,
128 in_param1, in_param2, in_param3, in_param4,
129 user_info->cb, user_info->user_data);
131 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
136 BT_EXPORT_API int bluetooth_ag_connect(bluetooth_device_address_t *remote_address)
139 bt_user_info_t *user_info;
141 BT_CHECK_PARAMETER(remote_address, return);
142 BT_CHECK_ENABLED(return);
144 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AG_CONNECT)
145 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
146 BT_ERR("Don't have a privilege to use this API");
147 return BLUETOOTH_ERROR_PERMISSION_DEINED;
150 user_info = _bt_get_user_data(BT_AUDIO);
151 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
154 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
156 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
158 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_AG_CONNECT,
159 in_param1, in_param2, in_param3, in_param4,
160 user_info->cb, user_info->user_data);
162 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
167 BT_EXPORT_API int bluetooth_ag_disconnect(bluetooth_device_address_t *remote_address)
170 bt_user_info_t *user_info;
172 BT_CHECK_PARAMETER(remote_address, return);
173 BT_CHECK_ENABLED(return);
175 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AG_DISCONNECT)
176 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
177 BT_ERR("Don't have a privilege to use this API");
178 return BLUETOOTH_ERROR_PERMISSION_DEINED;
181 user_info = _bt_get_user_data(BT_AUDIO);
182 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
185 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
187 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
189 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_AG_DISCONNECT,
190 in_param1, in_param2, in_param3, in_param4,
191 user_info->cb, user_info->user_data);
193 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
198 BT_EXPORT_API int bluetooth_av_connect(bluetooth_device_address_t *remote_address)
201 bt_user_info_t *user_info;
203 BT_CHECK_PARAMETER(remote_address, return);
204 BT_CHECK_ENABLED(return);
206 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AV_CONNECT)
207 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
208 BT_ERR("Don't have a privilege to use this API");
209 return BLUETOOTH_ERROR_PERMISSION_DEINED;
212 user_info = _bt_get_user_data(BT_AUDIO);
213 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
216 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
218 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
220 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_AV_CONNECT,
221 in_param1, in_param2, in_param3, in_param4,
222 user_info->cb, user_info->user_data);
224 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
229 BT_EXPORT_API int bluetooth_av_source_connect(bluetooth_device_address_t *remote_address)
232 bt_user_info_t *user_info;
234 BT_CHECK_PARAMETER(remote_address, return);
235 BT_CHECK_ENABLED(return);
237 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AV_SOURCE_CONNECT)
238 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
239 BT_ERR("Don't have a privilege to use this API");
240 return BLUETOOTH_ERROR_PERMISSION_DEINED;
243 user_info = _bt_get_user_data(BT_AUDIO);
244 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
247 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
249 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
251 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_AV_SOURCE_CONNECT,
252 in_param1, in_param2, in_param3, in_param4,
253 user_info->cb, user_info->user_data);
255 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
260 BT_EXPORT_API int bluetooth_av_disconnect(bluetooth_device_address_t *remote_address)
263 bt_user_info_t *user_info;
265 BT_CHECK_PARAMETER(remote_address, return);
266 BT_CHECK_ENABLED(return);
268 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AV_DISCONNECT)
269 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
270 BT_ERR("Don't have a privilege to use this API");
271 return BLUETOOTH_ERROR_PERMISSION_DEINED;
274 user_info = _bt_get_user_data(BT_AUDIO);
275 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
278 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
280 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
282 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_AV_DISCONNECT,
283 in_param1, in_param2, in_param3, in_param4,
284 user_info->cb, user_info->user_data);
286 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
291 BT_EXPORT_API int bluetooth_av_source_disconnect(bluetooth_device_address_t *remote_address)
294 bt_user_info_t *user_info;
296 BT_CHECK_PARAMETER(remote_address, return);
297 BT_CHECK_ENABLED(return);
299 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AV_SOURCE_DISCONNECT)
300 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
301 BT_ERR("Don't have a privilege to use this API");
302 return BLUETOOTH_ERROR_PERMISSION_DEINED;
305 user_info = _bt_get_user_data(BT_AUDIO);
306 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
309 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
311 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
313 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_AV_SOURCE_DISCONNECT,
314 in_param1, in_param2, in_param3, in_param4,
315 user_info->cb, user_info->user_data);
317 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
322 BT_EXPORT_API int bluetooth_ag_get_headset_volume(unsigned int *speaker_gain)
326 BT_CHECK_PARAMETER(speaker_gain, return);
327 BT_CHECK_ENABLED(return);
330 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
332 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_SPEAKER_GAIN,
333 in_param1, in_param2, in_param3, in_param4, &out_param);
335 if (result == BLUETOOTH_ERROR_NONE) {
336 *speaker_gain = g_array_index(out_param,
340 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
345 BT_EXPORT_API int bluetooth_ag_set_speaker_gain(unsigned int speaker_gain)
349 BT_CHECK_ENABLED(return);
352 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
354 g_array_append_vals(in_param1, &speaker_gain, sizeof(unsigned int));
356 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SPEAKER_GAIN,
357 in_param1, in_param2, in_param3, in_param4, &out_param);
359 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
364 #define BT_HF_SERVICE_NAME "org.bluez.hf_agent"
365 #define BT_HF_OBJECT_PATH "/org/bluez/handsfree_agent"
366 #define BT_HF_INTERFACE "org.tizen.HfApp"
369 static DBusMessage* __bt_hf_agent_dbus_send(const char *path,
370 const char *interface, const char *method, DBusError *err, int type, ...)
376 msg = dbus_message_new_method_call(BT_HF_SERVICE_NAME,
377 path, interface, method);
379 BT_ERR("Unable to allocate new D-Bus %s message \n", method);
383 va_start(args, type);
385 if (!dbus_message_append_args_valist(msg, type, args)) {
386 dbus_message_unref(msg);
393 dbus_error_init(err);
395 BT_DBG("DBus HF API call, method = %s", method);
397 reply = dbus_connection_send_with_reply_and_block(_bt_get_system_conn(),
399 dbus_message_unref(msg);
404 static int __bt_hf_agent_read_call_list(DBusMessage *reply,
405 bt_hf_call_list_s **call_list) {
407 DBusMessageIter iter;
408 DBusMessageIter iter_struct;
413 dbus_message_iter_init(reply, &iter);
414 dbus_message_iter_get_basic(&iter, &call_count);
415 if(call_count <= 0) {
417 return BLUETOOTH_ERROR_NOT_FOUND;
419 BT_DBG("Call count = %d", call_count);
421 *call_list = g_malloc0(sizeof(bt_hf_call_list_s));
422 /* Fix : NULL_RETURNS */
423 retv_if(*call_list == NULL, BLUETOOTH_ERROR_MEMORY_ALLOCATION);
425 (*call_list)->count = call_count;
426 dbus_message_iter_next(&iter);
427 dbus_message_iter_recurse(&iter, &iter_struct);
428 while(dbus_message_iter_get_arg_type(&iter_struct) ==
431 gchar *number = NULL;
432 bt_hf_call_status_info_t *call_info;
433 DBusMessageIter entry_iter;
435 call_info = g_malloc0(sizeof(bt_hf_call_status_info_t));
436 /* Fix : NULL_RETURNS */
437 retv_if(call_info == NULL, BLUETOOTH_ERROR_MEMORY_ALLOCATION);
439 dbus_message_iter_recurse(&iter_struct,&entry_iter);
441 dbus_message_iter_get_basic(&entry_iter, &number);
442 call_info->number = g_strdup(number);
443 dbus_message_iter_next(&entry_iter);
444 dbus_message_iter_get_basic(&entry_iter, &call_info->direction);
445 dbus_message_iter_next(&entry_iter);
446 dbus_message_iter_get_basic(&entry_iter, &call_info->status);
447 dbus_message_iter_next(&entry_iter);
448 dbus_message_iter_get_basic(&entry_iter, &call_info->mpart);
449 dbus_message_iter_next(&entry_iter);
450 dbus_message_iter_get_basic(&entry_iter, &call_info->idx);
452 (*call_list)->list = g_list_append((*call_list)->list,
453 (gpointer)call_info);
454 dbus_message_iter_next(&iter_struct);
457 return BLUETOOTH_ERROR_NONE;
460 BT_EXPORT_API int bluetooth_hf_init(bt_hf_func_ptr cb, void *user_data)
465 BT_ERR("callback is NULL");
466 return BLUETOOTH_ERROR_INVALID_PARAM;
469 ret = dbus_threads_init_default();
472 BT_ERR("dbus_thread_init_default Success");
474 BT_ERR("dbus_thread_init_default Fail");
476 ret = _bt_init_event_handler();
478 if (ret != BLUETOOTH_ERROR_NONE &&
479 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
480 BT_ERR("Fail to init the event handler");
484 _bt_set_user_data(BT_HF, (void *)cb, user_data);
486 /* Register All events */
487 ret = _bt_register_event(BT_HF_AGENT_EVENT, (void *)cb, user_data);
488 if (ret != BLUETOOTH_ERROR_NONE &&
489 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
490 _bt_deinit_event_handler();
494 return BLUETOOTH_ERROR_NONE;
497 BT_EXPORT_API int bluetooth_hf_deinit(void)
501 ret = _bt_unregister_event(BT_HF_AGENT_EVENT);
502 if (ret != BLUETOOTH_ERROR_NONE )
503 BT_ERR("_bt_unregister_event failed");
505 _bt_set_user_data(BT_HF, NULL, NULL);
507 return BLUETOOTH_ERROR_NONE;
510 BT_EXPORT_API int bluetooth_hf_connect(bluetooth_device_address_t *remote_address)
513 bt_user_info_t *user_info;
515 BT_CHECK_ENABLED(return);
516 BT_CHECK_PARAMETER(remote_address, return);
518 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_HF_CONNECT)
519 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
520 BT_ERR("Don't have a privilege to use this API");
521 return BLUETOOTH_ERROR_PERMISSION_DEINED;
524 user_info = _bt_get_user_data(BT_HF);
525 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
528 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
530 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
532 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_HF_CONNECT,
533 in_param1, in_param2, in_param3, in_param4,
534 user_info->cb, user_info->user_data);
536 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
541 BT_EXPORT_API int bluetooth_hf_disconnect(bluetooth_device_address_t *remote_address)
544 bt_user_info_t *user_info;
546 BT_CHECK_PARAMETER(remote_address, return);
547 BT_CHECK_ENABLED(return);
549 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_HF_DISCONNECT)
550 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
551 BT_ERR("Don't have a privilege to use this API");
552 return BLUETOOTH_ERROR_PERMISSION_DEINED;
555 user_info = _bt_get_user_data(BT_HF);
556 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
559 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
561 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
563 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_HF_DISCONNECT,
564 in_param1, in_param2, in_param3, in_param4,
565 user_info->cb, user_info->user_data);
567 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
572 BT_EXPORT_API int bluetooth_hf_answer_call()
576 int ret = BLUETOOTH_ERROR_INTERNAL;
578 BT_CHECK_ENABLED(return);
580 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
581 "AnswerCall", &err, DBUS_TYPE_INVALID);
583 BT_ERR("Error returned in method call\n");
584 if (dbus_error_is_set(&err)) {
585 BT_ERR("Error = %s", err.message);
586 if (strcmp(err.message, "Operation not supported") == 0)
587 ret = BLUETOOTH_ERROR_NOT_IN_OPERATION;
588 else if (strcmp(err.message, "Operation not allowed") == 0)
589 ret = BLUETOOTH_ERROR_PERMISSION_DEINED;
591 ret = BLUETOOTH_ERROR_INTERNAL;
592 dbus_error_free(&err);
597 dbus_message_unref(reply);
599 return BLUETOOTH_ERROR_NONE;
603 BT_EXPORT_API int bluetooth_hf_terminate_call()
608 BT_CHECK_ENABLED(return);
610 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
611 "TerminateCall", &err, DBUS_TYPE_INVALID);
613 BT_ERR("Error returned in method call\n");
614 if (dbus_error_is_set(&err)) {
615 BT_ERR("Error = %s", err.message);
616 dbus_error_free(&err);
618 return BLUETOOTH_ERROR_INTERNAL;
621 dbus_message_unref(reply);
623 return BLUETOOTH_ERROR_NONE;
626 BT_EXPORT_API int bluetooth_hf_initiate_call(char *number)
630 int ret = BLUETOOTH_ERROR_INTERNAL;
632 BT_CHECK_ENABLED(return);
637 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
638 "InitiateCall", &err, DBUS_TYPE_STRING, &number, DBUS_TYPE_INVALID);
640 BT_ERR("Error returned in method call");
641 if (dbus_error_is_set(&err)) {
642 BT_ERR("Error = %s", err.message);
643 if (strcmp(err.message, "NotConnected") == 0)
644 ret = BLUETOOTH_ERROR_NOT_CONNECTED;
645 else if (strcmp(err.message, "Operation not allowed") == 0)
646 ret = BLUETOOTH_ERROR_IN_PROGRESS;
648 ret = BLUETOOTH_ERROR_INTERNAL;
649 dbus_error_free(&err);
654 dbus_message_unref(reply);
656 return BLUETOOTH_ERROR_NONE;
659 BT_EXPORT_API int bluetooth_hf_voice_recognition(unsigned int status)
664 BT_CHECK_ENABLED(return);
666 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
667 "VoiceRecognition", &err, DBUS_TYPE_INT32, &status, DBUS_TYPE_INVALID);
669 BT_ERR("Error returned in method call\n");
670 if (dbus_error_is_set(&err)) {
671 BT_ERR("Error = %s", err.message);
672 dbus_error_free(&err);
674 return BLUETOOTH_ERROR_INTERNAL;
677 dbus_message_unref(reply);
679 return BLUETOOTH_ERROR_NONE;
682 BT_EXPORT_API int bluetooth_hf_audio_disconnect(void)
687 BT_CHECK_ENABLED(return);
689 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
690 "ScoDisconnect", &err, DBUS_TYPE_INVALID);
692 BT_ERR("Error returned in method call\n");
693 if (dbus_error_is_set(&err)) {
694 BT_ERR("Error = %s", err.message);
695 dbus_error_free(&err);
697 return BLUETOOTH_ERROR_INTERNAL;
700 dbus_message_unref(reply);
702 return BLUETOOTH_ERROR_NONE;
705 BT_EXPORT_API int bluetooth_hf_set_speaker_gain(unsigned int speaker_gain)
710 BT_CHECK_ENABLED(return);
712 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
713 "SpeakerGain", &err, DBUS_TYPE_UINT32, &speaker_gain, DBUS_TYPE_INVALID);
715 BT_ERR("Error returned in method call\n");
716 if (dbus_error_is_set(&err)) {
717 BT_ERR("Error = %s", err.message);
718 dbus_error_free(&err);
720 return BLUETOOTH_ERROR_INTERNAL;
723 dbus_message_unref(reply);
725 return BLUETOOTH_ERROR_NONE;
728 BT_EXPORT_API int bluetooth_hf_send_dtmf(char *dtmf)
733 BT_CHECK_ENABLED(return);
735 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
736 "SendDtmf", &err, DBUS_TYPE_STRING, &dtmf, DBUS_TYPE_INVALID);
738 BT_ERR("Error returned in method call\n");
739 if (dbus_error_is_set(&err)) {
740 BT_ERR("Error = %s", err.message);
741 dbus_error_free(&err);
743 return BLUETOOTH_ERROR_INTERNAL;
746 dbus_message_unref(reply);
748 return BLUETOOTH_ERROR_NONE;
751 BT_EXPORT_API int bluetooth_hf_send_xsat_cmd(int app_id, char *xsat_cmd)
755 char buffer[200] = {0,};
758 BT_CHECK_ENABLED(return);
760 strcpy(buffer, "AT+XSAT=");
762 snprintf(buffer + strlen(buffer), sizeof(buffer) - strlen(buffer), "%d,", app_id);
763 strncat(buffer, xsat_cmd, (sizeof(buffer) - 1) - strlen(buffer));
764 BT_DBG("Xsat cmd received = %s", buffer);
765 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
766 "SendAtCmd", &err, DBUS_TYPE_STRING,
767 &ptr, 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_release_and_accept(void)
787 BT_CHECK_ENABLED(return);
789 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
790 "ReleaseAndAccept", &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_swap_call(void)
810 BT_CHECK_ENABLED(return);
812 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
813 "CallSwap", &err, DBUS_TYPE_INVALID);
815 BT_ERR("Error returned in method call\n");
816 if (dbus_error_is_set(&err)) {
817 BT_ERR("Error = %s", err.message);
818 dbus_error_free(&err);
820 return BLUETOOTH_ERROR_INTERNAL;
823 dbus_message_unref(reply);
825 return BLUETOOTH_ERROR_NONE;
828 BT_EXPORT_API int bluetooth_hf_release_all_call(void)
833 BT_CHECK_ENABLED(return);
835 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
836 "ReleaseAllCall", &err, DBUS_TYPE_INVALID);
838 BT_ERR("Error returned in method call\n");
839 if (dbus_error_is_set(&err)) {
840 BT_ERR("Error = %s", err.message);
841 dbus_error_free(&err);
843 return BLUETOOTH_ERROR_INTERNAL;
846 dbus_message_unref(reply);
848 return BLUETOOTH_ERROR_NONE;
851 BT_EXPORT_API int bluetooth_hf_join_call(void)
856 BT_CHECK_ENABLED(return);
858 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
859 "JoinCall", &err, DBUS_TYPE_INVALID);
861 BT_ERR("Error returned in method call\n");
862 if (dbus_error_is_set(&err)) {
863 BT_ERR("Error = %s", err.message);
864 dbus_error_free(&err);
866 return BLUETOOTH_ERROR_INTERNAL;
869 dbus_message_unref(reply);
871 return BLUETOOTH_ERROR_NONE;
874 BT_EXPORT_API int bluetooth_hf_get_call_list(void *call_list,
875 bt_hf_call_status_info_t **call_status)
878 GList *list = call_list;
880 bt_hf_call_status_info_t * call_info;
882 BT_CHECK_ENABLED(return);
883 retv_if(list == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
884 retv_if(call_status == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
886 call_count = g_list_length(list);
888 BT_DBG(" call_count = [%d]", call_count);
890 for (i = 0; i < call_count; i++) {
891 call_info = g_list_nth_data(list, i);
892 BT_DBG(" direction = [%d]", call_info->direction);
893 BT_DBG(" status = [%d]", call_info->status);
894 BT_DBG(" mpart = [%d]", call_info->mpart);
895 BT_DBG(" number = [%s]", call_info->number);
896 BT_DBG(" idx = [%d]", call_info->idx);
897 call_status[i] = call_info;
900 return BLUETOOTH_ERROR_NONE;
903 BT_EXPORT_API int bluetooth_hf_free_call_list(bt_hf_call_list_s *call_list)
905 bt_hf_call_list_s *handle;
906 bt_hf_call_status_info_t *call_status;
908 retv_if(call_list == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
910 handle = (bt_hf_call_list_s *)call_list;
912 call_status = (bt_hf_call_status_info_t *)g_list_nth_data(
914 if (call_status == NULL)
916 handle->list = g_list_remove(handle->list, call_status);
917 g_free(call_status->number);
921 return BLUETOOTH_ERROR_NONE;
924 BT_EXPORT_API int bluetooth_hf_request_call_list(
925 bt_hf_call_list_s **call_list)
930 BT_CHECK_ENABLED(return);
932 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
933 "RequestCallList", &err, DBUS_TYPE_INVALID);
935 BT_ERR("dbus Error or call list is null\n");
936 if (dbus_error_is_set(&err)) {
937 BT_ERR("Error = %s", err.message);
938 dbus_error_free(&err);
941 return BLUETOOTH_ERROR_INTERNAL;
943 __bt_hf_agent_read_call_list(reply, call_list);
945 dbus_message_unref(reply);
946 return BLUETOOTH_ERROR_NONE;
949 BT_EXPORT_API int bluetooth_hf_get_codec(unsigned int *codec_id)
953 DBusMessageIter iter;
954 int32_t current_codec;
956 BT_CHECK_ENABLED(return);
958 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
959 "GetCurrentCodec", &err, DBUS_TYPE_INVALID);
961 BT_ERR("Error returned in method call\n");
962 if (dbus_error_is_set(&err)) {
963 BT_ERR("Error = %s", err.message);
964 dbus_error_free(&err);
966 return BLUETOOTH_ERROR_INTERNAL;
968 dbus_message_iter_init(reply, &iter);
969 dbus_message_iter_get_basic(&iter, ¤t_codec);
970 *codec_id = current_codec;
971 BT_DBG(" Codec ID is : %d", *codec_id);
973 dbus_message_unref(reply);
975 return BLUETOOTH_ERROR_NONE;
978 BT_EXPORT_API int bluetooth_hf_get_audio_connected(unsigned int *audio_connected)
982 DBusMessageIter iter;
983 int32_t sco_audio_connected_from_bt_agent;
985 BT_CHECK_ENABLED(return);
987 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
988 "GetAudioConnected", &err, DBUS_TYPE_INVALID);
990 BT_ERR("Error returned in method call\n");
991 if (dbus_error_is_set(&err)) {
992 BT_ERR("Error = %s", err.message);
993 dbus_error_free(&err);
995 return BLUETOOTH_ERROR_INTERNAL;
997 dbus_message_iter_init(reply, &iter);
998 dbus_message_iter_get_basic(&iter, &sco_audio_connected_from_bt_agent);
999 *audio_connected = sco_audio_connected_from_bt_agent;
1001 if (*audio_connected == BLUETOOTH_HF_AUDIO_CONNECTED) {
1002 BT_DBG("SCO Audio is Connected");
1004 BT_DBG("SCO Audio is Disconnected");
1007 dbus_message_unref(reply);
1009 return BLUETOOTH_ERROR_NONE;
1012 BT_EXPORT_API int bluetooth_hf_is_connected(gboolean *hf_connected)
1016 DBusMessageIter iter;
1017 gboolean hf_connected_from_bt_agent;
1019 BT_CHECK_ENABLED(return);
1021 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
1022 "IsHfConnected", &err, DBUS_TYPE_INVALID);
1024 BT_ERR("Error returned in method call\n");
1025 if (dbus_error_is_set(&err)) {
1026 BT_ERR("Error = %s", err.message);
1027 dbus_error_free(&err);
1029 return BLUETOOTH_ERROR_INTERNAL;
1031 dbus_message_iter_init(reply, &iter);
1032 dbus_message_iter_get_basic(&iter, &hf_connected_from_bt_agent);
1033 *hf_connected = hf_connected_from_bt_agent;
1035 BT_DBG("%s", *hf_connected ? "Connected":"Disconnected");
1037 dbus_message_unref(reply);
1039 return BLUETOOTH_ERROR_NONE;