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 #define BASELEN_PROP_CHANGED (sizeof(struct hal_ev_adapter_props_changed) \
45 + sizeof(struct hal_property))
47 /*TODO: Basic filters are currently added,
48 Need to add different event filters like HID,
49 Device etc in subsequent patches */
51 /* Global variables and structures */
52 static GDBusConnection *manager_conn;
53 static handle_stack_msg event_cb = NULL;
54 static handle_stack_msg hid_event_cb = NULL;
55 static handle_stack_msg av_event_cb = NULL;
56 static handle_stack_msg a2dp_sink_event_cb = NULL;
57 static handle_stack_msg hf_event_cb = NULL;
58 static handle_stack_msg hf_client_event_cb = NULL;
59 static handle_stack_msg avrcp_ctrl_event_cb = NULL;
60 static handle_stack_msg avrcp_tg_event_cb = NULL;
61 static handle_stack_msg gatt_event_cb = NULL;
62 static guint event_id;
64 /*State Management sepration Control for Adapter and LE */
65 static gboolean is_adapter_activating = FALSE;
66 static gboolean is_le_activating = FALSE;
71 gchar* interface_name;
74 } bt_hal_main_event_data_t;
76 /* Forward declarations */
77 static gboolean __bt_hal_event_manager(gpointer param);
78 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type);
79 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn, int subscribe);
80 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn, int subscribe);
81 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe);
83 static int __bt_hal_parse_event(GVariant *msg);
84 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current);
86 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path);
87 static void __bt_hal_adapter_property_changed_event(GVariant *msg);
88 static void __bt_hal_manager_event_filter(GDBusConnection *connection, const gchar *sender_name,
89 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
90 GVariant *parameters, gpointer user_data);
91 static int __bt_hal_initialize_manager_receiver(void);
92 static gboolean __bt_hal_parse_interface(GVariant *msg);
93 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters);
94 static gboolean __bt_hal_parse_device_properties(GVariant *item);
95 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data);
96 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path);
97 static void __bt_hal_dbus_device_found_properties(const char *device_path);
98 static void __bt_hal_device_properties_lookup(GVariant *result, char *address);
99 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member, const char *path);
100 static void __bt_hal_send_device_acl_connection_state_event(int status, gboolean connected, const char *address);
101 static void __bt_hal_handle_input_event(GVariant *msg, const char *path);
102 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address);
103 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address);
104 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address);
105 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member, const char *path);
106 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member, const char *path);
108 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted, const char *address);
109 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn, int subscribe);
110 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path);
111 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected, const char *address);
112 static void __bt_hal_send_hf_connection_state_event(gboolean connected, const char *address);
113 static void __bt_hal_send_device_trusted_profile_changed_event(uint32_t trust_val, const char *address);
114 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path);
115 static void __bt_hal_handle_gatts_mtu_changed_event(char *address, int mtu);
116 static void __bt_hal_send_hf_client_connection_state_event(gboolean connected, const char *address);
119 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data)
123 struct hal_ev_discovery_state_changed ev;
124 ev.state = HAL_DISCOVERY_STATE_STOPPED;
125 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
131 static int __bt_hal_parse_event(GVariant *msg)
135 char *interface_name = NULL;
136 GVariant *inner_iter = NULL;
138 g_variant_iter_init(&iter, msg);
140 while ((child = g_variant_iter_next_value(&iter))) {
141 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
142 if (g_strcmp0(interface_name,
143 BT_HAL_DEVICE_INTERFACE) == 0) {
144 DBG("__bt_hal_parse_event: Interface: BT_HAL_DEVICE_INTERFACE");
145 g_variant_unref(inner_iter);
146 g_variant_unref(child);
147 return BT_HAL_DEVICE_EVENT;
148 } else if (g_strcmp0(interface_name,
149 BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
150 DBG("__bt_hal_parse_event: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
151 g_variant_unref(inner_iter);
152 g_variant_unref(child);
153 return BT_HAL_MEDIA_TRANSFER_EVENT;
154 } else if (g_strcmp0(interface_name,
155 BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
156 DBG("__bt_hal_parse_event: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
157 g_variant_unref(inner_iter);
158 g_variant_unref(child);
159 return BT_HAL_AVRCP_CONTROL_EVENT;
161 g_variant_unref(inner_iter);
162 g_variant_unref(child);
168 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current)
170 g_variant_get(msg, "(&s&s&s)", name, previous, current);
171 return BT_HAL_ERROR_NONE;
174 int __bt_insert_hal_properties(void *buf, uint8_t type, uint16_t len, const void *val)
175 { struct hal_property *prop = buf;
181 memcpy(prop->val, val, len);
183 return sizeof(*prop) + len;
186 handle_stack_msg _bt_hal_get_stack_message_handler(void)
191 static void __bt_hal_adapter_property_changed_event(GVariant *msg)
193 GVariantIter value_iter;
194 GVariant *value = NULL;
195 GDBusProxy *adapter_proxy;
198 g_variant_iter_init(&value_iter, msg);
200 /* Buffer and propety count management */
201 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
202 struct hal_ev_adapter_props_changed *ev = (void*) buf;
204 const gchar *address = NULL;
206 unsigned int cod = 0;
207 gboolean discoverable;
208 gboolean connectable;
209 unsigned int scan_mode = BT_SCAN_MODE_NONE;
210 unsigned int disc_timeout;
211 const gchar *version;
212 gboolean ipsp_initialized;
215 unsigned int pairable_timeout;
216 gboolean scan_mode_property_update = FALSE;
217 gboolean is_discovering;
218 gboolean is_le_discovering;
220 memset(buf, 0, sizeof(buf));
223 ev->status = BT_STATUS_SUCCESS;
227 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
228 if (!g_strcmp0(key, "Address")) {
231 address = g_variant_get_string(value, NULL);
232 DBG("##Address [%s]", address);
233 _bt_hal_convert_addr_string_to_type(bdaddr, address);
234 size += __bt_insert_hal_properties(buf + size,
235 HAL_PROP_ADAPTER_ADDR, sizeof(bdaddr), bdaddr);
237 } else if (!g_strcmp0(key, "Alias")) {
238 g_variant_get(value, "&s", &name);
239 DBG("##Alias [%s] ", name);
240 size += __bt_insert_hal_properties(buf + size,
241 HAL_PROP_ADAPTER_NAME, strlen(name) + 1, name);
243 } else if (!g_strcmp0(key, "Class")) {
244 cod = g_variant_get_uint32(value);
245 DBG("##Class [%d]", cod);
246 size += __bt_insert_hal_properties(buf + size,
247 HAL_PROP_ADAPTER_CLASS, sizeof(unsigned int), &cod);
249 } else if (!g_strcmp0(key, "Discoverable")) {
250 discoverable = g_variant_get_boolean(value);
251 DBG("##Discoverable [%d]", discoverable);
253 scan_mode = BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE;
255 scan_mode = BT_SCAN_MODE_CONNECTABLE;
256 scan_mode_property_update = TRUE;
257 } else if (!g_strcmp0(key, "DiscoverableTimeout")) {
258 disc_timeout = g_variant_get_uint32(value);
259 DBG("##Discoverable Timeout [%d]", disc_timeout);
260 size += __bt_insert_hal_properties(buf + size,
261 HAL_PROP_ADAPTER_DISC_TIMEOUT, sizeof(unsigned int), &disc_timeout);
263 } else if (!g_strcmp0(key, "Connectable")) {
264 connectable = g_variant_get_boolean(value);
265 DBG("##Connectable [%d]", connectable);
267 scan_mode = BT_SCAN_MODE_NONE;
268 else if (scan_mode == BT_SCAN_MODE_NONE)
269 scan_mode = BT_SCAN_MODE_CONNECTABLE;
270 scan_mode_property_update = TRUE;
271 } else if (!g_strcmp0(key, "Version")) {
272 version = g_variant_get_string(value, NULL);
273 DBG("##Version [%s]", version);
274 size += __bt_insert_hal_properties(buf + size,
275 HAL_PROP_ADAPTER_VERSION, strlen(version) + 1, version);
277 } else if (!g_strcmp0(key, "Name")) {
278 g_variant_get(value, "&s", &name);
279 DBG("##Name [%s]", name);
280 size += __bt_insert_hal_properties(buf + size,
281 HAL_PROP_ADAPTER_NAME, strlen(name) + 1, name);
283 } else if (!g_strcmp0(key, "Powered")) {
284 powered = g_variant_get_boolean(value);
285 DBG("##Powered = %d", powered);
286 /* TODO: Need to check this operation!! */
287 if (powered == FALSE) {
288 DBG("###### Adapter Powered Down ######");
289 struct hal_ev_adapter_state_changed ev;
290 ev.state = HAL_POWER_OFF;
291 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
293 struct hal_ev_le_state_changed le_ev;
294 le_ev.state = HAL_POWER_OFF;
295 event_cb(HAL_EV_LE_STATE_CHANGED, &le_ev, sizeof(le_ev));
298 _bt_hal_destroy_adapter_agent();
300 DBG("###### Adapter Powered Up ######");
301 if (_bt_hal_get_adapter_request_state()) {
302 DBG("Sending STATE CHANGE EVENT for Adapter... ");
303 _bt_hal_set_adapter_request_state(FALSE);
304 struct hal_ev_adapter_state_changed ev;
305 ev.state = HAL_POWER_ON;
306 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
309 if (_bt_hal_get_le_request_state()) {
310 DBG("Sending STATE CHANGE EVENT for LE... ");
311 _bt_hal_set_le_request_state(FALSE);
312 struct hal_ev_le_state_changed ev;
313 ev.state = HAL_POWER_ON;
314 event_cb(HAL_EV_LE_STATE_CHANGED, &ev, sizeof(ev));
318 _bt_hal_initialize_adapter_agent();
321 } else if (!g_strcmp0(key, "Pairable")) {
322 pairable = g_variant_get_boolean(value);
323 DBG("##Pairable [%d]", pairable);
324 } else if (!g_strcmp0(key, "PairableTimeout")) {
325 pairable_timeout = g_variant_get_uint32(value);
326 DBG("##Pairable Timeout = %d", pairable_timeout);
327 } else if (!g_strcmp0(key, "UUIDs")) {
332 size1 = g_variant_get_size(value);
333 int num_props_tmp = ev->num_props;
335 uuid_value = (char **)g_variant_get_strv(value, &size1);
336 for (i = 0; uuid_value[i] != NULL; i++)
338 /* UUID collection */
339 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
340 for (i = 0; uuid_value[i] != NULL; i++) {
341 char *uuid_str = NULL;
342 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
343 uuid_str = g_strdup(uuid_value[i]);
344 DBG("##UUID string [%s]\n", uuid_str);
345 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
346 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
349 size += __bt_insert_hal_properties(buf + size, HAL_PROP_ADAPTER_UUIDS,
350 (BT_HAL_STACK_UUID_SIZE * uuid_count),
352 ev->num_props = num_props_tmp + 1;
355 } else if (!g_strcmp0(key, "Discovering")) {
356 is_discovering = g_variant_get_boolean(value);
357 DBG("##Discovering = [%d]", is_discovering);
359 if (is_discovering == FALSE) {
360 DBG("###### Adapter Has stopped Discovering ######");
361 /* In Tizen Bluez, this actually does not mean Discovery is stopped
362 in Bluez. Tizen Bluez sends this event after a certain timeout,
363 Therefore, we must forecefully call StopDiscovery to stop discovery in BlueZ */
367 adapter_proxy = _bt_hal_get_adapter_proxy();
369 if (adapter_proxy == NULL)
372 /* Need to stop searching */
373 DBG("Event though Bluez reported DIscovering stopped, we force stop Discovery ");
374 g_dbus_proxy_call_sync(adapter_proxy, "StopDiscovery",
376 G_DBUS_CALL_FLAGS_NONE,
380 ERR("Dbus Error : %s", err->message);
382 /* This error is thrown by Bluez, as Discovery is already stopped.
383 Discovery is stopped if user cancels on going discovery.
384 In order to maintain correct state of Bluetooth Discovery state,
385 simply send Discovery stopped event to HAL user */
386 struct hal_ev_discovery_state_changed ev;
387 ev.state = HAL_DISCOVERY_STATE_STOPPED;
388 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
393 event_id = g_timeout_add(BT_HAL_DISCOVERY_FINISHED_DELAY,
394 (GSourceFunc)__bt_hal_discovery_finished_cb, NULL);
398 DBG("###### Adapter Has started Discovering ######");
399 struct hal_ev_discovery_state_changed ev;
400 ev.state = HAL_DISCOVERY_STATE_STARTED;
401 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
404 } else if (!g_strcmp0(key, "LEDiscovering")) {
407 is_le_discovering = g_variant_get_boolean(value);
408 DBG("##LE Discovering = [%d]", is_le_discovering);
410 if (is_le_discovering)
413 adapter_proxy = _bt_hal_get_adapter_proxy();
414 if (adapter_proxy == NULL) {
415 ERR("adapter_proxy == NULL");
419 /* Need to stop searching */
420 result = g_dbus_proxy_call_sync(adapter_proxy, "StopLEDiscovery",
421 NULL, G_DBUS_CALL_FLAGS_NONE,
422 DBUS_TIMEOUT, NULL, &err);
424 ERR("Error occured in Proxy call");
426 ERR("(Error: %s)", err->message);
431 g_variant_unref(result);
433 size += __bt_insert_hal_properties(buf + size,
434 HAL_PROP_ADAPTER_LE_DISCOVERY_FINISHED, sizeof(gboolean), &is_le_discovering);
436 } else if (!g_strcmp0(key, "Modalias")) {
437 char *modalias = NULL;
438 g_variant_get(value, "s", &modalias);
439 DBG("##Adapter ModAlias [%s]", modalias);
440 } else if (!g_strcmp0(key, "SupportedLEFeatures")) {
441 DBG("##LE Supported features");
444 GVariantIter *iter = NULL;
445 g_variant_get(value, "as", &iter);
446 bt_local_le_features_t le_features;
447 gboolean le_features_present = FALSE;
452 memset(&le_features, 0x00, sizeof(le_features));
454 while (g_variant_iter_next(iter, "&s", &name) &&
455 g_variant_iter_next(iter, "&s", &val)) {
456 DBG("name = %s, Value = %s", name, val);
457 if (FALSE == _bt_hal_update_le_feature_support(name, val, &le_features))
458 ERR("Failed to update LE feature (name = %s, value = %s)", name, val);
460 le_features_present = TRUE;
463 g_variant_iter_free(iter);
464 if (le_features_present) {
465 size += __bt_insert_hal_properties(buf + size,
466 HAL_PROP_ADAPTER_LOCAL_LE_FEAT, sizeof(le_features), &le_features);
469 DBG("le supported features values are NOT provided by Stack");
471 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
472 g_variant_get(value, "b" , &ipsp_initialized);
473 DBG("##IPSP Initialized = %d", ipsp_initialized);
475 ERR("Unhandled Property:[%s]", key);
479 if (scan_mode_property_update) {
480 size += __bt_insert_hal_properties(buf + size,
481 HAL_PROP_ADAPTER_SCAN_MODE, sizeof(int), &scan_mode);
487 DBG("Send Adapter properties changed event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
488 event_cb(HAL_EV_ADAPTER_PROPS_CHANGED, buf, size);
494 static void __bt_hal_flight_ps_mode_cb(keynode_t *node, void *data)
496 gboolean flight_mode = FALSE;
498 DBG_SECURE("HAL callback hit");
499 DBG_SECURE("key=%s", vconf_keynode_get_name(node));
500 type = vconf_keynode_get_type(node);
501 if (type == VCONF_TYPE_BOOL) {
502 flight_mode = vconf_keynode_get_bool(node);
503 if (flight_mode != TRUE) {
504 ERR("Ignore the event");
507 ERR("Flight Mode == TRUE");
510 ERR("Invaild vconf key type : %d", type);
513 DBG("Enabling core now");
514 _bt_hal_enable_core();
517 static void _bt_hal_register_vconf_handler(void)
521 if (vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
522 (vconf_callback_fn)__bt_hal_flight_ps_mode_cb, NULL) < 0)
523 ERR("Unable to register key handler");
524 DBG("Telephony is disabled");
525 if (vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE,
526 (vconf_callback_fn)__bt_hal_flight_ps_mode_cb, NULL) < 0)
527 ERR("Unable to register key handler");
530 void _bt_hal_handle_adapter_event(GVariant *msg, const char *member)
537 if (strcasecmp(member, "DeviceCreated") == 0) {
538 DBG("DeviceCreated: Unhandled");
539 } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
540 DBG("InterfacesRemoved: Unhandled");
541 } else if (strcasecmp(member, "AdvertisingEnabled") == 0) {
542 DBG("AdvertisingEnabled");
543 DBG("Advertising Enabled");
545 gboolean status = FALSE;
546 g_variant_get(msg, "(ib)", &slot_id, &status);
547 DBG("Advertising Enabled : server_slot_id [%d] status [%d]", slot_id, status);
548 /* Send event to application */
549 _bt_hal_set_advertising_status(slot_id, status);
550 } else if (strcasecmp(member, "RssiEnabled") == 0) {
551 struct hal_ev_rssi_monitor_state_changed ev;
552 gboolean status = FALSE;
553 char *address = NULL;
556 g_variant_get(msg, "(sib)", &address, &link_type, &status);
557 DBG("RSSI monitoring %s for %s",
558 (status ? "Enabled" : "Disabled"), address);
560 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
561 ev.link_type = link_type;
562 ev.state = (status ? HAL_RSSI_MONITORING_ENABLED : HAL_RSSI_MONITORING_DISABLED);
564 ERR("event_cb is NULL");
566 event_cb(HAL_EV_RSSI_MONITOR_STATE_CHANGED, &ev, sizeof(ev));
569 } else if (strcasecmp(member, "RssiAlert") == 0) {
570 struct hal_ev_rssi_alert_recieved ev;
574 char *address = NULL;
576 g_variant_get(msg, "(siii)", &address, &link_type, &alert_type, &rssi_dbm);
577 DBG("RSSI Alert: [Address %s LinkType %d] [Type %d DBM %d]",
578 address, alert_type, rssi_dbm, link_type);
580 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
581 ev.link_type = link_type;
582 ev.alert_type = alert_type;
586 ERR("event_cb is NULL");
588 event_cb(HAL_EV_RSSI_ALERT_RECIEVED, &ev, sizeof(ev));
591 } else if (strcasecmp(member, "RawRssi") == 0) {
592 struct hal_ev_raw_rssi_recieved ev;
595 char *address = NULL;
597 g_variant_get(msg, "(sii)", &address, &link_type, &rssi_dbm);
598 DBG("Raw RSSI: [Address %s] [Link Type %d][RSSI DBM %d]",
599 address, link_type, rssi_dbm);
601 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
602 ev.link_type = link_type;
606 ERR("event_cb is NULL");
608 event_cb(HAL_EV_RAW_RSSI_RECIEVED, &ev, sizeof(ev));
611 } else if (strcasecmp(member, BT_HAL_HARDWARE_ERROR) == 0) {
612 DBG("BT Hardware Error: Unhandled");
613 } else if (strcasecmp(member, BT_HAL_TX_TIMEOUT_ERROR) == 0) {
614 DBG("BT TX Timeout Error: Unhandled");
620 static gboolean __bt_hal_parse_device_properties(GVariant *item)
630 /* Buffer and propety count management */
631 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
632 struct hal_ev_device_found *ev = (void *) buf;
634 memset(buf, 0, sizeof(buf));
638 g_variant_iter_init(&iter, item);
639 while (g_variant_iter_loop(&iter, "{sv}", &key, &val)) {
641 if (strcasecmp(key, "Address") == 0) {
643 char * address = NULL;
644 address = g_variant_dup_string(val, &len);
646 _bt_hal_convert_addr_string_to_type(bdaddr, address);
648 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
649 sizeof(bdaddr), bdaddr);
652 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
654 } else if (strcasecmp(key, "Class") == 0) {
655 unsigned int class = g_variant_get_uint32(val);
656 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
657 sizeof(unsigned int), &class);
659 DBG("Device class [%d] Property num [%d]", class, ev->num_props);
660 } else if (strcasecmp(key, "name") == 0) {
661 char *name = g_variant_dup_string(val, &len);
663 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
664 strlen(name) + 1, name);
666 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
669 } else if (strcasecmp(key, "Connected") == 0) {
670 unsigned int connected = g_variant_get_byte(val);
672 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
673 sizeof(unsigned int), &connected);
675 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
676 } else if (strcasecmp(key, "paired") == 0) {
677 uint8_t paired = (g_variant_get_boolean(val) ? 1 : 0);
678 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
679 sizeof(uint8_t), &paired);
681 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
682 } else if (strcasecmp(key, "Trusted") == 0) {
683 uint8_t trust = (g_variant_get_boolean(val) ? 1 : 0);
684 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
685 sizeof(uint8_t), &trust);
687 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
688 } else if (strcasecmp(key, "RSSI") == 0) {
689 int rssi = g_variant_get_int16(val);
690 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
693 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
694 } else if (strcasecmp(key, "LastAddrType") == 0) {
695 /* TODO: To be handled later*/
696 } else if (!g_strcmp0(key, "IsAliasSet")) {
697 uint8_t is_alias_set = (g_variant_get_boolean(val) ? 1 : 0);
698 DBG("IsAliasSet: %s", (is_alias_set ? "TRUE" : "FALSE"));
699 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
700 sizeof(uint8_t), &is_alias_set);
702 } else if (strcasecmp(key, "UUIDs") == 0) {
707 size1 = g_variant_get_size(val);
708 DBG("UUID count from size [%zu]\n", size1);
709 int num_props_tmp = ev->num_props;
712 uuid_value = (char **)g_variant_get_strv(val, &size1);
713 for (i = 0; uuid_value[i] != NULL; i++)
715 DBG("UUID count [%d]\n", uuid_count);
716 /* UUID collection */
717 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
719 for (i = 0; uuid_value[i] != NULL; i++) {
721 char *uuid_str = NULL;
722 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
723 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
725 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
726 uuid_str = g_strdup(uuid_value[i]);
727 DBG("UUID string [%s]\n", uuid_str);
728 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
729 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
733 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
734 (BT_HAL_STACK_UUID_SIZE * uuid_count),
736 ev->num_props = num_props_tmp + 1;
740 } else if (strcasecmp(key, "LegacyManufacturerDataLen") == 0) {
741 /* TODO: To be handled later*/
742 } else if (strcasecmp(key, "LegacyManufacturerData") == 0) {
743 /* TODO: To be handled later*/
745 ERR("Unhandled Property:[%s]", key);
751 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
752 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
758 static void __bt_hal_handle_avrcp_tg_events(GVariant *msg, const char *path)
761 GVariantIter value_iter;
762 char *property = NULL;
764 GVariant *val = NULL;
765 GVariant *child = NULL;
767 g_variant_iter_init(&value_iter, msg);
768 while ((child = g_variant_iter_next_value(&value_iter))) {
769 g_variant_get(child, "{sv}", &property, &val);
770 INFO("Property %s", property);
771 if (strcasecmp(property, "Connected") == 0) {
772 struct hal_ev_avrcp_tg_conn_state ev;
774 gboolean connected = FALSE;
776 g_variant_get(val, "b", &connected);
778 state = connected ? HAL_AVRCP_TG_STATE_CONNECTED :
779 HAL_AVRCP_TG_STATE_DISCONNECTED;
781 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
783 _bt_hal_convert_device_path_to_address(path, address);
785 DBG("connected: %d", connected);
786 DBG("address: %s", address);
788 /* Prepare to send AVRCP Target connection state event */
789 memset(&ev, 0, sizeof(ev));
790 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
792 if (!avrcp_tg_event_cb)
793 ERR("AVRCP target DBUS handler callback not registered");
795 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_CONN_STATE, (void *)&ev, sizeof(ev));
799 g_variant_unref(child);
800 g_variant_unref(val);
806 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path)
808 char *interface_name = NULL;
809 GVariant *val = NULL;
812 g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, &val, NULL);
814 if (!interface_name) {
815 DBG("Failed to get interface name");
818 g_variant_unref(val);
822 if (strcasecmp(interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
823 DBG("Event: Property Changed: Interface: BT_HAL_ADAPTER_INTERFACE");
824 __bt_hal_adapter_property_changed_event(val);
825 } else if (strcasecmp(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
826 DBG("Event: Property Changed: Interface: BT_HAL_DEVICE_INTERFACE");
827 __bt_hal_device_property_changed_event(val, object_path);
828 } else if (strcasecmp(interface_name, BT_HAL_OBEX_TRANSFER_INTERFACE) == 0) {
829 DBG("Event: Property Changed: Interface: BT_HAL_OBEX_TRANSFER_INTERFACE");
830 /* TODO: Handle event */
831 } else if (strcasecmp(interface_name, BT_HAL_MEDIA_CONTROL_INTERFACE) == 0) {
832 DBG("Event: Property Changed: Interface: BT_HAL_MEDIA_CONTROL_INTERFACE");
833 /* Handle AVRCP target event */
834 __bt_hal_handle_avrcp_tg_events(val, object_path);
835 } else if (strcasecmp(interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
836 DBG("Event: Property Changed: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
837 __bt_hal_handle_avrcp_ctrl_events(val, NULL, object_path);
838 } else if (strcasecmp(interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
839 DBG("Event: Property Changed: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
840 __bt_hal_handle_avrcp_transport_events(val, NULL, object_path);
841 } else if (strcasecmp(interface_name, BT_HAL_NETWORK_CLIENT_INTERFACE) == 0) {
842 DBG("Event: Property Changed: Interface: BT_HAL_NETWORK_CLIENT_INTERFACE");
843 /* TODO: Handle event */
844 } else if (strcasecmp(interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
845 DBG("Event: Property Changed: Interface: BT_HAL_GATT_CHAR_INTERFACE");
846 /* TODO: Handle event */
847 } else if (strcasecmp(interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
848 DBG("Event: Property Changed: Interface: BT_HAL_INPUT_INTERFACE");
849 __bt_hal_handle_input_event(val, object_path);
851 g_variant_unref(val);
854 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters)
858 if (__bt_hal_parse_interface(parameters) == FALSE) {
859 ERR("Fail to parse the properies");
860 g_variant_unref(value);
867 static void __bt_hal_send_hid_connection_state_event(
868 gboolean connected, char *address)
870 struct hal_ev_hidhost_conn_state ev;
872 ev.state = (connected == TRUE) ?
873 HAL_HIDHOST_STATE_CONNECTED :
874 HAL_HIDHOST_STATE_DISCONNECTED;
876 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
879 ERR("HID event handler not registered");
881 hid_event_cb(HAL_EV_HIDHOST_CONN_STATE, &ev, sizeof(ev));
884 static void __bt_hal_handle_input_event(GVariant *msg, const char *path)
886 gboolean property_flag = FALSE;
887 GVariantIter value_iter;
888 char *property = NULL;
889 GVariant *child = NULL, *val = NULL;
892 g_variant_iter_init(&value_iter, msg);
893 while ((child = g_variant_iter_next_value(&value_iter))) {
894 g_variant_get(child, "{sv}", &property, &val);
896 if (property == NULL)
899 if (strcasecmp(property, "Connected") == 0) {
902 g_variant_get(val, "b", &property_flag);
903 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
904 _bt_hal_convert_device_path_to_address(path, address);
905 __bt_hal_send_hid_connection_state_event(property_flag, address);
909 g_variant_unref(val);
910 g_variant_unref(child);
916 static gboolean __bt_hal_parse_interface(GVariant *msg)
919 GVariant *optional_param;
922 char *interface_name = NULL;
923 GVariant *inner_iter = NULL;
924 g_variant_get(msg, "(&o@a{sa{sv}})",
925 &path, &optional_param);
926 g_variant_iter_init(&iter, optional_param);
928 while ((child = g_variant_iter_next_value(&iter))) {
929 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
930 if (g_strcmp0(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
931 DBG("Found a device: %s", path);
932 if (__bt_hal_parse_device_properties(inner_iter) == FALSE) {
933 g_variant_unref(inner_iter);
934 g_variant_unref(child);
935 g_variant_unref(optional_param);
936 ERR("Fail to parse the properies");
939 g_variant_unref(inner_iter);
940 g_variant_unref(child);
941 g_variant_unref(optional_param);
945 g_variant_unref(inner_iter);
946 g_variant_unref(child);
949 g_variant_unref(optional_param);
954 void __bt_hal_handle_gatt_char_event(GVariant *parameters, const char *signal_name)
958 if (signal_name == NULL)
961 if (strcasecmp(signal_name, "GattValueChanged") == 0) {
962 DBG("GattValueChanged event received");
965 const char *char_handle = NULL;
966 GVariant *char_value_var = NULL;
968 char *char_value = NULL;
970 g_variant_get(parameters, "(i&s@ay)", &result, &char_handle, &char_value_var);
971 DBG("char handle: %s", char_handle);
973 len = g_variant_get_size(char_value_var);
975 char_value = (char *)g_variant_get_data(char_value_var);
977 _bt_hal_handle_gattc_value_changed_event(result, char_handle, char_value, len);
979 g_variant_unref(char_value_var);
984 static gboolean __bt_hal_event_manager(gpointer data)
986 bt_hal_event_type_t bt_event = 0x00;
988 char *obj_path = NULL;
990 bt_hal_main_event_data_t *param = (bt_hal_main_event_data_t*)data;
991 if (strcasecmp(param->signal_name, "InterfacesAdded") == 0) {
993 /*TODO: Handle Interfaces Added Signal from stack */
994 DBG("Manager Event: Signal Name: InterfacesAdded");
996 g_variant_get(param->parameters, "(&o@a{sa{sv}})", &obj_path, &value);
998 if (obj_path == NULL) {
999 DBG("obj_path is NULL");
1003 if (strcasecmp(obj_path, BT_HAL_BLUEZ_HCI_PATH) == 0) {
1004 /* TODO: Handle adapter added */
1005 DBG("Manager Event: Signal Name: InterfiacesAdded: Adapter added in bluetoothd: path [hci0]");
1007 bt_event = __bt_hal_parse_event(value);
1008 if (bt_event == BT_HAL_DEVICE_EVENT) {
1009 DBG("Device path : %s ", obj_path);
1010 __bt_hal_handle_device_event(value, param->parameters);
1011 } else if (bt_event == BT_HAL_AVRCP_CONTROL_EVENT) {
1012 DBG("Device path : %s ", obj_path);
1013 _bt_hal_set_control_device_path(obj_path);
1016 g_variant_unref(value);
1018 } else if (strcasecmp(param->signal_name, "InterfacesRemoved") == 0) {
1022 /*TODO: Handle Interfaces Removed Signal from stack */
1023 DBG("Manager Event: Signal Name: InterfacesRemoved");
1025 g_variant_get(param->parameters, "(&oas)", &obj_path, &iter);
1026 DBG("Device path : %s ", obj_path);
1027 while (g_variant_iter_loop(iter, "s", &str)) {
1028 if (g_strcmp0(str, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0)
1029 _bt_hal_remove_control_device_path(obj_path);
1031 g_variant_iter_free(iter);
1032 } else if (strcasecmp(param->signal_name, "NameOwnerChanged") == 0) {
1034 char *previous = NULL;
1035 char *current = NULL;
1037 if (g_strcmp0(g_variant_get_type_string(param->parameters), "(sss)") != 0) {
1038 ERR("Invalid variant format");
1042 /* TODO: Handle Name Owener changed Signal */
1043 if (__bt_hal_get_owner_info(param->parameters, &name, &previous, ¤t)) {
1044 DBG("Fail to get the owner info");
1048 if (*current != '\0')
1054 if (strcasecmp(name, BT_HAL_BLUEZ_NAME) == 0) {
1055 DBG("Bluetoothd is terminated");
1057 /* TODO: Handle Bluetoothd terminating scenario */
1058 _bt_hal_le_deinit();
1060 INFO("Name Owner changed [%s]", name);
1061 } else if (g_strcmp0(param->interface_name, BT_HAL_PROPERTIES_INTERFACE) == 0) {
1062 DBG("Manager Event: Interface Name: BT_HAL_PROPERTIES_INTERFACE");
1063 __bt_hal_handle_property_changed_event(param->parameters, param->object_path);
1064 } else if (g_strcmp0(param->interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
1065 DBG("Manager Event: Interface Name: BT_HAL_ADAPTER_INTERFACE");
1066 _bt_hal_handle_adapter_event(param->parameters, param->signal_name);
1067 } else if (g_strcmp0(param->interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
1068 DBG("Manager Event: Interface Name: BT_HAL_INPUT_INTERFACE");
1069 __bt_hal_handle_input_event(param->parameters, param->object_path);
1070 } else if (g_strcmp0(param->interface_name, BT_HAL_NETWORK_SERVER_INTERFACE) == 0) {
1071 /* TODO: Handle Network Server events from stack */
1072 DBG("Manager Event: Interface Name: BT_HAL_NETWORK_SERVER_INTERFACE");
1073 } else if (g_strcmp0(param->interface_name, BT_HAL_HEADSET_INTERFACE) == 0) {
1074 DBG("Manager Event: Interface Name: BT_HAL_HEADSET_INTERFACE");
1075 __bt_hal_handle_headset_events(param->parameters, param->signal_name, param->object_path);
1076 } else if (g_strcmp0(param->interface_name, BT_HAL_SINK_INTERFACE) == 0) {
1077 /* TODO: Handle Sink interface events from stack */
1078 DBG("Manager Event: Interface Name:BT_HAL_SINK_INTERFACE");
1079 } else if (g_strcmp0(param->interface_name, BT_HAL_AGENT_INTERFACE) == 0) {
1080 /* TODO: Handle Agent events from stack */
1081 DBG("Manager Event: Interface Name:BT_HAL_AGENT_INTERFACE");
1082 } else if (g_strcmp0(param->interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
1083 DBG("Manager Event: Interface Name:BT_HAL_DEVICE_INTERFACE");
1084 __bt_hal_handle_device_specific_events(param->parameters, param->signal_name, param->object_path);
1085 } else if (g_strcmp0(param->interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
1086 DBG("Manager Event: Interface Name: BT_HAL_PLAYER_CONTROL_INTERFACE");
1087 __bt_hal_handle_avrcp_ctrl_events(param->parameters, param->signal_name, param->object_path);
1088 } else if (g_strcmp0(param->interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
1089 DBG("Manager Event: Interface Name: BT_HAL_MEDIATRANSPORT_INTERFACE");
1090 __bt_hal_handle_avrcp_transport_events(param->parameters, param->signal_name, param->object_path);
1091 } else if (g_strcmp0(param->interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
1092 DBG("Manager Event: Interface Name: BT_HAL_GATT_CHAR_INTERFACE");
1093 __bt_hal_handle_gatt_char_event(param->parameters, param->signal_name);
1098 g_free(param->sender_name);
1099 g_free(param->object_path);
1100 g_free(param->interface_name);
1101 g_free(param->signal_name);
1102 g_variant_unref(param->parameters);
1107 static void __bt_hal_manager_event_filter(GDBusConnection *connection,
1108 const gchar *sender_name,
1109 const gchar *object_path,
1110 const gchar *interface_name,
1111 const gchar *signal_name,
1112 GVariant *parameters,
1115 if (signal_name == NULL)
1118 bt_hal_main_event_data_t *param = g_new0(bt_hal_main_event_data_t, 1);
1119 param->sender_name = g_strdup(sender_name);
1120 param->object_path = g_strdup(object_path);
1121 param->interface_name = g_strdup(interface_name);
1122 param->signal_name = g_strdup(signal_name);
1123 param->parameters = g_variant_ref(parameters);
1125 g_idle_add(__bt_hal_event_manager, (gpointer)param);
1129 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path)
1131 gboolean property_flag = FALSE;
1132 char *property = NULL;
1133 GVariant *value = NULL;
1134 g_variant_get(msg, "(sv)", &property, &value);
1136 if (property == NULL)
1139 DBG("Property = %s \n", property);
1140 /* We allow only 1 headset connection (HSP or HFP)*/
1141 if (strcasecmp(property, "Connected") == 0) {
1143 g_variant_get(value, "b", &property_flag);
1145 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1147 /* Fix : NULL_RETURNS */
1148 if (address == NULL)
1151 _bt_hal_convert_device_path_to_address(path, address);
1152 __bt_hal_send_hf_audio_connection_state_event(property_flag, address);
1154 } else if (strcasecmp(property, "State") == 0) {
1157 g_variant_get(value, "s", &state);
1159 /* This code assumes we support only 1 headset connection */
1160 /* Need to use the headset list, if we support multi-headsets */
1161 if (strcasecmp(state, "Playing") == 0) {
1162 DBG("Playing: Sco Connected");
1163 } else if (strcasecmp(state, "connected") == 0 ||
1164 strcasecmp(state, "disconnected") == 0) {
1165 if (strcasecmp(state, "connected") == 0)
1166 DBG("Sco Connected");
1168 DBG("Sco Disconnected");
1170 ERR("Not handled state - %s", state);
1175 } else if (strcasecmp(property, "SpeakerGain") == 0) {
1178 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1180 _bt_hal_convert_device_path_to_address(path, address);
1181 INFO("Speaker Gain for address [%s]", address);
1182 /* TODO Handle event sending to HAL */
1185 } else if (strcasecmp(property, "MicrophoneGain") == 0) {
1188 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1190 _bt_hal_convert_device_path_to_address(path, address);
1191 INFO("Microphone Gain for address [%s]", address);
1192 /* TODO Handle event sending to HAL */
1199 g_variant_unref(value);
1202 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn,
1208 static int subs_interface_added_id = -1;
1209 static int subs_interface_removed_id = -1;
1210 static int subs_name_owner_id = -1;
1211 static int subs_property_id = -1;
1212 static int subs_adapter_id = -1;
1217 if (subs_interface_added_id == -1) {
1218 subs_interface_added_id = g_dbus_connection_signal_subscribe(conn,
1219 NULL, BT_HAL_MANAGER_INTERFACE,
1220 BT_HAL_INTERFACES_ADDED, NULL, NULL, 0,
1221 __bt_hal_manager_event_filter,
1224 if (subs_interface_removed_id == -1) {
1225 subs_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
1226 NULL, BT_HAL_MANAGER_INTERFACE,
1227 BT_HAL_INTERFACES_REMOVED, NULL, NULL, 0,
1228 __bt_hal_manager_event_filter,
1231 if (subs_name_owner_id == -1) {
1232 subs_name_owner_id = g_dbus_connection_signal_subscribe(conn,
1233 NULL, BT_HAL_FREEDESKTOP_INTERFACE,
1234 BT_HAL_NAME_OWNER_CHANGED, NULL, NULL, 0,
1235 __bt_hal_manager_event_filter,
1238 if (subs_property_id == -1) {
1239 subs_property_id = g_dbus_connection_signal_subscribe(conn,
1240 NULL, BT_HAL_PROPERTIES_INTERFACE,
1241 BT_HAL_PROPERTIES_CHANGED, NULL, NULL, 0,
1242 __bt_hal_manager_event_filter,
1245 if (subs_adapter_id == -1) {
1246 subs_adapter_id = g_dbus_connection_signal_subscribe(conn,
1247 NULL, BT_HAL_ADAPTER_INTERFACE,
1248 NULL, NULL, NULL, 0,
1249 __bt_hal_manager_event_filter,
1253 if (subs_interface_added_id != -1) {
1254 g_dbus_connection_signal_unsubscribe(conn,
1255 subs_interface_added_id);
1256 subs_interface_added_id = -1;
1258 if (subs_interface_removed_id != -1) {
1259 g_dbus_connection_signal_unsubscribe(conn,
1260 subs_interface_removed_id);
1261 subs_interface_removed_id = -1;
1263 if (subs_name_owner_id != -1) {
1264 g_dbus_connection_signal_unsubscribe(conn,
1265 subs_name_owner_id);
1266 subs_name_owner_id = -1;
1268 if (subs_property_id != -1) {
1269 g_dbus_connection_signal_unsubscribe(conn,
1271 subs_property_id = -1;
1273 if (subs_adapter_id == -1) {
1274 g_dbus_connection_signal_unsubscribe(conn, subs_adapter_id);
1275 subs_adapter_id = -1;
1283 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn,
1286 static int subs_device_id = -1;
1293 if (subs_device_id == -1) {
1294 subs_device_id = g_dbus_connection_signal_subscribe(conn,
1295 NULL, BT_HAL_DEVICE_INTERFACE,
1296 NULL, NULL, NULL, 0,
1297 __bt_hal_manager_event_filter,
1301 if (subs_device_id != -1) {
1302 g_dbus_connection_signal_unsubscribe(conn,
1304 subs_device_id = -1;
1312 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe)
1314 static int subs_input_id = -1;
1322 if (subs_input_id == -1) {
1323 subs_input_id = g_dbus_connection_signal_subscribe(conn,
1324 NULL, BT_HAL_INPUT_INTERFACE,
1325 NULL, NULL, NULL, 0,
1326 __bt_hal_manager_event_filter,
1330 if (subs_input_id != -1) {
1331 g_dbus_connection_signal_unsubscribe(conn,
1342 static int __bt_hal_register_gatt_subscribe_signal(GDBusConnection *conn,
1345 static int subs_gatt_id = -1;
1350 if (subs_gatt_id == -1) {
1351 subs_gatt_id = g_dbus_connection_signal_subscribe(conn,
1352 NULL, BT_HAL_GATT_CHAR_INTERFACE,
1353 NULL, NULL, NULL, 0,
1354 __bt_hal_manager_event_filter,
1358 if (subs_gatt_id == -1) {
1359 g_dbus_connection_signal_unsubscribe(conn,
1365 return BT_HAL_ERROR_NONE;
1370 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type)
1375 return BT_HAL_ERROR_INTERNAL;
1377 /* TODO: Add more events in subsequent patches */
1378 switch (event_type) {
1379 case BT_HAL_MANAGER_EVENT:
1380 __bt_hal_register_manager_subscribe_signal(g_conn, TRUE);
1382 case BT_HAL_DEVICE_EVENT:
1383 __bt_hal_register_device_subscribe_signal(g_conn, TRUE);
1385 case BT_HAL_HID_EVENT:
1386 __bt_hal_register_input_subscribe_signal(g_conn, TRUE);
1388 case BT_HAL_HEADSET_EVENT:
1389 __bt_hal_register_audio_subscribe_signal(g_conn, TRUE);
1391 case BT_HAL_GATT_EVENT:
1392 __bt_hal_register_gatt_subscribe_signal(g_conn, TRUE);
1395 INFO_C("Register Event: event_type [%d]", event_type);
1396 return BT_HAL_ERROR_NOT_SUPPORT;
1399 return BT_HAL_ERROR_NONE;
1402 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn,
1408 static int subs_headset_id = -1;
1409 static int subs_sink_id = -1;
1412 if (subs_headset_id == -1) {
1413 subs_headset_id = g_dbus_connection_signal_subscribe(conn,
1414 NULL, BT_HAL_HEADSET_INTERFACE,
1415 NULL, NULL, NULL, 0,
1416 __bt_hal_manager_event_filter,
1419 if (subs_sink_id == -1) {
1420 subs_sink_id = g_dbus_connection_signal_subscribe(conn,
1421 NULL, BT_HAL_SINK_INTERFACE,
1422 NULL, NULL, NULL, 0,
1423 __bt_hal_manager_event_filter,
1427 if (subs_headset_id != -1) {
1428 g_dbus_connection_signal_unsubscribe(conn,
1430 subs_headset_id = -1;
1432 if (subs_sink_id != -1) {
1433 g_dbus_connection_signal_unsubscribe(conn,
1441 static int __bt_hal_initialize_manager_receiver(void)
1445 GError *error = NULL;
1447 if (manager_conn == NULL) {
1448 manager_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1449 if (error != NULL) {
1450 ERR_C("ERROR: Can't get on system bus [%s]", error->message);
1451 g_clear_error(&error);
1453 if (manager_conn == NULL)
1457 if (__bt_hal_register_service_event(manager_conn,
1458 BT_HAL_MANAGER_EVENT) != BT_HAL_ERROR_NONE)
1460 if (__bt_hal_register_service_event(manager_conn,
1461 BT_HAL_DEVICE_EVENT) != BT_HAL_ERROR_NONE)
1463 if (__bt_hal_register_service_event(manager_conn,
1464 BT_HAL_HID_EVENT) != BT_HAL_ERROR_NONE)
1466 if (__bt_hal_register_service_event(manager_conn,
1467 BT_HAL_HEADSET_EVENT) != BT_HAL_ERROR_NONE)
1469 if (__bt_hal_register_service_event(manager_conn,
1470 BT_HAL_GATT_EVENT) != BT_HAL_ERROR_NONE)
1472 return BT_HAL_ERROR_NONE;
1475 g_object_unref(manager_conn);
1476 manager_conn = NULL;
1481 return BT_HAL_ERROR_INTERNAL;
1484 /* To receive the event from bluez */
1485 int _bt_hal_initialize_event_receiver(handle_stack_msg cb)
1491 return BT_HAL_ERROR_INVALID_PARAM;
1493 result = __bt_hal_initialize_manager_receiver();
1495 DBG("Manager event receiver initialization result [%d]", result);
1496 if (result != BT_HAL_ERROR_NONE)
1499 /*TODO: Initialize Obexd Event receiver */
1501 /* Initialize event receiver for flight mode */
1502 _bt_hal_register_vconf_handler();
1507 return BT_HAL_ERROR_NONE;
1510 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path)
1512 GVariantIter value_iter;
1513 GVariant *value = NULL;
1515 g_variant_iter_init(&value_iter, msg);
1518 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
1519 if (!g_strcmp0(key, "Connected")) {
1520 guint connected = 0;
1521 g_variant_get(value, "i", &connected);
1522 DBG("Device property changed : Connected [%d]", connected);
1523 } else if (!g_strcmp0(key, "RSSI")) {
1524 DBG("Device property changed : RSSI");
1525 __bt_hal_dbus_device_found_properties(path);
1526 } else if (!g_strcmp0(key, "GattConnected")) {
1527 DBG("Device property changed : GattConnected");
1528 gboolean gatt_connected = FALSE;
1529 g_variant_get(value, "b", &gatt_connected);
1530 char *address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1531 _bt_hal_convert_device_path_to_address(path, address);
1532 DBG("@@gatt_connected: %d", gatt_connected);
1533 DBG("@@address: %s", address);
1534 if (_bt_hal_check_gattc_is_existing(address) == TRUE) {
1535 DBG("GattConnected event will be handled on CLIENT side");
1536 _bt_hal_handle_gattc_connected_event(address, gatt_connected);
1538 DBG("GattConnected event will be handled on SERVER side");
1539 _bt_hal_gatt_connected_state_event(gatt_connected, address);
1542 } else if (!g_strcmp0(key, "Paired")) {
1543 gboolean paired = FALSE;
1544 struct hal_ev_bond_state_changed ev;
1545 char address[BT_HAL_ADDRESS_STRING_SIZE];
1547 g_variant_get(value, "b", &paired);
1548 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1550 _bt_hal_agent_set_canceled(FALSE);
1551 _bt_hal_convert_device_path_to_address(path, address);
1553 /* Prepare to send event to HAL bluetooth */
1554 ev.status = BT_STATUS_SUCCESS;
1555 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1556 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1559 ERR("Bluetooth HAL event handler not registered");
1561 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
1562 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1564 } else if (!g_strcmp0(key, "LegacyPaired")) {
1565 DBG("Device property changed : LegacyPaired");
1566 } else if (!g_strcmp0(key, "Trusted")) {
1567 DBG("Device property changed : Trusted");
1568 gboolean trusted = FALSE;
1569 gchar *address = NULL;
1570 g_variant_get(value, "b", &trusted);
1571 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1573 _bt_hal_convert_device_path_to_address(path, address);
1574 DBG("Device [%s] trusted: [%d]", address, trusted);
1576 __bt_hal_send_device_trust_state_event(trusted, address);
1578 } else if (!g_strcmp0(key, "IpspConnected")) {
1579 DBG("Device property changed : IpspConnected");
1580 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
1581 DBG("Device property changed : IpspInitStateChanged");
1582 } else if (!g_strcmp0(key, "TrustedProfiles")) {
1584 char address[BT_HAL_ADDRESS_STRING_SIZE];
1586 g_variant_get(value, "u", &trust_val);
1587 _bt_hal_convert_device_path_to_address(path, address);
1588 DBG("Address: %s, TrustedProfiles: 0x%X", address, trust_val);
1589 __bt_hal_send_device_trusted_profile_changed_event(trust_val, address);
1591 ERR("Unhandled Property:[%s]", key);
1597 static void __bt_hal_dbus_device_found_properties(const char *device_path)
1600 GError *error = NULL;
1601 GDBusProxy *device_proxy;
1602 GDBusConnection *conn;
1607 ERR("Invalid device path");
1611 conn = _bt_hal_get_system_gconn();
1613 ERR("_bt_hal_get_system_gconn failed");
1617 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1621 BT_HAL_PROPERTIES_INTERFACE,
1624 if (!device_proxy) {
1625 ERR("Error creating device_proxy");
1629 result = g_dbus_proxy_call_sync(device_proxy,
1631 g_variant_new("(s)", BT_HAL_DEVICE_INTERFACE),
1632 G_DBUS_CALL_FLAGS_NONE,
1637 ERR("Error occured in Proxy call");
1638 if (error != NULL) {
1639 ERR("Error occured in Proxy call (Error: %s)", error->message);
1640 g_clear_error(&error);
1642 g_object_unref(device_proxy);
1646 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1647 _bt_hal_convert_device_path_to_address(device_path, address);
1649 __bt_hal_device_properties_lookup(result, address);
1651 g_object_unref(device_proxy);
1657 static void __bt_hal_device_properties_lookup(GVariant *result, char *address)
1659 /* Buffer and propety count management */
1660 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
1661 struct hal_ev_device_found *ev = (void *) buf;
1663 memset(buf, 0, sizeof(buf));
1667 GVariant *tmp_value;
1670 gchar *manufacturer_data = NULL;
1673 if (result != NULL) {
1674 g_variant_get(result , "(@a{sv})", &value);
1675 g_variant_unref(result);
1678 tmp_value = g_variant_lookup_value(value, "Alias", G_VARIANT_TYPE_STRING);
1680 g_variant_get(tmp_value, "s", &name);
1682 g_variant_unref(tmp_value);
1684 DBG_SECURE("Alias Name [%s]", name);
1685 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1686 strlen(name) + 1, name);
1688 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1691 tmp_value = g_variant_lookup_value(value, "Name", G_VARIANT_TYPE_STRING);
1692 g_variant_get(tmp_value, "s", &name);
1693 g_variant_unref(tmp_value);
1695 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1696 strlen(name) + 1, name);
1698 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1699 g_variant_get(tmp_value, "s", &name);
1703 tmp_value = g_variant_lookup_value(value, "Class", G_VARIANT_TYPE_UINT32);
1704 unsigned int class = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1705 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
1706 sizeof(unsigned int), &class);
1709 g_variant_unref(tmp_value);
1713 tmp_value = g_variant_lookup_value(value, "Connected", G_VARIANT_TYPE_BOOLEAN);
1714 unsigned int connected = tmp_value ? g_variant_get_boolean(tmp_value) : 0;
1715 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
1716 sizeof(unsigned int), &connected);
1718 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
1720 g_variant_unref(tmp_value);
1723 tmp_value = g_variant_lookup_value(value, "Trusted", G_VARIANT_TYPE_BOOLEAN);
1724 uint8_t trust = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1725 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
1726 sizeof(uint8_t), &trust);
1728 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
1730 g_variant_unref(tmp_value);
1733 tmp_value = g_variant_lookup_value(value, "Paired", G_VARIANT_TYPE_BOOLEAN);
1734 uint8_t paired = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1736 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
1737 sizeof(uint8_t), &paired);
1739 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
1741 g_variant_unref(tmp_value);
1744 tmp_value = g_variant_lookup_value(value, "RSSI", G_VARIANT_TYPE_INT32);
1745 int rssi = tmp_value ? g_variant_get_int32(tmp_value) : 0;
1746 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
1747 sizeof(int), &rssi);
1749 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
1751 g_variant_unref(tmp_value);
1753 /* Last Addr Type */
1754 tmp_value = g_variant_lookup_value(value, "LastAddrType", G_VARIANT_TYPE_UINT32);
1755 unsigned int addr_type = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1757 g_variant_unref(tmp_value);
1758 DBG("Device Last Address Type [0x%x]", addr_type);
1761 tmp_value = g_variant_lookup_value(value, "IsAliasSet", G_VARIANT_TYPE_UINT32);
1762 uint8_t is_alias_set = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1763 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
1764 sizeof(uint8_t), &is_alias_set);
1766 DBG("IsAliasSet: [%s], Property num [%d]", (is_alias_set ? "TRUE" : "FALSE"), ev->num_props);
1768 g_variant_unref(tmp_value);
1771 tmp_value = g_variant_lookup_value(value, "UUIDs", G_VARIANT_TYPE_STRING_ARRAY);
1772 gsize uuid_count = g_variant_get_size(tmp_value);
1773 char **uuid_value = g_variant_dup_strv(tmp_value, &uuid_count);
1775 /* UUID collection */
1780 int num_props_tmp = ev->num_props;
1782 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
1784 for (i = 0; uuid_value[i] != NULL; i++) {
1786 char *uuid_str = NULL;
1787 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
1788 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
1790 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
1791 uuid_str = g_strdup(uuid_value[i]);
1792 DBG("UUID string [%s]\n", uuid_str);
1794 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
1796 for (z = 0; z < 16; z++)
1797 DBG("[0x%x]", uuid[z]);
1800 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
1804 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
1805 (BT_HAL_STACK_UUID_SIZE * uuid_count),
1807 ev->num_props = num_props_tmp + 1;
1810 g_variant_unref(tmp_value);
1812 /* LegacyManufacturerDataLen */
1813 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerDataLen", G_VARIANT_TYPE_UINT32);
1814 unsigned int manufacturer_data_len = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1815 if (manufacturer_data_len > BT_HAL_MANUFACTURER_DATA_LENGTH_MAX) {
1816 ERR("manufacturer_data_len is too long(len = %d)", manufacturer_data_len);
1817 manufacturer_data_len = BT_HAL_MANUFACTURER_DATA_LENGTH_MAX;
1820 g_variant_unref(tmp_value);
1821 /*size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA_LEN,
1822 sizeof(unsigned int), &manufacturer_data_len);
1824 DBG("Device Legacy Manufacturer data length [%u]", manufacturer_data_len);
1826 /* ManufacturerData */
1827 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerData", G_VARIANT_TYPE_BYTESTRING);
1828 manufacturer_data = value ? (gchar *)g_variant_get_bytestring(tmp_value) : NULL;
1829 if (manufacturer_data) {
1830 if (manufacturer_data_len > 0) {
1831 //size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA,
1832 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_BLE_ADV_DATA,
1833 manufacturer_data_len, manufacturer_data);
1838 g_variant_unref(tmp_value);
1842 _bt_hal_convert_addr_string_to_type(bdaddr, address);
1843 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
1844 sizeof(bdaddr), bdaddr);
1846 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
1849 g_variant_unref(value);
1851 ERR("result is NULL\n");
1854 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
1855 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
1860 static void __bt_hal_send_device_acl_connection_state_event(int status, gboolean connected, const char *address)
1863 struct hal_ev_acl_state_changed ev;
1866 ev.state = (connected == TRUE) ?
1867 HAL_ACL_STATE_CONNECTED :
1868 HAL_ACL_STATE_DISCONNECTED;
1870 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1873 ERR("Bluetooth HAL event handler not registered");
1875 event_cb(HAL_EV_ACL_STATE_CHANGED, &ev, sizeof(ev));
1879 static void __bt_hal_send_device_le_connection_state_event(int status, gboolean connected, const char *address)
1882 struct hal_ev_le_conn_state_changed ev;
1885 ev.state = (connected == TRUE) ?
1886 HAL_LE_STATE_CONNECTED :
1887 HAL_LE_STATE_DISCONNECTED;
1889 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1892 ERR("Bluetooth HAL event handler not registered");
1894 event_cb(HAL_EV_LE_CONN_STATE_CHANGED, &ev, sizeof(ev));
1898 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted,
1899 const char *address)
1901 struct hal_ev_device_trust_state_changed ev;
1904 ev.trust = (is_trusted == TRUE) ?
1905 HAL_DEVICE_TRUSTED :
1906 HAL_DEVICE_UNTRUSTED;
1908 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1911 ERR("Bluetooth HAL event handler not registered");
1913 event_cb(HAL_EV_DEVICE_TRUST_CHANGED, &ev, sizeof(ev));
1917 static void __bt_hal_send_device_trusted_profile_changed_event(
1918 uint32_t trust_val, const char *address)
1920 struct hal_ev_device_trusted_profiles_changed ev;
1923 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1924 ev.trust_val = trust_val;
1927 ERR("Bluetooth HAL event handler not registered");
1929 event_cb(HAL_EV_DEVICE_TRUSTED_PROFILES_CHANGED, &ev, sizeof(ev));
1933 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member,
1937 const char *property = NULL;
1941 if (strcasecmp(member, "PropertyChanged") == 0) {
1942 g_variant_get(msg, "(s)", &property);
1943 if (property == NULL)
1945 if (strcasecmp(property, "GattConnected") == 0) {
1946 INFO("GATT Connected");
1947 gboolean connected = FALSE;
1949 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1951 _bt_hal_convert_device_path_to_address(path, address);
1952 g_variant_get(msg, "(b)", &connected);
1954 INFO("Connected device address[%s] connnected[%d]", address, connected);
1956 } else if (strcasecmp(property, "Paired") == 0) {
1957 gboolean paired = FALSE;
1958 struct hal_ev_bond_state_changed ev;
1959 char address[BT_HAL_ADDRESS_STRING_SIZE];
1961 g_variant_get(msg, "(b)", &paired);
1962 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1964 _bt_hal_agent_set_canceled(FALSE);
1965 _bt_hal_convert_device_path_to_address(path, address);
1967 /* Prepare to send event to HAL bluetooth */
1968 ev.status = BT_STATUS_SUCCESS;
1969 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1970 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1973 ERR("Bluetooth HAL event handler not registered");
1975 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
1976 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1978 } else if (strcasecmp(property, "UUIDs") == 0) {
1981 } else if (strcasecmp(member, "DeviceConnected") == 0) {
1982 unsigned char addr_type = 0;
1984 g_variant_get(msg, "(y)", &addr_type);
1986 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1987 _bt_hal_convert_device_path_to_address(path, address);
1989 DBG("Member: [%s]", member);
1990 ERR_C("Connected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
1992 __bt_hal_send_device_acl_connection_state_event(BT_STATUS_SUCCESS, TRUE, address);
1994 __bt_hal_send_device_le_connection_state_event(BT_STATUS_SUCCESS, TRUE, address);
1996 } else if (strcasecmp(member, "Disconnected") == 0) {
1997 unsigned char disc_reason = 0;
1998 unsigned char addr_type = 0;
2001 g_variant_get(msg, "(yy&s)", &addr_type, &disc_reason, &name);
2003 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2004 _bt_hal_convert_device_path_to_address(path, address);
2006 DBG("Member: [%s]", member);
2008 ERR_C("DisConnected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
2009 DBG("Disconnected Reason [%d : %s]", disc_reason, _bt_hal_convert_disc_reason_to_string(disc_reason));
2010 DBG("Name: %s", name);
2012 __bt_hal_send_device_acl_connection_state_event(_bt_hal_convert_disc_reason_to_status(disc_reason), FALSE, address);
2014 __bt_hal_send_device_le_connection_state_event(_bt_hal_convert_disc_reason_to_status(disc_reason), FALSE, address);
2016 } else if (strcasecmp(member, "ProfileStateChanged") == 0) {
2018 char *profile_uuid = NULL;
2020 g_variant_get(msg, "(si)", &profile_uuid, &state);
2021 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2022 _bt_hal_convert_device_path_to_address(path, address);
2024 DBG("Address: %s", address);
2025 DBG("Profile UUID: %s", profile_uuid);
2026 DBG("State: %d", state);
2027 if (strncmp(profile_uuid, HID_UUID, strlen(HID_UUID)) == 0) {
2028 if (state == BT_HAL_PROFILE_STATE_CONNECTED)
2029 __bt_hal_send_hid_connection_state_event(TRUE, address);
2030 else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED)
2031 __bt_hal_send_hid_connection_state_event(FALSE, address);
2033 DBG("Profile state: %d", state);
2035 } else if ((strncmp(profile_uuid, A2DP_SINK_UUID, strlen(A2DP_SINK_UUID)) == 0)) {
2036 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2037 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTED");
2038 __bt_hal_send_av_connection_state_event(TRUE, address);
2039 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2040 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2041 __bt_hal_send_av_connection_state_event(FALSE, address);
2042 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2043 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2044 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2045 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTING");
2047 ERR("A2DP Profile state: Invalid");
2049 } else if ((strncmp(profile_uuid, A2DP_SOURCE_UUID, strlen(A2DP_SOURCE_UUID)) == 0)) {
2050 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2051 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
2052 __bt_hal_send_a2dp_sink_connection_state_event(TRUE, address);
2053 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2054 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
2055 __bt_hal_send_a2dp_sink_connection_state_event(FALSE, address);
2056 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2057 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
2058 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2059 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
2061 } else if (strcmp(profile_uuid, HFP_HF_UUID) == 0) {
2062 if (state == BT_HAL_PROFILE_STATE_CONNECTING)
2063 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTING");
2064 else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2065 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTED");
2066 __bt_hal_send_hf_connection_state_event(TRUE, address);
2067 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2068 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2069 __bt_hal_send_hf_connection_state_event(FALSE, address);
2070 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2071 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2073 ERR("HFP Profile state: Invalid");
2075 } else if (strncmp(profile_uuid, HFP_AG_UUID, strlen(HFP_AG_UUID)) == 0) {
2076 if (state == BT_HAL_PROFILE_STATE_CONNECTING)
2077 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_CONNECTING");
2078 else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2079 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_CONNECTED");
2080 __bt_hal_send_hf_client_connection_state_event(TRUE, address);
2081 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2082 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2083 __bt_hal_send_hf_client_connection_state_event(FALSE, address);
2084 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2085 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2087 ERR("HFP Client Profile state: Invalid");
2089 } else if ((strncmp(profile_uuid, AVRCP_TARGET_UUID, strlen(AVRCP_TARGET_UUID)) == 0)) {
2090 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2091 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
2092 __bt_hal_send_avrcp_ctrl_connection_state_event(TRUE, address);
2093 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2094 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
2095 __bt_hal_send_avrcp_ctrl_connection_state_event(FALSE, address);
2096 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2097 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
2098 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2099 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
2102 DBG("Profile[%s] State changed status [%d] ", profile_uuid, state);
2105 g_free(profile_uuid);
2106 } else if (strcasecmp(member, "AttMtuChanged") == 0) {
2110 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2112 DBG("Member: [%s]", member);
2114 _bt_hal_convert_device_path_to_address(path, address);
2115 g_variant_get(msg, "(q)", &mtu);
2117 __bt_hal_handle_gatts_mtu_changed_event(address, mtu);
2120 } else if (strcasecmp(member, "AdvReport") == 0) {
2121 DBG("Member: [%s]", member);
2122 __bt_hal_handle_adv_report(msg, path);
2126 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path)
2128 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
2129 struct hal_ev_gatt_client_scan_result *ev = (void *)buf;
2131 char *address = NULL;
2132 GVariant *value = NULL;
2133 char *buffer = NULL;
2136 uint8_t addr_type = 0;
2137 uint8_t adv_type = 0;
2143 memset(buf, 0, sizeof(buf));
2146 g_variant_get(msg, "(&syyii@ay)", &address, &addr_type,
2147 &adv_type, &rssi, &data_len, &value);
2149 buffer_len = g_variant_get_size(value);
2151 buffer = (char *)g_variant_get_data(value);
2153 if (data_len != buffer_len) {
2154 ERR("Unexpected: buffer_len: %d, data_len: %d",
2155 buffer_len, data_len);
2156 data_len = buffer_len;
2159 DBG("Address: %s, len: %d, rssi: %d, addr_type: 0x%02X, adv_type: 0x%02X",
2160 address, data_len, rssi, addr_type, adv_type);
2162 _bt_hal_convert_addr_string_to_type(ev->bd_addr, address);
2163 ev->addr_type = addr_type;
2164 ev->adv_type = adv_type;
2167 memcpy(ev->adv_data, buffer, data_len);
2170 DBG("Send le scan result event to HAL, size: [%zd]", size);
2171 gatt_event_cb(HAL_EV_GATT_CLIENT_SCAN_RESULT, buf, size);
2172 g_variant_unref(value);
2175 static void __bt_hal_handle_gatts_mtu_changed_event(char *address, int mtu)
2177 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
2178 struct hal_ev_gatt_server_mtu_changed *ev = (void *)buf;
2184 memset(buf, 0, sizeof(buf));
2187 DBG("Address: %s, mtu: %d", address, mtu);
2189 ev->conn_id = _bt_get_remote_gatt_client_conn_id(address);
2192 DBG("Send GATT server mtu changed event to HAL, size: [%zd]", size);
2193 gatt_event_cb(HAL_EV_GATT_SERVER_MTU_CHANGED, buf, size);
2196 /* AVRCP Controller Role(Remote:AVRCP Target) Events */
2197 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address)
2200 struct hal_ev_avrcp_ctrl_conn_state ev;
2202 if (connected == TRUE)
2203 INFO("AVRCP(Controller) Profile Connected for address [%s]", address);
2205 INFO("AVRCP(Controller) Profile DisConnected for address [%s]", address);
2207 if (connected == TRUE)
2208 ev.state = HAL_AVRCP_CTRL_STATE_CONNECTED;
2210 ev.state = HAL_AVRCP_CTRL_STATE_DISCONNECTED;
2211 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2213 if (!a2dp_sink_event_cb)
2214 ERR("AV event handler not registered");
2216 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_CONN_STATE, &ev, sizeof(ev));
2219 static int __bt_media_attr_to_type(const char *str)
2221 if (!strcasecmp(str, "Equalizer"))
2222 return HAL_PLAYER_ATTR_EQUALIZER;
2223 else if (!strcasecmp(str, "Repeat"))
2224 return HAL_PLAYER_ATTR_REPEAT;
2225 else if (!strcasecmp(str, "Shuffle"))
2226 return HAL_PLAYER_ATTR_SHUFFLE;
2227 else if (!strcasecmp(str, "Scan"))
2228 return HAL_PLAYER_ATTR_SCAN;
2234 static int __bt_hal_play_status_str_to_type(const char *value)
2236 if (!strcmp(value, "stopped"))
2237 return HAL_PLAYSTATE_STOPPED;
2238 else if (!strcmp(value, "playing"))
2239 return HAL_PLAYSTATE_PLAYING;
2240 else if (!strcmp(value, "paused"))
2241 return HAL_PLAYSTATE_PAUSED;
2242 else if (!strcmp(value, "forward-seek"))
2243 return HAL_PLAYSTATE_FWD_SEEK;
2244 else if (!strcmp(value, "reverse-seek"))
2245 return HAL_PLAYSTATE_REV_SEEK;
2247 return HAL_PLAYSTATE_ERROR;
2250 static void __bt_avrcp_control_parse_properties(struct hal_ev_track_changed *ev, GVariant *item)
2252 GVariant *value = NULL;
2254 char *value_string = NULL;
2255 const char *key = NULL;
2261 g_variant_iter_init(&iter, item);
2262 while (g_variant_iter_loop(&iter, "{sv}", &key, &value)) {
2263 if (strcasecmp(key, "Title") == 0) {
2264 value_string = (char *)g_variant_get_string(value, NULL);
2265 DBG("Value : %s ", value_string);
2266 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TITLE;
2267 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2269 } else if (strcasecmp(key, "Artist") == 0) {
2270 value_string = (char *)g_variant_get_string(value, NULL);
2271 DBG("Value : %s ", value_string);
2272 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ARTIST;
2273 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2275 } else if (strcasecmp(key, "Album") == 0) {
2276 value_string = (char *)g_variant_get_string(value, NULL);
2277 DBG("Value : %s ", value_string);
2278 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ALBUM;
2279 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2281 } else if (strcasecmp(key, "Genre") == 0) {
2282 value_string = (char *)g_variant_get_string(value, NULL);
2283 DBG("Value : %s ", value_string);
2284 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_GENRE;
2285 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2287 } else if (strcasecmp(key, "Duration") == 0) {
2290 val = g_variant_get_uint32(value);
2291 DBG("Value : %li", val);
2292 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_PLAYING_TIME;
2293 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2295 } else if (strcasecmp(key, "NumberOfTracks") == 0) {
2298 val = g_variant_get_uint32(value);
2299 DBG("Value : %li", val);
2300 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_NUM_TRACKS;
2301 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2303 } else if (strcasecmp(key, "TrackNumber") == 0) {
2306 val = g_variant_get_uint32(value);
2307 DBG("Value : %li", val);
2308 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TRACK_NUM;
2309 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2312 DBG("%s not supported, ignoring", key);
2315 if (i >= HAL_MAX_ATTR_NUM) {
2316 ERR(" Received max attribute [%d]", i);
2322 g_variant_iter_free(&iter);
2326 static int __bt_media_attrval_to_val(int type, const char *value)
2331 case HAL_PLAYER_ATTR_EQUALIZER:
2332 if (!strcmp(value, "off"))
2337 case HAL_PLAYER_ATTR_REPEAT:
2338 if (!strcmp(value, "off"))
2339 ret = BTRC_PLAYER_VAL_OFF_REPEAT;
2340 else if (!strcmp(value, "singletrack"))
2341 ret = BTRC_PLAYER_VAL_SINGLE_REPEAT;
2342 else if (!strcmp(value, "alltracks"))
2343 ret = BTRC_PLAYER_VAL_ALL_REPEAT;
2345 ret = BTRC_PLAYER_VAL_GROUP_REPEAT;
2347 case HAL_PLAYER_ATTR_SHUFFLE:
2348 if (!strcmp(value, "off"))
2349 ret = BTRC_PLAYER_VAL_OFF_SHUFFLE;
2350 else if (!strcmp(value, "alltracks"))
2351 ret = BTRC_PLAYER_VAL_ALL_SHUFFLE;
2353 ret = BTRC_PLAYER_VAL_GROUP_SHUFFLE;
2355 case HAL_PLAYER_ATTR_SCAN:
2356 if (!strcmp(value, "off"))
2358 else if (!strcmp(value, "alltracks"))
2364 ERR("Value not handled");
2370 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member,
2373 const char *property = NULL;
2374 GVariant *value = NULL;
2376 char address[BT_HAL_ADDRESS_STRING_SIZE];
2379 ERR("Error returned in method call\n");
2383 if (!avrcp_ctrl_event_cb) {
2384 ERR("AVRCP controller DBUS handler callback not registered");
2388 g_variant_iter_init(&iter, msg);
2390 _bt_hal_convert_device_path_to_address(path, address);
2392 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2393 DBG("Property = %s \n", property);
2394 if ((strcasecmp(property, "Equalizer") == 0) ||
2395 (strcasecmp(property, "Repeat") == 0) ||
2396 (strcasecmp(property, "Shuffle") == 0) ||
2397 (strcasecmp(property, "Scan") == 0)) {
2398 struct hal_ev_player_setting ev;
2402 valstr = g_variant_get_string(value, NULL);
2403 DBG("Value : %s ", valstr);
2406 val = __bt_media_attrval_to_val(__bt_media_attr_to_type(property), valstr);
2409 memset(&ev, 0, sizeof(ev));
2410 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2412 ev.attr_ids[0] = __bt_media_attr_to_type(property);
2413 ev.attr_values[0] = val;
2415 /* Send event to application */
2416 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAYER_APP_SETTING_CHANGED, &ev, sizeof(ev));
2418 } else if ((strcasecmp(property, "Status") == 0)) {
2419 struct hal_ev_play_status_changed ev;
2422 valstr = g_variant_get_string(value, NULL);
2423 DBG("Value : %s ", valstr);
2425 memset(&ev, 0, sizeof(ev));
2426 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2428 ev.status = __bt_hal_play_status_str_to_type(valstr);
2430 /* Send event to application */
2431 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_STATUS_CHANGED, &ev, sizeof(ev));
2433 } else if (strcasecmp(property, "Position") == 0) {
2434 struct hal_ev_play_position ev;
2436 memset(&ev, 0, sizeof(ev));
2437 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2438 ev.pos = g_variant_get_uint32(value);
2439 DBG("Value : %d ", ev.pos);
2441 /* Send event to application */
2442 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_POSITION_CHANGED, &ev, sizeof(ev));
2443 } else if (strcasecmp(property, "Track") == 0) {
2444 struct hal_ev_track_changed ev;
2446 memset(&ev, 0, sizeof(ev));
2447 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2448 __bt_avrcp_control_parse_properties(&ev, value);
2450 /* Send event to application */
2451 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_TRACK_CHANGED, &ev, sizeof(ev));
2453 DBG("Property not handled");
2457 g_free((char *)property);
2458 g_variant_unref(value);
2461 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member,
2464 const char *property = NULL;
2465 GVariant *value = NULL;
2467 char address[BT_HAL_ADDRESS_STRING_SIZE];
2471 ERR("Error returned in method call\n");
2475 if (!avrcp_tg_event_cb) {
2476 ERR("AVRCP target DBUS handler callback not registered");
2480 g_variant_iter_init(&iter, msg);
2482 _bt_hal_convert_device_path_to_address(path, address);
2484 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2485 DBG("Property = %s \n", property);
2486 if ((strcasecmp(property, "Delay") == 0)) {
2487 struct hal_ev_avrcp_tg_delay_changed ev;
2490 memset(&ev, 0, sizeof(ev));
2491 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2493 val = g_variant_get_uint16(value);
2494 DBG("Value : %d", val);
2497 /* Send event to application */
2498 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_DELAY_CHANGE, &ev, sizeof(ev));
2500 DBG("Property not handled");
2505 g_free((char *)property);
2506 g_variant_unref(value);
2509 /* A2DP Src Role(Remote:Sink) Events */
2510 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address)
2513 struct hal_ev_a2dp_conn_state ev;
2515 if (connected == TRUE)
2516 INFO("A2DP(Src) Profile Connected for address [%s]", address);
2518 INFO("A2DP(Src) Profile DisConnected for address [%s]", address);
2520 ev.state = (connected == TRUE) ?
2521 HAL_EV_A2DP_STATE_CONNECTED :
2522 HAL_EV_A2DP_STATE_DISCONNECTED;
2524 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2527 ERR("AV event handler not registered");
2529 av_event_cb(HAL_EV_A2DP_CONN_STATE, &ev, sizeof(ev));
2532 /* A2DP Sink Role(Remote:Source) Events */
2533 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address)
2536 struct hal_ev_a2dp_conn_state ev;
2538 if (connected == TRUE)
2539 INFO("A2DP(Sink) Profile Connected for address [%s]", address);
2541 INFO("A2DP(Sink) Profile DisConnected for address [%s]", address);
2543 ev.state = (connected == TRUE) ?
2544 HAL_EV_A2DP_STATE_CONNECTED :
2545 HAL_EV_A2DP_STATE_DISCONNECTED;
2547 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2549 if (!a2dp_sink_event_cb)
2550 ERR("AV event handler not registered");
2552 a2dp_sink_event_cb(HAL_EV_A2DP_SOURCE_CONN_STATE, &ev, sizeof(ev));
2555 /* HF(AG Role) Audio Events */
2556 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected,
2557 const char *address)
2560 struct hal_ev_handsfree_audio_state ev;
2562 if (connected == TRUE)
2563 INFO("AG Audio Connected for address [%s]", address);
2565 INFO("AG Audio DisConnected for address [%s]", address);
2567 ev.state = (connected == TRUE) ?
2568 HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTED :
2569 HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED;
2571 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2574 ERR("HF event handler not registered");
2576 hf_event_cb(HAL_EV_HANDSFREE_AUDIO_STATE, &ev, sizeof(ev));
2579 /* HF(AG Role) Profile Events */
2580 static void __bt_hal_send_hf_connection_state_event(gboolean connected,
2581 const char *address)
2584 struct hal_ev_handsfree_conn_state ev;
2586 if (connected == TRUE)
2587 INFO("AG Profile Connected for address [%s]", address);
2589 INFO("AG Profile DisConnected for address [%s]", address);
2591 ev.state = (connected == TRUE) ?
2592 HAL_EV_HANDSFREE_CONN_STATE_CONNECTED :
2593 HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTED;
2595 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2598 ERR("HF event handler not registered");
2600 hf_event_cb(HAL_EV_HANDSFREE_CONN_STATE, &ev, sizeof(ev));
2603 /* HF(Client Role) Profile Events */
2604 static void __bt_hal_send_hf_client_connection_state_event(gboolean connected,
2605 const char *address)
2607 struct hal_ev_hf_client_conn_state ev;
2609 if (connected == TRUE)
2610 INFO("HF Client Profile Connected for address [%s]", address);
2612 INFO("HF Client Profile DisConnected for address [%s]", address);
2614 ev.state = (connected == TRUE) ?
2615 HAL_EV_HF_CLIENT_CONN_STATE_CONNECTED :
2616 HAL_EV_HF_CLIENT_CONN_STATE_DISCONNECTED;
2618 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2620 if (!hf_client_event_cb)
2621 ERR("HF Client event handler not registered");
2623 hf_client_event_cb(HAL_EV_HF_CLIENT_CONN_STATE, &ev, sizeof(ev));
2626 void _bt_hal_register_event_handler_cb(bt_hal_module_e module, handle_stack_msg cb)
2636 a2dp_sink_event_cb = cb;
2642 hf_client_event_cb = cb;
2645 avrcp_tg_event_cb = cb;
2647 case HAL_AVRCP_CTRL:
2648 avrcp_ctrl_event_cb = cb;
2654 ERR("Unknown module: %d", module);
2658 void _bt_hal_unregister_event_handler_cb(bt_hal_module_e module)
2662 hid_event_cb = NULL;
2668 a2dp_sink_event_cb = NULL;
2674 hf_client_event_cb = NULL;
2677 avrcp_tg_event_cb = NULL;
2679 case HAL_AVRCP_CTRL:
2680 avrcp_ctrl_event_cb = NULL;
2683 gatt_event_cb = NULL;
2686 ERR("Unknown module: %d", module);
2690 bool _bt_hal_get_adapter_request_state(void)
2692 return is_adapter_activating;
2695 bool _bt_hal_get_le_request_state(void)
2697 return is_le_activating;
2700 void _bt_hal_set_adapter_request_state(bool enable)
2702 DBG("set_adapter_request_state %d", enable);
2703 is_adapter_activating = enable;
2706 void _bt_hal_set_le_request_state(bool enable)
2708 DBG("set_le_request_state %d", enable);
2709 is_le_activating = enable;