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"
43 #define BASELEN_PROP_CHANGED (sizeof(struct hal_ev_adapter_props_changed) \
44 + sizeof(struct hal_property))
46 /*TODO: Basic filters are currently added,
47 Need to add different event filters like HID,
48 Device etc in subsequent patches */
50 /* Global variables and structures */
51 static GDBusConnection *manager_conn;
52 static handle_stack_msg event_cb = NULL;
53 static handle_stack_msg hid_event_cb = NULL;
54 static handle_stack_msg av_event_cb = NULL;
55 static handle_stack_msg a2dp_sink_event_cb = NULL;
56 static handle_stack_msg hf_event_cb = NULL;
57 static handle_stack_msg avrcp_ctrl_event_cb = NULL;
58 static handle_stack_msg avrcp_tg_event_cb = NULL;
59 static handle_stack_msg gatt_event_cb = NULL;
60 static guint event_id;
62 /*State Management sepration Control for Adapter and LE */
63 static gboolean is_adapter_activating = FALSE;
64 static gboolean is_le_activating = FALSE;
69 gchar* interface_name;
72 } bt_hal_main_event_data_t;
74 /* Forward declarations */
75 static gboolean __bt_hal_event_manager(gpointer param);
76 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type);
77 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn, int subscribe);
78 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn, int subscribe);
79 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe);
81 static int __bt_hal_parse_event(GVariant *msg);
82 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current);
84 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path);
85 static void __bt_hal_adapter_property_changed_event(GVariant *msg);
86 static void __bt_hal_manager_event_filter(GDBusConnection *connection, const gchar *sender_name,
87 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
88 GVariant *parameters, gpointer user_data);
89 static int __bt_hal_initialize_manager_receiver(void);
90 static gboolean __bt_hal_parse_interface(GVariant *msg);
91 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters);
92 static gboolean __bt_hal_parse_device_properties(GVariant *item);
93 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data);
94 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path);
95 static void __bt_hal_dbus_device_found_properties(const char *device_path);
96 static void __bt_hal_device_properties_lookup(GVariant *result, char *address);
97 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member, const char *path);
98 static void __bt_hal_send_device_acl_connection_state_event(gboolean connected, const char *address);
99 static void __bt_hal_handle_input_event(GVariant *msg, const char *path);
100 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address);
101 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address);
102 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address);
103 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member, const char *path);
104 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member, const char *path);
106 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted, const char *address);
107 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn, int subscribe);
108 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path);
109 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected, const char *address);
110 static void __bt_hal_send_hf_connection_state_event(gboolean connected, const char *address);
111 static void __bt_hal_send_device_trusted_profile_changed_event(uint32_t trust_val, const char *address);
112 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path);
114 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data)
118 struct hal_ev_discovery_state_changed ev;
119 ev.state = HAL_DISCOVERY_STATE_STOPPED;
120 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
126 static int __bt_hal_parse_event(GVariant *msg)
130 char *interface_name = NULL;
131 GVariant *inner_iter = NULL;
133 g_variant_iter_init(&iter, msg);
135 while ((child = g_variant_iter_next_value(&iter))) {
136 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
137 if (g_strcmp0(interface_name,
138 BT_HAL_DEVICE_INTERFACE) == 0) {
139 DBG("__bt_hal_parse_event: Interface: BT_HAL_DEVICE_INTERFACE");
140 g_variant_unref(inner_iter);
141 g_variant_unref(child);
142 return BT_HAL_DEVICE_EVENT;
143 } else if (g_strcmp0(interface_name,
144 BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
145 DBG("__bt_hal_parse_event: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
146 g_variant_unref(inner_iter);
147 g_variant_unref(child);
148 return BT_HAL_MEDIA_TRANSFER_EVENT;
149 } else if (g_strcmp0(interface_name,
150 BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
151 DBG("__bt_hal_parse_event: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
152 g_variant_unref(inner_iter);
153 g_variant_unref(child);
154 return BT_HAL_AVRCP_CONTROL_EVENT;
156 g_variant_unref(inner_iter);
157 g_variant_unref(child);
163 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current)
165 g_variant_get(msg, "(sss)", name, previous, current);
166 return BT_HAL_ERROR_NONE;
169 int __bt_insert_hal_properties(void *buf, uint8_t type, uint16_t len, const void *val)
170 { struct hal_property *prop = buf;
176 memcpy(prop->val, val, len);
178 return sizeof(*prop) + len;
181 handle_stack_msg _bt_hal_get_stack_message_handler(void)
186 static void __bt_hal_adapter_property_changed_event(GVariant *msg)
188 GVariantIter value_iter;
189 GVariant *value = NULL;
190 GDBusProxy *adapter_proxy;
193 g_variant_iter_init(&value_iter, msg);
195 /* Buffer and propety count management */
196 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
197 struct hal_ev_adapter_props_changed *ev = (void*) buf;
199 const gchar *address = NULL;
201 unsigned int cod = 0;
202 gboolean discoverable;
203 gboolean connectable;
204 unsigned int scan_mode = BT_SCAN_MODE_NONE;
205 unsigned int disc_timeout;
206 const gchar *version;
207 gboolean ipsp_initialized;
210 unsigned int pairable_timeout;
211 gboolean scan_mode_property_update = FALSE;
212 gboolean is_discovering;
213 gboolean is_le_discovering;
215 memset(buf, 0, sizeof(buf));
218 ev->status = BT_STATUS_SUCCESS;
222 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
223 if (!g_strcmp0(key, "Address")) {
226 address = g_variant_get_string(value, NULL);
227 DBG("##Address [%s]", address);
228 _bt_hal_convert_addr_string_to_type(bdaddr, address);
229 size += __bt_insert_hal_properties(buf + size,
230 HAL_PROP_ADAPTER_ADDR, sizeof(bdaddr), bdaddr);
232 } else if (!g_strcmp0(key, "Alias")) {
233 g_variant_get(value, "&s", &name);
234 DBG("##Alias [%s] ", name);
235 size += __bt_insert_hal_properties(buf + size,
236 HAL_PROP_ADAPTER_NAME, strlen(name) + 1, name);
238 } else if (!g_strcmp0(key, "Class")) {
239 cod = g_variant_get_uint32(value);
240 DBG("##Class [%d]", cod);
241 size += __bt_insert_hal_properties(buf + size,
242 HAL_PROP_ADAPTER_CLASS, sizeof(unsigned int), &cod);
244 } else if (!g_strcmp0(key, "Discoverable")) {
245 discoverable = g_variant_get_boolean(value);
246 DBG("##Discoverable [%d]", discoverable);
248 scan_mode = BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE;
250 scan_mode = BT_SCAN_MODE_CONNECTABLE;
251 scan_mode_property_update = TRUE;
252 } else if (!g_strcmp0(key, "DiscoverableTimeout")) {
253 disc_timeout = g_variant_get_uint32(value);
254 DBG("##Discoverable Timeout [%d]", disc_timeout);
255 size += __bt_insert_hal_properties(buf + size,
256 HAL_PROP_ADAPTER_DISC_TIMEOUT, sizeof(unsigned int), &disc_timeout);
258 } else if (!g_strcmp0(key, "Connectable")) {
259 connectable = g_variant_get_boolean(value);
260 DBG("##Connectable [%d]", connectable);
262 scan_mode = BT_SCAN_MODE_NONE;
263 else if (scan_mode == BT_SCAN_MODE_NONE)
264 scan_mode = BT_SCAN_MODE_CONNECTABLE;
265 scan_mode_property_update = TRUE;
266 } else if (!g_strcmp0(key, "Version")) {
267 version = g_variant_get_string(value, NULL);
268 DBG("##Version [%s]", version);
269 size += __bt_insert_hal_properties(buf + size,
270 HAL_PROP_ADAPTER_VERSION, strlen(version) + 1, version);
272 } else if (!g_strcmp0(key, "Name")) {
273 g_variant_get(value, "&s", &name);
274 DBG("##Name [%s]", name);
275 size += __bt_insert_hal_properties(buf + size,
276 HAL_PROP_ADAPTER_NAME, strlen(name) + 1, name);
278 } else if (!g_strcmp0(key, "Powered")) {
279 powered = g_variant_get_boolean(value);
280 DBG("##Powered = %d", powered);
281 /* TODO: Need to check this operation!! */
282 if (powered == FALSE) {
283 DBG("###### Adapter Powered Down ######");
284 struct hal_ev_adapter_state_changed ev;
285 ev.state = HAL_POWER_OFF;
286 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
288 struct hal_ev_le_state_changed le_ev;
289 le_ev.state = HAL_POWER_OFF;
290 event_cb(HAL_EV_LE_STATE_CHANGED, &le_ev, sizeof(le_ev));
293 _bt_hal_destroy_adapter_agent();
295 DBG("###### Adapter Powered Up ######");
296 if (_bt_hal_get_adapter_request_state()) {
297 DBG("Sending STATE CHANGE EVENT for Adapter... ");
298 _bt_hal_set_adapter_request_state(FALSE);
299 struct hal_ev_adapter_state_changed ev;
300 ev.state = HAL_POWER_ON;
301 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
304 if (_bt_hal_get_le_request_state()) {
305 DBG("Sending STATE CHANGE EVENT for LE... ");
306 _bt_hal_set_le_request_state(FALSE);
307 struct hal_ev_le_state_changed ev;
308 ev.state = HAL_POWER_ON;
309 event_cb(HAL_EV_LE_STATE_CHANGED, &ev, sizeof(ev));
313 _bt_hal_initialize_adapter_agent();
316 } else if (!g_strcmp0(key, "Pairable")) {
317 pairable = g_variant_get_boolean(value);
318 DBG("##Pairable [%d]", pairable);
319 } else if (!g_strcmp0(key, "PairableTimeout")) {
320 pairable_timeout = g_variant_get_uint32(value);
321 DBG("##Pairable Timeout = %d", pairable_timeout);
322 } else if (!g_strcmp0(key, "UUIDs")) {
327 size1 = g_variant_get_size(value);
328 int num_props_tmp = ev->num_props;
330 uuid_value = (char **)g_variant_get_strv(value, &size1);
331 for (i = 0; uuid_value[i] != NULL; i++)
333 /* UUID collection */
334 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
335 for (i = 0; uuid_value[i] != NULL; i++) {
336 char *uuid_str = NULL;
337 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
338 uuid_str = g_strdup(uuid_value[i]);
339 DBG("##UUID string [%s]\n", uuid_str);
340 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
341 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
344 size += __bt_insert_hal_properties(buf + size, HAL_PROP_ADAPTER_UUIDS,
345 (BT_HAL_STACK_UUID_SIZE * uuid_count),
347 ev->num_props = num_props_tmp + 1;
350 } else if (!g_strcmp0(key, "Discovering")) {
351 is_discovering = g_variant_get_boolean(value);
352 DBG("##Discovering = [%d]", is_discovering);
354 if (is_discovering == FALSE) {
355 DBG("###### Adapter Has stopped Discovering ######");
356 /* In Tizen Bluez, this actually does not mean Discovery is stopped
357 in Bluez. Tizen Bluez sends this event after a certain timeout,
358 Therefore, we must forecefully call StopDiscovery to stop discovery in BlueZ */
362 adapter_proxy = _bt_hal_get_adapter_proxy();
364 if (adapter_proxy == NULL)
367 /* Need to stop searching */
368 DBG("Event though Bluez reported DIscovering stopped, we force stop Discovery ");
369 g_dbus_proxy_call_sync(adapter_proxy, "StopDiscovery",
371 G_DBUS_CALL_FLAGS_NONE,
375 ERR("Dbus Error : %s", err->message);
377 /* This error is thrown by Bluez, as Discovery is already stopped.
378 Discovery is stopped if user cancels on going discovery.
379 In order to maintain correct state of Bluetooth Discovery state,
380 simply send Discovery stopped event to HAL user */
381 struct hal_ev_discovery_state_changed ev;
382 ev.state = HAL_DISCOVERY_STATE_STOPPED;
383 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
388 event_id = g_timeout_add(BT_HAL_DISCOVERY_FINISHED_DELAY,
389 (GSourceFunc)__bt_hal_discovery_finished_cb, NULL);
393 DBG("###### Adapter Has started Discovering ######");
394 struct hal_ev_discovery_state_changed ev;
395 ev.state = HAL_DISCOVERY_STATE_STARTED;
396 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
399 } else if (!g_strcmp0(key, "LEDiscovering")) {
402 is_le_discovering = g_variant_get_boolean(value);
403 DBG("##LE Discovering = [%d]", is_le_discovering);
405 if (is_le_discovering)
408 adapter_proxy = _bt_hal_get_adapter_proxy();
409 if (adapter_proxy == NULL) {
410 ERR("adapter_proxy == NULL");
414 /* Need to stop searching */
415 result = g_dbus_proxy_call_sync(adapter_proxy, "StopLEDiscovery",
416 NULL, G_DBUS_CALL_FLAGS_NONE,
417 DBUS_TIMEOUT, NULL, &err);
419 ERR("Error occured in Proxy call");
421 ERR("(Error: %s)", err->message);
426 g_variant_unref(result);
427 } else if (!g_strcmp0(key, "Modalias")) {
428 char *modalias = NULL;
429 g_variant_get(value, "s", &modalias);
430 DBG("##Adapter ModAlias [%s]", modalias);
431 } else if (!g_strcmp0(key, "SupportedLEFeatures")) {
432 DBG("##LE Supported features");
435 GVariantIter *iter = NULL;
436 g_variant_get(value, "as", &iter);
437 bt_local_le_features_t le_features;
438 gboolean le_features_present = FALSE;
443 memset(&le_features, 0x00, sizeof(le_features));
445 while (g_variant_iter_next(iter, "&s", &name) &&
446 g_variant_iter_next(iter, "&s", &val)) {
447 DBG("name = %s, Value = %s", name, val);
448 if (FALSE == _bt_hal_update_le_feature_support(name, val, &le_features))
449 ERR("Failed to update LE feature (name = %s, value = %s)", name, val);
451 le_features_present = TRUE;
454 g_variant_iter_free(iter);
455 if (le_features_present) {
456 size += __bt_insert_hal_properties(buf + size,
457 HAL_PROP_ADAPTER_LOCAL_LE_FEAT, sizeof(le_features), &le_features);
460 DBG("le supported features values are NOT provided by Stack");
462 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
463 g_variant_get(value, "b" , &ipsp_initialized);
464 DBG("##IPSP Initialized = %d", ipsp_initialized);
466 ERR("Unhandled Property:[%s]", key);
470 if (scan_mode_property_update) {
471 size += __bt_insert_hal_properties(buf + size,
472 HAL_PROP_ADAPTER_SCAN_MODE, sizeof(int), &scan_mode);
478 DBG("Send Adapter properties changed event to HAL user, Num Prop [%d] total size [%d]", ev->num_props, size);
479 event_cb(HAL_EV_ADAPTER_PROPS_CHANGED, buf, size);
485 void _bt_hal_handle_adapter_event(GVariant *msg, const char *member)
492 if (strcasecmp(member, "DeviceCreated") == 0) {
493 DBG("DeviceCreated: Unhandled");
494 } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
495 DBG("InterfacesRemoved: Unhandled");
496 } else if (strcasecmp(member, "AdvertisingEnabled") == 0) {
497 DBG("AdvertisingEnabled");
498 DBG("Advertising Enabled");
500 gboolean status = FALSE;
501 g_variant_get(msg, "(ib)", &slot_id, &status);
502 DBG("Advertising Enabled : slot_id [%d] status [%d]", slot_id, status);
503 /* Send event to application */
504 _bt_hal_set_advertising_status(slot_id, status);
505 } else if (strcasecmp(member, "RssiEnabled") == 0) {
506 struct hal_ev_rssi_monitor_state_changed ev;
507 gboolean status = FALSE;
508 char *address = NULL;
511 g_variant_get(msg, "(sib)", &address, &link_type, &status);
512 DBG("RSSI monitoring %s for %s",
513 (status ? "Enabled" : "Disabled"), address);
515 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
516 ev.link_type = link_type;
517 ev.state = (status ? HAL_RSSI_MONITORING_ENABLED : HAL_RSSI_MONITORING_DISABLED);
519 ERR("event_cb is NULL");
521 event_cb(HAL_EV_RSSI_MONITOR_STATE_CHANGED, &ev, sizeof(ev));
524 } else if (strcasecmp(member, "RssiAlert") == 0) {
525 struct hal_ev_rssi_alert_recieved ev;
529 char *address = NULL;
531 g_variant_get(msg, "(siii)", &address, &link_type, &alert_type, &rssi_dbm);
532 DBG("RSSI Alert: [Address %s LinkType %d] [Type %d DBM %d]",
533 address, alert_type, rssi_dbm);
535 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
536 ev.link_type = link_type;
537 ev.alert_type = alert_type;
541 ERR("event_cb is NULL");
543 event_cb(HAL_EV_RSSI_ALERT_RECIEVED, &ev, sizeof(ev));
546 } else if (strcasecmp(member, "RawRssi") == 0) {
547 struct hal_ev_raw_rssi_recieved ev;
550 char *address = NULL;
552 g_variant_get(msg, "(sii)", &address, &link_type, &rssi_dbm);
553 DBG("Raw RSSI: [Address %s] [Link Type %d][RSSI DBM %d]",
554 address, link_type, rssi_dbm);
556 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
557 ev.link_type = link_type;
561 ERR("event_cb is NULL");
563 event_cb(HAL_EV_RAW_RSSI_RECIEVED, &ev, sizeof(ev));
566 } else if (strcasecmp(member, BT_HAL_HARDWARE_ERROR) == 0) {
567 DBG("BT Hardware Error: Unhandled");
568 } else if (strcasecmp(member, BT_HAL_TX_TIMEOUT_ERROR) == 0) {
569 DBG("BT TX Timeout Error: Unhandled");
575 static gboolean __bt_hal_parse_device_properties(GVariant *item)
585 /* Buffer and propety count management */
586 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
587 struct hal_ev_device_found *ev = (void *) buf;
589 memset(buf, 0, sizeof(buf));
593 g_variant_iter_init(&iter, item);
594 while (g_variant_iter_loop(&iter, "{sv}", &key, &val)) {
596 if (strcasecmp(key, "Address") == 0) {
598 char * address = NULL;
599 address = g_variant_dup_string(val, &len);
601 _bt_hal_convert_addr_string_to_type(bdaddr, address);
603 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
604 sizeof(bdaddr), bdaddr);
607 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
609 } else if (strcasecmp(key, "Class") == 0) {
610 unsigned int class = g_variant_get_uint32(val);
611 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
612 sizeof(unsigned int), &class);
614 DBG("Device class [%d] Property num [%d]", class, ev->num_props);
615 } else if (strcasecmp(key, "name") == 0) {
616 char *name = g_variant_dup_string(val, &len);
618 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
619 strlen(name) + 1, name);
621 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
624 } else if (strcasecmp(key, "Connected") == 0) {
625 unsigned int connected = g_variant_get_byte(val);
627 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
628 sizeof(unsigned int), &connected);
630 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
631 } else if (strcasecmp(key, "paired") == 0) {
632 uint8_t paired = (g_variant_get_boolean(val) ? 1 : 0);
633 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
634 sizeof(uint8_t), &paired);
636 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
637 } else if (strcasecmp(key, "Trusted") == 0) {
638 uint8_t trust = (g_variant_get_boolean(val) ? 1 : 0);
639 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
640 sizeof(uint8_t), &trust);
642 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
643 } else if (strcasecmp(key, "RSSI") == 0) {
644 int rssi = g_variant_get_int16(val);
645 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
648 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
649 } else if (strcasecmp(key, "LastAddrType") == 0) {
650 /* TODO: To be handled later*/
651 } else if (!g_strcmp0(key, "IsAliasSet")) {
652 uint8_t is_alias_set = (g_variant_get_boolean(val) ? 1 : 0);
653 DBG("IsAliasSet: %s", (is_alias_set ? "TRUE" : "FALSE"));
654 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
655 sizeof(uint8_t), &is_alias_set);
657 } else if (strcasecmp(key, "UUIDs") == 0) {
662 size1 = g_variant_get_size(val);
663 DBG("UUID count from size [%d]\n", size1);
664 int num_props_tmp = ev->num_props;
667 uuid_value = (char **)g_variant_get_strv(val, &size1);
668 for (i = 0; uuid_value[i] != NULL; i++)
670 DBG("UUID count [%d]\n", uuid_count);
671 /* UUID collection */
672 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
674 for (i = 0; uuid_value[i] != NULL; i++) {
676 char *uuid_str = NULL;
677 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
678 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
680 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
681 uuid_str = g_strdup(uuid_value[i]);
682 DBG("UUID string [%s]\n", uuid_str);
683 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
684 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
688 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
689 (BT_HAL_STACK_UUID_SIZE * uuid_count),
691 ev->num_props = num_props_tmp + 1;
695 } else if (strcasecmp(key, "LegacyManufacturerDataLen") == 0) {
696 /* TODO: To be handled later*/
697 } else if (strcasecmp(key, "LegacyManufacturerData") == 0) {
698 /* TODO: To be handled later*/
700 ERR("Unhandled Property:[%s]", key);
706 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%d]", ev->num_props, size);
707 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
713 static void __bt_hal_handle_avrcp_tg_events(GVariant *msg, const char *path)
716 GVariantIter value_iter;
717 char *property = NULL;
719 GVariant *val = NULL;
720 GVariant *child = NULL;
722 g_variant_iter_init(&value_iter, msg);
723 while ((child = g_variant_iter_next_value(&value_iter))) {
724 g_variant_get(child, "{sv}", &property, &val);
725 INFO("Property %s", property);
726 if (strcasecmp(property, "Connected") == 0) {
727 struct hal_ev_avrcp_tg_conn_state ev;
729 gboolean connected = FALSE;
731 g_variant_get(val, "b", &connected);
733 state = connected ? HAL_AVRCP_TG_STATE_CONNECTED :
734 HAL_AVRCP_TG_STATE_DISCONNECTED;
736 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
738 _bt_hal_convert_device_path_to_address(path, address);
740 DBG("connected: %d", connected);
741 DBG("address: %s", address);
743 /* Prepare to send AVRCP Target connection state event */
744 memset(&ev, 0, sizeof(ev));
745 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
747 if (!avrcp_tg_event_cb)
748 ERR("AVRCP target DBUS handler callback not registered");
750 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_CONN_STATE, (void *)&ev, sizeof(ev));
754 g_variant_unref(child);
755 g_variant_unref(val);
761 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path)
763 char *interface_name = NULL;
764 GVariant *val = NULL;
767 g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, &val, NULL);
769 if (!interface_name) {
770 DBG("Failed to get interface name");
773 g_variant_unref(val);
777 if (strcasecmp(interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
778 DBG("Event: Property Changed: Interface: BT_HAL_ADAPTER_INTERFACE");
779 __bt_hal_adapter_property_changed_event(val);
780 } else if (strcasecmp(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
781 DBG("Event: Property Changed: Interface: BT_HAL_DEVICE_INTERFACE");
782 __bt_hal_device_property_changed_event(val, object_path);
783 } else if (strcasecmp(interface_name, BT_HAL_OBEX_TRANSFER_INTERFACE) == 0) {
784 DBG("Event: Property Changed: Interface: BT_HAL_OBEX_TRANSFER_INTERFACE");
785 /* TODO: Handle event */
786 } else if (strcasecmp(interface_name, BT_HAL_MEDIA_CONTROL_INTERFACE) == 0) {
787 DBG("Event: Property Changed: Interface: BT_HAL_MEDIA_CONTROL_INTERFACE");
788 /* Handle AVRCP target event */
789 __bt_hal_handle_avrcp_tg_events(val, object_path);
790 } else if (strcasecmp(interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
791 DBG("Event: Property Changed: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
792 __bt_hal_handle_avrcp_ctrl_events(val, NULL, object_path);
793 } else if (strcasecmp(interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
794 DBG("Event: Property Changed: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
795 __bt_hal_handle_avrcp_transport_events(val, NULL, object_path);
796 } else if (strcasecmp(interface_name, BT_HAL_NETWORK_CLIENT_INTERFACE) == 0) {
797 DBG("Event: Property Changed: Interface: BT_HAL_NETWORK_CLIENT_INTERFACE");
798 /* TODO: Handle event */
799 } else if (strcasecmp(interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
800 DBG("Event: Property Changed: Interface: BT_HAL_GATT_CHAR_INTERFACE");
801 /* TODO: Handle event */
802 } else if (strcasecmp(interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
803 DBG("Event: Property Changed: Interface: BT_HAL_INPUT_INTERFACE");
804 __bt_hal_handle_input_event(val, object_path);
806 g_variant_unref(val);
809 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters)
813 if (__bt_hal_parse_interface(parameters) == FALSE) {
814 ERR("Fail to parse the properies");
815 g_variant_unref(value);
822 static void __bt_hal_send_hid_connection_state_event(
823 gboolean connected, char *address)
825 struct hal_ev_hidhost_conn_state ev;
827 ev.state = (connected == TRUE) ?
828 HAL_HIDHOST_STATE_CONNECTED :
829 HAL_HIDHOST_STATE_DISCONNECTED;
831 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
834 ERR("HID event handler not registered");
836 hid_event_cb(HAL_EV_HIDHOST_CONN_STATE, &ev, sizeof(ev));
839 static void __bt_hal_handle_input_event(GVariant *msg, const char *path)
841 gboolean property_flag = FALSE;
842 GVariantIter value_iter;
843 char *property = NULL;
844 GVariant *child = NULL, *val = NULL;
847 g_variant_iter_init(&value_iter, msg);
848 while ((child = g_variant_iter_next_value(&value_iter))) {
849 g_variant_get(child, "{sv}", &property, &val);
851 if (property == NULL)
854 if (strcasecmp(property, "Connected") == 0) {
857 g_variant_get(val, "b", &property_flag);
858 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
859 _bt_hal_convert_device_path_to_address(path, address);
860 __bt_hal_send_hid_connection_state_event(property_flag, address);
864 g_variant_unref(val);
865 g_variant_unref(child);
871 static gboolean __bt_hal_parse_interface(GVariant *msg)
874 GVariant *optional_param;
877 char *interface_name = NULL;
878 GVariant *inner_iter = NULL;
879 g_variant_get(msg, "(&o@a{sa{sv}})",
880 &path, &optional_param);
881 g_variant_iter_init(&iter, optional_param);
883 while ((child = g_variant_iter_next_value(&iter))) {
884 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
885 if (g_strcmp0(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
886 DBG("Found a device: %s", path);
887 if (__bt_hal_parse_device_properties(inner_iter) == FALSE) {
888 g_variant_unref(inner_iter);
889 g_variant_unref(child);
890 g_variant_unref(optional_param);
891 ERR("Fail to parse the properies");
894 g_variant_unref(inner_iter);
895 g_variant_unref(child);
896 g_variant_unref(optional_param);
900 g_variant_unref(inner_iter);
901 g_variant_unref(child);
904 g_variant_unref(optional_param);
909 static gboolean __bt_hal_event_manager(gpointer data)
911 bt_hal_event_type_t bt_event = 0x00;
913 char *obj_path = NULL;
915 bt_hal_main_event_data_t *param = (bt_hal_main_event_data_t*)data;
916 if (strcasecmp(param->signal_name, "InterfacesAdded") == 0) {
918 /*TODO: Handle Interfaces Added Signal from stack */
919 DBG("Manager Event: Signal Name: InterfacesAdded");
921 g_variant_get(param->parameters, "(&o@a{sa{sv}})", &obj_path, &value);
923 if (obj_path == NULL) {
924 DBG("obj_path is NULL");
928 if (strcasecmp(obj_path, BT_HAL_BLUEZ_HCI_PATH) == 0) {
929 /* TODO: Handle adapter added */
930 DBG("Manager Event: Signal Name: InterfiacesAdded: Adapter added in bluetoothd: path [hci0]");
932 bt_event = __bt_hal_parse_event(value);
933 if (bt_event == BT_HAL_DEVICE_EVENT) {
934 DBG("Device path : %s ", obj_path);
935 __bt_hal_handle_device_event(value, param->parameters);
936 } else if (bt_event == BT_HAL_AVRCP_CONTROL_EVENT) {
937 DBG("Device path : %s ", obj_path);
938 _bt_hal_set_control_device_path(obj_path);
941 g_variant_unref(value);
943 } else if (strcasecmp(param->signal_name, "InterfacesRemoved") == 0) {
947 /*TODO: Handle Interfaces Removed Signal from stack */
948 DBG("Manager Event: Signal Name: InterfacesRemoved");
950 g_variant_get(param->parameters, "(&oas)", &obj_path, &iter);
951 DBG("Device path : %s ", obj_path);
952 while (g_variant_iter_loop(iter, "s", &str)) {
953 if (g_strcmp0(str, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0)
954 _bt_hal_remove_control_device_path(obj_path);
956 g_variant_iter_free(iter);
957 } else if (strcasecmp(param->signal_name, "NameOwnerChanged") == 0) {
959 char *previous = NULL;
960 char *current = NULL;
962 /* TODO: Handle Name Owener changed Signal */
963 if (__bt_hal_get_owner_info(param->parameters, &name, &previous, ¤t)) {
964 DBG("Fail to get the owner info");
967 if (current && *current != '\0') {
973 if (strcasecmp(name, BT_HAL_BLUEZ_NAME) == 0) {
974 DBG("Bluetoothd is terminated");
976 /* TODO: Handle Bluetoothd terminating scenario */
979 INFO("Name Owner changed [%s]", name);
984 } else if (g_strcmp0(param->interface_name, BT_HAL_PROPERTIES_INTERFACE) == 0) {
985 DBG("Manager Event: Interface Name: BT_HAL_PROPERTIES_INTERFACE");
986 __bt_hal_handle_property_changed_event(param->parameters, param->object_path);
987 } else if (g_strcmp0(param->interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
988 DBG("Manager Event: Interface Name: BT_HAL_ADAPTER_INTERFACE");
989 _bt_hal_handle_adapter_event(param->parameters, param->signal_name);
990 } else if (g_strcmp0(param->interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
991 DBG("Manager Event: Interface Name: BT_HAL_INPUT_INTERFACE");
992 __bt_hal_handle_input_event(param->parameters, param->object_path);
993 } else if (g_strcmp0(param->interface_name, BT_HAL_NETWORK_SERVER_INTERFACE) == 0) {
994 /* TODO: Handle Network Server events from stack */
995 DBG("Manager Event: Interface Name: BT_HAL_NETWORK_SERVER_INTERFACE");
996 } else if (g_strcmp0(param->interface_name, BT_HAL_HEADSET_INTERFACE) == 0) {
997 DBG("Manager Event: Interface Name: BT_HAL_HEADSET_INTERFACE");
998 __bt_hal_handle_headset_events(param->parameters, param->signal_name, param->object_path);
999 } else if (g_strcmp0(param->interface_name, BT_HAL_SINK_INTERFACE) == 0) {
1000 /* TODO: Handle Sink interface events from stack */
1001 DBG("Manager Event: Interface Name:BT_HAL_SINK_INTERFACE");
1002 } else if (g_strcmp0(param->interface_name, BT_HAL_AGENT_INTERFACE) == 0) {
1003 /* TODO: Handle Agent events from stack */
1004 DBG("Manager Event: Interface Name:BT_HAL_AGENT_INTERFACE");
1005 } else if (g_strcmp0(param->interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
1006 DBG("Manager Event: Interface Name:BT_HAL_DEVICE_INTERFACE");
1007 __bt_hal_handle_device_specific_events(param->parameters, param->signal_name, param->object_path);
1008 } else if (g_strcmp0(param->interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
1009 DBG("Manager Event: Interface Name: BT_HAL_PLAYER_CONTROL_INTERFACE");
1010 __bt_hal_handle_avrcp_ctrl_events(param->parameters, param->signal_name, param->object_path);
1011 } else if (g_strcmp0(param->interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
1012 DBG("Manager Event: Interface Name: BT_HAL_MEDIATRANSPORT_INTERFACE");
1013 __bt_hal_handle_avrcp_transport_events(param->parameters, param->signal_name, param->object_path);
1018 g_free(param->sender_name);
1019 g_free(param->object_path);
1020 g_free(param->interface_name);
1021 g_free(param->signal_name);
1022 g_variant_unref(param->parameters);
1027 static void __bt_hal_manager_event_filter(GDBusConnection *connection,
1028 const gchar *sender_name,
1029 const gchar *object_path,
1030 const gchar *interface_name,
1031 const gchar *signal_name,
1032 GVariant *parameters,
1035 if (signal_name == NULL)
1038 bt_hal_main_event_data_t *param = g_new0(bt_hal_main_event_data_t, 1);
1039 param->sender_name = g_strdup(sender_name);
1040 param->object_path = g_strdup(object_path);
1041 param->interface_name = g_strdup(interface_name);
1042 param->signal_name = g_strdup(signal_name);
1043 param->parameters = g_variant_ref(parameters);
1045 g_idle_add(__bt_hal_event_manager, (gpointer)param);
1049 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path)
1051 gboolean property_flag = FALSE;
1052 char *property = NULL;
1053 GVariant *value = NULL;
1054 g_variant_get(msg, "(sv)", &property, &value);
1056 if (property == NULL)
1059 DBG("Property = %s \n", property);
1060 /* We allow only 1 headset connection (HSP or HFP)*/
1061 if (strcasecmp(property, "Connected") == 0) {
1063 g_variant_get(value, "b", &property_flag);
1065 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1067 /* Fix : NULL_RETURNS */
1068 if (address == NULL)
1071 _bt_hal_convert_device_path_to_address(path, address);
1072 __bt_hal_send_hf_audio_connection_state_event(property_flag, address);
1074 } else if (strcasecmp(property, "State") == 0) {
1077 g_variant_get(value, "s", &state);
1079 /* This code assumes we support only 1 headset connection */
1080 /* Need to use the headset list, if we support multi-headsets */
1081 if (strcasecmp(state, "Playing") == 0) {
1082 DBG("Playing: Sco Connected");
1083 } else if (strcasecmp(state, "connected") == 0 ||
1084 strcasecmp(state, "disconnected") == 0) {
1085 if (strcasecmp(state, "connected") == 0)
1086 DBG("Sco Connected");
1088 DBG("Sco Disconnected");
1090 ERR("Not handled state - %s", state);
1095 } else if (strcasecmp(property, "SpeakerGain") == 0) {
1098 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1100 _bt_hal_convert_device_path_to_address(path, address);
1101 INFO("Speaker Gain for address [%s]", address);
1102 /* TODO Handle event sending to HAL */
1105 } else if (strcasecmp(property, "MicrophoneGain") == 0) {
1108 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1110 _bt_hal_convert_device_path_to_address(path, address);
1111 INFO("Microphone Gain for address [%s]", address);
1112 /* TODO Handle event sending to HAL */
1119 g_variant_unref(value);
1122 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn,
1128 static int subs_interface_added_id = -1;
1129 static int subs_interface_removed_id = -1;
1130 static int subs_name_owner_id = -1;
1131 static int subs_property_id = -1;
1132 static int subs_adapter_id = -1;
1137 if (subs_interface_added_id == -1) {
1138 subs_interface_added_id = g_dbus_connection_signal_subscribe(conn,
1139 NULL, BT_HAL_MANAGER_INTERFACE,
1140 BT_HAL_INTERFACES_ADDED, NULL, NULL, 0,
1141 __bt_hal_manager_event_filter,
1144 if (subs_interface_removed_id == -1) {
1145 subs_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
1146 NULL, BT_HAL_MANAGER_INTERFACE,
1147 BT_HAL_INTERFACES_REMOVED, NULL, NULL, 0,
1148 __bt_hal_manager_event_filter,
1151 if (subs_name_owner_id == -1) {
1152 subs_name_owner_id = g_dbus_connection_signal_subscribe(conn,
1153 NULL, BT_HAL_FREEDESKTOP_INTERFACE,
1154 BT_HAL_NAME_OWNER_CHANGED, NULL, NULL, 0,
1155 __bt_hal_manager_event_filter,
1158 if (subs_property_id == -1) {
1159 subs_property_id = g_dbus_connection_signal_subscribe(conn,
1160 NULL, BT_HAL_PROPERTIES_INTERFACE,
1161 BT_HAL_PROPERTIES_CHANGED, NULL, NULL, 0,
1162 __bt_hal_manager_event_filter,
1165 if (subs_adapter_id == -1) {
1166 subs_adapter_id = g_dbus_connection_signal_subscribe(conn,
1167 NULL, BT_HAL_ADAPTER_INTERFACE,
1168 NULL, NULL, NULL, 0,
1169 __bt_hal_manager_event_filter,
1173 if (subs_interface_added_id != -1) {
1174 g_dbus_connection_signal_unsubscribe(conn,
1175 subs_interface_added_id);
1176 subs_interface_added_id = -1;
1178 if (subs_interface_removed_id != -1) {
1179 g_dbus_connection_signal_unsubscribe(conn,
1180 subs_interface_removed_id);
1181 subs_interface_removed_id = -1;
1183 if (subs_name_owner_id != -1) {
1184 g_dbus_connection_signal_unsubscribe(conn,
1185 subs_name_owner_id);
1186 subs_name_owner_id = -1;
1188 if (subs_property_id != -1) {
1189 g_dbus_connection_signal_unsubscribe(conn,
1191 subs_property_id = -1;
1193 if (subs_adapter_id == -1) {
1194 g_dbus_connection_signal_unsubscribe(conn, subs_adapter_id);
1195 subs_adapter_id = -1;
1203 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn,
1206 static int subs_device_id = -1;
1213 if (subs_device_id == -1) {
1214 subs_device_id = g_dbus_connection_signal_subscribe(conn,
1215 NULL, BT_HAL_DEVICE_INTERFACE,
1216 NULL, NULL, NULL, 0,
1217 __bt_hal_manager_event_filter,
1221 if (subs_device_id != -1) {
1222 g_dbus_connection_signal_unsubscribe(conn,
1224 subs_device_id = -1;
1232 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe)
1234 static int subs_input_id = -1;
1242 if (subs_input_id == -1) {
1243 subs_input_id = g_dbus_connection_signal_subscribe(conn,
1244 NULL, BT_HAL_INPUT_INTERFACE,
1245 NULL, NULL, NULL, 0,
1246 __bt_hal_manager_event_filter,
1250 if (subs_input_id != -1) {
1251 g_dbus_connection_signal_unsubscribe(conn,
1262 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type)
1267 return BT_HAL_ERROR_INTERNAL;
1269 /* TODO: Add more events in subsequent patches */
1270 switch (event_type) {
1271 case BT_HAL_MANAGER_EVENT:
1272 __bt_hal_register_manager_subscribe_signal(g_conn, TRUE);
1274 case BT_HAL_DEVICE_EVENT:
1275 __bt_hal_register_device_subscribe_signal(g_conn, TRUE);
1277 case BT_HAL_HID_EVENT:
1278 __bt_hal_register_input_subscribe_signal(g_conn, TRUE);
1280 case BT_HAL_HEADSET_EVENT:
1281 __bt_hal_register_audio_subscribe_signal(g_conn, TRUE);
1284 INFO_C("Register Event: event_type [%d]", event_type);
1285 return BT_HAL_ERROR_NOT_SUPPORT;
1288 return BT_HAL_ERROR_NONE;
1291 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn,
1297 static int subs_headset_id = -1;
1298 static int subs_sink_id = -1;
1301 if (subs_headset_id == -1) {
1302 subs_headset_id = g_dbus_connection_signal_subscribe(conn,
1303 NULL, BT_HAL_HEADSET_INTERFACE,
1304 NULL, NULL, NULL, 0,
1305 __bt_hal_manager_event_filter,
1308 if (subs_sink_id == -1) {
1309 subs_sink_id = g_dbus_connection_signal_subscribe(conn,
1310 NULL, BT_HAL_SINK_INTERFACE,
1311 NULL, NULL, NULL, 0,
1312 __bt_hal_manager_event_filter,
1316 if (subs_headset_id != -1) {
1317 g_dbus_connection_signal_unsubscribe(conn,
1319 subs_headset_id = -1;
1321 if (subs_sink_id != -1) {
1322 g_dbus_connection_signal_unsubscribe(conn,
1330 static int __bt_hal_initialize_manager_receiver(void)
1334 GError *error = NULL;
1336 if (manager_conn == NULL) {
1337 manager_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1338 if (error != NULL) {
1339 ERR_C("ERROR: Can't get on system bus [%s]", error->message);
1340 g_clear_error(&error);
1342 if (manager_conn == NULL)
1346 if (__bt_hal_register_service_event(manager_conn,
1347 BT_HAL_MANAGER_EVENT) != BT_HAL_ERROR_NONE)
1349 if (__bt_hal_register_service_event(manager_conn,
1350 BT_HAL_DEVICE_EVENT) != BT_HAL_ERROR_NONE)
1352 if (__bt_hal_register_service_event(manager_conn,
1353 BT_HAL_HID_EVENT) != BT_HAL_ERROR_NONE)
1355 if (__bt_hal_register_service_event(manager_conn,
1356 BT_HAL_HEADSET_EVENT) != BT_HAL_ERROR_NONE)
1358 return BT_HAL_ERROR_NONE;
1361 g_object_unref(manager_conn);
1362 manager_conn = NULL;
1367 return BT_HAL_ERROR_INTERNAL;
1370 /* To receive the event from bluez */
1371 int _bt_hal_initialize_event_receiver(handle_stack_msg cb)
1377 return BT_HAL_ERROR_INVALID_PARAM;
1379 result = __bt_hal_initialize_manager_receiver();
1381 DBG("Manager event receiver initialization result [%d]", result);
1382 if (result != BT_HAL_ERROR_NONE)
1385 /*TODO: Initialize Obexd Event receiver */
1390 return BT_HAL_ERROR_NONE;
1393 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path)
1395 GVariantIter value_iter;
1396 GVariant *value = NULL;
1398 g_variant_iter_init(&value_iter, msg);
1401 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
1402 if (!g_strcmp0(key, "Connected")) {
1403 guint connected = 0;
1404 g_variant_get(value, "i", &connected);
1405 DBG("Device property changed : Connected [%d]", connected);
1406 } else if (!g_strcmp0(key, "RSSI")) {
1407 DBG("Device property changed : RSSI");
1408 __bt_hal_dbus_device_found_properties(path);
1409 } else if (!g_strcmp0(key, "GattConnected")) {
1410 DBG("Device property changed : GattConnected");
1411 gboolean gatt_connected = FALSE;
1412 g_variant_get(value, "b", &gatt_connected);
1413 char *address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1414 _bt_hal_convert_device_path_to_address(path, address);
1415 DBG("@@gatt_connected: %d", gatt_connected);
1416 DBG("@@address: %s", address);
1417 _bt_hal_gatt_connected_state_event(gatt_connected, address);
1418 _bt_hal_handle_gattc_connected_event(address, gatt_connected);
1420 } else if (!g_strcmp0(key, "Paired")) {
1421 gboolean paired = FALSE;
1422 struct hal_ev_bond_state_changed ev;
1423 char address[BT_HAL_ADDRESS_STRING_SIZE];
1425 g_variant_get(value, "b", &paired);
1426 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1428 _bt_hal_agent_set_canceled(FALSE);
1429 _bt_hal_convert_device_path_to_address(path, address);
1431 /* Prepare to send event to HAL bluetooth */
1432 ev.status = BT_STATUS_SUCCESS;
1433 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1434 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1437 ERR("Bluetooth HAL event handler not registered");
1439 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
1440 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1442 } else if (!g_strcmp0(key, "LegacyPaired")) {
1443 DBG("Device property changed : LegacyPaired");
1444 } else if (!g_strcmp0(key, "Trusted")) {
1445 DBG("Device property changed : Trusted");
1446 gboolean trusted = FALSE;
1447 gchar *address = NULL;
1448 g_variant_get(value, "b", &trusted);
1449 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1451 _bt_hal_convert_device_path_to_address(path, address);
1452 DBG("Device [%s] trusted: [%d]", address, trusted);
1454 __bt_hal_send_device_trust_state_event(trusted, address);
1456 } else if (!g_strcmp0(key, "IpspConnected")) {
1457 DBG("Device property changed : IpspConnected");
1458 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
1459 DBG("Device property changed : IpspInitStateChanged");
1460 } else if (!g_strcmp0(key, "TrustedProfiles")) {
1462 char address[BT_HAL_ADDRESS_STRING_SIZE];
1464 g_variant_get(value, "u", &trust_val);
1465 _bt_hal_convert_device_path_to_address(path, address);
1466 DBG("Address: %s, TrustedProfiles: 0x%X", address, trust_val);
1467 __bt_hal_send_device_trusted_profile_changed_event(trust_val, address);
1469 ERR("Unhandled Property:[%s]", key);
1475 static void __bt_hal_dbus_device_found_properties(const char *device_path)
1478 GError *error = NULL;
1479 GDBusProxy *device_proxy;
1480 GDBusConnection *conn;
1485 ERR("Invalid device path");
1489 conn = _bt_hal_get_system_gconn();
1491 ERR("_bt_hal_get_system_gconn failed");
1495 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1499 BT_HAL_PROPERTIES_INTERFACE,
1502 if (!device_proxy) {
1503 ERR("Error creating device_proxy");
1507 result = g_dbus_proxy_call_sync(device_proxy,
1509 g_variant_new("(s)", BT_HAL_DEVICE_INTERFACE),
1510 G_DBUS_CALL_FLAGS_NONE,
1515 ERR("Error occured in Proxy call");
1516 if (error != NULL) {
1517 ERR("Error occured in Proxy call (Error: %s)", error->message);
1518 g_clear_error(&error);
1520 g_object_unref(device_proxy);
1524 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1525 _bt_hal_convert_device_path_to_address(device_path, address);
1527 __bt_hal_device_properties_lookup(result, address);
1529 g_object_unref(device_proxy);
1535 static void __bt_hal_device_properties_lookup(GVariant *result, char *address)
1537 /* Buffer and propety count management */
1538 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
1539 struct hal_ev_device_found *ev = (void *) buf;
1541 memset(buf, 0, sizeof(buf));
1545 GVariant *tmp_value;
1548 gchar *manufacturer_data = NULL;
1551 if (result != NULL) {
1552 g_variant_get(result , "(@a{sv})", &value);
1553 g_variant_unref(result);
1556 tmp_value = g_variant_lookup_value(value, "Alias", G_VARIANT_TYPE_STRING);
1558 g_variant_get(tmp_value, "s", &name);
1560 g_variant_unref(tmp_value);
1562 DBG_SECURE("Alias Name [%s]", name);
1563 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1564 strlen(name) + 1, name);
1566 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1569 tmp_value = g_variant_lookup_value(value, "Name", G_VARIANT_TYPE_STRING);
1570 g_variant_get(tmp_value, "s", &name);
1571 g_variant_unref(tmp_value);
1573 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1574 strlen(name) + 1, name);
1576 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1577 g_variant_get(tmp_value, "s", &name);
1581 tmp_value = g_variant_lookup_value(value, "Class", G_VARIANT_TYPE_UINT32);
1582 unsigned int class = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1583 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
1584 sizeof(unsigned int), &class);
1587 g_variant_unref(tmp_value);
1591 tmp_value = g_variant_lookup_value(value, "Connected", G_VARIANT_TYPE_BOOLEAN);
1592 unsigned int connected = tmp_value ? g_variant_get_boolean(tmp_value) : 0;
1593 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
1594 sizeof(unsigned int), &connected);
1596 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
1598 g_variant_unref(tmp_value);
1601 tmp_value = g_variant_lookup_value(value, "Trusted", G_VARIANT_TYPE_BOOLEAN);
1602 uint8_t trust = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1603 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
1604 sizeof(uint8_t), &trust);
1606 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
1608 g_variant_unref(tmp_value);
1611 tmp_value = g_variant_lookup_value(value, "Paired", G_VARIANT_TYPE_BOOLEAN);
1612 uint8_t paired = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1614 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
1615 sizeof(uint8_t), &paired);
1617 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
1619 g_variant_unref(tmp_value);
1622 tmp_value = g_variant_lookup_value(value, "RSSI", G_VARIANT_TYPE_INT32);
1623 int rssi = tmp_value ? g_variant_get_int32(tmp_value) : 0;
1624 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
1625 sizeof(int), &rssi);
1627 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
1629 g_variant_unref(tmp_value);
1631 /* Last Addr Type */
1632 tmp_value = g_variant_lookup_value(value, "LastAddrType", G_VARIANT_TYPE_UINT32);
1633 unsigned int addr_type = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1635 g_variant_unref(tmp_value);
1636 DBG("Device Last Address Type [0x%x]", addr_type);
1639 tmp_value = g_variant_lookup_value(value, "IsAliasSet", G_VARIANT_TYPE_UINT32);
1640 uint8_t is_alias_set = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1641 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
1642 sizeof(uint8_t), &is_alias_set);
1644 DBG("IsAliasSet: [%s], Property num [%d]", (is_alias_set ? "TRUE" : "FALSE"), ev->num_props);
1646 g_variant_unref(tmp_value);
1649 tmp_value = g_variant_lookup_value(value, "UUIDs", G_VARIANT_TYPE_STRING_ARRAY);
1650 gsize uuid_count = g_variant_get_size(tmp_value);
1651 char **uuid_value = g_variant_dup_strv(tmp_value, &uuid_count);
1653 /* UUID collection */
1658 int num_props_tmp = ev->num_props;
1660 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
1662 for (i = 0; uuid_value[i] != NULL; i++) {
1664 char *uuid_str = NULL;
1665 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
1666 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
1668 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
1669 uuid_str = g_strdup(uuid_value[i]);
1670 DBG("UUID string [%s]\n", uuid_str);
1672 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
1674 for (z = 0; z < 16; z++)
1675 DBG("[0x%x]", uuid[z]);
1678 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
1682 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
1683 (BT_HAL_STACK_UUID_SIZE * uuid_count),
1685 ev->num_props = num_props_tmp + 1;
1688 g_variant_unref(tmp_value);
1690 /* LegacyManufacturerDataLen */
1691 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerDataLen", G_VARIANT_TYPE_UINT32);
1692 unsigned int manufacturer_data_len = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1693 if (manufacturer_data_len > BT_HAL_MANUFACTURER_DATA_LENGTH_MAX) {
1694 ERR("manufacturer_data_len is too long(len = %d)", manufacturer_data_len);
1695 manufacturer_data_len = BT_HAL_MANUFACTURER_DATA_LENGTH_MAX;
1698 g_variant_unref(tmp_value);
1699 /*size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA_LEN,
1700 sizeof(unsigned int), &manufacturer_data_len);
1702 DBG("Device Legacy Manufacturer data length [%u]", manufacturer_data_len);
1704 /* ManufacturerData */
1705 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerData", G_VARIANT_TYPE_BYTESTRING);
1706 manufacturer_data = value ? (gchar *)g_variant_get_bytestring(tmp_value) : NULL;
1707 if (manufacturer_data) {
1708 if (manufacturer_data_len > 0) {
1709 //size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA,
1710 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_BLE_ADV_DATA,
1711 manufacturer_data_len, manufacturer_data);
1716 g_variant_unref(tmp_value);
1720 _bt_hal_convert_addr_string_to_type(bdaddr, address);
1721 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
1722 sizeof(bdaddr), bdaddr);
1724 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
1727 g_variant_unref(value);
1729 ERR("result is NULL\n");
1732 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%d]", ev->num_props, size);
1733 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
1738 static void __bt_hal_send_device_acl_connection_state_event(gboolean connected, const char *address)
1741 struct hal_ev_acl_state_changed ev;
1743 ev.status = BT_STATUS_SUCCESS;
1744 ev.state = (connected == TRUE) ?
1745 HAL_ACL_STATE_CONNECTED :
1746 HAL_ACL_STATE_DISCONNECTED;
1748 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1751 ERR("Bluetooth HAL event handler not registered");
1753 event_cb(HAL_EV_ACL_STATE_CHANGED, &ev, sizeof(ev));
1757 static void __bt_hal_send_device_le_connection_state_event(gboolean connected, const char *address)
1760 struct hal_ev_le_conn_state_changed ev;
1762 ev.status = BT_STATUS_SUCCESS;
1763 ev.state = (connected == TRUE) ?
1764 HAL_LE_STATE_CONNECTED :
1765 HAL_LE_STATE_DISCONNECTED;
1767 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1770 ERR("Bluetooth HAL event handler not registered");
1772 event_cb(HAL_EV_LE_CONN_STATE_CHANGED, &ev, sizeof(ev));
1776 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted,
1777 const char *address)
1779 struct hal_ev_device_trust_state_changed ev;
1782 ev.trust = (is_trusted == TRUE) ?
1783 HAL_DEVICE_TRUSTED :
1784 HAL_DEVICE_UNTRUSTED;
1786 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1789 ERR("Bluetooth HAL event handler not registered");
1791 event_cb(HAL_EV_DEVICE_TRUST_CHANGED, &ev, sizeof(ev));
1795 static void __bt_hal_send_device_trusted_profile_changed_event(
1796 uint32_t trust_val, const char *address)
1798 struct hal_ev_device_trusted_profiles_changed ev;
1801 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1802 ev.trust_val = trust_val;
1805 ERR("Bluetooth HAL event handler not registered");
1807 event_cb(HAL_EV_DEVICE_TRUSTED_PROFILES_CHANGED, &ev, sizeof(ev));
1811 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member,
1815 const char *property = NULL;
1819 if (strcasecmp(member, "PropertyChanged") == 0) {
1820 g_variant_get(msg, "(s)", &property);
1821 if (property == NULL)
1823 if (strcasecmp(property, "GattConnected") == 0) {
1824 INFO("GATT Connected");
1825 gboolean connected = FALSE;
1827 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1829 _bt_hal_convert_device_path_to_address(path, address);
1830 g_variant_get(msg, "(b)", &connected);
1832 INFO("Connected device address[%s] connnected[%d]", address, connected);
1834 } else if (strcasecmp(property, "Paired") == 0) {
1835 gboolean paired = FALSE;
1836 struct hal_ev_bond_state_changed ev;
1837 char address[BT_HAL_ADDRESS_STRING_SIZE];
1839 g_variant_get(msg, "(b)", &paired);
1840 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1842 _bt_hal_agent_set_canceled(FALSE);
1843 _bt_hal_convert_device_path_to_address(path, address);
1845 /* Prepare to send event to HAL bluetooth */
1846 ev.status = BT_STATUS_SUCCESS;
1847 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1848 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1851 ERR("Bluetooth HAL event handler not registered");
1853 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
1854 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1856 } else if (strcasecmp(property, "UUIDs") == 0) {
1859 } else if (strcasecmp(member, "DeviceConnected") == 0) {
1860 unsigned char addr_type = 0;
1862 g_variant_get(msg, "(y)", &addr_type);
1864 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1865 _bt_hal_convert_device_path_to_address(path, address);
1867 DBG("Member: [%s]", member);
1868 ERR_C("Connected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
1870 __bt_hal_send_device_acl_connection_state_event(TRUE, address);
1872 __bt_hal_send_device_le_connection_state_event(TRUE, address);
1874 } else if (strcasecmp(member, "Disconnected") == 0) {
1875 unsigned char disc_reason = 0;
1876 unsigned char addr_type = 0;
1879 g_variant_get(msg, "(yy&s)", &addr_type, &disc_reason, &name);
1881 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1882 _bt_hal_convert_device_path_to_address(path, address);
1884 DBG("Member: [%s]", member);
1885 ERR_C("DisConnected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
1886 DBG("Disconnect Reason: %d", disc_reason);
1887 DBG("Name: %s", name);
1889 __bt_hal_send_device_acl_connection_state_event(FALSE, address);
1891 __bt_hal_send_device_le_connection_state_event(FALSE, address);
1893 } else if (strcasecmp(member, "ProfileStateChanged") == 0) {
1895 char *profile_uuid = NULL;
1897 g_variant_get(msg, "(si)", &profile_uuid, &state);
1898 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1899 _bt_hal_convert_device_path_to_address(path, address);
1901 DBG("Address: %s", address);
1902 DBG("Profile UUID: %s", profile_uuid);
1903 DBG("State: %d", state);
1904 if (strncmp(profile_uuid, HID_UUID, strlen(HID_UUID)) == 0) {
1905 if (state == BT_HAL_PROFILE_STATE_CONNECTED)
1906 __bt_hal_send_hid_connection_state_event(TRUE, address);
1907 else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED)
1908 __bt_hal_send_hid_connection_state_event(FALSE, address);
1910 DBG("Profile state: %d", state);
1912 } else if ((strncmp(profile_uuid, A2DP_SINK_UUID, strlen(A2DP_SINK_UUID)) == 0)) {
1913 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
1914 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTED");
1915 __bt_hal_send_av_connection_state_event(TRUE, address);
1916 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
1917 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
1918 __bt_hal_send_av_connection_state_event(FALSE, address);
1919 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
1920 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
1921 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
1922 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTING");
1924 ERR("A2DP Profile state: Invalid");
1926 } else if ((strncmp(profile_uuid, A2DP_SOURCE_UUID, strlen(A2DP_SOURCE_UUID)) == 0)) {
1927 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
1928 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
1929 __bt_hal_send_a2dp_sink_connection_state_event(TRUE, address);
1930 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
1931 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
1932 __bt_hal_send_a2dp_sink_connection_state_event(FALSE, address);
1933 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
1934 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
1935 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
1936 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
1938 } else if (strncmp(profile_uuid, HFP_HF_UUID, strlen(HFP_HF_UUID)) == 0) {
1939 if (state == BT_HAL_PROFILE_STATE_CONNECTING)
1940 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTING");
1941 else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
1942 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTED");
1943 __bt_hal_send_hf_connection_state_event(TRUE, address);
1944 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
1945 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
1946 __bt_hal_send_hf_connection_state_event(FALSE, address);
1947 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
1948 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
1950 ERR("HFP Profile state: Invalid");
1952 } else if ((strncmp(profile_uuid, AVRCP_TARGET_UUID, strlen(AVRCP_TARGET_UUID)) == 0)) {
1953 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
1954 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
1955 __bt_hal_send_avrcp_ctrl_connection_state_event(TRUE, address);
1956 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
1957 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
1958 __bt_hal_send_avrcp_ctrl_connection_state_event(FALSE, address);
1959 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
1960 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
1961 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
1962 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
1965 DBG("Profile[%s] State changed status [%d] ", profile_uuid, state);
1968 g_free(profile_uuid);
1969 } else if (strcasecmp(member, "AdvReport") == 0) {
1970 DBG("Member: [%s]", member);
1971 __bt_hal_handle_adv_report(msg, path);
1975 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path)
1977 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
1978 struct hal_ev_gatt_client_scan_result *ev = (void *)buf;
1980 char *address = NULL;
1981 GVariant *value = NULL;
1982 char *buffer = NULL;
1985 uint8_t addr_type = 0;
1986 uint8_t adv_type = 0;
1992 memset(buf, 0, sizeof(buf));
1995 g_variant_get(msg, "(&syyii@ay)", &address, &addr_type,
1996 &adv_type, &rssi, &data_len, &value);
1998 buffer_len = g_variant_get_size(value);
2000 buffer = (char *)g_variant_get_data(value);
2002 if (data_len != buffer_len) {
2003 ERR("Unexpected: buffer_len: %d, data_len: %d",
2004 buffer_len, data_len);
2005 data_len = buffer_len;
2008 DBG("Address: %s, len: %d, rssi: %d, addr_type: 0x%02X, adv_type: 0x%02X",
2009 address, data_len, rssi, addr_type, adv_type);
2011 _bt_hal_convert_addr_string_to_type(ev->bd_addr, address);
2012 ev->addr_type = addr_type;
2013 ev->adv_type = adv_type;
2016 memcpy(ev->adv_data, buffer, data_len);
2019 DBG("Send le scan result event to HAL, size: [%d]", size);
2020 gatt_event_cb(HAL_EV_GATT_CLIENT_SCAN_RESULT, buf, size);
2021 g_variant_unref(value);
2024 /* AVRCP Controller Role(Remote:AVRCP Target) Events */
2025 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address)
2028 struct hal_ev_avrcp_ctrl_conn_state ev;
2030 if (connected == TRUE)
2031 INFO("AVRCP(Controller) Profile Connected for address [%s]", address);
2033 INFO("AVRCP(Controller) Profile DisConnected for address [%s]", address);
2035 if (connected == TRUE)
2036 ev.state = HAL_AVRCP_CTRL_STATE_CONNECTED;
2038 ev.state = HAL_AVRCP_CTRL_STATE_DISCONNECTED;
2039 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2041 if (!a2dp_sink_event_cb)
2042 ERR("AV event handler not registered");
2044 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_CONN_STATE, &ev, sizeof(ev));
2047 static int __bt_media_attr_to_type(const char *str)
2049 if (!strcasecmp(str, "Equalizer"))
2050 return HAL_PLAYER_ATTR_EQUALIZER;
2051 else if (!strcasecmp(str, "Repeat"))
2052 return HAL_PLAYER_ATTR_REPEAT;
2053 else if (!strcasecmp(str, "Shuffle"))
2054 return HAL_PLAYER_ATTR_SHUFFLE;
2055 else if (!strcasecmp(str, "Scan"))
2056 return HAL_PLAYER_ATTR_SCAN;
2062 static int __bt_hal_play_status_str_to_type(const char *value)
2064 if (!strcmp(value, "stopped"))
2065 return HAL_PLAYSTATE_STOPPED;
2066 else if (!strcmp(value, "playing"))
2067 return HAL_PLAYSTATE_PLAYING;
2068 else if (!strcmp(value, "paused"))
2069 return HAL_PLAYSTATE_PAUSED;
2070 else if (!strcmp(value, "forward-seek"))
2071 return HAL_PLAYSTATE_FWD_SEEK;
2072 else if (!strcmp(value, "reverse-seek"))
2073 return HAL_PLAYSTATE_REV_SEEK;
2075 return HAL_PLAYSTATE_ERROR;
2078 static void __bt_avrcp_control_parse_properties(struct hal_ev_track_changed *ev, GVariant *item)
2080 GVariant *value = NULL;
2082 char *value_string = NULL;
2083 const char *key = NULL;
2089 g_variant_iter_init(&iter, item);
2090 while (g_variant_iter_loop(&iter, "{sv}", &key, &value)) {
2091 if (strcasecmp(key, "Title") == 0) {
2092 value_string = (char *)g_variant_get_string(value, NULL);
2093 DBG("Value : %s ", value_string);
2094 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TITLE;
2095 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2097 } else if (strcasecmp(key, "Artist") == 0) {
2098 value_string = (char *)g_variant_get_string(value, NULL);
2099 DBG("Value : %s ", value_string);
2100 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ARTIST;
2101 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2103 } else if (strcasecmp(key, "Album") == 0) {
2104 value_string = (char *)g_variant_get_string(value, NULL);
2105 DBG("Value : %s ", value_string);
2106 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ALBUM;
2107 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2109 } else if (strcasecmp(key, "Genre") == 0) {
2110 value_string = (char *)g_variant_get_string(value, NULL);
2111 DBG("Value : %s ", value_string);
2112 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_GENRE;
2113 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2115 } else if (strcasecmp(key, "Duration") == 0) {
2118 val = g_variant_get_uint32(value);
2119 DBG("Value : %d", val);
2120 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_PLAYING_TIME;
2121 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2123 } else if (strcasecmp(key, "NumberOfTracks") == 0) {
2126 val = g_variant_get_uint32(value);
2127 DBG("Value : %d", val);
2128 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_NUM_TRACKS;
2129 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2131 } else if (strcasecmp(key, "TrackNumber") == 0) {
2134 val = g_variant_get_uint32(value);
2135 DBG("Value : %d", val);
2136 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TRACK_NUM;
2137 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2140 DBG("%s not supported, ignoring", key);
2143 if (i >= HAL_MAX_ATTR_NUM) {
2144 ERR(" Received max attribute [%d]", i);
2150 g_variant_iter_free(&iter);
2154 static int __bt_media_attrval_to_val(int type, const char *value)
2159 case HAL_PLAYER_ATTR_EQUALIZER:
2160 if (!strcmp(value, "off"))
2165 case HAL_PLAYER_ATTR_REPEAT:
2166 if (!strcmp(value, "off"))
2167 ret = BTRC_PLAYER_VAL_OFF_REPEAT;
2168 else if (!strcmp(value, "singletrack"))
2169 ret = BTRC_PLAYER_VAL_SINGLE_REPEAT;
2170 else if (!strcmp(value, "alltracks"))
2171 ret = BTRC_PLAYER_VAL_ALL_REPEAT;
2173 ret = BTRC_PLAYER_VAL_GROUP_REPEAT;
2175 case HAL_PLAYER_ATTR_SHUFFLE:
2176 if (!strcmp(value, "off"))
2177 ret = BTRC_PLAYER_VAL_OFF_SHUFFLE;
2178 else if (!strcmp(value, "alltracks"))
2179 ret = BTRC_PLAYER_VAL_ALL_SHUFFLE;
2181 ret = BTRC_PLAYER_VAL_GROUP_SHUFFLE;
2183 case HAL_PLAYER_ATTR_SCAN:
2184 if (!strcmp(value, "off"))
2186 else if (!strcmp(value, "alltracks"))
2192 ERR("Value not handled");
2198 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member,
2201 const char *property = NULL;
2202 GVariant *value = NULL;
2204 char address[BT_HAL_ADDRESS_STRING_SIZE];
2207 ERR("Error returned in method call\n");
2211 if (!avrcp_ctrl_event_cb) {
2212 ERR("AVRCP controller DBUS handler callback not registered");
2216 g_variant_iter_init(&iter, msg);
2218 _bt_hal_convert_device_path_to_address(path, address);
2220 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2221 DBG("Property = %s \n", property);
2222 if ((strcasecmp(property, "Equalizer") == 0) ||
2223 (strcasecmp(property, "Repeat") == 0) ||
2224 (strcasecmp(property, "Shuffle") == 0) ||
2225 (strcasecmp(property, "Scan") == 0)) {
2226 struct hal_ev_player_setting ev;
2230 valstr = g_variant_get_string(value, NULL);
2231 DBG("Value : %s ", valstr);
2234 val = __bt_media_attrval_to_val(__bt_media_attr_to_type(property), valstr);
2237 memset(&ev, 0, sizeof(ev));
2238 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2240 ev.attr_ids[0] = __bt_media_attr_to_type(property);
2241 ev.attr_values[0] = val;
2243 /* Send event to application */
2244 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAYER_APP_SETTING_CHANGED, &ev, sizeof(ev));
2246 } else if ((strcasecmp(property, "Status") == 0)) {
2247 struct hal_ev_play_status_changed ev;
2250 valstr = g_variant_get_string(value, NULL);
2251 DBG("Value : %s ", valstr);
2253 memset(&ev, 0, sizeof(ev));
2254 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2256 ev.status = __bt_hal_play_status_str_to_type(valstr);
2258 /* Send event to application */
2259 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_STATUS_CHANGED, &ev, sizeof(ev));
2261 } else if (strcasecmp(property, "Position") == 0) {
2262 struct hal_ev_play_position ev;
2264 memset(&ev, 0, sizeof(ev));
2265 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2266 ev.pos = g_variant_get_uint32(value);
2267 DBG("Value : %d ", ev.pos);
2269 /* Send event to application */
2270 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_POSITION_CHANGED, &ev, sizeof(ev));
2271 } else if (strcasecmp(property, "Track") == 0) {
2272 struct hal_ev_track_changed ev;
2274 memset(&ev, 0, sizeof(ev));
2275 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2276 __bt_avrcp_control_parse_properties(&ev, value);
2278 /* Send event to application */
2279 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_TRACK_CHANGED, &ev, sizeof(ev));
2281 DBG("Property not handled");
2285 g_free((char *)property);
2286 g_variant_unref(value);
2289 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member,
2292 const char *property = NULL;
2293 GVariant *value = NULL;
2295 char address[BT_HAL_ADDRESS_STRING_SIZE];
2299 ERR("Error returned in method call\n");
2303 if (!avrcp_tg_event_cb) {
2304 ERR("AVRCP target DBUS handler callback not registered");
2308 g_variant_iter_init(&iter, msg);
2310 _bt_hal_convert_device_path_to_address(path, address);
2312 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2313 DBG("Property = %s \n", property);
2314 if ((strcasecmp(property, "Delay") == 0)) {
2315 struct hal_ev_avrcp_tg_delay_changed ev;
2318 memset(&ev, 0, sizeof(ev));
2319 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2321 val = g_variant_get_uint16(value);
2322 DBG("Value : %d", val);
2325 /* Send event to application */
2326 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_DELAY_CHANGE, &ev, sizeof(ev));
2328 DBG("Property not handled");
2333 g_free((char *)property);
2334 g_variant_unref(value);
2337 /* A2DP Src Role(Remote:Sink) Events */
2338 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address)
2341 struct hal_ev_a2dp_conn_state ev;
2343 if (connected == TRUE)
2344 INFO("A2DP(Src) Profile Connected for address [%s]", address);
2346 INFO("A2DP(Src) Profile DisConnected for address [%s]", address);
2348 ev.state = (connected == TRUE) ?
2349 HAL_EV_A2DP_STATE_CONNECTED :
2350 HAL_EV_A2DP_STATE_DISCONNECTED;
2352 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2355 ERR("AV event handler not registered");
2357 av_event_cb(HAL_EV_A2DP_CONN_STATE, &ev, sizeof(ev));
2360 /* A2DP Sink Role(Remote:Source) Events */
2361 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address)
2364 struct hal_ev_a2dp_conn_state ev;
2366 if (connected == TRUE)
2367 INFO("A2DP(Sink) Profile Connected for address [%s]", address);
2369 INFO("A2DP(Sink) Profile DisConnected for address [%s]", address);
2371 ev.state = (connected == TRUE) ?
2372 HAL_EV_A2DP_STATE_CONNECTED :
2373 HAL_EV_A2DP_STATE_DISCONNECTED;
2375 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2377 if (!a2dp_sink_event_cb)
2378 ERR("AV event handler not registered");
2380 a2dp_sink_event_cb(HAL_EV_A2DP_SOURCE_CONN_STATE, &ev, sizeof(ev));
2383 /* HF(AG Role) Audio Events */
2384 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected,
2385 const char *address)
2388 struct hal_ev_handsfree_audio_state ev;
2390 if (connected == TRUE)
2391 INFO("AG Audio Connected for address [%s]", address);
2393 INFO("AG Audio DisConnected for address [%s]", address);
2395 ev.state = (connected == TRUE) ?
2396 HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTED :
2397 HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED;
2399 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2402 ERR("HF event handler not registered");
2404 hf_event_cb(HAL_EV_HANDSFREE_AUDIO_STATE, &ev, sizeof(ev));
2407 /* HF(AG Role) Profile Events */
2408 static void __bt_hal_send_hf_connection_state_event(gboolean connected,
2409 const char *address)
2412 struct hal_ev_handsfree_conn_state ev;
2414 if (connected == TRUE)
2415 INFO("AG Profile Connected for address [%s]", address);
2417 INFO("AG Profile DisConnected for address [%s]", address);
2419 ev.state = (connected == TRUE) ?
2420 HAL_EV_HANDSFREE_CONN_STATE_CONNECTED :
2421 HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTED;
2423 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2426 ERR("HF event handler not registered");
2428 hf_event_cb(HAL_EV_HANDSFREE_CONN_STATE, &ev, sizeof(ev));
2431 void _bt_hal_register_event_handler_cb(bt_hal_module_e module, handle_stack_msg cb)
2441 a2dp_sink_event_cb = cb;
2447 avrcp_tg_event_cb = cb;
2449 case HAL_AVRCP_CTRL:
2450 avrcp_ctrl_event_cb = cb;
2456 ERR("Unknown module: %d", module);
2460 void _bt_hal_unregister_event_handler_cb(bt_hal_module_e module)
2464 hid_event_cb = NULL;
2470 a2dp_sink_event_cb = NULL;
2476 avrcp_tg_event_cb = NULL;
2478 case HAL_AVRCP_CTRL:
2479 avrcp_ctrl_event_cb = NULL;
2482 gatt_event_cb = NULL;
2485 ERR("Unknown module: %d", module);
2489 bool _bt_hal_get_adapter_request_state(void)
2491 return is_adapter_activating;
2494 bool _bt_hal_get_le_request_state(void)
2496 return is_le_activating;
2499 void _bt_hal_set_adapter_request_state(bool enable)
2501 DBG("set_adapter_request_state %d", enable);
2502 is_adapter_activating = enable;
2505 void _bt_hal_set_le_request_state(bool enable)
2507 DBG("set_le_request_state %d", enable);
2508 is_le_activating = enable;