4 * Copyright (c) 2015 -2016 Samsung Electronics Co., Ltd All Rights Reserved.
6 * Contact: Anupam Roy <anupam.r@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
33 #include "bt-hal-log.h"
34 #include "bt-hal-msg.h"
35 #include "bt-hal-internal.h"
36 #include "bt-hal-event-receiver.h"
37 #include "bt-hal-dbus-common-utils.h"
38 #include "bt-hal-agent.h"
39 #include "bt-hal-adapter-le.h"
40 #include "bt-hal-gatt-server.h"
41 #include "bt-hal-gatt-client.h"
42 #include "bt-hal-adapter-dbus-handler.h"
44 #include "bt-internal-types.h"
46 #define BASELEN_PROP_CHANGED (sizeof(struct hal_ev_adapter_props_changed) \
47 + sizeof(struct hal_property))
49 /*TODO: Basic filters are currently added,
50 Need to add different event filters like HID,
51 Device etc in subsequent patches */
53 /* Global variables and structures */
54 static GDBusConnection *manager_conn;
55 static handle_stack_msg event_cb = NULL;
56 static handle_stack_msg hid_event_cb = NULL;
57 static handle_stack_msg hid_device_event_cb = NULL;
58 static handle_stack_msg av_event_cb = NULL;
59 static handle_stack_msg a2dp_sink_event_cb = NULL;
60 static handle_stack_msg hf_event_cb = NULL;
61 static handle_stack_msg hf_client_event_cb = NULL;
62 static handle_stack_msg avrcp_ctrl_event_cb = NULL;
63 static handle_stack_msg avrcp_tg_event_cb = NULL;
64 static handle_stack_msg gatt_event_cb = NULL;
65 static guint event_id;
67 /*State Management sepration Control for Adapter and LE */
68 static gboolean is_adapter_activating = FALSE;
69 static gboolean is_le_activating = FALSE;
74 gchar* interface_name;
77 } bt_hal_main_event_data_t;
79 /* Forward declarations */
80 static gboolean __bt_hal_event_manager(gpointer param);
81 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type);
82 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn, int subscribe);
83 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn, int subscribe);
84 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe);
86 static int __bt_hal_parse_event(GVariant *msg);
87 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current);
89 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path);
90 static void __bt_hal_adapter_property_changed_event(GVariant *msg);
91 static void __bt_hal_manager_event_filter(GDBusConnection *connection, const gchar *sender_name,
92 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
93 GVariant *parameters, gpointer user_data);
94 static int __bt_hal_initialize_manager_receiver(void);
95 static gboolean __bt_hal_parse_interface(GVariant *msg);
96 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters);
97 static gboolean __bt_hal_parse_device_properties(GVariant *item);
98 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data);
99 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path);
100 static void __bt_hal_dbus_device_found_properties(const char *device_path);
101 static void __bt_hal_device_properties_lookup(GVariant *result, char *address);
102 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member, const char *path);
103 static void __bt_hal_send_device_acl_connection_state_event(int status, gboolean connected, const char *address);
104 static void __bt_hal_handle_input_event(GVariant *msg, const char *path);
105 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address);
106 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address);
107 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address);
108 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member, const char *path);
109 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member, const char *path);
111 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted, const char *address);
112 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn, int subscribe);
113 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path);
114 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected, const char *address);
115 static void __bt_hal_send_hf_connection_state_event(gboolean connected, const char *address);
116 static void __bt_hal_send_device_trusted_profile_changed_event(uint32_t trust_val, const char *address);
117 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path);
118 static void __bt_hal_handle_gatts_mtu_changed_event(char *address, int mtu);
119 static void __bt_hal_send_hf_client_connection_state_event(gboolean connected, const char *address);
122 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data)
126 struct hal_ev_discovery_state_changed ev;
127 ev.state = HAL_DISCOVERY_STATE_STOPPED;
128 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
133 static int __bt_hal_parse_event(GVariant *msg)
137 char *interface_name = NULL;
138 GVariant *inner_iter = NULL;
140 g_variant_iter_init(&iter, msg);
142 while ((child = g_variant_iter_next_value(&iter))) {
143 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
144 if (g_strcmp0(interface_name,
145 BT_HAL_DEVICE_INTERFACE) == 0) {
146 DBG("__bt_hal_parse_event: Interface: BT_HAL_DEVICE_INTERFACE");
147 g_variant_unref(inner_iter);
148 g_variant_unref(child);
149 return BT_HAL_DEVICE_EVENT;
150 } else if (g_strcmp0(interface_name,
151 BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
152 DBG("__bt_hal_parse_event: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
153 g_variant_unref(inner_iter);
154 g_variant_unref(child);
155 return BT_HAL_MEDIA_TRANSFER_EVENT;
156 } else if (g_strcmp0(interface_name,
157 BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
158 DBG("__bt_hal_parse_event: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
159 g_variant_unref(inner_iter);
160 g_variant_unref(child);
161 return BT_HAL_AVRCP_CONTROL_EVENT;
163 g_variant_unref(inner_iter);
164 g_variant_unref(child);
170 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current)
172 g_variant_get(msg, "(&s&s&s)", name, previous, current);
173 return BT_HAL_ERROR_NONE;
176 int __bt_insert_hal_properties(void *buf, uint8_t type, uint16_t len, const void *val)
177 { struct hal_property *prop = buf;
183 memcpy(prop->val, val, len);
185 return sizeof(*prop) + len;
188 handle_stack_msg _bt_hal_get_stack_message_handler(void)
193 static void __bt_hal_adapter_property_changed_event(GVariant *msg)
195 GVariantIter value_iter;
196 GVariant *value = NULL;
197 GDBusProxy *adapter_proxy;
200 g_variant_iter_init(&value_iter, msg);
202 /* Buffer and propety count management */
203 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
204 struct hal_ev_adapter_props_changed *ev = (void*) buf;
206 const gchar *address = NULL;
208 unsigned int cod = 0;
209 unsigned int a2dp_role = 0;
210 gboolean discoverable;
211 gboolean connectable;
212 unsigned int scan_mode = BT_SCAN_MODE_NONE;
213 unsigned int disc_timeout;
214 const gchar *version;
215 gboolean ipsp_initialized;
218 unsigned int pairable_timeout;
219 gboolean scan_mode_property_update = FALSE;
220 gboolean is_discovering;
221 gboolean is_le_discovering;
223 memset(buf, 0, sizeof(buf));
226 ev->status = BT_STATUS_SUCCESS;
228 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
229 if (!g_strcmp0(key, "Address")) {
232 address = g_variant_get_string(value, NULL);
233 DBG("##Address [%s]", address);
234 _bt_hal_convert_addr_string_to_type(bdaddr, address);
235 size += __bt_insert_hal_properties(buf + size,
236 HAL_PROP_ADAPTER_ADDR, sizeof(bdaddr), bdaddr);
238 } else if (!g_strcmp0(key, "Alias")) {
239 g_variant_get(value, "&s", &name);
240 DBG("##Alias [%s] ", name);
241 size += __bt_insert_hal_properties(buf + size,
242 HAL_PROP_ADAPTER_NAME, strlen(name) + 1, name);
244 } else if (!g_strcmp0(key, "Class")) {
245 cod = g_variant_get_uint32(value);
246 DBG("##Class [%d]", cod);
247 size += __bt_insert_hal_properties(buf + size,
248 HAL_PROP_ADAPTER_CLASS, sizeof(unsigned int), &cod);
250 } else if (!g_strcmp0(key, "Discoverable")) {
251 discoverable = g_variant_get_boolean(value);
252 DBG("##Discoverable [%d]", discoverable);
254 scan_mode = BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE;
256 scan_mode = BT_SCAN_MODE_CONNECTABLE;
257 scan_mode_property_update = TRUE;
258 } else if (!g_strcmp0(key, "DiscoverableTimeout")) {
259 disc_timeout = g_variant_get_uint32(value);
260 DBG("##Discoverable Timeout [%d]", disc_timeout);
261 size += __bt_insert_hal_properties(buf + size,
262 HAL_PROP_ADAPTER_DISC_TIMEOUT, sizeof(unsigned int), &disc_timeout);
264 } else if (!g_strcmp0(key, "Connectable")) {
265 connectable = g_variant_get_boolean(value);
266 DBG("##Connectable [%d]", connectable);
268 scan_mode = BT_SCAN_MODE_NONE;
269 else if (scan_mode == BT_SCAN_MODE_NONE)
270 scan_mode = BT_SCAN_MODE_CONNECTABLE;
271 scan_mode_property_update = TRUE;
272 } else if (!g_strcmp0(key, "Version")) {
273 version = g_variant_get_string(value, NULL);
274 DBG("##Version [%s]", version);
275 size += __bt_insert_hal_properties(buf + size,
276 HAL_PROP_ADAPTER_VERSION, strlen(version) + 1, version);
278 } else if (!g_strcmp0(key, "Name")) {
279 g_variant_get(value, "&s", &name);
280 DBG("##Name [%s]", name);
281 size += __bt_insert_hal_properties(buf + size,
282 HAL_PROP_ADAPTER_NAME, strlen(name) + 1, name);
284 } else if (!g_strcmp0(key, "Powered")) {
285 powered = g_variant_get_boolean(value);
286 DBG("##Powered = %d", powered);
287 /* TODO: Need to check this operation!! */
288 if (powered == FALSE) {
289 DBG("###### Adapter Powered Down ######");
291 if (TIZEN_FEATURE_BT_USB_DONGLE) {
292 struct hal_ev_adapter_state_changed ev;
293 ev.state = HAL_POWER_OFF;
294 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
296 struct hal_ev_le_state_changed le_ev;
297 le_ev.state = HAL_POWER_OFF;
298 event_cb(HAL_EV_LE_STATE_CHANGED, &le_ev, sizeof(le_ev));
301 _bt_hal_destroy_adapter_agent();
303 DBG("Pending disalbed event after bluetoothd is terminated");
306 DBG("###### Adapter Powered Up ######");
307 if (_bt_hal_get_adapter_request_state()) {
308 DBG("Sending STATE CHANGE EVENT for Adapter... ");
309 _bt_hal_set_adapter_request_state(FALSE);
310 struct hal_ev_adapter_state_changed ev;
311 ev.state = HAL_POWER_ON;
312 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
315 if (_bt_hal_get_le_request_state()) {
316 DBG("Sending STATE CHANGE EVENT for LE... ");
317 _bt_hal_set_le_request_state(FALSE);
318 struct hal_ev_le_state_changed ev;
319 ev.state = HAL_POWER_ON;
320 event_cb(HAL_EV_LE_STATE_CHANGED, &ev, sizeof(ev));
324 _bt_hal_initialize_adapter_agent();
327 } else if (!g_strcmp0(key, "Pairable")) {
328 pairable = g_variant_get_boolean(value);
329 DBG("##Pairable [%d]", pairable);
330 } else if (!g_strcmp0(key, "PairableTimeout")) {
331 pairable_timeout = g_variant_get_uint32(value);
332 DBG("##Pairable Timeout = %d", pairable_timeout);
333 } else if (!g_strcmp0(key, "UUIDs")) {
338 size1 = g_variant_get_size(value);
339 int num_props_tmp = ev->num_props;
341 uuid_value = (char **)g_variant_get_strv(value, &size1);
342 for (i = 0; uuid_value[i] != NULL; i++)
344 /* UUID collection */
345 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
346 for (i = 0; uuid_value[i] != NULL; i++) {
347 char *uuid_str = NULL;
348 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
349 uuid_str = g_strdup(uuid_value[i]);
350 DBG("##UUID string [%s]\n", uuid_str);
351 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
352 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
355 size += __bt_insert_hal_properties(buf + size, HAL_PROP_ADAPTER_UUIDS,
356 (BT_HAL_STACK_UUID_SIZE * uuid_count),
358 ev->num_props = num_props_tmp + 1;
361 } else if (!g_strcmp0(key, "Discovering")) {
362 is_discovering = g_variant_get_boolean(value);
363 DBG("##Discovering = [%d]", is_discovering);
365 if (is_discovering == FALSE) {
366 /* In Tizen Bluez, this actually does not mean Discovery is stopped
367 in Bluez. Tizen Bluez sends this event after a certain timeout,
368 Therefore, we must forecefully call StopDiscovery to stop discovery in BlueZ */
372 adapter_proxy = _bt_hal_get_adapter_proxy();
374 if (adapter_proxy == NULL)
377 /* Need to stop searching */
378 DBG("Event though Bluez reported DIscovering stopped, we force stop Discovery ");
379 g_dbus_proxy_call_sync(adapter_proxy, "StopDiscovery",
381 G_DBUS_CALL_FLAGS_NONE,
385 ERR("Dbus Error : %s", err->message);
387 /* This error is thrown by Bluez, as Discovery is already stopped.
388 Discovery is stopped if user cancels on going discovery.
389 In order to maintain correct state of Bluetooth Discovery state,
390 simply send Discovery stopped event to HAL user */
391 struct hal_ev_discovery_state_changed ev;
392 ev.state = HAL_DISCOVERY_STATE_STOPPED;
393 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
398 event_id = g_timeout_add(BT_HAL_DISCOVERY_FINISHED_DELAY,
399 (GSourceFunc)__bt_hal_discovery_finished_cb, NULL);
403 struct hal_ev_discovery_state_changed ev;
404 ev.state = HAL_DISCOVERY_STATE_STARTED;
405 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
408 } else if (!g_strcmp0(key, "LEDiscovering")) {
411 is_le_discovering = g_variant_get_boolean(value);
412 DBG("##LE Discovering = [%d]", is_le_discovering);
414 if (is_le_discovering) {
415 /* Send LE discovering started event */
416 size += __bt_insert_hal_properties(buf + size,
417 HAL_PROP_ADAPTER_LE_DISCOVERY_STARTED, 0, NULL);
422 adapter_proxy = _bt_hal_get_adapter_proxy();
423 if (adapter_proxy == NULL) {
424 ERR("adapter_proxy == NULL");
428 /* Need to stop searching */
429 result = g_dbus_proxy_call_sync(adapter_proxy, "StopLEDiscovery",
430 NULL, G_DBUS_CALL_FLAGS_NONE,
431 DBUS_TIMEOUT, NULL, &err);
433 ERR("Error occured in Proxy call");
435 ERR("(Error: %s)", err->message);
439 g_variant_unref(result);
442 /* Send LE discovering finished event */
443 size += __bt_insert_hal_properties(buf + size,
444 HAL_PROP_ADAPTER_LE_DISCOVERY_STOPPED, 0, NULL);
446 } else if (!g_strcmp0(key, "Modalias")) {
447 char *modalias = NULL;
448 g_variant_get(value, "s", &modalias);
449 DBG("##Adapter ModAlias [%s]", modalias);
450 } else if (!g_strcmp0(key, "SupportedLEFeatures")) {
451 DBG("##LE Supported features");
454 GVariantIter *iter = NULL;
455 g_variant_get(value, "as", &iter);
456 bt_local_le_features_t le_features;
457 gboolean le_features_present = FALSE;
462 memset(&le_features, 0x00, sizeof(le_features));
464 while (g_variant_iter_next(iter, "&s", &name) &&
465 g_variant_iter_next(iter, "&s", &val)) {
466 DBG("name = %s, Value = %s", name, val);
467 if (FALSE == _bt_hal_update_le_feature_support(name, val, &le_features))
468 ERR("Failed to update LE feature (name = %s, value = %s)", name, val);
470 le_features_present = TRUE;
473 g_variant_iter_free(iter);
474 if (le_features_present) {
475 size += __bt_insert_hal_properties(buf + size,
476 HAL_PROP_ADAPTER_LOCAL_LE_FEAT, sizeof(le_features), &le_features);
479 DBG("le supported features values are NOT provided by Stack");
481 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
482 g_variant_get(value, "b" , &ipsp_initialized);
483 DBG("##IPSP Initialized = %d", ipsp_initialized);
484 } else if (!g_strcmp0(key, "A2dpRole")) {
485 a2dp_role = g_variant_get_uint32(value);
486 DBG("##A2dp Role [%d]", a2dp_role);
487 size += __bt_insert_hal_properties(buf + size,
488 HAL_PROP_ADAPTER_A2DP_ROLE, sizeof(unsigned int), &a2dp_role);
491 ERR("Unhandled Property:[%s]", key);
495 if (scan_mode_property_update) {
496 size += __bt_insert_hal_properties(buf + size,
497 HAL_PROP_ADAPTER_SCAN_MODE, sizeof(int), &scan_mode);
503 DBG("Send Adapter properties changed event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
504 event_cb(HAL_EV_ADAPTER_PROPS_CHANGED, buf, size);
508 static void __bt_hal_flight_ps_mode_cb(keynode_t *node, void *data)
510 gboolean flight_mode = FALSE;
512 DBG_SECURE("HAL callback hit");
513 DBG_SECURE("key=%s", vconf_keynode_get_name(node));
514 type = vconf_keynode_get_type(node);
515 if (type == VCONF_TYPE_BOOL) {
516 flight_mode = vconf_keynode_get_bool(node);
517 if (flight_mode != TRUE) {
518 ERR("Ignore the event");
521 ERR("Flight Mode == TRUE");
524 ERR("Invaild vconf key type : %d", type);
527 DBG("Enabling core now");
528 _bt_hal_enable_core();
531 static void _bt_hal_register_vconf_handler(void)
535 if (vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
536 (vconf_callback_fn)__bt_hal_flight_ps_mode_cb, NULL) < 0)
537 ERR("Unable to register key handler");
538 DBG("Telephony is disabled");
539 if (vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE,
540 (vconf_callback_fn)__bt_hal_flight_ps_mode_cb, NULL) < 0)
541 ERR("Unable to register key handler");
544 void _bt_hal_handle_adapter_event(GVariant *msg, const char *member)
549 if (strcasecmp(member, "DeviceCreated") == 0) {
550 DBG("DeviceCreated: Unhandled");
551 } else if (strcasecmp(member, "AdvertisingEnabled") == 0) {
553 gboolean status = FALSE;
554 g_variant_get(msg, "(ib)", &slot_id, &status);
556 /* Send event to application */
557 _bt_hal_set_advertising_status(slot_id, status);
558 } else if (strcasecmp(member, "RssiEnabled") == 0) {
559 struct hal_ev_rssi_monitor_state_changed ev;
560 gboolean status = FALSE;
561 char *address = NULL;
564 g_variant_get(msg, "(sib)", &address, &link_type, &status);
565 DBG("RSSI monitoring %s for %s",
566 (status ? "Enabled" : "Disabled"), address);
568 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
569 ev.link_type = link_type;
570 ev.state = (status ? HAL_RSSI_MONITORING_ENABLED : HAL_RSSI_MONITORING_DISABLED);
572 ERR("event_cb is NULL");
574 event_cb(HAL_EV_RSSI_MONITOR_STATE_CHANGED, &ev, sizeof(ev));
577 } else if (strcasecmp(member, "RssiAlert") == 0) {
578 struct hal_ev_rssi_alert_recieved ev;
582 char *address = NULL;
584 g_variant_get(msg, "(siii)", &address, &link_type, &alert_type, &rssi_dbm);
585 DBG("RSSI Alert: [Address %s LinkType %d] [Type %d DBM %d]",
586 address, alert_type, rssi_dbm, link_type);
588 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
589 ev.link_type = link_type;
590 ev.alert_type = alert_type;
594 ERR("event_cb is NULL");
596 event_cb(HAL_EV_RSSI_ALERT_RECIEVED, &ev, sizeof(ev));
599 } else if (strcasecmp(member, "RawRssi") == 0) {
600 struct hal_ev_raw_rssi_recieved ev;
603 char *address = NULL;
605 g_variant_get(msg, "(sii)", &address, &link_type, &rssi_dbm);
606 DBG("Raw RSSI: [Address %s] [Link Type %d][RSSI DBM %d]",
607 address, link_type, rssi_dbm);
609 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
610 ev.link_type = link_type;
614 ERR("event_cb is NULL");
616 event_cb(HAL_EV_RAW_RSSI_RECIEVED, &ev, sizeof(ev));
619 } else if (strcasecmp(member, BT_HAL_HARDWARE_ERROR) == 0) {
620 DBG("BT Hardware Error: Unhandled");
621 } else if (strcasecmp(member, BT_HAL_TX_TIMEOUT_ERROR) == 0) {
622 DBG("BT TX Timeout Error: Unhandled");
623 } else if (strcasecmp(member, BT_HAL_DBFW_PLUS_INFO) == 0) {
625 DBG("### DBFW+ info received from BLUEZ");
626 struct hal_ev_dbfw_plus_info_recieved info;
629 unsigned char *buffer = NULL;
630 GVariant *value = NULL;
632 g_variant_get(msg, "(y@ay)", &event_code, &value);
634 ERR("g_variant_get fails");
636 length = g_variant_get_size(value);
638 ERR("Invalid g_variant len = %d", length);
640 info.event_code = event_code;
641 buffer = (unsigned char*)g_variant_get_data(value);
642 info.data = g_memdup(buffer, length);
643 info.data_len = length;
645 ERR("event_cb is NULL");
647 event_cb(HAL_EV_DBFW_PLUS_INFO_RECIEVED, &info, sizeof(info));
655 static gboolean __bt_hal_parse_device_properties(GVariant *item)
661 gboolean is_bredr_dev = FALSE;
666 /* Buffer and propety count management */
667 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
668 struct hal_ev_device_found *ev = (void *) buf;
670 memset(buf, 0, sizeof(buf));
674 g_variant_iter_init(&iter, item);
675 while (g_variant_iter_loop(&iter, "{sv}", &key, &val)) {
677 if (strcasecmp(key, "Address") == 0) {
678 char * address = NULL;
679 address = g_variant_dup_string(val, &len);
681 _bt_hal_convert_addr_string_to_type(bdaddr, address);
683 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
684 sizeof(bdaddr), bdaddr);
687 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
689 } else if (strcasecmp(key, "AddressType") == 0) {
690 char *addresstype = g_variant_dup_string(val, &len);
692 DBG("AddressType [%s]", addresstype);
694 } else if (strcasecmp(key, "Class") == 0) {
695 unsigned int class = g_variant_get_uint32(val);
696 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
697 sizeof(unsigned int), &class);
699 DBG("Device class [%d] Property num [%d]", class, ev->num_props);
701 } else if (strcasecmp(key, "name") == 0) {
702 char *name = g_variant_dup_string(val, &len);
704 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
705 strlen(name) + 1, name);
707 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
710 } else if (strcasecmp(key, "Connected") == 0) {
711 unsigned int connected = g_variant_get_byte(val);
713 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
714 sizeof(unsigned int), &connected);
716 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
717 } else if (strcasecmp(key, "paired") == 0) {
718 uint8_t paired = (g_variant_get_boolean(val) ? 1 : 0);
719 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
720 sizeof(uint8_t), &paired);
722 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
723 } else if (strcasecmp(key, "Trusted") == 0) {
724 uint8_t trust = (g_variant_get_boolean(val) ? 1 : 0);
725 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
726 sizeof(uint8_t), &trust);
728 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
729 } else if (strcasecmp(key, "RSSI") == 0) {
730 int rssi = g_variant_get_int16(val);
731 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
734 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
735 } else if (strcasecmp(key, "LastAddrType") == 0) {
736 /* TODO: To be handled later*/
737 } else if (!g_strcmp0(key, "IsAliasSet")) {
738 uint8_t is_alias_set = (g_variant_get_boolean(val) ? 1 : 0);
739 DBG("IsAliasSet: %s", (is_alias_set ? "TRUE" : "FALSE"));
740 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
741 sizeof(uint8_t), &is_alias_set);
743 } else if (strcasecmp(key, "UUIDs") == 0) {
748 size1 = g_variant_get_size(val);
749 DBG("UUID count from size [%zu]\n", size1);
750 int num_props_tmp = ev->num_props;
753 uuid_value = (char **)g_variant_get_strv(val, &size1);
754 for (i = 0; uuid_value[i] != NULL; i++)
756 DBG("UUID count [%d]\n", uuid_count);
757 /* UUID collection */
758 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
760 for (i = 0; uuid_value[i] != NULL; i++) {
762 char *uuid_str = NULL;
763 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
764 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
766 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
767 uuid_str = g_strdup(uuid_value[i]);
768 DBG("UUID string [%s]\n", uuid_str);
769 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
770 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
774 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
775 (BT_HAL_STACK_UUID_SIZE * uuid_count),
777 ev->num_props = num_props_tmp + 1;
781 } else if (strcasecmp(key, "LegacyManufacturerDataLen") == 0) {
782 /* TODO: To be handled later*/
783 } else if (strcasecmp(key, "LegacyManufacturerData") == 0) {
784 /* TODO: To be handled later*/
786 DBG("Unhandled Property:[%s]", key);
790 if (size > 1 && is_bredr_dev) {
791 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
792 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
798 static void __bt_hal_handle_avrcp_tg_events(GVariant *msg, const char *path)
801 GVariantIter value_iter;
802 char *property = NULL;
804 GVariant *val = NULL;
805 GVariant *child = NULL;
807 g_variant_iter_init(&value_iter, msg);
808 while ((child = g_variant_iter_next_value(&value_iter))) {
809 g_variant_get(child, "{sv}", &property, &val);
810 INFO("Property %s", property);
811 if (strcasecmp(property, "Connected") == 0) {
812 struct hal_ev_avrcp_tg_conn_state ev;
814 gboolean connected = FALSE;
816 g_variant_get(val, "b", &connected);
818 state = connected ? HAL_AVRCP_TG_STATE_CONNECTED :
819 HAL_AVRCP_TG_STATE_DISCONNECTED;
821 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
823 _bt_hal_convert_device_path_to_address(path, address);
825 DBG("connected: %d", connected);
826 DBG("address: %s", address);
828 /* Prepare to send AVRCP Target connection state event */
829 memset(&ev, 0, sizeof(ev));
830 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
832 if (!avrcp_tg_event_cb)
833 ERR("AVRCP target DBUS handler callback not registered");
835 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_CONN_STATE, (void *)&ev, sizeof(ev));
839 g_variant_unref(child);
840 g_variant_unref(val);
846 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path)
848 char *interface_name = NULL;
849 GVariant *val = NULL;
851 g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, &val, NULL);
853 if (!interface_name) {
854 DBG("Failed to get interface name");
857 g_variant_unref(val);
861 if (strcasecmp(interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
862 DBG("Event: Property Changed: Interface: BT_HAL_ADAPTER_INTERFACE");
863 __bt_hal_adapter_property_changed_event(val);
864 } else if (strcasecmp(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
865 DBG("Event: Property Changed: Interface: BT_HAL_DEVICE_INTERFACE");
866 __bt_hal_device_property_changed_event(val, object_path);
867 } else if (strcasecmp(interface_name, BT_HAL_OBEX_TRANSFER_INTERFACE) == 0) {
868 DBG("Event: Property Changed: Interface: BT_HAL_OBEX_TRANSFER_INTERFACE");
869 /* TODO: Handle event */
870 } else if (strcasecmp(interface_name, BT_HAL_MEDIA_CONTROL_INTERFACE) == 0) {
871 DBG("Event: Property Changed: Interface: BT_HAL_MEDIA_CONTROL_INTERFACE");
872 /* Handle AVRCP target event */
873 __bt_hal_handle_avrcp_tg_events(val, object_path);
874 } else if (strcasecmp(interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
875 DBG("Event: Property Changed: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
876 __bt_hal_handle_avrcp_ctrl_events(val, NULL, object_path);
877 } else if (strcasecmp(interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
878 DBG("Event: Property Changed: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
879 __bt_hal_handle_avrcp_transport_events(val, NULL, object_path);
880 } else if (strcasecmp(interface_name, BT_HAL_NETWORK_CLIENT_INTERFACE) == 0) {
881 DBG("Event: Property Changed: Interface: BT_HAL_NETWORK_CLIENT_INTERFACE");
882 /* TODO: Handle event */
883 } else if (strcasecmp(interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
884 DBG("Event: Property Changed: Interface: BT_HAL_GATT_CHAR_INTERFACE");
885 /* TODO: Handle event */
886 } else if (strcasecmp(interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
887 DBG("Event: Property Changed: Interface: BT_HAL_INPUT_INTERFACE");
888 __bt_hal_handle_input_event(val, object_path);
890 g_variant_unref(val);
893 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters)
897 if (__bt_hal_parse_interface(parameters) == FALSE) {
898 ERR("Fail to parse the properies");
899 g_variant_unref(value);
904 static void __bt_hal_send_hid_connection_state_event(
905 gboolean connected, const char *address)
907 struct hal_ev_hidhost_conn_state ev;
909 ev.state = (connected == TRUE) ?
910 HAL_HIDHOST_STATE_CONNECTED :
911 HAL_HIDHOST_STATE_DISCONNECTED;
913 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
916 ERR("HID event handler not registered");
918 hid_event_cb(HAL_EV_HIDHOST_CONN_STATE, &ev, sizeof(ev));
921 static void __bt_hal_send_hid_device_connection_state_event(
922 gboolean connected, const char *address)
924 struct hal_ev_hiddevice_conn_state ev;
926 ev.state = (connected == TRUE) ?
927 HAL_HIDDEVICE_STATE_CONNECTED :
928 HAL_HIDDEVICE_STATE_DISCONNECTED;
930 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
932 if (!hid_device_event_cb)
933 ERR("HID device event handler not registered");
935 hid_device_event_cb(HAL_EV_HIDDEVICE_CONN_STATE, &ev, sizeof(ev));
938 static void __bt_hal_handle_input_event(GVariant *msg, const char *path)
940 gboolean property_flag = FALSE;
941 GVariantIter value_iter;
942 char *property = NULL;
943 GVariant *child = NULL, *val = NULL;
946 g_variant_iter_init(&value_iter, msg);
947 while ((child = g_variant_iter_next_value(&value_iter))) {
948 g_variant_get(child, "{sv}", &property, &val);
950 if (property == NULL)
953 if (strcasecmp(property, "Connected") == 0) {
956 g_variant_get(val, "b", &property_flag);
957 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
958 _bt_hal_convert_device_path_to_address(path, address);
959 __bt_hal_send_hid_connection_state_event(property_flag, address);
963 g_variant_unref(val);
964 g_variant_unref(child);
968 static gboolean __bt_hal_parse_interface(GVariant *msg)
971 GVariant *optional_param;
974 char *interface_name = NULL;
975 GVariant *inner_iter = NULL;
976 g_variant_get(msg, "(&o@a{sa{sv}})",
977 &path, &optional_param);
978 g_variant_iter_init(&iter, optional_param);
980 while ((child = g_variant_iter_next_value(&iter))) {
981 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
982 if (g_strcmp0(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
983 DBG("Found a device: %s", path);
984 if (__bt_hal_parse_device_properties(inner_iter) == FALSE) {
985 g_variant_unref(inner_iter);
986 g_variant_unref(child);
987 g_variant_unref(optional_param);
988 ERR("Fail to parse the properies");
991 g_variant_unref(inner_iter);
992 g_variant_unref(child);
993 g_variant_unref(optional_param);
997 g_variant_unref(inner_iter);
998 g_variant_unref(child);
1001 g_variant_unref(optional_param);
1006 void __bt_hal_handle_gatt_char_event(GVariant *parameters, const char *signal_name)
1010 if (signal_name == NULL)
1013 if (strcasecmp(signal_name, "GattValueChanged") == 0) {
1014 DBG("GattValueChanged event received");
1017 const char *char_handle = NULL;
1018 GVariant *char_value_var = NULL;
1020 char *char_value = NULL;
1022 g_variant_get(parameters, "(i&s@ay)", &result, &char_handle, &char_value_var);
1023 DBG("char handle: %s", char_handle);
1025 len = g_variant_get_size(char_value_var);
1027 char_value = (char *)g_variant_get_data(char_value_var);
1029 _bt_hal_handle_gattc_value_changed_event(result, char_handle, char_value, len);
1031 g_variant_unref(char_value_var);
1035 static void __bt_hal_handle_gatt_service_event(GVariant *parameters, const char *signal_name)
1037 if (signal_name == NULL)
1040 if (strcasecmp(signal_name, "GattServiceAdded") == 0) {
1042 g_variant_get(parameters, "(&s)", &path);
1043 _bt_hal_handle_gattc_service_changed_event(TRUE, path);
1047 static gboolean __bt_hal_event_manager(gpointer data)
1049 bt_hal_event_type_t bt_event = 0x00;
1051 char *obj_path = NULL;
1053 bt_hal_main_event_data_t *param = (bt_hal_main_event_data_t*)data;
1054 if (strcasecmp(param->signal_name, "InterfacesAdded") == 0) {
1056 /*TODO: Handle Interfaces Added Signal from stack */
1058 g_variant_get(param->parameters, "(&o@a{sa{sv}})", &obj_path, &value);
1060 if (obj_path == NULL) {
1061 ERR("obj_path is NULL");
1065 if (strcasecmp(obj_path, BT_HAL_BLUEZ_HCI_PATH) == 0) {
1066 /* TODO: Handle adapter added */
1067 DBG("Manager Event: Signal Name: InterfiacesAdded: Adapter added in bluetoothd: path [hci0]");
1069 bt_event = __bt_hal_parse_event(value);
1070 if (bt_event == BT_HAL_DEVICE_EVENT) {
1071 DBG("InterfacesAdded %s ", obj_path);
1072 __bt_hal_handle_device_event(value, param->parameters);
1073 } else if (bt_event == BT_HAL_AVRCP_CONTROL_EVENT) {
1074 DBG("InterfacesAdded %s ", obj_path);
1075 _bt_hal_set_control_device_path(obj_path);
1078 g_variant_unref(value);
1080 } else if (strcasecmp(param->signal_name, "InterfacesRemoved") == 0) {
1084 /*TODO: Handle Interfaces Removed Signal from stack */
1086 g_variant_get(param->parameters, "(&oas)", &obj_path, &iter);
1087 DBG("InterfacesRemoved %s ", obj_path);
1088 while (g_variant_iter_loop(iter, "s", &str)) {
1089 if (g_strcmp0(str, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0)
1090 _bt_hal_remove_control_device_path(obj_path);
1091 else if (g_strcmp0(str, BT_HAL_GATT_SERVICE_INTERFACE) == 0)
1092 _bt_hal_handle_gattc_service_changed_event(FALSE, obj_path);
1094 g_variant_iter_free(iter);
1095 } else if (strcasecmp(param->signal_name, "NameOwnerChanged") == 0) {
1097 char *previous = NULL;
1098 char *current = NULL;
1100 if (g_strcmp0(g_variant_get_type_string(param->parameters), "(sss)") != 0) {
1101 ERR("Invalid variant format");
1105 /* TODO: Handle Name Owener changed Signal */
1106 if (__bt_hal_get_owner_info(param->parameters, &name, &previous, ¤t)) {
1107 ERR("Fail to get the owner info");
1111 if (*current != '\0')
1117 if (strcasecmp(name, BT_HAL_BLUEZ_NAME) == 0) {
1118 struct hal_ev_adapter_state_changed ev;
1119 struct hal_ev_le_state_changed le_ev;
1121 INFO("Bluetoothd is terminated");
1123 /* Send the disable event in here */
1125 ev.state = HAL_POWER_OFF;
1126 le_ev.state = HAL_POWER_OFF;
1128 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
1129 event_cb(HAL_EV_LE_STATE_CHANGED, &le_ev, sizeof(le_ev));
1132 _bt_hal_destroy_adapter_agent();
1133 _bt_hal_le_deinit();
1135 } else if (g_strcmp0(param->interface_name, BT_HAL_PROPERTIES_INTERFACE) == 0) {
1136 __bt_hal_handle_property_changed_event(param->parameters, param->object_path);
1137 } else if (g_strcmp0(param->interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
1138 DBG("Manager Event: Interface Name: BT_HAL_ADAPTER_INTERFACE");
1139 _bt_hal_handle_adapter_event(param->parameters, param->signal_name);
1140 } else if (g_strcmp0(param->interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
1141 DBG("Manager Event: Interface Name: BT_HAL_INPUT_INTERFACE");
1142 __bt_hal_handle_input_event(param->parameters, param->object_path);
1143 } else if (g_strcmp0(param->interface_name, BT_HAL_NETWORK_SERVER_INTERFACE) == 0) {
1144 /* TODO: Handle Network Server events from stack */
1145 DBG("Manager Event: Interface Name: BT_HAL_NETWORK_SERVER_INTERFACE");
1146 } else if (g_strcmp0(param->interface_name, BT_HAL_HEADSET_INTERFACE) == 0) {
1147 DBG("Manager Event: Interface Name: BT_HAL_HEADSET_INTERFACE");
1148 __bt_hal_handle_headset_events(param->parameters, param->signal_name, param->object_path);
1149 } else if (g_strcmp0(param->interface_name, BT_HAL_SINK_INTERFACE) == 0) {
1150 /* TODO: Handle Sink interface events from stack */
1151 DBG("Manager Event: Interface Name:BT_HAL_SINK_INTERFACE");
1152 } else if (g_strcmp0(param->interface_name, BT_HAL_AGENT_INTERFACE) == 0) {
1153 /* TODO: Handle Agent events from stack */
1154 DBG("Manager Event: Interface Name:BT_HAL_AGENT_INTERFACE");
1155 } else if (g_strcmp0(param->interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
1156 DBG("Manager Event: Interface Name:BT_HAL_DEVICE_INTERFACE");
1157 __bt_hal_handle_device_specific_events(param->parameters, param->signal_name, param->object_path);
1158 } else if (g_strcmp0(param->interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
1159 DBG("Manager Event: Interface Name: BT_HAL_PLAYER_CONTROL_INTERFACE");
1160 __bt_hal_handle_avrcp_ctrl_events(param->parameters, param->signal_name, param->object_path);
1161 } else if (g_strcmp0(param->interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
1162 DBG("Manager Event: Interface Name: BT_HAL_MEDIATRANSPORT_INTERFACE");
1163 __bt_hal_handle_avrcp_transport_events(param->parameters, param->signal_name, param->object_path);
1164 } else if (g_strcmp0(param->interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
1165 DBG("Manager Event: Interface Name: BT_HAL_GATT_CHAR_INTERFACE");
1166 __bt_hal_handle_gatt_char_event(param->parameters, param->signal_name);
1167 } else if (g_strcmp0(param->interface_name, BT_HAL_GATT_SERVICE_INTERFACE) == 0) {
1168 DBG("Manager Event: Interface Name: BT_HAL_GATT_SERVICE_INTERFACE");
1169 __bt_hal_handle_gatt_service_event(param->parameters, param->signal_name);
1173 g_free(param->sender_name);
1174 g_free(param->object_path);
1175 g_free(param->interface_name);
1176 g_free(param->signal_name);
1177 g_variant_unref(param->parameters);
1182 static void __bt_hal_manager_event_filter(GDBusConnection *connection,
1183 const gchar *sender_name,
1184 const gchar *object_path,
1185 const gchar *interface_name,
1186 const gchar *signal_name,
1187 GVariant *parameters,
1190 if (signal_name == NULL)
1193 bt_hal_main_event_data_t *param = g_new0(bt_hal_main_event_data_t, 1);
1194 param->sender_name = g_strdup(sender_name);
1195 param->object_path = g_strdup(object_path);
1196 param->interface_name = g_strdup(interface_name);
1197 param->signal_name = g_strdup(signal_name);
1198 param->parameters = g_variant_ref(parameters);
1200 g_idle_add(__bt_hal_event_manager, (gpointer)param);
1204 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path)
1206 gboolean property_flag = FALSE;
1207 char *property = NULL;
1208 GVariant *value = NULL;
1209 g_variant_get(msg, "(sv)", &property, &value);
1211 if (property == NULL)
1214 DBG("Property = %s \n", property);
1215 /* We allow only 1 headset connection (HSP or HFP)*/
1216 if (strcasecmp(property, "Connected") == 0) {
1218 g_variant_get(value, "b", &property_flag);
1220 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1222 /* Fix : NULL_RETURNS */
1223 if (address == NULL)
1226 _bt_hal_convert_device_path_to_address(path, address);
1227 __bt_hal_send_hf_audio_connection_state_event(property_flag, address);
1229 } else if (strcasecmp(property, "State") == 0) {
1232 g_variant_get(value, "s", &state);
1234 /* This code assumes we support only 1 headset connection */
1235 /* Need to use the headset list, if we support multi-headsets */
1236 if (strcasecmp(state, "Playing") == 0) {
1237 DBG("Playing: Sco Connected");
1238 } else if (strcasecmp(state, "connected") == 0 ||
1239 strcasecmp(state, "disconnected") == 0) {
1240 if (strcasecmp(state, "connected") == 0)
1241 DBG("Sco Connected");
1243 DBG("Sco Disconnected");
1245 ERR("Not handled state - %s", state);
1250 } else if (strcasecmp(property, "SpeakerGain") == 0) {
1253 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1255 _bt_hal_convert_device_path_to_address(path, address);
1256 INFO("Speaker Gain for address [%s]", address);
1257 /* TODO Handle event sending to HAL */
1260 } else if (strcasecmp(property, "MicrophoneGain") == 0) {
1263 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1265 _bt_hal_convert_device_path_to_address(path, address);
1266 INFO("Microphone Gain for address [%s]", address);
1267 /* TODO Handle event sending to HAL */
1274 g_variant_unref(value);
1277 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn,
1283 static int subs_interface_added_id = -1;
1284 static int subs_interface_removed_id = -1;
1285 static int subs_name_owner_id = -1;
1286 static int subs_property_id = -1;
1287 static int subs_adapter_id = -1;
1290 if (subs_interface_added_id == -1) {
1291 subs_interface_added_id = g_dbus_connection_signal_subscribe(conn,
1292 NULL, BT_HAL_MANAGER_INTERFACE,
1293 BT_HAL_INTERFACES_ADDED, NULL, NULL, 0,
1294 __bt_hal_manager_event_filter,
1297 if (subs_interface_removed_id == -1) {
1298 subs_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
1299 NULL, BT_HAL_MANAGER_INTERFACE,
1300 BT_HAL_INTERFACES_REMOVED, NULL, NULL, 0,
1301 __bt_hal_manager_event_filter,
1304 if (subs_name_owner_id == -1) {
1305 subs_name_owner_id = g_dbus_connection_signal_subscribe(conn,
1306 NULL, BT_HAL_FREEDESKTOP_INTERFACE,
1307 BT_HAL_NAME_OWNER_CHANGED, NULL, NULL, 0,
1308 __bt_hal_manager_event_filter,
1311 if (subs_property_id == -1) {
1312 subs_property_id = g_dbus_connection_signal_subscribe(conn,
1313 NULL, BT_HAL_PROPERTIES_INTERFACE,
1314 BT_HAL_PROPERTIES_CHANGED, NULL, NULL, 0,
1315 __bt_hal_manager_event_filter,
1318 if (subs_adapter_id == -1) {
1319 subs_adapter_id = g_dbus_connection_signal_subscribe(conn,
1320 NULL, BT_HAL_ADAPTER_INTERFACE,
1321 NULL, NULL, NULL, 0,
1322 __bt_hal_manager_event_filter,
1326 if (subs_interface_added_id != -1) {
1327 g_dbus_connection_signal_unsubscribe(conn,
1328 subs_interface_added_id);
1329 subs_interface_added_id = -1;
1331 if (subs_interface_removed_id != -1) {
1332 g_dbus_connection_signal_unsubscribe(conn,
1333 subs_interface_removed_id);
1334 subs_interface_removed_id = -1;
1336 if (subs_name_owner_id != -1) {
1337 g_dbus_connection_signal_unsubscribe(conn,
1338 subs_name_owner_id);
1339 subs_name_owner_id = -1;
1341 if (subs_property_id != -1) {
1342 g_dbus_connection_signal_unsubscribe(conn,
1344 subs_property_id = -1;
1346 if (subs_adapter_id == -1) {
1347 g_dbus_connection_signal_unsubscribe(conn, subs_adapter_id);
1348 subs_adapter_id = -1;
1355 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn,
1358 static int subs_device_id = -1;
1364 if (subs_device_id == -1) {
1365 subs_device_id = g_dbus_connection_signal_subscribe(conn,
1366 NULL, BT_HAL_DEVICE_INTERFACE,
1367 NULL, NULL, NULL, 0,
1368 __bt_hal_manager_event_filter,
1372 if (subs_device_id != -1) {
1373 g_dbus_connection_signal_unsubscribe(conn,
1375 subs_device_id = -1;
1382 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe)
1384 static int subs_input_id = -1;
1390 if (subs_input_id == -1) {
1391 subs_input_id = g_dbus_connection_signal_subscribe(conn,
1392 NULL, BT_HAL_INPUT_INTERFACE,
1393 NULL, NULL, NULL, 0,
1394 __bt_hal_manager_event_filter,
1398 if (subs_input_id != -1) {
1399 g_dbus_connection_signal_unsubscribe(conn,
1408 static int __bt_hal_register_gatt_subscribe_signal(GDBusConnection *conn,
1411 static int subs_gatt_char_id = -1;
1412 static int subs_gatt_service_id = -1;
1415 if (subs_gatt_char_id == -1) {
1416 subs_gatt_char_id = g_dbus_connection_signal_subscribe(conn,
1417 NULL, BT_HAL_GATT_CHAR_INTERFACE,
1418 NULL, NULL, NULL, 0,
1419 __bt_hal_manager_event_filter,
1422 if (subs_gatt_service_id == -1) {
1423 subs_gatt_service_id = g_dbus_connection_signal_subscribe(conn,
1424 NULL, BT_HAL_GATT_SERVICE_INTERFACE,
1425 NULL, NULL, NULL, 0,
1426 __bt_hal_manager_event_filter,
1430 if (subs_gatt_char_id == -1) {
1431 g_dbus_connection_signal_unsubscribe(conn,
1433 subs_gatt_char_id = -1;
1435 if (subs_gatt_service_id == -1) {
1436 g_dbus_connection_signal_unsubscribe(conn,
1437 subs_gatt_service_id);
1438 subs_gatt_service_id = -1;
1442 return BT_HAL_ERROR_NONE;
1447 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type)
1450 return BT_HAL_ERROR_INTERNAL;
1452 /* TODO: Add more events in subsequent patches */
1453 switch (event_type) {
1454 case BT_HAL_MANAGER_EVENT:
1455 __bt_hal_register_manager_subscribe_signal(g_conn, TRUE);
1457 case BT_HAL_DEVICE_EVENT:
1458 __bt_hal_register_device_subscribe_signal(g_conn, TRUE);
1460 case BT_HAL_HID_EVENT:
1461 __bt_hal_register_input_subscribe_signal(g_conn, TRUE);
1463 case BT_HAL_HEADSET_EVENT:
1464 __bt_hal_register_audio_subscribe_signal(g_conn, TRUE);
1466 case BT_HAL_GATT_EVENT:
1467 __bt_hal_register_gatt_subscribe_signal(g_conn, TRUE);
1470 INFO_C("Register Event: event_type [%d]", event_type);
1471 return BT_HAL_ERROR_NOT_SUPPORT;
1474 return BT_HAL_ERROR_NONE;
1477 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn,
1483 static int subs_headset_id = -1;
1484 static int subs_sink_id = -1;
1487 if (subs_headset_id == -1) {
1488 subs_headset_id = g_dbus_connection_signal_subscribe(conn,
1489 NULL, BT_HAL_HEADSET_INTERFACE,
1490 NULL, NULL, NULL, 0,
1491 __bt_hal_manager_event_filter,
1494 if (subs_sink_id == -1) {
1495 subs_sink_id = g_dbus_connection_signal_subscribe(conn,
1496 NULL, BT_HAL_SINK_INTERFACE,
1497 NULL, NULL, NULL, 0,
1498 __bt_hal_manager_event_filter,
1502 if (subs_headset_id != -1) {
1503 g_dbus_connection_signal_unsubscribe(conn,
1505 subs_headset_id = -1;
1507 if (subs_sink_id != -1) {
1508 g_dbus_connection_signal_unsubscribe(conn,
1516 static int __bt_hal_initialize_manager_receiver(void)
1520 GError *error = NULL;
1522 if (manager_conn == NULL) {
1523 manager_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1524 if (error != NULL) {
1525 ERR_C("ERROR: Can't get on system bus [%s]", error->message);
1526 g_clear_error(&error);
1528 if (manager_conn == NULL)
1532 if (__bt_hal_register_service_event(manager_conn,
1533 BT_HAL_MANAGER_EVENT) != BT_HAL_ERROR_NONE)
1535 if (__bt_hal_register_service_event(manager_conn,
1536 BT_HAL_DEVICE_EVENT) != BT_HAL_ERROR_NONE)
1538 if (__bt_hal_register_service_event(manager_conn,
1539 BT_HAL_HID_EVENT) != BT_HAL_ERROR_NONE)
1541 if (__bt_hal_register_service_event(manager_conn,
1542 BT_HAL_HEADSET_EVENT) != BT_HAL_ERROR_NONE)
1544 if (__bt_hal_register_service_event(manager_conn,
1545 BT_HAL_GATT_EVENT) != BT_HAL_ERROR_NONE)
1547 return BT_HAL_ERROR_NONE;
1550 g_object_unref(manager_conn);
1551 manager_conn = NULL;
1554 return BT_HAL_ERROR_INTERNAL;
1557 /* To receive the event from bluez */
1558 int _bt_hal_initialize_event_receiver(handle_stack_msg cb)
1564 return BT_HAL_ERROR_INVALID_PARAM;
1566 result = __bt_hal_initialize_manager_receiver();
1568 DBG("Manager event receiver initialization result [%d]", result);
1569 if (result != BT_HAL_ERROR_NONE)
1572 /*TODO: Initialize Obexd Event receiver */
1574 /* Initialize event receiver for flight mode */
1575 _bt_hal_register_vconf_handler();
1579 return BT_HAL_ERROR_NONE;
1582 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path)
1584 GVariantIter value_iter;
1585 GVariant *value = NULL;
1587 g_variant_iter_init(&value_iter, msg);
1589 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
1590 if (!g_strcmp0(key, "Connected")) {
1591 guint connected = 0;
1592 g_variant_get(value, "i", &connected);
1593 INFO("Device property changed : Connected [%d]", connected);
1594 } else if (!g_strcmp0(key, "RSSI")) {
1595 DBG("Device property changed : RSSI");
1596 __bt_hal_dbus_device_found_properties(path);
1597 } else if (!g_strcmp0(key, "GattConnected")) {
1598 DBG("Device property changed : GattConnected");
1599 gboolean gatt_connected = FALSE;
1600 g_variant_get(value, "b", &gatt_connected);
1601 char *address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1602 _bt_hal_convert_device_path_to_address(path, address);
1603 DBG("@@gatt_connected: %d", gatt_connected);
1604 DBG("@@address: %s", address);
1605 _bt_hal_gatt_connected_state_event(gatt_connected, address);
1606 _bt_hal_handle_gattc_connected_event(address, gatt_connected);
1608 } else if (!g_strcmp0(key, "Paired")) {
1609 gboolean paired = FALSE;
1610 struct hal_ev_bond_state_changed ev;
1611 char address[BT_HAL_ADDRESS_STRING_SIZE];
1613 g_variant_get(value, "b", &paired);
1614 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1616 _bt_hal_agent_set_canceled(FALSE);
1617 _bt_hal_convert_device_path_to_address(path, address);
1619 /* Prepare to send event to HAL bluetooth */
1620 ev.status = BT_STATUS_SUCCESS;
1621 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1622 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1625 ERR("Bluetooth HAL event handler not registered");
1627 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
1628 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1630 } else if (!g_strcmp0(key, "LegacyPaired")) {
1631 DBG("Device property changed : LegacyPaired");
1632 } else if (!g_strcmp0(key, "Trusted")) {
1633 DBG("Device property changed : Trusted");
1634 gboolean trusted = FALSE;
1635 gchar *address = NULL;
1636 g_variant_get(value, "b", &trusted);
1637 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1639 _bt_hal_convert_device_path_to_address(path, address);
1640 DBG("Device [%s] trusted: [%d]", address, trusted);
1642 __bt_hal_send_device_trust_state_event(trusted, address);
1644 } else if (!g_strcmp0(key, "IpspConnected")) {
1645 DBG("Device property changed : IpspConnected");
1646 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
1647 DBG("Device property changed : IpspInitStateChanged");
1648 } else if (!g_strcmp0(key, "TrustedProfiles")) {
1650 char address[BT_HAL_ADDRESS_STRING_SIZE];
1652 g_variant_get(value, "u", &trust_val);
1653 _bt_hal_convert_device_path_to_address(path, address);
1654 DBG("Address: %s, TrustedProfiles: 0x%X", address, trust_val);
1655 __bt_hal_send_device_trusted_profile_changed_event(trust_val, address);
1657 DBG("Unhandled Property:[%s]", key);
1662 static void __bt_hal_dbus_device_found_properties(const char *device_path)
1665 GError *error = NULL;
1666 GDBusProxy *device_proxy;
1667 GDBusConnection *conn;
1671 ERR("Invalid device path");
1675 conn = _bt_hal_get_system_gconn();
1677 ERR("_bt_hal_get_system_gconn failed");
1681 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1685 BT_HAL_PROPERTIES_INTERFACE,
1688 if (!device_proxy) {
1689 ERR("Error creating device_proxy");
1693 result = g_dbus_proxy_call_sync(device_proxy,
1695 g_variant_new("(s)", BT_HAL_DEVICE_INTERFACE),
1696 G_DBUS_CALL_FLAGS_NONE,
1701 ERR("Error occured in Proxy call");
1702 if (error != NULL) {
1703 ERR("Error occured in Proxy call (Error: %s)", error->message);
1704 g_clear_error(&error);
1706 g_object_unref(device_proxy);
1710 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1711 _bt_hal_convert_device_path_to_address(device_path, address);
1713 __bt_hal_device_properties_lookup(result, address);
1715 g_object_unref(device_proxy);
1719 static void __bt_hal_device_properties_lookup(GVariant *result, char *address)
1721 /* Buffer and propety count management */
1722 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
1723 struct hal_ev_device_found *ev = (void *) buf;
1725 memset(buf, 0, sizeof(buf));
1729 GVariant *tmp_value;
1732 gchar *manufacturer_data = NULL;
1735 if (result != NULL) {
1736 g_variant_get(result , "(@a{sv})", &value);
1737 g_variant_unref(result);
1740 tmp_value = g_variant_lookup_value(value, "Alias", G_VARIANT_TYPE_STRING);
1742 g_variant_get(tmp_value, "s", &name);
1744 g_variant_unref(tmp_value);
1746 DBG_SECURE("Alias Name [%s]", name);
1747 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1748 strlen(name) + 1, name);
1750 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1753 tmp_value = g_variant_lookup_value(value, "Name", G_VARIANT_TYPE_STRING);
1754 g_variant_get(tmp_value, "s", &name);
1755 g_variant_unref(tmp_value);
1757 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1758 strlen(name) + 1, name);
1760 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1761 g_variant_get(tmp_value, "s", &name);
1765 tmp_value = g_variant_lookup_value(value, "Class", G_VARIANT_TYPE_UINT32);
1766 unsigned int class = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1767 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
1768 sizeof(unsigned int), &class);
1771 g_variant_unref(tmp_value);
1775 tmp_value = g_variant_lookup_value(value, "Connected", G_VARIANT_TYPE_BOOLEAN);
1776 unsigned int connected = tmp_value ? g_variant_get_boolean(tmp_value) : 0;
1777 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
1778 sizeof(unsigned int), &connected);
1780 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
1782 g_variant_unref(tmp_value);
1785 tmp_value = g_variant_lookup_value(value, "Trusted", G_VARIANT_TYPE_BOOLEAN);
1786 uint8_t trust = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1787 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
1788 sizeof(uint8_t), &trust);
1790 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
1792 g_variant_unref(tmp_value);
1795 tmp_value = g_variant_lookup_value(value, "Paired", G_VARIANT_TYPE_BOOLEAN);
1796 uint8_t paired = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1798 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
1799 sizeof(uint8_t), &paired);
1801 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
1803 g_variant_unref(tmp_value);
1806 tmp_value = g_variant_lookup_value(value, "RSSI", G_VARIANT_TYPE_INT32);
1807 int rssi = tmp_value ? g_variant_get_int32(tmp_value) : 0;
1808 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
1809 sizeof(int), &rssi);
1811 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
1813 g_variant_unref(tmp_value);
1815 /* Last Addr Type */
1816 tmp_value = g_variant_lookup_value(value, "LastAddrType", G_VARIANT_TYPE_UINT32);
1817 unsigned int addr_type = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1819 g_variant_unref(tmp_value);
1820 DBG("Device Last Address Type [0x%x]", addr_type);
1823 tmp_value = g_variant_lookup_value(value, "IsAliasSet", G_VARIANT_TYPE_UINT32);
1824 uint8_t is_alias_set = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1825 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
1826 sizeof(uint8_t), &is_alias_set);
1828 DBG("IsAliasSet: [%s], Property num [%d]", (is_alias_set ? "TRUE" : "FALSE"), ev->num_props);
1830 g_variant_unref(tmp_value);
1833 tmp_value = g_variant_lookup_value(value, "UUIDs", G_VARIANT_TYPE_STRING_ARRAY);
1834 gsize uuid_count = g_variant_get_size(tmp_value);
1835 char **uuid_value = g_variant_dup_strv(tmp_value, &uuid_count);
1837 /* UUID collection */
1842 int num_props_tmp = ev->num_props;
1844 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
1846 for (i = 0; uuid_value[i] != NULL; i++) {
1848 char *uuid_str = NULL;
1849 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
1850 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
1852 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
1853 uuid_str = g_strdup(uuid_value[i]);
1854 DBG("UUID string [%s]\n", uuid_str);
1856 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
1858 for (z = 0; z < 16; z++)
1859 DBG("[0x%x]", uuid[z]);
1862 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
1866 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
1867 (BT_HAL_STACK_UUID_SIZE * uuid_count),
1869 ev->num_props = num_props_tmp + 1;
1872 g_variant_unref(tmp_value);
1874 /* LegacyManufacturerDataLen */
1875 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerDataLen", G_VARIANT_TYPE_UINT32);
1876 unsigned int manufacturer_data_len = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1877 if (manufacturer_data_len > BT_HAL_MANUFACTURER_DATA_LENGTH_MAX) {
1878 ERR("manufacturer_data_len is too long(len = %d)", manufacturer_data_len);
1879 manufacturer_data_len = BT_HAL_MANUFACTURER_DATA_LENGTH_MAX;
1882 g_variant_unref(tmp_value);
1883 /*size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA_LEN,
1884 sizeof(unsigned int), &manufacturer_data_len);
1886 DBG("Device Legacy Manufacturer data length [%u]", manufacturer_data_len);
1888 /* ManufacturerData */
1889 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerData", G_VARIANT_TYPE_BYTESTRING);
1890 manufacturer_data = value ? (gchar *)g_variant_get_bytestring(tmp_value) : NULL;
1891 if (manufacturer_data) {
1892 if (manufacturer_data_len > 0) {
1893 //size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA,
1894 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_BLE_ADV_DATA,
1895 manufacturer_data_len, manufacturer_data);
1900 g_variant_unref(tmp_value);
1904 _bt_hal_convert_addr_string_to_type(bdaddr, address);
1905 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
1906 sizeof(bdaddr), bdaddr);
1908 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
1911 g_variant_unref(value);
1913 ERR("result is NULL\n");
1916 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
1917 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
1921 static void __bt_hal_send_device_acl_connection_state_event(int status, gboolean connected, const char *address)
1924 struct hal_ev_acl_state_changed ev;
1927 ev.state = (connected == TRUE) ?
1928 HAL_ACL_STATE_CONNECTED :
1929 HAL_ACL_STATE_DISCONNECTED;
1931 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1934 ERR("Bluetooth HAL event handler not registered");
1936 event_cb(HAL_EV_ACL_STATE_CHANGED, &ev, sizeof(ev));
1939 static void __bt_hal_send_device_le_connection_state_event(int status, gboolean connected, const char *address)
1942 struct hal_ev_le_conn_state_changed ev;
1945 ev.state = (connected == TRUE) ?
1946 HAL_LE_STATE_CONNECTED :
1947 HAL_LE_STATE_DISCONNECTED;
1949 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1952 ERR("Bluetooth HAL event handler not registered");
1954 event_cb(HAL_EV_LE_CONN_STATE_CHANGED, &ev, sizeof(ev));
1957 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted,
1958 const char *address)
1960 struct hal_ev_device_trust_state_changed ev;
1963 ev.trust = (is_trusted == TRUE) ?
1964 HAL_DEVICE_TRUSTED :
1965 HAL_DEVICE_UNTRUSTED;
1967 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1970 ERR("Bluetooth HAL event handler not registered");
1972 event_cb(HAL_EV_DEVICE_TRUST_CHANGED, &ev, sizeof(ev));
1975 static void __bt_hal_send_device_trusted_profile_changed_event(
1976 uint32_t trust_val, const char *address)
1978 struct hal_ev_device_trusted_profiles_changed ev;
1981 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1982 ev.trust_val = trust_val;
1985 ERR("Bluetooth HAL event handler not registered");
1987 event_cb(HAL_EV_DEVICE_TRUSTED_PROFILES_CHANGED, &ev, sizeof(ev));
1990 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member,
1994 const char *property = NULL;
1998 if (strcasecmp(member, "PropertyChanged") == 0) {
1999 g_variant_get(msg, "(s)", &property);
2000 if (property == NULL)
2002 if (strcasecmp(property, "GattConnected") == 0) {
2003 INFO("GATT Connected");
2004 gboolean connected = FALSE;
2006 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2008 _bt_hal_convert_device_path_to_address(path, address);
2009 g_variant_get(msg, "(b)", &connected);
2011 INFO("Connected device address[%s] connnected[%d]", address, connected);
2013 } else if (strcasecmp(property, "Paired") == 0) {
2014 gboolean paired = FALSE;
2015 struct hal_ev_bond_state_changed ev;
2016 char address[BT_HAL_ADDRESS_STRING_SIZE];
2018 g_variant_get(msg, "(b)", &paired);
2019 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
2021 _bt_hal_agent_set_canceled(FALSE);
2022 _bt_hal_convert_device_path_to_address(path, address);
2024 /* Prepare to send event to HAL bluetooth */
2025 ev.status = BT_STATUS_SUCCESS;
2026 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
2027 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2030 ERR("Bluetooth HAL event handler not registered");
2032 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
2033 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
2035 } else if (strcasecmp(property, "UUIDs") == 0) {
2038 } else if (strcasecmp(member, "DeviceConnected") == 0) {
2039 unsigned char addr_type = 0;
2041 g_variant_get(msg, "(y)", &addr_type);
2043 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2044 _bt_hal_convert_device_path_to_address(path, address);
2046 DBG("Member: [%s]", member);
2047 ERR_C("### Connected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
2049 __bt_hal_send_device_acl_connection_state_event(BT_STATUS_SUCCESS, TRUE, address);
2051 __bt_hal_send_device_le_connection_state_event(BT_STATUS_SUCCESS, TRUE, address);
2053 } else if (strcasecmp(member, "Disconnected") == 0) {
2054 unsigned char disc_reason = 0;
2055 unsigned char addr_type = 0;
2058 g_variant_get(msg, "(yy&s)", &addr_type, &disc_reason, &name);
2060 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2061 _bt_hal_convert_device_path_to_address(path, address);
2063 ERR_C("### Disconnected [%s] [%d : %s] [%s] [%s]", !addr_type ? "BREDR" : "LE",
2064 disc_reason, _bt_hal_convert_disc_reason_to_string(disc_reason), address, name);
2067 __bt_hal_send_device_acl_connection_state_event(_bt_hal_convert_disc_reason_to_status(disc_reason), FALSE, address);
2069 __bt_hal_send_device_le_connection_state_event(_bt_hal_convert_disc_reason_to_status(disc_reason), FALSE, address);
2071 } else if (strcasecmp(member, "ProfileStateChanged") == 0) {
2073 char *profile_uuid = NULL;
2075 g_variant_get(msg, "(si)", &profile_uuid, &state);
2076 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2077 _bt_hal_convert_device_path_to_address(path, address);
2079 DBG("[%s] %s, state %d", address, profile_uuid, state);
2080 if (strncmp(profile_uuid, HID_UUID, strlen(HID_UUID)) == 0) {
2081 DBG("HID Host Profile state: %d", state);
2082 if (state == BT_HAL_PROFILE_STATE_CONNECTED)
2083 __bt_hal_send_hid_connection_state_event(TRUE, address);
2084 else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED)
2085 __bt_hal_send_hid_connection_state_event(FALSE, address);
2087 DBG("HID Host Profile state: Invalid");
2088 } else if (strcmp(profile_uuid, HID_DEVICE_UUID) == 0) {
2089 DBG("HID Device Profile state: %d", state);
2090 if (state == BT_HAL_PROFILE_STATE_CONNECTED)
2091 __bt_hal_send_hid_device_connection_state_event(TRUE, address);
2092 else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED)
2093 __bt_hal_send_hid_device_connection_state_event(FALSE, address);
2095 DBG("HID Device Profile state: Invalid");
2096 } else if ((strcmp(profile_uuid, A2DP_SINK_UUID) == 0)) {
2097 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2098 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTED");
2099 __bt_hal_send_av_connection_state_event(TRUE, address);
2100 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2101 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2102 __bt_hal_send_av_connection_state_event(FALSE, address);
2103 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2104 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2105 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2106 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTING");
2108 ERR("A2DP Profile state: Invalid");
2110 } else if ((strcmp(profile_uuid, A2DP_SOURCE_UUID) == 0)) {
2111 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2112 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
2113 __bt_hal_send_a2dp_sink_connection_state_event(TRUE, address);
2114 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2115 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
2116 __bt_hal_send_a2dp_sink_connection_state_event(FALSE, address);
2117 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2118 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
2119 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2120 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
2122 } else if (strcmp(profile_uuid, HFP_HF_UUID) == 0) {
2123 if (state == BT_HAL_PROFILE_STATE_CONNECTING)
2124 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTING");
2125 else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2126 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTED");
2127 __bt_hal_send_hf_connection_state_event(TRUE, address);
2128 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2129 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2130 __bt_hal_send_hf_connection_state_event(FALSE, address);
2131 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2132 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2134 ERR("HFP Profile state: Invalid");
2136 } else if (strcmp(profile_uuid, HFP_AG_UUID) == 0) {
2137 if (state == BT_HAL_PROFILE_STATE_CONNECTING)
2138 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_CONNECTING");
2139 else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2140 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_CONNECTED");
2141 __bt_hal_send_hf_client_connection_state_event(TRUE, address);
2142 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2143 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2144 __bt_hal_send_hf_client_connection_state_event(FALSE, address);
2145 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2146 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2148 ERR("HFP Client Profile state: Invalid");
2150 } else if ((strcmp(profile_uuid, AVRCP_TARGET_UUID) == 0)) {
2151 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2152 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
2153 __bt_hal_send_avrcp_ctrl_connection_state_event(TRUE, address);
2154 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2155 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
2156 __bt_hal_send_avrcp_ctrl_connection_state_event(FALSE, address);
2157 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2158 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
2159 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2160 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
2163 DBG("Profile[%s] State changed status [%d] ", profile_uuid, state);
2166 g_free(profile_uuid);
2167 } else if (strcasecmp(member, "AttMtuChanged") == 0) {
2171 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2173 DBG("Member: [%s]", member);
2175 _bt_hal_convert_device_path_to_address(path, address);
2176 g_variant_get(msg, "(q)", &mtu);
2178 __bt_hal_handle_gatts_mtu_changed_event(address, mtu);
2181 } else if (strcasecmp(member, "AdvReport") == 0) {
2182 __bt_hal_handle_adv_report(msg, path);
2186 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path)
2188 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
2189 struct hal_ev_gatt_client_scan_result *ev = (void *)buf;
2191 char *address = NULL;
2192 GVariant *value = NULL;
2193 char *buffer = NULL;
2196 uint8_t addr_type = 0;
2197 uint8_t adv_type = 0;
2203 memset(buf, 0, sizeof(buf));
2206 g_variant_get(msg, "(&syyii@ay)", &address, &addr_type,
2207 &adv_type, &rssi, &data_len, &value);
2209 buffer_len = g_variant_get_size(value);
2211 buffer = (char *)g_variant_get_data(value);
2213 if (data_len != buffer_len) {
2214 ERR("Unexpected: buffer_len: %d, data_len: %d",
2215 buffer_len, data_len);
2216 data_len = buffer_len;
2219 DBG("Address: %s, len: %d, rssi: %d, addr_type: 0x%02X, adv_type: 0x%02X",
2220 address, data_len, rssi, addr_type, adv_type);
2222 _bt_hal_convert_addr_string_to_type(ev->bd_addr, address);
2223 ev->addr_type = addr_type;
2224 ev->adv_type = adv_type;
2227 memcpy(ev->adv_data, buffer, data_len);
2230 gatt_event_cb(HAL_EV_GATT_CLIENT_SCAN_RESULT, buf, size);
2231 g_variant_unref(value);
2234 static void __bt_hal_handle_gatts_mtu_changed_event(char *address, int mtu)
2236 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
2237 struct hal_ev_gatt_server_mtu_changed *ev = (void *)buf;
2243 memset(buf, 0, sizeof(buf));
2246 DBG("Address: %s, mtu: %d", address, mtu);
2248 ev->conn_id = _bt_get_remote_gatt_client_conn_id(address);
2251 DBG("Send GATT server mtu changed event to HAL, size: [%zd]", size);
2252 gatt_event_cb(HAL_EV_GATT_SERVER_MTU_CHANGED, buf, size);
2255 /* AVRCP Controller Role(Remote:AVRCP Target) Events */
2256 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address)
2259 struct hal_ev_avrcp_ctrl_conn_state ev;
2261 if (connected == TRUE)
2262 INFO("AVRCP(Controller) Profile Connected for address [%s]", address);
2264 INFO("AVRCP(Controller) Profile DisConnected for address [%s]", address);
2266 if (connected == TRUE)
2267 ev.state = HAL_AVRCP_CTRL_STATE_CONNECTED;
2269 ev.state = HAL_AVRCP_CTRL_STATE_DISCONNECTED;
2270 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2272 if (!avrcp_ctrl_event_cb)
2273 ERR("AVRCP controller handler not registered");
2275 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_CONN_STATE, &ev, sizeof(ev));
2278 static int __bt_media_attr_to_type(const char *str)
2280 if (!strcasecmp(str, "Equalizer"))
2281 return HAL_PLAYER_ATTR_EQUALIZER;
2282 else if (!strcasecmp(str, "Repeat"))
2283 return HAL_PLAYER_ATTR_REPEAT;
2284 else if (!strcasecmp(str, "Shuffle"))
2285 return HAL_PLAYER_ATTR_SHUFFLE;
2286 else if (!strcasecmp(str, "Scan"))
2287 return HAL_PLAYER_ATTR_SCAN;
2293 static int __bt_hal_play_status_str_to_type(const char *value)
2295 if (!strcmp(value, "stopped"))
2296 return HAL_PLAYSTATE_STOPPED;
2297 else if (!strcmp(value, "playing"))
2298 return HAL_PLAYSTATE_PLAYING;
2299 else if (!strcmp(value, "paused"))
2300 return HAL_PLAYSTATE_PAUSED;
2301 else if (!strcmp(value, "forward-seek"))
2302 return HAL_PLAYSTATE_FWD_SEEK;
2303 else if (!strcmp(value, "reverse-seek"))
2304 return HAL_PLAYSTATE_REV_SEEK;
2306 return HAL_PLAYSTATE_ERROR;
2309 static void __bt_avrcp_control_parse_properties(struct hal_ev_track_changed *ev, GVariant *item)
2311 GVariant *value = NULL;
2313 char *value_string = NULL;
2314 const char *key = NULL;
2320 g_variant_iter_init(&iter, item);
2321 while (g_variant_iter_loop(&iter, "{sv}", &key, &value)) {
2322 if (strcasecmp(key, "Title") == 0) {
2323 value_string = (char *)g_variant_get_string(value, NULL);
2324 DBG("Value : %s ", value_string);
2325 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TITLE;
2326 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2328 } else if (strcasecmp(key, "Artist") == 0) {
2329 value_string = (char *)g_variant_get_string(value, NULL);
2330 DBG("Value : %s ", value_string);
2331 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ARTIST;
2332 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2334 } else if (strcasecmp(key, "Album") == 0) {
2335 value_string = (char *)g_variant_get_string(value, NULL);
2336 DBG("Value : %s ", value_string);
2337 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ALBUM;
2338 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2340 } else if (strcasecmp(key, "Genre") == 0) {
2341 value_string = (char *)g_variant_get_string(value, NULL);
2342 DBG("Value : %s ", value_string);
2343 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_GENRE;
2344 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2346 } else if (strcasecmp(key, "Duration") == 0) {
2349 val = g_variant_get_uint32(value);
2350 DBG("Value : %li", val);
2351 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_PLAYING_TIME;
2352 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2354 } else if (strcasecmp(key, "NumberOfTracks") == 0) {
2357 val = g_variant_get_uint32(value);
2358 DBG("Value : %li", val);
2359 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_NUM_TRACKS;
2360 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2362 } else if (strcasecmp(key, "TrackNumber") == 0) {
2365 val = g_variant_get_uint32(value);
2366 DBG("Value : %li", val);
2367 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TRACK_NUM;
2368 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2371 DBG("%s not supported, ignoring", key);
2374 if (i >= HAL_MAX_ATTR_NUM) {
2375 ERR(" Received max attribute [%d]", i);
2384 static int __bt_media_attrval_to_val(int type, const char *value)
2389 case HAL_PLAYER_ATTR_EQUALIZER:
2390 if (!strcmp(value, "off"))
2395 case HAL_PLAYER_ATTR_REPEAT:
2396 if (!strcmp(value, "off"))
2397 ret = BTRC_PLAYER_VAL_OFF_REPEAT;
2398 else if (!strcmp(value, "singletrack"))
2399 ret = BTRC_PLAYER_VAL_SINGLE_REPEAT;
2400 else if (!strcmp(value, "alltracks"))
2401 ret = BTRC_PLAYER_VAL_ALL_REPEAT;
2403 ret = BTRC_PLAYER_VAL_GROUP_REPEAT;
2405 case HAL_PLAYER_ATTR_SHUFFLE:
2406 if (!strcmp(value, "off"))
2407 ret = BTRC_PLAYER_VAL_OFF_SHUFFLE;
2408 else if (!strcmp(value, "alltracks"))
2409 ret = BTRC_PLAYER_VAL_ALL_SHUFFLE;
2411 ret = BTRC_PLAYER_VAL_GROUP_SHUFFLE;
2413 case HAL_PLAYER_ATTR_SCAN:
2414 if (!strcmp(value, "off"))
2416 else if (!strcmp(value, "alltracks"))
2422 ERR("Value not handled");
2428 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member,
2431 const char *property = NULL;
2432 GVariant *value = NULL;
2434 char address[BT_HAL_ADDRESS_STRING_SIZE];
2437 ERR("Error returned in method call\n");
2441 if (!avrcp_ctrl_event_cb) {
2442 ERR("AVRCP controller DBUS handler callback not registered");
2446 g_variant_iter_init(&iter, msg);
2448 _bt_hal_convert_device_path_to_address(path, address);
2450 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2451 DBG("Property = %s \n", property);
2452 if ((strcasecmp(property, "Equalizer") == 0) ||
2453 (strcasecmp(property, "Repeat") == 0) ||
2454 (strcasecmp(property, "Shuffle") == 0) ||
2455 (strcasecmp(property, "Scan") == 0)) {
2456 struct hal_ev_player_setting ev;
2460 valstr = g_variant_get_string(value, NULL);
2461 DBG("Value : %s ", valstr);
2464 val = __bt_media_attrval_to_val(__bt_media_attr_to_type(property), valstr);
2467 memset(&ev, 0, sizeof(ev));
2468 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2470 ev.attr_ids[0] = __bt_media_attr_to_type(property);
2471 ev.attr_values[0] = val;
2473 /* Send event to application */
2474 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAYER_APP_SETTING_CHANGED, &ev, sizeof(ev));
2476 } else if ((strcasecmp(property, "Status") == 0)) {
2477 struct hal_ev_play_status_changed ev;
2480 valstr = g_variant_get_string(value, NULL);
2481 DBG("Value : %s ", valstr);
2483 memset(&ev, 0, sizeof(ev));
2484 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2486 ev.status = __bt_hal_play_status_str_to_type(valstr);
2488 /* Send event to application */
2489 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_STATUS_CHANGED, &ev, sizeof(ev));
2491 } else if (strcasecmp(property, "Position") == 0) {
2492 struct hal_ev_play_position ev;
2494 memset(&ev, 0, sizeof(ev));
2495 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2496 ev.pos = g_variant_get_uint32(value);
2497 DBG("Value : %d ", ev.pos);
2499 /* Send event to application */
2500 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_POSITION_CHANGED, &ev, sizeof(ev));
2501 } else if (strcasecmp(property, "Track") == 0) {
2502 struct hal_ev_track_changed ev;
2504 memset(&ev, 0, sizeof(ev));
2505 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2506 __bt_avrcp_control_parse_properties(&ev, value);
2508 /* Send event to application */
2509 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_TRACK_CHANGED, &ev, sizeof(ev));
2511 DBG("Property not handled");
2515 g_free((char *)property);
2516 g_variant_unref(value);
2519 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member,
2522 const char *property = NULL;
2523 GVariant *value = NULL;
2525 char address[BT_HAL_ADDRESS_STRING_SIZE];
2529 ERR("Error returned in method call\n");
2533 if (!avrcp_tg_event_cb) {
2534 ERR("AVRCP target DBUS handler callback not registered");
2538 g_variant_iter_init(&iter, msg);
2540 _bt_hal_convert_device_path_to_address(path, address);
2542 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2543 DBG("Property = %s \n", property);
2544 if ((strcasecmp(property, "Delay") == 0)) {
2545 struct hal_ev_avrcp_tg_delay_changed ev;
2548 memset(&ev, 0, sizeof(ev));
2549 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2551 val = g_variant_get_uint16(value);
2552 DBG("Value : %d", val);
2555 /* Send event to application */
2556 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_DELAY_CHANGE, &ev, sizeof(ev));
2558 DBG("Property not handled");
2562 g_free((char *)property);
2563 g_variant_unref(value);
2566 /* A2DP Src Role(Remote:Sink) Events */
2567 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address)
2569 struct hal_ev_a2dp_conn_state ev;
2571 if (connected == TRUE)
2572 INFO("A2DP(Src) Profile Connected for address [%s]", address);
2574 INFO("A2DP(Src) Profile DisConnected for address [%s]", address);
2576 ev.state = (connected == TRUE) ?
2577 HAL_EV_A2DP_STATE_CONNECTED :
2578 HAL_EV_A2DP_STATE_DISCONNECTED;
2580 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2583 ERR("AV event handler not registered");
2585 av_event_cb(HAL_EV_A2DP_CONN_STATE, &ev, sizeof(ev));
2588 /* A2DP Sink Role(Remote:Source) Events */
2589 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address)
2591 struct hal_ev_a2dp_conn_state ev;
2593 if (connected == TRUE)
2594 INFO("A2DP(Sink) Profile Connected for address [%s]", address);
2596 INFO("A2DP(Sink) Profile DisConnected for address [%s]", address);
2598 ev.state = (connected == TRUE) ?
2599 HAL_EV_A2DP_STATE_CONNECTED :
2600 HAL_EV_A2DP_STATE_DISCONNECTED;
2602 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2604 if (!a2dp_sink_event_cb)
2605 ERR("AV event handler not registered");
2607 a2dp_sink_event_cb(HAL_EV_A2DP_SOURCE_CONN_STATE, &ev, sizeof(ev));
2610 /* HF(AG Role) Audio Events */
2611 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected,
2612 const char *address)
2614 struct hal_ev_handsfree_audio_state ev;
2616 if (connected == TRUE)
2617 INFO("AG Audio Connected for address [%s]", address);
2619 INFO("AG Audio DisConnected for address [%s]", address);
2621 ev.state = (connected == TRUE) ?
2622 HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTED :
2623 HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED;
2625 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2628 ERR("HF event handler not registered");
2630 hf_event_cb(HAL_EV_HANDSFREE_AUDIO_STATE, &ev, sizeof(ev));
2633 /* HF(AG Role) Profile Events */
2634 static void __bt_hal_send_hf_connection_state_event(gboolean connected,
2635 const char *address)
2637 struct hal_ev_handsfree_conn_state ev;
2639 if (connected == TRUE)
2640 INFO("AG Profile Connected for address [%s]", address);
2642 INFO("AG Profile DisConnected for address [%s]", address);
2644 ev.state = (connected == TRUE) ?
2645 HAL_EV_HANDSFREE_CONN_STATE_CONNECTED :
2646 HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTED;
2648 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2651 ERR("HF event handler not registered");
2653 hf_event_cb(HAL_EV_HANDSFREE_CONN_STATE, &ev, sizeof(ev));
2656 /* HF(Client Role) Profile Events */
2657 static void __bt_hal_send_hf_client_connection_state_event(gboolean connected,
2658 const char *address)
2660 struct hal_ev_hf_client_conn_state ev;
2662 if (connected == TRUE)
2663 INFO("HF Client Profile Connected for address [%s]", address);
2665 INFO("HF Client Profile DisConnected for address [%s]", address);
2667 ev.state = (connected == TRUE) ?
2668 HAL_EV_HF_CLIENT_CONN_STATE_CONNECTED :
2669 HAL_EV_HF_CLIENT_CONN_STATE_DISCONNECTED;
2671 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2673 if (!hf_client_event_cb)
2674 ERR("HF Client event handler not registered");
2676 hf_client_event_cb(HAL_EV_HF_CLIENT_CONN_STATE, &ev, sizeof(ev));
2679 void _bt_hal_register_event_handler_cb(bt_hal_module_e module, handle_stack_msg cb)
2686 hid_device_event_cb = cb;
2692 a2dp_sink_event_cb = cb;
2698 hf_client_event_cb = cb;
2701 avrcp_tg_event_cb = cb;
2703 case HAL_AVRCP_CTRL:
2704 avrcp_ctrl_event_cb = cb;
2710 ERR("Unknown module: %d", module);
2714 void _bt_hal_unregister_event_handler_cb(bt_hal_module_e module)
2718 hid_event_cb = NULL;
2724 a2dp_sink_event_cb = NULL;
2730 hf_client_event_cb = NULL;
2733 avrcp_tg_event_cb = NULL;
2735 case HAL_AVRCP_CTRL:
2736 avrcp_ctrl_event_cb = NULL;
2739 gatt_event_cb = NULL;
2742 ERR("Unknown module: %d", module);
2746 bool _bt_hal_get_adapter_request_state(void)
2748 return is_adapter_activating;
2751 bool _bt_hal_get_le_request_state(void)
2753 return is_le_activating;
2756 void _bt_hal_set_adapter_request_state(bool enable)
2758 DBG("set_adapter_request_state %d", enable);
2759 is_adapter_activating = enable;
2762 void _bt_hal_set_le_request_state(bool enable)
2764 DBG("set_le_request_state %d", enable);
2765 is_le_activating = enable;