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);
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 if (FALSE == _bt_hal_update_le_feature_support(name, val))
445 ERR("Failed to update LE feature (name = %s, value = %s)", name, val);
448 g_variant_iter_free(iter);
449 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
450 g_variant_get(value, "b" , &ipsp_initialized);
451 DBG("##IPSP Initialized = %d", ipsp_initialized);
453 ERR("Unhandled Property:[%s]", key);
457 if (scan_mode_property_update) {
458 size += __bt_insert_hal_properties(buf + size,
459 HAL_PROP_ADAPTER_SCAN_MODE, sizeof(int), &scan_mode);
465 DBG("Send Adapter properties changed event to HAL user, Num Prop [%d] total size [%d]", ev->num_props, size);
466 event_cb(HAL_EV_ADAPTER_PROPS_CHANGED, buf, size);
472 void _bt_hal_handle_adapter_event(GVariant *msg, const char *member)
479 if (strcasecmp(member, "DeviceCreated") == 0) {
480 DBG("DeviceCreated: Unhandled");
481 } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
482 DBG("InterfacesRemoved: Unhandled");
483 } else if (strcasecmp(member, "AdvertisingEnabled") == 0) {
484 DBG("AdvertisingEnabled");
485 DBG("Advertising Enabled");
487 gboolean status = FALSE;
488 g_variant_get(msg, "(ib)", &slot_id, &status);
489 DBG("Advertising Enabled : slot_id [%d] status [%d]", slot_id, status);
490 /* Send event to application */
491 _bt_hal_set_advertising_status(slot_id, status);
492 } else if (strcasecmp(member, "RssiEnabled") == 0) {
493 struct hal_ev_rssi_monitor_state_changed ev;
494 gboolean status = FALSE;
495 char *address = NULL;
498 g_variant_get(msg, "(sib)", &address, &link_type, &status);
499 DBG("RSSI monitoring %s for %s",
500 (status ? "Enabled" : "Disabled"), address);
502 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
503 ev.link_type = link_type;
504 ev.state = (status ? HAL_RSSI_MONITORING_ENABLED : HAL_RSSI_MONITORING_DISABLED);
506 ERR("event_cb is NULL");
508 event_cb(HAL_EV_RSSI_MONITOR_STATE_CHANGED, &ev, sizeof(ev));
511 } else if (strcasecmp(member, "RssiAlert") == 0) {
512 struct hal_ev_rssi_alert_recieved ev;
516 char *address = NULL;
518 g_variant_get(msg, "(siii)", &address, &link_type, &alert_type, &rssi_dbm);
519 DBG("RSSI Alert: [Address %s LinkType %d] [Type %d DBM %d]",
520 address, alert_type, rssi_dbm);
522 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
523 ev.link_type = link_type;
524 ev.alert_type = alert_type;
528 ERR("event_cb is NULL");
530 event_cb(HAL_EV_RSSI_ALERT_RECIEVED, &ev, sizeof(ev));
533 } else if (strcasecmp(member, "RawRssi") == 0) {
534 struct hal_ev_raw_rssi_recieved ev;
537 char *address = NULL;
539 g_variant_get(msg, "(sii)", &address, &link_type, &rssi_dbm);
540 DBG("Raw RSSI: [Address %s] [Link Type %d][RSSI DBM %d]",
541 address, link_type, rssi_dbm);
543 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
544 ev.link_type = link_type;
548 ERR("event_cb is NULL");
550 event_cb(HAL_EV_RAW_RSSI_RECIEVED, &ev, sizeof(ev));
553 } else if (strcasecmp(member, BT_HAL_HARDWARE_ERROR) == 0) {
554 DBG("BT Hardware Error: Unhandled");
555 } else if (strcasecmp(member, BT_HAL_TX_TIMEOUT_ERROR) == 0) {
556 DBG("BT TX Timeout Error: Unhandled");
562 static gboolean __bt_hal_parse_device_properties(GVariant *item)
572 /* Buffer and propety count management */
573 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
574 struct hal_ev_device_found *ev = (void *) buf;
576 memset(buf, 0, sizeof(buf));
580 g_variant_iter_init(&iter, item);
581 while (g_variant_iter_loop(&iter, "{sv}", &key, &val)) {
583 if (strcasecmp(key, "Address") == 0) {
585 char * address = NULL;
586 address = g_variant_dup_string(val, &len);
588 _bt_hal_convert_addr_string_to_type(bdaddr, address);
590 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
591 sizeof(bdaddr), bdaddr);
594 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
596 } else if (strcasecmp(key, "Class") == 0) {
597 unsigned int class = g_variant_get_uint32(val);
598 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
599 sizeof(unsigned int), &class);
601 DBG("Device class [%d] Property num [%d]", class, ev->num_props);
602 } else if (strcasecmp(key, "name") == 0) {
603 char *name = g_variant_dup_string(val, &len);
605 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
606 strlen(name) + 1, name);
608 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_byte(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, "LegacyManufacturerDataLen") == 0) {
683 /* TODO: To be handled later*/
684 } else if (strcasecmp(key, "LegacyManufacturerData") == 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;
754 g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, &val, NULL);
756 if (!interface_name) {
757 DBG("Failed to get interface name");
760 g_variant_unref(val);
764 if (strcasecmp(interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
765 DBG("Event: Property Changed: Interface: BT_HAL_ADAPTER_INTERFACE");
766 __bt_hal_adapter_property_changed_event(val);
767 } else if (strcasecmp(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
768 DBG("Event: Property Changed: Interface: BT_HAL_DEVICE_INTERFACE");
769 __bt_hal_device_property_changed_event(val, object_path);
770 } else if (strcasecmp(interface_name, BT_HAL_OBEX_TRANSFER_INTERFACE) == 0) {
771 DBG("Event: Property Changed: Interface: BT_HAL_OBEX_TRANSFER_INTERFACE");
772 /* TODO: Handle event */
773 } else if (strcasecmp(interface_name, BT_HAL_MEDIA_CONTROL_INTERFACE) == 0) {
774 DBG("Event: Property Changed: Interface: BT_HAL_MEDIA_CONTROL_INTERFACE");
775 /* Handle AVRCP target event */
776 __bt_hal_handle_avrcp_tg_events(val, object_path);
777 } else if (strcasecmp(interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
778 DBG("Event: Property Changed: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
779 __bt_hal_handle_avrcp_ctrl_events(val, NULL, object_path);
780 } else if (strcasecmp(interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
781 DBG("Event: Property Changed: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
782 __bt_hal_handle_avrcp_transport_events(val, NULL, object_path);
783 } else if (strcasecmp(interface_name, BT_HAL_NETWORK_CLIENT_INTERFACE) == 0) {
784 DBG("Event: Property Changed: Interface: BT_HAL_NETWORK_CLIENT_INTERFACE");
785 /* TODO: Handle event */
786 } else if (strcasecmp(interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
787 DBG("Event: Property Changed: Interface: BT_HAL_GATT_CHAR_INTERFACE");
788 /* TODO: Handle event */
789 } else if (strcasecmp(interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
790 DBG("Event: Property Changed: Interface: BT_HAL_INPUT_INTERFACE");
791 __bt_hal_handle_input_event(val, object_path);
793 g_variant_unref(val);
796 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters)
800 if (__bt_hal_parse_interface(parameters) == FALSE) {
801 ERR("Fail to parse the properies");
802 g_variant_unref(value);
809 static void __bt_hal_send_hid_connection_state_event(
810 gboolean connected, char *address)
812 struct hal_ev_hidhost_conn_state ev;
814 ev.state = (connected == TRUE) ?
815 HAL_HIDHOST_STATE_CONNECTED :
816 HAL_HIDHOST_STATE_DISCONNECTED;
818 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
821 ERR("HID event handler not registered");
823 hid_event_cb(HAL_EV_HIDHOST_CONN_STATE, &ev, sizeof(ev));
826 static void __bt_hal_handle_input_event(GVariant *msg, const char *path)
828 gboolean property_flag = FALSE;
829 GVariantIter value_iter;
830 char *property = NULL;
831 GVariant *child = NULL, *val = NULL;
834 g_variant_iter_init(&value_iter, msg);
835 while ((child = g_variant_iter_next_value(&value_iter))) {
836 g_variant_get(child, "{sv}", &property, &val);
838 if (property == NULL)
841 if (strcasecmp(property, "Connected") == 0) {
844 g_variant_get(val, "b", &property_flag);
845 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
846 _bt_hal_convert_device_path_to_address(path, address);
847 __bt_hal_send_hid_connection_state_event(property_flag, address);
851 g_variant_unref(val);
852 g_variant_unref(child);
858 static gboolean __bt_hal_parse_interface(GVariant *msg)
861 GVariant *optional_param;
864 char *interface_name = NULL;
865 GVariant *inner_iter = NULL;
866 g_variant_get(msg, "(&o@a{sa{sv}})",
867 &path, &optional_param);
868 g_variant_iter_init(&iter, optional_param);
870 while ((child = g_variant_iter_next_value(&iter))) {
871 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
872 if (g_strcmp0(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
873 DBG("Found a device: %s", path);
874 if (__bt_hal_parse_device_properties(inner_iter) == FALSE) {
875 g_variant_unref(inner_iter);
876 g_variant_unref(child);
877 g_variant_unref(optional_param);
878 ERR("Fail to parse the properies");
881 g_variant_unref(inner_iter);
882 g_variant_unref(child);
883 g_variant_unref(optional_param);
887 g_variant_unref(inner_iter);
888 g_variant_unref(child);
891 g_variant_unref(optional_param);
896 static gboolean __bt_hal_event_manager(gpointer data)
898 bt_hal_event_type_t bt_event = 0x00;
900 char *obj_path = NULL;
902 bt_hal_main_event_data_t *param = (bt_hal_main_event_data_t*)data;
903 if (strcasecmp(param->signal_name, "InterfacesAdded") == 0) {
905 /*TODO: Handle Interfaces Added Signal from stack */
906 DBG("Manager Event: Signal Name: InterfacesAdded");
908 g_variant_get(param->parameters, "(&o@a{sa{sv}})", &obj_path, &value);
910 if (obj_path == NULL) {
911 DBG("obj_path is NULL");
915 if (strcasecmp(obj_path, BT_HAL_BLUEZ_HCI_PATH) == 0) {
916 /* TODO: Handle adapter added */
917 DBG("Manager Event: Signal Name: InterfiacesAdded: Adapter added in bluetoothd: path [hci0]");
919 bt_event = __bt_hal_parse_event(value);
920 if (bt_event == BT_HAL_DEVICE_EVENT) {
921 DBG("Device path : %s ", obj_path);
922 __bt_hal_handle_device_event(value, param->parameters);
923 } else if (bt_event == BT_HAL_AVRCP_CONTROL_EVENT) {
924 DBG("Device path : %s ", obj_path);
925 _bt_hal_set_control_device_path(obj_path);
928 g_variant_unref(value);
930 } else if (strcasecmp(param->signal_name, "InterfacesRemoved") == 0) {
934 /*TODO: Handle Interfaces Removed Signal from stack */
935 DBG("Manager Event: Signal Name: InterfacesRemoved");
937 g_variant_get(param->parameters, "(&oas)", &obj_path, &iter);
938 DBG("Device path : %s ", obj_path);
939 while (g_variant_iter_loop(iter, "s", &str)) {
940 if (g_strcmp0(str, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0)
941 _bt_hal_remove_control_device_path(obj_path);
943 g_variant_iter_free(iter);
944 } else if (strcasecmp(param->signal_name, "NameOwnerChanged") == 0) {
946 char *previous = NULL;
947 char *current = NULL;
949 /* TODO: Handle Name Owener changed Signal */
950 if (__bt_hal_get_owner_info(param->parameters, &name, &previous, ¤t)) {
951 DBG("Fail to get the owner info");
954 if (current && *current != '\0') {
960 if (strcasecmp(name, BT_HAL_BLUEZ_NAME) == 0) {
961 DBG("Bluetoothd is terminated");
963 /* TODO: Handle Bluetoothd terminating scenario */
966 INFO("Name Owner changed [%s]", name);
971 } else if (g_strcmp0(param->interface_name, BT_HAL_PROPERTIES_INTERFACE) == 0) {
972 DBG("Manager Event: Interface Name: BT_HAL_PROPERTIES_INTERFACE");
973 __bt_hal_handle_property_changed_event(param->parameters, param->object_path);
974 } else if (g_strcmp0(param->interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
975 DBG("Manager Event: Interface Name: BT_HAL_ADAPTER_INTERFACE");
976 _bt_hal_handle_adapter_event(param->parameters, param->signal_name);
977 } else if (g_strcmp0(param->interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
978 DBG("Manager Event: Interface Name: BT_HAL_INPUT_INTERFACE");
979 __bt_hal_handle_input_event(param->parameters, param->object_path);
980 } else if (g_strcmp0(param->interface_name, BT_HAL_NETWORK_SERVER_INTERFACE) == 0) {
981 /* TODO: Handle Network Server events from stack */
982 DBG("Manager Event: Interface Name: BT_HAL_NETWORK_SERVER_INTERFACE");
983 } else if (g_strcmp0(param->interface_name, BT_HAL_HEADSET_INTERFACE) == 0) {
984 DBG("Manager Event: Interface Name: BT_HAL_HEADSET_INTERFACE");
985 __bt_hal_handle_headset_events(param->parameters, param->signal_name, param->object_path);
986 } else if (g_strcmp0(param->interface_name, BT_HAL_SINK_INTERFACE) == 0) {
987 /* TODO: Handle Sink interface events from stack */
988 DBG("Manager Event: Interface Name:BT_HAL_SINK_INTERFACE");
989 } else if (g_strcmp0(param->interface_name, BT_HAL_AGENT_INTERFACE) == 0) {
990 /* TODO: Handle Agent events from stack */
991 DBG("Manager Event: Interface Name:BT_HAL_AGENT_INTERFACE");
992 } else if (g_strcmp0(param->interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
993 DBG("Manager Event: Interface Name:BT_HAL_DEVICE_INTERFACE");
994 __bt_hal_handle_device_specific_events(param->parameters, param->signal_name, param->object_path);
995 } else if (g_strcmp0(param->interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
996 DBG("Manager Event: Interface Name: BT_HAL_PLAYER_CONTROL_INTERFACE");
997 __bt_hal_handle_avrcp_ctrl_events(param->parameters, param->signal_name, param->object_path);
998 } else if (g_strcmp0(param->interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
999 DBG("Manager Event: Interface Name: BT_HAL_MEDIATRANSPORT_INTERFACE");
1000 __bt_hal_handle_avrcp_transport_events(param->parameters, param->signal_name, param->object_path);
1005 g_free(param->sender_name);
1006 g_free(param->object_path);
1007 g_free(param->interface_name);
1008 g_free(param->signal_name);
1009 g_variant_unref(param->parameters);
1014 static void __bt_hal_manager_event_filter(GDBusConnection *connection,
1015 const gchar *sender_name,
1016 const gchar *object_path,
1017 const gchar *interface_name,
1018 const gchar *signal_name,
1019 GVariant *parameters,
1022 if (signal_name == NULL)
1025 bt_hal_main_event_data_t *param = g_new0(bt_hal_main_event_data_t, 1);
1026 param->sender_name = g_strdup(sender_name);
1027 param->object_path = g_strdup(object_path);
1028 param->interface_name = g_strdup(interface_name);
1029 param->signal_name = g_strdup(signal_name);
1030 param->parameters = g_variant_ref(parameters);
1032 g_idle_add(__bt_hal_event_manager, (gpointer)param);
1036 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path)
1038 gboolean property_flag = FALSE;
1039 char *property = NULL;
1040 GVariant *value = NULL;
1041 g_variant_get(msg, "(sv)", &property, &value);
1043 if (property == NULL)
1046 DBG("Property = %s \n", property);
1047 /* We allow only 1 headset connection (HSP or HFP)*/
1048 if (strcasecmp(property, "Connected") == 0) {
1050 g_variant_get(value, "b", &property_flag);
1052 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1054 /* Fix : NULL_RETURNS */
1055 if (address == NULL)
1058 _bt_hal_convert_device_path_to_address(path, address);
1059 __bt_hal_send_hf_audio_connection_state_event(property_flag, address);
1061 } else if (strcasecmp(property, "State") == 0) {
1064 g_variant_get(value, "s", &state);
1066 /* This code assumes we support only 1 headset connection */
1067 /* Need to use the headset list, if we support multi-headsets */
1068 if (strcasecmp(state, "Playing") == 0) {
1069 DBG("Playing: Sco Connected");
1070 } else if (strcasecmp(state, "connected") == 0 ||
1071 strcasecmp(state, "disconnected") == 0) {
1072 if (strcasecmp(state, "connected") == 0)
1073 DBG("Sco Connected");
1075 DBG("Sco Disconnected");
1077 ERR("Not handled state - %s", state);
1082 } else if (strcasecmp(property, "SpeakerGain") == 0) {
1085 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1087 _bt_hal_convert_device_path_to_address(path, address);
1088 INFO("Speaker Gain for address [%s]", address);
1089 /* TODO Handle event sending to HAL */
1092 } else if (strcasecmp(property, "MicrophoneGain") == 0) {
1095 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1097 _bt_hal_convert_device_path_to_address(path, address);
1098 INFO("Microphone Gain for address [%s]", address);
1099 /* TODO Handle event sending to HAL */
1106 g_variant_unref(value);
1109 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn,
1115 static int subs_interface_added_id = -1;
1116 static int subs_interface_removed_id = -1;
1117 static int subs_name_owner_id = -1;
1118 static int subs_property_id = -1;
1119 static int subs_adapter_id = -1;
1124 if (subs_interface_added_id == -1) {
1125 subs_interface_added_id = g_dbus_connection_signal_subscribe(conn,
1126 NULL, BT_HAL_MANAGER_INTERFACE,
1127 BT_HAL_INTERFACES_ADDED, NULL, NULL, 0,
1128 __bt_hal_manager_event_filter,
1131 if (subs_interface_removed_id == -1) {
1132 subs_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
1133 NULL, BT_HAL_MANAGER_INTERFACE,
1134 BT_HAL_INTERFACES_REMOVED, NULL, NULL, 0,
1135 __bt_hal_manager_event_filter,
1138 if (subs_name_owner_id == -1) {
1139 subs_name_owner_id = g_dbus_connection_signal_subscribe(conn,
1140 NULL, BT_HAL_FREEDESKTOP_INTERFACE,
1141 BT_HAL_NAME_OWNER_CHANGED, NULL, NULL, 0,
1142 __bt_hal_manager_event_filter,
1145 if (subs_property_id == -1) {
1146 subs_property_id = g_dbus_connection_signal_subscribe(conn,
1147 NULL, BT_HAL_PROPERTIES_INTERFACE,
1148 BT_HAL_PROPERTIES_CHANGED, NULL, NULL, 0,
1149 __bt_hal_manager_event_filter,
1152 if (subs_adapter_id == -1) {
1153 subs_adapter_id = g_dbus_connection_signal_subscribe(conn,
1154 NULL, BT_HAL_ADAPTER_INTERFACE,
1155 NULL, NULL, NULL, 0,
1156 __bt_hal_manager_event_filter,
1160 if (subs_interface_added_id != -1) {
1161 g_dbus_connection_signal_unsubscribe(conn,
1162 subs_interface_added_id);
1163 subs_interface_added_id = -1;
1165 if (subs_interface_removed_id != -1) {
1166 g_dbus_connection_signal_unsubscribe(conn,
1167 subs_interface_removed_id);
1168 subs_interface_removed_id = -1;
1170 if (subs_name_owner_id != -1) {
1171 g_dbus_connection_signal_unsubscribe(conn,
1172 subs_name_owner_id);
1173 subs_name_owner_id = -1;
1175 if (subs_property_id != -1) {
1176 g_dbus_connection_signal_unsubscribe(conn,
1178 subs_property_id = -1;
1180 if (subs_adapter_id == -1) {
1181 g_dbus_connection_signal_unsubscribe(conn, subs_adapter_id);
1182 subs_adapter_id = -1;
1190 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn,
1193 static int subs_device_id = -1;
1200 if (subs_device_id == -1) {
1201 subs_device_id = g_dbus_connection_signal_subscribe(conn,
1202 NULL, BT_HAL_DEVICE_INTERFACE,
1203 NULL, NULL, NULL, 0,
1204 __bt_hal_manager_event_filter,
1208 if (subs_device_id != -1) {
1209 g_dbus_connection_signal_unsubscribe(conn,
1211 subs_device_id = -1;
1219 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe)
1221 static int subs_input_id = -1;
1229 if (subs_input_id == -1) {
1230 subs_input_id = g_dbus_connection_signal_subscribe(conn,
1231 NULL, BT_HAL_INPUT_INTERFACE,
1232 NULL, NULL, NULL, 0,
1233 __bt_hal_manager_event_filter,
1237 if (subs_input_id != -1) {
1238 g_dbus_connection_signal_unsubscribe(conn,
1249 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type)
1254 return BT_HAL_ERROR_INTERNAL;
1256 /* TODO: Add more events in subsequent patches */
1257 switch (event_type) {
1258 case BT_HAL_MANAGER_EVENT:
1259 __bt_hal_register_manager_subscribe_signal(g_conn, TRUE);
1261 case BT_HAL_DEVICE_EVENT:
1262 __bt_hal_register_device_subscribe_signal(g_conn, TRUE);
1264 case BT_HAL_HID_EVENT:
1265 __bt_hal_register_input_subscribe_signal(g_conn, TRUE);
1267 case BT_HAL_HEADSET_EVENT:
1268 __bt_hal_register_audio_subscribe_signal(g_conn, TRUE);
1271 INFO_C("Register Event: event_type [%d]", event_type);
1272 return BT_HAL_ERROR_NOT_SUPPORT;
1275 return BT_HAL_ERROR_NONE;
1278 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn,
1284 static int subs_headset_id = -1;
1285 static int subs_sink_id = -1;
1288 if (subs_headset_id == -1) {
1289 subs_headset_id = g_dbus_connection_signal_subscribe(conn,
1290 NULL, BT_HAL_HEADSET_INTERFACE,
1291 NULL, NULL, NULL, 0,
1292 __bt_hal_manager_event_filter,
1295 if (subs_sink_id == -1) {
1296 subs_sink_id = g_dbus_connection_signal_subscribe(conn,
1297 NULL, BT_HAL_SINK_INTERFACE,
1298 NULL, NULL, NULL, 0,
1299 __bt_hal_manager_event_filter,
1303 if (subs_headset_id != -1) {
1304 g_dbus_connection_signal_unsubscribe(conn,
1306 subs_headset_id = -1;
1308 if (subs_sink_id != -1) {
1309 g_dbus_connection_signal_unsubscribe(conn,
1317 static int __bt_hal_initialize_manager_receiver(void)
1321 GError *error = NULL;
1323 if (manager_conn == NULL) {
1324 manager_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1325 if (error != NULL) {
1326 ERR_C("ERROR: Can't get on system bus [%s]", error->message);
1327 g_clear_error(&error);
1329 if (manager_conn == NULL)
1333 if (__bt_hal_register_service_event(manager_conn,
1334 BT_HAL_MANAGER_EVENT) != BT_HAL_ERROR_NONE)
1336 if (__bt_hal_register_service_event(manager_conn,
1337 BT_HAL_DEVICE_EVENT) != BT_HAL_ERROR_NONE)
1339 if (__bt_hal_register_service_event(manager_conn,
1340 BT_HAL_HID_EVENT) != BT_HAL_ERROR_NONE)
1342 if (__bt_hal_register_service_event(manager_conn,
1343 BT_HAL_HEADSET_EVENT) != BT_HAL_ERROR_NONE)
1345 return BT_HAL_ERROR_NONE;
1348 g_object_unref(manager_conn);
1349 manager_conn = NULL;
1354 return BT_HAL_ERROR_INTERNAL;
1357 /* To receive the event from bluez */
1358 int _bt_hal_initialize_event_receiver(handle_stack_msg cb)
1364 return BT_HAL_ERROR_INVALID_PARAM;
1366 result = __bt_hal_initialize_manager_receiver();
1368 DBG("Manager event receiver initialization result [%d]", result);
1369 if (result != BT_HAL_ERROR_NONE)
1372 /*TODO: Initialize Obexd Event receiver */
1377 return BT_HAL_ERROR_NONE;
1380 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path)
1382 GVariantIter value_iter;
1383 GVariant *value = NULL;
1385 g_variant_iter_init(&value_iter, msg);
1388 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
1389 if (!g_strcmp0(key, "Connected")) {
1390 guint connected = 0;
1391 g_variant_get(value, "i", &connected);
1392 DBG("Device property changed : Connected [%d]", connected);
1393 } else if (!g_strcmp0(key, "RSSI")) {
1394 DBG("Device property changed : RSSI");
1395 __bt_hal_dbus_device_found_properties(path);
1396 } else if (!g_strcmp0(key, "GattConnected")) {
1397 DBG("Device property changed : GattConnected");
1398 gboolean gatt_connected = FALSE;
1399 g_variant_get(value, "b", &gatt_connected);
1400 char *address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1401 _bt_hal_convert_device_path_to_address(path, address);
1402 DBG("@@gatt_connected: %d", gatt_connected);
1403 DBG("@@address: %s", address);
1404 _bt_hal_gatt_connected_state_event(gatt_connected, address);
1405 _bt_hal_handle_gattc_connected_event(address, gatt_connected);
1407 } else if (!g_strcmp0(key, "Paired")) {
1408 gboolean paired = FALSE;
1409 struct hal_ev_bond_state_changed ev;
1410 char address[BT_HAL_ADDRESS_STRING_SIZE];
1412 g_variant_get(value, "b", &paired);
1413 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1415 _bt_hal_agent_set_canceled(FALSE);
1416 _bt_hal_convert_device_path_to_address(path, address);
1418 /* Prepare to send event to HAL bluetooth */
1419 ev.status = BT_STATUS_SUCCESS;
1420 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1421 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1424 ERR("Bluetooth HAL event handler not registered");
1426 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
1427 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1429 } else if (!g_strcmp0(key, "LegacyPaired")) {
1430 DBG("Device property changed : LegacyPaired");
1431 } else if (!g_strcmp0(key, "Trusted")) {
1432 DBG("Device property changed : Trusted");
1433 gboolean trusted = FALSE;
1434 gchar *address = NULL;
1435 g_variant_get(value, "b", &trusted);
1436 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1438 _bt_hal_convert_device_path_to_address(path, address);
1439 DBG("Device [%s] trusted: [%d]", address, trusted);
1441 __bt_hal_send_device_trust_state_event(trusted, address);
1443 } else if (!g_strcmp0(key, "IpspConnected")) {
1444 DBG("Device property changed : IpspConnected");
1445 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
1446 DBG("Device property changed : IpspInitStateChanged");
1447 } else if (!g_strcmp0(key, "TrustedProfiles")) {
1449 char address[BT_HAL_ADDRESS_STRING_SIZE];
1451 g_variant_get(value, "u", &trust_val);
1452 _bt_hal_convert_device_path_to_address(path, address);
1453 DBG("Address: %s, TrustedProfiles: 0x%X", address, trust_val);
1454 __bt_hal_send_device_trusted_profile_changed_event(trust_val, address);
1456 ERR("Unhandled Property:[%s]", key);
1462 static void __bt_hal_dbus_device_found_properties(const char *device_path)
1465 GError *error = NULL;
1466 GDBusProxy *device_proxy;
1467 GDBusConnection *conn;
1472 ERR("Invalid device path");
1476 conn = _bt_hal_get_system_gconn();
1478 ERR("_bt_hal_get_system_gconn failed");
1482 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1486 BT_HAL_PROPERTIES_INTERFACE,
1489 if (!device_proxy) {
1490 ERR("Error creating device_proxy");
1494 result = g_dbus_proxy_call_sync(device_proxy,
1496 g_variant_new("(s)", BT_HAL_DEVICE_INTERFACE),
1497 G_DBUS_CALL_FLAGS_NONE,
1502 ERR("Error occured in Proxy call");
1503 if (error != NULL) {
1504 ERR("Error occured in Proxy call (Error: %s)", error->message);
1505 g_clear_error(&error);
1507 g_object_unref(device_proxy);
1511 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1512 _bt_hal_convert_device_path_to_address(device_path, address);
1514 __bt_hal_device_properties_lookup(result, address);
1516 g_object_unref(device_proxy);
1522 static void __bt_hal_device_properties_lookup(GVariant *result, char *address)
1524 /* Buffer and propety count management */
1525 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
1526 struct hal_ev_device_found *ev = (void *) buf;
1528 memset(buf, 0, sizeof(buf));
1532 GVariant *tmp_value;
1535 gchar *manufacturer_data = NULL;
1538 if (result != NULL) {
1539 g_variant_get(result , "(@a{sv})", &value);
1540 g_variant_unref(result);
1543 tmp_value = g_variant_lookup_value(value, "Alias", G_VARIANT_TYPE_STRING);
1545 g_variant_get(tmp_value, "s", &name);
1547 g_variant_unref(tmp_value);
1549 DBG_SECURE("Alias Name [%s]", name);
1550 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1551 strlen(name) + 1, name);
1553 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1556 tmp_value = g_variant_lookup_value(value, "Name", G_VARIANT_TYPE_STRING);
1557 g_variant_get(tmp_value, "s", &name);
1558 g_variant_unref(tmp_value);
1560 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1561 strlen(name) + 1, name);
1563 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1564 g_variant_get(tmp_value, "s", &name);
1568 tmp_value = g_variant_lookup_value(value, "Class", G_VARIANT_TYPE_UINT32);
1569 unsigned int class = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1570 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
1571 sizeof(unsigned int), &class);
1574 g_variant_unref(tmp_value);
1578 tmp_value = g_variant_lookup_value(value, "Connected", G_VARIANT_TYPE_BOOLEAN);
1579 unsigned int connected = tmp_value ? g_variant_get_boolean(tmp_value) : 0;
1580 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
1581 sizeof(unsigned int), &connected);
1583 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
1585 g_variant_unref(tmp_value);
1588 tmp_value = g_variant_lookup_value(value, "Trusted", G_VARIANT_TYPE_BOOLEAN);
1589 uint8_t trust = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1590 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
1591 sizeof(uint8_t), &trust);
1593 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
1595 g_variant_unref(tmp_value);
1598 tmp_value = g_variant_lookup_value(value, "Paired", G_VARIANT_TYPE_BOOLEAN);
1599 uint8_t paired = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1601 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
1602 sizeof(uint8_t), &paired);
1604 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
1606 g_variant_unref(tmp_value);
1609 tmp_value = g_variant_lookup_value(value, "RSSI", G_VARIANT_TYPE_INT32);
1610 int rssi = tmp_value ? g_variant_get_int32(tmp_value) : 0;
1611 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
1612 sizeof(int), &rssi);
1614 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
1616 g_variant_unref(tmp_value);
1618 /* Last Addr Type */
1619 tmp_value = g_variant_lookup_value(value, "LastAddrType", G_VARIANT_TYPE_UINT32);
1620 unsigned int addr_type = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1622 g_variant_unref(tmp_value);
1623 DBG("Device Last Address Type [0x%x]", addr_type);
1626 tmp_value = g_variant_lookup_value(value, "IsAliasSet", G_VARIANT_TYPE_UINT32);
1627 uint8_t is_alias_set = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1628 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
1629 sizeof(uint8_t), &is_alias_set);
1631 DBG("IsAliasSet: [%s], Property num [%d]", (is_alias_set ? "TRUE" : "FALSE"), ev->num_props);
1633 g_variant_unref(tmp_value);
1636 tmp_value = g_variant_lookup_value(value, "UUIDs", G_VARIANT_TYPE_STRING_ARRAY);
1637 gsize uuid_count = g_variant_get_size(tmp_value);
1638 char **uuid_value = g_variant_dup_strv(tmp_value, &uuid_count);
1640 /* UUID collection */
1645 int num_props_tmp = ev->num_props;
1647 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
1649 for (i = 0; uuid_value[i] != NULL; i++) {
1651 char *uuid_str = NULL;
1652 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
1653 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
1655 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
1656 uuid_str = g_strdup(uuid_value[i]);
1657 DBG("UUID string [%s]\n", uuid_str);
1659 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
1661 for (z = 0; z < 16; z++)
1662 DBG("[0x%x]", uuid[z]);
1665 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
1669 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
1670 (BT_HAL_STACK_UUID_SIZE * uuid_count),
1672 ev->num_props = num_props_tmp + 1;
1675 g_variant_unref(tmp_value);
1677 /* LegacyManufacturerDataLen */
1678 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerDataLen", G_VARIANT_TYPE_UINT32);
1679 unsigned int manufacturer_data_len = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1680 if (manufacturer_data_len > BT_HAL_MANUFACTURER_DATA_LENGTH_MAX) {
1681 ERR("manufacturer_data_len is too long(len = %d)", manufacturer_data_len);
1682 manufacturer_data_len = BT_HAL_MANUFACTURER_DATA_LENGTH_MAX;
1685 g_variant_unref(tmp_value);
1686 /*size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA_LEN,
1687 sizeof(unsigned int), &manufacturer_data_len);
1689 DBG("Device Legacy Manufacturer data length [%u]", manufacturer_data_len);
1691 /* ManufacturerData */
1692 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerData", G_VARIANT_TYPE_BYTESTRING);
1693 manufacturer_data = value ? (gchar *)g_variant_get_bytestring(tmp_value) : NULL;
1694 if (manufacturer_data) {
1695 if (manufacturer_data_len > 0) {
1696 //size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA,
1697 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_BLE_ADV_DATA,
1698 manufacturer_data_len, manufacturer_data);
1703 g_variant_unref(tmp_value);
1707 _bt_hal_convert_addr_string_to_type(bdaddr, address);
1708 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
1709 sizeof(bdaddr), bdaddr);
1711 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
1714 g_variant_unref(value);
1716 ERR("result is NULL\n");
1719 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%d]", ev->num_props, size);
1720 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
1725 static void __bt_hal_send_device_acl_connection_state_event(gboolean connected, const char *address)
1728 struct hal_ev_acl_state_changed ev;
1730 ev.status = BT_STATUS_SUCCESS;
1731 ev.state = (connected == TRUE) ?
1732 HAL_ACL_STATE_CONNECTED :
1733 HAL_ACL_STATE_DISCONNECTED;
1735 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1738 ERR("Bluetooth HAL event handler not registered");
1740 event_cb(HAL_EV_ACL_STATE_CHANGED, &ev, sizeof(ev));
1744 static void __bt_hal_send_device_le_connection_state_event(gboolean connected, const char *address)
1747 struct hal_ev_le_conn_state_changed ev;
1749 ev.status = BT_STATUS_SUCCESS;
1750 ev.state = (connected == TRUE) ?
1751 HAL_LE_STATE_CONNECTED :
1752 HAL_LE_STATE_DISCONNECTED;
1754 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1757 ERR("Bluetooth HAL event handler not registered");
1759 event_cb(HAL_EV_LE_CONN_STATE_CHANGED, &ev, sizeof(ev));
1763 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted,
1764 const char *address)
1766 struct hal_ev_device_trust_state_changed ev;
1769 ev.trust = (is_trusted == TRUE) ?
1770 HAL_DEVICE_TRUSTED :
1771 HAL_DEVICE_UNTRUSTED;
1773 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1776 ERR("Bluetooth HAL event handler not registered");
1778 event_cb(HAL_EV_DEVICE_TRUST_CHANGED, &ev, sizeof(ev));
1782 static void __bt_hal_send_device_trusted_profile_changed_event(
1783 uint32_t trust_val, const char *address)
1785 struct hal_ev_device_trusted_profiles_changed ev;
1788 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1789 ev.trust_val = trust_val;
1792 ERR("Bluetooth HAL event handler not registered");
1794 event_cb(HAL_EV_DEVICE_TRUSTED_PROFILES_CHANGED, &ev, sizeof(ev));
1798 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member,
1802 const char *property = NULL;
1806 if (strcasecmp(member, "PropertyChanged") == 0) {
1807 g_variant_get(msg, "(s)", &property);
1808 if (property == NULL)
1810 if (strcasecmp(property, "GattConnected") == 0) {
1811 INFO("GATT Connected");
1812 gboolean connected = FALSE;
1814 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1816 _bt_hal_convert_device_path_to_address(path, address);
1817 g_variant_get(msg, "(b)", &connected);
1819 INFO("Connected device address[%s] connnected[%d]", address, connected);
1821 } else if (strcasecmp(property, "Paired") == 0) {
1822 gboolean paired = FALSE;
1823 struct hal_ev_bond_state_changed ev;
1824 char address[BT_HAL_ADDRESS_STRING_SIZE];
1826 g_variant_get(msg, "(b)", &paired);
1827 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1829 _bt_hal_agent_set_canceled(FALSE);
1830 _bt_hal_convert_device_path_to_address(path, address);
1832 /* Prepare to send event to HAL bluetooth */
1833 ev.status = BT_STATUS_SUCCESS;
1834 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1835 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1838 ERR("Bluetooth HAL event handler not registered");
1840 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
1841 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1843 } else if (strcasecmp(property, "UUIDs") == 0) {
1846 } else if (strcasecmp(member, "DeviceConnected") == 0) {
1847 unsigned char addr_type = 0;
1849 g_variant_get(msg, "(y)", &addr_type);
1851 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1852 _bt_hal_convert_device_path_to_address(path, address);
1854 DBG("Member: [%s]", member);
1855 ERR_C("Connected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
1857 __bt_hal_send_device_acl_connection_state_event(TRUE, address);
1859 __bt_hal_send_device_le_connection_state_event(TRUE, address);
1861 } else if (strcasecmp(member, "Disconnected") == 0) {
1862 unsigned char disc_reason = 0;
1863 unsigned char addr_type = 0;
1866 g_variant_get(msg, "(yy&s)", &addr_type, &disc_reason, &name);
1868 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1869 _bt_hal_convert_device_path_to_address(path, address);
1871 DBG("Member: [%s]", member);
1872 ERR_C("DisConnected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
1873 DBG("Disconnect Reason: %d", disc_reason);
1874 DBG("Name: %s", name);
1876 __bt_hal_send_device_acl_connection_state_event(FALSE, address);
1878 __bt_hal_send_device_le_connection_state_event(FALSE, address);
1880 } else if (strcasecmp(member, "ProfileStateChanged") == 0) {
1882 char *profile_uuid = NULL;
1884 g_variant_get(msg, "(si)", &profile_uuid, &state);
1885 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1886 _bt_hal_convert_device_path_to_address(path, address);
1888 DBG("Address: %s", address);
1889 DBG("Profile UUID: %s", profile_uuid);
1890 DBG("State: %d", state);
1891 if (strncmp(profile_uuid, HID_UUID, strlen(HID_UUID)) == 0) {
1892 if (state == BT_HAL_PROFILE_STATE_CONNECTED)
1893 __bt_hal_send_hid_connection_state_event(TRUE, address);
1894 else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED)
1895 __bt_hal_send_hid_connection_state_event(FALSE, address);
1897 DBG("Profile state: %d", state);
1899 } else if ((strncmp(profile_uuid, A2DP_SINK_UUID, strlen(A2DP_SINK_UUID)) == 0)) {
1900 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
1901 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTED");
1902 __bt_hal_send_av_connection_state_event(TRUE, address);
1903 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
1904 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
1905 __bt_hal_send_av_connection_state_event(FALSE, address);
1906 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
1907 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
1908 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
1909 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTING");
1911 ERR("A2DP Profile state: Invalid");
1913 } else if ((strncmp(profile_uuid, A2DP_SOURCE_UUID, strlen(A2DP_SOURCE_UUID)) == 0)) {
1914 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
1915 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
1916 __bt_hal_send_a2dp_sink_connection_state_event(TRUE, address);
1917 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
1918 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
1919 __bt_hal_send_a2dp_sink_connection_state_event(FALSE, address);
1920 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
1921 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
1922 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
1923 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
1925 } else if (strncmp(profile_uuid, HFP_HF_UUID, strlen(HFP_HF_UUID)) == 0) {
1926 if (state == BT_HAL_PROFILE_STATE_CONNECTING)
1927 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTING");
1928 else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
1929 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTED");
1930 __bt_hal_send_hf_connection_state_event(TRUE, address);
1931 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
1932 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
1933 __bt_hal_send_hf_connection_state_event(FALSE, address);
1934 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
1935 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
1937 ERR("HFP Profile state: Invalid");
1939 } else if ((strncmp(profile_uuid, AVRCP_TARGET_UUID, strlen(AVRCP_TARGET_UUID)) == 0)) {
1940 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
1941 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
1942 __bt_hal_send_avrcp_ctrl_connection_state_event(TRUE, address);
1943 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
1944 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
1945 __bt_hal_send_avrcp_ctrl_connection_state_event(FALSE, address);
1946 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
1947 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
1948 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
1949 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
1952 DBG("Profile[%s] State changed status [%d] ", profile_uuid, state);
1955 g_free(profile_uuid);
1956 } else if (strcasecmp(member, "AdvReport") == 0) {
1957 DBG("Member: [%s]", member);
1958 __bt_hal_handle_adv_report(msg, path);
1962 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path)
1964 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
1965 struct hal_ev_gatt_client_scan_result *ev = (void *)buf;
1967 char *address = NULL;
1968 GVariant *value = NULL;
1969 char *buffer = NULL;
1972 uint8_t addr_type = 0;
1973 uint8_t adv_type = 0;
1979 memset(buf, 0, sizeof(buf));
1982 g_variant_get(msg, "(&syyii@ay)", &address, &addr_type,
1983 &adv_type, &rssi, &data_len, &value);
1985 buffer_len = g_variant_get_size(value);
1987 buffer = (char *)g_variant_get_data(value);
1989 if (data_len != buffer_len) {
1990 ERR("Unexpected: buffer_len: %d, data_len: %d",
1991 buffer_len, data_len);
1992 data_len = buffer_len;
1995 DBG("Address: %s, len: %d, rssi: %d, addr_type: 0x%02X, adv_type: 0x%02X",
1996 address, data_len, rssi, addr_type, adv_type);
1998 _bt_hal_convert_addr_string_to_type(ev->bd_addr, address);
1999 ev->addr_type = addr_type;
2000 ev->adv_type = adv_type;
2003 memcpy(ev->adv_data, buffer, data_len);
2006 DBG("Send le scan result event to HAL, size: [%d]", size);
2007 gatt_event_cb(HAL_EV_GATT_CLIENT_SCAN_RESULT, buf, size);
2008 g_variant_unref(value);
2011 /* AVRCP Controller Role(Remote:AVRCP Target) Events */
2012 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address)
2015 struct hal_ev_avrcp_ctrl_conn_state ev;
2017 if (connected == TRUE)
2018 INFO("AVRCP(Controller) Profile Connected for address [%s]", address);
2020 INFO("AVRCP(Controller) Profile DisConnected for address [%s]", address);
2022 if (connected == TRUE)
2023 ev.state = HAL_AVRCP_CTRL_STATE_CONNECTED;
2025 ev.state = HAL_AVRCP_CTRL_STATE_DISCONNECTED;
2026 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2028 if (!a2dp_sink_event_cb)
2029 ERR("AV event handler not registered");
2031 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_CONN_STATE, &ev, sizeof(ev));
2034 static int __bt_media_attr_to_type(const char *str)
2036 if (!strcasecmp(str, "Equalizer"))
2037 return HAL_PLAYER_ATTR_EQUALIZER;
2038 else if (!strcasecmp(str, "Repeat"))
2039 return HAL_PLAYER_ATTR_REPEAT;
2040 else if (!strcasecmp(str, "Shuffle"))
2041 return HAL_PLAYER_ATTR_SHUFFLE;
2042 else if (!strcasecmp(str, "Scan"))
2043 return HAL_PLAYER_ATTR_SCAN;
2049 static int __bt_hal_play_status_str_to_type(const char *value)
2051 if (!strcmp(value, "stopped"))
2052 return HAL_PLAYSTATE_STOPPED;
2053 else if (!strcmp(value, "playing"))
2054 return HAL_PLAYSTATE_PLAYING;
2055 else if (!strcmp(value, "paused"))
2056 return HAL_PLAYSTATE_PAUSED;
2057 else if (!strcmp(value, "forward-seek"))
2058 return HAL_PLAYSTATE_FWD_SEEK;
2059 else if (!strcmp(value, "reverse-seek"))
2060 return HAL_PLAYSTATE_REV_SEEK;
2062 return HAL_PLAYSTATE_ERROR;
2065 static void __bt_avrcp_control_parse_properties(struct hal_ev_track_changed *ev, GVariant *item)
2067 GVariant *value = NULL;
2069 char *value_string = NULL;
2070 const char *key = NULL;
2076 g_variant_iter_init(&iter, item);
2077 while (g_variant_iter_loop(&iter, "{sv}", &key, &value)) {
2078 if (strcasecmp(key, "Title") == 0) {
2079 value_string = (char *)g_variant_get_string(value, NULL);
2080 DBG("Value : %s ", value_string);
2081 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TITLE;
2082 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2084 } else if (strcasecmp(key, "Artist") == 0) {
2085 value_string = (char *)g_variant_get_string(value, NULL);
2086 DBG("Value : %s ", value_string);
2087 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ARTIST;
2088 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2090 } else if (strcasecmp(key, "Album") == 0) {
2091 value_string = (char *)g_variant_get_string(value, NULL);
2092 DBG("Value : %s ", value_string);
2093 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ALBUM;
2094 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2096 } else if (strcasecmp(key, "Genre") == 0) {
2097 value_string = (char *)g_variant_get_string(value, NULL);
2098 DBG("Value : %s ", value_string);
2099 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_GENRE;
2100 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2102 } else if (strcasecmp(key, "Duration") == 0) {
2105 val = g_variant_get_uint32(value);
2106 DBG("Value : %d", val);
2107 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_PLAYING_TIME;
2108 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2110 } else if (strcasecmp(key, "NumberOfTracks") == 0) {
2113 val = g_variant_get_uint32(value);
2114 DBG("Value : %d", val);
2115 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_NUM_TRACKS;
2116 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2118 } else if (strcasecmp(key, "TrackNumber") == 0) {
2121 val = g_variant_get_uint32(value);
2122 DBG("Value : %d", val);
2123 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TRACK_NUM;
2124 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2127 DBG("%s not supported, ignoring", key);
2130 if (i >= HAL_MAX_ATTR_NUM) {
2131 ERR(" Received max attribute [%d]", i);
2137 g_variant_iter_free(&iter);
2141 static int __bt_media_attrval_to_val(int type, const char *value)
2146 case HAL_PLAYER_ATTR_EQUALIZER:
2147 if (!strcmp(value, "off"))
2152 case HAL_PLAYER_ATTR_REPEAT:
2153 if (!strcmp(value, "off"))
2154 ret = BTRC_PLAYER_VAL_OFF_REPEAT;
2155 else if (!strcmp(value, "singletrack"))
2156 ret = BTRC_PLAYER_VAL_SINGLE_REPEAT;
2157 else if (!strcmp(value, "alltracks"))
2158 ret = BTRC_PLAYER_VAL_ALL_REPEAT;
2160 ret = BTRC_PLAYER_VAL_GROUP_REPEAT;
2162 case HAL_PLAYER_ATTR_SHUFFLE:
2163 if (!strcmp(value, "off"))
2164 ret = BTRC_PLAYER_VAL_OFF_SHUFFLE;
2165 else if (!strcmp(value, "alltracks"))
2166 ret = BTRC_PLAYER_VAL_ALL_SHUFFLE;
2168 ret = BTRC_PLAYER_VAL_GROUP_SHUFFLE;
2170 case HAL_PLAYER_ATTR_SCAN:
2171 if (!strcmp(value, "off"))
2173 else if (!strcmp(value, "alltracks"))
2179 ERR("Value not handled");
2185 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member,
2188 const char *property = NULL;
2189 GVariant *value = NULL;
2191 char address[BT_HAL_ADDRESS_STRING_SIZE];
2194 ERR("Error returned in method call\n");
2198 if (!avrcp_ctrl_event_cb) {
2199 ERR("AVRCP controller DBUS handler callback not registered");
2203 g_variant_iter_init(&iter, msg);
2205 _bt_hal_convert_device_path_to_address(path, address);
2207 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2208 DBG("Property = %s \n", property);
2209 if ((strcasecmp(property, "Equalizer") == 0) ||
2210 (strcasecmp(property, "Repeat") == 0) ||
2211 (strcasecmp(property, "Shuffle") == 0) ||
2212 (strcasecmp(property, "Scan") == 0)) {
2213 struct hal_ev_player_setting ev;
2217 valstr = g_variant_get_string(value, NULL);
2218 DBG("Value : %s ", valstr);
2221 val = __bt_media_attrval_to_val(__bt_media_attr_to_type(property), valstr);
2224 memset(&ev, 0, sizeof(ev));
2225 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2227 ev.attr_ids[0] = __bt_media_attr_to_type(property);
2228 ev.attr_values[0] = val;
2230 /* Send event to application */
2231 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAYER_APP_SETTING_CHANGED, &ev, sizeof(ev));
2233 } else if ((strcasecmp(property, "Status") == 0)) {
2234 struct hal_ev_play_status_changed ev;
2237 valstr = g_variant_get_string(value, NULL);
2238 DBG("Value : %s ", valstr);
2240 memset(&ev, 0, sizeof(ev));
2241 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2243 ev.status = __bt_hal_play_status_str_to_type(valstr);
2245 /* Send event to application */
2246 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_STATUS_CHANGED, &ev, sizeof(ev));
2248 } else if (strcasecmp(property, "Position") == 0) {
2249 struct hal_ev_play_position ev;
2251 memset(&ev, 0, sizeof(ev));
2252 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2253 ev.pos = g_variant_get_uint32(value);
2254 DBG("Value : %d ", ev.pos);
2256 /* Send event to application */
2257 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_POSITION_CHANGED, &ev, sizeof(ev));
2258 } else if (strcasecmp(property, "Track") == 0) {
2259 struct hal_ev_track_changed ev;
2261 memset(&ev, 0, sizeof(ev));
2262 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2263 __bt_avrcp_control_parse_properties(&ev, value);
2265 /* Send event to application */
2266 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_TRACK_CHANGED, &ev, sizeof(ev));
2268 DBG("Property not handled");
2272 g_free((char *)property);
2273 g_variant_unref(value);
2276 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member,
2279 const char *property = NULL;
2280 GVariant *value = NULL;
2282 char address[BT_HAL_ADDRESS_STRING_SIZE];
2286 ERR("Error returned in method call\n");
2290 if (!avrcp_tg_event_cb) {
2291 ERR("AVRCP target DBUS handler callback not registered");
2295 g_variant_iter_init(&iter, msg);
2297 _bt_hal_convert_device_path_to_address(path, address);
2299 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2300 DBG("Property = %s \n", property);
2301 if ((strcasecmp(property, "Delay") == 0)) {
2302 struct hal_ev_avrcp_tg_delay_changed ev;
2305 memset(&ev, 0, sizeof(ev));
2306 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2308 val = g_variant_get_uint16(value);
2309 DBG("Value : %d", val);
2312 /* Send event to application */
2313 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_DELAY_CHANGE, &ev, sizeof(ev));
2315 DBG("Property not handled");
2320 g_free((char *)property);
2321 g_variant_unref(value);
2324 /* A2DP Src Role(Remote:Sink) Events */
2325 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address)
2328 struct hal_ev_a2dp_conn_state ev;
2330 if (connected == TRUE)
2331 INFO("A2DP(Src) Profile Connected for address [%s]", address);
2333 INFO("A2DP(Src) Profile DisConnected for address [%s]", address);
2335 ev.state = (connected == TRUE) ?
2336 HAL_EV_A2DP_STATE_CONNECTED :
2337 HAL_EV_A2DP_STATE_DISCONNECTED;
2339 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2342 ERR("AV event handler not registered");
2344 av_event_cb(HAL_EV_A2DP_CONN_STATE, &ev, sizeof(ev));
2347 /* A2DP Sink Role(Remote:Source) Events */
2348 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address)
2351 struct hal_ev_a2dp_conn_state ev;
2353 if (connected == TRUE)
2354 INFO("A2DP(Sink) Profile Connected for address [%s]", address);
2356 INFO("A2DP(Sink) Profile DisConnected for address [%s]", address);
2358 ev.state = (connected == TRUE) ?
2359 HAL_EV_A2DP_STATE_CONNECTED :
2360 HAL_EV_A2DP_STATE_DISCONNECTED;
2362 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2364 if (!a2dp_sink_event_cb)
2365 ERR("AV event handler not registered");
2367 a2dp_sink_event_cb(HAL_EV_A2DP_SOURCE_CONN_STATE, &ev, sizeof(ev));
2370 /* HF(AG Role) Audio Events */
2371 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected,
2372 const char *address)
2375 struct hal_ev_handsfree_audio_state ev;
2377 if (connected == TRUE)
2378 INFO("AG Audio Connected for address [%s]", address);
2380 INFO("AG Audio DisConnected for address [%s]", address);
2382 ev.state = (connected == TRUE) ?
2383 HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTED :
2384 HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED;
2386 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2389 ERR("HF event handler not registered");
2391 hf_event_cb(HAL_EV_HANDSFREE_AUDIO_STATE, &ev, sizeof(ev));
2394 /* HF(AG Role) Profile Events */
2395 static void __bt_hal_send_hf_connection_state_event(gboolean connected,
2396 const char *address)
2399 struct hal_ev_handsfree_conn_state ev;
2401 if (connected == TRUE)
2402 INFO("AG Profile Connected for address [%s]", address);
2404 INFO("AG Profile DisConnected for address [%s]", address);
2406 ev.state = (connected == TRUE) ?
2407 HAL_EV_HANDSFREE_CONN_STATE_CONNECTED :
2408 HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTED;
2410 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2413 ERR("HF event handler not registered");
2415 hf_event_cb(HAL_EV_HANDSFREE_CONN_STATE, &ev, sizeof(ev));
2418 void _bt_hal_register_event_handler_cb(bt_hal_module_e module, handle_stack_msg cb)
2428 a2dp_sink_event_cb = cb;
2434 avrcp_tg_event_cb = cb;
2436 case HAL_AVRCP_CTRL:
2437 avrcp_ctrl_event_cb = cb;
2443 ERR("Unknown module: %d", module);
2447 void _bt_hal_unregister_event_handler_cb(bt_hal_module_e module)
2451 hid_event_cb = NULL;
2457 a2dp_sink_event_cb = NULL;
2463 avrcp_tg_event_cb = NULL;
2465 case HAL_AVRCP_CTRL:
2466 avrcp_ctrl_event_cb = NULL;
2469 gatt_event_cb = NULL;
2472 ERR("Unknown module: %d", module);
2476 bool _bt_hal_get_adapter_request_state(void)
2478 return is_adapter_activating;
2481 bool _bt_hal_get_le_request_state(void)
2483 return is_le_activating;
2486 void _bt_hal_set_adapter_request_state(bool enable)
2488 DBG("set_adapter_request_state %d", enable);
2489 is_adapter_activating = enable;
2492 void _bt_hal_set_le_request_state(bool enable)
2494 DBG("set_le_request_state %d", enable);
2495 is_le_activating = enable;