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"
42 #define BASELEN_PROP_CHANGED (sizeof(struct hal_ev_adapter_props_changed) \
43 + sizeof(struct hal_property))
45 /*TODO: Basic filters are currently added,
46 Need to add different event filters like HID,
47 Device etc in subsequent patches */
49 /* Global variables and structures */
50 static GDBusConnection *manager_conn;
51 static handle_stack_msg event_cb = NULL;
52 static handle_stack_msg hid_event_cb = NULL;
53 static handle_stack_msg av_event_cb = NULL;
54 static handle_stack_msg a2dp_sink_event_cb = NULL;
55 static handle_stack_msg hf_event_cb = NULL;
56 static handle_stack_msg avrcp_ctrl_event_cb = NULL;
57 static handle_stack_msg avrcp_tg_event_cb = NULL;
58 static handle_stack_msg gatt_event_cb = NULL;
59 static guint event_id;
61 /*State Management sepration Control for Adapter and LE */
62 static gboolean is_adapter_activating = FALSE;
63 static gboolean is_le_activating = FALSE;
68 gchar* interface_name;
71 } bt_hal_main_event_data_t;
73 /* Forward declarations */
74 static gboolean __bt_hal_event_manager(gpointer param);
75 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type);
76 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn, int subscribe);
77 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn, int subscribe);
78 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe);
80 static int __bt_hal_parse_event(GVariant *msg);
81 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current);
83 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path);
84 static void __bt_hal_adapter_property_changed_event(GVariant *msg);
85 static void __bt_hal_manager_event_filter(GDBusConnection *connection, const gchar *sender_name,
86 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
87 GVariant *parameters, gpointer user_data);
88 static int __bt_hal_initialize_manager_receiver(void);
89 static gboolean __bt_hal_parse_interface(GVariant *msg);
90 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters);
91 static gboolean __bt_hal_parse_device_properties(GVariant *item);
92 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data);
93 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path);
94 static void __bt_hal_dbus_device_found_properties(const char *device_path);
95 static void __bt_hal_device_properties_lookup(GVariant *result, char *address);
96 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member, const char *path);
97 static void __bt_hal_send_device_acl_connection_state_event(gboolean connected, const char *address);
98 static void __bt_hal_handle_input_event(GVariant *msg, const char *path);
99 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address);
100 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address);
101 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address);
102 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member, const char *path);
104 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted, const char *address);
105 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn, int subscribe);
106 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path);
107 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected, const char *address);
108 static void __bt_hal_send_hf_connection_state_event(gboolean connected, const char *address);
109 static void __bt_hal_send_device_trusted_profile_changed_event(uint32_t trust_val, const char *address);
110 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path);
112 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data)
116 struct hal_ev_discovery_state_changed ev;
117 ev.state = HAL_DISCOVERY_STATE_STOPPED;
118 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
124 static int __bt_hal_parse_event(GVariant *msg)
128 char *interface_name = NULL;
129 GVariant *inner_iter = NULL;
131 g_variant_iter_init(&iter, msg);
133 while ((child = g_variant_iter_next_value(&iter))) {
134 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
135 if (g_strcmp0(interface_name,
136 BT_HAL_DEVICE_INTERFACE) == 0) {
137 DBG("__bt_hal_parse_event: Interface: BT_HAL_DEVICE_INTERFACE");
138 g_variant_unref(inner_iter);
139 g_variant_unref(child);
140 return BT_HAL_DEVICE_EVENT;
141 } else if (g_strcmp0(interface_name,
142 BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
143 DBG("__bt_hal_parse_event: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
144 g_variant_unref(inner_iter);
145 g_variant_unref(child);
146 return BT_HAL_MEDIA_TRANSFER_EVENT;
147 } else if (g_strcmp0(interface_name,
148 BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
149 DBG("__bt_hal_parse_event: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
150 g_variant_unref(inner_iter);
151 g_variant_unref(child);
152 return BT_HAL_AVRCP_CONTROL_EVENT;
154 g_variant_unref(inner_iter);
155 g_variant_unref(child);
161 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current)
163 g_variant_get(msg, "(sss)", name, previous, current);
164 return BT_HAL_ERROR_NONE;
167 int __bt_insert_hal_properties(void *buf, uint8_t type, uint16_t len, const void *val)
168 { struct hal_property *prop = buf;
174 memcpy(prop->val, val, len);
176 return sizeof(*prop) + len;
179 handle_stack_msg _bt_hal_get_stack_message_handler(void)
184 static void __bt_hal_adapter_property_changed_event(GVariant *msg)
186 GVariantIter value_iter;
187 GVariant *value = NULL;
188 GDBusProxy *adapter_proxy;
191 g_variant_iter_init(&value_iter, msg);
193 /* Buffer and propety count management */
194 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
195 struct hal_ev_adapter_props_changed *ev = (void*) buf;
197 const gchar *address = NULL;
199 unsigned int cod = 0;
200 gboolean discoverable;
201 gboolean connectable;
202 unsigned int scan_mode = BT_SCAN_MODE_NONE;
203 unsigned int disc_timeout;
204 const gchar *version;
205 const gboolean ipsp_initialized;
208 unsigned int pairable_timeout;
209 gboolean scan_mode_property_update = FALSE;
210 gboolean is_discovering;
211 gboolean is_le_discovering;
213 memset(buf, 0, sizeof(buf));
216 ev->status = BT_STATUS_SUCCESS;
220 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
221 if (!g_strcmp0(key, "Address")) {
224 address = g_variant_get_string(value, NULL);
225 DBG("##Address [%s]", address);
226 _bt_hal_convert_addr_string_to_type(bdaddr, address);
227 size += __bt_insert_hal_properties(buf + size,
228 HAL_PROP_ADAPTER_ADDR, sizeof(bdaddr), bdaddr);
230 } else if (!g_strcmp0(key, "Alias")) {
231 g_variant_get(value, "&s", &name);
232 DBG("##Alias [%s] ", name);
233 size += __bt_insert_hal_properties(buf + size,
234 HAL_PROP_ADAPTER_NAME, strlen(name) + 1, name);
237 } else if (!g_strcmp0(key, "Class")) {
238 cod = g_variant_get_uint32(value);
239 DBG("##Class [%d]", cod);
240 size += __bt_insert_hal_properties(buf + size,
241 HAL_PROP_ADAPTER_CLASS, sizeof(unsigned int), &cod);
243 } else if (!g_strcmp0(key, "Discoverable")) {
244 discoverable = g_variant_get_boolean(value);
245 DBG("##Discoverable [%d]", discoverable);
247 scan_mode = BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE;
249 scan_mode = BT_SCAN_MODE_CONNECTABLE;
250 scan_mode_property_update = TRUE;
251 } else if (!g_strcmp0(key, "DiscoverableTimeout")) {
252 disc_timeout = g_variant_get_uint32(value);
253 DBG("##Discoverable Timeout [%d]", disc_timeout);
254 size += __bt_insert_hal_properties(buf + size,
255 HAL_PROP_ADAPTER_DISC_TIMEOUT, sizeof(unsigned int), &disc_timeout);
257 } else if (!g_strcmp0(key, "Connectable")) {
258 connectable = g_variant_get_boolean(value);
259 DBG("##Connectable [%d]", connectable);
261 scan_mode = BT_SCAN_MODE_NONE;
262 else if (scan_mode == BT_SCAN_MODE_NONE)
263 scan_mode = BT_SCAN_MODE_CONNECTABLE;
264 scan_mode_property_update = TRUE;
265 } else if (!g_strcmp0(key, "Version")) {
266 version = g_variant_get_string(value, NULL);
267 DBG("##Version [%s]", version);
268 size += __bt_insert_hal_properties(buf + size,
269 HAL_PROP_ADAPTER_VERSION, strlen(version) + 1, version);
271 } else if (!g_strcmp0(key, "Name")) {
272 g_variant_get(value, "&s", &name);
273 DBG("##Name [%s]", name);
274 size += __bt_insert_hal_properties(buf + size,
275 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);
441 while (g_variant_iter_next(iter, "&s", &name) &&
442 g_variant_iter_next(iter, "&s", &val)) {
443 DBG("name = %s, Value = %s", name, val);
444 g_variant_iter_loop(iter, "s", &val);
445 if (FALSE == _bt_hal_update_le_feature_support(name, val))
446 ERR("Failed to update LE feature (name = %s, value = %s)", name, val);
449 g_variant_iter_free(iter);
450 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
451 g_variant_get(value, "b" , &ipsp_initialized);
452 DBG("##IPSP Initialized = %d", ipsp_initialized);
454 ERR("Unhandled Property:[%s]", key);
458 if (scan_mode_property_update) {
459 size += __bt_insert_hal_properties(buf + size,
460 HAL_PROP_ADAPTER_SCAN_MODE, sizeof(int), &scan_mode);
466 DBG("Send Adapter properties changed event to HAL user, Num Prop [%d] total size [%d]", ev->num_props, size);
467 event_cb(HAL_EV_ADAPTER_PROPS_CHANGED, buf, size);
469 g_variant_unref(value);
473 void _bt_hal_handle_adapter_event(GVariant *msg, const char *member)
480 if (strcasecmp(member, "DeviceCreated") == 0) {
481 DBG("DeviceCreated: Unhandled");
482 } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
483 DBG("InterfacesRemoved: Unhandled");
484 } else if (strcasecmp(member, "AdvertisingEnabled") == 0) {
485 DBG("AdvertisingEnabled");
486 DBG("Advertising Enabled");
488 gboolean status = FALSE;
489 g_variant_get(msg, "(ib)", &slot_id, &status);
490 DBG("Advertising Enabled : slot_id [%d] status [%d]", slot_id, status);
491 /* Send event to application */
492 _bt_hal_set_advertising_status(slot_id, status);
493 } else if (strcasecmp(member, "RssiEnabled") == 0) {
494 struct hal_ev_rssi_monitor_state_changed ev;
495 gboolean status = FALSE;
496 char *address = NULL;
499 g_variant_get(msg, "(sib)", &address, &link_type, &status);
500 DBG("RSSI monitoring %s for %s",
501 (status ? "Enabled" : "Disabled"), address);
503 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
504 ev.link_type = link_type;
505 ev.state = (status ? HAL_RSSI_MONITORING_ENABLED : HAL_RSSI_MONITORING_DISABLED);
507 ERR("event_cb is NULL");
509 event_cb(HAL_EV_RSSI_MONITOR_STATE_CHANGED, &ev, sizeof(ev));
512 } else if (strcasecmp(member, "RssiAlert") == 0) {
513 struct hal_ev_rssi_alert_recieved ev;
517 char *address = NULL;
519 g_variant_get(msg, "(siii)", &address, &link_type, &alert_type, &rssi_dbm);
520 DBG("RSSI Alert: [Address %s LinkType %d] [Type %d DBM %d]",
521 address, alert_type, rssi_dbm);
523 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
524 ev.link_type = link_type;
525 ev.alert_type = alert_type;
529 ERR("event_cb is NULL");
531 event_cb(HAL_EV_RSSI_ALERT_RECIEVED, &ev, sizeof(ev));
534 } else if (strcasecmp(member, "RawRssi") == 0) {
535 struct hal_ev_raw_rssi_recieved ev;
538 char *address = NULL;
540 g_variant_get(msg, "(sii)", &address, &link_type, &rssi_dbm);
541 DBG("Raw RSSI: [Address %s] [Link Type %d][RSSI DBM %d]",
542 address, link_type, rssi_dbm);
544 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
545 ev.link_type = link_type;
549 ERR("event_cb is NULL");
551 event_cb(HAL_EV_RAW_RSSI_RECIEVED, &ev, sizeof(ev));
554 } else if (strcasecmp(member, BT_HAL_HARDWARE_ERROR) == 0) {
555 DBG("BT Hardware Error: Unhandled");
556 } else if (strcasecmp(member, BT_HAL_TX_TIMEOUT_ERROR) == 0) {
557 DBG("BT TX Timeout Error: Unhandled");
563 static gboolean __bt_hal_parse_device_properties(GVariant *item)
573 /* Buffer and propety count management */
574 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
575 struct hal_ev_device_found *ev = (void *) buf;
577 memset(buf, 0, sizeof(buf));
581 g_variant_iter_init(&iter, item);
582 while (g_variant_iter_loop(&iter, "{sv}", &key, &val)) {
584 if (strcasecmp(key, "Address") == 0) {
586 char * address = NULL;
587 address = g_variant_dup_string(val, &len);
589 _bt_hal_convert_addr_string_to_type(bdaddr, address);
591 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
592 sizeof(bdaddr), bdaddr);
595 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
597 } else if (strcasecmp(key, "Class") == 0) {
598 unsigned int class = g_variant_get_uint32(val);
599 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
600 sizeof(unsigned int), &class);
602 DBG("Device class [%d] Property num [%d]", class, ev->num_props);
603 } else if (strcasecmp(key, "name") == 0) {
604 char *name = g_variant_dup_string(val, &len);
606 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
607 strlen(name) + 1, name);
609 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
611 } else if (strcasecmp(key, "Connected") == 0) {
612 unsigned int connected = g_variant_get_uint32(val);
614 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
615 sizeof(unsigned int), &connected);
617 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
618 } else if (strcasecmp(key, "paired") == 0) {
619 uint8_t paired = (g_variant_get_boolean(val) ? 1 : 0);
620 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
621 sizeof(uint8_t), &paired);
623 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
624 } else if (strcasecmp(key, "Trusted") == 0) {
625 uint8_t trust = (g_variant_get_boolean(val) ? 1 : 0);
626 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
627 sizeof(uint8_t), &trust);
629 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
630 } else if (strcasecmp(key, "RSSI") == 0) {
631 int rssi = g_variant_get_int16(val);
632 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
635 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
636 } else if (strcasecmp(key, "LastAddrType") == 0) {
637 /* TODO: To be handled later*/
638 } else if (!g_strcmp0(key, "IsAliasSet")) {
639 uint8_t is_alias_set = (g_variant_get_boolean(val) ? 1 : 0);
640 DBG("IsAliasSet: %s", (is_alias_set ? "TRUE" : "FALSE"));
641 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
642 sizeof(uint8_t), &is_alias_set);
644 } else if (strcasecmp(key, "UUIDs") == 0) {
649 size1 = g_variant_get_size(val);
650 DBG("UUID count from size [%d]\n", size1);
651 int num_props_tmp = ev->num_props;
654 uuid_value = (char **)g_variant_get_strv(val, &size1);
655 for (i = 0; uuid_value[i] != NULL; i++)
657 DBG("UUID count [%d]\n", uuid_count);
658 /* UUID collection */
659 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
661 for (i = 0; uuid_value[i] != NULL; i++) {
663 char *uuid_str = NULL;
664 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
665 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
667 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
668 uuid_str = g_strdup(uuid_value[i]);
669 DBG("UUID string [%s]\n", uuid_str);
670 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
671 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
675 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
676 (BT_HAL_STACK_UUID_SIZE * uuid_count),
678 ev->num_props = num_props_tmp + 1;
682 } else if (strcasecmp(key, "ManufacturerDataLen") == 0) {
683 /* TODO: To be handled later*/
684 } else if (strcasecmp(key, "ManufacturerData") == 0) {
685 /* TODO: To be handled later*/
687 ERR("Unhandled Property:[%s]", key);
693 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%d]", ev->num_props, size);
694 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
700 static void __bt_hal_handle_avrcp_tg_events(GVariant *msg, const char *path)
703 GVariantIter value_iter;
704 char *property = NULL;
706 GVariant *val = NULL;
707 GVariant *child = NULL;
709 g_variant_iter_init(&value_iter, msg);
710 while ((child = g_variant_iter_next_value(&value_iter))) {
711 g_variant_get(child, "{sv}", &property, &val);
712 INFO("Property %s", property);
713 if (strcasecmp(property, "Connected") == 0) {
714 struct hal_ev_avrcp_tg_conn_state ev;
716 gboolean connected = FALSE;
718 g_variant_get(val, "b", &connected);
720 state = connected ? HAL_AVRCP_TG_STATE_CONNECTED :
721 HAL_AVRCP_TG_STATE_DISCONNECTED;
723 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
725 _bt_hal_convert_device_path_to_address(path, address);
727 DBG("connected: %d", connected);
728 DBG("address: %s", address);
730 /* Prepare to send AVRCP Target connection state event */
731 memset(&ev, 0, sizeof(ev));
732 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
734 if (!avrcp_tg_event_cb)
735 ERR("AVRCP target DBUS handler callback not registered");
737 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_CONN_STATE, (void *)&ev, sizeof(ev));
741 g_variant_unref(child);
742 g_variant_unref(val);
748 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path)
750 char *interface_name = NULL;
751 GVariant *val = NULL;
753 g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, &val, NULL);
755 if (strcasecmp(interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
756 DBG("Event: Property Changed: Interface: BT_HAL_ADAPTER_INTERFACE");
757 __bt_hal_adapter_property_changed_event(val);
758 } else if (strcasecmp(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
759 DBG("Event: Property Changed: Interface: BT_HAL_DEVICE_INTERFACE");
760 __bt_hal_device_property_changed_event(val, object_path);
761 } else if (strcasecmp(interface_name, BT_HAL_OBEX_TRANSFER_INTERFACE) == 0) {
762 DBG("Event: Property Changed: Interface: BT_HAL_OBEX_TRANSFER_INTERFACE");
763 /* TODO: Handle event */
764 } else if (strcasecmp(interface_name, BT_HAL_MEDIA_CONTROL_INTERFACE) == 0) {
765 DBG("Event: Property Changed: Interface: BT_HAL_MEDIA_CONTROL_INTERFACE");
766 /* Handle AVRCP target event */
767 __bt_hal_handle_avrcp_tg_events(val, object_path);
768 } else if (strcasecmp(interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
769 DBG("Event: Property Changed: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
770 __bt_hal_handle_avrcp_ctrl_events(val, NULL, object_path);
771 } else if (strcasecmp(interface_name, BT_HAL_NETWORK_CLIENT_INTERFACE) == 0) {
772 DBG("Event: Property Changed: Interface: BT_HAL_NETWORK_CLIENT_INTERFACE");
773 /* TODO: Handle event */
774 } else if (strcasecmp(interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
775 DBG("Event: Property Changed: Interface: BT_HAL_GATT_CHAR_INTERFACE");
776 /* TODO: Handle event */
777 } else if (strcasecmp(interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
778 DBG("Event: Property Changed: Interface: BT_HAL_INPUT_INTERFACE");
779 __bt_hal_handle_input_event(val, object_path);
781 g_variant_unref(val);
784 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters)
788 if (__bt_hal_parse_interface(parameters) == FALSE) {
789 ERR("Fail to parse the properies");
790 g_variant_unref(value);
797 static void __bt_hal_send_hid_connection_state_event(
798 gboolean connected, char *address)
800 struct hal_ev_hidhost_conn_state ev;
802 ev.state = (connected == TRUE) ?
803 HAL_HIDHOST_STATE_CONNECTED :
804 HAL_HIDHOST_STATE_DISCONNECTED;
806 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
809 ERR("HID event handler not registered");
811 hid_event_cb(HAL_EV_HIDHOST_CONN_STATE, &ev, sizeof(ev));
814 static void __bt_hal_handle_input_event(GVariant *msg, const char *path)
816 gboolean property_flag = FALSE;
817 GVariantIter value_iter;
818 char *property = NULL;
819 GVariant *child = NULL, *val = NULL;
822 g_variant_iter_init(&value_iter, msg);
823 while ((child = g_variant_iter_next_value(&value_iter))) {
824 g_variant_get(child, "{sv}", &property, &val);
826 if (property == NULL)
829 if (strcasecmp(property, "Connected") == 0) {
832 g_variant_get(val, "b", &property_flag);
833 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
834 _bt_hal_convert_device_path_to_address(path, address);
835 __bt_hal_send_hid_connection_state_event(property_flag, address);
839 g_variant_unref(val);
840 g_variant_unref(child);
846 static gboolean __bt_hal_parse_interface(GVariant *msg)
849 GVariant *optional_param;
852 char *interface_name = NULL;
853 GVariant *inner_iter = NULL;
854 g_variant_get(msg, "(&o@a{sa{sv}})",
855 &path, &optional_param);
856 g_variant_iter_init(&iter, optional_param);
858 while ((child = g_variant_iter_next_value(&iter))) {
859 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
860 if (g_strcmp0(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
861 DBG("Found a device: %s", path);
862 if (__bt_hal_parse_device_properties(inner_iter) == FALSE) {
863 g_variant_unref(inner_iter);
864 g_variant_unref(child);
865 g_variant_unref(optional_param);
866 ERR("Fail to parse the properies");
869 g_variant_unref(inner_iter);
870 g_variant_unref(child);
871 g_variant_unref(optional_param);
875 g_variant_unref(inner_iter);
876 g_variant_unref(child);
879 g_variant_unref(optional_param);
884 static gboolean __bt_hal_event_manager(gpointer data)
886 bt_hal_event_type_t bt_event = 0x00;
888 char *obj_path = NULL;
890 bt_hal_main_event_data_t *param = (bt_hal_main_event_data_t*)data;
891 if (strcasecmp(param->signal_name, "InterfacesAdded") == 0) {
893 /*TODO: Handle Interfaces Added Signal from stack */
894 DBG("Manager Event: Signal Name: InterfacesAdded");
896 g_variant_get(param->parameters, "(&o@a{sa{sv}})", &obj_path, &value);
898 if (strcasecmp(obj_path, BT_HAL_BLUEZ_HCI_PATH) == 0) {
899 /* TODO: Handle adapter added */
900 DBG("Manager Event: Signal Name: InterfiacesAdded: Adapter added in bluetoothd: path [hci0]");
902 bt_event = __bt_hal_parse_event(value);
903 if (bt_event == BT_HAL_DEVICE_EVENT) {
904 DBG("Device path : %s ", obj_path);
905 __bt_hal_handle_device_event(value, param->parameters);
906 } else if (bt_event == BT_HAL_AVRCP_CONTROL_EVENT) {
907 DBG("Device path : %s ", obj_path);
908 _bt_hal_set_control_device_path(obj_path);
911 g_variant_unref(value);
913 } else if (strcasecmp(param->signal_name, "InterfacesRemoved") == 0) {
917 /*TODO: Handle Interfaces Removed Signal from stack */
918 DBG("Manager Event: Signal Name: InterfacesRemoved");
920 g_variant_get(param->parameters, "(&oas)", &obj_path, &iter);
921 DBG("Device path : %s ", obj_path);
922 while (g_variant_iter_loop(iter, "s", &str)) {
923 if (g_strcmp0(str, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0)
924 _bt_hal_remove_control_device_path(obj_path);
926 g_variant_iter_free(iter);
927 } else if (strcasecmp(param->signal_name, "NameOwnerChanged") == 0) {
929 char *previous = NULL;
930 char *current = NULL;
932 /* TODO: Handle Name Owener changed Signal */
933 if (__bt_hal_get_owner_info(param->parameters, &name, &previous, ¤t)) {
934 DBG("Fail to get the owner info");
937 if (current && *current != '\0') {
943 if (strcasecmp(name, BT_HAL_BLUEZ_NAME) == 0) {
944 DBG("Bluetoothd is terminated");
946 /* TODO: Handle Bluetoothd terminating scenario */
949 INFO("Name Owner changed [%s]", name);
954 } else if (g_strcmp0(param->interface_name, BT_HAL_PROPERTIES_INTERFACE) == 0) {
955 __bt_hal_handle_property_changed_event(param->parameters, param->object_path);
956 } else if (g_strcmp0(param->interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
957 DBG("Manager Event: Interface Name: BT_HAL_ADAPTER_INTERFACE");
958 _bt_hal_handle_adapter_event(param->parameters, param->signal_name);
959 } else if (g_strcmp0(param->interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
960 DBG("Manager Event: Interface Name: BT_HAL_INPUT_INTERFACE");
961 __bt_hal_handle_input_event(param->parameters, param->object_path);
962 } else if (g_strcmp0(param->interface_name, BT_HAL_NETWORK_SERVER_INTERFACE) == 0) {
963 /* TODO: Handle Network Server events from stack */
964 DBG("Manager Event: Interface Name: BT_HAL_NETWORK_SERVER_INTERFACE");
965 } else if (g_strcmp0(param->interface_name, BT_HAL_HEADSET_INTERFACE) == 0) {
966 DBG("Manager Event: Interface Name: BT_HAL_HEADSET_INTERFACE");
967 __bt_hal_handle_headset_events(param->parameters, param->signal_name, param->object_path);
968 } else if (g_strcmp0(param->interface_name, BT_HAL_SINK_INTERFACE) == 0) {
969 /* TODO: Handle Sink interface events from stack */
970 DBG("Manager Event: Interface Name:BT_HAL_SINK_INTERFACE");
971 } else if (g_strcmp0(param->interface_name, BT_HAL_AGENT_INTERFACE) == 0) {
972 /* TODO: Handle Agent events from stack */
973 DBG("Manager Event: Interface Name:BT_HAL_AGENT_INTERFACE");
974 } else if (g_strcmp0(param->interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
975 DBG("Manager Event: Interface Name:BT_HAL_DEVICE_INTERFACE");
976 __bt_hal_handle_device_specific_events(param->parameters, param->signal_name, param->object_path);
977 } else if (g_strcmp0(param->interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
978 DBG("Manager Event: Interface Name: BT_HAL_PLAYER_CONTROL_INTERFACE");
979 __bt_hal_handle_avrcp_ctrl_events(param->parameters, param->signal_name, param->object_path);
983 g_free(param->sender_name);
984 g_free(param->object_path);
985 g_free(param->interface_name);
986 g_free(param->signal_name);
987 g_variant_unref(param->parameters);
992 static void __bt_hal_manager_event_filter(GDBusConnection *connection,
993 const gchar *sender_name,
994 const gchar *object_path,
995 const gchar *interface_name,
996 const gchar *signal_name,
997 GVariant *parameters,
1000 if (signal_name == NULL)
1003 bt_hal_main_event_data_t *param = g_new0(bt_hal_main_event_data_t, 1);
1004 param->sender_name = g_strdup(sender_name);
1005 param->object_path = g_strdup(object_path);
1006 param->interface_name = g_strdup(interface_name);
1007 param->signal_name = g_strdup(signal_name);
1008 param->parameters = g_variant_ref(parameters);
1010 g_idle_add(__bt_hal_event_manager, (gpointer)param);
1014 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path)
1016 gboolean property_flag = FALSE;
1017 char *property = NULL;
1018 GVariant *value = NULL;
1019 g_variant_get(msg, "(sv)", &property, &value);
1021 if (property == NULL)
1024 DBG("Property = %s \n", property);
1025 /* We allow only 1 headset connection (HSP or HFP)*/
1026 if (strcasecmp(property, "Connected") == 0) {
1028 g_variant_get(value, "b", &property_flag);
1030 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1032 /* Fix : NULL_RETURNS */
1033 if (address == NULL)
1036 _bt_hal_convert_device_path_to_address(path, address);
1037 __bt_hal_send_hf_audio_connection_state_event(property_flag, address);
1039 } else if (strcasecmp(property, "State") == 0) {
1042 g_variant_get(value, "s", &state);
1044 /* This code assumes we support only 1 headset connection */
1045 /* Need to use the headset list, if we support multi-headsets */
1046 if (strcasecmp(state, "Playing") == 0) {
1047 DBG("Playing: Sco Connected");
1048 } else if (strcasecmp(state, "connected") == 0 ||
1049 strcasecmp(state, "disconnected") == 0) {
1050 if (strcasecmp(state, "connected") == 0)
1051 DBG("Sco Connected");
1053 DBG("Sco Disconnected");
1055 ERR("Not handled state - %s", state);
1060 } else if (strcasecmp(property, "SpeakerGain") == 0) {
1063 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1065 _bt_hal_convert_device_path_to_address(path, address);
1066 INFO("Speaker Gain for address [%s]", address);
1067 /* TODO Handle event sending to HAL */
1070 } else if (strcasecmp(property, "MicrophoneGain") == 0) {
1073 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1075 _bt_hal_convert_device_path_to_address(path, address);
1076 INFO("Microphone Gain for address [%s]", address);
1077 /* TODO Handle event sending to HAL */
1084 g_variant_unref(value);
1087 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn,
1093 static int subs_interface_added_id = -1;
1094 static int subs_interface_removed_id = -1;
1095 static int subs_name_owner_id = -1;
1096 static int subs_property_id = -1;
1097 static int subs_adapter_id = -1;
1102 if (subs_interface_added_id == -1) {
1103 subs_interface_added_id = g_dbus_connection_signal_subscribe(conn,
1104 NULL, BT_HAL_MANAGER_INTERFACE,
1105 BT_HAL_INTERFACES_ADDED, NULL, NULL, 0,
1106 __bt_hal_manager_event_filter,
1109 if (subs_interface_removed_id == -1) {
1110 subs_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
1111 NULL, BT_HAL_MANAGER_INTERFACE,
1112 BT_HAL_INTERFACES_REMOVED, NULL, NULL, 0,
1113 __bt_hal_manager_event_filter,
1116 if (subs_name_owner_id == -1) {
1117 subs_name_owner_id = g_dbus_connection_signal_subscribe(conn,
1118 NULL, BT_HAL_FREEDESKTOP_INTERFACE,
1119 BT_HAL_NAME_OWNER_CHANGED, NULL, NULL, 0,
1120 __bt_hal_manager_event_filter,
1123 if (subs_property_id == -1) {
1124 subs_property_id = g_dbus_connection_signal_subscribe(conn,
1125 NULL, BT_HAL_PROPERTIES_INTERFACE,
1126 BT_HAL_PROPERTIES_CHANGED, NULL, NULL, 0,
1127 __bt_hal_manager_event_filter,
1130 if (subs_adapter_id == -1) {
1131 subs_adapter_id = g_dbus_connection_signal_subscribe(conn,
1132 NULL, BT_HAL_ADAPTER_INTERFACE,
1133 NULL, NULL, NULL, 0,
1134 __bt_hal_manager_event_filter,
1138 if (subs_interface_added_id != -1) {
1139 g_dbus_connection_signal_unsubscribe(conn,
1140 subs_interface_added_id);
1141 subs_interface_added_id = -1;
1143 if (subs_interface_removed_id != -1) {
1144 g_dbus_connection_signal_unsubscribe(conn,
1145 subs_interface_removed_id);
1146 subs_interface_removed_id = -1;
1148 if (subs_name_owner_id != -1) {
1149 g_dbus_connection_signal_unsubscribe(conn,
1150 subs_name_owner_id);
1151 subs_name_owner_id = -1;
1153 if (subs_property_id != -1) {
1154 g_dbus_connection_signal_unsubscribe(conn,
1156 subs_property_id = -1;
1158 if (subs_adapter_id == -1) {
1159 g_dbus_connection_signal_unsubscribe(conn, subs_adapter_id);
1160 subs_adapter_id = -1;
1168 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn,
1171 static int subs_device_id = -1;
1178 if (subs_device_id == -1) {
1179 subs_device_id = g_dbus_connection_signal_subscribe(conn,
1180 NULL, BT_HAL_DEVICE_INTERFACE,
1181 NULL, NULL, NULL, 0,
1182 __bt_hal_manager_event_filter,
1186 if (subs_device_id != -1) {
1187 g_dbus_connection_signal_unsubscribe(conn,
1189 subs_device_id = -1;
1197 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe)
1199 static int subs_input_id = -1;
1207 if (subs_input_id == -1) {
1208 subs_input_id = g_dbus_connection_signal_subscribe(conn,
1209 NULL, BT_HAL_INPUT_INTERFACE,
1210 NULL, NULL, NULL, 0,
1211 __bt_hal_manager_event_filter,
1215 if (subs_input_id != -1) {
1216 g_dbus_connection_signal_unsubscribe(conn,
1227 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type)
1232 return BT_HAL_ERROR_INTERNAL;
1234 /* TODO: Add more events in subsequent patches */
1235 switch (event_type) {
1236 case BT_HAL_MANAGER_EVENT:
1237 __bt_hal_register_manager_subscribe_signal(g_conn, TRUE);
1239 case BT_HAL_DEVICE_EVENT:
1240 __bt_hal_register_device_subscribe_signal(g_conn, TRUE);
1242 case BT_HAL_HID_EVENT:
1243 __bt_hal_register_input_subscribe_signal(g_conn, TRUE);
1245 case BT_HAL_HEADSET_EVENT:
1246 __bt_hal_register_audio_subscribe_signal(g_conn, TRUE);
1249 INFO_C("Register Event: event_type [%d]", event_type);
1250 return BT_HAL_ERROR_NOT_SUPPORT;
1253 return BT_HAL_ERROR_NONE;
1256 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn,
1262 static int subs_headset_id = -1;
1263 static int subs_sink_id = -1;
1266 if (subs_headset_id == -1) {
1267 subs_headset_id = g_dbus_connection_signal_subscribe(conn,
1268 NULL, BT_HAL_HEADSET_INTERFACE,
1269 NULL, NULL, NULL, 0,
1270 __bt_hal_manager_event_filter,
1273 if (subs_sink_id == -1) {
1274 subs_sink_id = g_dbus_connection_signal_subscribe(conn,
1275 NULL, BT_HAL_SINK_INTERFACE,
1276 NULL, NULL, NULL, 0,
1277 __bt_hal_manager_event_filter,
1281 if (subs_headset_id != -1) {
1282 g_dbus_connection_signal_unsubscribe(conn,
1284 subs_headset_id = -1;
1286 if (subs_sink_id != -1) {
1287 g_dbus_connection_signal_unsubscribe(conn,
1295 static int __bt_hal_initialize_manager_receiver(void)
1299 GError *error = NULL;
1301 if (manager_conn == NULL) {
1302 manager_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1303 if (error != NULL) {
1304 ERR_C("ERROR: Can't get on system bus [%s]", error->message);
1305 g_clear_error(&error);
1307 if (manager_conn == NULL)
1311 if (__bt_hal_register_service_event(manager_conn,
1312 BT_HAL_MANAGER_EVENT) != BT_HAL_ERROR_NONE)
1314 if (__bt_hal_register_service_event(manager_conn,
1315 BT_HAL_DEVICE_EVENT) != BT_HAL_ERROR_NONE)
1317 if (__bt_hal_register_service_event(manager_conn,
1318 BT_HAL_HID_EVENT) != BT_HAL_ERROR_NONE)
1320 if (__bt_hal_register_service_event(manager_conn,
1321 BT_HAL_HEADSET_EVENT) != BT_HAL_ERROR_NONE)
1323 return BT_HAL_ERROR_NONE;
1326 g_object_unref(manager_conn);
1327 manager_conn = NULL;
1332 return BT_HAL_ERROR_INTERNAL;
1335 /* To receive the event from bluez */
1336 int _bt_hal_initialize_event_receiver(handle_stack_msg cb)
1342 return BT_HAL_ERROR_INVALID_PARAM;
1344 result = __bt_hal_initialize_manager_receiver();
1346 DBG("Manager event receiver initialization result [%d]", result);
1347 if (result != BT_HAL_ERROR_NONE)
1350 /*TODO: Initialize Obexd Event receiver */
1355 return BT_HAL_ERROR_NONE;
1358 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path)
1360 GVariantIter value_iter;
1361 GVariant *value = NULL;
1363 g_variant_iter_init(&value_iter, msg);
1366 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
1367 if (!g_strcmp0(key, "Connected")) {
1368 guint connected = 0;
1369 g_variant_get(value, "i", &connected);
1370 DBG("Device property changed : Connected [%d]", connected);
1371 } else if (!g_strcmp0(key, "RSSI")) {
1372 DBG("Device property changed : RSSI");
1373 __bt_hal_dbus_device_found_properties(path);
1374 } else if (!g_strcmp0(key, "GattConnected")) {
1375 DBG("Device property changed : GattConnected");
1376 gboolean gatt_connected = FALSE;
1377 g_variant_get(value, "b", &gatt_connected);
1378 char *address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1379 _bt_hal_convert_device_path_to_address(path, address);
1380 DBG("@@gatt_connected: %d", gatt_connected);
1381 DBG("@@address: %s", address);
1382 _bt_hal_gatt_connected_state_event(gatt_connected, address);
1384 } else if (!g_strcmp0(key, "Paired")) {
1385 gboolean paired = FALSE;
1386 struct hal_ev_bond_state_changed ev;
1387 char address[BT_HAL_ADDRESS_STRING_SIZE];
1389 g_variant_get(value, "b", &paired);
1390 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1392 _bt_hal_agent_set_canceled(FALSE);
1393 _bt_hal_convert_device_path_to_address(path, address);
1395 /* Prepare to send event to HAL bluetooth */
1396 ev.status = BT_STATUS_SUCCESS;
1397 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1398 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1401 ERR("Bluetooth HAL event handler not registered");
1403 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
1404 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1406 } else if (!g_strcmp0(key, "LegacyPaired")) {
1407 DBG("Device property changed : LegacyPaired");
1408 } else if (!g_strcmp0(key, "Trusted")) {
1409 DBG("Device property changed : Trusted");
1410 gboolean trusted = FALSE;
1411 gchar *address = NULL;
1412 g_variant_get(value, "b", &trusted);
1413 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1415 _bt_hal_convert_device_path_to_address(path, address);
1416 DBG("Device [%s] trusted: [%d]", address, trusted);
1418 __bt_hal_send_device_trust_state_event(trusted, address);
1420 } else if (!g_strcmp0(key, "IpspConnected")) {
1421 DBG("Device property changed : IpspConnected");
1422 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
1423 DBG("Device property changed : IpspInitStateChanged");
1424 } else if (!g_strcmp0(key, "TrustedProfiles")) {
1426 char address[BT_HAL_ADDRESS_STRING_SIZE];
1428 g_variant_get(value, "u", &trust_val);
1429 _bt_hal_convert_device_path_to_address(path, address);
1430 DBG("Address: %s, TrustedProfiles: 0x%X", address, trust_val);
1431 __bt_hal_send_device_trusted_profile_changed_event(trust_val, address);
1433 ERR("Unhandled Property:[%s]", key);
1439 static void __bt_hal_dbus_device_found_properties(const char *device_path)
1442 GError *error = NULL;
1443 GDBusProxy *device_proxy;
1444 GDBusConnection *conn;
1449 ERR("Invalid device path");
1453 conn = _bt_hal_get_system_gconn();
1455 ERR("_bt_hal_get_system_gconn failed");
1459 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1463 BT_HAL_PROPERTIES_INTERFACE,
1466 if (!device_proxy) {
1467 ERR("Error creating device_proxy");
1471 result = g_dbus_proxy_call_sync(device_proxy,
1473 g_variant_new("(s)", BT_HAL_DEVICE_INTERFACE),
1474 G_DBUS_CALL_FLAGS_NONE,
1479 ERR("Error occured in Proxy call");
1480 if (error != NULL) {
1481 ERR("Error occured in Proxy call (Error: %s)", error->message);
1482 g_clear_error(&error);
1484 g_object_unref(device_proxy);
1488 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1489 _bt_hal_convert_device_path_to_address(device_path, address);
1491 __bt_hal_device_properties_lookup(result, address);
1493 g_object_unref(device_proxy);
1499 static void __bt_hal_device_properties_lookup(GVariant *result, char *address)
1501 /* Buffer and propety count management */
1502 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
1503 struct hal_ev_device_found *ev = (void *) buf;
1505 memset(buf, 0, sizeof(buf));
1509 GVariant *tmp_value;
1512 gchar *manufacturer_data = NULL;
1515 if (result != NULL) {
1516 g_variant_get(result , "(@a{sv})", &value);
1517 g_variant_unref(result);
1520 tmp_value = g_variant_lookup_value(value, "Alias", G_VARIANT_TYPE_STRING);
1522 g_variant_get(tmp_value, "s", &name);
1524 g_variant_unref(tmp_value);
1526 DBG_SECURE("Alias Name [%s]", name);
1527 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1528 strlen(name) + 1, name);
1530 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1533 tmp_value = g_variant_lookup_value(value, "Name", G_VARIANT_TYPE_STRING);
1534 g_variant_get(tmp_value, "s", &name);
1535 g_variant_unref(tmp_value);
1537 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1538 strlen(name) + 1, name);
1540 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1541 g_variant_get(tmp_value, "s", &name);
1545 tmp_value = g_variant_lookup_value(value, "Class", G_VARIANT_TYPE_UINT32);
1546 unsigned int class = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1547 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
1548 sizeof(unsigned int), &class);
1550 g_variant_unref(tmp_value);
1554 tmp_value = g_variant_lookup_value(value, "Connected", G_VARIANT_TYPE_BOOLEAN);
1555 unsigned int connected = tmp_value ? g_variant_get_boolean(tmp_value) : 0;
1556 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
1557 sizeof(unsigned int), &connected);
1559 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
1560 g_variant_unref(tmp_value);
1563 tmp_value = g_variant_lookup_value(value, "Trusted", G_VARIANT_TYPE_BOOLEAN);
1564 uint8_t trust = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1565 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
1566 sizeof(uint8_t), &trust);
1568 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
1569 g_variant_unref(tmp_value);
1572 tmp_value = g_variant_lookup_value(value, "Paired", G_VARIANT_TYPE_BOOLEAN);
1573 uint8_t paired = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1575 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
1576 sizeof(uint8_t), &paired);
1578 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
1579 g_variant_unref(tmp_value);
1582 tmp_value = g_variant_lookup_value(value, "RSSI", G_VARIANT_TYPE_INT32);
1583 int rssi = tmp_value ? g_variant_get_int32(tmp_value) : 0;
1584 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
1585 sizeof(int), &rssi);
1587 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
1588 g_variant_unref(tmp_value);
1590 /* Last Addr Type */
1591 tmp_value = g_variant_lookup_value(value, "LastAddrType", G_VARIANT_TYPE_UINT32);
1592 unsigned int addr_type = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1593 g_variant_unref(tmp_value);
1594 DBG("Device Last Address Type [0x%x]", addr_type);
1597 tmp_value = g_variant_lookup_value(value, "IsAliasSet", G_VARIANT_TYPE_UINT32);
1598 uint8_t is_alias_set = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1599 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
1600 sizeof(uint8_t), &is_alias_set);
1602 DBG("IsAliasSet: [%s], Property num [%d]", (is_alias_set ? "TRUE" : "FALSE"), ev->num_props);
1603 g_variant_unref(tmp_value);
1606 tmp_value = g_variant_lookup_value(value, "UUIDs", G_VARIANT_TYPE_STRING_ARRAY);
1607 gsize uuid_count = g_variant_get_size(tmp_value);
1608 char **uuid_value = g_variant_dup_strv(tmp_value, &uuid_count);
1610 /* UUID collection */
1615 int num_props_tmp = ev->num_props;
1617 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
1619 for (i = 0; uuid_value[i] != NULL; i++) {
1621 char *uuid_str = NULL;
1622 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
1623 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
1625 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
1626 uuid_str = g_strdup(uuid_value[i]);
1627 DBG("UUID string [%s]\n", uuid_str);
1629 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
1631 for (z = 0; z < 16; z++)
1632 DBG("[0x%x]", uuid[z]);
1635 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
1639 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
1640 (BT_HAL_STACK_UUID_SIZE * uuid_count),
1642 ev->num_props = num_props_tmp + 1;
1645 g_variant_unref(tmp_value);
1647 /* ManufacturerDataLen */
1648 tmp_value = g_variant_lookup_value(value, "ManufacturerDataLen", G_VARIANT_TYPE_UINT32);
1649 unsigned int manufacturer_data_len = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1650 if (manufacturer_data_len > BT_HAL_MANUFACTURER_DATA_LENGTH_MAX) {
1651 ERR("manufacturer_data_len is too long(len = %d)", manufacturer_data_len);
1652 manufacturer_data_len = BT_HAL_MANUFACTURER_DATA_LENGTH_MAX;
1654 g_variant_unref(tmp_value);
1655 /*size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA_LEN,
1656 sizeof(unsigned int), &manufacturer_data_len);
1658 DBG("Device Manufacturer data length [%u]", manufacturer_data_len);
1660 /* ManufacturerData */
1661 tmp_value = g_variant_lookup_value(value, "ManufacturerData", G_VARIANT_TYPE_BYTESTRING);
1662 manufacturer_data = value ? (gchar *)g_variant_get_bytestring(tmp_value) : NULL;
1663 if (manufacturer_data) {
1664 if (manufacturer_data_len > 0) {
1665 //size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA,
1666 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_BLE_ADV_DATA,
1667 manufacturer_data_len, manufacturer_data);
1671 g_variant_unref(tmp_value);
1675 _bt_hal_convert_addr_string_to_type(bdaddr, address);
1676 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
1677 sizeof(bdaddr), bdaddr);
1679 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
1682 g_variant_unref(value);
1684 ERR("result is NULL\n");
1687 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%d]", ev->num_props, size);
1688 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
1693 static void __bt_hal_send_device_acl_connection_state_event(gboolean connected, const char *address)
1696 struct hal_ev_acl_state_changed ev;
1698 ev.status = BT_STATUS_SUCCESS;
1699 ev.state = (connected == TRUE) ?
1700 HAL_ACL_STATE_CONNECTED :
1701 HAL_ACL_STATE_DISCONNECTED;
1703 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1706 ERR("Bluetooth HAL event handler not registered");
1708 event_cb(HAL_EV_ACL_STATE_CHANGED, &ev, sizeof(ev));
1712 static void __bt_hal_send_device_le_connection_state_event(gboolean connected, const char *address)
1715 struct hal_ev_le_conn_state_changed ev;
1717 ev.status = BT_STATUS_SUCCESS;
1718 ev.state = (connected == TRUE) ?
1719 HAL_LE_STATE_CONNECTED :
1720 HAL_LE_STATE_DISCONNECTED;
1722 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1725 ERR("Bluetooth HAL event handler not registered");
1727 event_cb(HAL_EV_LE_CONN_STATE_CHANGED, &ev, sizeof(ev));
1731 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted,
1732 const char *address)
1734 struct hal_ev_device_trust_state_changed ev;
1737 ev.trust = (is_trusted == TRUE) ?
1738 HAL_DEVICE_TRUSTED :
1739 HAL_DEVICE_UNTRUSTED;
1741 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1744 ERR("Bluetooth HAL event handler not registered");
1746 event_cb(HAL_EV_DEVICE_TRUST_CHANGED, &ev, sizeof(ev));
1750 static void __bt_hal_send_device_trusted_profile_changed_event(
1751 uint32_t trust_val, const char *address)
1753 struct hal_ev_device_trusted_profiles_changed ev;
1756 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1757 ev.trust_val = trust_val;
1760 ERR("Bluetooth HAL event handler not registered");
1762 event_cb(HAL_EV_DEVICE_TRUSTED_PROFILES_CHANGED, &ev, sizeof(ev));
1766 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member,
1770 const char *property = NULL;
1774 if (strcasecmp(member, "PropertyChanged") == 0) {
1775 g_variant_get(msg, "(s)", &property);
1776 if (property == NULL)
1778 if (strcasecmp(property, "GattConnected") == 0) {
1779 INFO("GATT Connected");
1780 gboolean connected = FALSE;
1782 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1784 _bt_hal_convert_device_path_to_address(path, address);
1785 g_variant_get(msg, "(b)", &connected);
1787 INFO("Connected device address[%s] connnected[%d]", address, connected);
1789 } else if (strcasecmp(property, "Paired") == 0) {
1790 gboolean paired = FALSE;
1791 struct hal_ev_bond_state_changed ev;
1792 char address[BT_HAL_ADDRESS_STRING_SIZE];
1794 g_variant_get(msg, "(b)", &paired);
1795 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1797 _bt_hal_agent_set_canceled(FALSE);
1798 _bt_hal_convert_device_path_to_address(path, address);
1800 /* Prepare to send event to HAL bluetooth */
1801 ev.status = BT_STATUS_SUCCESS;
1802 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1803 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1806 ERR("Bluetooth HAL event handler not registered");
1808 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
1809 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1811 } else if (strcasecmp(property, "UUIDs") == 0) {
1814 } else if (strcasecmp(member, "DeviceConnected") == 0) {
1815 unsigned char addr_type = 0;
1817 g_variant_get(msg, "(y)", &addr_type);
1819 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1820 _bt_hal_convert_device_path_to_address(path, address);
1822 DBG("Member: [%s]", member);
1823 ERR_C("Connected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
1825 __bt_hal_send_device_acl_connection_state_event(TRUE, address);
1827 __bt_hal_send_device_le_connection_state_event(TRUE, address);
1829 } else if (strcasecmp(member, "Disconnected") == 0) {
1830 unsigned char disc_reason = 0;
1831 unsigned char addr_type = 0;
1834 g_variant_get(msg, "(yy&s)", &addr_type, &disc_reason, &name);
1836 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1837 _bt_hal_convert_device_path_to_address(path, address);
1839 DBG("Member: [%s]", member);
1840 ERR_C("DisConnected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
1841 DBG("Disconnect Reason: %d", disc_reason);
1842 DBG("Name: %s", name);
1844 __bt_hal_send_device_acl_connection_state_event(FALSE, address);
1846 __bt_hal_send_device_le_connection_state_event(FALSE, address);
1848 } else if (strcasecmp(member, "ProfileStateChanged") == 0) {
1850 char *profile_uuid = NULL;
1852 g_variant_get(msg, "(si)", &profile_uuid, &state);
1853 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1854 _bt_hal_convert_device_path_to_address(path, address);
1856 DBG("Address: %s", address);
1857 DBG("Profile UUID: %s", profile_uuid);
1858 DBG("State: %d", state);
1859 if (strncmp(profile_uuid, HID_UUID, strlen(HID_UUID)) == 0) {
1860 if (state == BT_HAL_PROFILE_STATE_CONNECTED)
1861 __bt_hal_send_hid_connection_state_event(TRUE, address);
1862 else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED)
1863 __bt_hal_send_hid_connection_state_event(FALSE, address);
1865 DBG("Profile state: %d", state);
1867 } else if ((strncmp(profile_uuid, A2DP_SINK_UUID, strlen(A2DP_SINK_UUID)) == 0)) {
1868 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
1869 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTED");
1870 __bt_hal_send_av_connection_state_event(TRUE, address);
1871 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
1872 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
1873 __bt_hal_send_av_connection_state_event(FALSE, address);
1874 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
1875 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
1876 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
1877 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTING");
1879 ERR("A2DP Profile state: Invalid");
1881 } else if ((strncmp(profile_uuid, A2DP_SOURCE_UUID, strlen(A2DP_SOURCE_UUID)) == 0)) {
1882 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
1883 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
1884 __bt_hal_send_a2dp_sink_connection_state_event(TRUE, address);
1885 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
1886 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
1887 __bt_hal_send_a2dp_sink_connection_state_event(FALSE, address);
1888 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
1889 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
1890 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
1891 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
1893 } else if (strncmp(profile_uuid, HFP_HF_UUID, strlen(HFP_HF_UUID)) == 0) {
1894 if (state == BT_HAL_PROFILE_STATE_CONNECTING)
1895 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTING");
1896 else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
1897 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTED");
1898 __bt_hal_send_hf_connection_state_event(TRUE, address);
1899 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
1900 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
1901 __bt_hal_send_hf_connection_state_event(FALSE, address);
1902 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
1903 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
1905 ERR("HFP Profile state: Invalid");
1907 } else if ((strncmp(profile_uuid, AVRCP_TARGET_UUID, strlen(AVRCP_TARGET_UUID)) == 0)) {
1908 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
1909 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
1910 __bt_hal_send_avrcp_ctrl_connection_state_event(TRUE, address);
1911 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
1912 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
1913 __bt_hal_send_avrcp_ctrl_connection_state_event(FALSE, address);
1914 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
1915 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
1916 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
1917 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
1920 DBG("Profile[%s] State changed status [%d] ", profile_uuid, state);
1923 g_free(profile_uuid);
1924 } else if (strcasecmp(member, "AdvReport") == 0) {
1925 DBG("Member: [%s]", member);
1926 __bt_hal_handle_adv_report(msg, path);
1930 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path)
1932 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
1933 struct hal_ev_gatt_client_scan_result *ev = (void *)buf;
1935 char *address = NULL;
1936 GVariant *value = NULL;
1937 char *buffer = NULL;
1940 uint8_t addr_type = 0;
1941 uint8_t adv_type = 0;
1947 memset(buf, 0, sizeof(buf));
1950 g_variant_get(msg, "(&syyii@ay)", &address, &addr_type,
1951 &adv_type, &rssi, &data_len, &value);
1953 buffer_len = g_variant_get_size(value);
1955 buffer = (char *)g_variant_get_data(value);
1957 if (data_len != buffer_len) {
1958 ERR("Unexpected: buffer_len: %d, data_len: %d",
1959 buffer_len, data_len);
1960 data_len = buffer_len;
1963 DBG("Address: %s, len: %d, rssi: %d, addr_type: 0x%02X, adv_type: 0x%02X",
1964 address, data_len, rssi, addr_type, adv_type);
1966 _bt_hal_convert_addr_string_to_type(ev->bd_addr, address);
1967 ev->addr_type = addr_type;
1968 ev->adv_type = adv_type;
1971 memcpy(ev->adv_data, buffer, data_len);
1974 DBG("Send le scan result event to HAL, size: [%d]", size);
1975 gatt_event_cb(HAL_EV_GATT_CLIENT_SCAN_RESULT, buf, size);
1976 g_variant_unref(value);
1979 /* AVRCP Controller Role(Remote:AVRCP Target) Events */
1980 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address)
1983 struct hal_ev_avrcp_ctrl_conn_state ev;
1985 if (connected == TRUE)
1986 INFO("AVRCP(Controller) Profile Connected for address [%s]", address);
1988 INFO("AVRCP(Controller) Profile DisConnected for address [%s]", address);
1990 if (connected == TRUE)
1991 ev.state = HAL_AVRCP_CTRL_STATE_CONNECTED;
1993 ev.state = HAL_AVRCP_CTRL_STATE_DISCONNECTED;
1994 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1996 if (!a2dp_sink_event_cb)
1997 ERR("AV event handler not registered");
1999 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_CONN_STATE, &ev, sizeof(ev));
2002 static int __bt_media_attr_to_type(const char *str)
2004 if (!strcasecmp(str, "Equalizer"))
2005 return HAL_PLAYER_ATTR_EQUALIZER;
2006 else if (!strcasecmp(str, "Repeat"))
2007 return HAL_PLAYER_ATTR_REPEAT;
2008 else if (!strcasecmp(str, "Shuffle"))
2009 return HAL_PLAYER_ATTR_SHUFFLE;
2010 else if (!strcasecmp(str, "Scan"))
2011 return HAL_PLAYER_ATTR_SCAN;
2017 static int __bt_hal_play_status_str_to_type(const char *value)
2019 if (!strcmp(value, "stopped"))
2020 return HAL_PLAYSTATE_STOPPED;
2021 else if (!strcmp(value, "playing"))
2022 return HAL_PLAYSTATE_PLAYING;
2023 else if (!strcmp(value, "paused"))
2024 return HAL_PLAYSTATE_PAUSED;
2025 else if (!strcmp(value, "forward-seek"))
2026 return HAL_PLAYSTATE_FWD_SEEK;
2027 else if (!strcmp(value, "reverse-seek"))
2028 return HAL_PLAYSTATE_REV_SEEK;
2030 return HAL_PLAYSTATE_ERROR;
2033 static void __bt_avrcp_control_parse_properties(struct hal_ev_track_changed *ev, GVariant *item)
2035 GVariant *value = NULL;
2037 char *value_string = NULL;
2038 const char *key = NULL;
2044 g_variant_iter_init(&iter, item);
2045 while (g_variant_iter_loop(&iter, "{sv}", &key, &value)) {
2046 if (strcasecmp(key, "Title") == 0) {
2047 value_string = (char *)g_variant_get_string(value, NULL);
2048 DBG("Value : %s ", value_string);
2049 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TITLE;
2050 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2052 } else if (strcasecmp(key, "Artist") == 0) {
2053 value_string = (char *)g_variant_get_string(value, NULL);
2054 DBG("Value : %s ", value_string);
2055 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ARTIST;
2056 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2058 } else if (strcasecmp(key, "Album") == 0) {
2059 value_string = (char *)g_variant_get_string(value, NULL);
2060 DBG("Value : %s ", value_string);
2061 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ALBUM;
2062 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2064 } else if (strcasecmp(key, "Genre") == 0) {
2065 value_string = (char *)g_variant_get_string(value, NULL);
2066 DBG("Value : %s ", value_string);
2067 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_GENRE;
2068 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2070 } else if (strcasecmp(key, "Duration") == 0) {
2073 val = g_variant_get_uint32(value);
2074 DBG("Value : %d", val);
2075 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_PLAYING_TIME;
2076 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2078 } else if (strcasecmp(key, "NumberOfTracks") == 0) {
2081 val = g_variant_get_uint32(value);
2082 DBG("Value : %d", val);
2083 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_NUM_TRACKS;
2084 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2086 } else if (strcasecmp(key, "TrackNumber") == 0) {
2089 val = g_variant_get_uint32(value);
2090 DBG("Value : %d", val);
2091 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TRACK_NUM;
2092 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2095 DBG("%s not supported, ignoring", key);
2098 if (i >= HAL_MAX_ATTR_NUM) {
2099 ERR(" Received max attribute [%d]", i);
2105 g_variant_iter_free(&iter);
2109 static int __bt_media_attrval_to_val(int type, const char *value)
2114 case HAL_PLAYER_ATTR_EQUALIZER:
2115 if (!strcmp(value, "off"))
2120 case HAL_PLAYER_ATTR_REPEAT:
2121 if (!strcmp(value, "off"))
2122 ret = BTRC_PLAYER_VAL_OFF_REPEAT;
2123 else if (!strcmp(value, "singletrack"))
2124 ret = BTRC_PLAYER_VAL_SINGLE_REPEAT;
2125 else if (!strcmp(value, "alltracks"))
2126 ret = BTRC_PLAYER_VAL_ALL_REPEAT;
2128 ret = BTRC_PLAYER_VAL_GROUP_REPEAT;
2130 case HAL_PLAYER_ATTR_SHUFFLE:
2131 if (!strcmp(value, "off"))
2132 ret = BTRC_PLAYER_VAL_OFF_SHUFFLE;
2133 else if (!strcmp(value, "alltracks"))
2134 ret = BTRC_PLAYER_VAL_ALL_SHUFFLE;
2136 ret = BTRC_PLAYER_VAL_GROUP_SHUFFLE;
2138 case HAL_PLAYER_ATTR_SCAN:
2139 if (!strcmp(value, "off"))
2141 else if (!strcmp(value, "alltracks"))
2147 ERR("Value not handled");
2153 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member,
2156 const char *property = NULL;
2157 GVariant *value = NULL;
2159 char address[BT_HAL_ADDRESS_STRING_SIZE];
2162 ERR("Error returned in method call\n");
2166 if (!avrcp_ctrl_event_cb) {
2167 ERR("AVRCP controller DBUS handler callback not registered");
2171 g_variant_iter_init(&iter, msg);
2173 _bt_hal_convert_device_path_to_address(path, address);
2175 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2176 DBG("Property = %s \n", property);
2177 if ((strcasecmp(property, "Equalizer") == 0) ||
2178 (strcasecmp(property, "Repeat") == 0) ||
2179 (strcasecmp(property, "Shuffle") == 0) ||
2180 (strcasecmp(property, "Scan") == 0)) {
2181 struct hal_ev_player_setting ev;
2185 valstr = g_variant_get_string(value, NULL);
2186 DBG("Value : %s ", valstr);
2189 val = __bt_media_attrval_to_val(__bt_media_attr_to_type(property), valstr);
2192 memset(&ev, 0, sizeof(ev));
2193 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2195 ev.attr_ids[0] = __bt_media_attr_to_type(property);
2196 ev.attr_values[0] = val;
2198 /* Send event to application */
2199 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAYER_APP_SETTING_CHANGED, &ev, sizeof(ev));
2201 } else if ((strcasecmp(property, "Status") == 0)) {
2202 struct hal_ev_play_status_changed ev;
2205 valstr = g_variant_get_string(value, NULL);
2206 DBG("Value : %s ", valstr);
2208 memset(&ev, 0, sizeof(ev));
2209 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2211 ev.status = __bt_hal_play_status_str_to_type(valstr);
2213 /* Send event to application */
2214 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_STATUS_CHANGED, &ev, sizeof(ev));
2216 } else if (strcasecmp(property, "Position") == 0) {
2217 struct hal_ev_play_position ev;
2219 memset(&ev, 0, sizeof(ev));
2220 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2221 ev.pos = g_variant_get_uint32(value);
2222 DBG("Value : %d ", ev.pos);
2224 /* Send event to application */
2225 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_POSITION_CHANGED, &ev, sizeof(ev));
2226 } else if (strcasecmp(property, "Track") == 0) {
2227 struct hal_ev_track_changed ev;
2229 memset(&ev, 0, sizeof(ev));
2230 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2231 __bt_avrcp_control_parse_properties(&ev, value);
2233 /* Send event to application */
2234 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_TRACK_CHANGED, &ev, sizeof(ev));
2236 DBG("Property not handled");
2240 g_free((char *)property);
2241 g_variant_unref(value);
2244 /* A2DP Src Role(Remote:Sink) Events */
2245 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address)
2248 struct hal_ev_a2dp_conn_state ev;
2250 if (connected == TRUE)
2251 INFO("A2DP(Src) Profile Connected for address [%s]", address);
2253 INFO("A2DP(Src) Profile DisConnected for address [%s]", address);
2255 ev.state = (connected == TRUE) ?
2256 HAL_EV_A2DP_STATE_CONNECTED :
2257 HAL_EV_A2DP_STATE_DISCONNECTED;
2259 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2262 ERR("AV event handler not registered");
2264 av_event_cb(HAL_EV_A2DP_CONN_STATE, &ev, sizeof(ev));
2267 /* A2DP Sink Role(Remote:Source) Events */
2268 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address)
2271 struct hal_ev_a2dp_conn_state ev;
2273 if (connected == TRUE)
2274 INFO("A2DP(Sink) Profile Connected for address [%s]", address);
2276 INFO("A2DP(Sink) Profile DisConnected for address [%s]", address);
2278 ev.state = (connected == TRUE) ?
2279 HAL_EV_A2DP_STATE_CONNECTED :
2280 HAL_EV_A2DP_STATE_DISCONNECTED;
2282 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2284 if (!a2dp_sink_event_cb)
2285 ERR("AV event handler not registered");
2287 a2dp_sink_event_cb(HAL_EV_A2DP_SOURCE_CONN_STATE, &ev, sizeof(ev));
2290 /* HF(AG Role) Audio Events */
2291 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected,
2292 const char *address)
2295 struct hal_ev_handsfree_audio_state ev;
2297 if (connected == TRUE)
2298 INFO("AG Audio Connected for address [%s]", address);
2300 INFO("AG Audio DisConnected for address [%s]", address);
2302 ev.state = (connected == TRUE) ?
2303 HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTED :
2304 HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED;
2306 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2309 ERR("HF event handler not registered");
2311 hf_event_cb(HAL_EV_HANDSFREE_AUDIO_STATE, &ev, sizeof(ev));
2314 /* HF(AG Role) Profile Events */
2315 static void __bt_hal_send_hf_connection_state_event(gboolean connected,
2316 const char *address)
2319 struct hal_ev_handsfree_conn_state ev;
2321 if (connected == TRUE)
2322 INFO("AG Profile Connected for address [%s]", address);
2324 INFO("AG Profile DisConnected for address [%s]", address);
2326 ev.state = (connected == TRUE) ?
2327 HAL_EV_HANDSFREE_CONN_STATE_CONNECTED :
2328 HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTED;
2330 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2333 ERR("HF event handler not registered");
2335 hf_event_cb(HAL_EV_HANDSFREE_CONN_STATE, &ev, sizeof(ev));
2338 void _bt_hal_register_event_handler_cb(bt_hal_module_e module, handle_stack_msg cb)
2348 a2dp_sink_event_cb = cb;
2354 avrcp_tg_event_cb = cb;
2356 case HAL_AVRCP_CTRL:
2357 avrcp_ctrl_event_cb = cb;
2363 ERR("Unknown module: %d", module);
2367 void _bt_hal_unregister_event_handler_cb(bt_hal_module_e module)
2371 hid_event_cb = NULL;
2377 a2dp_sink_event_cb = NULL;
2383 avrcp_tg_event_cb = NULL;
2385 case HAL_AVRCP_CTRL:
2386 avrcp_ctrl_event_cb = NULL;
2389 gatt_event_cb = NULL;
2392 ERR("Unknown module: %d", module);
2396 bool _bt_hal_get_adapter_request_state(void)
2398 return is_adapter_activating;
2401 bool _bt_hal_get_le_request_state(void)
2403 return is_le_activating;
2406 void _bt_hal_set_adapter_request_state(bool enable)
2408 DBG("set_adapter_request_state %d", enable);
2409 is_adapter_activating = enable;
2412 void _bt_hal_set_le_request_state(bool enable)
2414 DBG("set_le_request_state %d", enable);
2415 is_le_activating = enable;