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);
430 g_variant_unref(result);
433 /* Send LE discovering finished event */
434 size += __bt_insert_hal_properties(buf + size,
435 HAL_PROP_ADAPTER_LE_DISCOVERY_FINISHED, sizeof(gboolean), &is_le_discovering);
437 } else if (!g_strcmp0(key, "Modalias")) {
438 char *modalias = NULL;
439 g_variant_get(value, "s", &modalias);
440 DBG("##Adapter ModAlias [%s]", modalias);
441 } else if (!g_strcmp0(key, "SupportedLEFeatures")) {
442 DBG("##LE Supported features");
445 GVariantIter *iter = NULL;
446 g_variant_get(value, "as", &iter);
447 bt_local_le_features_t le_features;
448 gboolean le_features_present = FALSE;
453 memset(&le_features, 0x00, sizeof(le_features));
455 while (g_variant_iter_next(iter, "&s", &name) &&
456 g_variant_iter_next(iter, "&s", &val)) {
457 DBG("name = %s, Value = %s", name, val);
458 if (FALSE == _bt_hal_update_le_feature_support(name, val, &le_features))
459 ERR("Failed to update LE feature (name = %s, value = %s)", name, val);
461 le_features_present = TRUE;
464 g_variant_iter_free(iter);
465 if (le_features_present) {
466 size += __bt_insert_hal_properties(buf + size,
467 HAL_PROP_ADAPTER_LOCAL_LE_FEAT, sizeof(le_features), &le_features);
470 DBG("le supported features values are NOT provided by Stack");
472 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
473 g_variant_get(value, "b" , &ipsp_initialized);
474 DBG("##IPSP Initialized = %d", ipsp_initialized);
476 ERR("Unhandled Property:[%s]", key);
480 if (scan_mode_property_update) {
481 size += __bt_insert_hal_properties(buf + size,
482 HAL_PROP_ADAPTER_SCAN_MODE, sizeof(int), &scan_mode);
488 DBG("Send Adapter properties changed event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
489 event_cb(HAL_EV_ADAPTER_PROPS_CHANGED, buf, size);
495 static void __bt_hal_flight_ps_mode_cb(keynode_t *node, void *data)
497 gboolean flight_mode = FALSE;
499 DBG_SECURE("HAL callback hit");
500 DBG_SECURE("key=%s", vconf_keynode_get_name(node));
501 type = vconf_keynode_get_type(node);
502 if (type == VCONF_TYPE_BOOL) {
503 flight_mode = vconf_keynode_get_bool(node);
504 if (flight_mode != TRUE) {
505 ERR("Ignore the event");
508 ERR("Flight Mode == TRUE");
511 ERR("Invaild vconf key type : %d", type);
514 DBG("Enabling core now");
515 _bt_hal_enable_core();
518 static void _bt_hal_register_vconf_handler(void)
522 if (vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
523 (vconf_callback_fn)__bt_hal_flight_ps_mode_cb, NULL) < 0)
524 ERR("Unable to register key handler");
525 DBG("Telephony is disabled");
526 if (vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE,
527 (vconf_callback_fn)__bt_hal_flight_ps_mode_cb, NULL) < 0)
528 ERR("Unable to register key handler");
531 void _bt_hal_handle_adapter_event(GVariant *msg, const char *member)
538 if (strcasecmp(member, "DeviceCreated") == 0) {
539 DBG("DeviceCreated: Unhandled");
540 } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
541 DBG("InterfacesRemoved: Unhandled");
542 } else if (strcasecmp(member, "AdvertisingEnabled") == 0) {
543 DBG("AdvertisingEnabled");
544 DBG("Advertising Enabled");
546 gboolean status = FALSE;
547 g_variant_get(msg, "(ib)", &slot_id, &status);
548 DBG("Advertising Enabled : server_slot_id [%d] status [%d]", slot_id, status);
549 /* Send event to application */
550 _bt_hal_set_advertising_status(slot_id, status);
551 } else if (strcasecmp(member, "RssiEnabled") == 0) {
552 struct hal_ev_rssi_monitor_state_changed ev;
553 gboolean status = FALSE;
554 char *address = NULL;
557 g_variant_get(msg, "(sib)", &address, &link_type, &status);
558 DBG("RSSI monitoring %s for %s",
559 (status ? "Enabled" : "Disabled"), address);
561 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
562 ev.link_type = link_type;
563 ev.state = (status ? HAL_RSSI_MONITORING_ENABLED : HAL_RSSI_MONITORING_DISABLED);
565 ERR("event_cb is NULL");
567 event_cb(HAL_EV_RSSI_MONITOR_STATE_CHANGED, &ev, sizeof(ev));
570 } else if (strcasecmp(member, "RssiAlert") == 0) {
571 struct hal_ev_rssi_alert_recieved ev;
575 char *address = NULL;
577 g_variant_get(msg, "(siii)", &address, &link_type, &alert_type, &rssi_dbm);
578 DBG("RSSI Alert: [Address %s LinkType %d] [Type %d DBM %d]",
579 address, alert_type, rssi_dbm, link_type);
581 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
582 ev.link_type = link_type;
583 ev.alert_type = alert_type;
587 ERR("event_cb is NULL");
589 event_cb(HAL_EV_RSSI_ALERT_RECIEVED, &ev, sizeof(ev));
592 } else if (strcasecmp(member, "RawRssi") == 0) {
593 struct hal_ev_raw_rssi_recieved ev;
596 char *address = NULL;
598 g_variant_get(msg, "(sii)", &address, &link_type, &rssi_dbm);
599 DBG("Raw RSSI: [Address %s] [Link Type %d][RSSI DBM %d]",
600 address, link_type, rssi_dbm);
602 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
603 ev.link_type = link_type;
607 ERR("event_cb is NULL");
609 event_cb(HAL_EV_RAW_RSSI_RECIEVED, &ev, sizeof(ev));
612 } else if (strcasecmp(member, BT_HAL_HARDWARE_ERROR) == 0) {
613 DBG("BT Hardware Error: Unhandled");
614 } else if (strcasecmp(member, BT_HAL_TX_TIMEOUT_ERROR) == 0) {
615 DBG("BT TX Timeout Error: Unhandled");
621 static gboolean __bt_hal_parse_device_properties(GVariant *item)
631 /* Buffer and propety count management */
632 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
633 struct hal_ev_device_found *ev = (void *) buf;
635 memset(buf, 0, sizeof(buf));
639 g_variant_iter_init(&iter, item);
640 while (g_variant_iter_loop(&iter, "{sv}", &key, &val)) {
642 if (strcasecmp(key, "Address") == 0) {
644 char * address = NULL;
645 address = g_variant_dup_string(val, &len);
647 _bt_hal_convert_addr_string_to_type(bdaddr, address);
649 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
650 sizeof(bdaddr), bdaddr);
653 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
655 } else if (strcasecmp(key, "Class") == 0) {
656 unsigned int class = g_variant_get_uint32(val);
657 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
658 sizeof(unsigned int), &class);
660 DBG("Device class [%d] Property num [%d]", class, ev->num_props);
661 } else if (strcasecmp(key, "name") == 0) {
662 char *name = g_variant_dup_string(val, &len);
664 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
665 strlen(name) + 1, name);
667 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
670 } else if (strcasecmp(key, "Connected") == 0) {
671 unsigned int connected = g_variant_get_byte(val);
673 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
674 sizeof(unsigned int), &connected);
676 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
677 } else if (strcasecmp(key, "paired") == 0) {
678 uint8_t paired = (g_variant_get_boolean(val) ? 1 : 0);
679 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
680 sizeof(uint8_t), &paired);
682 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
683 } else if (strcasecmp(key, "Trusted") == 0) {
684 uint8_t trust = (g_variant_get_boolean(val) ? 1 : 0);
685 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
686 sizeof(uint8_t), &trust);
688 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
689 } else if (strcasecmp(key, "RSSI") == 0) {
690 int rssi = g_variant_get_int16(val);
691 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
694 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
695 } else if (strcasecmp(key, "LastAddrType") == 0) {
696 /* TODO: To be handled later*/
697 } else if (!g_strcmp0(key, "IsAliasSet")) {
698 uint8_t is_alias_set = (g_variant_get_boolean(val) ? 1 : 0);
699 DBG("IsAliasSet: %s", (is_alias_set ? "TRUE" : "FALSE"));
700 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
701 sizeof(uint8_t), &is_alias_set);
703 } else if (strcasecmp(key, "UUIDs") == 0) {
708 size1 = g_variant_get_size(val);
709 DBG("UUID count from size [%zu]\n", size1);
710 int num_props_tmp = ev->num_props;
713 uuid_value = (char **)g_variant_get_strv(val, &size1);
714 for (i = 0; uuid_value[i] != NULL; i++)
716 DBG("UUID count [%d]\n", uuid_count);
717 /* UUID collection */
718 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
720 for (i = 0; uuid_value[i] != NULL; i++) {
722 char *uuid_str = NULL;
723 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
724 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
726 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
727 uuid_str = g_strdup(uuid_value[i]);
728 DBG("UUID string [%s]\n", uuid_str);
729 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
730 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
734 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
735 (BT_HAL_STACK_UUID_SIZE * uuid_count),
737 ev->num_props = num_props_tmp + 1;
741 } else if (strcasecmp(key, "LegacyManufacturerDataLen") == 0) {
742 /* TODO: To be handled later*/
743 } else if (strcasecmp(key, "LegacyManufacturerData") == 0) {
744 /* TODO: To be handled later*/
746 ERR("Unhandled Property:[%s]", key);
752 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
753 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
759 static void __bt_hal_handle_avrcp_tg_events(GVariant *msg, const char *path)
762 GVariantIter value_iter;
763 char *property = NULL;
765 GVariant *val = NULL;
766 GVariant *child = NULL;
768 g_variant_iter_init(&value_iter, msg);
769 while ((child = g_variant_iter_next_value(&value_iter))) {
770 g_variant_get(child, "{sv}", &property, &val);
771 INFO("Property %s", property);
772 if (strcasecmp(property, "Connected") == 0) {
773 struct hal_ev_avrcp_tg_conn_state ev;
775 gboolean connected = FALSE;
777 g_variant_get(val, "b", &connected);
779 state = connected ? HAL_AVRCP_TG_STATE_CONNECTED :
780 HAL_AVRCP_TG_STATE_DISCONNECTED;
782 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
784 _bt_hal_convert_device_path_to_address(path, address);
786 DBG("connected: %d", connected);
787 DBG("address: %s", address);
789 /* Prepare to send AVRCP Target connection state event */
790 memset(&ev, 0, sizeof(ev));
791 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
793 if (!avrcp_tg_event_cb)
794 ERR("AVRCP target DBUS handler callback not registered");
796 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_CONN_STATE, (void *)&ev, sizeof(ev));
800 g_variant_unref(child);
801 g_variant_unref(val);
807 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path)
809 char *interface_name = NULL;
810 GVariant *val = NULL;
813 g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, &val, NULL);
815 if (!interface_name) {
816 DBG("Failed to get interface name");
819 g_variant_unref(val);
823 if (strcasecmp(interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
824 DBG("Event: Property Changed: Interface: BT_HAL_ADAPTER_INTERFACE");
825 __bt_hal_adapter_property_changed_event(val);
826 } else if (strcasecmp(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
827 DBG("Event: Property Changed: Interface: BT_HAL_DEVICE_INTERFACE");
828 __bt_hal_device_property_changed_event(val, object_path);
829 } else if (strcasecmp(interface_name, BT_HAL_OBEX_TRANSFER_INTERFACE) == 0) {
830 DBG("Event: Property Changed: Interface: BT_HAL_OBEX_TRANSFER_INTERFACE");
831 /* TODO: Handle event */
832 } else if (strcasecmp(interface_name, BT_HAL_MEDIA_CONTROL_INTERFACE) == 0) {
833 DBG("Event: Property Changed: Interface: BT_HAL_MEDIA_CONTROL_INTERFACE");
834 /* Handle AVRCP target event */
835 __bt_hal_handle_avrcp_tg_events(val, object_path);
836 } else if (strcasecmp(interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
837 DBG("Event: Property Changed: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
838 __bt_hal_handle_avrcp_ctrl_events(val, NULL, object_path);
839 } else if (strcasecmp(interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
840 DBG("Event: Property Changed: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
841 __bt_hal_handle_avrcp_transport_events(val, NULL, object_path);
842 } else if (strcasecmp(interface_name, BT_HAL_NETWORK_CLIENT_INTERFACE) == 0) {
843 DBG("Event: Property Changed: Interface: BT_HAL_NETWORK_CLIENT_INTERFACE");
844 /* TODO: Handle event */
845 } else if (strcasecmp(interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
846 DBG("Event: Property Changed: Interface: BT_HAL_GATT_CHAR_INTERFACE");
847 /* TODO: Handle event */
848 } else if (strcasecmp(interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
849 DBG("Event: Property Changed: Interface: BT_HAL_INPUT_INTERFACE");
850 __bt_hal_handle_input_event(val, object_path);
852 g_variant_unref(val);
855 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters)
859 if (__bt_hal_parse_interface(parameters) == FALSE) {
860 ERR("Fail to parse the properies");
861 g_variant_unref(value);
868 static void __bt_hal_send_hid_connection_state_event(
869 gboolean connected, char *address)
871 struct hal_ev_hidhost_conn_state ev;
873 ev.state = (connected == TRUE) ?
874 HAL_HIDHOST_STATE_CONNECTED :
875 HAL_HIDHOST_STATE_DISCONNECTED;
877 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
880 ERR("HID event handler not registered");
882 hid_event_cb(HAL_EV_HIDHOST_CONN_STATE, &ev, sizeof(ev));
885 static void __bt_hal_handle_input_event(GVariant *msg, const char *path)
887 gboolean property_flag = FALSE;
888 GVariantIter value_iter;
889 char *property = NULL;
890 GVariant *child = NULL, *val = NULL;
893 g_variant_iter_init(&value_iter, msg);
894 while ((child = g_variant_iter_next_value(&value_iter))) {
895 g_variant_get(child, "{sv}", &property, &val);
897 if (property == NULL)
900 if (strcasecmp(property, "Connected") == 0) {
903 g_variant_get(val, "b", &property_flag);
904 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
905 _bt_hal_convert_device_path_to_address(path, address);
906 __bt_hal_send_hid_connection_state_event(property_flag, address);
910 g_variant_unref(val);
911 g_variant_unref(child);
917 static gboolean __bt_hal_parse_interface(GVariant *msg)
920 GVariant *optional_param;
923 char *interface_name = NULL;
924 GVariant *inner_iter = NULL;
925 g_variant_get(msg, "(&o@a{sa{sv}})",
926 &path, &optional_param);
927 g_variant_iter_init(&iter, optional_param);
929 while ((child = g_variant_iter_next_value(&iter))) {
930 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
931 if (g_strcmp0(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
932 DBG("Found a device: %s", path);
933 if (__bt_hal_parse_device_properties(inner_iter) == FALSE) {
934 g_variant_unref(inner_iter);
935 g_variant_unref(child);
936 g_variant_unref(optional_param);
937 ERR("Fail to parse the properies");
940 g_variant_unref(inner_iter);
941 g_variant_unref(child);
942 g_variant_unref(optional_param);
946 g_variant_unref(inner_iter);
947 g_variant_unref(child);
950 g_variant_unref(optional_param);
955 void __bt_hal_handle_gatt_char_event(GVariant *parameters, const char *signal_name)
959 if (signal_name == NULL)
962 if (strcasecmp(signal_name, "GattValueChanged") == 0) {
963 DBG("GattValueChanged event received");
966 const char *char_handle = NULL;
967 GVariant *char_value_var = NULL;
969 char *char_value = NULL;
971 g_variant_get(parameters, "(i&s@ay)", &result, &char_handle, &char_value_var);
972 DBG("char handle: %s", char_handle);
974 len = g_variant_get_size(char_value_var);
976 char_value = (char *)g_variant_get_data(char_value_var);
978 _bt_hal_handle_gattc_value_changed_event(result, char_handle, char_value, len);
980 g_variant_unref(char_value_var);
985 static gboolean __bt_hal_event_manager(gpointer data)
987 bt_hal_event_type_t bt_event = 0x00;
989 char *obj_path = NULL;
991 bt_hal_main_event_data_t *param = (bt_hal_main_event_data_t*)data;
992 if (strcasecmp(param->signal_name, "InterfacesAdded") == 0) {
994 /*TODO: Handle Interfaces Added Signal from stack */
995 DBG("Manager Event: Signal Name: InterfacesAdded");
997 g_variant_get(param->parameters, "(&o@a{sa{sv}})", &obj_path, &value);
999 if (obj_path == NULL) {
1000 DBG("obj_path is NULL");
1004 if (strcasecmp(obj_path, BT_HAL_BLUEZ_HCI_PATH) == 0) {
1005 /* TODO: Handle adapter added */
1006 DBG("Manager Event: Signal Name: InterfiacesAdded: Adapter added in bluetoothd: path [hci0]");
1008 bt_event = __bt_hal_parse_event(value);
1009 if (bt_event == BT_HAL_DEVICE_EVENT) {
1010 DBG("Device path : %s ", obj_path);
1011 __bt_hal_handle_device_event(value, param->parameters);
1012 } else if (bt_event == BT_HAL_AVRCP_CONTROL_EVENT) {
1013 DBG("Device path : %s ", obj_path);
1014 _bt_hal_set_control_device_path(obj_path);
1017 g_variant_unref(value);
1019 } else if (strcasecmp(param->signal_name, "InterfacesRemoved") == 0) {
1023 /*TODO: Handle Interfaces Removed Signal from stack */
1024 DBG("Manager Event: Signal Name: InterfacesRemoved");
1026 g_variant_get(param->parameters, "(&oas)", &obj_path, &iter);
1027 DBG("Device path : %s ", obj_path);
1028 while (g_variant_iter_loop(iter, "s", &str)) {
1029 if (g_strcmp0(str, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0)
1030 _bt_hal_remove_control_device_path(obj_path);
1032 g_variant_iter_free(iter);
1033 } else if (strcasecmp(param->signal_name, "NameOwnerChanged") == 0) {
1035 char *previous = NULL;
1036 char *current = NULL;
1038 if (g_strcmp0(g_variant_get_type_string(param->parameters), "(sss)") != 0) {
1039 ERR("Invalid variant format");
1043 /* TODO: Handle Name Owener changed Signal */
1044 if (__bt_hal_get_owner_info(param->parameters, &name, &previous, ¤t)) {
1045 DBG("Fail to get the owner info");
1049 if (*current != '\0')
1055 if (strcasecmp(name, BT_HAL_BLUEZ_NAME) == 0) {
1056 DBG("Bluetoothd is terminated");
1058 /* TODO: Handle Bluetoothd terminating scenario */
1059 _bt_hal_le_deinit();
1061 INFO("Name Owner changed [%s]", name);
1062 } else if (g_strcmp0(param->interface_name, BT_HAL_PROPERTIES_INTERFACE) == 0) {
1063 DBG("Manager Event: Interface Name: BT_HAL_PROPERTIES_INTERFACE");
1064 __bt_hal_handle_property_changed_event(param->parameters, param->object_path);
1065 } else if (g_strcmp0(param->interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
1066 DBG("Manager Event: Interface Name: BT_HAL_ADAPTER_INTERFACE");
1067 _bt_hal_handle_adapter_event(param->parameters, param->signal_name);
1068 } else if (g_strcmp0(param->interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
1069 DBG("Manager Event: Interface Name: BT_HAL_INPUT_INTERFACE");
1070 __bt_hal_handle_input_event(param->parameters, param->object_path);
1071 } else if (g_strcmp0(param->interface_name, BT_HAL_NETWORK_SERVER_INTERFACE) == 0) {
1072 /* TODO: Handle Network Server events from stack */
1073 DBG("Manager Event: Interface Name: BT_HAL_NETWORK_SERVER_INTERFACE");
1074 } else if (g_strcmp0(param->interface_name, BT_HAL_HEADSET_INTERFACE) == 0) {
1075 DBG("Manager Event: Interface Name: BT_HAL_HEADSET_INTERFACE");
1076 __bt_hal_handle_headset_events(param->parameters, param->signal_name, param->object_path);
1077 } else if (g_strcmp0(param->interface_name, BT_HAL_SINK_INTERFACE) == 0) {
1078 /* TODO: Handle Sink interface events from stack */
1079 DBG("Manager Event: Interface Name:BT_HAL_SINK_INTERFACE");
1080 } else if (g_strcmp0(param->interface_name, BT_HAL_AGENT_INTERFACE) == 0) {
1081 /* TODO: Handle Agent events from stack */
1082 DBG("Manager Event: Interface Name:BT_HAL_AGENT_INTERFACE");
1083 } else if (g_strcmp0(param->interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
1084 DBG("Manager Event: Interface Name:BT_HAL_DEVICE_INTERFACE");
1085 __bt_hal_handle_device_specific_events(param->parameters, param->signal_name, param->object_path);
1086 } else if (g_strcmp0(param->interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
1087 DBG("Manager Event: Interface Name: BT_HAL_PLAYER_CONTROL_INTERFACE");
1088 __bt_hal_handle_avrcp_ctrl_events(param->parameters, param->signal_name, param->object_path);
1089 } else if (g_strcmp0(param->interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
1090 DBG("Manager Event: Interface Name: BT_HAL_MEDIATRANSPORT_INTERFACE");
1091 __bt_hal_handle_avrcp_transport_events(param->parameters, param->signal_name, param->object_path);
1092 } else if (g_strcmp0(param->interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
1093 DBG("Manager Event: Interface Name: BT_HAL_GATT_CHAR_INTERFACE");
1094 __bt_hal_handle_gatt_char_event(param->parameters, param->signal_name);
1099 g_free(param->sender_name);
1100 g_free(param->object_path);
1101 g_free(param->interface_name);
1102 g_free(param->signal_name);
1103 g_variant_unref(param->parameters);
1108 static void __bt_hal_manager_event_filter(GDBusConnection *connection,
1109 const gchar *sender_name,
1110 const gchar *object_path,
1111 const gchar *interface_name,
1112 const gchar *signal_name,
1113 GVariant *parameters,
1116 if (signal_name == NULL)
1119 bt_hal_main_event_data_t *param = g_new0(bt_hal_main_event_data_t, 1);
1120 param->sender_name = g_strdup(sender_name);
1121 param->object_path = g_strdup(object_path);
1122 param->interface_name = g_strdup(interface_name);
1123 param->signal_name = g_strdup(signal_name);
1124 param->parameters = g_variant_ref(parameters);
1126 g_idle_add(__bt_hal_event_manager, (gpointer)param);
1130 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path)
1132 gboolean property_flag = FALSE;
1133 char *property = NULL;
1134 GVariant *value = NULL;
1135 g_variant_get(msg, "(sv)", &property, &value);
1137 if (property == NULL)
1140 DBG("Property = %s \n", property);
1141 /* We allow only 1 headset connection (HSP or HFP)*/
1142 if (strcasecmp(property, "Connected") == 0) {
1144 g_variant_get(value, "b", &property_flag);
1146 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1148 /* Fix : NULL_RETURNS */
1149 if (address == NULL)
1152 _bt_hal_convert_device_path_to_address(path, address);
1153 __bt_hal_send_hf_audio_connection_state_event(property_flag, address);
1155 } else if (strcasecmp(property, "State") == 0) {
1158 g_variant_get(value, "s", &state);
1160 /* This code assumes we support only 1 headset connection */
1161 /* Need to use the headset list, if we support multi-headsets */
1162 if (strcasecmp(state, "Playing") == 0) {
1163 DBG("Playing: Sco Connected");
1164 } else if (strcasecmp(state, "connected") == 0 ||
1165 strcasecmp(state, "disconnected") == 0) {
1166 if (strcasecmp(state, "connected") == 0)
1167 DBG("Sco Connected");
1169 DBG("Sco Disconnected");
1171 ERR("Not handled state - %s", state);
1176 } else if (strcasecmp(property, "SpeakerGain") == 0) {
1179 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1181 _bt_hal_convert_device_path_to_address(path, address);
1182 INFO("Speaker Gain for address [%s]", address);
1183 /* TODO Handle event sending to HAL */
1186 } else if (strcasecmp(property, "MicrophoneGain") == 0) {
1189 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1191 _bt_hal_convert_device_path_to_address(path, address);
1192 INFO("Microphone Gain for address [%s]", address);
1193 /* TODO Handle event sending to HAL */
1200 g_variant_unref(value);
1203 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn,
1209 static int subs_interface_added_id = -1;
1210 static int subs_interface_removed_id = -1;
1211 static int subs_name_owner_id = -1;
1212 static int subs_property_id = -1;
1213 static int subs_adapter_id = -1;
1218 if (subs_interface_added_id == -1) {
1219 subs_interface_added_id = g_dbus_connection_signal_subscribe(conn,
1220 NULL, BT_HAL_MANAGER_INTERFACE,
1221 BT_HAL_INTERFACES_ADDED, NULL, NULL, 0,
1222 __bt_hal_manager_event_filter,
1225 if (subs_interface_removed_id == -1) {
1226 subs_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
1227 NULL, BT_HAL_MANAGER_INTERFACE,
1228 BT_HAL_INTERFACES_REMOVED, NULL, NULL, 0,
1229 __bt_hal_manager_event_filter,
1232 if (subs_name_owner_id == -1) {
1233 subs_name_owner_id = g_dbus_connection_signal_subscribe(conn,
1234 NULL, BT_HAL_FREEDESKTOP_INTERFACE,
1235 BT_HAL_NAME_OWNER_CHANGED, NULL, NULL, 0,
1236 __bt_hal_manager_event_filter,
1239 if (subs_property_id == -1) {
1240 subs_property_id = g_dbus_connection_signal_subscribe(conn,
1241 NULL, BT_HAL_PROPERTIES_INTERFACE,
1242 BT_HAL_PROPERTIES_CHANGED, NULL, NULL, 0,
1243 __bt_hal_manager_event_filter,
1246 if (subs_adapter_id == -1) {
1247 subs_adapter_id = g_dbus_connection_signal_subscribe(conn,
1248 NULL, BT_HAL_ADAPTER_INTERFACE,
1249 NULL, NULL, NULL, 0,
1250 __bt_hal_manager_event_filter,
1254 if (subs_interface_added_id != -1) {
1255 g_dbus_connection_signal_unsubscribe(conn,
1256 subs_interface_added_id);
1257 subs_interface_added_id = -1;
1259 if (subs_interface_removed_id != -1) {
1260 g_dbus_connection_signal_unsubscribe(conn,
1261 subs_interface_removed_id);
1262 subs_interface_removed_id = -1;
1264 if (subs_name_owner_id != -1) {
1265 g_dbus_connection_signal_unsubscribe(conn,
1266 subs_name_owner_id);
1267 subs_name_owner_id = -1;
1269 if (subs_property_id != -1) {
1270 g_dbus_connection_signal_unsubscribe(conn,
1272 subs_property_id = -1;
1274 if (subs_adapter_id == -1) {
1275 g_dbus_connection_signal_unsubscribe(conn, subs_adapter_id);
1276 subs_adapter_id = -1;
1284 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn,
1287 static int subs_device_id = -1;
1294 if (subs_device_id == -1) {
1295 subs_device_id = g_dbus_connection_signal_subscribe(conn,
1296 NULL, BT_HAL_DEVICE_INTERFACE,
1297 NULL, NULL, NULL, 0,
1298 __bt_hal_manager_event_filter,
1302 if (subs_device_id != -1) {
1303 g_dbus_connection_signal_unsubscribe(conn,
1305 subs_device_id = -1;
1313 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe)
1315 static int subs_input_id = -1;
1323 if (subs_input_id == -1) {
1324 subs_input_id = g_dbus_connection_signal_subscribe(conn,
1325 NULL, BT_HAL_INPUT_INTERFACE,
1326 NULL, NULL, NULL, 0,
1327 __bt_hal_manager_event_filter,
1331 if (subs_input_id != -1) {
1332 g_dbus_connection_signal_unsubscribe(conn,
1343 static int __bt_hal_register_gatt_subscribe_signal(GDBusConnection *conn,
1346 static int subs_gatt_id = -1;
1351 if (subs_gatt_id == -1) {
1352 subs_gatt_id = g_dbus_connection_signal_subscribe(conn,
1353 NULL, BT_HAL_GATT_CHAR_INTERFACE,
1354 NULL, NULL, NULL, 0,
1355 __bt_hal_manager_event_filter,
1359 if (subs_gatt_id == -1) {
1360 g_dbus_connection_signal_unsubscribe(conn,
1366 return BT_HAL_ERROR_NONE;
1371 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type)
1376 return BT_HAL_ERROR_INTERNAL;
1378 /* TODO: Add more events in subsequent patches */
1379 switch (event_type) {
1380 case BT_HAL_MANAGER_EVENT:
1381 __bt_hal_register_manager_subscribe_signal(g_conn, TRUE);
1383 case BT_HAL_DEVICE_EVENT:
1384 __bt_hal_register_device_subscribe_signal(g_conn, TRUE);
1386 case BT_HAL_HID_EVENT:
1387 __bt_hal_register_input_subscribe_signal(g_conn, TRUE);
1389 case BT_HAL_HEADSET_EVENT:
1390 __bt_hal_register_audio_subscribe_signal(g_conn, TRUE);
1392 case BT_HAL_GATT_EVENT:
1393 __bt_hal_register_gatt_subscribe_signal(g_conn, TRUE);
1396 INFO_C("Register Event: event_type [%d]", event_type);
1397 return BT_HAL_ERROR_NOT_SUPPORT;
1400 return BT_HAL_ERROR_NONE;
1403 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn,
1409 static int subs_headset_id = -1;
1410 static int subs_sink_id = -1;
1413 if (subs_headset_id == -1) {
1414 subs_headset_id = g_dbus_connection_signal_subscribe(conn,
1415 NULL, BT_HAL_HEADSET_INTERFACE,
1416 NULL, NULL, NULL, 0,
1417 __bt_hal_manager_event_filter,
1420 if (subs_sink_id == -1) {
1421 subs_sink_id = g_dbus_connection_signal_subscribe(conn,
1422 NULL, BT_HAL_SINK_INTERFACE,
1423 NULL, NULL, NULL, 0,
1424 __bt_hal_manager_event_filter,
1428 if (subs_headset_id != -1) {
1429 g_dbus_connection_signal_unsubscribe(conn,
1431 subs_headset_id = -1;
1433 if (subs_sink_id != -1) {
1434 g_dbus_connection_signal_unsubscribe(conn,
1442 static int __bt_hal_initialize_manager_receiver(void)
1446 GError *error = NULL;
1448 if (manager_conn == NULL) {
1449 manager_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1450 if (error != NULL) {
1451 ERR_C("ERROR: Can't get on system bus [%s]", error->message);
1452 g_clear_error(&error);
1454 if (manager_conn == NULL)
1458 if (__bt_hal_register_service_event(manager_conn,
1459 BT_HAL_MANAGER_EVENT) != BT_HAL_ERROR_NONE)
1461 if (__bt_hal_register_service_event(manager_conn,
1462 BT_HAL_DEVICE_EVENT) != BT_HAL_ERROR_NONE)
1464 if (__bt_hal_register_service_event(manager_conn,
1465 BT_HAL_HID_EVENT) != BT_HAL_ERROR_NONE)
1467 if (__bt_hal_register_service_event(manager_conn,
1468 BT_HAL_HEADSET_EVENT) != BT_HAL_ERROR_NONE)
1470 if (__bt_hal_register_service_event(manager_conn,
1471 BT_HAL_GATT_EVENT) != BT_HAL_ERROR_NONE)
1473 return BT_HAL_ERROR_NONE;
1476 g_object_unref(manager_conn);
1477 manager_conn = NULL;
1482 return BT_HAL_ERROR_INTERNAL;
1485 /* To receive the event from bluez */
1486 int _bt_hal_initialize_event_receiver(handle_stack_msg cb)
1492 return BT_HAL_ERROR_INVALID_PARAM;
1494 result = __bt_hal_initialize_manager_receiver();
1496 DBG("Manager event receiver initialization result [%d]", result);
1497 if (result != BT_HAL_ERROR_NONE)
1500 /*TODO: Initialize Obexd Event receiver */
1502 /* Initialize event receiver for flight mode */
1503 _bt_hal_register_vconf_handler();
1508 return BT_HAL_ERROR_NONE;
1511 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path)
1513 GVariantIter value_iter;
1514 GVariant *value = NULL;
1516 g_variant_iter_init(&value_iter, msg);
1519 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
1520 if (!g_strcmp0(key, "Connected")) {
1521 guint connected = 0;
1522 g_variant_get(value, "i", &connected);
1523 DBG("Device property changed : Connected [%d]", connected);
1524 } else if (!g_strcmp0(key, "RSSI")) {
1525 DBG("Device property changed : RSSI");
1526 __bt_hal_dbus_device_found_properties(path);
1527 } else if (!g_strcmp0(key, "GattConnected")) {
1528 DBG("Device property changed : GattConnected");
1529 gboolean gatt_connected = FALSE;
1530 g_variant_get(value, "b", &gatt_connected);
1531 char *address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1532 _bt_hal_convert_device_path_to_address(path, address);
1533 DBG("@@gatt_connected: %d", gatt_connected);
1534 DBG("@@address: %s", address);
1535 if (_bt_hal_check_gattc_is_existing(address) == TRUE) {
1536 DBG("GattConnected event will be handled on CLIENT side");
1537 _bt_hal_handle_gattc_connected_event(address, gatt_connected);
1539 DBG("GattConnected event will be handled on SERVER side");
1540 _bt_hal_gatt_connected_state_event(gatt_connected, address);
1543 } else if (!g_strcmp0(key, "Paired")) {
1544 gboolean paired = FALSE;
1545 struct hal_ev_bond_state_changed ev;
1546 char address[BT_HAL_ADDRESS_STRING_SIZE];
1548 g_variant_get(value, "b", &paired);
1549 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1551 _bt_hal_agent_set_canceled(FALSE);
1552 _bt_hal_convert_device_path_to_address(path, address);
1554 /* Prepare to send event to HAL bluetooth */
1555 ev.status = BT_STATUS_SUCCESS;
1556 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1557 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1560 ERR("Bluetooth HAL event handler not registered");
1562 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
1563 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1565 } else if (!g_strcmp0(key, "LegacyPaired")) {
1566 DBG("Device property changed : LegacyPaired");
1567 } else if (!g_strcmp0(key, "Trusted")) {
1568 DBG("Device property changed : Trusted");
1569 gboolean trusted = FALSE;
1570 gchar *address = NULL;
1571 g_variant_get(value, "b", &trusted);
1572 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1574 _bt_hal_convert_device_path_to_address(path, address);
1575 DBG("Device [%s] trusted: [%d]", address, trusted);
1577 __bt_hal_send_device_trust_state_event(trusted, address);
1579 } else if (!g_strcmp0(key, "IpspConnected")) {
1580 DBG("Device property changed : IpspConnected");
1581 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
1582 DBG("Device property changed : IpspInitStateChanged");
1583 } else if (!g_strcmp0(key, "TrustedProfiles")) {
1585 char address[BT_HAL_ADDRESS_STRING_SIZE];
1587 g_variant_get(value, "u", &trust_val);
1588 _bt_hal_convert_device_path_to_address(path, address);
1589 DBG("Address: %s, TrustedProfiles: 0x%X", address, trust_val);
1590 __bt_hal_send_device_trusted_profile_changed_event(trust_val, address);
1592 ERR("Unhandled Property:[%s]", key);
1598 static void __bt_hal_dbus_device_found_properties(const char *device_path)
1601 GError *error = NULL;
1602 GDBusProxy *device_proxy;
1603 GDBusConnection *conn;
1608 ERR("Invalid device path");
1612 conn = _bt_hal_get_system_gconn();
1614 ERR("_bt_hal_get_system_gconn failed");
1618 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1622 BT_HAL_PROPERTIES_INTERFACE,
1625 if (!device_proxy) {
1626 ERR("Error creating device_proxy");
1630 result = g_dbus_proxy_call_sync(device_proxy,
1632 g_variant_new("(s)", BT_HAL_DEVICE_INTERFACE),
1633 G_DBUS_CALL_FLAGS_NONE,
1638 ERR("Error occured in Proxy call");
1639 if (error != NULL) {
1640 ERR("Error occured in Proxy call (Error: %s)", error->message);
1641 g_clear_error(&error);
1643 g_object_unref(device_proxy);
1647 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1648 _bt_hal_convert_device_path_to_address(device_path, address);
1650 __bt_hal_device_properties_lookup(result, address);
1652 g_object_unref(device_proxy);
1658 static void __bt_hal_device_properties_lookup(GVariant *result, char *address)
1660 /* Buffer and propety count management */
1661 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
1662 struct hal_ev_device_found *ev = (void *) buf;
1664 memset(buf, 0, sizeof(buf));
1668 GVariant *tmp_value;
1671 gchar *manufacturer_data = NULL;
1674 if (result != NULL) {
1675 g_variant_get(result , "(@a{sv})", &value);
1676 g_variant_unref(result);
1679 tmp_value = g_variant_lookup_value(value, "Alias", G_VARIANT_TYPE_STRING);
1681 g_variant_get(tmp_value, "s", &name);
1683 g_variant_unref(tmp_value);
1685 DBG_SECURE("Alias Name [%s]", name);
1686 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1687 strlen(name) + 1, name);
1689 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1692 tmp_value = g_variant_lookup_value(value, "Name", G_VARIANT_TYPE_STRING);
1693 g_variant_get(tmp_value, "s", &name);
1694 g_variant_unref(tmp_value);
1696 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1697 strlen(name) + 1, name);
1699 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1700 g_variant_get(tmp_value, "s", &name);
1704 tmp_value = g_variant_lookup_value(value, "Class", G_VARIANT_TYPE_UINT32);
1705 unsigned int class = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1706 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
1707 sizeof(unsigned int), &class);
1710 g_variant_unref(tmp_value);
1714 tmp_value = g_variant_lookup_value(value, "Connected", G_VARIANT_TYPE_BOOLEAN);
1715 unsigned int connected = tmp_value ? g_variant_get_boolean(tmp_value) : 0;
1716 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
1717 sizeof(unsigned int), &connected);
1719 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
1721 g_variant_unref(tmp_value);
1724 tmp_value = g_variant_lookup_value(value, "Trusted", G_VARIANT_TYPE_BOOLEAN);
1725 uint8_t trust = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1726 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
1727 sizeof(uint8_t), &trust);
1729 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
1731 g_variant_unref(tmp_value);
1734 tmp_value = g_variant_lookup_value(value, "Paired", G_VARIANT_TYPE_BOOLEAN);
1735 uint8_t paired = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1737 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
1738 sizeof(uint8_t), &paired);
1740 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
1742 g_variant_unref(tmp_value);
1745 tmp_value = g_variant_lookup_value(value, "RSSI", G_VARIANT_TYPE_INT32);
1746 int rssi = tmp_value ? g_variant_get_int32(tmp_value) : 0;
1747 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
1748 sizeof(int), &rssi);
1750 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
1752 g_variant_unref(tmp_value);
1754 /* Last Addr Type */
1755 tmp_value = g_variant_lookup_value(value, "LastAddrType", G_VARIANT_TYPE_UINT32);
1756 unsigned int addr_type = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1758 g_variant_unref(tmp_value);
1759 DBG("Device Last Address Type [0x%x]", addr_type);
1762 tmp_value = g_variant_lookup_value(value, "IsAliasSet", G_VARIANT_TYPE_UINT32);
1763 uint8_t is_alias_set = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1764 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
1765 sizeof(uint8_t), &is_alias_set);
1767 DBG("IsAliasSet: [%s], Property num [%d]", (is_alias_set ? "TRUE" : "FALSE"), ev->num_props);
1769 g_variant_unref(tmp_value);
1772 tmp_value = g_variant_lookup_value(value, "UUIDs", G_VARIANT_TYPE_STRING_ARRAY);
1773 gsize uuid_count = g_variant_get_size(tmp_value);
1774 char **uuid_value = g_variant_dup_strv(tmp_value, &uuid_count);
1776 /* UUID collection */
1781 int num_props_tmp = ev->num_props;
1783 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
1785 for (i = 0; uuid_value[i] != NULL; i++) {
1787 char *uuid_str = NULL;
1788 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
1789 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
1791 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
1792 uuid_str = g_strdup(uuid_value[i]);
1793 DBG("UUID string [%s]\n", uuid_str);
1795 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
1797 for (z = 0; z < 16; z++)
1798 DBG("[0x%x]", uuid[z]);
1801 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
1805 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
1806 (BT_HAL_STACK_UUID_SIZE * uuid_count),
1808 ev->num_props = num_props_tmp + 1;
1811 g_variant_unref(tmp_value);
1813 /* LegacyManufacturerDataLen */
1814 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerDataLen", G_VARIANT_TYPE_UINT32);
1815 unsigned int manufacturer_data_len = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1816 if (manufacturer_data_len > BT_HAL_MANUFACTURER_DATA_LENGTH_MAX) {
1817 ERR("manufacturer_data_len is too long(len = %d)", manufacturer_data_len);
1818 manufacturer_data_len = BT_HAL_MANUFACTURER_DATA_LENGTH_MAX;
1821 g_variant_unref(tmp_value);
1822 /*size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA_LEN,
1823 sizeof(unsigned int), &manufacturer_data_len);
1825 DBG("Device Legacy Manufacturer data length [%u]", manufacturer_data_len);
1827 /* ManufacturerData */
1828 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerData", G_VARIANT_TYPE_BYTESTRING);
1829 manufacturer_data = value ? (gchar *)g_variant_get_bytestring(tmp_value) : NULL;
1830 if (manufacturer_data) {
1831 if (manufacturer_data_len > 0) {
1832 //size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA,
1833 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_BLE_ADV_DATA,
1834 manufacturer_data_len, manufacturer_data);
1839 g_variant_unref(tmp_value);
1843 _bt_hal_convert_addr_string_to_type(bdaddr, address);
1844 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
1845 sizeof(bdaddr), bdaddr);
1847 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
1850 g_variant_unref(value);
1852 ERR("result is NULL\n");
1855 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
1856 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
1861 static void __bt_hal_send_device_acl_connection_state_event(int status, gboolean connected, const char *address)
1864 struct hal_ev_acl_state_changed ev;
1867 ev.state = (connected == TRUE) ?
1868 HAL_ACL_STATE_CONNECTED :
1869 HAL_ACL_STATE_DISCONNECTED;
1871 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1874 ERR("Bluetooth HAL event handler not registered");
1876 event_cb(HAL_EV_ACL_STATE_CHANGED, &ev, sizeof(ev));
1880 static void __bt_hal_send_device_le_connection_state_event(int status, gboolean connected, const char *address)
1883 struct hal_ev_le_conn_state_changed ev;
1886 ev.state = (connected == TRUE) ?
1887 HAL_LE_STATE_CONNECTED :
1888 HAL_LE_STATE_DISCONNECTED;
1890 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1893 ERR("Bluetooth HAL event handler not registered");
1895 event_cb(HAL_EV_LE_CONN_STATE_CHANGED, &ev, sizeof(ev));
1899 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted,
1900 const char *address)
1902 struct hal_ev_device_trust_state_changed ev;
1905 ev.trust = (is_trusted == TRUE) ?
1906 HAL_DEVICE_TRUSTED :
1907 HAL_DEVICE_UNTRUSTED;
1909 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1912 ERR("Bluetooth HAL event handler not registered");
1914 event_cb(HAL_EV_DEVICE_TRUST_CHANGED, &ev, sizeof(ev));
1918 static void __bt_hal_send_device_trusted_profile_changed_event(
1919 uint32_t trust_val, const char *address)
1921 struct hal_ev_device_trusted_profiles_changed ev;
1924 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1925 ev.trust_val = trust_val;
1928 ERR("Bluetooth HAL event handler not registered");
1930 event_cb(HAL_EV_DEVICE_TRUSTED_PROFILES_CHANGED, &ev, sizeof(ev));
1934 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member,
1938 const char *property = NULL;
1942 if (strcasecmp(member, "PropertyChanged") == 0) {
1943 g_variant_get(msg, "(s)", &property);
1944 if (property == NULL)
1946 if (strcasecmp(property, "GattConnected") == 0) {
1947 INFO("GATT Connected");
1948 gboolean connected = FALSE;
1950 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1952 _bt_hal_convert_device_path_to_address(path, address);
1953 g_variant_get(msg, "(b)", &connected);
1955 INFO("Connected device address[%s] connnected[%d]", address, connected);
1957 } else if (strcasecmp(property, "Paired") == 0) {
1958 gboolean paired = FALSE;
1959 struct hal_ev_bond_state_changed ev;
1960 char address[BT_HAL_ADDRESS_STRING_SIZE];
1962 g_variant_get(msg, "(b)", &paired);
1963 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1965 _bt_hal_agent_set_canceled(FALSE);
1966 _bt_hal_convert_device_path_to_address(path, address);
1968 /* Prepare to send event to HAL bluetooth */
1969 ev.status = BT_STATUS_SUCCESS;
1970 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1971 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1974 ERR("Bluetooth HAL event handler not registered");
1976 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
1977 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1979 } else if (strcasecmp(property, "UUIDs") == 0) {
1982 } else if (strcasecmp(member, "DeviceConnected") == 0) {
1983 unsigned char addr_type = 0;
1985 g_variant_get(msg, "(y)", &addr_type);
1987 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1988 _bt_hal_convert_device_path_to_address(path, address);
1990 DBG("Member: [%s]", member);
1991 ERR_C("Connected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
1993 __bt_hal_send_device_acl_connection_state_event(BT_STATUS_SUCCESS, TRUE, address);
1995 __bt_hal_send_device_le_connection_state_event(BT_STATUS_SUCCESS, TRUE, address);
1997 } else if (strcasecmp(member, "Disconnected") == 0) {
1998 unsigned char disc_reason = 0;
1999 unsigned char addr_type = 0;
2002 g_variant_get(msg, "(yy&s)", &addr_type, &disc_reason, &name);
2004 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2005 _bt_hal_convert_device_path_to_address(path, address);
2007 DBG("Member: [%s]", member);
2009 ERR_C("DisConnected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
2010 DBG("Disconnected Reason [%d : %s]", disc_reason, _bt_hal_convert_disc_reason_to_string(disc_reason));
2011 DBG("Name: %s", name);
2013 __bt_hal_send_device_acl_connection_state_event(_bt_hal_convert_disc_reason_to_status(disc_reason), FALSE, address);
2015 __bt_hal_send_device_le_connection_state_event(_bt_hal_convert_disc_reason_to_status(disc_reason), FALSE, address);
2017 } else if (strcasecmp(member, "ProfileStateChanged") == 0) {
2019 char *profile_uuid = NULL;
2021 g_variant_get(msg, "(si)", &profile_uuid, &state);
2022 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2023 _bt_hal_convert_device_path_to_address(path, address);
2025 DBG("Address: %s", address);
2026 DBG("Profile UUID: %s", profile_uuid);
2027 DBG("State: %d", state);
2028 if (strncmp(profile_uuid, HID_UUID, strlen(HID_UUID)) == 0) {
2029 if (state == BT_HAL_PROFILE_STATE_CONNECTED)
2030 __bt_hal_send_hid_connection_state_event(TRUE, address);
2031 else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED)
2032 __bt_hal_send_hid_connection_state_event(FALSE, address);
2034 DBG("Profile state: %d", state);
2036 } else if ((strncmp(profile_uuid, A2DP_SINK_UUID, strlen(A2DP_SINK_UUID)) == 0)) {
2037 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2038 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTED");
2039 __bt_hal_send_av_connection_state_event(TRUE, address);
2040 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2041 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2042 __bt_hal_send_av_connection_state_event(FALSE, address);
2043 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2044 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2045 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2046 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTING");
2048 ERR("A2DP Profile state: Invalid");
2050 } else if ((strncmp(profile_uuid, A2DP_SOURCE_UUID, strlen(A2DP_SOURCE_UUID)) == 0)) {
2051 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2052 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
2053 __bt_hal_send_a2dp_sink_connection_state_event(TRUE, address);
2054 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2055 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
2056 __bt_hal_send_a2dp_sink_connection_state_event(FALSE, address);
2057 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2058 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
2059 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2060 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
2062 } else if (strcmp(profile_uuid, HFP_HF_UUID) == 0) {
2063 if (state == BT_HAL_PROFILE_STATE_CONNECTING)
2064 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTING");
2065 else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2066 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTED");
2067 __bt_hal_send_hf_connection_state_event(TRUE, address);
2068 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2069 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2070 __bt_hal_send_hf_connection_state_event(FALSE, address);
2071 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2072 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2074 ERR("HFP Profile state: Invalid");
2076 } else if (strncmp(profile_uuid, HFP_AG_UUID, strlen(HFP_AG_UUID)) == 0) {
2077 if (state == BT_HAL_PROFILE_STATE_CONNECTING)
2078 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_CONNECTING");
2079 else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2080 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_CONNECTED");
2081 __bt_hal_send_hf_client_connection_state_event(TRUE, address);
2082 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2083 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2084 __bt_hal_send_hf_client_connection_state_event(FALSE, address);
2085 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2086 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2088 ERR("HFP Client Profile state: Invalid");
2090 } else if ((strncmp(profile_uuid, AVRCP_TARGET_UUID, strlen(AVRCP_TARGET_UUID)) == 0)) {
2091 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2092 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
2093 __bt_hal_send_avrcp_ctrl_connection_state_event(TRUE, address);
2094 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2095 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
2096 __bt_hal_send_avrcp_ctrl_connection_state_event(FALSE, address);
2097 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2098 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
2099 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2100 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
2103 DBG("Profile[%s] State changed status [%d] ", profile_uuid, state);
2106 g_free(profile_uuid);
2107 } else if (strcasecmp(member, "AttMtuChanged") == 0) {
2111 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2113 DBG("Member: [%s]", member);
2115 _bt_hal_convert_device_path_to_address(path, address);
2116 g_variant_get(msg, "(q)", &mtu);
2118 __bt_hal_handle_gatts_mtu_changed_event(address, mtu);
2121 } else if (strcasecmp(member, "AdvReport") == 0) {
2122 DBG("Member: [%s]", member);
2123 __bt_hal_handle_adv_report(msg, path);
2127 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path)
2129 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
2130 struct hal_ev_gatt_client_scan_result *ev = (void *)buf;
2132 char *address = NULL;
2133 GVariant *value = NULL;
2134 char *buffer = NULL;
2137 uint8_t addr_type = 0;
2138 uint8_t adv_type = 0;
2144 memset(buf, 0, sizeof(buf));
2147 g_variant_get(msg, "(&syyii@ay)", &address, &addr_type,
2148 &adv_type, &rssi, &data_len, &value);
2150 buffer_len = g_variant_get_size(value);
2152 buffer = (char *)g_variant_get_data(value);
2154 if (data_len != buffer_len) {
2155 ERR("Unexpected: buffer_len: %d, data_len: %d",
2156 buffer_len, data_len);
2157 data_len = buffer_len;
2160 DBG("Address: %s, len: %d, rssi: %d, addr_type: 0x%02X, adv_type: 0x%02X",
2161 address, data_len, rssi, addr_type, adv_type);
2163 _bt_hal_convert_addr_string_to_type(ev->bd_addr, address);
2164 ev->addr_type = addr_type;
2165 ev->adv_type = adv_type;
2168 memcpy(ev->adv_data, buffer, data_len);
2171 DBG("Send le scan result event to HAL, size: [%zd]", size);
2172 gatt_event_cb(HAL_EV_GATT_CLIENT_SCAN_RESULT, buf, size);
2173 g_variant_unref(value);
2176 static void __bt_hal_handle_gatts_mtu_changed_event(char *address, int mtu)
2178 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
2179 struct hal_ev_gatt_server_mtu_changed *ev = (void *)buf;
2185 memset(buf, 0, sizeof(buf));
2188 DBG("Address: %s, mtu: %d", address, mtu);
2190 ev->conn_id = _bt_get_remote_gatt_client_conn_id(address);
2193 DBG("Send GATT server mtu changed event to HAL, size: [%zd]", size);
2194 gatt_event_cb(HAL_EV_GATT_SERVER_MTU_CHANGED, buf, size);
2197 /* AVRCP Controller Role(Remote:AVRCP Target) Events */
2198 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address)
2201 struct hal_ev_avrcp_ctrl_conn_state ev;
2203 if (connected == TRUE)
2204 INFO("AVRCP(Controller) Profile Connected for address [%s]", address);
2206 INFO("AVRCP(Controller) Profile DisConnected for address [%s]", address);
2208 if (connected == TRUE)
2209 ev.state = HAL_AVRCP_CTRL_STATE_CONNECTED;
2211 ev.state = HAL_AVRCP_CTRL_STATE_DISCONNECTED;
2212 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2214 if (!a2dp_sink_event_cb)
2215 ERR("AV event handler not registered");
2217 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_CONN_STATE, &ev, sizeof(ev));
2220 static int __bt_media_attr_to_type(const char *str)
2222 if (!strcasecmp(str, "Equalizer"))
2223 return HAL_PLAYER_ATTR_EQUALIZER;
2224 else if (!strcasecmp(str, "Repeat"))
2225 return HAL_PLAYER_ATTR_REPEAT;
2226 else if (!strcasecmp(str, "Shuffle"))
2227 return HAL_PLAYER_ATTR_SHUFFLE;
2228 else if (!strcasecmp(str, "Scan"))
2229 return HAL_PLAYER_ATTR_SCAN;
2235 static int __bt_hal_play_status_str_to_type(const char *value)
2237 if (!strcmp(value, "stopped"))
2238 return HAL_PLAYSTATE_STOPPED;
2239 else if (!strcmp(value, "playing"))
2240 return HAL_PLAYSTATE_PLAYING;
2241 else if (!strcmp(value, "paused"))
2242 return HAL_PLAYSTATE_PAUSED;
2243 else if (!strcmp(value, "forward-seek"))
2244 return HAL_PLAYSTATE_FWD_SEEK;
2245 else if (!strcmp(value, "reverse-seek"))
2246 return HAL_PLAYSTATE_REV_SEEK;
2248 return HAL_PLAYSTATE_ERROR;
2251 static void __bt_avrcp_control_parse_properties(struct hal_ev_track_changed *ev, GVariant *item)
2253 GVariant *value = NULL;
2255 char *value_string = NULL;
2256 const char *key = NULL;
2262 g_variant_iter_init(&iter, item);
2263 while (g_variant_iter_loop(&iter, "{sv}", &key, &value)) {
2264 if (strcasecmp(key, "Title") == 0) {
2265 value_string = (char *)g_variant_get_string(value, NULL);
2266 DBG("Value : %s ", value_string);
2267 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TITLE;
2268 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2270 } else if (strcasecmp(key, "Artist") == 0) {
2271 value_string = (char *)g_variant_get_string(value, NULL);
2272 DBG("Value : %s ", value_string);
2273 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ARTIST;
2274 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2276 } else if (strcasecmp(key, "Album") == 0) {
2277 value_string = (char *)g_variant_get_string(value, NULL);
2278 DBG("Value : %s ", value_string);
2279 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ALBUM;
2280 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2282 } else if (strcasecmp(key, "Genre") == 0) {
2283 value_string = (char *)g_variant_get_string(value, NULL);
2284 DBG("Value : %s ", value_string);
2285 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_GENRE;
2286 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2288 } else if (strcasecmp(key, "Duration") == 0) {
2291 val = g_variant_get_uint32(value);
2292 DBG("Value : %li", val);
2293 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_PLAYING_TIME;
2294 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2296 } else if (strcasecmp(key, "NumberOfTracks") == 0) {
2299 val = g_variant_get_uint32(value);
2300 DBG("Value : %li", val);
2301 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_NUM_TRACKS;
2302 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2304 } else if (strcasecmp(key, "TrackNumber") == 0) {
2307 val = g_variant_get_uint32(value);
2308 DBG("Value : %li", val);
2309 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TRACK_NUM;
2310 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2313 DBG("%s not supported, ignoring", key);
2316 if (i >= HAL_MAX_ATTR_NUM) {
2317 ERR(" Received max attribute [%d]", i);
2323 g_variant_iter_free(&iter);
2327 static int __bt_media_attrval_to_val(int type, const char *value)
2332 case HAL_PLAYER_ATTR_EQUALIZER:
2333 if (!strcmp(value, "off"))
2338 case HAL_PLAYER_ATTR_REPEAT:
2339 if (!strcmp(value, "off"))
2340 ret = BTRC_PLAYER_VAL_OFF_REPEAT;
2341 else if (!strcmp(value, "singletrack"))
2342 ret = BTRC_PLAYER_VAL_SINGLE_REPEAT;
2343 else if (!strcmp(value, "alltracks"))
2344 ret = BTRC_PLAYER_VAL_ALL_REPEAT;
2346 ret = BTRC_PLAYER_VAL_GROUP_REPEAT;
2348 case HAL_PLAYER_ATTR_SHUFFLE:
2349 if (!strcmp(value, "off"))
2350 ret = BTRC_PLAYER_VAL_OFF_SHUFFLE;
2351 else if (!strcmp(value, "alltracks"))
2352 ret = BTRC_PLAYER_VAL_ALL_SHUFFLE;
2354 ret = BTRC_PLAYER_VAL_GROUP_SHUFFLE;
2356 case HAL_PLAYER_ATTR_SCAN:
2357 if (!strcmp(value, "off"))
2359 else if (!strcmp(value, "alltracks"))
2365 ERR("Value not handled");
2371 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member,
2374 const char *property = NULL;
2375 GVariant *value = NULL;
2377 char address[BT_HAL_ADDRESS_STRING_SIZE];
2380 ERR("Error returned in method call\n");
2384 if (!avrcp_ctrl_event_cb) {
2385 ERR("AVRCP controller DBUS handler callback not registered");
2389 g_variant_iter_init(&iter, msg);
2391 _bt_hal_convert_device_path_to_address(path, address);
2393 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2394 DBG("Property = %s \n", property);
2395 if ((strcasecmp(property, "Equalizer") == 0) ||
2396 (strcasecmp(property, "Repeat") == 0) ||
2397 (strcasecmp(property, "Shuffle") == 0) ||
2398 (strcasecmp(property, "Scan") == 0)) {
2399 struct hal_ev_player_setting ev;
2403 valstr = g_variant_get_string(value, NULL);
2404 DBG("Value : %s ", valstr);
2407 val = __bt_media_attrval_to_val(__bt_media_attr_to_type(property), valstr);
2410 memset(&ev, 0, sizeof(ev));
2411 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2413 ev.attr_ids[0] = __bt_media_attr_to_type(property);
2414 ev.attr_values[0] = val;
2416 /* Send event to application */
2417 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAYER_APP_SETTING_CHANGED, &ev, sizeof(ev));
2419 } else if ((strcasecmp(property, "Status") == 0)) {
2420 struct hal_ev_play_status_changed ev;
2423 valstr = g_variant_get_string(value, NULL);
2424 DBG("Value : %s ", valstr);
2426 memset(&ev, 0, sizeof(ev));
2427 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2429 ev.status = __bt_hal_play_status_str_to_type(valstr);
2431 /* Send event to application */
2432 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_STATUS_CHANGED, &ev, sizeof(ev));
2434 } else if (strcasecmp(property, "Position") == 0) {
2435 struct hal_ev_play_position ev;
2437 memset(&ev, 0, sizeof(ev));
2438 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2439 ev.pos = g_variant_get_uint32(value);
2440 DBG("Value : %d ", ev.pos);
2442 /* Send event to application */
2443 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_POSITION_CHANGED, &ev, sizeof(ev));
2444 } else if (strcasecmp(property, "Track") == 0) {
2445 struct hal_ev_track_changed ev;
2447 memset(&ev, 0, sizeof(ev));
2448 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2449 __bt_avrcp_control_parse_properties(&ev, value);
2451 /* Send event to application */
2452 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_TRACK_CHANGED, &ev, sizeof(ev));
2454 DBG("Property not handled");
2458 g_free((char *)property);
2459 g_variant_unref(value);
2462 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member,
2465 const char *property = NULL;
2466 GVariant *value = NULL;
2468 char address[BT_HAL_ADDRESS_STRING_SIZE];
2472 ERR("Error returned in method call\n");
2476 if (!avrcp_tg_event_cb) {
2477 ERR("AVRCP target DBUS handler callback not registered");
2481 g_variant_iter_init(&iter, msg);
2483 _bt_hal_convert_device_path_to_address(path, address);
2485 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2486 DBG("Property = %s \n", property);
2487 if ((strcasecmp(property, "Delay") == 0)) {
2488 struct hal_ev_avrcp_tg_delay_changed ev;
2491 memset(&ev, 0, sizeof(ev));
2492 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2494 val = g_variant_get_uint16(value);
2495 DBG("Value : %d", val);
2498 /* Send event to application */
2499 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_DELAY_CHANGE, &ev, sizeof(ev));
2501 DBG("Property not handled");
2506 g_free((char *)property);
2507 g_variant_unref(value);
2510 /* A2DP Src Role(Remote:Sink) Events */
2511 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address)
2514 struct hal_ev_a2dp_conn_state ev;
2516 if (connected == TRUE)
2517 INFO("A2DP(Src) Profile Connected for address [%s]", address);
2519 INFO("A2DP(Src) Profile DisConnected for address [%s]", address);
2521 ev.state = (connected == TRUE) ?
2522 HAL_EV_A2DP_STATE_CONNECTED :
2523 HAL_EV_A2DP_STATE_DISCONNECTED;
2525 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2528 ERR("AV event handler not registered");
2530 av_event_cb(HAL_EV_A2DP_CONN_STATE, &ev, sizeof(ev));
2533 /* A2DP Sink Role(Remote:Source) Events */
2534 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address)
2537 struct hal_ev_a2dp_conn_state ev;
2539 if (connected == TRUE)
2540 INFO("A2DP(Sink) Profile Connected for address [%s]", address);
2542 INFO("A2DP(Sink) Profile DisConnected for address [%s]", address);
2544 ev.state = (connected == TRUE) ?
2545 HAL_EV_A2DP_STATE_CONNECTED :
2546 HAL_EV_A2DP_STATE_DISCONNECTED;
2548 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2550 if (!a2dp_sink_event_cb)
2551 ERR("AV event handler not registered");
2553 a2dp_sink_event_cb(HAL_EV_A2DP_SOURCE_CONN_STATE, &ev, sizeof(ev));
2556 /* HF(AG Role) Audio Events */
2557 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected,
2558 const char *address)
2561 struct hal_ev_handsfree_audio_state ev;
2563 if (connected == TRUE)
2564 INFO("AG Audio Connected for address [%s]", address);
2566 INFO("AG Audio DisConnected for address [%s]", address);
2568 ev.state = (connected == TRUE) ?
2569 HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTED :
2570 HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED;
2572 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2575 ERR("HF event handler not registered");
2577 hf_event_cb(HAL_EV_HANDSFREE_AUDIO_STATE, &ev, sizeof(ev));
2580 /* HF(AG Role) Profile Events */
2581 static void __bt_hal_send_hf_connection_state_event(gboolean connected,
2582 const char *address)
2585 struct hal_ev_handsfree_conn_state ev;
2587 if (connected == TRUE)
2588 INFO("AG Profile Connected for address [%s]", address);
2590 INFO("AG Profile DisConnected for address [%s]", address);
2592 ev.state = (connected == TRUE) ?
2593 HAL_EV_HANDSFREE_CONN_STATE_CONNECTED :
2594 HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTED;
2596 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2599 ERR("HF event handler not registered");
2601 hf_event_cb(HAL_EV_HANDSFREE_CONN_STATE, &ev, sizeof(ev));
2604 /* HF(Client Role) Profile Events */
2605 static void __bt_hal_send_hf_client_connection_state_event(gboolean connected,
2606 const char *address)
2608 struct hal_ev_hf_client_conn_state ev;
2610 if (connected == TRUE)
2611 INFO("HF Client Profile Connected for address [%s]", address);
2613 INFO("HF Client Profile DisConnected for address [%s]", address);
2615 ev.state = (connected == TRUE) ?
2616 HAL_EV_HF_CLIENT_CONN_STATE_CONNECTED :
2617 HAL_EV_HF_CLIENT_CONN_STATE_DISCONNECTED;
2619 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2621 if (!hf_client_event_cb)
2622 ERR("HF Client event handler not registered");
2624 hf_client_event_cb(HAL_EV_HF_CLIENT_CONN_STATE, &ev, sizeof(ev));
2627 void _bt_hal_register_event_handler_cb(bt_hal_module_e module, handle_stack_msg cb)
2637 a2dp_sink_event_cb = cb;
2643 hf_client_event_cb = cb;
2646 avrcp_tg_event_cb = cb;
2648 case HAL_AVRCP_CTRL:
2649 avrcp_ctrl_event_cb = cb;
2655 ERR("Unknown module: %d", module);
2659 void _bt_hal_unregister_event_handler_cb(bt_hal_module_e module)
2663 hid_event_cb = NULL;
2669 a2dp_sink_event_cb = NULL;
2675 hf_client_event_cb = NULL;
2678 avrcp_tg_event_cb = NULL;
2680 case HAL_AVRCP_CTRL:
2681 avrcp_ctrl_event_cb = NULL;
2684 gatt_event_cb = NULL;
2687 ERR("Unknown module: %d", module);
2691 bool _bt_hal_get_adapter_request_state(void)
2693 return is_adapter_activating;
2696 bool _bt_hal_get_le_request_state(void)
2698 return is_le_activating;
2701 void _bt_hal_set_adapter_request_state(bool enable)
2703 DBG("set_adapter_request_state %d", enable);
2704 is_adapter_activating = enable;
2707 void _bt_hal_set_le_request_state(bool enable)
2709 DBG("set_le_request_state %d", enable);
2710 is_le_activating = enable;