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 GVariant* __bt_hf_agent_dbus_send(const char *path, const char *interface,
370 const char *method, GError **err, GVariant *parameters)
372 GVariant *reply = NULL;
373 GDBusProxy *proxy = NULL;
374 GDBusConnection *conn = NULL;
376 conn = _bt_gdbus_get_system_gconn();
377 retv_if(conn == NULL, NULL);
379 proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
380 NULL, BT_HF_SERVICE_NAME, path, interface, NULL, err);
382 BT_ERR("Unable to allocate new proxy");
386 reply = g_dbus_proxy_call_sync(proxy, method, parameters,
387 G_DBUS_CALL_FLAGS_NONE, -1, NULL, err);
389 g_object_unref(proxy);
393 static int __bt_hf_agent_read_call_list(GVariant *reply,
394 bt_hf_call_list_s **call_list) {
397 GVariant *var_temp = NULL;
400 int dir, status, mpart, idx;
404 g_variant_get(reply, "(i@a(siiii))", &call_count, &var_temp);
406 if(call_count <= 0) {
408 return BLUETOOTH_ERROR_NOT_FOUND;
410 BT_DBG("Call count = %d", call_count);
412 *call_list = g_malloc0(sizeof(bt_hf_call_list_s));
413 /* Fix : NULL_RETURNS */
414 retv_if(*call_list == NULL, BLUETOOTH_ERROR_MEMORY_ALLOCATION);
416 (*call_list)->count = call_count;
418 g_variant_iter_init(&iter, var_temp);
419 while(g_variant_iter_loop(&iter, "(siiii)", &num, &dir, &status, &mpart, &idx)){
420 bt_hf_call_status_info_t *call_info;
422 call_info = g_malloc0(sizeof(bt_hf_call_status_info_t));
423 /* Fix : NULL_RETURNS */
424 retv_if(call_info == NULL, BLUETOOTH_ERROR_MEMORY_ALLOCATION);
426 call_info->number = g_strdup(num);
427 call_info->direction = dir;
428 call_info->status = status;
429 call_info->mpart= mpart;
430 call_info->idx = idx;
432 (*call_list)->list = g_list_append((*call_list)->list,
433 (gpointer)call_info);
436 return BLUETOOTH_ERROR_NONE;
439 BT_EXPORT_API int bluetooth_hf_init(bt_hf_func_ptr cb, void *user_data)
444 BT_ERR("callback is NULL");
445 return BLUETOOTH_ERROR_INVALID_PARAM;
448 ret = _bt_init_event_handler();
450 if (ret != BLUETOOTH_ERROR_NONE &&
451 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
452 BT_ERR("Fail to init the event handler");
456 _bt_set_user_data(BT_HF, (void *)cb, user_data);
458 /* Register All events */
459 ret = _bt_register_event(BT_HF_AGENT_EVENT, (void *)cb, user_data);
460 if (ret != BLUETOOTH_ERROR_NONE &&
461 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
462 _bt_deinit_event_handler();
466 return BLUETOOTH_ERROR_NONE;
469 BT_EXPORT_API int bluetooth_hf_deinit(void)
473 ret = _bt_unregister_event(BT_HF_AGENT_EVENT);
474 if (ret != BLUETOOTH_ERROR_NONE )
475 BT_ERR("_bt_unregister_event failed");
477 _bt_set_user_data(BT_HF, NULL, NULL);
479 return BLUETOOTH_ERROR_NONE;
482 BT_EXPORT_API int bluetooth_hf_connect(bluetooth_device_address_t *remote_address)
485 bt_user_info_t *user_info;
487 BT_CHECK_ENABLED(return);
488 BT_CHECK_PARAMETER(remote_address, return);
490 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_HF_CONNECT)
491 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
492 BT_ERR("Don't have a privilege to use this API");
493 return BLUETOOTH_ERROR_PERMISSION_DEINED;
496 user_info = _bt_get_user_data(BT_HF);
497 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
500 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
502 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
504 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_HF_CONNECT,
505 in_param1, in_param2, in_param3, in_param4,
506 user_info->cb, user_info->user_data);
508 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
513 BT_EXPORT_API int bluetooth_hf_disconnect(bluetooth_device_address_t *remote_address)
516 bt_user_info_t *user_info;
518 BT_CHECK_PARAMETER(remote_address, return);
519 BT_CHECK_ENABLED(return);
521 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_HF_DISCONNECT)
522 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
523 BT_ERR("Don't have a privilege to use this API");
524 return BLUETOOTH_ERROR_PERMISSION_DEINED;
527 user_info = _bt_get_user_data(BT_HF);
528 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
531 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
533 g_array_append_vals(in_param1, remote_address, sizeof(bluetooth_device_address_t));
535 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_HF_DISCONNECT,
536 in_param1, in_param2, in_param3, in_param4,
537 user_info->cb, user_info->user_data);
539 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
544 BT_EXPORT_API int bluetooth_hf_answer_call()
546 GVariant *reply = NULL;
548 int ret = BLUETOOTH_ERROR_INTERNAL;
550 BT_CHECK_ENABLED(return);
552 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
553 "AnswerCall", &err, NULL);
555 BT_ERR("Error returned in method call\n");
557 BT_ERR("Error = %s", err->message);
558 g_dbus_error_strip_remote_error(err);
559 if (strcmp(err->message, "Operation not supported") == 0)
560 ret = BLUETOOTH_ERROR_NOT_IN_OPERATION;
561 else if (strcmp(err->message, "Operation not allowed") == 0)
562 ret = BLUETOOTH_ERROR_PERMISSION_DEINED;
564 ret = BLUETOOTH_ERROR_INTERNAL;
570 g_variant_unref(reply);
571 return BLUETOOTH_ERROR_NONE;
575 BT_EXPORT_API int bluetooth_hf_terminate_call()
577 GVariant *reply = NULL;
580 BT_CHECK_ENABLED(return);
582 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
583 "TerminateCall", &err, NULL);
585 BT_ERR("Error returned in method call\n");
587 BT_ERR("Error = %s", err->message);
590 return BLUETOOTH_ERROR_INTERNAL;
593 g_variant_unref(reply);
594 return BLUETOOTH_ERROR_NONE;
597 BT_EXPORT_API int bluetooth_hf_initiate_call(char *number)
599 GVariant *reply = NULL;
601 GVariant *param = NULL;
602 int ret = BLUETOOTH_ERROR_INTERNAL;
604 BT_CHECK_ENABLED(return);
609 param = g_variant_new("(s)", number);
610 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
611 "InitiateCall", &err, param);
613 BT_ERR("Error returned in method call");
615 BT_ERR("Error = %s", err->message);
616 g_dbus_error_strip_remote_error(err);
617 if (strcmp(err->message, "NotConnected") == 0)
618 ret = BLUETOOTH_ERROR_NOT_CONNECTED;
619 else if (strcmp(err->message, "Operation not allowed") == 0)
620 ret = BLUETOOTH_ERROR_IN_PROGRESS;
622 ret = BLUETOOTH_ERROR_INTERNAL;
628 g_variant_unref(reply);
629 return BLUETOOTH_ERROR_NONE;
632 BT_EXPORT_API int bluetooth_hf_voice_recognition(unsigned int status)
634 GVariant *reply = NULL;
636 GVariant *param = NULL;
638 BT_CHECK_ENABLED(return);
640 param = g_variant_new("(i)", status);
641 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
642 "VoiceRecognition", &err, param);
644 BT_ERR("Error returned in method call\n");
646 BT_ERR("Error = %s", err->message);
649 return BLUETOOTH_ERROR_INTERNAL;
652 g_variant_unref(reply);
653 return BLUETOOTH_ERROR_NONE;
656 BT_EXPORT_API int bluetooth_hf_audio_disconnect(void)
658 GVariant *reply = NULL;
661 BT_CHECK_ENABLED(return);
663 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
664 "ScoDisconnect", &err, NULL);
666 BT_ERR("Error returned in method call\n");
668 BT_ERR("Error = %s", err->message);
671 return BLUETOOTH_ERROR_INTERNAL;
674 g_variant_unref(reply);
675 return BLUETOOTH_ERROR_NONE;
678 BT_EXPORT_API int bluetooth_hf_set_speaker_gain(unsigned int speaker_gain)
680 GVariant *reply = NULL;
682 GVariant *param = NULL;
684 BT_CHECK_ENABLED(return);
686 param = g_variant_new("(u)", speaker_gain);
687 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
688 "SpeakerGain", &err, param);
690 BT_ERR("Error returned in method call\n");
692 BT_ERR("Error = %s", err->message);
695 return BLUETOOTH_ERROR_INTERNAL;
698 g_variant_unref(reply);
699 return BLUETOOTH_ERROR_NONE;
702 BT_EXPORT_API int bluetooth_hf_send_dtmf(char *dtmf)
704 GVariant *reply = NULL;
706 GVariant *param = NULL;
708 BT_CHECK_ENABLED(return);
710 param = g_variant_new("(s)", dtmf);
711 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
712 "SendDtmf", &err, param);
714 BT_ERR("Error returned in method call\n");
716 BT_ERR("Error = %s", err->message);
719 return BLUETOOTH_ERROR_INTERNAL;
722 g_variant_unref(reply);
723 return BLUETOOTH_ERROR_NONE;
726 BT_EXPORT_API int bluetooth_hf_send_xsat_cmd(int app_id, char *xsat_cmd)
728 GVariant *reply = NULL;
730 GVariant *param = NULL;
731 char buffer[200] = {0,};
734 BT_CHECK_ENABLED(return);
736 strncpy(buffer, "AT+XSAT=", strlen("AT+XSAT="));
737 snprintf(buffer + strlen(buffer), sizeof(buffer), "%d,", app_id);
738 strncat(buffer, xsat_cmd, (sizeof(buffer) - 1) - strlen(buffer));
739 BT_DBG("Xsat cmd received = %s", buffer);
741 param = g_variant_new("(s)", ptr);
743 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
744 "SendAtCmd", &err, param);
746 BT_ERR("Error returned in method call\n");
748 BT_ERR("Error = %s", err->message);
751 return BLUETOOTH_ERROR_INTERNAL;
754 g_variant_unref(reply);
755 return BLUETOOTH_ERROR_NONE;
758 BT_EXPORT_API int bluetooth_hf_release_and_accept(void)
760 GVariant *reply = NULL;
763 BT_CHECK_ENABLED(return);
765 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
766 "ReleaseAndAccept", &err, NULL);
768 BT_ERR("Error returned in method call\n");
770 BT_ERR("Error = %s", err->message);
773 return BLUETOOTH_ERROR_INTERNAL;
776 g_variant_unref(reply);
777 return BLUETOOTH_ERROR_NONE;
780 BT_EXPORT_API int bluetooth_hf_swap_call(void)
782 GVariant *reply = NULL;
785 BT_CHECK_ENABLED(return);
787 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
788 "CallSwap", &err, NULL);
790 BT_ERR("Error returned in method call\n");
792 BT_ERR("Error = %s", err->message);
795 return BLUETOOTH_ERROR_INTERNAL;
798 g_variant_unref(reply);
799 return BLUETOOTH_ERROR_NONE;
802 BT_EXPORT_API int bluetooth_hf_release_all_call(void)
804 GVariant *reply = NULL;
807 BT_CHECK_ENABLED(return);
809 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
810 "ReleaseAllCall", &err, NULL);
812 BT_ERR("Error returned in method call\n");
814 BT_ERR("Error = %s", err->message);
817 return BLUETOOTH_ERROR_INTERNAL;
820 g_variant_unref(reply);
821 return BLUETOOTH_ERROR_NONE;
824 BT_EXPORT_API int bluetooth_hf_join_call(void)
826 GVariant *reply = NULL;
829 BT_CHECK_ENABLED(return);
831 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
832 "JoinCall", &err, NULL);
834 BT_ERR("Error returned in method call\n");
836 BT_ERR("Error = %s", err->message);
839 return BLUETOOTH_ERROR_INTERNAL;
842 g_variant_unref(reply);
843 return BLUETOOTH_ERROR_NONE;
846 BT_EXPORT_API int bluetooth_hf_get_call_list(void *call_list,
847 bt_hf_call_status_info_t **call_status)
850 GList *list = call_list;
852 bt_hf_call_status_info_t * call_info;
854 BT_CHECK_ENABLED(return);
855 retv_if(list == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
856 retv_if(call_status == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
858 call_count = g_list_length(list);
860 BT_DBG(" call_count = [%d]", call_count);
862 for (i = 0; i < call_count; i++) {
863 call_info = g_list_nth_data(list, i);
864 BT_DBG(" direction = [%d]", call_info->direction);
865 BT_DBG(" status = [%d]", call_info->status);
866 BT_DBG(" mpart = [%d]", call_info->mpart);
867 BT_DBG(" number = [%s]", call_info->number);
868 BT_DBG(" idx = [%d]", call_info->idx);
869 call_status[i] = call_info;
872 return BLUETOOTH_ERROR_NONE;
875 BT_EXPORT_API int bluetooth_hf_free_call_list(bt_hf_call_list_s *call_list)
877 bt_hf_call_list_s *handle;
878 bt_hf_call_status_info_t *call_status;
880 retv_if(call_list == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
882 handle = (bt_hf_call_list_s *)call_list;
884 call_status = (bt_hf_call_status_info_t *)g_list_nth_data(
886 if (call_status == NULL)
888 handle->list = g_list_remove(handle->list, call_status);
889 g_free(call_status->number);
893 return BLUETOOTH_ERROR_NONE;
896 BT_EXPORT_API int bluetooth_hf_request_call_list(
897 bt_hf_call_list_s **call_list)
899 GVariant *reply = NULL;
902 BT_CHECK_ENABLED(return);
904 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
905 "RequestCallList", &err, NULL);
907 BT_ERR("dbus Error or call list is null\n");
909 BT_ERR("Error = %s", err->message);
913 return BLUETOOTH_ERROR_INTERNAL;
915 __bt_hf_agent_read_call_list(reply, call_list);
917 g_variant_unref(reply);
918 return BLUETOOTH_ERROR_NONE;
921 BT_EXPORT_API int bluetooth_hf_get_codec(unsigned int *codec_id)
923 GVariant *reply = NULL;
925 int32_t current_codec;
927 BT_CHECK_ENABLED(return);
929 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
930 "GetCurrentCodec", &err, NULL);
932 BT_ERR("Error returned in method call\n");
934 BT_ERR("Error = %s", err->message);
937 return BLUETOOTH_ERROR_INTERNAL;
940 g_variant_get(reply, "(i)", ¤t_codec);
941 *codec_id = current_codec;
942 BT_DBG(" Codec ID is : %d", *codec_id);
944 g_variant_unref(reply);
945 return BLUETOOTH_ERROR_NONE;
948 BT_EXPORT_API int bluetooth_hf_get_audio_connected(unsigned int *audio_connected)
950 GVariant *reply = NULL;
952 int32_t sco_audio_connected_from_bt_agent;
954 BT_CHECK_ENABLED(return);
956 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
957 "GetAudioConnected", &err, NULL);
959 BT_ERR("Error returned in method call\n");
961 BT_ERR("Error = %s", err->message);
964 return BLUETOOTH_ERROR_INTERNAL;
967 g_variant_get(reply, "(i)", &sco_audio_connected_from_bt_agent);
968 *audio_connected = sco_audio_connected_from_bt_agent;
970 if (*audio_connected == BLUETOOTH_HF_AUDIO_CONNECTED) {
971 BT_DBG("SCO Audio is Connected");
973 BT_DBG("SCO Audio is Disconnected");
976 g_variant_unref(reply);
977 return BLUETOOTH_ERROR_NONE;
980 BT_EXPORT_API int bluetooth_hf_is_connected(gboolean *hf_connected)
982 GVariant *reply = NULL;
984 gboolean hf_connected_from_bt_agent;
986 BT_CHECK_ENABLED(return);
988 reply = __bt_hf_agent_dbus_send(BT_HF_OBJECT_PATH, BT_HF_INTERFACE,
989 "IsHfConnected", &err, NULL);
991 BT_ERR("Error returned in method call\n");
993 BT_ERR("Error = %s", err->message);
996 return BLUETOOTH_ERROR_INTERNAL;
999 g_variant_get(reply, "(b)", &hf_connected_from_bt_agent);
1000 *hf_connected = hf_connected_from_bt_agent;
1002 BT_DBG("%s", *hf_connected ? "Connected":"Disconnected");
1004 g_variant_unref(reply);
1005 return BLUETOOTH_ERROR_NONE;