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 avrcp_ctrl_event_cb = NULL;
59 static handle_stack_msg avrcp_tg_event_cb = NULL;
60 static handle_stack_msg gatt_event_cb = NULL;
61 static guint event_id;
63 /*State Management sepration Control for Adapter and LE */
64 static gboolean is_adapter_activating = FALSE;
65 static gboolean is_le_activating = FALSE;
70 gchar* interface_name;
73 } bt_hal_main_event_data_t;
75 /* Forward declarations */
76 static gboolean __bt_hal_event_manager(gpointer param);
77 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type);
78 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn, int subscribe);
79 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn, int subscribe);
80 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe);
82 static int __bt_hal_parse_event(GVariant *msg);
83 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current);
85 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path);
86 static void __bt_hal_adapter_property_changed_event(GVariant *msg);
87 static void __bt_hal_manager_event_filter(GDBusConnection *connection, const gchar *sender_name,
88 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
89 GVariant *parameters, gpointer user_data);
90 static int __bt_hal_initialize_manager_receiver(void);
91 static gboolean __bt_hal_parse_interface(GVariant *msg);
92 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters);
93 static gboolean __bt_hal_parse_device_properties(GVariant *item);
94 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data);
95 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path);
96 static void __bt_hal_dbus_device_found_properties(const char *device_path);
97 static void __bt_hal_device_properties_lookup(GVariant *result, char *address);
98 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member, const char *path);
99 static void __bt_hal_send_device_acl_connection_state_event(int status, gboolean connected, const char *address);
100 static void __bt_hal_handle_input_event(GVariant *msg, const char *path);
101 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address);
102 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address);
103 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address);
104 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member, const char *path);
105 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member, const char *path);
107 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted, const char *address);
108 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn, int subscribe);
109 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path);
110 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected, const char *address);
111 static void __bt_hal_send_hf_connection_state_event(gboolean connected, const char *address);
112 static void __bt_hal_send_device_trusted_profile_changed_event(uint32_t trust_val, const char *address);
113 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path);
115 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data)
119 struct hal_ev_discovery_state_changed ev;
120 ev.state = HAL_DISCOVERY_STATE_STOPPED;
121 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
127 static int __bt_hal_parse_event(GVariant *msg)
131 char *interface_name = NULL;
132 GVariant *inner_iter = NULL;
134 g_variant_iter_init(&iter, msg);
136 while ((child = g_variant_iter_next_value(&iter))) {
137 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
138 if (g_strcmp0(interface_name,
139 BT_HAL_DEVICE_INTERFACE) == 0) {
140 DBG("__bt_hal_parse_event: Interface: BT_HAL_DEVICE_INTERFACE");
141 g_variant_unref(inner_iter);
142 g_variant_unref(child);
143 return BT_HAL_DEVICE_EVENT;
144 } else if (g_strcmp0(interface_name,
145 BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
146 DBG("__bt_hal_parse_event: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
147 g_variant_unref(inner_iter);
148 g_variant_unref(child);
149 return BT_HAL_MEDIA_TRANSFER_EVENT;
150 } else if (g_strcmp0(interface_name,
151 BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
152 DBG("__bt_hal_parse_event: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
153 g_variant_unref(inner_iter);
154 g_variant_unref(child);
155 return BT_HAL_AVRCP_CONTROL_EVENT;
157 g_variant_unref(inner_iter);
158 g_variant_unref(child);
164 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current)
166 g_variant_get(msg, "(sss)", name, previous, current);
167 return BT_HAL_ERROR_NONE;
170 int __bt_insert_hal_properties(void *buf, uint8_t type, uint16_t len, const void *val)
171 { struct hal_property *prop = buf;
177 memcpy(prop->val, val, len);
179 return sizeof(*prop) + len;
182 handle_stack_msg _bt_hal_get_stack_message_handler(void)
187 static void __bt_hal_adapter_property_changed_event(GVariant *msg)
189 GVariantIter value_iter;
190 GVariant *value = NULL;
191 GDBusProxy *adapter_proxy;
194 g_variant_iter_init(&value_iter, msg);
196 /* Buffer and propety count management */
197 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
198 struct hal_ev_adapter_props_changed *ev = (void*) buf;
200 const gchar *address = NULL;
202 unsigned int cod = 0;
203 gboolean discoverable;
204 gboolean connectable;
205 unsigned int scan_mode = BT_SCAN_MODE_NONE;
206 unsigned int disc_timeout;
207 const gchar *version;
208 gboolean ipsp_initialized;
211 unsigned int pairable_timeout;
212 gboolean scan_mode_property_update = FALSE;
213 gboolean is_discovering;
214 gboolean is_le_discovering;
216 memset(buf, 0, sizeof(buf));
219 ev->status = BT_STATUS_SUCCESS;
223 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
224 if (!g_strcmp0(key, "Address")) {
227 address = g_variant_get_string(value, NULL);
228 DBG("##Address [%s]", address);
229 _bt_hal_convert_addr_string_to_type(bdaddr, address);
230 size += __bt_insert_hal_properties(buf + size,
231 HAL_PROP_ADAPTER_ADDR, sizeof(bdaddr), bdaddr);
233 } else if (!g_strcmp0(key, "Alias")) {
234 g_variant_get(value, "&s", &name);
235 DBG("##Alias [%s] ", name);
236 size += __bt_insert_hal_properties(buf + size,
237 HAL_PROP_ADAPTER_NAME, strlen(name) + 1, name);
239 } else if (!g_strcmp0(key, "Class")) {
240 cod = g_variant_get_uint32(value);
241 DBG("##Class [%d]", cod);
242 size += __bt_insert_hal_properties(buf + size,
243 HAL_PROP_ADAPTER_CLASS, sizeof(unsigned int), &cod);
245 } else if (!g_strcmp0(key, "Discoverable")) {
246 discoverable = g_variant_get_boolean(value);
247 DBG("##Discoverable [%d]", discoverable);
249 scan_mode = BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE;
251 scan_mode = BT_SCAN_MODE_CONNECTABLE;
252 scan_mode_property_update = TRUE;
253 } else if (!g_strcmp0(key, "DiscoverableTimeout")) {
254 disc_timeout = g_variant_get_uint32(value);
255 DBG("##Discoverable Timeout [%d]", disc_timeout);
256 size += __bt_insert_hal_properties(buf + size,
257 HAL_PROP_ADAPTER_DISC_TIMEOUT, sizeof(unsigned int), &disc_timeout);
259 } else if (!g_strcmp0(key, "Connectable")) {
260 connectable = g_variant_get_boolean(value);
261 DBG("##Connectable [%d]", connectable);
263 scan_mode = BT_SCAN_MODE_NONE;
264 else if (scan_mode == BT_SCAN_MODE_NONE)
265 scan_mode = BT_SCAN_MODE_CONNECTABLE;
266 scan_mode_property_update = TRUE;
267 } else if (!g_strcmp0(key, "Version")) {
268 version = g_variant_get_string(value, NULL);
269 DBG("##Version [%s]", version);
270 size += __bt_insert_hal_properties(buf + size,
271 HAL_PROP_ADAPTER_VERSION, strlen(version) + 1, version);
273 } else if (!g_strcmp0(key, "Name")) {
274 g_variant_get(value, "&s", &name);
275 DBG("##Name [%s]", name);
276 size += __bt_insert_hal_properties(buf + size,
277 HAL_PROP_ADAPTER_NAME, strlen(name) + 1, name);
279 } else if (!g_strcmp0(key, "Powered")) {
280 powered = g_variant_get_boolean(value);
281 DBG("##Powered = %d", powered);
282 /* TODO: Need to check this operation!! */
283 if (powered == FALSE) {
284 DBG("###### Adapter Powered Down ######");
285 struct hal_ev_adapter_state_changed ev;
286 ev.state = HAL_POWER_OFF;
287 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
289 struct hal_ev_le_state_changed le_ev;
290 le_ev.state = HAL_POWER_OFF;
291 event_cb(HAL_EV_LE_STATE_CHANGED, &le_ev, sizeof(le_ev));
294 _bt_hal_destroy_adapter_agent();
296 DBG("###### Adapter Powered Up ######");
297 if (_bt_hal_get_adapter_request_state()) {
298 DBG("Sending STATE CHANGE EVENT for Adapter... ");
299 _bt_hal_set_adapter_request_state(FALSE);
300 struct hal_ev_adapter_state_changed ev;
301 ev.state = HAL_POWER_ON;
302 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
305 if (_bt_hal_get_le_request_state()) {
306 DBG("Sending STATE CHANGE EVENT for LE... ");
307 _bt_hal_set_le_request_state(FALSE);
308 struct hal_ev_le_state_changed ev;
309 ev.state = HAL_POWER_ON;
310 event_cb(HAL_EV_LE_STATE_CHANGED, &ev, sizeof(ev));
314 _bt_hal_initialize_adapter_agent();
317 } else if (!g_strcmp0(key, "Pairable")) {
318 pairable = g_variant_get_boolean(value);
319 DBG("##Pairable [%d]", pairable);
320 } else if (!g_strcmp0(key, "PairableTimeout")) {
321 pairable_timeout = g_variant_get_uint32(value);
322 DBG("##Pairable Timeout = %d", pairable_timeout);
323 } else if (!g_strcmp0(key, "UUIDs")) {
328 size1 = g_variant_get_size(value);
329 int num_props_tmp = ev->num_props;
331 uuid_value = (char **)g_variant_get_strv(value, &size1);
332 for (i = 0; uuid_value[i] != NULL; i++)
334 /* UUID collection */
335 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
336 for (i = 0; uuid_value[i] != NULL; i++) {
337 char *uuid_str = NULL;
338 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
339 uuid_str = g_strdup(uuid_value[i]);
340 DBG("##UUID string [%s]\n", uuid_str);
341 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
342 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
345 size += __bt_insert_hal_properties(buf + size, HAL_PROP_ADAPTER_UUIDS,
346 (BT_HAL_STACK_UUID_SIZE * uuid_count),
348 ev->num_props = num_props_tmp + 1;
351 } else if (!g_strcmp0(key, "Discovering")) {
352 is_discovering = g_variant_get_boolean(value);
353 DBG("##Discovering = [%d]", is_discovering);
355 if (is_discovering == FALSE) {
356 DBG("###### Adapter Has stopped Discovering ######");
357 /* In Tizen Bluez, this actually does not mean Discovery is stopped
358 in Bluez. Tizen Bluez sends this event after a certain timeout,
359 Therefore, we must forecefully call StopDiscovery to stop discovery in BlueZ */
363 adapter_proxy = _bt_hal_get_adapter_proxy();
365 if (adapter_proxy == NULL)
368 /* Need to stop searching */
369 DBG("Event though Bluez reported DIscovering stopped, we force stop Discovery ");
370 g_dbus_proxy_call_sync(adapter_proxy, "StopDiscovery",
372 G_DBUS_CALL_FLAGS_NONE,
376 ERR("Dbus Error : %s", err->message);
378 /* This error is thrown by Bluez, as Discovery is already stopped.
379 Discovery is stopped if user cancels on going discovery.
380 In order to maintain correct state of Bluetooth Discovery state,
381 simply send Discovery stopped event to HAL user */
382 struct hal_ev_discovery_state_changed ev;
383 ev.state = HAL_DISCOVERY_STATE_STOPPED;
384 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
389 event_id = g_timeout_add(BT_HAL_DISCOVERY_FINISHED_DELAY,
390 (GSourceFunc)__bt_hal_discovery_finished_cb, NULL);
394 DBG("###### Adapter Has started Discovering ######");
395 struct hal_ev_discovery_state_changed ev;
396 ev.state = HAL_DISCOVERY_STATE_STARTED;
397 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
400 } else if (!g_strcmp0(key, "LEDiscovering")) {
403 is_le_discovering = g_variant_get_boolean(value);
404 DBG("##LE Discovering = [%d]", is_le_discovering);
406 if (is_le_discovering)
409 adapter_proxy = _bt_hal_get_adapter_proxy();
410 if (adapter_proxy == NULL) {
411 ERR("adapter_proxy == NULL");
415 /* Need to stop searching */
416 result = g_dbus_proxy_call_sync(adapter_proxy, "StopLEDiscovery",
417 NULL, G_DBUS_CALL_FLAGS_NONE,
418 DBUS_TIMEOUT, NULL, &err);
420 ERR("Error occured in Proxy call");
422 ERR("(Error: %s)", err->message);
427 g_variant_unref(result);
428 } else if (!g_strcmp0(key, "Modalias")) {
429 char *modalias = NULL;
430 g_variant_get(value, "s", &modalias);
431 DBG("##Adapter ModAlias [%s]", modalias);
432 } else if (!g_strcmp0(key, "SupportedLEFeatures")) {
433 DBG("##LE Supported features");
436 GVariantIter *iter = NULL;
437 g_variant_get(value, "as", &iter);
438 bt_local_le_features_t le_features;
439 gboolean le_features_present = FALSE;
444 memset(&le_features, 0x00, sizeof(le_features));
446 while (g_variant_iter_next(iter, "&s", &name) &&
447 g_variant_iter_next(iter, "&s", &val)) {
448 DBG("name = %s, Value = %s", name, val);
449 if (FALSE == _bt_hal_update_le_feature_support(name, val, &le_features))
450 ERR("Failed to update LE feature (name = %s, value = %s)", name, val);
452 le_features_present = TRUE;
455 g_variant_iter_free(iter);
456 if (le_features_present) {
457 size += __bt_insert_hal_properties(buf + size,
458 HAL_PROP_ADAPTER_LOCAL_LE_FEAT, sizeof(le_features), &le_features);
461 DBG("le supported features values are NOT provided by Stack");
463 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
464 g_variant_get(value, "b" , &ipsp_initialized);
465 DBG("##IPSP Initialized = %d", ipsp_initialized);
467 ERR("Unhandled Property:[%s]", key);
471 if (scan_mode_property_update) {
472 size += __bt_insert_hal_properties(buf + size,
473 HAL_PROP_ADAPTER_SCAN_MODE, sizeof(int), &scan_mode);
479 DBG("Send Adapter properties changed event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
480 event_cb(HAL_EV_ADAPTER_PROPS_CHANGED, buf, size);
486 static void __bt_hal_flight_ps_mode_cb(keynode_t *node, void *data)
488 gboolean flight_mode = FALSE;
490 DBG_SECURE("HAL callback hit");
491 DBG_SECURE("key=%s", vconf_keynode_get_name(node));
492 type = vconf_keynode_get_type(node);
493 if (type == VCONF_TYPE_BOOL) {
494 flight_mode = vconf_keynode_get_bool(node);
495 if (flight_mode != TRUE) {
496 ERR("Ignore the event");
500 ERR("Flight Mode == TRUE");
503 ERR("Invaild vconf key type : %d", type);
506 DBG("Enabling core now");
507 _bt_hal_enable_core();
510 static void _bt_hal_register_vconf_handler(void)
514 if (vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
515 (vconf_callback_fn)__bt_hal_flight_ps_mode_cb, NULL) < 0)
516 ERR("Unable to register key handler");
517 DBG("Telephony is disabled");
518 if (vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE,
519 (vconf_callback_fn)__bt_hal_flight_ps_mode_cb, NULL) < 0)
520 ERR("Unable to register key handler");
523 void _bt_hal_handle_adapter_event(GVariant *msg, const char *member)
530 if (strcasecmp(member, "DeviceCreated") == 0) {
531 DBG("DeviceCreated: Unhandled");
532 } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
533 DBG("InterfacesRemoved: Unhandled");
534 } else if (strcasecmp(member, "AdvertisingEnabled") == 0) {
535 DBG("AdvertisingEnabled");
536 DBG("Advertising Enabled");
538 gboolean status = FALSE;
539 g_variant_get(msg, "(ib)", &slot_id, &status);
540 DBG("Advertising Enabled : slot_id [%d] status [%d]", slot_id, status);
541 /* Send event to application */
542 _bt_hal_set_advertising_status(slot_id, status);
543 } else if (strcasecmp(member, "RssiEnabled") == 0) {
544 struct hal_ev_rssi_monitor_state_changed ev;
545 gboolean status = FALSE;
546 char *address = NULL;
549 g_variant_get(msg, "(sib)", &address, &link_type, &status);
550 DBG("RSSI monitoring %s for %s",
551 (status ? "Enabled" : "Disabled"), address);
553 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
554 ev.link_type = link_type;
555 ev.state = (status ? HAL_RSSI_MONITORING_ENABLED : HAL_RSSI_MONITORING_DISABLED);
557 ERR("event_cb is NULL");
559 event_cb(HAL_EV_RSSI_MONITOR_STATE_CHANGED, &ev, sizeof(ev));
562 } else if (strcasecmp(member, "RssiAlert") == 0) {
563 struct hal_ev_rssi_alert_recieved ev;
567 char *address = NULL;
569 g_variant_get(msg, "(siii)", &address, &link_type, &alert_type, &rssi_dbm);
570 DBG("RSSI Alert: [Address %s LinkType %d] [Type %d DBM %d]",
571 address, alert_type, rssi_dbm, link_type);
573 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
574 ev.link_type = link_type;
575 ev.alert_type = alert_type;
579 ERR("event_cb is NULL");
581 event_cb(HAL_EV_RSSI_ALERT_RECIEVED, &ev, sizeof(ev));
584 } else if (strcasecmp(member, "RawRssi") == 0) {
585 struct hal_ev_raw_rssi_recieved ev;
588 char *address = NULL;
590 g_variant_get(msg, "(sii)", &address, &link_type, &rssi_dbm);
591 DBG("Raw RSSI: [Address %s] [Link Type %d][RSSI DBM %d]",
592 address, link_type, rssi_dbm);
594 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
595 ev.link_type = link_type;
599 ERR("event_cb is NULL");
601 event_cb(HAL_EV_RAW_RSSI_RECIEVED, &ev, sizeof(ev));
604 } else if (strcasecmp(member, BT_HAL_HARDWARE_ERROR) == 0) {
605 DBG("BT Hardware Error: Unhandled");
606 } else if (strcasecmp(member, BT_HAL_TX_TIMEOUT_ERROR) == 0) {
607 DBG("BT TX Timeout Error: Unhandled");
613 static gboolean __bt_hal_parse_device_properties(GVariant *item)
623 /* Buffer and propety count management */
624 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
625 struct hal_ev_device_found *ev = (void *) buf;
627 memset(buf, 0, sizeof(buf));
631 g_variant_iter_init(&iter, item);
632 while (g_variant_iter_loop(&iter, "{sv}", &key, &val)) {
634 if (strcasecmp(key, "Address") == 0) {
636 char * address = NULL;
637 address = g_variant_dup_string(val, &len);
639 _bt_hal_convert_addr_string_to_type(bdaddr, address);
641 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
642 sizeof(bdaddr), bdaddr);
645 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
647 } else if (strcasecmp(key, "Class") == 0) {
648 unsigned int class = g_variant_get_uint32(val);
649 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
650 sizeof(unsigned int), &class);
652 DBG("Device class [%d] Property num [%d]", class, ev->num_props);
653 } else if (strcasecmp(key, "name") == 0) {
654 char *name = g_variant_dup_string(val, &len);
656 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
657 strlen(name) + 1, name);
659 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
662 } else if (strcasecmp(key, "Connected") == 0) {
663 unsigned int connected = g_variant_get_byte(val);
665 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
666 sizeof(unsigned int), &connected);
668 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
669 } else if (strcasecmp(key, "paired") == 0) {
670 uint8_t paired = (g_variant_get_boolean(val) ? 1 : 0);
671 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
672 sizeof(uint8_t), &paired);
674 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
675 } else if (strcasecmp(key, "Trusted") == 0) {
676 uint8_t trust = (g_variant_get_boolean(val) ? 1 : 0);
677 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
678 sizeof(uint8_t), &trust);
680 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
681 } else if (strcasecmp(key, "RSSI") == 0) {
682 int rssi = g_variant_get_int16(val);
683 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
686 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
687 } else if (strcasecmp(key, "LastAddrType") == 0) {
688 /* TODO: To be handled later*/
689 } else if (!g_strcmp0(key, "IsAliasSet")) {
690 uint8_t is_alias_set = (g_variant_get_boolean(val) ? 1 : 0);
691 DBG("IsAliasSet: %s", (is_alias_set ? "TRUE" : "FALSE"));
692 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
693 sizeof(uint8_t), &is_alias_set);
695 } else if (strcasecmp(key, "UUIDs") == 0) {
700 size1 = g_variant_get_size(val);
701 DBG("UUID count from size [%zu]\n", size1);
702 int num_props_tmp = ev->num_props;
705 uuid_value = (char **)g_variant_get_strv(val, &size1);
706 for (i = 0; uuid_value[i] != NULL; i++)
708 DBG("UUID count [%d]\n", uuid_count);
709 /* UUID collection */
710 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
712 for (i = 0; uuid_value[i] != NULL; i++) {
714 char *uuid_str = NULL;
715 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
716 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
718 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
719 uuid_str = g_strdup(uuid_value[i]);
720 DBG("UUID string [%s]\n", uuid_str);
721 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
722 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
726 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
727 (BT_HAL_STACK_UUID_SIZE * uuid_count),
729 ev->num_props = num_props_tmp + 1;
733 } else if (strcasecmp(key, "LegacyManufacturerDataLen") == 0) {
734 /* TODO: To be handled later*/
735 } else if (strcasecmp(key, "LegacyManufacturerData") == 0) {
736 /* TODO: To be handled later*/
738 ERR("Unhandled Property:[%s]", key);
744 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
745 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
751 static void __bt_hal_handle_avrcp_tg_events(GVariant *msg, const char *path)
754 GVariantIter value_iter;
755 char *property = NULL;
757 GVariant *val = NULL;
758 GVariant *child = NULL;
760 g_variant_iter_init(&value_iter, msg);
761 while ((child = g_variant_iter_next_value(&value_iter))) {
762 g_variant_get(child, "{sv}", &property, &val);
763 INFO("Property %s", property);
764 if (strcasecmp(property, "Connected") == 0) {
765 struct hal_ev_avrcp_tg_conn_state ev;
767 gboolean connected = FALSE;
769 g_variant_get(val, "b", &connected);
771 state = connected ? HAL_AVRCP_TG_STATE_CONNECTED :
772 HAL_AVRCP_TG_STATE_DISCONNECTED;
774 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
776 _bt_hal_convert_device_path_to_address(path, address);
778 DBG("connected: %d", connected);
779 DBG("address: %s", address);
781 /* Prepare to send AVRCP Target connection state event */
782 memset(&ev, 0, sizeof(ev));
783 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
785 if (!avrcp_tg_event_cb)
786 ERR("AVRCP target DBUS handler callback not registered");
788 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_CONN_STATE, (void *)&ev, sizeof(ev));
792 g_variant_unref(child);
793 g_variant_unref(val);
799 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path)
801 char *interface_name = NULL;
802 GVariant *val = NULL;
805 g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, &val, NULL);
807 if (!interface_name) {
808 DBG("Failed to get interface name");
811 g_variant_unref(val);
815 if (strcasecmp(interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
816 DBG("Event: Property Changed: Interface: BT_HAL_ADAPTER_INTERFACE");
817 __bt_hal_adapter_property_changed_event(val);
818 } else if (strcasecmp(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
819 DBG("Event: Property Changed: Interface: BT_HAL_DEVICE_INTERFACE");
820 __bt_hal_device_property_changed_event(val, object_path);
821 } else if (strcasecmp(interface_name, BT_HAL_OBEX_TRANSFER_INTERFACE) == 0) {
822 DBG("Event: Property Changed: Interface: BT_HAL_OBEX_TRANSFER_INTERFACE");
823 /* TODO: Handle event */
824 } else if (strcasecmp(interface_name, BT_HAL_MEDIA_CONTROL_INTERFACE) == 0) {
825 DBG("Event: Property Changed: Interface: BT_HAL_MEDIA_CONTROL_INTERFACE");
826 /* Handle AVRCP target event */
827 __bt_hal_handle_avrcp_tg_events(val, object_path);
828 } else if (strcasecmp(interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
829 DBG("Event: Property Changed: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
830 __bt_hal_handle_avrcp_ctrl_events(val, NULL, object_path);
831 } else if (strcasecmp(interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
832 DBG("Event: Property Changed: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
833 __bt_hal_handle_avrcp_transport_events(val, NULL, object_path);
834 } else if (strcasecmp(interface_name, BT_HAL_NETWORK_CLIENT_INTERFACE) == 0) {
835 DBG("Event: Property Changed: Interface: BT_HAL_NETWORK_CLIENT_INTERFACE");
836 /* TODO: Handle event */
837 } else if (strcasecmp(interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
838 DBG("Event: Property Changed: Interface: BT_HAL_GATT_CHAR_INTERFACE");
839 /* TODO: Handle event */
840 } else if (strcasecmp(interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
841 DBG("Event: Property Changed: Interface: BT_HAL_INPUT_INTERFACE");
842 __bt_hal_handle_input_event(val, object_path);
844 g_variant_unref(val);
847 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters)
851 if (__bt_hal_parse_interface(parameters) == FALSE) {
852 ERR("Fail to parse the properies");
853 g_variant_unref(value);
860 static void __bt_hal_send_hid_connection_state_event(
861 gboolean connected, char *address)
863 struct hal_ev_hidhost_conn_state ev;
865 ev.state = (connected == TRUE) ?
866 HAL_HIDHOST_STATE_CONNECTED :
867 HAL_HIDHOST_STATE_DISCONNECTED;
869 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
872 ERR("HID event handler not registered");
874 hid_event_cb(HAL_EV_HIDHOST_CONN_STATE, &ev, sizeof(ev));
877 static void __bt_hal_handle_input_event(GVariant *msg, const char *path)
879 gboolean property_flag = FALSE;
880 GVariantIter value_iter;
881 char *property = NULL;
882 GVariant *child = NULL, *val = NULL;
885 g_variant_iter_init(&value_iter, msg);
886 while ((child = g_variant_iter_next_value(&value_iter))) {
887 g_variant_get(child, "{sv}", &property, &val);
889 if (property == NULL)
892 if (strcasecmp(property, "Connected") == 0) {
895 g_variant_get(val, "b", &property_flag);
896 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
897 _bt_hal_convert_device_path_to_address(path, address);
898 __bt_hal_send_hid_connection_state_event(property_flag, address);
902 g_variant_unref(val);
903 g_variant_unref(child);
909 static gboolean __bt_hal_parse_interface(GVariant *msg)
912 GVariant *optional_param;
915 char *interface_name = NULL;
916 GVariant *inner_iter = NULL;
917 g_variant_get(msg, "(&o@a{sa{sv}})",
918 &path, &optional_param);
919 g_variant_iter_init(&iter, optional_param);
921 while ((child = g_variant_iter_next_value(&iter))) {
922 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
923 if (g_strcmp0(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
924 DBG("Found a device: %s", path);
925 if (__bt_hal_parse_device_properties(inner_iter) == FALSE) {
926 g_variant_unref(inner_iter);
927 g_variant_unref(child);
928 g_variant_unref(optional_param);
929 ERR("Fail to parse the properies");
932 g_variant_unref(inner_iter);
933 g_variant_unref(child);
934 g_variant_unref(optional_param);
938 g_variant_unref(inner_iter);
939 g_variant_unref(child);
942 g_variant_unref(optional_param);
947 void __bt_hal_handle_gatt_char_event(GVariant *parameters, const char *signal_name)
951 if (signal_name == NULL)
954 if (strcasecmp(signal_name, "GattValueChanged") == 0) {
955 DBG("GattValueChanged event received");
958 const char *char_handle = NULL;
959 GVariant *char_value_var = NULL;
961 char *char_value = NULL;
963 g_variant_get(parameters, "(i&s@ay)", &result, &char_handle, &char_value_var);
964 DBG("char handle: %s", char_handle);
966 len = g_variant_get_size(char_value_var);
968 char_value = (char *)g_variant_get_data(char_value_var);
970 _bt_hal_handle_gattc_value_changed_event(result, char_handle, char_value, len);
972 g_variant_unref(char_value_var);
977 static gboolean __bt_hal_event_manager(gpointer data)
979 bt_hal_event_type_t bt_event = 0x00;
981 char *obj_path = NULL;
983 bt_hal_main_event_data_t *param = (bt_hal_main_event_data_t*)data;
984 if (strcasecmp(param->signal_name, "InterfacesAdded") == 0) {
986 /*TODO: Handle Interfaces Added Signal from stack */
987 DBG("Manager Event: Signal Name: InterfacesAdded");
989 g_variant_get(param->parameters, "(&o@a{sa{sv}})", &obj_path, &value);
991 if (obj_path == NULL) {
992 DBG("obj_path is NULL");
996 if (strcasecmp(obj_path, BT_HAL_BLUEZ_HCI_PATH) == 0) {
997 /* TODO: Handle adapter added */
998 DBG("Manager Event: Signal Name: InterfiacesAdded: Adapter added in bluetoothd: path [hci0]");
1000 bt_event = __bt_hal_parse_event(value);
1001 if (bt_event == BT_HAL_DEVICE_EVENT) {
1002 DBG("Device path : %s ", obj_path);
1003 __bt_hal_handle_device_event(value, param->parameters);
1004 } else if (bt_event == BT_HAL_AVRCP_CONTROL_EVENT) {
1005 DBG("Device path : %s ", obj_path);
1006 _bt_hal_set_control_device_path(obj_path);
1009 g_variant_unref(value);
1011 } else if (strcasecmp(param->signal_name, "InterfacesRemoved") == 0) {
1015 /*TODO: Handle Interfaces Removed Signal from stack */
1016 DBG("Manager Event: Signal Name: InterfacesRemoved");
1018 g_variant_get(param->parameters, "(&oas)", &obj_path, &iter);
1019 DBG("Device path : %s ", obj_path);
1020 while (g_variant_iter_loop(iter, "s", &str)) {
1021 if (g_strcmp0(str, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0)
1022 _bt_hal_remove_control_device_path(obj_path);
1024 g_variant_iter_free(iter);
1025 } else if (strcasecmp(param->signal_name, "NameOwnerChanged") == 0) {
1027 char *previous = NULL;
1028 char *current = NULL;
1030 /* TODO: Handle Name Owener changed Signal */
1031 if (__bt_hal_get_owner_info(param->parameters, &name, &previous, ¤t)) {
1032 DBG("Fail to get the owner info");
1035 if (current && *current != '\0') {
1041 if (strcasecmp(name, BT_HAL_BLUEZ_NAME) == 0) {
1042 DBG("Bluetoothd is terminated");
1044 /* TODO: Handle Bluetoothd terminating scenario */
1045 _bt_hal_le_deinit();
1047 INFO("Name Owner changed [%s]", name);
1052 } else if (g_strcmp0(param->interface_name, BT_HAL_PROPERTIES_INTERFACE) == 0) {
1053 DBG("Manager Event: Interface Name: BT_HAL_PROPERTIES_INTERFACE");
1054 __bt_hal_handle_property_changed_event(param->parameters, param->object_path);
1055 } else if (g_strcmp0(param->interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
1056 DBG("Manager Event: Interface Name: BT_HAL_ADAPTER_INTERFACE");
1057 _bt_hal_handle_adapter_event(param->parameters, param->signal_name);
1058 } else if (g_strcmp0(param->interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
1059 DBG("Manager Event: Interface Name: BT_HAL_INPUT_INTERFACE");
1060 __bt_hal_handle_input_event(param->parameters, param->object_path);
1061 } else if (g_strcmp0(param->interface_name, BT_HAL_NETWORK_SERVER_INTERFACE) == 0) {
1062 /* TODO: Handle Network Server events from stack */
1063 DBG("Manager Event: Interface Name: BT_HAL_NETWORK_SERVER_INTERFACE");
1064 } else if (g_strcmp0(param->interface_name, BT_HAL_HEADSET_INTERFACE) == 0) {
1065 DBG("Manager Event: Interface Name: BT_HAL_HEADSET_INTERFACE");
1066 __bt_hal_handle_headset_events(param->parameters, param->signal_name, param->object_path);
1067 } else if (g_strcmp0(param->interface_name, BT_HAL_SINK_INTERFACE) == 0) {
1068 /* TODO: Handle Sink interface events from stack */
1069 DBG("Manager Event: Interface Name:BT_HAL_SINK_INTERFACE");
1070 } else if (g_strcmp0(param->interface_name, BT_HAL_AGENT_INTERFACE) == 0) {
1071 /* TODO: Handle Agent events from stack */
1072 DBG("Manager Event: Interface Name:BT_HAL_AGENT_INTERFACE");
1073 } else if (g_strcmp0(param->interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
1074 DBG("Manager Event: Interface Name:BT_HAL_DEVICE_INTERFACE");
1075 __bt_hal_handle_device_specific_events(param->parameters, param->signal_name, param->object_path);
1076 } else if (g_strcmp0(param->interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
1077 DBG("Manager Event: Interface Name: BT_HAL_PLAYER_CONTROL_INTERFACE");
1078 __bt_hal_handle_avrcp_ctrl_events(param->parameters, param->signal_name, param->object_path);
1079 } else if (g_strcmp0(param->interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
1080 DBG("Manager Event: Interface Name: BT_HAL_MEDIATRANSPORT_INTERFACE");
1081 __bt_hal_handle_avrcp_transport_events(param->parameters, param->signal_name, param->object_path);
1082 } else if (g_strcmp0(param->interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
1083 DBG("Manager Event: Interface Name: BT_HAL_GATT_CHAR_INTERFACE");
1084 __bt_hal_handle_gatt_char_event(param->parameters, param->signal_name);
1089 g_free(param->sender_name);
1090 g_free(param->object_path);
1091 g_free(param->interface_name);
1092 g_free(param->signal_name);
1093 g_variant_unref(param->parameters);
1098 static void __bt_hal_manager_event_filter(GDBusConnection *connection,
1099 const gchar *sender_name,
1100 const gchar *object_path,
1101 const gchar *interface_name,
1102 const gchar *signal_name,
1103 GVariant *parameters,
1106 if (signal_name == NULL)
1109 bt_hal_main_event_data_t *param = g_new0(bt_hal_main_event_data_t, 1);
1110 param->sender_name = g_strdup(sender_name);
1111 param->object_path = g_strdup(object_path);
1112 param->interface_name = g_strdup(interface_name);
1113 param->signal_name = g_strdup(signal_name);
1114 param->parameters = g_variant_ref(parameters);
1116 g_idle_add(__bt_hal_event_manager, (gpointer)param);
1120 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path)
1122 gboolean property_flag = FALSE;
1123 char *property = NULL;
1124 GVariant *value = NULL;
1125 g_variant_get(msg, "(sv)", &property, &value);
1127 if (property == NULL)
1130 DBG("Property = %s \n", property);
1131 /* We allow only 1 headset connection (HSP or HFP)*/
1132 if (strcasecmp(property, "Connected") == 0) {
1134 g_variant_get(value, "b", &property_flag);
1136 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1138 /* Fix : NULL_RETURNS */
1139 if (address == NULL)
1142 _bt_hal_convert_device_path_to_address(path, address);
1143 __bt_hal_send_hf_audio_connection_state_event(property_flag, address);
1145 } else if (strcasecmp(property, "State") == 0) {
1148 g_variant_get(value, "s", &state);
1150 /* This code assumes we support only 1 headset connection */
1151 /* Need to use the headset list, if we support multi-headsets */
1152 if (strcasecmp(state, "Playing") == 0) {
1153 DBG("Playing: Sco Connected");
1154 } else if (strcasecmp(state, "connected") == 0 ||
1155 strcasecmp(state, "disconnected") == 0) {
1156 if (strcasecmp(state, "connected") == 0)
1157 DBG("Sco Connected");
1159 DBG("Sco Disconnected");
1161 ERR("Not handled state - %s", state);
1166 } else if (strcasecmp(property, "SpeakerGain") == 0) {
1169 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1171 _bt_hal_convert_device_path_to_address(path, address);
1172 INFO("Speaker Gain for address [%s]", address);
1173 /* TODO Handle event sending to HAL */
1176 } else if (strcasecmp(property, "MicrophoneGain") == 0) {
1179 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1181 _bt_hal_convert_device_path_to_address(path, address);
1182 INFO("Microphone Gain for address [%s]", address);
1183 /* TODO Handle event sending to HAL */
1190 g_variant_unref(value);
1193 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn,
1199 static int subs_interface_added_id = -1;
1200 static int subs_interface_removed_id = -1;
1201 static int subs_name_owner_id = -1;
1202 static int subs_property_id = -1;
1203 static int subs_adapter_id = -1;
1208 if (subs_interface_added_id == -1) {
1209 subs_interface_added_id = g_dbus_connection_signal_subscribe(conn,
1210 NULL, BT_HAL_MANAGER_INTERFACE,
1211 BT_HAL_INTERFACES_ADDED, NULL, NULL, 0,
1212 __bt_hal_manager_event_filter,
1215 if (subs_interface_removed_id == -1) {
1216 subs_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
1217 NULL, BT_HAL_MANAGER_INTERFACE,
1218 BT_HAL_INTERFACES_REMOVED, NULL, NULL, 0,
1219 __bt_hal_manager_event_filter,
1222 if (subs_name_owner_id == -1) {
1223 subs_name_owner_id = g_dbus_connection_signal_subscribe(conn,
1224 NULL, BT_HAL_FREEDESKTOP_INTERFACE,
1225 BT_HAL_NAME_OWNER_CHANGED, NULL, NULL, 0,
1226 __bt_hal_manager_event_filter,
1229 if (subs_property_id == -1) {
1230 subs_property_id = g_dbus_connection_signal_subscribe(conn,
1231 NULL, BT_HAL_PROPERTIES_INTERFACE,
1232 BT_HAL_PROPERTIES_CHANGED, NULL, NULL, 0,
1233 __bt_hal_manager_event_filter,
1236 if (subs_adapter_id == -1) {
1237 subs_adapter_id = g_dbus_connection_signal_subscribe(conn,
1238 NULL, BT_HAL_ADAPTER_INTERFACE,
1239 NULL, NULL, NULL, 0,
1240 __bt_hal_manager_event_filter,
1244 if (subs_interface_added_id != -1) {
1245 g_dbus_connection_signal_unsubscribe(conn,
1246 subs_interface_added_id);
1247 subs_interface_added_id = -1;
1249 if (subs_interface_removed_id != -1) {
1250 g_dbus_connection_signal_unsubscribe(conn,
1251 subs_interface_removed_id);
1252 subs_interface_removed_id = -1;
1254 if (subs_name_owner_id != -1) {
1255 g_dbus_connection_signal_unsubscribe(conn,
1256 subs_name_owner_id);
1257 subs_name_owner_id = -1;
1259 if (subs_property_id != -1) {
1260 g_dbus_connection_signal_unsubscribe(conn,
1262 subs_property_id = -1;
1264 if (subs_adapter_id == -1) {
1265 g_dbus_connection_signal_unsubscribe(conn, subs_adapter_id);
1266 subs_adapter_id = -1;
1274 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn,
1277 static int subs_device_id = -1;
1284 if (subs_device_id == -1) {
1285 subs_device_id = g_dbus_connection_signal_subscribe(conn,
1286 NULL, BT_HAL_DEVICE_INTERFACE,
1287 NULL, NULL, NULL, 0,
1288 __bt_hal_manager_event_filter,
1292 if (subs_device_id != -1) {
1293 g_dbus_connection_signal_unsubscribe(conn,
1295 subs_device_id = -1;
1303 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe)
1305 static int subs_input_id = -1;
1313 if (subs_input_id == -1) {
1314 subs_input_id = g_dbus_connection_signal_subscribe(conn,
1315 NULL, BT_HAL_INPUT_INTERFACE,
1316 NULL, NULL, NULL, 0,
1317 __bt_hal_manager_event_filter,
1321 if (subs_input_id != -1) {
1322 g_dbus_connection_signal_unsubscribe(conn,
1333 static int __bt_hal_register_gatt_subscribe_signal(GDBusConnection *conn,
1336 static int subs_gatt_id = -1;
1341 if (subs_gatt_id == -1) {
1342 subs_gatt_id = g_dbus_connection_signal_subscribe(conn,
1343 NULL, BT_HAL_GATT_CHAR_INTERFACE,
1344 NULL, NULL, NULL, 0,
1345 __bt_hal_manager_event_filter,
1349 if (subs_gatt_id == -1) {
1350 g_dbus_connection_signal_unsubscribe(conn,
1356 return BT_HAL_ERROR_NONE;
1361 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type)
1366 return BT_HAL_ERROR_INTERNAL;
1368 /* TODO: Add more events in subsequent patches */
1369 switch (event_type) {
1370 case BT_HAL_MANAGER_EVENT:
1371 __bt_hal_register_manager_subscribe_signal(g_conn, TRUE);
1373 case BT_HAL_DEVICE_EVENT:
1374 __bt_hal_register_device_subscribe_signal(g_conn, TRUE);
1376 case BT_HAL_HID_EVENT:
1377 __bt_hal_register_input_subscribe_signal(g_conn, TRUE);
1379 case BT_HAL_HEADSET_EVENT:
1380 __bt_hal_register_audio_subscribe_signal(g_conn, TRUE);
1382 case BT_HAL_GATT_EVENT:
1383 __bt_hal_register_gatt_subscribe_signal(g_conn, TRUE);
1386 INFO_C("Register Event: event_type [%d]", event_type);
1387 return BT_HAL_ERROR_NOT_SUPPORT;
1390 return BT_HAL_ERROR_NONE;
1393 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn,
1399 static int subs_headset_id = -1;
1400 static int subs_sink_id = -1;
1403 if (subs_headset_id == -1) {
1404 subs_headset_id = g_dbus_connection_signal_subscribe(conn,
1405 NULL, BT_HAL_HEADSET_INTERFACE,
1406 NULL, NULL, NULL, 0,
1407 __bt_hal_manager_event_filter,
1410 if (subs_sink_id == -1) {
1411 subs_sink_id = g_dbus_connection_signal_subscribe(conn,
1412 NULL, BT_HAL_SINK_INTERFACE,
1413 NULL, NULL, NULL, 0,
1414 __bt_hal_manager_event_filter,
1418 if (subs_headset_id != -1) {
1419 g_dbus_connection_signal_unsubscribe(conn,
1421 subs_headset_id = -1;
1423 if (subs_sink_id != -1) {
1424 g_dbus_connection_signal_unsubscribe(conn,
1432 static int __bt_hal_initialize_manager_receiver(void)
1436 GError *error = NULL;
1438 if (manager_conn == NULL) {
1439 manager_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1440 if (error != NULL) {
1441 ERR_C("ERROR: Can't get on system bus [%s]", error->message);
1442 g_clear_error(&error);
1444 if (manager_conn == NULL)
1448 if (__bt_hal_register_service_event(manager_conn,
1449 BT_HAL_MANAGER_EVENT) != BT_HAL_ERROR_NONE)
1451 if (__bt_hal_register_service_event(manager_conn,
1452 BT_HAL_DEVICE_EVENT) != BT_HAL_ERROR_NONE)
1454 if (__bt_hal_register_service_event(manager_conn,
1455 BT_HAL_HID_EVENT) != BT_HAL_ERROR_NONE)
1457 if (__bt_hal_register_service_event(manager_conn,
1458 BT_HAL_HEADSET_EVENT) != BT_HAL_ERROR_NONE)
1460 if (__bt_hal_register_service_event(manager_conn,
1461 BT_HAL_GATT_EVENT) != BT_HAL_ERROR_NONE)
1463 return BT_HAL_ERROR_NONE;
1466 g_object_unref(manager_conn);
1467 manager_conn = NULL;
1472 return BT_HAL_ERROR_INTERNAL;
1475 /* To receive the event from bluez */
1476 int _bt_hal_initialize_event_receiver(handle_stack_msg cb)
1482 return BT_HAL_ERROR_INVALID_PARAM;
1484 result = __bt_hal_initialize_manager_receiver();
1486 DBG("Manager event receiver initialization result [%d]", result);
1487 if (result != BT_HAL_ERROR_NONE)
1490 /*TODO: Initialize Obexd Event receiver */
1492 /* Initialize event receiver for flight mode */
1493 _bt_hal_register_vconf_handler();
1498 return BT_HAL_ERROR_NONE;
1501 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path)
1503 GVariantIter value_iter;
1504 GVariant *value = NULL;
1506 g_variant_iter_init(&value_iter, msg);
1509 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
1510 if (!g_strcmp0(key, "Connected")) {
1511 guint connected = 0;
1512 g_variant_get(value, "i", &connected);
1513 DBG("Device property changed : Connected [%d]", connected);
1514 } else if (!g_strcmp0(key, "RSSI")) {
1515 DBG("Device property changed : RSSI");
1516 __bt_hal_dbus_device_found_properties(path);
1517 } else if (!g_strcmp0(key, "GattConnected")) {
1518 DBG("Device property changed : GattConnected");
1519 gboolean gatt_connected = FALSE;
1520 g_variant_get(value, "b", &gatt_connected);
1521 char *address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1522 _bt_hal_convert_device_path_to_address(path, address);
1523 DBG("@@gatt_connected: %d", gatt_connected);
1524 DBG("@@address: %s", address);
1525 _bt_hal_gatt_connected_state_event(gatt_connected, address);
1526 _bt_hal_handle_gattc_connected_event(address, gatt_connected);
1528 } else if (!g_strcmp0(key, "Paired")) {
1529 gboolean paired = FALSE;
1530 struct hal_ev_bond_state_changed ev;
1531 char address[BT_HAL_ADDRESS_STRING_SIZE];
1533 g_variant_get(value, "b", &paired);
1534 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1536 _bt_hal_agent_set_canceled(FALSE);
1537 _bt_hal_convert_device_path_to_address(path, address);
1539 /* Prepare to send event to HAL bluetooth */
1540 ev.status = BT_STATUS_SUCCESS;
1541 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1542 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1545 ERR("Bluetooth HAL event handler not registered");
1547 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
1548 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1550 } else if (!g_strcmp0(key, "LegacyPaired")) {
1551 DBG("Device property changed : LegacyPaired");
1552 } else if (!g_strcmp0(key, "Trusted")) {
1553 DBG("Device property changed : Trusted");
1554 gboolean trusted = FALSE;
1555 gchar *address = NULL;
1556 g_variant_get(value, "b", &trusted);
1557 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1559 _bt_hal_convert_device_path_to_address(path, address);
1560 DBG("Device [%s] trusted: [%d]", address, trusted);
1562 __bt_hal_send_device_trust_state_event(trusted, address);
1564 } else if (!g_strcmp0(key, "IpspConnected")) {
1565 DBG("Device property changed : IpspConnected");
1566 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
1567 DBG("Device property changed : IpspInitStateChanged");
1568 } else if (!g_strcmp0(key, "TrustedProfiles")) {
1570 char address[BT_HAL_ADDRESS_STRING_SIZE];
1572 g_variant_get(value, "u", &trust_val);
1573 _bt_hal_convert_device_path_to_address(path, address);
1574 DBG("Address: %s, TrustedProfiles: 0x%X", address, trust_val);
1575 __bt_hal_send_device_trusted_profile_changed_event(trust_val, address);
1577 ERR("Unhandled Property:[%s]", key);
1583 static void __bt_hal_dbus_device_found_properties(const char *device_path)
1586 GError *error = NULL;
1587 GDBusProxy *device_proxy;
1588 GDBusConnection *conn;
1593 ERR("Invalid device path");
1597 conn = _bt_hal_get_system_gconn();
1599 ERR("_bt_hal_get_system_gconn failed");
1603 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1607 BT_HAL_PROPERTIES_INTERFACE,
1610 if (!device_proxy) {
1611 ERR("Error creating device_proxy");
1615 result = g_dbus_proxy_call_sync(device_proxy,
1617 g_variant_new("(s)", BT_HAL_DEVICE_INTERFACE),
1618 G_DBUS_CALL_FLAGS_NONE,
1623 ERR("Error occured in Proxy call");
1624 if (error != NULL) {
1625 ERR("Error occured in Proxy call (Error: %s)", error->message);
1626 g_clear_error(&error);
1628 g_object_unref(device_proxy);
1632 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1633 _bt_hal_convert_device_path_to_address(device_path, address);
1635 __bt_hal_device_properties_lookup(result, address);
1637 g_object_unref(device_proxy);
1643 static void __bt_hal_device_properties_lookup(GVariant *result, char *address)
1645 /* Buffer and propety count management */
1646 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
1647 struct hal_ev_device_found *ev = (void *) buf;
1649 memset(buf, 0, sizeof(buf));
1653 GVariant *tmp_value;
1656 gchar *manufacturer_data = NULL;
1659 if (result != NULL) {
1660 g_variant_get(result , "(@a{sv})", &value);
1661 g_variant_unref(result);
1664 tmp_value = g_variant_lookup_value(value, "Alias", G_VARIANT_TYPE_STRING);
1666 g_variant_get(tmp_value, "s", &name);
1668 g_variant_unref(tmp_value);
1670 DBG_SECURE("Alias Name [%s]", name);
1671 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1672 strlen(name) + 1, name);
1674 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1677 tmp_value = g_variant_lookup_value(value, "Name", G_VARIANT_TYPE_STRING);
1678 g_variant_get(tmp_value, "s", &name);
1679 g_variant_unref(tmp_value);
1681 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1682 strlen(name) + 1, name);
1684 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1685 g_variant_get(tmp_value, "s", &name);
1689 tmp_value = g_variant_lookup_value(value, "Class", G_VARIANT_TYPE_UINT32);
1690 unsigned int class = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1691 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
1692 sizeof(unsigned int), &class);
1695 g_variant_unref(tmp_value);
1699 tmp_value = g_variant_lookup_value(value, "Connected", G_VARIANT_TYPE_BOOLEAN);
1700 unsigned int connected = tmp_value ? g_variant_get_boolean(tmp_value) : 0;
1701 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
1702 sizeof(unsigned int), &connected);
1704 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
1706 g_variant_unref(tmp_value);
1709 tmp_value = g_variant_lookup_value(value, "Trusted", G_VARIANT_TYPE_BOOLEAN);
1710 uint8_t trust = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1711 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
1712 sizeof(uint8_t), &trust);
1714 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
1716 g_variant_unref(tmp_value);
1719 tmp_value = g_variant_lookup_value(value, "Paired", G_VARIANT_TYPE_BOOLEAN);
1720 uint8_t paired = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1722 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
1723 sizeof(uint8_t), &paired);
1725 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
1727 g_variant_unref(tmp_value);
1730 tmp_value = g_variant_lookup_value(value, "RSSI", G_VARIANT_TYPE_INT32);
1731 int rssi = tmp_value ? g_variant_get_int32(tmp_value) : 0;
1732 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
1733 sizeof(int), &rssi);
1735 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
1737 g_variant_unref(tmp_value);
1739 /* Last Addr Type */
1740 tmp_value = g_variant_lookup_value(value, "LastAddrType", G_VARIANT_TYPE_UINT32);
1741 unsigned int addr_type = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1743 g_variant_unref(tmp_value);
1744 DBG("Device Last Address Type [0x%x]", addr_type);
1747 tmp_value = g_variant_lookup_value(value, "IsAliasSet", G_VARIANT_TYPE_UINT32);
1748 uint8_t is_alias_set = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1749 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
1750 sizeof(uint8_t), &is_alias_set);
1752 DBG("IsAliasSet: [%s], Property num [%d]", (is_alias_set ? "TRUE" : "FALSE"), ev->num_props);
1754 g_variant_unref(tmp_value);
1757 tmp_value = g_variant_lookup_value(value, "UUIDs", G_VARIANT_TYPE_STRING_ARRAY);
1758 gsize uuid_count = g_variant_get_size(tmp_value);
1759 char **uuid_value = g_variant_dup_strv(tmp_value, &uuid_count);
1761 /* UUID collection */
1766 int num_props_tmp = ev->num_props;
1768 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
1770 for (i = 0; uuid_value[i] != NULL; i++) {
1772 char *uuid_str = NULL;
1773 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
1774 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
1776 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
1777 uuid_str = g_strdup(uuid_value[i]);
1778 DBG("UUID string [%s]\n", uuid_str);
1780 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
1782 for (z = 0; z < 16; z++)
1783 DBG("[0x%x]", uuid[z]);
1786 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
1790 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
1791 (BT_HAL_STACK_UUID_SIZE * uuid_count),
1793 ev->num_props = num_props_tmp + 1;
1796 g_variant_unref(tmp_value);
1798 /* LegacyManufacturerDataLen */
1799 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerDataLen", G_VARIANT_TYPE_UINT32);
1800 unsigned int manufacturer_data_len = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1801 if (manufacturer_data_len > BT_HAL_MANUFACTURER_DATA_LENGTH_MAX) {
1802 ERR("manufacturer_data_len is too long(len = %d)", manufacturer_data_len);
1803 manufacturer_data_len = BT_HAL_MANUFACTURER_DATA_LENGTH_MAX;
1806 g_variant_unref(tmp_value);
1807 /*size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA_LEN,
1808 sizeof(unsigned int), &manufacturer_data_len);
1810 DBG("Device Legacy Manufacturer data length [%u]", manufacturer_data_len);
1812 /* ManufacturerData */
1813 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerData", G_VARIANT_TYPE_BYTESTRING);
1814 manufacturer_data = value ? (gchar *)g_variant_get_bytestring(tmp_value) : NULL;
1815 if (manufacturer_data) {
1816 if (manufacturer_data_len > 0) {
1817 //size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA,
1818 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_BLE_ADV_DATA,
1819 manufacturer_data_len, manufacturer_data);
1824 g_variant_unref(tmp_value);
1828 _bt_hal_convert_addr_string_to_type(bdaddr, address);
1829 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
1830 sizeof(bdaddr), bdaddr);
1832 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
1835 g_variant_unref(value);
1837 ERR("result is NULL\n");
1840 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
1841 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
1846 static void __bt_hal_send_device_acl_connection_state_event(int status, gboolean connected, const char *address)
1849 struct hal_ev_acl_state_changed ev;
1852 ev.state = (connected == TRUE) ?
1853 HAL_ACL_STATE_CONNECTED :
1854 HAL_ACL_STATE_DISCONNECTED;
1856 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1859 ERR("Bluetooth HAL event handler not registered");
1861 event_cb(HAL_EV_ACL_STATE_CHANGED, &ev, sizeof(ev));
1865 static void __bt_hal_send_device_le_connection_state_event(int status, gboolean connected, const char *address)
1868 struct hal_ev_le_conn_state_changed ev;
1871 ev.state = (connected == TRUE) ?
1872 HAL_LE_STATE_CONNECTED :
1873 HAL_LE_STATE_DISCONNECTED;
1875 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1878 ERR("Bluetooth HAL event handler not registered");
1880 event_cb(HAL_EV_LE_CONN_STATE_CHANGED, &ev, sizeof(ev));
1884 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted,
1885 const char *address)
1887 struct hal_ev_device_trust_state_changed ev;
1890 ev.trust = (is_trusted == TRUE) ?
1891 HAL_DEVICE_TRUSTED :
1892 HAL_DEVICE_UNTRUSTED;
1894 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1897 ERR("Bluetooth HAL event handler not registered");
1899 event_cb(HAL_EV_DEVICE_TRUST_CHANGED, &ev, sizeof(ev));
1903 static void __bt_hal_send_device_trusted_profile_changed_event(
1904 uint32_t trust_val, const char *address)
1906 struct hal_ev_device_trusted_profiles_changed ev;
1909 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1910 ev.trust_val = trust_val;
1913 ERR("Bluetooth HAL event handler not registered");
1915 event_cb(HAL_EV_DEVICE_TRUSTED_PROFILES_CHANGED, &ev, sizeof(ev));
1919 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member,
1923 const char *property = NULL;
1927 if (strcasecmp(member, "PropertyChanged") == 0) {
1928 g_variant_get(msg, "(s)", &property);
1929 if (property == NULL)
1931 if (strcasecmp(property, "GattConnected") == 0) {
1932 INFO("GATT Connected");
1933 gboolean connected = FALSE;
1935 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1937 _bt_hal_convert_device_path_to_address(path, address);
1938 g_variant_get(msg, "(b)", &connected);
1940 INFO("Connected device address[%s] connnected[%d]", address, connected);
1942 } else if (strcasecmp(property, "Paired") == 0) {
1943 gboolean paired = FALSE;
1944 struct hal_ev_bond_state_changed ev;
1945 char address[BT_HAL_ADDRESS_STRING_SIZE];
1947 g_variant_get(msg, "(b)", &paired);
1948 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1950 _bt_hal_agent_set_canceled(FALSE);
1951 _bt_hal_convert_device_path_to_address(path, address);
1953 /* Prepare to send event to HAL bluetooth */
1954 ev.status = BT_STATUS_SUCCESS;
1955 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1956 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1959 ERR("Bluetooth HAL event handler not registered");
1961 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
1962 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1964 } else if (strcasecmp(property, "UUIDs") == 0) {
1967 } else if (strcasecmp(member, "DeviceConnected") == 0) {
1968 unsigned char addr_type = 0;
1970 g_variant_get(msg, "(y)", &addr_type);
1972 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1973 _bt_hal_convert_device_path_to_address(path, address);
1975 DBG("Member: [%s]", member);
1976 ERR_C("Connected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
1978 __bt_hal_send_device_acl_connection_state_event(BT_STATUS_SUCCESS, TRUE, address);
1980 __bt_hal_send_device_le_connection_state_event(BT_STATUS_SUCCESS, TRUE, address);
1982 } else if (strcasecmp(member, "Disconnected") == 0) {
1983 unsigned char disc_reason = 0;
1984 unsigned char addr_type = 0;
1987 g_variant_get(msg, "(yy&s)", &addr_type, &disc_reason, &name);
1989 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1990 _bt_hal_convert_device_path_to_address(path, address);
1992 DBG("Member: [%s]", member);
1994 ERR_C("DisConnected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
1995 DBG("Disconnected Reason [%d : %s]", disc_reason, _bt_hal_convert_disc_reason_to_string(disc_reason));
1996 DBG("Name: %s", name);
1998 __bt_hal_send_device_acl_connection_state_event(_bt_hal_convert_disc_reason_to_status(disc_reason), FALSE, address);
2000 __bt_hal_send_device_le_connection_state_event(_bt_hal_convert_disc_reason_to_status(disc_reason), FALSE, address);
2002 } else if (strcasecmp(member, "ProfileStateChanged") == 0) {
2004 char *profile_uuid = NULL;
2006 g_variant_get(msg, "(si)", &profile_uuid, &state);
2007 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2008 _bt_hal_convert_device_path_to_address(path, address);
2010 DBG("Address: %s", address);
2011 DBG("Profile UUID: %s", profile_uuid);
2012 DBG("State: %d", state);
2013 if (strncmp(profile_uuid, HID_UUID, strlen(HID_UUID)) == 0) {
2014 if (state == BT_HAL_PROFILE_STATE_CONNECTED)
2015 __bt_hal_send_hid_connection_state_event(TRUE, address);
2016 else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED)
2017 __bt_hal_send_hid_connection_state_event(FALSE, address);
2019 DBG("Profile state: %d", state);
2021 } else if ((strncmp(profile_uuid, A2DP_SINK_UUID, strlen(A2DP_SINK_UUID)) == 0)) {
2022 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2023 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTED");
2024 __bt_hal_send_av_connection_state_event(TRUE, address);
2025 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2026 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2027 __bt_hal_send_av_connection_state_event(FALSE, address);
2028 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2029 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2030 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2031 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTING");
2033 ERR("A2DP Profile state: Invalid");
2035 } else if ((strncmp(profile_uuid, A2DP_SOURCE_UUID, strlen(A2DP_SOURCE_UUID)) == 0)) {
2036 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2037 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
2038 __bt_hal_send_a2dp_sink_connection_state_event(TRUE, address);
2039 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2040 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
2041 __bt_hal_send_a2dp_sink_connection_state_event(FALSE, address);
2042 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2043 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
2044 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2045 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
2047 } else if (strncmp(profile_uuid, HFP_HF_UUID, strlen(HFP_HF_UUID)) == 0) {
2048 if (state == BT_HAL_PROFILE_STATE_CONNECTING)
2049 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTING");
2050 else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2051 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTED");
2052 __bt_hal_send_hf_connection_state_event(TRUE, address);
2053 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2054 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2055 __bt_hal_send_hf_connection_state_event(FALSE, address);
2056 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2057 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2059 ERR("HFP Profile state: Invalid");
2061 } else if ((strncmp(profile_uuid, AVRCP_TARGET_UUID, strlen(AVRCP_TARGET_UUID)) == 0)) {
2062 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2063 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
2064 __bt_hal_send_avrcp_ctrl_connection_state_event(TRUE, address);
2065 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2066 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
2067 __bt_hal_send_avrcp_ctrl_connection_state_event(FALSE, address);
2068 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2069 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
2070 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2071 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
2074 DBG("Profile[%s] State changed status [%d] ", profile_uuid, state);
2077 g_free(profile_uuid);
2078 } else if (strcasecmp(member, "AdvReport") == 0) {
2079 DBG("Member: [%s]", member);
2080 __bt_hal_handle_adv_report(msg, path);
2084 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path)
2086 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
2087 struct hal_ev_gatt_client_scan_result *ev = (void *)buf;
2089 char *address = NULL;
2090 GVariant *value = NULL;
2091 char *buffer = NULL;
2094 uint8_t addr_type = 0;
2095 uint8_t adv_type = 0;
2101 memset(buf, 0, sizeof(buf));
2104 g_variant_get(msg, "(&syyii@ay)", &address, &addr_type,
2105 &adv_type, &rssi, &data_len, &value);
2107 buffer_len = g_variant_get_size(value);
2109 buffer = (char *)g_variant_get_data(value);
2111 if (data_len != buffer_len) {
2112 ERR("Unexpected: buffer_len: %d, data_len: %d",
2113 buffer_len, data_len);
2114 data_len = buffer_len;
2117 DBG("Address: %s, len: %d, rssi: %d, addr_type: 0x%02X, adv_type: 0x%02X",
2118 address, data_len, rssi, addr_type, adv_type);
2120 _bt_hal_convert_addr_string_to_type(ev->bd_addr, address);
2121 ev->addr_type = addr_type;
2122 ev->adv_type = adv_type;
2125 memcpy(ev->adv_data, buffer, data_len);
2128 DBG("Send le scan result event to HAL, size: [%zd]", size);
2129 gatt_event_cb(HAL_EV_GATT_CLIENT_SCAN_RESULT, buf, size);
2130 g_variant_unref(value);
2133 /* AVRCP Controller Role(Remote:AVRCP Target) Events */
2134 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address)
2137 struct hal_ev_avrcp_ctrl_conn_state ev;
2139 if (connected == TRUE)
2140 INFO("AVRCP(Controller) Profile Connected for address [%s]", address);
2142 INFO("AVRCP(Controller) Profile DisConnected for address [%s]", address);
2144 if (connected == TRUE)
2145 ev.state = HAL_AVRCP_CTRL_STATE_CONNECTED;
2147 ev.state = HAL_AVRCP_CTRL_STATE_DISCONNECTED;
2148 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2150 if (!a2dp_sink_event_cb)
2151 ERR("AV event handler not registered");
2153 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_CONN_STATE, &ev, sizeof(ev));
2156 static int __bt_media_attr_to_type(const char *str)
2158 if (!strcasecmp(str, "Equalizer"))
2159 return HAL_PLAYER_ATTR_EQUALIZER;
2160 else if (!strcasecmp(str, "Repeat"))
2161 return HAL_PLAYER_ATTR_REPEAT;
2162 else if (!strcasecmp(str, "Shuffle"))
2163 return HAL_PLAYER_ATTR_SHUFFLE;
2164 else if (!strcasecmp(str, "Scan"))
2165 return HAL_PLAYER_ATTR_SCAN;
2171 static int __bt_hal_play_status_str_to_type(const char *value)
2173 if (!strcmp(value, "stopped"))
2174 return HAL_PLAYSTATE_STOPPED;
2175 else if (!strcmp(value, "playing"))
2176 return HAL_PLAYSTATE_PLAYING;
2177 else if (!strcmp(value, "paused"))
2178 return HAL_PLAYSTATE_PAUSED;
2179 else if (!strcmp(value, "forward-seek"))
2180 return HAL_PLAYSTATE_FWD_SEEK;
2181 else if (!strcmp(value, "reverse-seek"))
2182 return HAL_PLAYSTATE_REV_SEEK;
2184 return HAL_PLAYSTATE_ERROR;
2187 static void __bt_avrcp_control_parse_properties(struct hal_ev_track_changed *ev, GVariant *item)
2189 GVariant *value = NULL;
2191 char *value_string = NULL;
2192 const char *key = NULL;
2198 g_variant_iter_init(&iter, item);
2199 while (g_variant_iter_loop(&iter, "{sv}", &key, &value)) {
2200 if (strcasecmp(key, "Title") == 0) {
2201 value_string = (char *)g_variant_get_string(value, NULL);
2202 DBG("Value : %s ", value_string);
2203 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TITLE;
2204 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2206 } else if (strcasecmp(key, "Artist") == 0) {
2207 value_string = (char *)g_variant_get_string(value, NULL);
2208 DBG("Value : %s ", value_string);
2209 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ARTIST;
2210 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2212 } else if (strcasecmp(key, "Album") == 0) {
2213 value_string = (char *)g_variant_get_string(value, NULL);
2214 DBG("Value : %s ", value_string);
2215 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ALBUM;
2216 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2218 } else if (strcasecmp(key, "Genre") == 0) {
2219 value_string = (char *)g_variant_get_string(value, NULL);
2220 DBG("Value : %s ", value_string);
2221 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_GENRE;
2222 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2224 } else if (strcasecmp(key, "Duration") == 0) {
2227 val = g_variant_get_uint32(value);
2228 DBG("Value : %li", val);
2229 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_PLAYING_TIME;
2230 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2232 } else if (strcasecmp(key, "NumberOfTracks") == 0) {
2235 val = g_variant_get_uint32(value);
2236 DBG("Value : %li", val);
2237 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_NUM_TRACKS;
2238 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2240 } else if (strcasecmp(key, "TrackNumber") == 0) {
2243 val = g_variant_get_uint32(value);
2244 DBG("Value : %li", val);
2245 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TRACK_NUM;
2246 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2249 DBG("%s not supported, ignoring", key);
2252 if (i >= HAL_MAX_ATTR_NUM) {
2253 ERR(" Received max attribute [%d]", i);
2259 g_variant_iter_free(&iter);
2263 static int __bt_media_attrval_to_val(int type, const char *value)
2268 case HAL_PLAYER_ATTR_EQUALIZER:
2269 if (!strcmp(value, "off"))
2274 case HAL_PLAYER_ATTR_REPEAT:
2275 if (!strcmp(value, "off"))
2276 ret = BTRC_PLAYER_VAL_OFF_REPEAT;
2277 else if (!strcmp(value, "singletrack"))
2278 ret = BTRC_PLAYER_VAL_SINGLE_REPEAT;
2279 else if (!strcmp(value, "alltracks"))
2280 ret = BTRC_PLAYER_VAL_ALL_REPEAT;
2282 ret = BTRC_PLAYER_VAL_GROUP_REPEAT;
2284 case HAL_PLAYER_ATTR_SHUFFLE:
2285 if (!strcmp(value, "off"))
2286 ret = BTRC_PLAYER_VAL_OFF_SHUFFLE;
2287 else if (!strcmp(value, "alltracks"))
2288 ret = BTRC_PLAYER_VAL_ALL_SHUFFLE;
2290 ret = BTRC_PLAYER_VAL_GROUP_SHUFFLE;
2292 case HAL_PLAYER_ATTR_SCAN:
2293 if (!strcmp(value, "off"))
2295 else if (!strcmp(value, "alltracks"))
2301 ERR("Value not handled");
2307 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member,
2310 const char *property = NULL;
2311 GVariant *value = NULL;
2313 char address[BT_HAL_ADDRESS_STRING_SIZE];
2316 ERR("Error returned in method call\n");
2320 if (!avrcp_ctrl_event_cb) {
2321 ERR("AVRCP controller DBUS handler callback not registered");
2325 g_variant_iter_init(&iter, msg);
2327 _bt_hal_convert_device_path_to_address(path, address);
2329 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2330 DBG("Property = %s \n", property);
2331 if ((strcasecmp(property, "Equalizer") == 0) ||
2332 (strcasecmp(property, "Repeat") == 0) ||
2333 (strcasecmp(property, "Shuffle") == 0) ||
2334 (strcasecmp(property, "Scan") == 0)) {
2335 struct hal_ev_player_setting ev;
2339 valstr = g_variant_get_string(value, NULL);
2340 DBG("Value : %s ", valstr);
2343 val = __bt_media_attrval_to_val(__bt_media_attr_to_type(property), valstr);
2346 memset(&ev, 0, sizeof(ev));
2347 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2349 ev.attr_ids[0] = __bt_media_attr_to_type(property);
2350 ev.attr_values[0] = val;
2352 /* Send event to application */
2353 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAYER_APP_SETTING_CHANGED, &ev, sizeof(ev));
2355 } else if ((strcasecmp(property, "Status") == 0)) {
2356 struct hal_ev_play_status_changed ev;
2359 valstr = g_variant_get_string(value, NULL);
2360 DBG("Value : %s ", valstr);
2362 memset(&ev, 0, sizeof(ev));
2363 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2365 ev.status = __bt_hal_play_status_str_to_type(valstr);
2367 /* Send event to application */
2368 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_STATUS_CHANGED, &ev, sizeof(ev));
2370 } else if (strcasecmp(property, "Position") == 0) {
2371 struct hal_ev_play_position ev;
2373 memset(&ev, 0, sizeof(ev));
2374 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2375 ev.pos = g_variant_get_uint32(value);
2376 DBG("Value : %d ", ev.pos);
2378 /* Send event to application */
2379 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_POSITION_CHANGED, &ev, sizeof(ev));
2380 } else if (strcasecmp(property, "Track") == 0) {
2381 struct hal_ev_track_changed ev;
2383 memset(&ev, 0, sizeof(ev));
2384 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2385 __bt_avrcp_control_parse_properties(&ev, value);
2387 /* Send event to application */
2388 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_TRACK_CHANGED, &ev, sizeof(ev));
2390 DBG("Property not handled");
2394 g_free((char *)property);
2395 g_variant_unref(value);
2398 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member,
2401 const char *property = NULL;
2402 GVariant *value = NULL;
2404 char address[BT_HAL_ADDRESS_STRING_SIZE];
2408 ERR("Error returned in method call\n");
2412 if (!avrcp_tg_event_cb) {
2413 ERR("AVRCP target DBUS handler callback not registered");
2417 g_variant_iter_init(&iter, msg);
2419 _bt_hal_convert_device_path_to_address(path, address);
2421 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2422 DBG("Property = %s \n", property);
2423 if ((strcasecmp(property, "Delay") == 0)) {
2424 struct hal_ev_avrcp_tg_delay_changed ev;
2427 memset(&ev, 0, sizeof(ev));
2428 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2430 val = g_variant_get_uint16(value);
2431 DBG("Value : %d", val);
2434 /* Send event to application */
2435 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_DELAY_CHANGE, &ev, sizeof(ev));
2437 DBG("Property not handled");
2442 g_free((char *)property);
2443 g_variant_unref(value);
2446 /* A2DP Src Role(Remote:Sink) Events */
2447 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address)
2450 struct hal_ev_a2dp_conn_state ev;
2452 if (connected == TRUE)
2453 INFO("A2DP(Src) Profile Connected for address [%s]", address);
2455 INFO("A2DP(Src) Profile DisConnected for address [%s]", address);
2457 ev.state = (connected == TRUE) ?
2458 HAL_EV_A2DP_STATE_CONNECTED :
2459 HAL_EV_A2DP_STATE_DISCONNECTED;
2461 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2464 ERR("AV event handler not registered");
2466 av_event_cb(HAL_EV_A2DP_CONN_STATE, &ev, sizeof(ev));
2469 /* A2DP Sink Role(Remote:Source) Events */
2470 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address)
2473 struct hal_ev_a2dp_conn_state ev;
2475 if (connected == TRUE)
2476 INFO("A2DP(Sink) Profile Connected for address [%s]", address);
2478 INFO("A2DP(Sink) Profile DisConnected for address [%s]", address);
2480 ev.state = (connected == TRUE) ?
2481 HAL_EV_A2DP_STATE_CONNECTED :
2482 HAL_EV_A2DP_STATE_DISCONNECTED;
2484 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2486 if (!a2dp_sink_event_cb)
2487 ERR("AV event handler not registered");
2489 a2dp_sink_event_cb(HAL_EV_A2DP_SOURCE_CONN_STATE, &ev, sizeof(ev));
2492 /* HF(AG Role) Audio Events */
2493 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected,
2494 const char *address)
2497 struct hal_ev_handsfree_audio_state ev;
2499 if (connected == TRUE)
2500 INFO("AG Audio Connected for address [%s]", address);
2502 INFO("AG Audio DisConnected for address [%s]", address);
2504 ev.state = (connected == TRUE) ?
2505 HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTED :
2506 HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED;
2508 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2511 ERR("HF event handler not registered");
2513 hf_event_cb(HAL_EV_HANDSFREE_AUDIO_STATE, &ev, sizeof(ev));
2516 /* HF(AG Role) Profile Events */
2517 static void __bt_hal_send_hf_connection_state_event(gboolean connected,
2518 const char *address)
2521 struct hal_ev_handsfree_conn_state ev;
2523 if (connected == TRUE)
2524 INFO("AG Profile Connected for address [%s]", address);
2526 INFO("AG Profile DisConnected for address [%s]", address);
2528 ev.state = (connected == TRUE) ?
2529 HAL_EV_HANDSFREE_CONN_STATE_CONNECTED :
2530 HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTED;
2532 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2535 ERR("HF event handler not registered");
2537 hf_event_cb(HAL_EV_HANDSFREE_CONN_STATE, &ev, sizeof(ev));
2540 void _bt_hal_register_event_handler_cb(bt_hal_module_e module, handle_stack_msg cb)
2550 a2dp_sink_event_cb = cb;
2556 avrcp_tg_event_cb = cb;
2558 case HAL_AVRCP_CTRL:
2559 avrcp_ctrl_event_cb = cb;
2565 ERR("Unknown module: %d", module);
2569 void _bt_hal_unregister_event_handler_cb(bt_hal_module_e module)
2573 hid_event_cb = NULL;
2579 a2dp_sink_event_cb = NULL;
2585 avrcp_tg_event_cb = NULL;
2587 case HAL_AVRCP_CTRL:
2588 avrcp_ctrl_event_cb = NULL;
2591 gatt_event_cb = NULL;
2594 ERR("Unknown module: %d", module);
2598 bool _bt_hal_get_adapter_request_state(void)
2600 return is_adapter_activating;
2603 bool _bt_hal_get_le_request_state(void)
2605 return is_le_activating;
2608 void _bt_hal_set_adapter_request_state(bool enable)
2610 DBG("set_adapter_request_state %d", enable);
2611 is_adapter_activating = enable;
2614 void _bt_hal_set_le_request_state(bool enable)
2616 DBG("set_le_request_state %d", enable);
2617 is_le_activating = enable;