4 * Copyright (c) 2015 -2016 Samsung Electronics Co., Ltd All Rights Reserved.
6 * Contact: Anupam Roy <anupam.r@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
33 #include "bt-hal-log.h"
34 #include "bt-hal-msg.h"
35 #include "bt-hal-internal.h"
36 #include "bt-hal-event-receiver.h"
37 #include "bt-hal-dbus-common-utils.h"
38 #include "bt-hal-agent.h"
39 #include "bt-hal-adapter-le.h"
40 #include "bt-hal-gatt-server.h"
41 #include "bt-hal-gatt-client.h"
42 #include "bt-hal-adapter-dbus-handler.h"
43 #include "bt-hal-l2cap-le-dbus-handler.h"
44 #include "bt-hal-tds.h"
46 #include "bt-internal-types.h"
48 #define BASELEN_PROP_CHANGED (sizeof(struct hal_ev_adapter_props_changed) \
49 + sizeof(struct hal_property))
51 /*TODO: Basic filters are currently added,
52 Need to add different event filters like HID,
53 Device etc in subsequent patches */
55 /* Global variables and structures */
56 static GDBusConnection *manager_conn;
57 static handle_stack_msg event_cb = NULL;
58 static handle_stack_msg hid_event_cb = NULL;
59 static handle_stack_msg hid_device_event_cb = NULL;
60 static handle_stack_msg av_event_cb = NULL;
61 static handle_stack_msg a2dp_sink_event_cb = NULL;
62 static handle_stack_msg hf_event_cb = NULL;
63 static handle_stack_msg hf_client_event_cb = NULL;
64 static handle_stack_msg avrcp_ctrl_event_cb = NULL;
65 static handle_stack_msg avrcp_tg_event_cb = NULL;
66 static handle_stack_msg gatt_event_cb = NULL;
67 static guint event_id;
69 /*State Management sepration Control for Adapter and LE */
70 static gboolean is_adapter_activating = FALSE;
71 static gboolean is_le_activating = FALSE;
76 gchar* interface_name;
79 } bt_hal_main_event_data_t;
81 /* Forward declarations */
82 static gboolean __bt_hal_event_manager(gpointer param);
83 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type);
84 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn, int subscribe);
85 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn, int subscribe);
86 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe);
88 static int __bt_hal_parse_event(GVariant *msg);
89 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current);
91 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path);
92 static void __bt_hal_adapter_property_changed_event(GVariant *msg);
93 static void __bt_hal_manager_event_filter(GDBusConnection *connection, const gchar *sender_name,
94 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
95 GVariant *parameters, gpointer user_data);
96 static int __bt_hal_initialize_manager_receiver(void);
97 static gboolean __bt_hal_parse_interface(GVariant *msg);
98 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters);
99 static gboolean __bt_hal_parse_device_properties(GVariant *item);
100 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data);
101 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path);
102 static void __bt_hal_dbus_device_found_properties(const char *device_path);
103 static void __bt_hal_device_properties_lookup(GVariant *result, char *address);
104 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member, const char *path);
105 static void __bt_hal_send_device_acl_connection_state_event(int status, gboolean connected, const char *address);
106 static void __bt_hal_handle_input_event(GVariant *msg, const char *path);
107 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address);
108 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address);
109 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address);
110 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member, const char *path);
111 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member, const char *path);
113 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted, const char *address);
114 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn, int subscribe);
115 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path);
116 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected, const char *address);
117 static void __bt_hal_send_hf_connection_state_event(gboolean connected, const char *address);
118 static void __bt_hal_send_device_trusted_profile_changed_event(uint32_t trust_val, const char *address);
119 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path);
120 static void __bt_hal_handle_gatts_mtu_changed_event(char *address, int mtu);
121 static void __bt_hal_send_hf_client_connection_state_event(gboolean connected, const char *address);
124 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data)
128 struct hal_ev_discovery_state_changed ev;
129 ev.state = HAL_DISCOVERY_STATE_STOPPED;
130 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
135 static int __bt_hal_parse_event(GVariant *msg)
139 char *interface_name = NULL;
140 GVariant *inner_iter = NULL;
142 g_variant_iter_init(&iter, msg);
144 while ((child = g_variant_iter_next_value(&iter))) {
145 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
146 if (g_strcmp0(interface_name,
147 BT_HAL_DEVICE_INTERFACE) == 0) {
148 DBG("__bt_hal_parse_event: Interface: BT_HAL_DEVICE_INTERFACE");
149 g_variant_unref(inner_iter);
150 g_variant_unref(child);
151 return BT_HAL_DEVICE_EVENT;
152 } else if (g_strcmp0(interface_name,
153 BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
154 DBG("__bt_hal_parse_event: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
155 g_variant_unref(inner_iter);
156 g_variant_unref(child);
157 return BT_HAL_MEDIA_TRANSFER_EVENT;
158 } else if (g_strcmp0(interface_name,
159 BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
160 DBG("__bt_hal_parse_event: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
161 g_variant_unref(inner_iter);
162 g_variant_unref(child);
163 return BT_HAL_AVRCP_CONTROL_EVENT;
165 g_variant_unref(inner_iter);
166 g_variant_unref(child);
172 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current)
174 g_variant_get(msg, "(&s&s&s)", name, previous, current);
175 return BT_HAL_ERROR_NONE;
178 int __bt_insert_hal_properties(void *buf, uint8_t type, uint16_t len, const void *val)
179 { struct hal_property *prop = buf;
185 memcpy(prop->val, val, len);
187 return sizeof(*prop) + len;
190 handle_stack_msg _bt_hal_get_stack_message_handler(void)
195 static void __bt_hal_adapter_property_changed_event(GVariant *msg)
197 GVariantIter value_iter;
198 GVariant *value = NULL;
199 GDBusProxy *adapter_proxy;
202 g_variant_iter_init(&value_iter, msg);
204 /* Buffer and propety count management */
205 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
206 struct hal_ev_adapter_props_changed *ev = (void*) buf;
208 const gchar *address = NULL;
210 unsigned int cod = 0;
211 unsigned int a2dp_role = 0;
212 gboolean discoverable;
213 gboolean connectable;
214 unsigned int scan_mode = BT_SCAN_MODE_NONE;
215 unsigned int disc_timeout;
216 const gchar *version;
217 gboolean ipsp_initialized;
220 unsigned int pairable_timeout;
221 gboolean scan_mode_property_update = FALSE;
222 gboolean is_discovering;
223 gboolean is_le_discovering;
225 memset(buf, 0, sizeof(buf));
228 ev->status = BT_STATUS_SUCCESS;
230 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
231 if (!g_strcmp0(key, "Address")) {
234 address = g_variant_get_string(value, NULL);
235 DBG("##Address [%s]", address);
236 _bt_hal_convert_addr_string_to_type(bdaddr, address);
237 size += __bt_insert_hal_properties(buf + size,
238 HAL_PROP_ADAPTER_ADDR, sizeof(bdaddr), bdaddr);
240 } else if (!g_strcmp0(key, "Alias")) {
241 g_variant_get(value, "&s", &name);
242 DBG("##Alias [%s] ", name);
243 size += __bt_insert_hal_properties(buf + size,
244 HAL_PROP_ADAPTER_NAME, strlen(name) + 1, name);
246 } else if (!g_strcmp0(key, "Class")) {
247 cod = g_variant_get_uint32(value);
248 DBG("##Class [%d]", cod);
249 size += __bt_insert_hal_properties(buf + size,
250 HAL_PROP_ADAPTER_CLASS, sizeof(unsigned int), &cod);
252 } else if (!g_strcmp0(key, "Discoverable")) {
253 discoverable = g_variant_get_boolean(value);
254 DBG("##Discoverable [%d]", discoverable);
256 scan_mode = BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE;
258 scan_mode = BT_SCAN_MODE_CONNECTABLE;
259 scan_mode_property_update = TRUE;
260 } else if (!g_strcmp0(key, "DiscoverableTimeout")) {
261 disc_timeout = g_variant_get_uint32(value);
262 DBG("##Discoverable Timeout [%d]", disc_timeout);
263 size += __bt_insert_hal_properties(buf + size,
264 HAL_PROP_ADAPTER_DISC_TIMEOUT, sizeof(unsigned int), &disc_timeout);
266 } else if (!g_strcmp0(key, "Connectable")) {
267 connectable = g_variant_get_boolean(value);
268 DBG("##Connectable [%d]", connectable);
270 scan_mode = BT_SCAN_MODE_NONE;
271 else if (scan_mode == BT_SCAN_MODE_NONE)
272 scan_mode = BT_SCAN_MODE_CONNECTABLE;
273 scan_mode_property_update = TRUE;
274 } else if (!g_strcmp0(key, "Version")) {
275 version = g_variant_get_string(value, NULL);
276 DBG("##Version [%s]", version);
277 size += __bt_insert_hal_properties(buf + size,
278 HAL_PROP_ADAPTER_VERSION, strlen(version) + 1, version);
280 } else if (!g_strcmp0(key, "Name")) {
281 g_variant_get(value, "&s", &name);
282 DBG("##Name [%s]", name);
283 size += __bt_insert_hal_properties(buf + size,
284 HAL_PROP_ADAPTER_NAME, strlen(name) + 1, name);
286 } else if (!g_strcmp0(key, "Powered")) {
287 powered = g_variant_get_boolean(value);
288 DBG("##Powered = %d", powered);
289 /* TODO: Need to check this operation!! */
290 if (powered == FALSE) {
291 DBG("###### Adapter Powered Down ######");
293 if (TIZEN_FEATURE_BT_USB_DONGLE) {
294 struct hal_ev_adapter_state_changed ev;
295 ev.state = HAL_POWER_OFF;
296 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
298 struct hal_ev_le_state_changed le_ev;
299 le_ev.state = HAL_POWER_OFF;
300 event_cb(HAL_EV_LE_STATE_CHANGED, &le_ev, sizeof(le_ev));
303 _bt_hal_destroy_adapter_agent();
305 DBG("Pending disalbed event after bluetoothd is terminated");
308 DBG("###### Adapter Powered Up ######");
309 if (_bt_hal_get_adapter_request_state()) {
310 DBG("Sending STATE CHANGE EVENT for Adapter... ");
311 _bt_hal_set_adapter_request_state(FALSE);
312 struct hal_ev_adapter_state_changed ev;
313 ev.state = HAL_POWER_ON;
314 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
317 if (_bt_hal_get_le_request_state()) {
318 DBG("Sending STATE CHANGE EVENT for LE... ");
319 _bt_hal_set_le_request_state(FALSE);
320 struct hal_ev_le_state_changed ev;
321 ev.state = HAL_POWER_ON;
322 event_cb(HAL_EV_LE_STATE_CHANGED, &ev, sizeof(ev));
326 _bt_hal_initialize_adapter_agent();
329 } else if (!g_strcmp0(key, "Pairable")) {
330 pairable = g_variant_get_boolean(value);
331 DBG("##Pairable [%d]", pairable);
332 } else if (!g_strcmp0(key, "PairableTimeout")) {
333 pairable_timeout = g_variant_get_uint32(value);
334 DBG("##Pairable Timeout = %d", pairable_timeout);
335 } else if (!g_strcmp0(key, "UUIDs")) {
340 size1 = g_variant_get_size(value);
341 int num_props_tmp = ev->num_props;
343 uuid_value = (char **)g_variant_get_strv(value, &size1);
344 for (i = 0; uuid_value[i] != NULL; i++)
346 /* UUID collection */
347 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
348 for (i = 0; uuid_value[i] != NULL; i++) {
349 char *uuid_str = NULL;
350 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
351 uuid_str = g_strdup(uuid_value[i]);
352 DBG("##UUID string [%s]\n", uuid_str);
353 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
354 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
357 size += __bt_insert_hal_properties(buf + size, HAL_PROP_ADAPTER_UUIDS,
358 (BT_HAL_STACK_UUID_SIZE * uuid_count),
360 ev->num_props = num_props_tmp + 1;
363 } else if (!g_strcmp0(key, "Discovering")) {
364 is_discovering = g_variant_get_boolean(value);
365 DBG("##Discovering = [%d]", is_discovering);
367 if (is_discovering == FALSE) {
369 /* In Tizen Bluez, this actually does not mean Discovery is stopped
370 in Bluez. Tizen Bluez sends this event after a certain timeout,
371 Therefore, we must forecefully call StopDiscovery to stop discovery in BlueZ */
375 adapter_proxy = _bt_hal_get_adapter_proxy();
377 if (adapter_proxy == NULL)
380 /* Need to stop searching */
381 DBG("Event though Bluez reported DIscovering stopped, we force stop Discovery ");
382 result = g_dbus_proxy_call_sync(adapter_proxy, "StopDiscovery",
384 G_DBUS_CALL_FLAGS_NONE,
389 struct hal_ev_discovery_state_changed ev;
391 ERR("Dbus Error : %s", err->message);
393 if (g_strrstr(err->message, "No discovery started"))
396 /* This error is thrown by Bluez, as Discovery is already stopped.
397 Discovery is stopped if user cancels on going discovery.
398 In order to maintain correct state of Bluetooth Discovery state,
399 simply send Discovery stopped event to HAL user */
400 ev.state = HAL_DISCOVERY_STATE_STOPPED;
401 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
406 g_variant_unref(result);
407 event_id = g_timeout_add(BT_HAL_DISCOVERY_FINISHED_DELAY,
408 (GSourceFunc)__bt_hal_discovery_finished_cb, NULL);
411 struct hal_ev_discovery_state_changed ev;
412 ev.state = HAL_DISCOVERY_STATE_STARTED;
413 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
416 } else if (!g_strcmp0(key, "LEDiscovering")) {
417 is_le_discovering = g_variant_get_boolean(value);
418 DBG("##LE Discovering = [%d]", is_le_discovering);
420 if (is_le_discovering) {
421 /* Send LE discovering started event */
422 size += __bt_insert_hal_properties(buf + size,
423 HAL_PROP_ADAPTER_LE_DISCOVERY_STARTED, 0, NULL);
428 /* Send LE discovering finished event */
429 size += __bt_insert_hal_properties(buf + size,
430 HAL_PROP_ADAPTER_LE_DISCOVERY_STOPPED, 0, NULL);
432 } else if (!g_strcmp0(key, "Modalias")) {
433 char *modalias = NULL;
434 g_variant_get(value, "&s", &modalias);
435 DBG("##Adapter ModAlias [%s]", modalias);
436 } else if (!g_strcmp0(key, "SupportedLEFeatures")) {
437 DBG("##LE Supported features");
440 GVariantIter *iter = NULL;
441 g_variant_get(value, "as", &iter);
442 bt_local_le_features_t le_features;
443 gboolean le_features_present = FALSE;
448 memset(&le_features, 0x00, sizeof(le_features));
450 while (g_variant_iter_next(iter, "&s", &name) &&
451 g_variant_iter_next(iter, "&s", &val)) {
452 DBG("name = %s, Value = %s", name, val);
453 if (FALSE == _bt_hal_update_le_feature_support(name, val, &le_features))
454 ERR("Failed to update LE feature (name = %s, value = %s)", name, val);
456 le_features_present = TRUE;
459 g_variant_iter_free(iter);
460 if (le_features_present) {
461 size += __bt_insert_hal_properties(buf + size,
462 HAL_PROP_ADAPTER_LOCAL_LE_FEAT, sizeof(le_features), &le_features);
465 DBG("le supported features values are NOT provided by Stack");
467 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
468 g_variant_get(value, "b" , &ipsp_initialized);
469 DBG("##IPSP Initialized = %d", ipsp_initialized);
470 } else if (!g_strcmp0(key, "A2dpRole")) {
471 a2dp_role = g_variant_get_uint32(value);
472 DBG("##A2dp Role [%d]", a2dp_role);
473 size += __bt_insert_hal_properties(buf + size,
474 HAL_PROP_ADAPTER_A2DP_ROLE, sizeof(unsigned int), &a2dp_role);
477 ERR("Unhandled Property:[%s]", key);
481 if (scan_mode_property_update) {
482 size += __bt_insert_hal_properties(buf + size,
483 HAL_PROP_ADAPTER_SCAN_MODE, sizeof(int), &scan_mode);
489 DBG("Send Adapter properties changed event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
490 event_cb(HAL_EV_ADAPTER_PROPS_CHANGED, buf, size);
494 void _bt_hal_handle_adapter_event(GVariant *msg, const char *member)
499 if (strcasecmp(member, "DeviceCreated") == 0) {
500 DBG("DeviceCreated: Unhandled");
501 } else if (strcasecmp(member, "AdvertisingEnabled") == 0) {
503 gboolean status = FALSE;
504 g_variant_get(msg, "(ib)", &slot_id, &status);
506 /* Send event to application */
507 _bt_hal_set_advertising_status(slot_id, status);
508 } else if (strcasecmp(member, "RssiEnabled") == 0) {
509 struct hal_ev_rssi_monitor_state_changed ev;
510 gboolean status = FALSE;
511 char *address = NULL;
514 g_variant_get(msg, "(sib)", &address, &link_type, &status);
515 DBG("RSSI monitoring %s for %s",
516 (status ? "Enabled" : "Disabled"), address);
518 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
519 ev.link_type = link_type;
520 ev.state = (status ? HAL_RSSI_MONITORING_ENABLED : HAL_RSSI_MONITORING_DISABLED);
522 ERR("event_cb is NULL");
524 event_cb(HAL_EV_RSSI_MONITOR_STATE_CHANGED, &ev, sizeof(ev));
527 } else if (strcasecmp(member, "RssiAlert") == 0) {
528 struct hal_ev_rssi_alert_recieved ev;
532 char *address = NULL;
534 g_variant_get(msg, "(siii)", &address, &link_type, &alert_type, &rssi_dbm);
535 DBG("RSSI Alert: [Address %s LinkType %d] [Type %d DBM %d]",
536 address, alert_type, rssi_dbm, link_type);
538 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
539 ev.link_type = link_type;
540 ev.alert_type = alert_type;
544 ERR("event_cb is NULL");
546 event_cb(HAL_EV_RSSI_ALERT_RECIEVED, &ev, sizeof(ev));
549 } else if (strcasecmp(member, "RawRssi") == 0) {
550 struct hal_ev_raw_rssi_recieved ev;
553 char *address = NULL;
555 g_variant_get(msg, "(sii)", &address, &link_type, &rssi_dbm);
556 DBG("Raw RSSI: [Address %s] [Link Type %d][RSSI DBM %d]",
557 address, link_type, rssi_dbm);
559 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
560 ev.link_type = link_type;
564 ERR("event_cb is NULL");
566 event_cb(HAL_EV_RAW_RSSI_RECIEVED, &ev, sizeof(ev));
569 } else if (strcasecmp(member, BT_HAL_HARDWARE_ERROR) == 0) {
571 DBG("BT Hardware Error: Unhandled");
573 struct hal_ev_controller_error_recieved info;
575 ERR_C("### BT Hardware Error");
576 info.code = HAL_CONTROLLER_ERROR_HW_ERROR;
577 event_cb(HAL_EV_CONTROLLER_ERROR_RECIEVED, &info, sizeof(info));
579 } else if (strcasecmp(member, BT_HAL_TX_TIMEOUT_ERROR) == 0) {
581 DBG("BT Hardware Error: Unhandled");
583 struct hal_ev_controller_error_recieved info;
585 ERR_C("### BT TX Timeout Error");
586 info.code = HAL_CONTROLLER_ERROR_TX_TIMEOUT;
587 event_cb(HAL_EV_CONTROLLER_ERROR_RECIEVED, &info, sizeof(info));
589 } else if (strcasecmp(member, BT_HAL_DBFW_PLUS_INFO) == 0) {
591 DBG("### DBFW+ info received from BLUEZ");
592 struct hal_ev_dbfw_plus_info_recieved info;
595 unsigned char *buffer = NULL;
596 GVariant *value = NULL;
598 g_variant_get(msg, "(y@ay)", &event_code, &value);
600 ERR("g_variant_get fails");
602 length = g_variant_get_size(value);
604 ERR("Invalid g_variant len = %d", length);
606 info.event_code = event_code;
607 buffer = (unsigned char*)g_variant_get_data(value);
608 info.data = g_memdup2(buffer, length);
609 info.data_len = length;
611 ERR("event_cb is NULL");
613 event_cb(HAL_EV_DBFW_PLUS_INFO_RECIEVED, &info, sizeof(info));
621 static gboolean __bt_hal_parse_device_properties(GVariant *item)
627 gboolean is_bredr_dev = FALSE;
632 /* Buffer and propety count management */
633 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
634 struct hal_ev_device_found *ev = (void *) buf;
636 memset(buf, 0, sizeof(buf));
640 g_variant_iter_init(&iter, item);
641 while (g_variant_iter_loop(&iter, "{sv}", &key, &val)) {
643 if (strcasecmp(key, "Address") == 0) {
644 char * address = NULL;
645 address = g_variant_dup_string(val, &len);
647 _bt_hal_convert_addr_string_to_type(bdaddr, address);
649 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
650 sizeof(bdaddr), bdaddr);
653 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
655 } else if (strcasecmp(key, "AddressType") == 0) {
656 char *addresstype = g_variant_dup_string(val, &len);
658 DBG("AddressType [%s]", addresstype);
660 } else if (strcasecmp(key, "Class") == 0) {
661 unsigned int class = g_variant_get_uint32(val);
662 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
663 sizeof(unsigned int), &class);
665 DBG("Device class [%d] Property num [%d]", class, ev->num_props);
667 } else if (strcasecmp(key, "name") == 0) {
668 char *name = g_variant_dup_string(val, &len);
670 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
671 strlen(name) + 1, name);
673 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
676 } else if (strcasecmp(key, "Connected") == 0) {
677 unsigned int connected = g_variant_get_byte(val);
679 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
680 sizeof(unsigned int), &connected);
682 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
683 } else if (strcasecmp(key, "paired") == 0) {
684 uint8_t paired = (g_variant_get_boolean(val) ? 1 : 0);
685 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
686 sizeof(uint8_t), &paired);
688 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
689 } else if (strcasecmp(key, "Trusted") == 0) {
690 uint8_t trust = (g_variant_get_boolean(val) ? 1 : 0);
691 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
692 sizeof(uint8_t), &trust);
694 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
695 } else if (strcasecmp(key, "RSSI") == 0) {
696 int rssi = g_variant_get_int16(val);
697 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
700 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
701 } else if (strcasecmp(key, "LastAddrType") == 0) {
702 /* TODO: To be handled later*/
703 } else if (!g_strcmp0(key, "IsAliasSet")) {
704 uint8_t is_alias_set = (g_variant_get_boolean(val) ? 1 : 0);
705 DBG("IsAliasSet: %s", (is_alias_set ? "TRUE" : "FALSE"));
706 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
707 sizeof(uint8_t), &is_alias_set);
709 } else if (strcasecmp(key, "UUIDs") == 0) {
714 size1 = g_variant_get_size(val);
715 DBG("UUID count from size [%zu]\n", size1);
716 int num_props_tmp = ev->num_props;
719 uuid_value = (char **)g_variant_get_strv(val, &size1);
720 for (i = 0; uuid_value[i] != NULL; i++)
723 /* UUID collection */
724 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
726 for (i = 0; uuid_value[i] != NULL; i++) {
728 char *uuid_str = NULL;
729 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
730 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
732 uuid_str = g_strdup(uuid_value[i]);
733 DBG("[%d] %s", i, uuid_str);
734 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
735 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
739 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
740 (BT_HAL_STACK_UUID_SIZE * uuid_count),
742 ev->num_props = num_props_tmp + 1;
746 } else if (strcasecmp(key, "LegacyManufacturerDataLen") == 0) {
747 uint16_t data_len = g_variant_get_uint16(val);
748 DBG("LegacyManufacturerDataLen [%d]", data_len);
749 } else if (strcasecmp(key, "LegacyManufacturerData") == 0) {
750 GVariantIter *char_value_iter;
751 GByteArray *manufacturer_data = NULL;
753 DBG("LegacyManufacturerData");
755 manufacturer_data = g_byte_array_new();
756 g_variant_get(val, "ay", &char_value_iter);
757 while (g_variant_iter_loop(char_value_iter, "y", &char_value))
758 g_byte_array_append(manufacturer_data, &char_value, 1);
760 g_variant_iter_free(char_value_iter);
762 if (manufacturer_data) {
763 if (manufacturer_data->len > 0) {
764 size += __bt_insert_hal_properties(
765 buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA,
766 manufacturer_data->len, manufacturer_data->data);
770 g_byte_array_free(manufacturer_data, FALSE);
772 DBG("Unhandled Property:[%s]", key);
776 if (size > 1 && is_bredr_dev) {
777 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
778 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
784 static void __bt_hal_handle_avrcp_tg_events(GVariant *msg, const char *path)
787 GVariantIter value_iter;
788 char *property = NULL;
790 GVariant *val = NULL;
791 GVariant *child = NULL;
793 g_variant_iter_init(&value_iter, msg);
794 while ((child = g_variant_iter_next_value(&value_iter))) {
795 g_variant_get(child, "{sv}", &property, &val);
796 INFO("Property %s", property);
797 if (strcasecmp(property, "Connected") == 0) {
798 struct hal_ev_avrcp_tg_conn_state ev;
800 gboolean connected = FALSE;
802 g_variant_get(val, "b", &connected);
804 state = connected ? HAL_AVRCP_TG_STATE_CONNECTED :
805 HAL_AVRCP_TG_STATE_DISCONNECTED;
807 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
809 _bt_hal_convert_device_path_to_address(path, address);
811 DBG("connected: %d [%s]", connected, address);
813 /* Prepare to send AVRCP Target connection state event */
814 memset(&ev, 0, sizeof(ev));
815 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
817 if (!avrcp_tg_event_cb)
818 ERR("AVRCP target DBUS handler callback not registered");
820 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_CONN_STATE, (void *)&ev, sizeof(ev));
824 g_variant_unref(child);
825 g_variant_unref(val);
829 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path)
831 char *interface_name = NULL;
832 GVariant *val = NULL;
834 g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, &val, NULL);
836 if (!interface_name) {
837 ERR("Failed to get interface name");
840 g_variant_unref(val);
844 if (strcasecmp(interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
845 DBG("Event: Property Changed: Interface: BT_HAL_ADAPTER_INTERFACE");
846 __bt_hal_adapter_property_changed_event(val);
847 } else if (strcasecmp(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
848 __bt_hal_device_property_changed_event(val, object_path);
849 } else if (strcasecmp(interface_name, BT_HAL_OBEX_TRANSFER_INTERFACE) == 0) {
850 DBG("Event: Property Changed: Interface: BT_HAL_OBEX_TRANSFER_INTERFACE");
851 /* TODO: Handle event */
852 } else if (strcasecmp(interface_name, BT_HAL_MEDIA_CONTROL_INTERFACE) == 0) {
853 DBG("Event: Property Changed: Interface: BT_HAL_MEDIA_CONTROL_INTERFACE");
854 /* Handle AVRCP target event */
855 __bt_hal_handle_avrcp_tg_events(val, object_path);
856 } else if (strcasecmp(interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
857 DBG("Event: Property Changed: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
858 __bt_hal_handle_avrcp_ctrl_events(val, NULL, object_path);
859 } else if (strcasecmp(interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
860 DBG("Event: Property Changed: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
861 __bt_hal_handle_avrcp_transport_events(val, NULL, object_path);
862 } else if (strcasecmp(interface_name, BT_HAL_NETWORK_CLIENT_INTERFACE) == 0) {
863 DBG("Event: Property Changed: Interface: BT_HAL_NETWORK_CLIENT_INTERFACE");
864 /* TODO: Handle event */
865 } else if (strcasecmp(interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
866 DBG("Event: Property Changed: Interface: BT_HAL_GATT_CHAR_INTERFACE");
867 /* TODO: Handle event */
868 } else if (strcasecmp(interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
869 DBG("Event: Property Changed: Interface: BT_HAL_INPUT_INTERFACE");
870 __bt_hal_handle_input_event(val, object_path);
872 g_variant_unref(val);
875 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters)
879 if (__bt_hal_parse_interface(parameters) == FALSE) {
880 ERR("Fail to parse the properies");
881 g_variant_unref(value);
886 static void __bt_hal_send_hid_connection_state_event(
887 gboolean connected, const char *address)
889 struct hal_ev_hidhost_conn_state ev;
891 ev.state = (connected == TRUE) ?
892 HAL_HIDHOST_STATE_CONNECTED :
893 HAL_HIDHOST_STATE_DISCONNECTED;
895 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
898 ERR("HID event handler not registered");
900 hid_event_cb(HAL_EV_HIDHOST_CONN_STATE, &ev, sizeof(ev));
903 static void __bt_hal_send_hid_device_connection_state_event(
904 gboolean connected, const char *address)
906 struct hal_ev_hiddevice_conn_state ev;
908 ev.state = (connected == TRUE) ?
909 HAL_HIDDEVICE_STATE_CONNECTED :
910 HAL_HIDDEVICE_STATE_DISCONNECTED;
912 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
914 if (!hid_device_event_cb)
915 ERR("HID device event handler not registered");
917 hid_device_event_cb(HAL_EV_HIDDEVICE_CONN_STATE, &ev, sizeof(ev));
920 static void __bt_hal_handle_input_event(GVariant *msg, const char *path)
922 gboolean property_flag = FALSE;
923 GVariantIter value_iter;
924 char *property = NULL;
925 GVariant *child = NULL, *val = NULL;
928 g_variant_iter_init(&value_iter, msg);
929 while ((child = g_variant_iter_next_value(&value_iter))) {
930 g_variant_get(child, "{sv}", &property, &val);
932 if (property == NULL)
935 if (strcasecmp(property, "Connected") == 0) {
938 g_variant_get(val, "b", &property_flag);
939 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
940 _bt_hal_convert_device_path_to_address(path, address);
941 __bt_hal_send_hid_connection_state_event(property_flag, address);
945 g_variant_unref(val);
946 g_variant_unref(child);
950 static gboolean __bt_hal_parse_interface(GVariant *msg)
953 GVariant *optional_param;
956 char *interface_name = NULL;
957 GVariant *inner_iter = NULL;
958 g_variant_get(msg, "(&o@a{sa{sv}})",
959 &path, &optional_param);
960 g_variant_iter_init(&iter, optional_param);
962 while ((child = g_variant_iter_next_value(&iter))) {
963 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
964 if (g_strcmp0(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
965 DBG("Found a device: %s", path);
966 if (__bt_hal_parse_device_properties(inner_iter) == FALSE) {
967 g_variant_unref(inner_iter);
968 g_variant_unref(child);
969 g_variant_unref(optional_param);
970 ERR("Fail to parse the properies");
973 g_variant_unref(inner_iter);
974 g_variant_unref(child);
975 g_variant_unref(optional_param);
979 g_variant_unref(inner_iter);
980 g_variant_unref(child);
983 g_variant_unref(optional_param);
988 void __bt_hal_handle_gatt_char_event(GVariant *parameters, const char *signal_name)
992 if (signal_name == NULL)
995 if (strcasecmp(signal_name, "GattValueChanged") == 0) {
996 DBG("GattValueChanged event received");
999 const char *char_handle = NULL;
1000 GVariant *char_value_var = NULL;
1002 char *char_value = NULL;
1004 g_variant_get(parameters, "(i&s@ay)", &result, &char_handle, &char_value_var);
1005 DBG("char handle: %s", char_handle);
1007 len = g_variant_get_size(char_value_var);
1009 char_value = (char *)g_variant_get_data(char_value_var);
1011 _bt_hal_handle_gattc_value_changed_event(result, char_handle, char_value, len);
1013 g_variant_unref(char_value_var);
1017 static void __bt_hal_handle_gatt_service_event(GVariant *parameters, const char *signal_name)
1019 if (signal_name == NULL)
1022 if (strcasecmp(signal_name, "GattServiceAdded") == 0) {
1024 g_variant_get(parameters, "(&s)", &path);
1025 _bt_hal_handle_gattc_service_changed_event(TRUE, path);
1029 static void __bt_hal_handle_tds_provider_event(GVariant *parameters, const char *signal_name, const char *path)
1031 if (signal_name == NULL)
1034 if (strcasecmp(signal_name, "TdsActivationRequested") == 0) {
1035 GVariant *value = NULL;
1037 unsigned char *buffer = NULL;
1038 unsigned char org_id;
1040 g_variant_get(parameters, "(y@ay)", &org_id, &value);
1041 DBG("org_id: 0x%.2x", org_id);
1042 len = g_variant_get_size(value);
1045 buffer = (unsigned char *)g_variant_get_data(value);
1046 for (i = 0; i < len; i++)
1047 DBG("0x%.2x", buffer[i]);
1050 /* Send event only registered client */
1051 _bt_tds_handle_activation_request(path, org_id, buffer, len);
1052 g_variant_unref(value);
1056 static gboolean __bt_hal_event_manager(gpointer data)
1058 bt_hal_event_type_t bt_event = 0x00;
1060 char *obj_path = NULL;
1062 bt_hal_main_event_data_t *param = (bt_hal_main_event_data_t*)data;
1063 if (strcasecmp(param->signal_name, "InterfacesAdded") == 0) {
1065 /*TODO: Handle Interfaces Added Signal from stack */
1067 g_variant_get(param->parameters, "(&o@a{sa{sv}})", &obj_path, &value);
1069 if (obj_path == NULL) {
1070 ERR("obj_path is NULL");
1074 if (strcasecmp(obj_path, BT_HAL_BLUEZ_HCI_PATH) == 0) {
1075 /* TODO: Handle adapter added */
1076 DBG("Manager Event: Signal Name: InterfiacesAdded: Adapter added in bluetoothd: path [hci0]");
1078 bt_event = __bt_hal_parse_event(value);
1079 if (bt_event == BT_HAL_DEVICE_EVENT) {
1080 __bt_hal_handle_device_event(value, param->parameters);
1081 } else if (bt_event == BT_HAL_AVRCP_CONTROL_EVENT) {
1082 _bt_hal_set_control_device_path(obj_path);
1085 g_variant_unref(value);
1087 } else if (strcasecmp(param->signal_name, "InterfacesRemoved") == 0) {
1091 /*TODO: Handle Interfaces Removed Signal from stack */
1093 g_variant_get(param->parameters, "(&oas)", &obj_path, &iter);
1094 while (g_variant_iter_loop(iter, "s", &str)) {
1095 if (g_strcmp0(str, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0)
1096 _bt_hal_remove_control_device_path(obj_path);
1097 else if (g_strcmp0(str, BT_HAL_GATT_SERVICE_INTERFACE) == 0)
1098 _bt_hal_handle_gattc_service_changed_event(FALSE, obj_path);
1100 g_variant_iter_free(iter);
1101 } else if (strcasecmp(param->signal_name, "NameOwnerChanged") == 0) {
1103 char *previous = NULL;
1104 char *current = NULL;
1106 if (g_strcmp0(g_variant_get_type_string(param->parameters), "(sss)") != 0) {
1107 ERR("Invalid variant format");
1111 /* TODO: Handle Name Owener changed Signal */
1112 if (__bt_hal_get_owner_info(param->parameters, &name, &previous, ¤t)) {
1113 ERR("Fail to get the owner info");
1117 if (*current != '\0')
1123 if (strcasecmp(name, BT_HAL_BLUEZ_NAME) == 0) {
1124 struct hal_ev_adapter_state_changed ev;
1125 struct hal_ev_le_state_changed le_ev;
1127 INFO("Bluetoothd is terminated");
1129 /* Send the disable event in here */
1131 ev.state = HAL_POWER_OFF;
1132 le_ev.state = HAL_POWER_OFF;
1134 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
1135 event_cb(HAL_EV_LE_STATE_CHANGED, &le_ev, sizeof(le_ev));
1138 _bt_hal_destroy_adapter_agent();
1139 _bt_hal_le_deinit();
1141 } else if (g_strcmp0(param->interface_name, BT_HAL_PROPERTIES_INTERFACE) == 0) {
1142 __bt_hal_handle_property_changed_event(param->parameters, param->object_path);
1143 } else if (g_strcmp0(param->interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
1144 DBG("Manager Event: Interface Name: BT_HAL_ADAPTER_INTERFACE");
1145 _bt_hal_handle_adapter_event(param->parameters, param->signal_name);
1146 } else if (g_strcmp0(param->interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
1147 DBG("Manager Event: Interface Name: BT_HAL_INPUT_INTERFACE");
1148 __bt_hal_handle_input_event(param->parameters, param->object_path);
1149 } else if (g_strcmp0(param->interface_name, BT_HAL_NETWORK_SERVER_INTERFACE) == 0) {
1150 /* TODO: Handle Network Server events from stack */
1151 DBG("Manager Event: Interface Name: BT_HAL_NETWORK_SERVER_INTERFACE");
1152 } else if (g_strcmp0(param->interface_name, BT_HAL_HEADSET_INTERFACE) == 0) {
1153 DBG("Manager Event: Interface Name: BT_HAL_HEADSET_INTERFACE");
1154 __bt_hal_handle_headset_events(param->parameters, param->signal_name, param->object_path);
1155 } else if (g_strcmp0(param->interface_name, BT_HAL_SINK_INTERFACE) == 0) {
1156 /* TODO: Handle Sink interface events from stack */
1157 DBG("Manager Event: Interface Name:BT_HAL_SINK_INTERFACE");
1158 } else if (g_strcmp0(param->interface_name, BT_HAL_AGENT_INTERFACE) == 0) {
1159 /* TODO: Handle Agent events from stack */
1160 DBG("Manager Event: Interface Name:BT_HAL_AGENT_INTERFACE");
1161 } else if (g_strcmp0(param->interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
1162 __bt_hal_handle_device_specific_events(param->parameters, param->signal_name, param->object_path);
1163 } else if (g_strcmp0(param->interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
1164 DBG("Manager Event: Interface Name: BT_HAL_PLAYER_CONTROL_INTERFACE");
1165 __bt_hal_handle_avrcp_ctrl_events(param->parameters, param->signal_name, param->object_path);
1166 } else if (g_strcmp0(param->interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
1167 DBG("Manager Event: Interface Name: BT_HAL_MEDIATRANSPORT_INTERFACE");
1168 __bt_hal_handle_avrcp_transport_events(param->parameters, param->signal_name, param->object_path);
1169 } else if (g_strcmp0(param->interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
1170 DBG("Manager Event: Interface Name: BT_HAL_GATT_CHAR_INTERFACE");
1171 __bt_hal_handle_gatt_char_event(param->parameters, param->signal_name);
1172 } else if (g_strcmp0(param->interface_name, BT_HAL_GATT_SERVICE_INTERFACE) == 0) {
1173 DBG("Manager Event: Interface Name: BT_HAL_GATT_SERVICE_INTERFACE");
1174 __bt_hal_handle_gatt_service_event(param->parameters, param->signal_name);
1175 } else if (g_strcmp0(param->interface_name, BT_HAL_TDS_PROVIDER_INTERFACE) == 0) {
1176 DBG("Manager Event: Interface Name: BT_HAL_TDS_PROVIDER_INTERFACE");
1177 __bt_hal_handle_tds_provider_event(param->parameters, param->signal_name, param->object_path);
1182 g_free(param->sender_name);
1183 g_free(param->object_path);
1184 g_free(param->interface_name);
1185 g_free(param->signal_name);
1186 g_variant_unref(param->parameters);
1192 static void __bt_hal_manager_event_filter(GDBusConnection *connection,
1193 const gchar *sender_name,
1194 const gchar *object_path,
1195 const gchar *interface_name,
1196 const gchar *signal_name,
1197 GVariant *parameters,
1200 if (signal_name == NULL)
1203 bt_hal_main_event_data_t *param = g_new0(bt_hal_main_event_data_t, 1);
1204 param->sender_name = g_strdup(sender_name);
1205 param->object_path = g_strdup(object_path);
1206 param->interface_name = g_strdup(interface_name);
1207 param->signal_name = g_strdup(signal_name);
1208 param->parameters = g_variant_ref(parameters);
1210 g_idle_add(__bt_hal_event_manager, (gpointer)param);
1214 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path)
1216 gboolean property_flag = FALSE;
1217 char *property = NULL;
1218 GVariant *value = NULL;
1219 g_variant_get(msg, "(sv)", &property, &value);
1221 if (property == NULL)
1224 DBG("Property = %s \n", property);
1225 /* We allow only 1 headset connection (HSP or HFP)*/
1226 if (strcasecmp(property, "Connected") == 0) {
1228 g_variant_get(value, "b", &property_flag);
1230 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1232 _bt_hal_convert_device_path_to_address(path, address);
1233 __bt_hal_send_hf_audio_connection_state_event(property_flag, address);
1235 } else if (strcasecmp(property, "State") == 0) {
1238 g_variant_get(value, "s", &state);
1240 /* This code assumes we support only 1 headset connection */
1241 /* Need to use the headset list, if we support multi-headsets */
1242 if (strcasecmp(state, "Playing") == 0) {
1243 DBG("Playing: Sco Connected");
1244 } else if (strcasecmp(state, "connected") == 0 ||
1245 strcasecmp(state, "disconnected") == 0) {
1246 if (strcasecmp(state, "connected") == 0)
1247 DBG("Sco Connected");
1249 DBG("Sco Disconnected");
1251 ERR("Not handled state - %s", state);
1254 } else if (strcasecmp(property, "SpeakerGain") == 0) {
1257 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1259 _bt_hal_convert_device_path_to_address(path, address);
1260 INFO("Speaker Gain for address [%s]", address);
1261 /* TODO Handle event sending to HAL */
1264 } else if (strcasecmp(property, "MicrophoneGain") == 0) {
1267 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1269 _bt_hal_convert_device_path_to_address(path, address);
1270 INFO("Microphone Gain for address [%s]", address);
1271 /* TODO Handle event sending to HAL */
1277 g_variant_unref(value);
1280 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn,
1286 static int subs_interface_added_id = -1;
1287 static int subs_interface_removed_id = -1;
1288 static int subs_name_owner_id = -1;
1289 static int subs_property_id = -1;
1290 static int subs_adapter_id = -1;
1293 if (subs_interface_added_id == -1) {
1294 subs_interface_added_id = g_dbus_connection_signal_subscribe(conn,
1295 BT_HAL_BLUEZ_NAME, BT_HAL_MANAGER_INTERFACE,
1296 BT_HAL_INTERFACES_ADDED, NULL, NULL, 0,
1297 __bt_hal_manager_event_filter,
1300 if (subs_interface_removed_id == -1) {
1301 subs_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
1302 BT_HAL_BLUEZ_NAME, BT_HAL_MANAGER_INTERFACE,
1303 BT_HAL_INTERFACES_REMOVED, NULL, NULL, 0,
1304 __bt_hal_manager_event_filter,
1307 if (subs_name_owner_id == -1) {
1308 subs_name_owner_id = g_dbus_connection_signal_subscribe(conn,
1309 BT_HAL_BLUEZ_NAME, BT_HAL_FREEDESKTOP_INTERFACE,
1310 BT_HAL_NAME_OWNER_CHANGED, NULL, NULL, 0,
1311 __bt_hal_manager_event_filter,
1314 if (subs_property_id == -1) {
1315 subs_property_id = g_dbus_connection_signal_subscribe(conn,
1316 BT_HAL_BLUEZ_NAME, BT_HAL_PROPERTIES_INTERFACE,
1317 BT_HAL_PROPERTIES_CHANGED, NULL, NULL, 0,
1318 __bt_hal_manager_event_filter,
1321 if (subs_adapter_id == -1) {
1322 subs_adapter_id = g_dbus_connection_signal_subscribe(conn,
1323 BT_HAL_BLUEZ_NAME, BT_HAL_ADAPTER_INTERFACE,
1324 NULL, NULL, NULL, 0,
1325 __bt_hal_manager_event_filter,
1329 if (subs_interface_added_id != -1) {
1330 g_dbus_connection_signal_unsubscribe(conn,
1331 subs_interface_added_id);
1332 subs_interface_added_id = -1;
1334 if (subs_interface_removed_id != -1) {
1335 g_dbus_connection_signal_unsubscribe(conn,
1336 subs_interface_removed_id);
1337 subs_interface_removed_id = -1;
1339 if (subs_name_owner_id != -1) {
1340 g_dbus_connection_signal_unsubscribe(conn,
1341 subs_name_owner_id);
1342 subs_name_owner_id = -1;
1344 if (subs_property_id != -1) {
1345 g_dbus_connection_signal_unsubscribe(conn,
1347 subs_property_id = -1;
1349 if (subs_adapter_id == -1) {
1350 g_dbus_connection_signal_unsubscribe(conn, subs_adapter_id);
1351 subs_adapter_id = -1;
1358 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn,
1361 static int subs_device_id = -1;
1367 if (subs_device_id == -1) {
1368 subs_device_id = g_dbus_connection_signal_subscribe(conn,
1369 BT_HAL_BLUEZ_NAME, BT_HAL_DEVICE_INTERFACE,
1370 NULL, NULL, NULL, 0,
1371 __bt_hal_manager_event_filter,
1375 if (subs_device_id != -1) {
1376 g_dbus_connection_signal_unsubscribe(conn,
1378 subs_device_id = -1;
1385 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe)
1387 static int subs_input_id = -1;
1393 if (subs_input_id == -1) {
1394 subs_input_id = g_dbus_connection_signal_subscribe(conn,
1395 BT_HAL_BLUEZ_NAME, BT_HAL_INPUT_INTERFACE,
1396 NULL, NULL, NULL, 0,
1397 __bt_hal_manager_event_filter,
1401 if (subs_input_id != -1) {
1402 g_dbus_connection_signal_unsubscribe(conn,
1411 static int __bt_hal_register_gatt_subscribe_signal(GDBusConnection *conn,
1414 static int subs_gatt_char_id = -1;
1415 static int subs_gatt_service_id = -1;
1418 if (subs_gatt_char_id == -1) {
1419 subs_gatt_char_id = g_dbus_connection_signal_subscribe(conn,
1420 BT_HAL_BLUEZ_NAME, BT_HAL_GATT_CHAR_INTERFACE,
1421 NULL, NULL, NULL, 0,
1422 __bt_hal_manager_event_filter,
1425 if (subs_gatt_service_id == -1) {
1426 subs_gatt_service_id = g_dbus_connection_signal_subscribe(conn,
1427 BT_HAL_BLUEZ_NAME, BT_HAL_GATT_SERVICE_INTERFACE,
1428 NULL, NULL, NULL, 0,
1429 __bt_hal_manager_event_filter,
1433 if (subs_gatt_char_id != -1) {
1434 g_dbus_connection_signal_unsubscribe(conn,
1436 subs_gatt_char_id = -1;
1438 if (subs_gatt_service_id != -1) {
1439 g_dbus_connection_signal_unsubscribe(conn,
1440 subs_gatt_service_id);
1441 subs_gatt_service_id = -1;
1445 return BT_HAL_ERROR_NONE;
1450 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type)
1453 return BT_HAL_ERROR_INTERNAL;
1455 /* TODO: Add more events in subsequent patches */
1456 switch (event_type) {
1457 case BT_HAL_MANAGER_EVENT:
1458 __bt_hal_register_manager_subscribe_signal(g_conn, TRUE);
1460 case BT_HAL_DEVICE_EVENT:
1461 __bt_hal_register_device_subscribe_signal(g_conn, TRUE);
1463 case BT_HAL_HID_EVENT:
1464 __bt_hal_register_input_subscribe_signal(g_conn, TRUE);
1466 case BT_HAL_HEADSET_EVENT:
1467 __bt_hal_register_audio_subscribe_signal(g_conn, TRUE);
1469 case BT_HAL_GATT_EVENT:
1470 __bt_hal_register_gatt_subscribe_signal(g_conn, TRUE);
1473 INFO_C("Register Event: event_type [%d]", event_type);
1474 return BT_HAL_ERROR_NOT_SUPPORT;
1477 return BT_HAL_ERROR_NONE;
1480 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn,
1486 static int subs_headset_id = -1;
1487 static int subs_sink_id = -1;
1490 if (subs_headset_id == -1) {
1491 subs_headset_id = g_dbus_connection_signal_subscribe(conn,
1492 BT_HAL_BLUEZ_NAME, BT_HAL_HEADSET_INTERFACE,
1493 NULL, NULL, NULL, 0,
1494 __bt_hal_manager_event_filter,
1497 if (subs_sink_id == -1) {
1498 subs_sink_id = g_dbus_connection_signal_subscribe(conn,
1499 BT_HAL_BLUEZ_NAME, BT_HAL_SINK_INTERFACE,
1500 NULL, NULL, NULL, 0,
1501 __bt_hal_manager_event_filter,
1505 if (subs_headset_id != -1) {
1506 g_dbus_connection_signal_unsubscribe(conn,
1508 subs_headset_id = -1;
1510 if (subs_sink_id != -1) {
1511 g_dbus_connection_signal_unsubscribe(conn,
1519 static int __bt_hal_initialize_manager_receiver(void)
1523 GError *error = NULL;
1525 if (manager_conn == NULL) {
1526 manager_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1527 if (error != NULL) {
1528 ERR_C("ERROR: Can't get on system bus [%s]", error->message);
1529 g_clear_error(&error);
1531 if (manager_conn == NULL)
1535 if (__bt_hal_register_service_event(manager_conn,
1536 BT_HAL_MANAGER_EVENT) != BT_HAL_ERROR_NONE)
1538 if (__bt_hal_register_service_event(manager_conn,
1539 BT_HAL_DEVICE_EVENT) != BT_HAL_ERROR_NONE)
1541 if (__bt_hal_register_service_event(manager_conn,
1542 BT_HAL_HID_EVENT) != BT_HAL_ERROR_NONE)
1544 if (__bt_hal_register_service_event(manager_conn,
1545 BT_HAL_HEADSET_EVENT) != BT_HAL_ERROR_NONE)
1547 if (__bt_hal_register_service_event(manager_conn,
1548 BT_HAL_GATT_EVENT) != BT_HAL_ERROR_NONE)
1550 return BT_HAL_ERROR_NONE;
1553 g_object_unref(manager_conn);
1554 manager_conn = NULL;
1557 return BT_HAL_ERROR_INTERNAL;
1560 /* To receive the event from bluez */
1561 int _bt_hal_initialize_event_receiver(handle_stack_msg cb)
1567 return BT_HAL_ERROR_INVALID_PARAM;
1569 result = __bt_hal_initialize_manager_receiver();
1571 DBG("Manager event receiver initialization result [%d]", result);
1572 if (result != BT_HAL_ERROR_NONE)
1575 /*TODO: Initialize Obexd Event receiver */
1579 return BT_HAL_ERROR_NONE;
1582 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path)
1584 GVariantIter value_iter;
1585 GVariant *value = NULL;
1587 g_variant_iter_init(&value_iter, msg);
1589 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
1590 if (!g_strcmp0(key, "Connected")) {
1591 guint connected = 0;
1592 g_variant_get(value, "i", &connected);
1593 INFO("Device property changed : Connected [%d]", connected);
1594 } else if (!g_strcmp0(key, "RSSI")) {
1595 DBG("Device property changed : RSSI");
1596 __bt_hal_dbus_device_found_properties(path);
1597 } else if (!g_strcmp0(key, "GattConnected")) {
1598 gboolean gatt_connected = FALSE;
1599 g_variant_get(value, "b", &gatt_connected);
1600 INFO_C("Device property changed : GattConnected [%d]", gatt_connected);
1602 char *address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1603 _bt_hal_convert_device_path_to_address(path, address);
1604 if (gatt_connected) {
1605 if (_bt_hal_handle_gattc_connected_event(address, gatt_connected) != 0)
1606 _bt_hal_gatt_connected_state_event(gatt_connected, address);
1608 _bt_hal_handle_gattc_connected_event(address, gatt_connected);
1609 _bt_hal_gatt_connected_state_event(gatt_connected, address);
1612 } else if (!g_strcmp0(key, "Paired")) {
1613 gboolean paired = FALSE;
1614 struct hal_ev_bond_state_changed ev;
1615 char address[BT_HAL_ADDRESS_STRING_SIZE];
1617 g_variant_get(value, "b", &paired);
1618 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1620 _bt_hal_agent_set_canceled(FALSE);
1621 _bt_hal_convert_device_path_to_address(path, address);
1623 /* Prepare to send event to HAL bluetooth */
1624 ev.status = BT_STATUS_SUCCESS;
1625 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1626 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1629 ERR("Bluetooth HAL event handler not registered");
1631 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1632 } else if (!g_strcmp0(key, "LegacyPaired")) {
1633 DBG("Device property changed : LegacyPaired");
1634 } else if (!g_strcmp0(key, "Trusted")) {
1635 DBG("Device property changed : Trusted");
1636 gboolean trusted = FALSE;
1637 gchar *address = NULL;
1638 g_variant_get(value, "b", &trusted);
1639 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1641 _bt_hal_convert_device_path_to_address(path, address);
1642 DBG("Device [%s] trusted: [%d]", address, trusted);
1644 __bt_hal_send_device_trust_state_event(trusted, address);
1646 } else if (!g_strcmp0(key, "IpspConnected")) {
1647 DBG("Device property changed : IpspConnected");
1648 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
1649 DBG("Device property changed : IpspInitStateChanged");
1650 } else if (!g_strcmp0(key, "TrustedProfiles")) {
1652 char address[BT_HAL_ADDRESS_STRING_SIZE];
1654 g_variant_get(value, "u", &trust_val);
1655 _bt_hal_convert_device_path_to_address(path, address);
1656 DBG("Address: %s, TrustedProfiles: 0x%X", address, trust_val);
1657 __bt_hal_send_device_trusted_profile_changed_event(trust_val, address);
1659 //DBG("Unhandled Property:[%s]", key);
1664 static void __bt_hal_dbus_device_found_properties(const char *device_path)
1667 GError *error = NULL;
1668 GDBusProxy *device_proxy;
1669 GDBusConnection *conn;
1673 ERR("Invalid device path");
1677 conn = _bt_hal_get_system_gconn();
1679 ERR("_bt_hal_get_system_gconn failed");
1683 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1687 BT_HAL_PROPERTIES_INTERFACE,
1690 if (!device_proxy) {
1691 ERR("Error creating device_proxy");
1695 result = g_dbus_proxy_call_sync(device_proxy,
1697 g_variant_new("(s)", BT_HAL_DEVICE_INTERFACE),
1698 G_DBUS_CALL_FLAGS_NONE,
1703 ERR("Error occured in Proxy call");
1704 if (error != NULL) {
1705 ERR("Error occured in Proxy call (Error: %s)", error->message);
1706 g_clear_error(&error);
1708 g_object_unref(device_proxy);
1712 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1713 _bt_hal_convert_device_path_to_address(device_path, address);
1715 __bt_hal_device_properties_lookup(result, address);
1717 g_object_unref(device_proxy);
1721 static void __bt_hal_device_properties_lookup(GVariant *result, char *address)
1723 /* Buffer and propety count management */
1724 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
1725 struct hal_ev_device_found *ev = (void *) buf;
1727 memset(buf, 0, sizeof(buf));
1731 GVariant *tmp_value;
1736 if (result != NULL) {
1737 g_variant_get(result , "(@a{sv})", &value);
1738 g_variant_unref(result);
1741 tmp_value = g_variant_lookup_value(value, "Alias", G_VARIANT_TYPE_STRING);
1743 g_variant_get(tmp_value, "s", &name);
1745 g_variant_unref(tmp_value);
1747 DBG_SECURE("Alias Name [%s]", name);
1748 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1749 strlen(name) + 1, name);
1751 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1754 tmp_value = g_variant_lookup_value(value, "Name", G_VARIANT_TYPE_STRING);
1755 g_variant_get(tmp_value, "s", &name);
1756 g_variant_unref(tmp_value);
1758 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1759 strlen(name) + 1, name);
1761 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1766 tmp_value = g_variant_lookup_value(value, "Class", G_VARIANT_TYPE_UINT32);
1767 unsigned int class = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1768 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
1769 sizeof(unsigned int), &class);
1772 g_variant_unref(tmp_value);
1776 tmp_value = g_variant_lookup_value(value, "Connected", G_VARIANT_TYPE_BOOLEAN);
1777 unsigned int connected = tmp_value ? g_variant_get_boolean(tmp_value) : 0;
1778 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
1779 sizeof(unsigned int), &connected);
1781 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
1783 g_variant_unref(tmp_value);
1786 tmp_value = g_variant_lookup_value(value, "Trusted", G_VARIANT_TYPE_BOOLEAN);
1787 uint8_t trust = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1788 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
1789 sizeof(uint8_t), &trust);
1791 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
1793 g_variant_unref(tmp_value);
1796 tmp_value = g_variant_lookup_value(value, "Paired", G_VARIANT_TYPE_BOOLEAN);
1797 uint8_t paired = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1799 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
1800 sizeof(uint8_t), &paired);
1802 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
1804 g_variant_unref(tmp_value);
1807 tmp_value = g_variant_lookup_value(value, "RSSI", G_VARIANT_TYPE_INT16);
1808 int rssi = tmp_value ? g_variant_get_int16(tmp_value) : 0;
1809 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
1810 sizeof(int), &rssi);
1812 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
1814 g_variant_unref(tmp_value);
1816 /* Last Addr Type */
1817 tmp_value = g_variant_lookup_value(value, "LastAddrType", G_VARIANT_TYPE_UINT32);
1818 unsigned int addr_type = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1820 g_variant_unref(tmp_value);
1821 DBG("Device Last Address Type [0x%x]", addr_type);
1824 tmp_value = g_variant_lookup_value(value, "IsAliasSet", G_VARIANT_TYPE_UINT32);
1825 uint8_t is_alias_set = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1826 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
1827 sizeof(uint8_t), &is_alias_set);
1829 DBG("IsAliasSet: [%s], Property num [%d]", (is_alias_set ? "TRUE" : "FALSE"), ev->num_props);
1831 g_variant_unref(tmp_value);
1834 tmp_value = g_variant_lookup_value(value, "UUIDs", G_VARIANT_TYPE_STRING_ARRAY);
1835 gsize uuid_count = g_variant_get_size(tmp_value);
1836 char **uuid_value = g_variant_dup_strv(tmp_value, &uuid_count);
1838 /* UUID collection */
1843 int num_props_tmp = ev->num_props;
1845 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
1847 for (i = 0; uuid_value[i] != NULL; i++) {
1849 char *uuid_str = NULL;
1850 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
1851 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
1853 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
1854 uuid_str = g_strdup(uuid_value[i]);
1855 DBG("UUID string [%s]\n", uuid_str);
1857 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
1859 for (z = 0; z < 16; z++)
1860 DBG("[0x%x]", uuid[z]);
1863 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
1867 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
1868 (BT_HAL_STACK_UUID_SIZE * uuid_count),
1870 ev->num_props = num_props_tmp + 1;
1871 g_strfreev(uuid_value);
1873 g_variant_unref(tmp_value);
1875 /* LegacyManufacturerDataLen */
1876 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerDataLen", G_VARIANT_TYPE_UINT16);
1877 unsigned int manufacturer_data_len = tmp_value ? g_variant_get_uint16(tmp_value) : 0;
1878 if (manufacturer_data_len > BT_HAL_MANUFACTURER_DATA_LENGTH_MAX) {
1879 ERR("manufacturer_data_len is too long(len = %d)", manufacturer_data_len);
1880 manufacturer_data_len = BT_HAL_MANUFACTURER_DATA_LENGTH_MAX;
1883 g_variant_unref(tmp_value);
1885 /*size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA_LEN,
1886 sizeof(unsigned int), &manufacturer_data_len);
1888 DBG("Device Legacy Manufacturer data length [%u]", manufacturer_data_len);
1890 /* ManufacturerData */
1891 GVariantIter *char_value_iter;
1892 GByteArray *manufacturer_data = NULL;
1895 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerData", G_VARIANT_TYPE_BYTESTRING);
1896 g_variant_get(tmp_value, "ay", &char_value_iter);
1897 manufacturer_data = g_byte_array_new();
1898 while (g_variant_iter_loop(char_value_iter, "y", &char_value))
1899 g_byte_array_append(manufacturer_data, &char_value, 1);
1900 g_variant_iter_free(char_value_iter);
1902 if (manufacturer_data) {
1903 if (manufacturer_data_len > 0) {
1904 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA,
1905 manufacturer_data->len, manufacturer_data->data);
1909 g_byte_array_free(manufacturer_data, FALSE);
1911 g_variant_unref(tmp_value);
1915 _bt_hal_convert_addr_string_to_type(bdaddr, address);
1916 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
1917 sizeof(bdaddr), bdaddr);
1919 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
1921 g_variant_unref(value);
1923 ERR("result is NULL\n");
1926 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
1927 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
1931 static void __bt_hal_send_device_acl_connection_state_event(int status, gboolean connected, const char *address)
1933 struct hal_ev_acl_state_changed ev;
1936 ev.state = (connected == TRUE) ?
1937 HAL_ACL_STATE_CONNECTED :
1938 HAL_ACL_STATE_DISCONNECTED;
1940 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1943 ERR("Bluetooth HAL event handler not registered");
1945 event_cb(HAL_EV_ACL_STATE_CHANGED, &ev, sizeof(ev));
1948 static void __bt_hal_send_device_le_connection_state_event(int status, gboolean connected, const char *address)
1950 struct hal_ev_le_conn_state_changed ev;
1953 ev.state = (connected == TRUE) ?
1954 HAL_LE_STATE_CONNECTED :
1955 HAL_LE_STATE_DISCONNECTED;
1957 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1960 ERR("Bluetooth HAL event handler not registered");
1962 event_cb(HAL_EV_LE_CONN_STATE_CHANGED, &ev, sizeof(ev));
1965 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted,
1966 const char *address)
1968 struct hal_ev_device_trust_state_changed ev;
1970 ev.trust = (is_trusted == TRUE) ?
1971 HAL_DEVICE_TRUSTED :
1972 HAL_DEVICE_UNTRUSTED;
1974 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1977 ERR("Bluetooth HAL event handler not registered");
1979 event_cb(HAL_EV_DEVICE_TRUST_CHANGED, &ev, sizeof(ev));
1982 static void __bt_hal_send_device_trusted_profile_changed_event(
1983 uint32_t trust_val, const char *address)
1985 struct hal_ev_device_trusted_profiles_changed ev;
1987 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1988 ev.trust_val = trust_val;
1991 ERR("Bluetooth HAL event handler not registered");
1993 event_cb(HAL_EV_DEVICE_TRUSTED_PROFILES_CHANGED, &ev, sizeof(ev));
1996 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member,
2003 if (strcasecmp(member, "PropertyChanged") == 0) {
2005 g_variant_get(msg, "(s)", &property);
2006 if (property == NULL)
2008 if (strcasecmp(property, "GattConnected") == 0) {
2009 INFO("GATT Connected");
2010 gboolean connected = FALSE;
2012 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2014 _bt_hal_convert_device_path_to_address(path, address);
2015 g_variant_get(msg, "(b)", &connected);
2017 INFO("Connected device address[%s] connnected[%d]", address + 12, connected);
2019 } else if (strcasecmp(property, "Paired") == 0) {
2020 gboolean paired = FALSE;
2021 struct hal_ev_bond_state_changed ev;
2022 char address[BT_HAL_ADDRESS_STRING_SIZE];
2024 g_variant_get(msg, "(b)", &paired);
2025 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
2027 _bt_hal_agent_set_canceled(FALSE);
2028 _bt_hal_convert_device_path_to_address(path, address);
2030 /* Prepare to send event to HAL bluetooth */
2031 ev.status = BT_STATUS_SUCCESS;
2032 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
2033 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2036 ERR("Bluetooth HAL event handler not registered");
2038 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
2039 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
2041 } else if (strcasecmp(property, "UUIDs") == 0) {
2045 } else if (strcasecmp(member, "DeviceConnected") == 0) {
2046 unsigned char addr_type = 0;
2048 g_variant_get(msg, "(y)", &addr_type);
2050 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2051 _bt_hal_convert_device_path_to_address(path, address);
2053 DBG("Member: [%s]", member);
2054 ERR_C("### Connected [%s] [%s]", !addr_type ? "BREDR" : "LE", address + 12);
2056 __bt_hal_send_device_acl_connection_state_event(BT_STATUS_SUCCESS, TRUE, address);
2058 __bt_hal_send_device_le_connection_state_event(BT_STATUS_SUCCESS, TRUE, address);
2060 } else if (strcasecmp(member, "ConnectionFail") == 0) {
2061 DBG("Received Connection failed error");
2062 DBG("path : %s", path);
2063 l2cap_le_cb_data_t *info;
2064 l2cap_le_conn_info_t *conn_info;
2067 g_variant_get(msg, "(s)", &info_path);
2069 if (NULL != info_path) {
2070 info = __find_l2cap_le_client_info_from_path(info_path);
2072 conn_info = info->conn_info;
2073 if (write(conn_info->hal_fd, &res, sizeof(res)) != sizeof(res)) {
2074 ERR("Error Sending l2cap_le connection result");
2076 __l2cap_le_cb_data_remove(info);
2078 ERR("info is NULL");
2080 ERR("info_path is NULL");
2081 } else if (strcasecmp(member, "Disconnected") == 0) {
2082 unsigned char disc_reason = 0;
2083 unsigned char addr_type = 0;
2086 g_variant_get(msg, "(yy&s)", &addr_type, &disc_reason, &name);
2088 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2089 _bt_hal_convert_device_path_to_address(path, address);
2091 ERR_C("### Disconnected [%s] [%d : %s] [%s] [%s]", !addr_type ? "BREDR" : "LE",
2092 disc_reason, _bt_hal_convert_disc_reason_to_string(disc_reason), address + 12, name);
2095 __bt_hal_send_device_acl_connection_state_event(disc_reason, FALSE, address);
2097 __bt_hal_send_device_le_connection_state_event(disc_reason, FALSE, address);
2099 } else if (strcasecmp(member, "ProfileStateChanged") == 0) {
2101 char *profile_uuid = NULL;
2103 g_variant_get(msg, "(si)", &profile_uuid, &state);
2104 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2105 _bt_hal_convert_device_path_to_address(path, address);
2107 if (strncmp(profile_uuid, HID_UUID, strlen(HID_UUID)) == 0) {
2108 DBG("HID Host Profile state: %d", state);
2109 if (state == BT_HAL_PROFILE_STATE_CONNECTED)
2110 __bt_hal_send_hid_connection_state_event(TRUE, address);
2111 else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED)
2112 __bt_hal_send_hid_connection_state_event(FALSE, address);
2114 DBG("HID Host Profile state: Invalid");
2115 } else if (strcmp(profile_uuid, HID_DEVICE_UUID) == 0) {
2116 DBG("HID Device Profile state: %d", state);
2117 if (state == BT_HAL_PROFILE_STATE_CONNECTED)
2118 __bt_hal_send_hid_device_connection_state_event(TRUE, address);
2119 else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED)
2120 __bt_hal_send_hid_device_connection_state_event(FALSE, address);
2122 DBG("HID Device Profile state: Invalid");
2123 } else if ((strcmp(profile_uuid, A2DP_SINK_UUID) == 0)) {
2124 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2125 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTED");
2126 __bt_hal_send_av_connection_state_event(TRUE, address);
2127 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2128 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2129 __bt_hal_send_av_connection_state_event(FALSE, address);
2130 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2131 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2132 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2133 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTING");
2135 ERR("A2DP Profile state: Invalid");
2137 } else if ((strcmp(profile_uuid, A2DP_SOURCE_UUID) == 0)) {
2138 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2139 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
2140 __bt_hal_send_a2dp_sink_connection_state_event(TRUE, address);
2141 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2142 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
2143 __bt_hal_send_a2dp_sink_connection_state_event(FALSE, address);
2144 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2145 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
2146 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2147 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
2149 } else if (strcmp(profile_uuid, HFP_HF_UUID) == 0) {
2150 if (state == BT_HAL_PROFILE_STATE_CONNECTING)
2151 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTING");
2152 else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2153 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTED");
2154 __bt_hal_send_hf_connection_state_event(TRUE, address);
2155 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2156 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2157 __bt_hal_send_hf_connection_state_event(FALSE, address);
2158 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2159 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2161 ERR("HFP Profile state: Invalid");
2163 } else if (strcmp(profile_uuid, HFP_AG_UUID) == 0) {
2164 if (state == BT_HAL_PROFILE_STATE_CONNECTING)
2165 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_CONNECTING");
2166 else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2167 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_CONNECTED");
2168 __bt_hal_send_hf_client_connection_state_event(TRUE, address);
2169 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2170 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2171 __bt_hal_send_hf_client_connection_state_event(FALSE, address);
2172 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2173 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2175 ERR("HFP Client Profile state: Invalid");
2177 } else if ((strcmp(profile_uuid, AVRCP_TARGET_UUID) == 0)) {
2178 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2179 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
2180 __bt_hal_send_avrcp_ctrl_connection_state_event(TRUE, address);
2181 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2182 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
2183 __bt_hal_send_avrcp_ctrl_connection_state_event(FALSE, address);
2184 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2185 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
2186 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2187 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
2190 DBG("Profile [%s] State changed [%d] [%s] ", profile_uuid, state, address);
2193 g_free(profile_uuid);
2194 } else if (strcasecmp(member, "AttMtuChanged") == 0) {
2198 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2200 _bt_hal_convert_device_path_to_address(path, address);
2201 g_variant_get(msg, "(q)", &mtu);
2203 __bt_hal_handle_gatts_mtu_changed_event(address, mtu);
2206 } else if (strcasecmp(member, "AdvReport") == 0) {
2207 __bt_hal_handle_adv_report(msg, path);
2211 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path)
2213 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
2214 struct hal_ev_gatt_client_scan_result *ev = (void *)buf;
2216 char *address = NULL;
2217 GVariant *value = NULL;
2218 char *buffer = NULL;
2221 uint8_t addr_type = 0;
2222 uint8_t adv_type = 0;
2228 memset(buf, 0, sizeof(buf));
2231 g_variant_get(msg, "(&syyii@ay)", &address, &addr_type,
2232 &adv_type, &rssi, &data_len, &value);
2234 buffer_len = g_variant_get_size(value);
2236 buffer = (char *)g_variant_get_data(value);
2238 if (data_len != buffer_len) {
2239 ERR("Unexpected: buffer_len: %d, data_len: %d",
2240 buffer_len, data_len);
2241 data_len = buffer_len;
2244 // DBG("Address: %s, len: %d, rssi: %d, addr_type: 0x%02X, adv_type: 0x%02X",
2245 // address, data_len, rssi, addr_type, adv_type);
2247 _bt_hal_convert_addr_string_to_type(ev->bd_addr, address);
2248 ev->addr_type = addr_type;
2249 ev->adv_type = adv_type;
2251 ev->is_extended = 0;
2253 ev->primary_phy = 1;
2254 ev->secondary_phy = 1;
2255 ev->advertising_sid = 0;
2257 ev->periodic_adv_int = 0;
2259 memcpy(ev->adv_data, buffer, data_len);
2262 gatt_event_cb(HAL_EV_GATT_CLIENT_SCAN_RESULT, buf, size);
2263 g_variant_unref(value);
2266 static void __bt_hal_handle_gatts_mtu_changed_event(char *address, int mtu)
2268 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
2269 struct hal_ev_gatt_server_mtu_changed *ev = (void *)buf;
2275 memset(buf, 0, sizeof(buf));
2278 ev->conn_id = _bt_get_remote_gatt_client_conn_id(address);
2281 gatt_event_cb(HAL_EV_GATT_SERVER_MTU_CHANGED, buf, size);
2284 /* AVRCP Controller Role(Remote:AVRCP Target) Events */
2285 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address)
2288 struct hal_ev_avrcp_ctrl_conn_state ev;
2290 if (connected == TRUE)
2291 INFO("AVRCP(Controller) Profile Connected for address [%s]", address);
2293 INFO("AVRCP(Controller) Profile DisConnected for address [%s]", address);
2295 if (connected == TRUE)
2296 ev.state = HAL_AVRCP_CTRL_STATE_CONNECTED;
2298 ev.state = HAL_AVRCP_CTRL_STATE_DISCONNECTED;
2299 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2301 if (!avrcp_ctrl_event_cb)
2302 ERR("AVRCP controller handler not registered");
2304 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_CONN_STATE, &ev, sizeof(ev));
2307 static int __bt_media_attr_to_type(const char *str)
2309 if (!strcasecmp(str, "Equalizer"))
2310 return HAL_PLAYER_ATTR_EQUALIZER;
2311 else if (!strcasecmp(str, "Repeat"))
2312 return HAL_PLAYER_ATTR_REPEAT;
2313 else if (!strcasecmp(str, "Shuffle"))
2314 return HAL_PLAYER_ATTR_SHUFFLE;
2315 else if (!strcasecmp(str, "Scan"))
2316 return HAL_PLAYER_ATTR_SCAN;
2322 static int __bt_hal_play_status_str_to_type(const char *value)
2324 if (!strcmp(value, "stopped"))
2325 return HAL_PLAYSTATE_STOPPED;
2326 else if (!strcmp(value, "playing"))
2327 return HAL_PLAYSTATE_PLAYING;
2328 else if (!strcmp(value, "paused"))
2329 return HAL_PLAYSTATE_PAUSED;
2330 else if (!strcmp(value, "forward-seek"))
2331 return HAL_PLAYSTATE_FWD_SEEK;
2332 else if (!strcmp(value, "reverse-seek"))
2333 return HAL_PLAYSTATE_REV_SEEK;
2335 return HAL_PLAYSTATE_ERROR;
2338 static void __bt_avrcp_control_parse_properties(struct hal_ev_track_changed *ev, GVariant *item)
2340 GVariant *value = NULL;
2342 char *value_string = NULL;
2343 const char *key = NULL;
2349 g_variant_iter_init(&iter, item);
2350 while (g_variant_iter_loop(&iter, "{sv}", &key, &value)) {
2351 if (strcasecmp(key, "Title") == 0) {
2352 value_string = (char *)g_variant_get_string(value, NULL);
2353 DBG("Value : %s ", value_string);
2354 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TITLE;
2355 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2357 } else if (strcasecmp(key, "Artist") == 0) {
2358 value_string = (char *)g_variant_get_string(value, NULL);
2359 DBG("Value : %s ", value_string);
2360 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ARTIST;
2361 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2363 } else if (strcasecmp(key, "Album") == 0) {
2364 value_string = (char *)g_variant_get_string(value, NULL);
2365 DBG("Value : %s ", value_string);
2366 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ALBUM;
2367 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2369 } else if (strcasecmp(key, "Genre") == 0) {
2370 value_string = (char *)g_variant_get_string(value, NULL);
2371 DBG("Value : %s ", value_string);
2372 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_GENRE;
2373 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2375 } else if (strcasecmp(key, "Duration") == 0) {
2378 val = g_variant_get_uint32(value);
2379 DBG("Value : %li", val);
2380 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_PLAYING_TIME;
2381 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2383 } else if (strcasecmp(key, "NumberOfTracks") == 0) {
2386 val = g_variant_get_uint32(value);
2387 DBG("Value : %li", val);
2388 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_NUM_TRACKS;
2389 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2391 } else if (strcasecmp(key, "TrackNumber") == 0) {
2394 val = g_variant_get_uint32(value);
2395 DBG("Value : %li", val);
2396 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TRACK_NUM;
2397 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2400 DBG("%s not supported, ignoring", key);
2403 if (i >= HAL_MAX_ATTR_NUM) {
2404 ERR(" Received max attribute [%d]", i);
2413 static int __bt_media_attrval_to_val(int type, const char *value)
2418 case HAL_PLAYER_ATTR_EQUALIZER:
2419 if (!strcmp(value, "off"))
2424 case HAL_PLAYER_ATTR_REPEAT:
2425 if (!strcmp(value, "off"))
2426 ret = BTRC_PLAYER_VAL_OFF_REPEAT;
2427 else if (!strcmp(value, "singletrack"))
2428 ret = BTRC_PLAYER_VAL_SINGLE_REPEAT;
2429 else if (!strcmp(value, "alltracks"))
2430 ret = BTRC_PLAYER_VAL_ALL_REPEAT;
2432 ret = BTRC_PLAYER_VAL_GROUP_REPEAT;
2434 case HAL_PLAYER_ATTR_SHUFFLE:
2435 if (!strcmp(value, "off"))
2436 ret = BTRC_PLAYER_VAL_OFF_SHUFFLE;
2437 else if (!strcmp(value, "alltracks"))
2438 ret = BTRC_PLAYER_VAL_ALL_SHUFFLE;
2440 ret = BTRC_PLAYER_VAL_GROUP_SHUFFLE;
2442 case HAL_PLAYER_ATTR_SCAN:
2443 if (!strcmp(value, "off"))
2445 else if (!strcmp(value, "alltracks"))
2451 ERR("Value not handled");
2457 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member,
2460 const char *property = NULL;
2461 GVariant *value = NULL;
2463 char address[BT_HAL_ADDRESS_STRING_SIZE];
2466 ERR("Error returned in method call\n");
2470 if (!avrcp_ctrl_event_cb) {
2471 ERR("AVRCP controller DBUS handler callback not registered");
2475 g_variant_iter_init(&iter, msg);
2477 _bt_hal_convert_device_path_to_address(path, address);
2479 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2480 DBG("Property = %s \n", property);
2481 if ((strcasecmp(property, "Equalizer") == 0) ||
2482 (strcasecmp(property, "Repeat") == 0) ||
2483 (strcasecmp(property, "Shuffle") == 0) ||
2484 (strcasecmp(property, "Scan") == 0)) {
2485 struct hal_ev_player_setting ev;
2489 valstr = g_variant_get_string(value, NULL);
2490 DBG("Value : %s ", valstr);
2493 val = __bt_media_attrval_to_val(__bt_media_attr_to_type(property), valstr);
2496 memset(&ev, 0, sizeof(ev));
2497 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2499 ev.attr_ids[0] = __bt_media_attr_to_type(property);
2500 ev.attr_values[0] = val;
2502 /* Send event to application */
2503 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAYER_APP_SETTING_CHANGED, &ev, sizeof(ev));
2505 } else if ((strcasecmp(property, "Status") == 0)) {
2506 struct hal_ev_play_status_changed ev;
2509 valstr = g_variant_get_string(value, NULL);
2510 DBG("Value : %s ", valstr);
2512 memset(&ev, 0, sizeof(ev));
2513 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2515 ev.status = __bt_hal_play_status_str_to_type(valstr);
2517 /* Send event to application */
2518 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_STATUS_CHANGED, &ev, sizeof(ev));
2520 } else if (strcasecmp(property, "Position") == 0) {
2521 struct hal_ev_play_position ev;
2523 memset(&ev, 0, sizeof(ev));
2524 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2525 ev.pos = g_variant_get_uint32(value);
2526 DBG("Value : %d ", ev.pos);
2528 /* Send event to application */
2529 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_POSITION_CHANGED, &ev, sizeof(ev));
2530 } else if (strcasecmp(property, "Track") == 0) {
2531 struct hal_ev_track_changed ev;
2533 memset(&ev, 0, sizeof(ev));
2534 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2535 __bt_avrcp_control_parse_properties(&ev, value);
2537 /* Send event to application */
2538 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_TRACK_CHANGED, &ev, sizeof(ev));
2540 DBG("Property not handled");
2545 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member,
2548 const char *property = NULL;
2549 GVariant *value = NULL;
2551 char address[BT_HAL_ADDRESS_STRING_SIZE];
2555 ERR("Error returned in method call\n");
2559 if (!avrcp_tg_event_cb) {
2560 ERR("AVRCP target DBUS handler callback not registered");
2564 g_variant_iter_init(&iter, msg);
2566 _bt_hal_convert_device_path_to_address(path, address);
2568 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2569 DBG("Property = %s \n", property);
2570 if ((strcasecmp(property, "Delay") == 0)) {
2571 struct hal_ev_avrcp_tg_delay_changed ev;
2574 memset(&ev, 0, sizeof(ev));
2575 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2577 val = g_variant_get_uint16(value);
2578 DBG("Value : %d", val);
2581 /* Send event to application */
2582 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_DELAY_CHANGE, &ev, sizeof(ev));
2583 } else if ((strcasecmp(property, "Volume") == 0)) {
2584 struct hal_ev_avrcp_tg_volume_changed ev;
2587 memset(&ev, 0, sizeof(ev));
2588 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2590 val = g_variant_get_uint16(value);
2591 DBG("Value : %d", val);
2594 /* Send event to application */
2595 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_VOLUME_CHANGE, &ev, sizeof(ev));
2597 DBG("Property not handled");
2602 /* A2DP Src Role(Remote:Sink) Events */
2603 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address)
2605 struct hal_ev_a2dp_conn_state ev;
2607 if (connected == TRUE)
2608 INFO("A2DP(Src) Profile Connected for address [%s]", address + 12);
2610 INFO("A2DP(Src) Profile DisConnected for address [%s]", address + 12);
2612 ev.state = (connected == TRUE) ?
2613 HAL_EV_A2DP_STATE_CONNECTED :
2614 HAL_EV_A2DP_STATE_DISCONNECTED;
2616 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2619 ERR("AV event handler not registered");
2621 av_event_cb(HAL_EV_A2DP_CONN_STATE, &ev, sizeof(ev));
2624 /* A2DP Sink Role(Remote:Source) Events */
2625 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address)
2627 struct hal_ev_a2dp_conn_state ev;
2629 if (connected == TRUE)
2630 INFO("A2DP(Sink) Profile Connected for address [%s]", address + 12);
2632 INFO("A2DP(Sink) Profile DisConnected for address [%s]", address + 12);
2634 ev.state = (connected == TRUE) ?
2635 HAL_EV_A2DP_STATE_CONNECTED :
2636 HAL_EV_A2DP_STATE_DISCONNECTED;
2638 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2640 if (!a2dp_sink_event_cb)
2641 ERR("AV event handler not registered");
2643 a2dp_sink_event_cb(HAL_EV_A2DP_SOURCE_CONN_STATE, &ev, sizeof(ev));
2646 /* HF(AG Role) Audio Events */
2647 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected,
2648 const char *address)
2650 struct hal_ev_handsfree_audio_state ev;
2652 if (connected == TRUE)
2653 INFO("AG Audio Connected for address [%s]", address + 12);
2655 INFO("AG Audio DisConnected for address [%s]", address + 12);
2657 ev.state = (connected == TRUE) ?
2658 HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTED :
2659 HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED;
2661 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2664 ERR("HF event handler not registered");
2666 hf_event_cb(HAL_EV_HANDSFREE_AUDIO_STATE, &ev, sizeof(ev));
2669 /* HF(AG Role) Profile Events */
2670 static void __bt_hal_send_hf_connection_state_event(gboolean connected,
2671 const char *address)
2673 struct hal_ev_handsfree_conn_state ev;
2675 if (connected == TRUE)
2676 INFO("AG Profile Connected for address [%s]", address + 12);
2678 INFO("AG Profile DisConnected for address [%s]", address + 12);
2680 ev.state = (connected == TRUE) ?
2681 HAL_EV_HANDSFREE_CONN_STATE_CONNECTED :
2682 HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTED;
2684 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2687 ERR("HF event handler not registered");
2689 hf_event_cb(HAL_EV_HANDSFREE_CONN_STATE, &ev, sizeof(ev));
2692 /* HF(Client Role) Profile Events */
2693 static void __bt_hal_send_hf_client_connection_state_event(gboolean connected,
2694 const char *address)
2696 struct hal_ev_hf_client_conn_state ev;
2698 if (connected == TRUE)
2699 INFO("HF Client Profile Connected for address [%s]", address + 12);
2701 INFO("HF Client Profile DisConnected for address [%s]", address + 12);
2703 ev.state = (connected == TRUE) ?
2704 HAL_EV_HF_CLIENT_CONN_STATE_CONNECTED :
2705 HAL_EV_HF_CLIENT_CONN_STATE_DISCONNECTED;
2707 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2709 if (!hf_client_event_cb)
2710 ERR("HF Client event handler not registered");
2712 hf_client_event_cb(HAL_EV_HF_CLIENT_CONN_STATE, &ev, sizeof(ev));
2715 void _bt_hal_register_event_handler_cb(bt_hal_module_e module, handle_stack_msg cb)
2722 hid_device_event_cb = cb;
2728 a2dp_sink_event_cb = cb;
2734 hf_client_event_cb = cb;
2737 avrcp_tg_event_cb = cb;
2739 case HAL_AVRCP_CTRL:
2740 avrcp_ctrl_event_cb = cb;
2746 ERR("Unknown module: %d", module);
2750 void _bt_hal_unregister_event_handler_cb(bt_hal_module_e module)
2754 hid_event_cb = NULL;
2760 a2dp_sink_event_cb = NULL;
2766 hf_client_event_cb = NULL;
2769 avrcp_tg_event_cb = NULL;
2771 case HAL_AVRCP_CTRL:
2772 avrcp_ctrl_event_cb = NULL;
2775 gatt_event_cb = NULL;
2778 ERR("Unknown module: %d", module);
2782 bool _bt_hal_get_adapter_request_state(void)
2784 return is_adapter_activating;
2787 bool _bt_hal_get_le_request_state(void)
2789 return is_le_activating;
2792 void _bt_hal_set_adapter_request_state(bool enable)
2794 DBG("set_adapter_request_state %d", enable);
2795 is_adapter_activating = enable;
2798 void _bt_hal_set_le_request_state(bool enable)
2800 DBG("set_le_request_state %d", enable);
2801 is_le_activating = enable;