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.
33 #include "bt-hal-log.h"
34 #include "bt-hal-msg.h"
35 #include "bt-hal-internal.h"
36 #include "bt-hal-event-receiver.h"
37 #include "bt-hal-dbus-common-utils.h"
38 #include "bt-hal-agent.h"
39 #include "bt-hal-adapter-le.h"
40 #include "bt-hal-gatt-server.h"
41 #include "bt-hal-gatt-client.h"
42 #include "bt-hal-adapter-dbus-handler.h"
44 #include "bt-internal-types.h"
46 #define BASELEN_PROP_CHANGED (sizeof(struct hal_ev_adapter_props_changed) \
47 + sizeof(struct hal_property))
49 /*TODO: Basic filters are currently added,
50 Need to add different event filters like HID,
51 Device etc in subsequent patches */
53 /* Global variables and structures */
54 static GDBusConnection *manager_conn;
55 static handle_stack_msg event_cb = NULL;
56 static handle_stack_msg hid_event_cb = NULL;
57 static handle_stack_msg hid_device_event_cb = NULL;
58 static handle_stack_msg av_event_cb = NULL;
59 static handle_stack_msg a2dp_sink_event_cb = NULL;
60 static handle_stack_msg hf_event_cb = NULL;
61 static handle_stack_msg hf_client_event_cb = NULL;
62 static handle_stack_msg avrcp_ctrl_event_cb = NULL;
63 static handle_stack_msg avrcp_tg_event_cb = NULL;
64 static handle_stack_msg gatt_event_cb = NULL;
65 static guint event_id;
67 /*State Management sepration Control for Adapter and LE */
68 static gboolean is_adapter_activating = FALSE;
69 static gboolean is_le_activating = FALSE;
74 gchar* interface_name;
77 } bt_hal_main_event_data_t;
79 /* Forward declarations */
80 static gboolean __bt_hal_event_manager(gpointer param);
81 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type);
82 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn, int subscribe);
83 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn, int subscribe);
84 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe);
86 static int __bt_hal_parse_event(GVariant *msg);
87 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current);
89 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path);
90 static void __bt_hal_adapter_property_changed_event(GVariant *msg);
91 static void __bt_hal_manager_event_filter(GDBusConnection *connection, const gchar *sender_name,
92 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
93 GVariant *parameters, gpointer user_data);
94 static int __bt_hal_initialize_manager_receiver(void);
95 static gboolean __bt_hal_parse_interface(GVariant *msg);
96 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters);
97 static gboolean __bt_hal_parse_device_properties(GVariant *item);
98 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data);
99 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path);
100 static void __bt_hal_dbus_device_found_properties(const char *device_path);
101 static void __bt_hal_device_properties_lookup(GVariant *result, char *address);
102 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member, const char *path);
103 static void __bt_hal_send_device_acl_connection_state_event(int status, gboolean connected, const char *address);
104 static void __bt_hal_handle_input_event(GVariant *msg, const char *path);
105 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address);
106 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address);
107 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address);
108 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member, const char *path);
109 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member, const char *path);
111 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted, const char *address);
112 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn, int subscribe);
113 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path);
114 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected, const char *address);
115 static void __bt_hal_send_hf_connection_state_event(gboolean connected, const char *address);
116 static void __bt_hal_send_device_trusted_profile_changed_event(uint32_t trust_val, const char *address);
117 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path);
118 static void __bt_hal_handle_gatts_mtu_changed_event(char *address, int mtu);
119 static void __bt_hal_send_hf_client_connection_state_event(gboolean connected, const char *address);
122 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data)
126 struct hal_ev_discovery_state_changed ev;
127 ev.state = HAL_DISCOVERY_STATE_STOPPED;
128 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
133 static int __bt_hal_parse_event(GVariant *msg)
137 char *interface_name = NULL;
138 GVariant *inner_iter = NULL;
140 g_variant_iter_init(&iter, msg);
142 while ((child = g_variant_iter_next_value(&iter))) {
143 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
144 if (g_strcmp0(interface_name,
145 BT_HAL_DEVICE_INTERFACE) == 0) {
146 DBG("__bt_hal_parse_event: Interface: BT_HAL_DEVICE_INTERFACE");
147 g_variant_unref(inner_iter);
148 g_variant_unref(child);
149 return BT_HAL_DEVICE_EVENT;
150 } else if (g_strcmp0(interface_name,
151 BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
152 DBG("__bt_hal_parse_event: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
153 g_variant_unref(inner_iter);
154 g_variant_unref(child);
155 return BT_HAL_MEDIA_TRANSFER_EVENT;
156 } else if (g_strcmp0(interface_name,
157 BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
158 DBG("__bt_hal_parse_event: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
159 g_variant_unref(inner_iter);
160 g_variant_unref(child);
161 return BT_HAL_AVRCP_CONTROL_EVENT;
163 g_variant_unref(inner_iter);
164 g_variant_unref(child);
170 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current)
172 g_variant_get(msg, "(&s&s&s)", name, previous, current);
173 return BT_HAL_ERROR_NONE;
176 int __bt_insert_hal_properties(void *buf, uint8_t type, uint16_t len, const void *val)
177 { struct hal_property *prop = buf;
183 memcpy(prop->val, val, len);
185 return sizeof(*prop) + len;
188 handle_stack_msg _bt_hal_get_stack_message_handler(void)
193 static void __bt_hal_adapter_property_changed_event(GVariant *msg)
195 GVariantIter value_iter;
196 GVariant *value = NULL;
197 GDBusProxy *adapter_proxy;
200 g_variant_iter_init(&value_iter, msg);
202 /* Buffer and propety count management */
203 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
204 struct hal_ev_adapter_props_changed *ev = (void*) buf;
206 const gchar *address = NULL;
208 unsigned int cod = 0;
209 unsigned int a2dp_role = 0;
210 gboolean discoverable;
211 gboolean connectable;
212 unsigned int scan_mode = BT_SCAN_MODE_NONE;
213 unsigned int disc_timeout;
214 const gchar *version;
215 gboolean ipsp_initialized;
218 unsigned int pairable_timeout;
219 gboolean scan_mode_property_update = FALSE;
220 gboolean is_discovering;
221 gboolean is_le_discovering;
223 memset(buf, 0, sizeof(buf));
226 ev->status = BT_STATUS_SUCCESS;
228 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
229 if (!g_strcmp0(key, "Address")) {
232 address = g_variant_get_string(value, NULL);
233 DBG("##Address [%s]", address);
234 _bt_hal_convert_addr_string_to_type(bdaddr, address);
235 size += __bt_insert_hal_properties(buf + size,
236 HAL_PROP_ADAPTER_ADDR, sizeof(bdaddr), bdaddr);
238 } else if (!g_strcmp0(key, "Alias")) {
239 g_variant_get(value, "&s", &name);
240 DBG("##Alias [%s] ", name);
241 size += __bt_insert_hal_properties(buf + size,
242 HAL_PROP_ADAPTER_NAME, strlen(name) + 1, name);
244 } else if (!g_strcmp0(key, "Class")) {
245 cod = g_variant_get_uint32(value);
246 DBG("##Class [%d]", cod);
247 size += __bt_insert_hal_properties(buf + size,
248 HAL_PROP_ADAPTER_CLASS, sizeof(unsigned int), &cod);
250 } else if (!g_strcmp0(key, "Discoverable")) {
251 discoverable = g_variant_get_boolean(value);
252 DBG("##Discoverable [%d]", discoverable);
254 scan_mode = BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE;
256 scan_mode = BT_SCAN_MODE_CONNECTABLE;
257 scan_mode_property_update = TRUE;
258 } else if (!g_strcmp0(key, "DiscoverableTimeout")) {
259 disc_timeout = g_variant_get_uint32(value);
260 DBG("##Discoverable Timeout [%d]", disc_timeout);
261 size += __bt_insert_hal_properties(buf + size,
262 HAL_PROP_ADAPTER_DISC_TIMEOUT, sizeof(unsigned int), &disc_timeout);
264 } else if (!g_strcmp0(key, "Connectable")) {
265 connectable = g_variant_get_boolean(value);
266 DBG("##Connectable [%d]", connectable);
268 scan_mode = BT_SCAN_MODE_NONE;
269 else if (scan_mode == BT_SCAN_MODE_NONE)
270 scan_mode = BT_SCAN_MODE_CONNECTABLE;
271 scan_mode_property_update = TRUE;
272 } else if (!g_strcmp0(key, "Version")) {
273 version = g_variant_get_string(value, NULL);
274 DBG("##Version [%s]", version);
275 size += __bt_insert_hal_properties(buf + size,
276 HAL_PROP_ADAPTER_VERSION, strlen(version) + 1, version);
278 } else if (!g_strcmp0(key, "Name")) {
279 g_variant_get(value, "&s", &name);
280 DBG("##Name [%s]", name);
281 size += __bt_insert_hal_properties(buf + size,
282 HAL_PROP_ADAPTER_NAME, strlen(name) + 1, name);
284 } else if (!g_strcmp0(key, "Powered")) {
285 powered = g_variant_get_boolean(value);
286 DBG("##Powered = %d", powered);
287 /* TODO: Need to check this operation!! */
288 if (powered == FALSE) {
289 DBG("###### Adapter Powered Down ######");
291 if (TIZEN_FEATURE_BT_USB_DONGLE) {
292 struct hal_ev_adapter_state_changed ev;
293 ev.state = HAL_POWER_OFF;
294 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
296 struct hal_ev_le_state_changed le_ev;
297 le_ev.state = HAL_POWER_OFF;
298 event_cb(HAL_EV_LE_STATE_CHANGED, &le_ev, sizeof(le_ev));
301 _bt_hal_destroy_adapter_agent();
303 DBG("Pending disalbed event after bluetoothd is terminated");
306 DBG("###### Adapter Powered Up ######");
307 if (_bt_hal_get_adapter_request_state()) {
308 DBG("Sending STATE CHANGE EVENT for Adapter... ");
309 _bt_hal_set_adapter_request_state(FALSE);
310 struct hal_ev_adapter_state_changed ev;
311 ev.state = HAL_POWER_ON;
312 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
315 if (_bt_hal_get_le_request_state()) {
316 DBG("Sending STATE CHANGE EVENT for LE... ");
317 _bt_hal_set_le_request_state(FALSE);
318 struct hal_ev_le_state_changed ev;
319 ev.state = HAL_POWER_ON;
320 event_cb(HAL_EV_LE_STATE_CHANGED, &ev, sizeof(ev));
324 _bt_hal_initialize_adapter_agent();
327 } else if (!g_strcmp0(key, "Pairable")) {
328 pairable = g_variant_get_boolean(value);
329 DBG("##Pairable [%d]", pairable);
330 } else if (!g_strcmp0(key, "PairableTimeout")) {
331 pairable_timeout = g_variant_get_uint32(value);
332 DBG("##Pairable Timeout = %d", pairable_timeout);
333 } else if (!g_strcmp0(key, "UUIDs")) {
338 size1 = g_variant_get_size(value);
339 int num_props_tmp = ev->num_props;
341 uuid_value = (char **)g_variant_get_strv(value, &size1);
342 for (i = 0; uuid_value[i] != NULL; i++)
344 /* UUID collection */
345 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
346 for (i = 0; uuid_value[i] != NULL; i++) {
347 char *uuid_str = NULL;
348 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
349 uuid_str = g_strdup(uuid_value[i]);
350 DBG("##UUID string [%s]\n", uuid_str);
351 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
352 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
355 size += __bt_insert_hal_properties(buf + size, HAL_PROP_ADAPTER_UUIDS,
356 (BT_HAL_STACK_UUID_SIZE * uuid_count),
358 ev->num_props = num_props_tmp + 1;
361 } else if (!g_strcmp0(key, "Discovering")) {
362 is_discovering = g_variant_get_boolean(value);
363 DBG("##Discovering = [%d]", is_discovering);
365 if (is_discovering == FALSE) {
366 /* In Tizen Bluez, this actually does not mean Discovery is stopped
367 in Bluez. Tizen Bluez sends this event after a certain timeout,
368 Therefore, we must forecefully call StopDiscovery to stop discovery in BlueZ */
372 adapter_proxy = _bt_hal_get_adapter_proxy();
374 if (adapter_proxy == NULL)
377 /* Need to stop searching */
378 DBG("Event though Bluez reported DIscovering stopped, we force stop Discovery ");
379 g_dbus_proxy_call_sync(adapter_proxy, "StopDiscovery",
381 G_DBUS_CALL_FLAGS_NONE,
385 struct hal_ev_discovery_state_changed ev;
387 ERR("Dbus Error : %s", err->message);
389 if (g_strrstr(err->message, "No discovery started"))
392 /* This error is thrown by Bluez, as Discovery is already stopped.
393 Discovery is stopped if user cancels on going discovery.
394 In order to maintain correct state of Bluetooth Discovery state,
395 simply send Discovery stopped event to HAL user */
396 ev.state = HAL_DISCOVERY_STATE_STOPPED;
397 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
402 event_id = g_timeout_add(BT_HAL_DISCOVERY_FINISHED_DELAY,
403 (GSourceFunc)__bt_hal_discovery_finished_cb, NULL);
407 struct hal_ev_discovery_state_changed ev;
408 ev.state = HAL_DISCOVERY_STATE_STARTED;
409 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
412 } else if (!g_strcmp0(key, "LEDiscovering")) {
415 is_le_discovering = g_variant_get_boolean(value);
416 DBG("##LE Discovering = [%d]", is_le_discovering);
418 if (is_le_discovering) {
419 /* Send LE discovering started event */
420 size += __bt_insert_hal_properties(buf + size,
421 HAL_PROP_ADAPTER_LE_DISCOVERY_STARTED, 0, NULL);
426 adapter_proxy = _bt_hal_get_adapter_proxy();
427 if (adapter_proxy == NULL) {
428 ERR("adapter_proxy == NULL");
432 /* Need to stop searching */
433 result = g_dbus_proxy_call_sync(adapter_proxy, "StopLEDiscovery",
434 NULL, G_DBUS_CALL_FLAGS_NONE,
435 DBUS_TIMEOUT, NULL, &err);
437 ERR("Error occured in Proxy call");
439 ERR("(Error: %s)", err->message);
443 g_variant_unref(result);
446 /* Send LE discovering finished event */
447 size += __bt_insert_hal_properties(buf + size,
448 HAL_PROP_ADAPTER_LE_DISCOVERY_STOPPED, 0, NULL);
450 } else if (!g_strcmp0(key, "Modalias")) {
451 char *modalias = NULL;
452 g_variant_get(value, "&s", &modalias);
453 DBG("##Adapter ModAlias [%s]", modalias);
454 } else if (!g_strcmp0(key, "SupportedLEFeatures")) {
455 DBG("##LE Supported features");
458 GVariantIter *iter = NULL;
459 g_variant_get(value, "as", &iter);
460 bt_local_le_features_t le_features;
461 gboolean le_features_present = FALSE;
466 memset(&le_features, 0x00, sizeof(le_features));
468 while (g_variant_iter_next(iter, "&s", &name) &&
469 g_variant_iter_next(iter, "&s", &val)) {
470 DBG("name = %s, Value = %s", name, val);
471 if (FALSE == _bt_hal_update_le_feature_support(name, val, &le_features))
472 ERR("Failed to update LE feature (name = %s, value = %s)", name, val);
474 le_features_present = TRUE;
477 g_variant_iter_free(iter);
478 if (le_features_present) {
479 size += __bt_insert_hal_properties(buf + size,
480 HAL_PROP_ADAPTER_LOCAL_LE_FEAT, sizeof(le_features), &le_features);
483 DBG("le supported features values are NOT provided by Stack");
485 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
486 g_variant_get(value, "b" , &ipsp_initialized);
487 DBG("##IPSP Initialized = %d", ipsp_initialized);
488 } else if (!g_strcmp0(key, "A2dpRole")) {
489 a2dp_role = g_variant_get_uint32(value);
490 DBG("##A2dp Role [%d]", a2dp_role);
491 size += __bt_insert_hal_properties(buf + size,
492 HAL_PROP_ADAPTER_A2DP_ROLE, sizeof(unsigned int), &a2dp_role);
495 ERR("Unhandled Property:[%s]", key);
499 if (scan_mode_property_update) {
500 size += __bt_insert_hal_properties(buf + size,
501 HAL_PROP_ADAPTER_SCAN_MODE, sizeof(int), &scan_mode);
507 DBG("Send Adapter properties changed event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
508 event_cb(HAL_EV_ADAPTER_PROPS_CHANGED, buf, size);
512 void _bt_hal_handle_adapter_event(GVariant *msg, const char *member)
517 if (strcasecmp(member, "DeviceCreated") == 0) {
518 DBG("DeviceCreated: Unhandled");
519 } else if (strcasecmp(member, "AdvertisingEnabled") == 0) {
521 gboolean status = FALSE;
522 g_variant_get(msg, "(ib)", &slot_id, &status);
524 /* Send event to application */
525 _bt_hal_set_advertising_status(slot_id, status);
526 } else if (strcasecmp(member, "RssiEnabled") == 0) {
527 struct hal_ev_rssi_monitor_state_changed ev;
528 gboolean status = FALSE;
529 char *address = NULL;
532 g_variant_get(msg, "(sib)", &address, &link_type, &status);
533 DBG("RSSI monitoring %s for %s",
534 (status ? "Enabled" : "Disabled"), address);
536 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
537 ev.link_type = link_type;
538 ev.state = (status ? HAL_RSSI_MONITORING_ENABLED : HAL_RSSI_MONITORING_DISABLED);
540 ERR("event_cb is NULL");
542 event_cb(HAL_EV_RSSI_MONITOR_STATE_CHANGED, &ev, sizeof(ev));
545 } else if (strcasecmp(member, "RssiAlert") == 0) {
546 struct hal_ev_rssi_alert_recieved ev;
550 char *address = NULL;
552 g_variant_get(msg, "(siii)", &address, &link_type, &alert_type, &rssi_dbm);
553 DBG("RSSI Alert: [Address %s LinkType %d] [Type %d DBM %d]",
554 address, alert_type, rssi_dbm, link_type);
556 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
557 ev.link_type = link_type;
558 ev.alert_type = alert_type;
562 ERR("event_cb is NULL");
564 event_cb(HAL_EV_RSSI_ALERT_RECIEVED, &ev, sizeof(ev));
567 } else if (strcasecmp(member, "RawRssi") == 0) {
568 struct hal_ev_raw_rssi_recieved ev;
571 char *address = NULL;
573 g_variant_get(msg, "(sii)", &address, &link_type, &rssi_dbm);
574 DBG("Raw RSSI: [Address %s] [Link Type %d][RSSI DBM %d]",
575 address, link_type, rssi_dbm);
577 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
578 ev.link_type = link_type;
582 ERR("event_cb is NULL");
584 event_cb(HAL_EV_RAW_RSSI_RECIEVED, &ev, sizeof(ev));
587 } else if (strcasecmp(member, BT_HAL_HARDWARE_ERROR) == 0) {
589 DBG("BT Hardware Error: Unhandled");
591 struct hal_ev_controller_error_recieved info;
593 INFO("### BT Hardware Error");
594 info.code = HAL_CONTROLLER_ERROR_HW_ERROR;
595 event_cb(HAL_EV_CONTROLLER_ERROR_RECIEVED, &info, sizeof(info));
597 } else if (strcasecmp(member, BT_HAL_TX_TIMEOUT_ERROR) == 0) {
599 DBG("BT Hardware Error: Unhandled");
601 struct hal_ev_controller_error_recieved info;
603 INFO("### BT TX Timeout Error");
604 info.code = HAL_CONTROLLER_ERROR_TX_TIMEOUT;
605 event_cb(HAL_EV_CONTROLLER_ERROR_RECIEVED, &info, sizeof(info));
607 } else if (strcasecmp(member, BT_HAL_DBFW_PLUS_INFO) == 0) {
609 DBG("### DBFW+ info received from BLUEZ");
610 struct hal_ev_dbfw_plus_info_recieved info;
613 unsigned char *buffer = NULL;
614 GVariant *value = NULL;
616 g_variant_get(msg, "(y@ay)", &event_code, &value);
618 ERR("g_variant_get fails");
620 length = g_variant_get_size(value);
622 ERR("Invalid g_variant len = %d", length);
624 info.event_code = event_code;
625 buffer = (unsigned char*)g_variant_get_data(value);
626 info.data = g_memdup(buffer, length);
627 info.data_len = length;
629 ERR("event_cb is NULL");
631 event_cb(HAL_EV_DBFW_PLUS_INFO_RECIEVED, &info, sizeof(info));
639 static gboolean __bt_hal_parse_device_properties(GVariant *item)
645 gboolean is_bredr_dev = FALSE;
650 /* Buffer and propety count management */
651 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
652 struct hal_ev_device_found *ev = (void *) buf;
654 memset(buf, 0, sizeof(buf));
658 g_variant_iter_init(&iter, item);
659 while (g_variant_iter_loop(&iter, "{sv}", &key, &val)) {
661 if (strcasecmp(key, "Address") == 0) {
662 char * address = NULL;
663 address = g_variant_dup_string(val, &len);
665 _bt_hal_convert_addr_string_to_type(bdaddr, address);
667 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
668 sizeof(bdaddr), bdaddr);
671 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
673 } else if (strcasecmp(key, "AddressType") == 0) {
674 char *addresstype = g_variant_dup_string(val, &len);
676 DBG("AddressType [%s]", addresstype);
678 } else if (strcasecmp(key, "Class") == 0) {
679 unsigned int class = g_variant_get_uint32(val);
680 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
681 sizeof(unsigned int), &class);
683 DBG("Device class [%d] Property num [%d]", class, ev->num_props);
685 } else if (strcasecmp(key, "name") == 0) {
686 char *name = g_variant_dup_string(val, &len);
688 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
689 strlen(name) + 1, name);
691 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
694 } else if (strcasecmp(key, "Connected") == 0) {
695 unsigned int connected = g_variant_get_byte(val);
697 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
698 sizeof(unsigned int), &connected);
700 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
701 } else if (strcasecmp(key, "paired") == 0) {
702 uint8_t paired = (g_variant_get_boolean(val) ? 1 : 0);
703 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
704 sizeof(uint8_t), &paired);
706 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
707 } else if (strcasecmp(key, "Trusted") == 0) {
708 uint8_t trust = (g_variant_get_boolean(val) ? 1 : 0);
709 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
710 sizeof(uint8_t), &trust);
712 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
713 } else if (strcasecmp(key, "RSSI") == 0) {
714 int rssi = g_variant_get_int16(val);
715 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
718 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
719 } else if (strcasecmp(key, "LastAddrType") == 0) {
720 /* TODO: To be handled later*/
721 } else if (!g_strcmp0(key, "IsAliasSet")) {
722 uint8_t is_alias_set = (g_variant_get_boolean(val) ? 1 : 0);
723 DBG("IsAliasSet: %s", (is_alias_set ? "TRUE" : "FALSE"));
724 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
725 sizeof(uint8_t), &is_alias_set);
727 } else if (strcasecmp(key, "UUIDs") == 0) {
732 size1 = g_variant_get_size(val);
733 DBG("UUID count from size [%zu]\n", size1);
734 int num_props_tmp = ev->num_props;
737 uuid_value = (char **)g_variant_get_strv(val, &size1);
738 for (i = 0; uuid_value[i] != NULL; i++)
740 DBG("UUID count [%d]\n", uuid_count);
741 /* UUID collection */
742 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
744 for (i = 0; uuid_value[i] != NULL; i++) {
746 char *uuid_str = NULL;
747 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
748 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
750 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
751 uuid_str = g_strdup(uuid_value[i]);
752 DBG("UUID string [%s]\n", uuid_str);
753 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
754 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
758 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
759 (BT_HAL_STACK_UUID_SIZE * uuid_count),
761 ev->num_props = num_props_tmp + 1;
765 } else if (strcasecmp(key, "LegacyManufacturerDataLen") == 0) {
766 /* TODO: To be handled later*/
767 } else if (strcasecmp(key, "LegacyManufacturerData") == 0) {
768 /* TODO: To be handled later*/
770 DBG("Unhandled Property:[%s]", key);
774 if (size > 1 && is_bredr_dev) {
775 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
776 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
782 static void __bt_hal_handle_avrcp_tg_events(GVariant *msg, const char *path)
785 GVariantIter value_iter;
786 char *property = NULL;
788 GVariant *val = NULL;
789 GVariant *child = NULL;
791 g_variant_iter_init(&value_iter, msg);
792 while ((child = g_variant_iter_next_value(&value_iter))) {
793 g_variant_get(child, "{sv}", &property, &val);
794 INFO("Property %s", property);
795 if (strcasecmp(property, "Connected") == 0) {
796 struct hal_ev_avrcp_tg_conn_state ev;
798 gboolean connected = FALSE;
800 g_variant_get(val, "b", &connected);
802 state = connected ? HAL_AVRCP_TG_STATE_CONNECTED :
803 HAL_AVRCP_TG_STATE_DISCONNECTED;
805 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
807 _bt_hal_convert_device_path_to_address(path, address);
809 DBG("connected: %d", connected);
810 DBG("address: %s", address);
812 /* Prepare to send AVRCP Target connection state event */
813 memset(&ev, 0, sizeof(ev));
814 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
816 if (!avrcp_tg_event_cb)
817 ERR("AVRCP target DBUS handler callback not registered");
819 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_CONN_STATE, (void *)&ev, sizeof(ev));
823 g_variant_unref(child);
824 g_variant_unref(val);
830 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path)
832 char *interface_name = NULL;
833 GVariant *val = NULL;
835 g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, &val, NULL);
837 if (!interface_name) {
838 DBG("Failed to get interface name");
841 g_variant_unref(val);
845 if (strcasecmp(interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
846 DBG("Event: Property Changed: Interface: BT_HAL_ADAPTER_INTERFACE");
847 __bt_hal_adapter_property_changed_event(val);
848 } else if (strcasecmp(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
849 DBG("Event: Property Changed: Interface: BT_HAL_DEVICE_INTERFACE");
850 __bt_hal_device_property_changed_event(val, object_path);
851 } else if (strcasecmp(interface_name, BT_HAL_OBEX_TRANSFER_INTERFACE) == 0) {
852 DBG("Event: Property Changed: Interface: BT_HAL_OBEX_TRANSFER_INTERFACE");
853 /* TODO: Handle event */
854 } else if (strcasecmp(interface_name, BT_HAL_MEDIA_CONTROL_INTERFACE) == 0) {
855 DBG("Event: Property Changed: Interface: BT_HAL_MEDIA_CONTROL_INTERFACE");
856 /* Handle AVRCP target event */
857 __bt_hal_handle_avrcp_tg_events(val, object_path);
858 } else if (strcasecmp(interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
859 DBG("Event: Property Changed: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
860 __bt_hal_handle_avrcp_ctrl_events(val, NULL, object_path);
861 } else if (strcasecmp(interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
862 DBG("Event: Property Changed: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
863 __bt_hal_handle_avrcp_transport_events(val, NULL, object_path);
864 } else if (strcasecmp(interface_name, BT_HAL_NETWORK_CLIENT_INTERFACE) == 0) {
865 DBG("Event: Property Changed: Interface: BT_HAL_NETWORK_CLIENT_INTERFACE");
866 /* TODO: Handle event */
867 } else if (strcasecmp(interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
868 DBG("Event: Property Changed: Interface: BT_HAL_GATT_CHAR_INTERFACE");
869 /* TODO: Handle event */
870 } else if (strcasecmp(interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
871 DBG("Event: Property Changed: Interface: BT_HAL_INPUT_INTERFACE");
872 __bt_hal_handle_input_event(val, object_path);
874 g_variant_unref(val);
877 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters)
881 if (__bt_hal_parse_interface(parameters) == FALSE) {
882 ERR("Fail to parse the properies");
883 g_variant_unref(value);
888 static void __bt_hal_send_hid_connection_state_event(
889 gboolean connected, const char *address)
891 struct hal_ev_hidhost_conn_state ev;
893 ev.state = (connected == TRUE) ?
894 HAL_HIDHOST_STATE_CONNECTED :
895 HAL_HIDHOST_STATE_DISCONNECTED;
897 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
900 ERR("HID event handler not registered");
902 hid_event_cb(HAL_EV_HIDHOST_CONN_STATE, &ev, sizeof(ev));
905 static void __bt_hal_send_hid_device_connection_state_event(
906 gboolean connected, const char *address)
908 struct hal_ev_hiddevice_conn_state ev;
910 ev.state = (connected == TRUE) ?
911 HAL_HIDDEVICE_STATE_CONNECTED :
912 HAL_HIDDEVICE_STATE_DISCONNECTED;
914 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
916 if (!hid_device_event_cb)
917 ERR("HID device event handler not registered");
919 hid_device_event_cb(HAL_EV_HIDDEVICE_CONN_STATE, &ev, sizeof(ev));
922 static void __bt_hal_handle_input_event(GVariant *msg, const char *path)
924 gboolean property_flag = FALSE;
925 GVariantIter value_iter;
926 char *property = NULL;
927 GVariant *child = NULL, *val = NULL;
930 g_variant_iter_init(&value_iter, msg);
931 while ((child = g_variant_iter_next_value(&value_iter))) {
932 g_variant_get(child, "{sv}", &property, &val);
934 if (property == NULL)
937 if (strcasecmp(property, "Connected") == 0) {
940 g_variant_get(val, "b", &property_flag);
941 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
942 _bt_hal_convert_device_path_to_address(path, address);
943 __bt_hal_send_hid_connection_state_event(property_flag, address);
947 g_variant_unref(val);
948 g_variant_unref(child);
952 static gboolean __bt_hal_parse_interface(GVariant *msg)
955 GVariant *optional_param;
958 char *interface_name = NULL;
959 GVariant *inner_iter = NULL;
960 g_variant_get(msg, "(&o@a{sa{sv}})",
961 &path, &optional_param);
962 g_variant_iter_init(&iter, optional_param);
964 while ((child = g_variant_iter_next_value(&iter))) {
965 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
966 if (g_strcmp0(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
967 DBG("Found a device: %s", path);
968 if (__bt_hal_parse_device_properties(inner_iter) == FALSE) {
969 g_variant_unref(inner_iter);
970 g_variant_unref(child);
971 g_variant_unref(optional_param);
972 ERR("Fail to parse the properies");
975 g_variant_unref(inner_iter);
976 g_variant_unref(child);
977 g_variant_unref(optional_param);
981 g_variant_unref(inner_iter);
982 g_variant_unref(child);
985 g_variant_unref(optional_param);
990 void __bt_hal_handle_gatt_char_event(GVariant *parameters, const char *signal_name)
994 if (signal_name == NULL)
997 if (strcasecmp(signal_name, "GattValueChanged") == 0) {
998 DBG("GattValueChanged event received");
1001 const char *char_handle = NULL;
1002 GVariant *char_value_var = NULL;
1004 char *char_value = NULL;
1006 g_variant_get(parameters, "(i&s@ay)", &result, &char_handle, &char_value_var);
1007 DBG("char handle: %s", char_handle);
1009 len = g_variant_get_size(char_value_var);
1011 char_value = (char *)g_variant_get_data(char_value_var);
1013 _bt_hal_handle_gattc_value_changed_event(result, char_handle, char_value, len);
1015 g_variant_unref(char_value_var);
1019 static void __bt_hal_handle_gatt_service_event(GVariant *parameters, const char *signal_name)
1021 if (signal_name == NULL)
1024 if (strcasecmp(signal_name, "GattServiceAdded") == 0) {
1026 g_variant_get(parameters, "(&s)", &path);
1027 _bt_hal_handle_gattc_service_changed_event(TRUE, path);
1031 static gboolean __bt_hal_event_manager(gpointer data)
1033 bt_hal_event_type_t bt_event = 0x00;
1035 char *obj_path = NULL;
1037 bt_hal_main_event_data_t *param = (bt_hal_main_event_data_t*)data;
1038 if (strcasecmp(param->signal_name, "InterfacesAdded") == 0) {
1040 /*TODO: Handle Interfaces Added Signal from stack */
1042 g_variant_get(param->parameters, "(&o@a{sa{sv}})", &obj_path, &value);
1044 if (obj_path == NULL) {
1045 ERR("obj_path is NULL");
1049 if (strcasecmp(obj_path, BT_HAL_BLUEZ_HCI_PATH) == 0) {
1050 /* TODO: Handle adapter added */
1051 DBG("Manager Event: Signal Name: InterfiacesAdded: Adapter added in bluetoothd: path [hci0]");
1053 bt_event = __bt_hal_parse_event(value);
1054 if (bt_event == BT_HAL_DEVICE_EVENT) {
1055 __bt_hal_handle_device_event(value, param->parameters);
1056 } else if (bt_event == BT_HAL_AVRCP_CONTROL_EVENT) {
1057 _bt_hal_set_control_device_path(obj_path);
1060 g_variant_unref(value);
1062 } else if (strcasecmp(param->signal_name, "InterfacesRemoved") == 0) {
1066 /*TODO: Handle Interfaces Removed Signal from stack */
1068 g_variant_get(param->parameters, "(&oas)", &obj_path, &iter);
1069 while (g_variant_iter_loop(iter, "s", &str)) {
1070 if (g_strcmp0(str, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0)
1071 _bt_hal_remove_control_device_path(obj_path);
1072 else if (g_strcmp0(str, BT_HAL_GATT_SERVICE_INTERFACE) == 0)
1073 _bt_hal_handle_gattc_service_changed_event(FALSE, obj_path);
1075 g_variant_iter_free(iter);
1076 } else if (strcasecmp(param->signal_name, "NameOwnerChanged") == 0) {
1078 char *previous = NULL;
1079 char *current = NULL;
1081 if (g_strcmp0(g_variant_get_type_string(param->parameters), "(sss)") != 0) {
1082 ERR("Invalid variant format");
1086 /* TODO: Handle Name Owener changed Signal */
1087 if (__bt_hal_get_owner_info(param->parameters, &name, &previous, ¤t)) {
1088 ERR("Fail to get the owner info");
1092 if (*current != '\0')
1098 if (strcasecmp(name, BT_HAL_BLUEZ_NAME) == 0) {
1099 struct hal_ev_adapter_state_changed ev;
1100 struct hal_ev_le_state_changed le_ev;
1102 INFO("Bluetoothd is terminated");
1104 /* Send the disable event in here */
1106 ev.state = HAL_POWER_OFF;
1107 le_ev.state = HAL_POWER_OFF;
1109 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
1110 event_cb(HAL_EV_LE_STATE_CHANGED, &le_ev, sizeof(le_ev));
1113 _bt_hal_destroy_adapter_agent();
1114 _bt_hal_le_deinit();
1116 } else if (g_strcmp0(param->interface_name, BT_HAL_PROPERTIES_INTERFACE) == 0) {
1117 __bt_hal_handle_property_changed_event(param->parameters, param->object_path);
1118 } else if (g_strcmp0(param->interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
1119 DBG("Manager Event: Interface Name: BT_HAL_ADAPTER_INTERFACE");
1120 _bt_hal_handle_adapter_event(param->parameters, param->signal_name);
1121 } else if (g_strcmp0(param->interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
1122 DBG("Manager Event: Interface Name: BT_HAL_INPUT_INTERFACE");
1123 __bt_hal_handle_input_event(param->parameters, param->object_path);
1124 } else if (g_strcmp0(param->interface_name, BT_HAL_NETWORK_SERVER_INTERFACE) == 0) {
1125 /* TODO: Handle Network Server events from stack */
1126 DBG("Manager Event: Interface Name: BT_HAL_NETWORK_SERVER_INTERFACE");
1127 } else if (g_strcmp0(param->interface_name, BT_HAL_HEADSET_INTERFACE) == 0) {
1128 DBG("Manager Event: Interface Name: BT_HAL_HEADSET_INTERFACE");
1129 __bt_hal_handle_headset_events(param->parameters, param->signal_name, param->object_path);
1130 } else if (g_strcmp0(param->interface_name, BT_HAL_SINK_INTERFACE) == 0) {
1131 /* TODO: Handle Sink interface events from stack */
1132 DBG("Manager Event: Interface Name:BT_HAL_SINK_INTERFACE");
1133 } else if (g_strcmp0(param->interface_name, BT_HAL_AGENT_INTERFACE) == 0) {
1134 /* TODO: Handle Agent events from stack */
1135 DBG("Manager Event: Interface Name:BT_HAL_AGENT_INTERFACE");
1136 } else if (g_strcmp0(param->interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
1137 DBG("Manager Event: Interface Name:BT_HAL_DEVICE_INTERFACE");
1138 __bt_hal_handle_device_specific_events(param->parameters, param->signal_name, param->object_path);
1139 } else if (g_strcmp0(param->interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
1140 DBG("Manager Event: Interface Name: BT_HAL_PLAYER_CONTROL_INTERFACE");
1141 __bt_hal_handle_avrcp_ctrl_events(param->parameters, param->signal_name, param->object_path);
1142 } else if (g_strcmp0(param->interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
1143 DBG("Manager Event: Interface Name: BT_HAL_MEDIATRANSPORT_INTERFACE");
1144 __bt_hal_handle_avrcp_transport_events(param->parameters, param->signal_name, param->object_path);
1145 } else if (g_strcmp0(param->interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
1146 DBG("Manager Event: Interface Name: BT_HAL_GATT_CHAR_INTERFACE");
1147 __bt_hal_handle_gatt_char_event(param->parameters, param->signal_name);
1148 } else if (g_strcmp0(param->interface_name, BT_HAL_GATT_SERVICE_INTERFACE) == 0) {
1149 DBG("Manager Event: Interface Name: BT_HAL_GATT_SERVICE_INTERFACE");
1150 __bt_hal_handle_gatt_service_event(param->parameters, param->signal_name);
1154 g_free(param->sender_name);
1155 g_free(param->object_path);
1156 g_free(param->interface_name);
1157 g_free(param->signal_name);
1158 g_variant_unref(param->parameters);
1163 static void __bt_hal_manager_event_filter(GDBusConnection *connection,
1164 const gchar *sender_name,
1165 const gchar *object_path,
1166 const gchar *interface_name,
1167 const gchar *signal_name,
1168 GVariant *parameters,
1171 if (signal_name == NULL)
1174 bt_hal_main_event_data_t *param = g_new0(bt_hal_main_event_data_t, 1);
1175 param->sender_name = g_strdup(sender_name);
1176 param->object_path = g_strdup(object_path);
1177 param->interface_name = g_strdup(interface_name);
1178 param->signal_name = g_strdup(signal_name);
1179 param->parameters = g_variant_ref(parameters);
1181 g_idle_add(__bt_hal_event_manager, (gpointer)param);
1185 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path)
1187 gboolean property_flag = FALSE;
1188 char *property = NULL;
1189 GVariant *value = NULL;
1190 g_variant_get(msg, "(sv)", &property, &value);
1192 if (property == NULL)
1195 DBG("Property = %s \n", property);
1196 /* We allow only 1 headset connection (HSP or HFP)*/
1197 if (strcasecmp(property, "Connected") == 0) {
1199 g_variant_get(value, "b", &property_flag);
1201 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1203 /* Fix : NULL_RETURNS */
1204 if (address == NULL)
1207 _bt_hal_convert_device_path_to_address(path, address);
1208 __bt_hal_send_hf_audio_connection_state_event(property_flag, address);
1210 } else if (strcasecmp(property, "State") == 0) {
1213 g_variant_get(value, "s", &state);
1215 /* This code assumes we support only 1 headset connection */
1216 /* Need to use the headset list, if we support multi-headsets */
1217 if (strcasecmp(state, "Playing") == 0) {
1218 DBG("Playing: Sco Connected");
1219 } else if (strcasecmp(state, "connected") == 0 ||
1220 strcasecmp(state, "disconnected") == 0) {
1221 if (strcasecmp(state, "connected") == 0)
1222 DBG("Sco Connected");
1224 DBG("Sco Disconnected");
1226 ERR("Not handled state - %s", state);
1231 } else if (strcasecmp(property, "SpeakerGain") == 0) {
1234 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1236 _bt_hal_convert_device_path_to_address(path, address);
1237 INFO("Speaker Gain for address [%s]", address);
1238 /* TODO Handle event sending to HAL */
1241 } else if (strcasecmp(property, "MicrophoneGain") == 0) {
1244 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1246 _bt_hal_convert_device_path_to_address(path, address);
1247 INFO("Microphone Gain for address [%s]", address);
1248 /* TODO Handle event sending to HAL */
1255 g_variant_unref(value);
1258 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn,
1264 static int subs_interface_added_id = -1;
1265 static int subs_interface_removed_id = -1;
1266 static int subs_name_owner_id = -1;
1267 static int subs_property_id = -1;
1268 static int subs_adapter_id = -1;
1271 if (subs_interface_added_id == -1) {
1272 subs_interface_added_id = g_dbus_connection_signal_subscribe(conn,
1273 NULL, BT_HAL_MANAGER_INTERFACE,
1274 BT_HAL_INTERFACES_ADDED, NULL, NULL, 0,
1275 __bt_hal_manager_event_filter,
1278 if (subs_interface_removed_id == -1) {
1279 subs_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
1280 NULL, BT_HAL_MANAGER_INTERFACE,
1281 BT_HAL_INTERFACES_REMOVED, NULL, NULL, 0,
1282 __bt_hal_manager_event_filter,
1285 if (subs_name_owner_id == -1) {
1286 subs_name_owner_id = g_dbus_connection_signal_subscribe(conn,
1287 NULL, BT_HAL_FREEDESKTOP_INTERFACE,
1288 BT_HAL_NAME_OWNER_CHANGED, NULL, NULL, 0,
1289 __bt_hal_manager_event_filter,
1292 if (subs_property_id == -1) {
1293 subs_property_id = g_dbus_connection_signal_subscribe(conn,
1294 BT_HAL_BLUEZ_NAME, BT_HAL_PROPERTIES_INTERFACE,
1295 BT_HAL_PROPERTIES_CHANGED, NULL, NULL, 0,
1296 __bt_hal_manager_event_filter,
1299 if (subs_adapter_id == -1) {
1300 subs_adapter_id = g_dbus_connection_signal_subscribe(conn,
1301 NULL, BT_HAL_ADAPTER_INTERFACE,
1302 NULL, NULL, NULL, 0,
1303 __bt_hal_manager_event_filter,
1307 if (subs_interface_added_id != -1) {
1308 g_dbus_connection_signal_unsubscribe(conn,
1309 subs_interface_added_id);
1310 subs_interface_added_id = -1;
1312 if (subs_interface_removed_id != -1) {
1313 g_dbus_connection_signal_unsubscribe(conn,
1314 subs_interface_removed_id);
1315 subs_interface_removed_id = -1;
1317 if (subs_name_owner_id != -1) {
1318 g_dbus_connection_signal_unsubscribe(conn,
1319 subs_name_owner_id);
1320 subs_name_owner_id = -1;
1322 if (subs_property_id != -1) {
1323 g_dbus_connection_signal_unsubscribe(conn,
1325 subs_property_id = -1;
1327 if (subs_adapter_id == -1) {
1328 g_dbus_connection_signal_unsubscribe(conn, subs_adapter_id);
1329 subs_adapter_id = -1;
1336 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn,
1339 static int subs_device_id = -1;
1345 if (subs_device_id == -1) {
1346 subs_device_id = g_dbus_connection_signal_subscribe(conn,
1347 NULL, BT_HAL_DEVICE_INTERFACE,
1348 NULL, NULL, NULL, 0,
1349 __bt_hal_manager_event_filter,
1353 if (subs_device_id != -1) {
1354 g_dbus_connection_signal_unsubscribe(conn,
1356 subs_device_id = -1;
1363 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe)
1365 static int subs_input_id = -1;
1371 if (subs_input_id == -1) {
1372 subs_input_id = g_dbus_connection_signal_subscribe(conn,
1373 NULL, BT_HAL_INPUT_INTERFACE,
1374 NULL, NULL, NULL, 0,
1375 __bt_hal_manager_event_filter,
1379 if (subs_input_id != -1) {
1380 g_dbus_connection_signal_unsubscribe(conn,
1389 static int __bt_hal_register_gatt_subscribe_signal(GDBusConnection *conn,
1392 static int subs_gatt_char_id = -1;
1393 static int subs_gatt_service_id = -1;
1396 if (subs_gatt_char_id == -1) {
1397 subs_gatt_char_id = g_dbus_connection_signal_subscribe(conn,
1398 NULL, BT_HAL_GATT_CHAR_INTERFACE,
1399 NULL, NULL, NULL, 0,
1400 __bt_hal_manager_event_filter,
1403 if (subs_gatt_service_id == -1) {
1404 subs_gatt_service_id = g_dbus_connection_signal_subscribe(conn,
1405 NULL, BT_HAL_GATT_SERVICE_INTERFACE,
1406 NULL, NULL, NULL, 0,
1407 __bt_hal_manager_event_filter,
1411 if (subs_gatt_char_id == -1) {
1412 g_dbus_connection_signal_unsubscribe(conn,
1414 subs_gatt_char_id = -1;
1416 if (subs_gatt_service_id == -1) {
1417 g_dbus_connection_signal_unsubscribe(conn,
1418 subs_gatt_service_id);
1419 subs_gatt_service_id = -1;
1423 return BT_HAL_ERROR_NONE;
1428 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type)
1431 return BT_HAL_ERROR_INTERNAL;
1433 /* TODO: Add more events in subsequent patches */
1434 switch (event_type) {
1435 case BT_HAL_MANAGER_EVENT:
1436 __bt_hal_register_manager_subscribe_signal(g_conn, TRUE);
1438 case BT_HAL_DEVICE_EVENT:
1439 __bt_hal_register_device_subscribe_signal(g_conn, TRUE);
1441 case BT_HAL_HID_EVENT:
1442 __bt_hal_register_input_subscribe_signal(g_conn, TRUE);
1444 case BT_HAL_HEADSET_EVENT:
1445 __bt_hal_register_audio_subscribe_signal(g_conn, TRUE);
1447 case BT_HAL_GATT_EVENT:
1448 __bt_hal_register_gatt_subscribe_signal(g_conn, TRUE);
1451 INFO_C("Register Event: event_type [%d]", event_type);
1452 return BT_HAL_ERROR_NOT_SUPPORT;
1455 return BT_HAL_ERROR_NONE;
1458 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn,
1464 static int subs_headset_id = -1;
1465 static int subs_sink_id = -1;
1468 if (subs_headset_id == -1) {
1469 subs_headset_id = g_dbus_connection_signal_subscribe(conn,
1470 NULL, BT_HAL_HEADSET_INTERFACE,
1471 NULL, NULL, NULL, 0,
1472 __bt_hal_manager_event_filter,
1475 if (subs_sink_id == -1) {
1476 subs_sink_id = g_dbus_connection_signal_subscribe(conn,
1477 NULL, BT_HAL_SINK_INTERFACE,
1478 NULL, NULL, NULL, 0,
1479 __bt_hal_manager_event_filter,
1483 if (subs_headset_id != -1) {
1484 g_dbus_connection_signal_unsubscribe(conn,
1486 subs_headset_id = -1;
1488 if (subs_sink_id != -1) {
1489 g_dbus_connection_signal_unsubscribe(conn,
1497 static int __bt_hal_initialize_manager_receiver(void)
1501 GError *error = NULL;
1503 if (manager_conn == NULL) {
1504 manager_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1505 if (error != NULL) {
1506 ERR_C("ERROR: Can't get on system bus [%s]", error->message);
1507 g_clear_error(&error);
1509 if (manager_conn == NULL)
1513 if (__bt_hal_register_service_event(manager_conn,
1514 BT_HAL_MANAGER_EVENT) != BT_HAL_ERROR_NONE)
1516 if (__bt_hal_register_service_event(manager_conn,
1517 BT_HAL_DEVICE_EVENT) != BT_HAL_ERROR_NONE)
1519 if (__bt_hal_register_service_event(manager_conn,
1520 BT_HAL_HID_EVENT) != BT_HAL_ERROR_NONE)
1522 if (__bt_hal_register_service_event(manager_conn,
1523 BT_HAL_HEADSET_EVENT) != BT_HAL_ERROR_NONE)
1525 if (__bt_hal_register_service_event(manager_conn,
1526 BT_HAL_GATT_EVENT) != BT_HAL_ERROR_NONE)
1528 return BT_HAL_ERROR_NONE;
1531 g_object_unref(manager_conn);
1532 manager_conn = NULL;
1535 return BT_HAL_ERROR_INTERNAL;
1538 /* To receive the event from bluez */
1539 int _bt_hal_initialize_event_receiver(handle_stack_msg cb)
1545 return BT_HAL_ERROR_INVALID_PARAM;
1547 result = __bt_hal_initialize_manager_receiver();
1549 DBG("Manager event receiver initialization result [%d]", result);
1550 if (result != BT_HAL_ERROR_NONE)
1553 /*TODO: Initialize Obexd Event receiver */
1557 return BT_HAL_ERROR_NONE;
1560 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path)
1562 GVariantIter value_iter;
1563 GVariant *value = NULL;
1565 g_variant_iter_init(&value_iter, msg);
1567 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
1568 if (!g_strcmp0(key, "Connected")) {
1569 guint connected = 0;
1570 g_variant_get(value, "i", &connected);
1571 INFO("Device property changed : Connected [%d]", connected);
1572 } else if (!g_strcmp0(key, "RSSI")) {
1573 DBG("Device property changed : RSSI");
1574 __bt_hal_dbus_device_found_properties(path);
1575 } else if (!g_strcmp0(key, "GattConnected")) {
1576 gboolean gatt_connected = FALSE;
1577 g_variant_get(value, "b", &gatt_connected);
1578 INFO_C("Device property changed : GattConnected [%d]", gatt_connected);
1580 char *address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1581 _bt_hal_convert_device_path_to_address(path, address);
1582 _bt_hal_gatt_connected_state_event(gatt_connected, address);
1583 _bt_hal_handle_gattc_connected_event(address, gatt_connected);
1585 } else if (!g_strcmp0(key, "Paired")) {
1586 gboolean paired = FALSE;
1587 struct hal_ev_bond_state_changed ev;
1588 char address[BT_HAL_ADDRESS_STRING_SIZE];
1590 g_variant_get(value, "b", &paired);
1591 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1593 _bt_hal_agent_set_canceled(FALSE);
1594 _bt_hal_convert_device_path_to_address(path, address);
1596 /* Prepare to send event to HAL bluetooth */
1597 ev.status = BT_STATUS_SUCCESS;
1598 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1599 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1602 ERR("Bluetooth HAL event handler not registered");
1604 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1605 } else if (!g_strcmp0(key, "LegacyPaired")) {
1606 DBG("Device property changed : LegacyPaired");
1607 } else if (!g_strcmp0(key, "Trusted")) {
1608 DBG("Device property changed : Trusted");
1609 gboolean trusted = FALSE;
1610 gchar *address = NULL;
1611 g_variant_get(value, "b", &trusted);
1612 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1614 _bt_hal_convert_device_path_to_address(path, address);
1615 DBG("Device [%s] trusted: [%d]", address, trusted);
1617 __bt_hal_send_device_trust_state_event(trusted, address);
1619 } else if (!g_strcmp0(key, "IpspConnected")) {
1620 DBG("Device property changed : IpspConnected");
1621 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
1622 DBG("Device property changed : IpspInitStateChanged");
1623 } else if (!g_strcmp0(key, "TrustedProfiles")) {
1625 char address[BT_HAL_ADDRESS_STRING_SIZE];
1627 g_variant_get(value, "u", &trust_val);
1628 _bt_hal_convert_device_path_to_address(path, address);
1629 DBG("Address: %s, TrustedProfiles: 0x%X", address, trust_val);
1630 __bt_hal_send_device_trusted_profile_changed_event(trust_val, address);
1632 DBG("Unhandled Property:[%s]", key);
1637 static void __bt_hal_dbus_device_found_properties(const char *device_path)
1640 GError *error = NULL;
1641 GDBusProxy *device_proxy;
1642 GDBusConnection *conn;
1646 ERR("Invalid device path");
1650 conn = _bt_hal_get_system_gconn();
1652 ERR("_bt_hal_get_system_gconn failed");
1656 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1660 BT_HAL_PROPERTIES_INTERFACE,
1663 if (!device_proxy) {
1664 ERR("Error creating device_proxy");
1668 result = g_dbus_proxy_call_sync(device_proxy,
1670 g_variant_new("(s)", BT_HAL_DEVICE_INTERFACE),
1671 G_DBUS_CALL_FLAGS_NONE,
1676 ERR("Error occured in Proxy call");
1677 if (error != NULL) {
1678 ERR("Error occured in Proxy call (Error: %s)", error->message);
1679 g_clear_error(&error);
1681 g_object_unref(device_proxy);
1685 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1686 _bt_hal_convert_device_path_to_address(device_path, address);
1688 __bt_hal_device_properties_lookup(result, address);
1690 g_object_unref(device_proxy);
1694 static void __bt_hal_device_properties_lookup(GVariant *result, char *address)
1696 /* Buffer and propety count management */
1697 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
1698 struct hal_ev_device_found *ev = (void *) buf;
1700 memset(buf, 0, sizeof(buf));
1704 GVariant *tmp_value;
1707 gchar *manufacturer_data = NULL;
1710 if (result != NULL) {
1711 g_variant_get(result , "(@a{sv})", &value);
1712 g_variant_unref(result);
1715 tmp_value = g_variant_lookup_value(value, "Alias", G_VARIANT_TYPE_STRING);
1717 g_variant_get(tmp_value, "s", &name);
1719 g_variant_unref(tmp_value);
1721 DBG_SECURE("Alias Name [%s]", name);
1722 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1723 strlen(name) + 1, name);
1725 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1728 tmp_value = g_variant_lookup_value(value, "Name", G_VARIANT_TYPE_STRING);
1729 g_variant_get(tmp_value, "s", &name);
1730 g_variant_unref(tmp_value);
1732 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1733 strlen(name) + 1, name);
1735 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1736 g_variant_get(tmp_value, "s", &name);
1740 tmp_value = g_variant_lookup_value(value, "Class", G_VARIANT_TYPE_UINT32);
1741 unsigned int class = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1742 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
1743 sizeof(unsigned int), &class);
1746 g_variant_unref(tmp_value);
1750 tmp_value = g_variant_lookup_value(value, "Connected", G_VARIANT_TYPE_BOOLEAN);
1751 unsigned int connected = tmp_value ? g_variant_get_boolean(tmp_value) : 0;
1752 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
1753 sizeof(unsigned int), &connected);
1755 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
1757 g_variant_unref(tmp_value);
1760 tmp_value = g_variant_lookup_value(value, "Trusted", G_VARIANT_TYPE_BOOLEAN);
1761 uint8_t trust = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1762 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
1763 sizeof(uint8_t), &trust);
1765 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
1767 g_variant_unref(tmp_value);
1770 tmp_value = g_variant_lookup_value(value, "Paired", G_VARIANT_TYPE_BOOLEAN);
1771 uint8_t paired = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1773 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
1774 sizeof(uint8_t), &paired);
1776 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
1778 g_variant_unref(tmp_value);
1781 tmp_value = g_variant_lookup_value(value, "RSSI", G_VARIANT_TYPE_INT32);
1782 int rssi = tmp_value ? g_variant_get_int32(tmp_value) : 0;
1783 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
1784 sizeof(int), &rssi);
1786 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
1788 g_variant_unref(tmp_value);
1790 /* Last Addr Type */
1791 tmp_value = g_variant_lookup_value(value, "LastAddrType", G_VARIANT_TYPE_UINT32);
1792 unsigned int addr_type = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1794 g_variant_unref(tmp_value);
1795 DBG("Device Last Address Type [0x%x]", addr_type);
1798 tmp_value = g_variant_lookup_value(value, "IsAliasSet", G_VARIANT_TYPE_UINT32);
1799 uint8_t is_alias_set = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1800 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
1801 sizeof(uint8_t), &is_alias_set);
1803 DBG("IsAliasSet: [%s], Property num [%d]", (is_alias_set ? "TRUE" : "FALSE"), ev->num_props);
1805 g_variant_unref(tmp_value);
1808 tmp_value = g_variant_lookup_value(value, "UUIDs", G_VARIANT_TYPE_STRING_ARRAY);
1809 gsize uuid_count = g_variant_get_size(tmp_value);
1810 char **uuid_value = g_variant_dup_strv(tmp_value, &uuid_count);
1812 /* UUID collection */
1817 int num_props_tmp = ev->num_props;
1819 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
1821 for (i = 0; uuid_value[i] != NULL; i++) {
1823 char *uuid_str = NULL;
1824 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
1825 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
1827 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
1828 uuid_str = g_strdup(uuid_value[i]);
1829 DBG("UUID string [%s]\n", uuid_str);
1831 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
1833 for (z = 0; z < 16; z++)
1834 DBG("[0x%x]", uuid[z]);
1837 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
1841 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
1842 (BT_HAL_STACK_UUID_SIZE * uuid_count),
1844 ev->num_props = num_props_tmp + 1;
1845 g_strfreev(uuid_value);
1847 g_variant_unref(tmp_value);
1849 /* LegacyManufacturerDataLen */
1850 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerDataLen", G_VARIANT_TYPE_UINT32);
1851 unsigned int manufacturer_data_len = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1852 if (manufacturer_data_len > BT_HAL_MANUFACTURER_DATA_LENGTH_MAX) {
1853 ERR("manufacturer_data_len is too long(len = %d)", manufacturer_data_len);
1854 manufacturer_data_len = BT_HAL_MANUFACTURER_DATA_LENGTH_MAX;
1857 g_variant_unref(tmp_value);
1858 /*size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA_LEN,
1859 sizeof(unsigned int), &manufacturer_data_len);
1861 DBG("Device Legacy Manufacturer data length [%u]", manufacturer_data_len);
1863 /* ManufacturerData */
1864 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerData", G_VARIANT_TYPE_BYTESTRING);
1865 manufacturer_data = value ? (gchar *)g_variant_get_bytestring(tmp_value) : NULL;
1866 if (manufacturer_data) {
1867 if (manufacturer_data_len > 0) {
1868 //size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA,
1869 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_BLE_ADV_DATA,
1870 manufacturer_data_len, manufacturer_data);
1875 g_variant_unref(tmp_value);
1879 _bt_hal_convert_addr_string_to_type(bdaddr, address);
1880 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
1881 sizeof(bdaddr), bdaddr);
1883 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
1886 g_variant_unref(value);
1888 ERR("result is NULL\n");
1891 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
1892 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
1896 static void __bt_hal_send_device_acl_connection_state_event(int status, gboolean connected, const char *address)
1898 struct hal_ev_acl_state_changed ev;
1901 ev.state = (connected == TRUE) ?
1902 HAL_ACL_STATE_CONNECTED :
1903 HAL_ACL_STATE_DISCONNECTED;
1905 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1908 ERR("Bluetooth HAL event handler not registered");
1910 event_cb(HAL_EV_ACL_STATE_CHANGED, &ev, sizeof(ev));
1913 static void __bt_hal_send_device_le_connection_state_event(int status, gboolean connected, const char *address)
1915 struct hal_ev_le_conn_state_changed ev;
1918 ev.state = (connected == TRUE) ?
1919 HAL_LE_STATE_CONNECTED :
1920 HAL_LE_STATE_DISCONNECTED;
1922 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1925 ERR("Bluetooth HAL event handler not registered");
1927 event_cb(HAL_EV_LE_CONN_STATE_CHANGED, &ev, sizeof(ev));
1930 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted,
1931 const char *address)
1933 struct hal_ev_device_trust_state_changed ev;
1935 ev.trust = (is_trusted == TRUE) ?
1936 HAL_DEVICE_TRUSTED :
1937 HAL_DEVICE_UNTRUSTED;
1939 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1942 ERR("Bluetooth HAL event handler not registered");
1944 event_cb(HAL_EV_DEVICE_TRUST_CHANGED, &ev, sizeof(ev));
1947 static void __bt_hal_send_device_trusted_profile_changed_event(
1948 uint32_t trust_val, const char *address)
1950 struct hal_ev_device_trusted_profiles_changed ev;
1952 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1953 ev.trust_val = trust_val;
1956 ERR("Bluetooth HAL event handler not registered");
1958 event_cb(HAL_EV_DEVICE_TRUSTED_PROFILES_CHANGED, &ev, sizeof(ev));
1961 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member,
1965 const char *property = NULL;
1969 if (strcasecmp(member, "PropertyChanged") == 0) {
1970 g_variant_get(msg, "(s)", &property);
1971 if (property == NULL)
1973 if (strcasecmp(property, "GattConnected") == 0) {
1974 INFO("GATT Connected");
1975 gboolean connected = FALSE;
1977 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1979 _bt_hal_convert_device_path_to_address(path, address);
1980 g_variant_get(msg, "(b)", &connected);
1982 INFO("Connected device address[%s] connnected[%d]", address, connected);
1984 } else if (strcasecmp(property, "Paired") == 0) {
1985 gboolean paired = FALSE;
1986 struct hal_ev_bond_state_changed ev;
1987 char address[BT_HAL_ADDRESS_STRING_SIZE];
1989 g_variant_get(msg, "(b)", &paired);
1990 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1992 _bt_hal_agent_set_canceled(FALSE);
1993 _bt_hal_convert_device_path_to_address(path, address);
1995 /* Prepare to send event to HAL bluetooth */
1996 ev.status = BT_STATUS_SUCCESS;
1997 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1998 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2001 ERR("Bluetooth HAL event handler not registered");
2003 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
2004 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
2006 } else if (strcasecmp(property, "UUIDs") == 0) {
2009 } else if (strcasecmp(member, "DeviceConnected") == 0) {
2010 unsigned char addr_type = 0;
2012 g_variant_get(msg, "(y)", &addr_type);
2014 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2015 _bt_hal_convert_device_path_to_address(path, address);
2017 DBG("Member: [%s]", member);
2018 ERR_C("### Connected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
2020 __bt_hal_send_device_acl_connection_state_event(BT_STATUS_SUCCESS, TRUE, address);
2022 __bt_hal_send_device_le_connection_state_event(BT_STATUS_SUCCESS, TRUE, address);
2024 } else if (strcasecmp(member, "Disconnected") == 0) {
2025 unsigned char disc_reason = 0;
2026 unsigned char addr_type = 0;
2029 g_variant_get(msg, "(yy&s)", &addr_type, &disc_reason, &name);
2031 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2032 _bt_hal_convert_device_path_to_address(path, address);
2034 ERR_C("### Disconnected [%s] [%d : %s] [%s] [%s]", !addr_type ? "BREDR" : "LE",
2035 disc_reason, _bt_hal_convert_disc_reason_to_string(disc_reason), address, name);
2038 __bt_hal_send_device_acl_connection_state_event(disc_reason, FALSE, address);
2040 __bt_hal_send_device_le_connection_state_event(disc_reason, FALSE, address);
2042 } else if (strcasecmp(member, "ProfileStateChanged") == 0) {
2044 char *profile_uuid = NULL;
2046 g_variant_get(msg, "(si)", &profile_uuid, &state);
2047 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2048 _bt_hal_convert_device_path_to_address(path, address);
2050 if (strncmp(profile_uuid, HID_UUID, strlen(HID_UUID)) == 0) {
2051 DBG("HID Host Profile state: %d", state);
2052 if (state == BT_HAL_PROFILE_STATE_CONNECTED)
2053 __bt_hal_send_hid_connection_state_event(TRUE, address);
2054 else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED)
2055 __bt_hal_send_hid_connection_state_event(FALSE, address);
2057 DBG("HID Host Profile state: Invalid");
2058 } else if (strcmp(profile_uuid, HID_DEVICE_UUID) == 0) {
2059 DBG("HID Device Profile state: %d", state);
2060 if (state == BT_HAL_PROFILE_STATE_CONNECTED)
2061 __bt_hal_send_hid_device_connection_state_event(TRUE, address);
2062 else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED)
2063 __bt_hal_send_hid_device_connection_state_event(FALSE, address);
2065 DBG("HID Device Profile state: Invalid");
2066 } else if ((strcmp(profile_uuid, A2DP_SINK_UUID) == 0)) {
2067 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2068 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTED");
2069 __bt_hal_send_av_connection_state_event(TRUE, address);
2070 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2071 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2072 __bt_hal_send_av_connection_state_event(FALSE, address);
2073 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2074 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2075 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2076 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTING");
2078 ERR("A2DP Profile state: Invalid");
2080 } else if ((strcmp(profile_uuid, A2DP_SOURCE_UUID) == 0)) {
2081 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2082 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
2083 __bt_hal_send_a2dp_sink_connection_state_event(TRUE, address);
2084 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2085 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
2086 __bt_hal_send_a2dp_sink_connection_state_event(FALSE, address);
2087 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2088 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
2089 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2090 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
2092 } else if (strcmp(profile_uuid, HFP_HF_UUID) == 0) {
2093 if (state == BT_HAL_PROFILE_STATE_CONNECTING)
2094 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTING");
2095 else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2096 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTED");
2097 __bt_hal_send_hf_connection_state_event(TRUE, address);
2098 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2099 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2100 __bt_hal_send_hf_connection_state_event(FALSE, address);
2101 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2102 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2104 ERR("HFP Profile state: Invalid");
2106 } else if (strcmp(profile_uuid, HFP_AG_UUID) == 0) {
2107 if (state == BT_HAL_PROFILE_STATE_CONNECTING)
2108 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_CONNECTING");
2109 else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2110 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_CONNECTED");
2111 __bt_hal_send_hf_client_connection_state_event(TRUE, address);
2112 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2113 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2114 __bt_hal_send_hf_client_connection_state_event(FALSE, address);
2115 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2116 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2118 ERR("HFP Client Profile state: Invalid");
2120 } else if ((strcmp(profile_uuid, AVRCP_TARGET_UUID) == 0)) {
2121 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2122 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
2123 __bt_hal_send_avrcp_ctrl_connection_state_event(TRUE, address);
2124 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2125 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
2126 __bt_hal_send_avrcp_ctrl_connection_state_event(FALSE, address);
2127 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2128 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
2129 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2130 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
2133 DBG("Profile [%s] State changed [%d] [%s] ", profile_uuid, state, address);
2136 g_free(profile_uuid);
2137 } else if (strcasecmp(member, "AttMtuChanged") == 0) {
2141 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2143 _bt_hal_convert_device_path_to_address(path, address);
2144 g_variant_get(msg, "(q)", &mtu);
2146 __bt_hal_handle_gatts_mtu_changed_event(address, mtu);
2149 } else if (strcasecmp(member, "AdvReport") == 0) {
2150 __bt_hal_handle_adv_report(msg, path);
2154 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path)
2156 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
2157 struct hal_ev_gatt_client_scan_result *ev = (void *)buf;
2159 char *address = NULL;
2160 GVariant *value = NULL;
2161 char *buffer = NULL;
2164 uint8_t addr_type = 0;
2165 uint8_t adv_type = 0;
2171 memset(buf, 0, sizeof(buf));
2174 g_variant_get(msg, "(&syyii@ay)", &address, &addr_type,
2175 &adv_type, &rssi, &data_len, &value);
2177 buffer_len = g_variant_get_size(value);
2179 buffer = (char *)g_variant_get_data(value);
2181 if (data_len != buffer_len) {
2182 ERR("Unexpected: buffer_len: %d, data_len: %d",
2183 buffer_len, data_len);
2184 data_len = buffer_len;
2187 DBG("Address: %s, len: %d, rssi: %d, addr_type: 0x%02X, adv_type: 0x%02X",
2188 address, data_len, rssi, addr_type, adv_type);
2190 _bt_hal_convert_addr_string_to_type(ev->bd_addr, address);
2191 ev->addr_type = addr_type;
2192 ev->adv_type = adv_type;
2195 memcpy(ev->adv_data, buffer, data_len);
2198 gatt_event_cb(HAL_EV_GATT_CLIENT_SCAN_RESULT, buf, size);
2199 g_variant_unref(value);
2202 static void __bt_hal_handle_gatts_mtu_changed_event(char *address, int mtu)
2204 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
2205 struct hal_ev_gatt_server_mtu_changed *ev = (void *)buf;
2211 memset(buf, 0, sizeof(buf));
2214 ev->conn_id = _bt_get_remote_gatt_client_conn_id(address);
2217 gatt_event_cb(HAL_EV_GATT_SERVER_MTU_CHANGED, buf, size);
2220 /* AVRCP Controller Role(Remote:AVRCP Target) Events */
2221 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address)
2224 struct hal_ev_avrcp_ctrl_conn_state ev;
2226 if (connected == TRUE)
2227 INFO("AVRCP(Controller) Profile Connected for address [%s]", address);
2229 INFO("AVRCP(Controller) Profile DisConnected for address [%s]", address);
2231 if (connected == TRUE)
2232 ev.state = HAL_AVRCP_CTRL_STATE_CONNECTED;
2234 ev.state = HAL_AVRCP_CTRL_STATE_DISCONNECTED;
2235 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2237 if (!avrcp_ctrl_event_cb)
2238 ERR("AVRCP controller handler not registered");
2240 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_CONN_STATE, &ev, sizeof(ev));
2243 static int __bt_media_attr_to_type(const char *str)
2245 if (!strcasecmp(str, "Equalizer"))
2246 return HAL_PLAYER_ATTR_EQUALIZER;
2247 else if (!strcasecmp(str, "Repeat"))
2248 return HAL_PLAYER_ATTR_REPEAT;
2249 else if (!strcasecmp(str, "Shuffle"))
2250 return HAL_PLAYER_ATTR_SHUFFLE;
2251 else if (!strcasecmp(str, "Scan"))
2252 return HAL_PLAYER_ATTR_SCAN;
2258 static int __bt_hal_play_status_str_to_type(const char *value)
2260 if (!strcmp(value, "stopped"))
2261 return HAL_PLAYSTATE_STOPPED;
2262 else if (!strcmp(value, "playing"))
2263 return HAL_PLAYSTATE_PLAYING;
2264 else if (!strcmp(value, "paused"))
2265 return HAL_PLAYSTATE_PAUSED;
2266 else if (!strcmp(value, "forward-seek"))
2267 return HAL_PLAYSTATE_FWD_SEEK;
2268 else if (!strcmp(value, "reverse-seek"))
2269 return HAL_PLAYSTATE_REV_SEEK;
2271 return HAL_PLAYSTATE_ERROR;
2274 static void __bt_avrcp_control_parse_properties(struct hal_ev_track_changed *ev, GVariant *item)
2276 GVariant *value = NULL;
2278 char *value_string = NULL;
2279 const char *key = NULL;
2285 g_variant_iter_init(&iter, item);
2286 while (g_variant_iter_loop(&iter, "{sv}", &key, &value)) {
2287 if (strcasecmp(key, "Title") == 0) {
2288 value_string = (char *)g_variant_get_string(value, NULL);
2289 DBG("Value : %s ", value_string);
2290 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TITLE;
2291 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2293 } else if (strcasecmp(key, "Artist") == 0) {
2294 value_string = (char *)g_variant_get_string(value, NULL);
2295 DBG("Value : %s ", value_string);
2296 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ARTIST;
2297 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2299 } else if (strcasecmp(key, "Album") == 0) {
2300 value_string = (char *)g_variant_get_string(value, NULL);
2301 DBG("Value : %s ", value_string);
2302 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ALBUM;
2303 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2305 } else if (strcasecmp(key, "Genre") == 0) {
2306 value_string = (char *)g_variant_get_string(value, NULL);
2307 DBG("Value : %s ", value_string);
2308 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_GENRE;
2309 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2311 } else if (strcasecmp(key, "Duration") == 0) {
2314 val = g_variant_get_uint32(value);
2315 DBG("Value : %li", val);
2316 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_PLAYING_TIME;
2317 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2319 } else if (strcasecmp(key, "NumberOfTracks") == 0) {
2322 val = g_variant_get_uint32(value);
2323 DBG("Value : %li", val);
2324 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_NUM_TRACKS;
2325 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2327 } else if (strcasecmp(key, "TrackNumber") == 0) {
2330 val = g_variant_get_uint32(value);
2331 DBG("Value : %li", val);
2332 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TRACK_NUM;
2333 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2336 DBG("%s not supported, ignoring", key);
2339 if (i >= HAL_MAX_ATTR_NUM) {
2340 ERR(" Received max attribute [%d]", i);
2349 static int __bt_media_attrval_to_val(int type, const char *value)
2354 case HAL_PLAYER_ATTR_EQUALIZER:
2355 if (!strcmp(value, "off"))
2360 case HAL_PLAYER_ATTR_REPEAT:
2361 if (!strcmp(value, "off"))
2362 ret = BTRC_PLAYER_VAL_OFF_REPEAT;
2363 else if (!strcmp(value, "singletrack"))
2364 ret = BTRC_PLAYER_VAL_SINGLE_REPEAT;
2365 else if (!strcmp(value, "alltracks"))
2366 ret = BTRC_PLAYER_VAL_ALL_REPEAT;
2368 ret = BTRC_PLAYER_VAL_GROUP_REPEAT;
2370 case HAL_PLAYER_ATTR_SHUFFLE:
2371 if (!strcmp(value, "off"))
2372 ret = BTRC_PLAYER_VAL_OFF_SHUFFLE;
2373 else if (!strcmp(value, "alltracks"))
2374 ret = BTRC_PLAYER_VAL_ALL_SHUFFLE;
2376 ret = BTRC_PLAYER_VAL_GROUP_SHUFFLE;
2378 case HAL_PLAYER_ATTR_SCAN:
2379 if (!strcmp(value, "off"))
2381 else if (!strcmp(value, "alltracks"))
2387 ERR("Value not handled");
2393 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member,
2396 const char *property = NULL;
2397 GVariant *value = NULL;
2399 char address[BT_HAL_ADDRESS_STRING_SIZE];
2402 ERR("Error returned in method call\n");
2406 if (!avrcp_ctrl_event_cb) {
2407 ERR("AVRCP controller DBUS handler callback not registered");
2411 g_variant_iter_init(&iter, msg);
2413 _bt_hal_convert_device_path_to_address(path, address);
2415 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2416 DBG("Property = %s \n", property);
2417 if ((strcasecmp(property, "Equalizer") == 0) ||
2418 (strcasecmp(property, "Repeat") == 0) ||
2419 (strcasecmp(property, "Shuffle") == 0) ||
2420 (strcasecmp(property, "Scan") == 0)) {
2421 struct hal_ev_player_setting ev;
2425 valstr = g_variant_get_string(value, NULL);
2426 DBG("Value : %s ", valstr);
2429 val = __bt_media_attrval_to_val(__bt_media_attr_to_type(property), valstr);
2432 memset(&ev, 0, sizeof(ev));
2433 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2435 ev.attr_ids[0] = __bt_media_attr_to_type(property);
2436 ev.attr_values[0] = val;
2438 /* Send event to application */
2439 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAYER_APP_SETTING_CHANGED, &ev, sizeof(ev));
2441 } else if ((strcasecmp(property, "Status") == 0)) {
2442 struct hal_ev_play_status_changed ev;
2445 valstr = g_variant_get_string(value, NULL);
2446 DBG("Value : %s ", valstr);
2448 memset(&ev, 0, sizeof(ev));
2449 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2451 ev.status = __bt_hal_play_status_str_to_type(valstr);
2453 /* Send event to application */
2454 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_STATUS_CHANGED, &ev, sizeof(ev));
2456 } else if (strcasecmp(property, "Position") == 0) {
2457 struct hal_ev_play_position ev;
2459 memset(&ev, 0, sizeof(ev));
2460 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2461 ev.pos = g_variant_get_uint32(value);
2462 DBG("Value : %d ", ev.pos);
2464 /* Send event to application */
2465 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_POSITION_CHANGED, &ev, sizeof(ev));
2466 } else if (strcasecmp(property, "Track") == 0) {
2467 struct hal_ev_track_changed ev;
2469 memset(&ev, 0, sizeof(ev));
2470 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2471 __bt_avrcp_control_parse_properties(&ev, value);
2473 /* Send event to application */
2474 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_TRACK_CHANGED, &ev, sizeof(ev));
2476 DBG("Property not handled");
2481 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member,
2484 const char *property = NULL;
2485 GVariant *value = NULL;
2487 char address[BT_HAL_ADDRESS_STRING_SIZE];
2491 ERR("Error returned in method call\n");
2495 if (!avrcp_tg_event_cb) {
2496 ERR("AVRCP target DBUS handler callback not registered");
2500 g_variant_iter_init(&iter, msg);
2502 _bt_hal_convert_device_path_to_address(path, address);
2504 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2505 DBG("Property = %s \n", property);
2506 if ((strcasecmp(property, "Delay") == 0)) {
2507 struct hal_ev_avrcp_tg_delay_changed ev;
2510 memset(&ev, 0, sizeof(ev));
2511 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2513 val = g_variant_get_uint16(value);
2514 DBG("Value : %d", val);
2517 /* Send event to application */
2518 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_DELAY_CHANGE, &ev, sizeof(ev));
2519 } else if ((strcasecmp(property, "Volume") == 0)) {
2520 struct hal_ev_avrcp_tg_volume_changed ev;
2523 memset(&ev, 0, sizeof(ev));
2524 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2526 val = g_variant_get_uint16(value);
2527 DBG("Value : %d", val);
2530 /* Send event to application */
2531 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_VOLUME_CHANGE, &ev, sizeof(ev));
2533 DBG("Property not handled");
2538 /* A2DP Src Role(Remote:Sink) Events */
2539 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address)
2541 struct hal_ev_a2dp_conn_state ev;
2543 if (connected == TRUE)
2544 INFO("A2DP(Src) Profile Connected for address [%s]", address);
2546 INFO("A2DP(Src) Profile DisConnected for address [%s]", address);
2548 ev.state = (connected == TRUE) ?
2549 HAL_EV_A2DP_STATE_CONNECTED :
2550 HAL_EV_A2DP_STATE_DISCONNECTED;
2552 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2555 ERR("AV event handler not registered");
2557 av_event_cb(HAL_EV_A2DP_CONN_STATE, &ev, sizeof(ev));
2560 /* A2DP Sink Role(Remote:Source) Events */
2561 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address)
2563 struct hal_ev_a2dp_conn_state ev;
2565 if (connected == TRUE)
2566 INFO("A2DP(Sink) Profile Connected for address [%s]", address);
2568 INFO("A2DP(Sink) Profile DisConnected for address [%s]", address);
2570 ev.state = (connected == TRUE) ?
2571 HAL_EV_A2DP_STATE_CONNECTED :
2572 HAL_EV_A2DP_STATE_DISCONNECTED;
2574 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2576 if (!a2dp_sink_event_cb)
2577 ERR("AV event handler not registered");
2579 a2dp_sink_event_cb(HAL_EV_A2DP_SOURCE_CONN_STATE, &ev, sizeof(ev));
2582 /* HF(AG Role) Audio Events */
2583 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected,
2584 const char *address)
2586 struct hal_ev_handsfree_audio_state ev;
2588 if (connected == TRUE)
2589 INFO("AG Audio Connected for address [%s]", address);
2591 INFO("AG Audio DisConnected for address [%s]", address);
2593 ev.state = (connected == TRUE) ?
2594 HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTED :
2595 HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED;
2597 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2600 ERR("HF event handler not registered");
2602 hf_event_cb(HAL_EV_HANDSFREE_AUDIO_STATE, &ev, sizeof(ev));
2605 /* HF(AG Role) Profile Events */
2606 static void __bt_hal_send_hf_connection_state_event(gboolean connected,
2607 const char *address)
2609 struct hal_ev_handsfree_conn_state ev;
2611 if (connected == TRUE)
2612 INFO("AG Profile Connected for address [%s]", address);
2614 INFO("AG Profile DisConnected for address [%s]", address);
2616 ev.state = (connected == TRUE) ?
2617 HAL_EV_HANDSFREE_CONN_STATE_CONNECTED :
2618 HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTED;
2620 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2623 ERR("HF event handler not registered");
2625 hf_event_cb(HAL_EV_HANDSFREE_CONN_STATE, &ev, sizeof(ev));
2628 /* HF(Client Role) Profile Events */
2629 static void __bt_hal_send_hf_client_connection_state_event(gboolean connected,
2630 const char *address)
2632 struct hal_ev_hf_client_conn_state ev;
2634 if (connected == TRUE)
2635 INFO("HF Client Profile Connected for address [%s]", address);
2637 INFO("HF Client Profile DisConnected for address [%s]", address);
2639 ev.state = (connected == TRUE) ?
2640 HAL_EV_HF_CLIENT_CONN_STATE_CONNECTED :
2641 HAL_EV_HF_CLIENT_CONN_STATE_DISCONNECTED;
2643 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2645 if (!hf_client_event_cb)
2646 ERR("HF Client event handler not registered");
2648 hf_client_event_cb(HAL_EV_HF_CLIENT_CONN_STATE, &ev, sizeof(ev));
2651 void _bt_hal_register_event_handler_cb(bt_hal_module_e module, handle_stack_msg cb)
2658 hid_device_event_cb = cb;
2664 a2dp_sink_event_cb = cb;
2670 hf_client_event_cb = cb;
2673 avrcp_tg_event_cb = cb;
2675 case HAL_AVRCP_CTRL:
2676 avrcp_ctrl_event_cb = cb;
2682 ERR("Unknown module: %d", module);
2686 void _bt_hal_unregister_event_handler_cb(bt_hal_module_e module)
2690 hid_event_cb = NULL;
2696 a2dp_sink_event_cb = NULL;
2702 hf_client_event_cb = NULL;
2705 avrcp_tg_event_cb = NULL;
2707 case HAL_AVRCP_CTRL:
2708 avrcp_ctrl_event_cb = NULL;
2711 gatt_event_cb = NULL;
2714 ERR("Unknown module: %d", module);
2718 bool _bt_hal_get_adapter_request_state(void)
2720 return is_adapter_activating;
2723 bool _bt_hal_get_le_request_state(void)
2725 return is_le_activating;
2728 void _bt_hal_set_adapter_request_state(bool enable)
2730 DBG("set_adapter_request_state %d", enable);
2731 is_adapter_activating = enable;
2734 void _bt_hal_set_le_request_state(bool enable)
2736 DBG("set_le_request_state %d", enable);
2737 is_le_activating = enable;