4 * Copyright (c) 2015 -2016 Samsung Electronics Co., Ltd All Rights Reserved.
6 * Contact: Anupam Roy <anupam.r@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
32 #include <bundle_internal.h>
36 #include "bt-hal-log.h"
37 #include "bt-hal-msg.h"
38 #include "bt-hal-utils.h"
39 #include "bt-hal-internal.h"
40 #include "bt-hal-event-receiver.h"
41 #include "bt-hal-dbus-common-utils.h"
43 #include "bt-hal-adapter-dbus-handler.h"
44 #include "bt-hal-device-dbus-handler.h"
45 #include "bt-hal-event-receiver.h"
46 #include "bt-hal-agent.h"
47 #include "bt-hal-gap-agent.h"
49 #define PROFILE_SUPPORTED 0x03
50 #define PROFILE_TRUSTED 0x02
51 #define PROFILE_BLOCKED 0x01
53 static handle_stack_msg event_cb = NULL;
55 /* Forward Delcaration */
56 static void __bt_hal_bond_device_cb(GDBusProxy *proxy, GAsyncResult *res, gpointer user_data);
58 static void __bt_hal_unbond_device_cb(GDBusProxy *proxy, GAsyncResult *res,
60 static void __bt_hal_device_service_search_cb(GDBusProxy *proxy, GAsyncResult *res,
62 int __bt_hal_dbus_enquire_remote_device_services(char *address);
64 static void __bt_device_parse_services(GVariant *result);
66 int _bt_hal_device_create_bond(const bt_bdaddr_t *bd_addr, unsigned short transport)
69 char address[BT_HAL_ADDRESS_STRING_SIZE] = { 0 };
71 GDBusConnection *conn;
72 char *device_path = NULL;
73 GDBusProxy *adapter_proxy;
75 struct hal_ev_bond_state_changed ev;
76 memset(&ev, 0, sizeof(ev));
79 DBG("Transport [0x%x] Add[0x%x] [0x%x][0x%x][0x%x][0x%x][0x%x]",
80 transport, bd_addr->address[0], bd_addr->address[1],
81 bd_addr->address[2], bd_addr->address[3],
82 bd_addr->address[4], bd_addr->address[5]);
83 conn = _bt_hal_get_system_gconn();
85 DBG("Could not get DBUS connection!");
86 return BT_STATUS_FAIL;
89 _bt_hal_convert_addr_type_to_string(address, bd_addr->address);
90 device_path = _bt_hal_get_device_object_path(address);
92 if (device_path == NULL) {
93 ERR("No searched device, attempt to create device");
95 adapter_proxy = _bt_hal_get_adapter_proxy();
97 ERR("Could not get Adapter Proxy");
98 return BT_STATUS_FAIL;
101 ret = g_dbus_proxy_call_sync(adapter_proxy, "CreateDevice",
102 g_variant_new("(s)", address),
103 G_DBUS_CALL_FLAGS_NONE,
109 ERR("CreateDevice Fail: %s", error->message);
110 g_clear_error(&error);
113 g_variant_unref(ret);
114 device_path = _bt_hal_get_device_object_path(address);
116 if (device_path == NULL) {
117 ERR("Device path is still not created!!");
118 return BT_STATUS_FAIL;
120 DBG("Device_path is created[%s]", device_path);
123 proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
124 NULL, BT_HAL_BLUEZ_NAME,
125 device_path, BT_HAL_DEVICE_INTERFACE, NULL, NULL);
129 ERR("Could not get Device Proxy");
130 return BT_STATUS_FAIL;
133 g_dbus_proxy_call(proxy, "Pair",
134 g_variant_new("(y)", transport),
135 G_DBUS_CALL_FLAGS_NONE,
136 BT_HAL_MAX_DBUS_TIMEOUT,
138 (GAsyncReadyCallback)__bt_hal_bond_device_cb,
141 /* Prepare to send Bonding event event to HAL bluetooth */
142 ev.status = BT_STATUS_SUCCESS;
143 ev.state = BT_BOND_STATE_BONDING;
145 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
148 event_cb = _bt_hal_get_stack_message_handler();
150 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
151 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
155 return BT_STATUS_SUCCESS;
158 int _bt_hal_device_remove_bond(const bt_bdaddr_t *bd_addr)
160 char *device_path = NULL;
161 GDBusProxy *adapter_proxy = NULL;
162 GDBusProxy *device_proxy = NULL;
163 GDBusConnection *conn;
164 GError *error = NULL;
165 GVariant *ret = NULL;
166 char address[BT_HAL_ADDRESS_STRING_SIZE] = { 0 };
168 DBG("Add[0x%x] [0x%x][0x%x][0x%x][0x%x][0x%x]",
169 bd_addr->address[0], bd_addr->address[1],
170 bd_addr->address[2], bd_addr->address[3],
171 bd_addr->address[4], bd_addr->address[5]);
173 adapter_proxy = _bt_hal_get_adapter_proxy();
174 if (!adapter_proxy) {
175 ERR("Could not get Adapter Proxy");
176 return BT_STATUS_FAIL;
179 _bt_hal_convert_addr_type_to_string(address, bd_addr->address);
181 device_path = _bt_hal_get_device_object_path(address);
183 /* This is a special case, bluedroid always sends success to HAL even if device is already removed
184 whereas bluez sends BLUETOOTH_ERROR_NOT_PAIRED. However we will return Failure
186 if (device_path == NULL) {
187 ERR("No paired device");
188 return BT_STATUS_FAIL;
191 conn = _bt_hal_get_system_gconn();
195 return BT_STATUS_FAIL;
199 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
200 NULL, BT_HAL_BLUEZ_NAME,
201 device_path, BT_HAL_PROPERTIES_INTERFACE, NULL, NULL);
203 if (device_proxy != NULL) {
205 ret = g_dbus_proxy_call_sync(device_proxy, "Get",
206 g_variant_new("(ss)", BT_HAL_DEVICE_INTERFACE, "Paired"),
207 G_DBUS_CALL_FLAGS_NONE,
212 ERR("Getting property failed: [%s]\n", error->message);
214 return BT_STATUS_FAIL;
217 ERR("No paired device");
218 g_object_unref(device_proxy);
219 return BT_STATUS_FAIL;
221 g_variant_unref(ret);
223 g_object_unref(device_proxy);
226 g_dbus_proxy_call(adapter_proxy, "UnpairDevice",
227 g_variant_new("(o)", device_path),
228 G_DBUS_CALL_FLAGS_NONE,
229 BT_HAL_MAX_DBUS_TIMEOUT,
231 (GAsyncReadyCallback)__bt_hal_unbond_device_cb,
232 (gpointer)device_path);
234 return BT_STATUS_SUCCESS;
237 int _bt_hal_device_cancel_bond(const bt_bdaddr_t *bd_addr)
239 int result = BT_STATUS_SUCCESS;
242 result = _bt_hal_agent_reply_cancellation();
243 if (result != BT_HAL_ERROR_NONE) {
244 ERR("Fail to call reply cancellation");
245 return BT_STATUS_FAIL;
248 _bt_hal_agent_set_canceled(TRUE);
252 int _bt_hal_device_legacy_pin_reply(const bt_bdaddr_t *bd_addr,
253 gboolean accept, uint8_t pin_len, char *pincode)
255 GapAgentPrivate *agent = _bt_hal_get_adapter_agent();
259 return BT_STATUS_FAIL;
261 DBG("pin_len [0x%x]", pin_len);
262 DBG("pincode [%s]", pincode);
265 gap_agent_reply_pin_code(agent, GAP_AGENT_ACCEPT, pincode, NULL);
267 gap_agent_reply_pin_code(agent, GAP_AGENT_REJECT, NULL, NULL);
270 return BT_STATUS_SUCCESS;
273 int _bt_hal_device_ssp_reply(const bt_bdaddr_t *bd_addr, bt_ssp_variant_t variant,
274 uint8_t accept, uint32_t passkey)
276 GapAgentPrivate *agent = _bt_hal_get_adapter_agent();
280 return BT_STATUS_FAIL;
283 case BT_SSP_VARIANT_PASSKEY_CONFIRMATION:
284 DBG("SSP: PASSKEY_CONFIRMATION");
286 gap_agent_reply_confirmation(agent, GAP_AGENT_ACCEPT, NULL);
288 gap_agent_reply_confirmation(agent, GAP_AGENT_REJECT, NULL);
290 case BT_SSP_VARIANT_PASSKEY_NOTIFICATION:
291 DBG("SSP: PASSKEY_NOTIFICATION");
293 case BT_SSP_VARIANT_PASSKEY_ENTRY:
294 DBG("SSP: PASSKEY_ENTRY");
297 snprintf(str_passkey, sizeof(str_passkey), "%.6d", passkey);
298 DBG("Passkey [%s]", str_passkey);
299 gap_agent_reply_passkey(agent, GAP_AGENT_ACCEPT, str_passkey, NULL);
301 gap_agent_reply_passkey(agent, GAP_AGENT_REJECT, NULL, NULL);
303 case BT_SSP_VARIANT_CONSENT:
304 DBG("SSP: VARIANT_CONSENT: Unhandled!");
311 return BT_STATUS_SUCCESS;
314 int _bt_hal_dbus_get_remote_device_services(const bt_bdaddr_t *remote_addr)
316 char *device_path = NULL;
317 GDBusProxy *device_proxy = NULL;
318 GDBusConnection *conn;
319 GDBusProxy *adapter_proxy;
320 //char address[BT_HAL_ADDRESS_STRING_SIZE] = { 0 };
321 char *address = NULL;
322 int result = BT_STATUS_SUCCESS;
325 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
327 _bt_hal_convert_addr_type_to_string(address, remote_addr->address);
329 if (remote_addr == NULL) {
330 result = BT_STATUS_PARM_INVALID;
334 adapter_proxy = _bt_hal_get_adapter_proxy();
335 if (adapter_proxy == NULL) {
336 result = BT_STATUS_FAIL;
340 conn = _bt_hal_get_system_gconn();
342 ERR("Could not get System DBUS Connection");
343 result = BT_STATUS_FAIL;
347 device_path = _bt_hal_get_device_object_path(address);
349 if (device_path == NULL) {
350 ERR("Remote device is not paired..can not perform SDP!!!");
351 result = BT_STATUS_FAIL;
355 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
356 NULL, BT_HAL_BLUEZ_NAME,
357 device_path, BT_HAL_DEVICE_INTERFACE, NULL, NULL);
360 if (device_proxy == NULL) {
361 ERR("Could not create Device Proxy");
362 result = BT_STATUS_FAIL;
367 g_dbus_proxy_call(device_proxy, "DiscoverServices",
368 g_variant_new("(s)", ""),
369 G_DBUS_CALL_FLAGS_NONE,
370 BT_HAL_MAX_DBUS_TIMEOUT,
372 (GAsyncReadyCallback)__bt_hal_device_service_search_cb,
375 return BT_STATUS_SUCCESS;
382 int _bt_hal_device_authorize_response(const bt_bdaddr_t *bd_addr, bt_service_id_t service_id,
383 uint8_t authorize, uint8_t save_settings)
385 int reply = GAP_AGENT_ACCEPT;
386 GapAgentPrivate *agent = _bt_hal_get_adapter_agent();
390 return BT_STATUS_FAIL;
393 reply = GAP_AGENT_REJECT;
394 else if (authorize && save_settings)
395 reply = GAP_AGENT_ACCEPT_ALWAYS;
397 gap_agent_reply_authorize(agent, reply, NULL);
400 return BT_STATUS_SUCCESS;
403 int _bt_hal_device_set_trust(const bt_bdaddr_t *bd_addr, uint8_t trust)
405 char address[BT_HAL_ADDRESS_STRING_SIZE] = { 0 };
406 gchar *device_path = NULL;
407 GDBusProxy *device_proxy;
408 gboolean previous_value;
410 GDBusConnection *conn;
411 GError *error = NULL;
412 GVariant *result = NULL;
413 GVariant *temp = NULL;
414 int ret = BT_STATUS_SUCCESS;
418 return BT_STATUS_PARM_INVALID;
425 conn = _bt_hal_get_system_gconn();
428 ERR("Failed to get DBUS connection");
429 return BT_STATUS_FAIL;
432 _bt_hal_convert_addr_type_to_string(address, bd_addr->address);
434 device_path = _bt_hal_get_device_object_path(address);
436 if (device_path == NULL) {
437 ERR("No paired device");
438 return BT_STATUS_FAIL;
441 DBG("Device path [%s]", device_path);
442 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
443 NULL, BT_HAL_BLUEZ_NAME,
444 device_path, BT_HAL_PROPERTIES_INTERFACE, NULL, &error);
448 if (device_proxy == NULL) {
450 g_dbus_error_strip_remote_error(error);
451 ERR("Device proxy get failed %s", error->message);
454 ERR("Failed to get Device Proxy");
455 return BT_STATUS_FAIL;
458 result = g_dbus_proxy_call_sync(device_proxy, "Get",
459 g_variant_new("(ss)", BT_HAL_DEVICE_INTERFACE, "Trusted"),
460 G_DBUS_CALL_FLAGS_NONE,
466 ERR("Getting property failed: [%s]\n", error->message);
468 g_object_unref(device_proxy);
469 return BT_STATUS_FAIL;
473 g_variant_get(result, "(v)", &temp);
474 previous_value = g_variant_get_boolean(temp);
475 DBG("Previous value [%d]", previous_value);
477 /* If the input is same with previous value, return error. */
478 if (previous_value == authorize) {
479 ERR("Same value: %d", previous_value);
480 g_object_unref(device_proxy);
481 g_object_unref(result);
482 g_object_unref(temp);
483 return BT_STATUS_PARM_INVALID;
486 DBG("Set authotrize [%d]", authorize);
487 result = g_dbus_proxy_call_sync(device_proxy, "Set",
488 g_variant_new("(ssv)", BT_HAL_DEVICE_INTERFACE, "Trusted", g_variant_new("b", authorize)),
489 G_DBUS_CALL_FLAGS_NONE,
495 ERR("SetProperty error: [%s]", error->message);
497 ret = BT_STATUS_FAIL;
500 g_object_unref(device_proxy);
503 g_object_unref(result);
505 g_object_unref(temp);
511 static void __bt_hal_device_service_search_cb(GDBusProxy *proxy, GAsyncResult *res,
514 /* Buffer and propety count management */
515 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
516 struct hal_ev_remote_device_props *ev = (void*) buf;;
520 int result = BT_HAL_ERROR_NONE;
521 char *address = (char*) user_data;
524 g_dbus_proxy_call_finish(proxy, res, &err);
526 g_object_unref(proxy);
528 /* Check event pointer */
530 event_cb = _bt_hal_get_stack_message_handler();
532 ERR("event_cb is NULL, can not send Service search results to HAL User");
537 g_dbus_error_strip_remote_error(err);
538 ERR("Error occured in Proxy call [%s]\n", err->message);
540 if (g_strrstr("Operation canceled", err->message))
541 result = BT_HAL_ERROR_CANCEL_BY_USER;
542 else if (g_strrstr("In Progress", err->message))
543 result = BT_HAL_ERROR_IN_PROGRESS;
544 else if (g_strrstr("Host is down", err->message))
545 result = BT_HAL_ERROR_HOST_DOWN;
547 result = BT_HAL_ERROR_CONNECTION_ERROR;
550 if (result == BT_HAL_ERROR_HOST_DOWN ||
551 result == BT_HAL_ERROR_CONNECTION_ERROR) {
552 ERR("Service search has failed due to Host Down or connection error, attempt to find properties");
553 if (__bt_hal_dbus_enquire_remote_device_services(address) == BT_STATUS_SUCCESS)
560 DBG("SDP is successful..lets fetch the device properties..");
561 if (__bt_hal_dbus_enquire_remote_device_services(address) == BT_STATUS_SUCCESS)
564 ev->status = BT_STATUS_FAIL;
567 ERR("Error: Failed to get Remote device properties after SDP,"
568 " Num Prop [%d] total size [%zd]", ev->num_props, size);
569 event_cb(HAL_EV_REMOTE_DEVICE_PROPS, (void*) buf, size);
577 static void __bt_device_parse_services(GVariant *result)
579 /* Buffer and propety count management */
580 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
581 struct hal_ev_remote_device_props *ev = (void*) buf;;
584 GVariantIter *property_iter;
588 const gchar *address = NULL;
590 memset(buf, 0, sizeof(buf));
593 ev->status = BT_STATUS_SUCCESS;
595 g_variant_get(result, "(a{sv})", &property_iter);
596 while (g_variant_iter_loop(property_iter, "{sv}", &key, &value)) {
597 if (!g_strcmp0(key, "Address")) {
598 address = g_variant_get_string(value, NULL);
599 DBG("Address [%s]", address);
600 _bt_hal_convert_addr_string_to_type(ev->bdaddr, address);
601 } else if (!g_strcmp0(key, "UUIDs")) {
606 size1 = g_variant_get_size(value);
607 int num_props_tmp = ev->num_props;
609 uuid_value = (char **)g_variant_get_strv(value, &size1);
610 for (i = 0; uuid_value[i] != NULL; i++)
612 /* UUID collection */
613 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
614 for (i = 0; uuid_value[i] != NULL; i++) {
615 char *uuid_str = NULL;
616 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
617 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
618 uuid_str = g_strdup(uuid_value[i]);
619 DBG("UUID string [%s]\n", uuid_str);
620 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
621 memcpy(uuids + i * BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
624 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
625 (BT_HAL_STACK_UUID_SIZE * uuid_count), uuids);
626 ev->num_props = num_props_tmp + 1;
630 ERR("Unhandled Property:[%s]", key);
634 DBG("Send Remote Device services to HAL,"
635 " Num Prop [%d] total size [%zd]", ev->num_props, size);
636 event_cb(HAL_EV_REMOTE_DEVICE_PROPS, (void*) buf, size);
638 g_variant_unref(result);
639 g_variant_iter_free(property_iter);
642 int __bt_hal_dbus_enquire_remote_device_services(char *address)
644 char *device_path = NULL;
645 GError *error = NULL;
646 GDBusProxy *device_proxy;
647 GDBusConnection *conn;
650 device_path = _bt_hal_get_device_object_path(address);
652 ERR("Device not paired");
653 return BT_STATUS_FAIL;
656 conn = _bt_hal_get_system_gconn();
659 ERR("_bt_hal_get_system_gconn failed");
660 return BT_STATUS_FAIL;
663 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
667 BT_HAL_PROPERTIES_INTERFACE,
671 ERR("Error creating device_proxy");
673 return BT_STATUS_FAIL;
676 result = g_dbus_proxy_call_sync(device_proxy,
678 g_variant_new("(s)", BT_HAL_DEVICE_INTERFACE),
679 G_DBUS_CALL_FLAGS_NONE,
685 ERR("Error occured in Proxy call");
687 ERR("Error occured in Proxy call (Error: %s)", error->message);
688 g_clear_error(&error);
690 g_object_unref(device_proxy);
692 return BT_STATUS_FAIL;
695 g_object_unref(device_proxy);
698 /* Fetch Device Services and send to HAL User */
699 __bt_device_parse_services(result);
702 return BT_STATUS_SUCCESS;
705 static void __bt_hal_bond_device_cb(GDBusProxy *proxy, GAsyncResult *res,
709 const char *device_path;
710 int result = BT_STATUS_SUCCESS;
711 struct hal_ev_bond_state_changed ev;
712 memset(&ev, 0, sizeof(ev));
713 char dev_address[18];
716 /* Terminate ALL system popup */
717 if (headed_plugin_info->plugin_headed_enabled)
718 headed_plugin_info->headed_plugin->bt_destroy_popup_all();
721 g_dbus_proxy_call_finish(proxy, res, &err);
722 device_path = g_dbus_proxy_get_object_path(proxy);
723 _bt_hal_convert_device_path_to_address(device_path, dev_address);
726 g_dbus_error_strip_remote_error(err);
727 ERR("@@@Error occured in CreateBonding [%s]", err->message);
728 if (g_strrstr(err->message, "Already Exists")) {
729 ERR("Still bond existing even after remove");
730 result = BT_STATUS_AUTH_FAILURE;
731 } else if (g_strrstr(err->message, "Authentication Rejected")) {
733 result = BT_STATUS_AUTH_REJECTED;
734 } else if (_bt_hal_agent_is_canceled() ||
735 g_strrstr(err->message, "Authentication Canceled")) {
736 INFO("Cancelled by USER");
737 result = BT_STATUS_AUTH_FAILURE;
738 } else if (g_strrstr(err->message, "In Progress")) {
739 INFO("Bond in progress, cancel and retry");
740 } else if (g_strrstr(err->message, "Authentication Failed")) {
741 INFO("Authentication Failed");
742 result = BT_STATUS_AUTH_FAILURE;
743 } else if (g_strrstr(err->message, "Page Timeout")) {
744 INFO("Page Timeout");
745 /* This is the special case
746 As soon as call bluetooth_bond_device, try to cancel bonding.
747 In this case, before completing to call 'CreatePairedDevice' method
748 the procedure is stopped. So 'Cancle' error is not return.
750 result = BT_STATUS_RMT_DEV_DOWN;
751 } else if (g_strrstr(err->message, BT_HAL_TIMEOUT_MESSAGE)) {
753 result = BT_STATUS_FAIL;
754 } else if (g_strrstr(err->message, "Connection Timeout")) {
755 /* Pairing request timeout */
756 result = BT_STATUS_RMT_DEV_DOWN;
757 } else if (g_strrstr(err->message, "Authentication Timeout")) {
758 /* Pairing request timeout */
759 result = BT_STATUS_AUTH_FAILURE;
761 DBG("Default case: Pairing failed");
762 result = BT_STATUS_AUTH_FAILURE;
766 if (result == BT_STATUS_AUTH_FAILURE ||
767 result == BT_STATUS_RMT_DEV_DOWN ||
768 result == BT_STATUS_AUTH_REJECTED ||
769 result == BT_STATUS_FAIL) {
770 DBG("Bonding Failed!!");
772 /* Prepare to send event to HAL bluetooth */
774 ev.state = BT_BOND_STATE_NONE;
776 _bt_hal_convert_addr_string_to_type(ev.bdaddr, dev_address);
779 event_cb = _bt_hal_get_stack_message_handler();
781 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
782 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
785 DBG("Bonding Success!! [%s]", dev_address);
790 static void __bt_hal_unbond_device_cb(GDBusProxy *proxy, GAsyncResult *res,
794 char *device_path = NULL;
795 char dev_address[18];
796 int result = BT_STATUS_SUCCESS;
797 struct hal_ev_bond_state_changed ev;
798 memset(&ev, 0, sizeof(ev));
800 g_dbus_proxy_call_finish(proxy, res, &err);
802 ERR("Error occured in RemoveBonding [%s]\n", err->message);
803 result = BT_STATUS_FAIL;
807 device_path = (char *)user_data;
808 if (result != BT_STATUS_SUCCESS) {
809 /* Prepare to send event to HAL bluetooth */
811 ev.state = BT_BOND_STATE_NONE;
813 _bt_hal_convert_device_path_to_address(device_path, dev_address);
814 _bt_hal_convert_addr_string_to_type(ev.bdaddr, dev_address);
817 event_cb = _bt_hal_get_stack_message_handler();
819 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
820 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
826 static gboolean __bt_device_bonded_device_info_cb(gpointer user_data)
828 /* Buffer and propety count management */
829 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
830 struct hal_ev_remote_device_props *ev = (void*) buf;;
833 GVariant *result = user_data;
834 GVariantIter *property_iter;
835 GVariantIter *char_value_iter;
837 const gchar *address = NULL;
838 const gchar *name = NULL;
839 unsigned int cod = 0;
844 GByteArray *manufacturer_data = NULL;
848 unsigned int data_len = 0;
849 uint8_t is_alias_set;
851 memset(buf, 0, sizeof(buf));
854 ev->status = BT_STATUS_SUCCESS;
856 g_variant_get(result, "(a{sv})", &property_iter);
857 while (g_variant_iter_loop(property_iter, "{sv}", &key, &value)) {
858 if (!g_strcmp0(key, "Address")) {
859 address = g_variant_get_string(value, NULL);
860 DBG("Address [%s]", address);
861 _bt_hal_convert_addr_string_to_type(ev->bdaddr, address);
862 } else if (!g_strcmp0(key, "Alias")) {
863 name = g_variant_get_string(value, NULL);
864 DBG("Alias [%s]", name);
865 size += __bt_insert_hal_properties(buf + size,
866 HAL_PROP_DEVICE_FRIENDLY_NAME, strlen(name) + 1, name);
868 } else if (!g_strcmp0(key, "Class")) {
869 cod = g_variant_get_uint32(value);
870 DBG("Class [%d]", cod);
871 size += __bt_insert_hal_properties(buf + size,
872 HAL_PROP_DEVICE_CLASS, sizeof(unsigned int), &cod);
874 } else if (!g_strcmp0(key, "Connected")) {
875 connected = g_variant_get_byte(value);
876 DBG("Connected [%d]", connected);
877 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
878 sizeof(unsigned int), &connected);
880 } else if (!g_strcmp0(key, "Paired")) {
881 paired = (g_variant_get_boolean(value) ? 1 : 0);
882 DBG("Paired [%d]", paired);
883 size += __bt_insert_hal_properties(buf + size,
884 HAL_PROP_DEVICE_PAIRED, sizeof(uint8_t), &paired);
886 } else if (!g_strcmp0(key, "Trusted")) {
887 trust = (g_variant_get_boolean(value) ? 1 : 0);
888 DBG("Trusted [%d]", trust);
889 size += __bt_insert_hal_properties(buf + size,
890 HAL_PROP_DEVICE_TRUSTED, sizeof(uint8_t), &trust);
892 } else if (!g_strcmp0(key, "Name")) {
893 name = g_variant_get_string(value, NULL);
894 DBG("Name [%s]", name);
895 size += __bt_insert_hal_properties(buf + size,
896 HAL_PROP_DEVICE_NAME, strlen(name) + 1, name);
898 } else if (!g_strcmp0(key, "RSSI")) {
899 rssi = g_variant_get_int16(value);
900 DBG("RSSI [%d]", rssi);
901 size += __bt_insert_hal_properties(buf + size,
902 HAL_PROP_DEVICE_RSSI, sizeof(unsigned int), &rssi);
904 } else if (!g_strcmp0(key, "UUIDs")) {
909 size1 = g_variant_get_size(value);
910 int num_props_tmp = ev->num_props;
912 uuid_value = (char **)g_variant_get_strv(value, &size1);
913 for (i = 0; uuid_value[i] != NULL; i++)
915 /* UUID collection */
916 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
917 for (i = 0; uuid_value[i] != NULL; i++) {
918 char *uuid_str = NULL;
919 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
920 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
921 uuid_str = g_strdup(uuid_value[i]);
922 DBG("[%d] [%s]", i, uuid_str);
923 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
924 memcpy(uuids + i * BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
927 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
928 (BT_HAL_STACK_UUID_SIZE * uuid_count), uuids);
929 ev->num_props = num_props_tmp + 1;
932 } else if (!g_strcmp0(key, "LegacyManufacturerDataLen")) {
933 data_len = g_variant_get_uint16(value);
934 DBG("LegacyManufacturerDataLen [%d]", data_len);
935 } else if (!g_strcmp0(key, "LegacyManufacturerData")) {
936 manufacturer_data = g_byte_array_new();
937 g_variant_get(value, "ay", &char_value_iter);
938 while (g_variant_iter_loop(char_value_iter, "y", &char_value))
939 g_byte_array_append(manufacturer_data, &char_value, 1);
941 g_variant_iter_free(char_value_iter);
943 if (manufacturer_data) {
944 if (manufacturer_data->len > 0) {
945 size += __bt_insert_hal_properties(
946 buf + size, HAL_PROP_DEVICE_BLE_ADV_DATA,
947 manufacturer_data->len, manufacturer_data->data);
951 g_byte_array_free(manufacturer_data, FALSE);
952 } else if (!g_strcmp0(key, "IsAliasSet")) {
953 is_alias_set = (g_variant_get_boolean(value) ? 1 : 0);
954 DBG("IsAliasSet: %s", ((is_alias_set == 1) ? "TRUE" : "FALSE"));
955 size += __bt_insert_hal_properties(buf + size,
956 HAL_PROP_DEVICE_IS_ALIAS_SET, sizeof(uint8_t), &is_alias_set);
959 DBG("Unhandled Property:[%s]", key);
964 event_cb = _bt_hal_get_stack_message_handler();
966 ERR("event_cb is NULL");
970 if ((paired == 0) && (trust == 0)) {
971 ev->status = BT_STATUS_FAIL;
974 DBG("Send Remote Device properties event to HAL,"
975 " Num Prop [%d] total size [%zd]", ev->num_props, size);
976 event_cb(HAL_EV_REMOTE_DEVICE_PROPS, (void*) buf, size);
979 DBG("Send Remote Device properties event to HAL,"
980 " Num Prop [%d] total size [%zd]", ev->num_props, size);
981 event_cb(HAL_EV_REMOTE_DEVICE_PROPS, (void*) buf, size);
986 g_variant_unref(result);
987 g_variant_iter_free(property_iter);
991 int _bt_hal_dbus_get_remote_device_properties(bt_bdaddr_t *remote_addr)
993 char *device_path = NULL;
994 char address[BT_HAL_ADDRESS_STRING_SIZE] = { 0 };
995 GError *error = NULL;
996 GDBusProxy *device_proxy;
997 GDBusConnection *conn;
1001 ERR("Invalid device address ptr received");
1002 return BT_STATUS_PARM_INVALID;
1005 _bt_hal_convert_addr_type_to_string(address, remote_addr->address);
1006 device_path = _bt_hal_get_device_object_path(address);
1008 ERR("Device not paired");
1009 return BT_STATUS_FAIL;
1012 conn = _bt_hal_get_system_gconn();
1014 g_free(device_path);
1015 ERR("_bt_hal_get_system_gconn failed");
1016 return BT_STATUS_FAIL;
1019 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1023 BT_HAL_PROPERTIES_INTERFACE,
1026 if (!device_proxy) {
1027 ERR("Error creating device_proxy");
1028 g_free(device_path);
1029 return BT_STATUS_FAIL;
1032 result = g_dbus_proxy_call_sync(device_proxy,
1034 g_variant_new("(s)", BT_HAL_DEVICE_INTERFACE),
1035 G_DBUS_CALL_FLAGS_NONE,
1041 ERR("Error occured in Proxy call");
1042 if (error != NULL) {
1043 ERR("Error occured in Proxy call (Error: %s)", error->message);
1044 g_clear_error(&error);
1046 g_object_unref(device_proxy);
1047 g_free(device_path);
1048 return BT_STATUS_FAIL;
1051 g_object_unref(device_proxy);
1052 g_free(device_path);
1054 * As we need to provide async callback to user from HAL, simply schedule a
1055 * callback method which will carry actual result
1057 g_idle_add(__bt_device_bonded_device_info_cb, (gpointer)result);
1060 return BT_STATUS_SUCCESS;
1063 static int __bt_hal_dbus_set_remote_device_alias(bt_bdaddr_t *remote_addr, char *alias)
1065 char address[BT_HAL_ADDRESS_STRING_SIZE];
1066 gchar *device_path = NULL;
1067 GDBusProxy *adapter_proxy;
1068 GDBusProxy *device_proxy;
1069 GError *error = NULL;
1070 GDBusConnection *conn;
1073 adapter_proxy = _bt_hal_get_adapter_proxy();
1074 if (!adapter_proxy) {
1075 ERR("Could not get Adapter Proxy");
1076 return BT_STATUS_FAIL;
1079 conn = _bt_hal_get_system_gconn();
1081 ERR("_bt_hal_get_system_gconn failed");
1082 return BT_STATUS_FAIL;
1085 _bt_hal_convert_addr_type_to_string(address, remote_addr->address);
1086 INFO("Address: %s, Alias: %s", address, alias);
1088 device_path = _bt_hal_get_device_object_path(address);
1089 if (device_path == NULL) {
1090 ERR("No paired device");
1091 return BT_STATUS_FAIL;
1094 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1095 NULL, BT_HAL_BLUEZ_NAME, device_path,
1096 BT_HAL_PROPERTIES_INTERFACE, NULL, NULL);
1097 g_free(device_path);
1098 if (!device_proxy) {
1099 ERR("Error creating device_proxy");
1100 return BT_STATUS_FAIL;
1103 result = g_dbus_proxy_call_sync(device_proxy, "Set",
1104 g_variant_new("(ssv)",
1105 BT_HAL_DEVICE_INTERFACE,
1106 "Alias", g_variant_new("s", alias)),
1107 G_DBUS_CALL_FLAGS_NONE,
1111 g_object_unref(device_proxy);
1113 ERR("Error occured in Proxy call");
1114 if (error != NULL) {
1115 ERR("Error occured in Proxy call (Error: %s)", error->message);
1116 g_clear_error(&error);
1118 return BT_STATUS_FAIL;
1120 g_variant_unref(result);
1122 return BT_STATUS_SUCCESS;
1125 /* Set Remote Device Properties */
1126 int _bt_hal_dbus_set_remote_device_property(
1127 bt_bdaddr_t *remote_addr, const bt_property_t *property)
1133 if (remote_addr == NULL) {
1134 ERR("Invalid parameters received");
1135 return BT_STATUS_PARM_INVALID;
1138 if (property == NULL || property->val == NULL) {
1139 ERR("Invalid parameters received");
1140 return BT_STATUS_PARM_INVALID;
1143 switch (property->type) {
1144 case BT_PROPERTY_REMOTE_FRIENDLY_NAME:
1145 result = __bt_hal_dbus_set_remote_device_alias(
1146 remote_addr, (char *) property->val);
1149 result = BT_STATUS_UNSUPPORTED;
1152 DBG("Result= [%d]", result);
1157 int _bt_hal_device_get_connection_state(const bt_bdaddr_t *bd_addr)
1159 char address[BT_HAL_ADDRESS_STRING_SIZE];
1160 gchar *device_path = NULL;
1161 GDBusProxy *adapter_proxy;
1162 GDBusProxy *device_proxy;
1163 GError *error = NULL;
1164 GDBusConnection *conn;
1166 GVariant *tmp_value = NULL;
1167 GVariant *value = NULL;
1168 gboolean is_connected = FALSE;
1171 ERR("bd_addr is NULL");
1175 adapter_proxy = _bt_hal_get_adapter_proxy();
1176 if (!adapter_proxy) {
1177 ERR("Could not get Adapter Proxy");
1181 conn = _bt_hal_get_system_gconn();
1183 ERR("_bt_hal_get_system_gconn failed");
1187 _bt_hal_convert_addr_type_to_string(address, bd_addr->address);
1188 INFO("Address: %s", address);
1190 device_path = _bt_hal_get_device_object_path(address);
1191 if (device_path == NULL) {
1192 ERR("No paired device");
1196 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1197 NULL, BT_HAL_BLUEZ_NAME, device_path,
1198 BT_HAL_PROPERTIES_INTERFACE, NULL, NULL);
1199 g_free(device_path);
1200 if (!device_proxy) {
1201 ERR("Error creating device_proxy");
1205 result = g_dbus_proxy_call_sync(device_proxy, "GetProperties",
1206 g_variant_new("(s)", address),
1207 G_DBUS_CALL_FLAGS_NONE,
1211 g_object_unref(device_proxy);
1213 ERR("Error occured in Proxy call");
1214 if (error != NULL) {
1215 ERR("Error occured in Proxy call (Error: %s)", error->message);
1216 g_clear_error(&error);
1221 g_variant_get(result , "(@a{sv})", &value);
1222 g_variant_unref(result);
1225 tmp_value = g_variant_lookup_value(value,
1227 G_VARIANT_TYPE_BOOLEAN);
1229 is_connected = g_variant_get_boolean(tmp_value);
1230 g_variant_unref(tmp_value);
1232 g_variant_unref(value);
1242 int _bt_hal_device_get_service_connection_state(
1243 const bt_bdaddr_t *bd_addr, bt_service_id_t rem_svc_id)
1245 char address[BT_HAL_ADDRESS_STRING_SIZE];
1246 gchar *device_path = NULL;
1247 GDBusProxy *adapter_proxy;
1248 GDBusProxy *device_proxy;
1249 GError *error = NULL;
1250 GDBusConnection *conn;
1252 gboolean is_connected;
1256 ERR("bd_addr is NULL");
1260 adapter_proxy = _bt_hal_get_adapter_proxy();
1261 if (!adapter_proxy) {
1262 ERR("Could not get Adapter Proxy");
1266 conn = _bt_hal_get_system_gconn();
1268 ERR("_bt_hal_get_system_gconn failed");
1272 _bt_hal_convert_addr_type_to_string(address, bd_addr->address);
1273 INFO("Address: %s: Remote svc_id: %d", address, rem_svc_id);
1275 device_path = _bt_hal_get_device_object_path(address);
1276 if (device_path == NULL) {
1277 ERR("No paired device");
1281 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1282 NULL, BT_HAL_BLUEZ_NAME, device_path,
1283 BT_HAL_DEVICE_INTERFACE, NULL, NULL);
1284 g_free(device_path);
1285 if (!device_proxy) {
1286 ERR("Error creating device_proxy");
1290 uuid = _bt_convert_service_id_to_uuid_string(rem_svc_id);
1291 DBG("uuid: %s", uuid);
1295 result = g_dbus_proxy_call_sync(device_proxy, "IsConnectedProfile",
1296 g_variant_new("(s)", uuid),
1297 G_DBUS_CALL_FLAGS_NONE,
1302 g_object_unref(device_proxy);
1304 ERR("Error occured in Proxy call");
1305 if (error != NULL) {
1306 ERR("Error occured in Proxy call (Error: %s)", error->message);
1307 g_clear_error(&error);
1312 g_variant_get(result, "(b)", &is_connected);
1313 g_variant_unref(result);
1321 int _bt_hal_device_register_osp_server(uint32_t type, char *uuid, char *path, int fd)
1323 GapAgentPrivate *agent = _bt_hal_get_adapter_agent();
1324 gboolean result = FALSE;
1328 return BT_STATUS_FAIL;
1330 result = _bt_hal_gap_agent_register_osp_server(agent, type, uuid, path, fd);
1332 return BT_STATUS_FAIL;
1335 return BT_STATUS_SUCCESS;
1338 int _bt_hal_device_unregister_osp_server(uint32_t type, char *uuid)
1340 GapAgentPrivate *agent = _bt_hal_get_adapter_agent();
1341 gboolean result = FALSE;
1345 return BT_STATUS_FAIL;
1347 result = _bt_hal_gap_agent_unregister_osp_server(agent, type, uuid);
1349 return BT_STATUS_FAIL;
1352 return BT_STATUS_SUCCESS;
1355 static char* __bt_hal_get_trusted_profile_uuid(bt_trusted_profile_t profile)
1358 case BT_TRUSTED_PROFILE_PBAP:
1359 return g_strdup("00001130-0000-1000-8000-00805f9b34fb");
1360 case BT_TRUSTED_PROFILE_MAP:
1361 return g_strdup("00001134-0000-1000-8000-00805f9b34fb");
1362 case BT_TRUSTED_PROFILE_SAP:
1363 return g_strdup("0000112D-0000-1000-8000-00805f9b34fb");
1364 case BT_TRUSTED_PROFILE_HFP_HF:
1365 return g_strdup("0000111e-0000-1000-8000-00805f9b34fb");
1366 case BT_TRUSTED_PROFILE_A2DP:
1367 return g_strdup("0000110b-0000-1000-8000-00805f9b34fb");
1368 case BT_TRUSTED_PROFILE_ALL:
1375 int _bt_hal_device_set_trusted_profile(const bt_bdaddr_t *bd_addr,
1376 bt_trusted_profile_t profile, uint8_t trust)
1378 char address[BT_HAL_ADDRESS_STRING_SIZE];
1379 gchar *device_path = NULL;
1380 GDBusProxy *adapter_proxy;
1381 GDBusProxy *device_proxy;
1382 GError *error = NULL;
1383 GDBusConnection *conn;
1391 ERR("bd_addr is NULL");
1392 return BT_STATUS_PARM_INVALID;
1395 adapter_proxy = _bt_hal_get_adapter_proxy();
1396 if (!adapter_proxy) {
1397 ERR("Could not get Adapter Proxy");
1398 return BT_STATUS_FAIL;
1401 conn = _bt_hal_get_system_gconn();
1403 ERR("_bt_hal_get_system_gconn failed");
1404 return BT_STATUS_FAIL;
1407 _bt_hal_convert_addr_type_to_string(address, bd_addr->address);
1408 INFO("Address: %s: profile: %d, trusted: %d", address, profile, trust);
1410 device_path = _bt_hal_get_device_object_path(address);
1411 if (device_path == NULL) {
1412 ERR("No paired device");
1413 return BT_STATUS_FAIL;
1416 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1417 NULL, BT_HAL_BLUEZ_NAME, device_path,
1418 BT_HAL_DEVICE_INTERFACE, NULL, NULL);
1419 g_free(device_path);
1420 if (!device_proxy) {
1421 ERR("Error creating device_proxy");
1422 return BT_STATUS_FAIL;
1425 uuid = __bt_hal_get_trusted_profile_uuid(profile);
1427 ERR("Not supported");
1428 g_object_unref(device_proxy);
1429 return BT_STATUS_UNSUPPORTED;
1432 trusted = ((trust == 0) ? FALSE : TRUE);
1433 DBG("uuid: %s", uuid);
1434 result = g_dbus_proxy_call_sync(device_proxy, "SetTrustedProfile",
1435 g_variant_new("(sb)", uuid, trusted),
1436 G_DBUS_CALL_FLAGS_NONE,
1439 g_object_unref(device_proxy);
1441 ERR("Failed to Set Profile Trusted, Error occured in proxy call");
1442 if (error != NULL) {
1443 ERR("(Error: %s)", error->message);
1444 g_clear_error(&error);
1446 return BT_STATUS_FAIL;
1449 g_variant_unref(result);
1452 return BT_STATUS_SUCCESS;
1455 static int __hal_get_trusted_value_from_flag(bt_trusted_profile_t profile,
1456 uint32_t trusted_flag, uint32_t *trusted)
1462 case BT_TRUSTED_PROFILE_PBAP:
1463 /* Bit 0 & 1 - for PBAP Supported */
1464 trusted_flag = (trusted_flag >> 0);
1466 if (!(trusted_flag & PROFILE_SUPPORTED))
1467 return BT_STATUS_UNSUPPORTED;
1469 *trusted = trusted_flag & PROFILE_TRUSTED;
1470 DBG("Profile %d, trusted: %s", profile,
1471 ((*trusted == 0) ? "FALSE" : "TRUE"));
1473 case BT_TRUSTED_PROFILE_MAP:
1474 /* Bit 2 & 3 - for MAP Supported */
1475 trusted_flag = (trusted_flag >> 2);
1477 if (!(trusted_flag & PROFILE_SUPPORTED))
1478 return BT_STATUS_UNSUPPORTED;
1480 *trusted = trusted_flag & PROFILE_TRUSTED;
1481 DBG("Profile %d, trusted: %s", profile,
1482 ((*trusted == 0) ? "FALSE" : "TRUE"));
1484 case BT_TRUSTED_PROFILE_SAP:
1485 /* Bit 4 & 5 - for SAP Supported */
1486 trusted_flag = (trusted_flag >> 4);
1488 if (!(trusted_flag & PROFILE_SUPPORTED))
1489 return BT_STATUS_UNSUPPORTED;
1491 *trusted = trusted_flag & PROFILE_TRUSTED;
1492 DBG("Profile %d, trusted: %s", profile,
1493 ((*trusted == 0) ? "FALSE" : "TRUE"));
1495 case BT_TRUSTED_PROFILE_HFP_HF:
1496 /* Bit 6 & 7 - for HFP_HF Supported */
1497 trusted_flag = (trusted_flag >> 6);
1499 if (PROFILE_BLOCKED != (trusted_flag & PROFILE_SUPPORTED))
1502 DBG("Profile %d, trusted: %s", profile,
1503 ((*trusted == 0) ? "FALSE" : "TRUE"));
1505 case BT_TRUSTED_PROFILE_A2DP:
1506 /* Bit 8 & 9 - for A2DP Supported */
1507 trusted_flag = (trusted_flag >> 8);
1509 if (PROFILE_BLOCKED != (trusted_flag & PROFILE_SUPPORTED))
1512 DBG("Profile %d, trusted: %s", profile,
1513 ((*trusted == 0) ? "FALSE" : "TRUE"));
1515 case BT_TRUSTED_PROFILE_ALL:
1516 /* Return Flag for All profiles*/
1517 *trusted = trusted_flag;
1518 return BT_STATUS_SUCCESS;
1520 return BT_STATUS_UNSUPPORTED;
1527 return BT_STATUS_SUCCESS;
1530 int _bt_hal_device_get_trusted_profile(const bt_bdaddr_t *bd_addr,
1531 bt_trusted_profile_t profile, uint32_t *trusted)
1533 char address[BT_HAL_ADDRESS_STRING_SIZE];
1534 gchar *device_path = NULL;
1535 GDBusProxy *adapter_proxy;
1536 GDBusProxy *device_proxy;
1537 GError *error = NULL;
1538 GDBusConnection *conn;
1541 uint32_t trusted_flag;
1544 ERR("bd_addr is NULL");
1545 return BT_STATUS_PARM_INVALID;
1548 adapter_proxy = _bt_hal_get_adapter_proxy();
1549 if (!adapter_proxy) {
1550 ERR("Could not get Adapter Proxy");
1551 return BT_STATUS_FAIL;
1554 conn = _bt_hal_get_system_gconn();
1556 ERR("_bt_hal_get_system_gconn failed");
1557 return BT_STATUS_FAIL;
1560 _bt_hal_convert_addr_type_to_string(address, bd_addr->address);
1561 INFO("Address: %s: profile: %d", address, profile);
1563 device_path = _bt_hal_get_device_object_path(address);
1564 if (device_path == NULL) {
1565 ERR("No paired device");
1566 return BT_STATUS_FAIL;
1569 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1570 NULL, BT_HAL_BLUEZ_NAME, device_path,
1571 BT_HAL_PROPERTIES_INTERFACE, NULL, NULL);
1572 g_free(device_path);
1573 if (!device_proxy) {
1574 ERR("Error creating device_proxy");
1575 return BT_STATUS_FAIL;
1578 result = g_dbus_proxy_call_sync(device_proxy, "Get",
1579 g_variant_new("(ss)", BT_HAL_DEVICE_INTERFACE, "TrustedProfiles"),
1580 G_DBUS_CALL_FLAGS_NONE, -1,
1582 g_object_unref(device_proxy);
1584 ERR("Failed to get trusted profile, Error occured in proxy call");
1585 if (error != NULL) {
1586 ERR("(Error: %s)", error->message);
1587 g_clear_error(&error);
1590 return BT_STATUS_FAIL;
1593 g_variant_get(result, "(v)", &temp);
1594 trusted_flag = g_variant_get_uint32(temp);
1595 DBG("TRUST_FLAG 0x%X", trusted_flag);
1596 g_variant_unref(temp);
1597 g_variant_unref(result);
1599 return __hal_get_trusted_value_from_flag(profile,
1600 trusted_flag, trusted);
1603 int _bt_hal_device_get_ida(bt_bdaddr_t *bd_addr, bt_bdaddr_t *id_addr)
1605 char address[BT_HAL_ADDRESS_STRING_SIZE] = { 0 };
1606 gchar *device_path = NULL;
1607 const gchar *idaddress = NULL;
1608 GDBusProxy *device_proxy;
1609 GError *error = NULL;
1610 GVariant *result = NULL;
1611 GDBusConnection *conn;
1612 int ret = BT_STATUS_SUCCESS;
1614 if (bd_addr == NULL)
1615 return BT_STATUS_PARM_INVALID;
1617 conn = _bt_hal_get_system_gconn();
1620 ERR("_bt_hal_get_system_gconn failed");
1621 return BT_STATUS_FAIL;
1624 _bt_hal_convert_addr_type_to_string(address, bd_addr->address);
1626 DBG("The device_address is: [%s]", address);
1628 device_path = _bt_hal_get_device_object_path(address);
1631 ERR("_bt_hal_get_device_object_path failed");
1632 return BT_STATUS_FAIL;
1635 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1636 NULL, BT_HAL_BLUEZ_NAME, device_path,
1637 BT_HAL_DEVICE_INTERFACE, NULL, NULL);
1638 g_free(device_path);
1639 if (!device_proxy) {
1640 ERR("Unable to get proxy");
1641 return BT_STATUS_FAIL;
1644 result = g_dbus_proxy_call_sync(device_proxy, "GetIDAddress", NULL,
1645 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1646 if (result == NULL) {
1647 ERR("Failed to get device ID address");
1649 ret = BT_STATUS_FAIL;
1650 if (error != NULL) {
1651 g_dbus_error_strip_remote_error(error);
1652 ERR("Error occured in Proxy call [%s]", error->message);
1653 if (g_strcmp0(error->message, "Does Not Exist") == 0)
1654 ERR("Device does not exist");
1655 g_error_free(error);
1657 g_object_unref(device_proxy);
1661 g_variant_get(result , "(&s)", &idaddress);
1663 DBG_SECURE("ID Address : %s", idaddress);
1664 _bt_hal_convert_addr_string_to_type(id_addr->address, idaddress);
1666 g_variant_unref(result);
1667 g_object_unref(device_proxy);
1672 int _bt_hal_device_enable_rssi_monitoring(bt_bdaddr_t *bd_addr, uint32_t link_type,
1673 int low_threshold, int in_range_threshold, int high_threshold)
1675 char address[BT_HAL_ADDRESS_STRING_SIZE];
1676 GDBusProxy *adapter_proxy;
1677 GError *error = NULL;
1683 ERR("bd_addr is NULL");
1684 return BT_STATUS_PARM_INVALID;
1687 adapter_proxy = _bt_hal_get_adapter_proxy();
1688 if (!adapter_proxy) {
1689 ERR("Could not get Adapter Proxy");
1690 return BT_STATUS_FAIL;
1693 _bt_hal_convert_addr_type_to_string(address, bd_addr->address);
1694 INFO("Address: %s: link_type: %d", address, link_type);
1696 result = g_dbus_proxy_call_sync(adapter_proxy, "EnableRssi",
1697 g_variant_new("(siiii)", address, link_type,
1698 low_threshold, in_range_threshold, high_threshold),
1699 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1701 ERR("Proxy call to GetRssiStrength failed");
1703 ERR("Dbus Call Error:[%s]", error->message);
1704 g_error_free(error);
1706 return BT_STATUS_FAIL;
1709 g_variant_unref(result);
1712 return BT_STATUS_SUCCESS;
1715 int _bt_hal_device_get_connected_link_rssi_strength(const bt_bdaddr_t *bd_addr, uint32_t link_type)
1717 char address[BT_HAL_ADDRESS_STRING_SIZE];
1718 GDBusProxy *adapter_proxy;
1719 GError *error = NULL;
1725 ERR("bd_addr is NULL");
1726 return BT_STATUS_PARM_INVALID;
1729 adapter_proxy = _bt_hal_get_adapter_proxy();
1730 if (!adapter_proxy) {
1731 ERR("Could not get Adapter Proxy");
1732 return BT_STATUS_FAIL;
1735 _bt_hal_convert_addr_type_to_string(address, bd_addr->address);
1736 INFO("Address: %s: link_type: %d", address, link_type);
1738 result = g_dbus_proxy_call_sync(adapter_proxy, "GetRssiStrength",
1739 g_variant_new("(si)", address, link_type),
1740 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1742 ERR("Proxy call to GetRssiStrength failed");
1744 ERR("Dbus Call Error:[%s]", error->message);
1745 g_error_free(error);
1747 return BT_STATUS_FAIL;
1750 g_variant_unref(result);
1753 return BT_STATUS_SUCCESS;
1757 int _bt_hal_device_disconnect(const bt_bdaddr_t *bd_addr)
1760 char address[BT_HAL_ADDRESS_STRING_SIZE] = { 0 };
1761 GError *error = NULL;
1762 GVariant *result = NULL;
1763 GDBusConnection *conn;
1764 char *device_path = NULL;
1767 conn = _bt_hal_get_system_gconn();
1769 DBG("Could not get DBUS connection!");
1770 return BT_STATUS_FAIL;
1773 _bt_hal_convert_addr_type_to_string(address, bd_addr->address);
1774 device_path = _bt_hal_get_device_object_path(address);
1776 if (device_path == NULL) {
1777 ERR("No created device with address:[%s] in statck", address);
1778 return BT_STATUS_FAIL;
1780 proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1781 NULL, BT_HAL_BLUEZ_NAME,
1782 device_path, BT_HAL_DEVICE_INTERFACE, NULL, NULL);
1784 g_free(device_path);
1785 if (proxy == NULL) {
1786 ERR("Could not get Device Proxy");
1787 return BT_STATUS_FAIL;
1790 result = g_dbus_proxy_call_sync(proxy, "Disconnect",
1792 G_DBUS_CALL_FLAGS_NONE,
1796 if (error != NULL) {
1797 ERR("Dbus Call Error:[%s]", error->message);
1798 g_clear_error(&error);
1799 g_object_unref(proxy);
1800 return BT_STATUS_FAIL;
1803 g_object_unref(proxy);
1805 g_variant_unref(result);
1808 return BT_STATUS_SUCCESS;