4 * Copyright (c) 2015 -2016 Samsung Electronics Co., Ltd All Rights Reserved.
6 * Contact: Anupam Roy <anupam.r@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
33 #include "bt-hal-log.h"
34 #include "bt-hal-msg.h"
35 #include "bt-hal-internal.h"
36 #include "bt-hal-event-receiver.h"
37 #include "bt-hal-dbus-common-utils.h"
38 #include "bt-hal-agent.h"
39 #include "bt-hal-adapter-le.h"
40 #include "bt-hal-gatt-server.h"
41 #include "bt-hal-gatt-client.h"
42 #include "bt-hal-adapter-dbus-handler.h"
44 #define BASELEN_PROP_CHANGED (sizeof(struct hal_ev_adapter_props_changed) \
45 + sizeof(struct hal_property))
47 /*TODO: Basic filters are currently added,
48 Need to add different event filters like HID,
49 Device etc in subsequent patches */
51 /* Global variables and structures */
52 static GDBusConnection *manager_conn;
53 static handle_stack_msg event_cb = NULL;
54 static handle_stack_msg hid_event_cb = NULL;
55 static handle_stack_msg av_event_cb = NULL;
56 static handle_stack_msg a2dp_sink_event_cb = NULL;
57 static handle_stack_msg hf_event_cb = NULL;
58 static handle_stack_msg avrcp_ctrl_event_cb = NULL;
59 static handle_stack_msg avrcp_tg_event_cb = NULL;
60 static handle_stack_msg gatt_event_cb = NULL;
61 static guint event_id;
63 /*State Management sepration Control for Adapter and LE */
64 static gboolean is_adapter_activating = FALSE;
65 static gboolean is_le_activating = FALSE;
70 gchar* interface_name;
73 } bt_hal_main_event_data_t;
75 /* Forward declarations */
76 static gboolean __bt_hal_event_manager(gpointer param);
77 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type);
78 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn, int subscribe);
79 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn, int subscribe);
80 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe);
82 static int __bt_hal_parse_event(GVariant *msg);
83 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current);
85 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path);
86 static void __bt_hal_adapter_property_changed_event(GVariant *msg);
87 static void __bt_hal_manager_event_filter(GDBusConnection *connection, const gchar *sender_name,
88 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
89 GVariant *parameters, gpointer user_data);
90 static int __bt_hal_initialize_manager_receiver(void);
91 static gboolean __bt_hal_parse_interface(GVariant *msg);
92 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters);
93 static gboolean __bt_hal_parse_device_properties(GVariant *item);
94 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data);
95 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path);
96 static void __bt_hal_dbus_device_found_properties(const char *device_path);
97 static void __bt_hal_device_properties_lookup(GVariant *result, char *address);
98 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member, const char *path);
99 static void __bt_hal_send_device_acl_connection_state_event(int status, gboolean connected, const char *address);
100 static void __bt_hal_handle_input_event(GVariant *msg, const char *path);
101 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address);
102 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address);
103 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address);
104 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member, const char *path);
105 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member, const char *path);
107 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted, const char *address);
108 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn, int subscribe);
109 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path);
110 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected, const char *address);
111 static void __bt_hal_send_hf_connection_state_event(gboolean connected, const char *address);
112 static void __bt_hal_send_device_trusted_profile_changed_event(uint32_t trust_val, const char *address);
113 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path);
115 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data)
119 struct hal_ev_discovery_state_changed ev;
120 ev.state = HAL_DISCOVERY_STATE_STOPPED;
121 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
127 static int __bt_hal_parse_event(GVariant *msg)
131 char *interface_name = NULL;
132 GVariant *inner_iter = NULL;
134 g_variant_iter_init(&iter, msg);
136 while ((child = g_variant_iter_next_value(&iter))) {
137 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
138 if (g_strcmp0(interface_name,
139 BT_HAL_DEVICE_INTERFACE) == 0) {
140 DBG("__bt_hal_parse_event: Interface: BT_HAL_DEVICE_INTERFACE");
141 g_variant_unref(inner_iter);
142 g_variant_unref(child);
143 return BT_HAL_DEVICE_EVENT;
144 } else if (g_strcmp0(interface_name,
145 BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
146 DBG("__bt_hal_parse_event: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
147 g_variant_unref(inner_iter);
148 g_variant_unref(child);
149 return BT_HAL_MEDIA_TRANSFER_EVENT;
150 } else if (g_strcmp0(interface_name,
151 BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
152 DBG("__bt_hal_parse_event: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
153 g_variant_unref(inner_iter);
154 g_variant_unref(child);
155 return BT_HAL_AVRCP_CONTROL_EVENT;
157 g_variant_unref(inner_iter);
158 g_variant_unref(child);
164 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current)
166 g_variant_get(msg, "(sss)", name, previous, current);
167 return BT_HAL_ERROR_NONE;
170 int __bt_insert_hal_properties(void *buf, uint8_t type, uint16_t len, const void *val)
171 { struct hal_property *prop = buf;
177 memcpy(prop->val, val, len);
179 return sizeof(*prop) + len;
182 handle_stack_msg _bt_hal_get_stack_message_handler(void)
187 static void __bt_hal_adapter_property_changed_event(GVariant *msg)
189 GVariantIter value_iter;
190 GVariant *value = NULL;
191 GDBusProxy *adapter_proxy;
194 g_variant_iter_init(&value_iter, msg);
196 /* Buffer and propety count management */
197 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
198 struct hal_ev_adapter_props_changed *ev = (void*) buf;
200 const gchar *address = NULL;
202 unsigned int cod = 0;
203 gboolean discoverable;
204 gboolean connectable;
205 unsigned int scan_mode = BT_SCAN_MODE_NONE;
206 unsigned int disc_timeout;
207 const gchar *version;
208 gboolean ipsp_initialized;
211 unsigned int pairable_timeout;
212 gboolean scan_mode_property_update = FALSE;
213 gboolean is_discovering;
214 gboolean is_le_discovering;
216 memset(buf, 0, sizeof(buf));
219 ev->status = BT_STATUS_SUCCESS;
223 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
224 if (!g_strcmp0(key, "Address")) {
227 address = g_variant_get_string(value, NULL);
228 DBG("##Address [%s]", address);
229 _bt_hal_convert_addr_string_to_type(bdaddr, address);
230 size += __bt_insert_hal_properties(buf + size,
231 HAL_PROP_ADAPTER_ADDR, sizeof(bdaddr), bdaddr);
233 } else if (!g_strcmp0(key, "Alias")) {
234 g_variant_get(value, "&s", &name);
235 DBG("##Alias [%s] ", name);
236 size += __bt_insert_hal_properties(buf + size,
237 HAL_PROP_ADAPTER_NAME, strlen(name) + 1, name);
239 } else if (!g_strcmp0(key, "Class")) {
240 cod = g_variant_get_uint32(value);
241 DBG("##Class [%d]", cod);
242 size += __bt_insert_hal_properties(buf + size,
243 HAL_PROP_ADAPTER_CLASS, sizeof(unsigned int), &cod);
245 } else if (!g_strcmp0(key, "Discoverable")) {
246 discoverable = g_variant_get_boolean(value);
247 DBG("##Discoverable [%d]", discoverable);
249 scan_mode = BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE;
251 scan_mode = BT_SCAN_MODE_CONNECTABLE;
252 scan_mode_property_update = TRUE;
253 } else if (!g_strcmp0(key, "DiscoverableTimeout")) {
254 disc_timeout = g_variant_get_uint32(value);
255 DBG("##Discoverable Timeout [%d]", disc_timeout);
256 size += __bt_insert_hal_properties(buf + size,
257 HAL_PROP_ADAPTER_DISC_TIMEOUT, sizeof(unsigned int), &disc_timeout);
259 } else if (!g_strcmp0(key, "Connectable")) {
260 connectable = g_variant_get_boolean(value);
261 DBG("##Connectable [%d]", connectable);
263 scan_mode = BT_SCAN_MODE_NONE;
264 else if (scan_mode == BT_SCAN_MODE_NONE)
265 scan_mode = BT_SCAN_MODE_CONNECTABLE;
266 scan_mode_property_update = TRUE;
267 } else if (!g_strcmp0(key, "Version")) {
268 version = g_variant_get_string(value, NULL);
269 DBG("##Version [%s]", version);
270 size += __bt_insert_hal_properties(buf + size,
271 HAL_PROP_ADAPTER_VERSION, strlen(version) + 1, version);
273 } else if (!g_strcmp0(key, "Name")) {
274 g_variant_get(value, "&s", &name);
275 DBG("##Name [%s]", name);
276 size += __bt_insert_hal_properties(buf + size,
277 HAL_PROP_ADAPTER_NAME, strlen(name) + 1, name);
279 } else if (!g_strcmp0(key, "Powered")) {
280 powered = g_variant_get_boolean(value);
281 DBG("##Powered = %d", powered);
282 /* TODO: Need to check this operation!! */
283 if (powered == FALSE) {
284 DBG("###### Adapter Powered Down ######");
285 struct hal_ev_adapter_state_changed ev;
286 ev.state = HAL_POWER_OFF;
287 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
289 struct hal_ev_le_state_changed le_ev;
290 le_ev.state = HAL_POWER_OFF;
291 event_cb(HAL_EV_LE_STATE_CHANGED, &le_ev, sizeof(le_ev));
294 _bt_hal_destroy_adapter_agent();
296 DBG("###### Adapter Powered Up ######");
297 int is_flight_mode=1, ret = -1;
298 ret = vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &is_flight_mode);
300 ERR("vconf_get_bool failed");
301 if (_bt_hal_get_adapter_request_state() || !is_flight_mode) {
302 DBG("Sending STATE CHANGE EVENT for Adapter... ");
303 _bt_hal_set_adapter_request_state(FALSE);
304 struct hal_ev_adapter_state_changed ev;
305 ev.state = HAL_POWER_ON;
306 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
309 if (_bt_hal_get_le_request_state() || !is_flight_mode) {
310 DBG("Sending STATE CHANGE EVENT for LE... ");
311 _bt_hal_set_le_request_state(FALSE);
312 struct hal_ev_le_state_changed ev;
313 ev.state = HAL_POWER_ON;
314 event_cb(HAL_EV_LE_STATE_CHANGED, &ev, sizeof(ev));
318 _bt_hal_initialize_adapter_agent();
321 } else if (!g_strcmp0(key, "Pairable")) {
322 pairable = g_variant_get_boolean(value);
323 DBG("##Pairable [%d]", pairable);
324 } else if (!g_strcmp0(key, "PairableTimeout")) {
325 pairable_timeout = g_variant_get_uint32(value);
326 DBG("##Pairable Timeout = %d", pairable_timeout);
327 } else if (!g_strcmp0(key, "UUIDs")) {
332 size1 = g_variant_get_size(value);
333 int num_props_tmp = ev->num_props;
335 uuid_value = (char **)g_variant_get_strv(value, &size1);
336 for (i = 0; uuid_value[i] != NULL; i++)
338 /* UUID collection */
339 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
340 for (i = 0; uuid_value[i] != NULL; i++) {
341 char *uuid_str = NULL;
342 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
343 uuid_str = g_strdup(uuid_value[i]);
344 DBG("##UUID string [%s]\n", uuid_str);
345 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
346 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
349 size += __bt_insert_hal_properties(buf + size, HAL_PROP_ADAPTER_UUIDS,
350 (BT_HAL_STACK_UUID_SIZE * uuid_count),
352 ev->num_props = num_props_tmp + 1;
355 } else if (!g_strcmp0(key, "Discovering")) {
356 is_discovering = g_variant_get_boolean(value);
357 DBG("##Discovering = [%d]", is_discovering);
359 if (is_discovering == FALSE) {
360 DBG("###### Adapter Has stopped Discovering ######");
361 /* In Tizen Bluez, this actually does not mean Discovery is stopped
362 in Bluez. Tizen Bluez sends this event after a certain timeout,
363 Therefore, we must forecefully call StopDiscovery to stop discovery in BlueZ */
367 adapter_proxy = _bt_hal_get_adapter_proxy();
369 if (adapter_proxy == NULL)
372 /* Need to stop searching */
373 DBG("Event though Bluez reported DIscovering stopped, we force stop Discovery ");
374 g_dbus_proxy_call_sync(adapter_proxy, "StopDiscovery",
376 G_DBUS_CALL_FLAGS_NONE,
380 ERR("Dbus Error : %s", err->message);
382 /* This error is thrown by Bluez, as Discovery is already stopped.
383 Discovery is stopped if user cancels on going discovery.
384 In order to maintain correct state of Bluetooth Discovery state,
385 simply send Discovery stopped event to HAL user */
386 struct hal_ev_discovery_state_changed ev;
387 ev.state = HAL_DISCOVERY_STATE_STOPPED;
388 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
393 event_id = g_timeout_add(BT_HAL_DISCOVERY_FINISHED_DELAY,
394 (GSourceFunc)__bt_hal_discovery_finished_cb, NULL);
398 DBG("###### Adapter Has started Discovering ######");
399 struct hal_ev_discovery_state_changed ev;
400 ev.state = HAL_DISCOVERY_STATE_STARTED;
401 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
404 } else if (!g_strcmp0(key, "LEDiscovering")) {
407 is_le_discovering = g_variant_get_boolean(value);
408 DBG("##LE Discovering = [%d]", is_le_discovering);
410 if (is_le_discovering)
413 adapter_proxy = _bt_hal_get_adapter_proxy();
414 if (adapter_proxy == NULL) {
415 ERR("adapter_proxy == NULL");
419 /* Need to stop searching */
420 result = g_dbus_proxy_call_sync(adapter_proxy, "StopLEDiscovery",
421 NULL, G_DBUS_CALL_FLAGS_NONE,
422 DBUS_TIMEOUT, NULL, &err);
424 ERR("Error occured in Proxy call");
426 ERR("(Error: %s)", err->message);
431 g_variant_unref(result);
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);
471 ERR("Unhandled Property:[%s]", key);
475 if (scan_mode_property_update) {
476 size += __bt_insert_hal_properties(buf + size,
477 HAL_PROP_ADAPTER_SCAN_MODE, sizeof(int), &scan_mode);
483 DBG("Send Adapter properties changed event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
484 event_cb(HAL_EV_ADAPTER_PROPS_CHANGED, buf, size);
490 static void __bt_hal_flight_ps_mode_cb(keynode_t *node, void *data)
492 gboolean flight_mode = FALSE;
494 DBG_SECURE("HAL callback hit");
495 DBG_SECURE("key=%s", vconf_keynode_get_name(node));
496 type = vconf_keynode_get_type(node);
497 if (type == VCONF_TYPE_BOOL) {
498 flight_mode = vconf_keynode_get_bool(node);
499 if (flight_mode != TRUE) {
500 ERR("Ignore the event");
504 ERR("Flight Mode == TRUE");
507 ERR("Invaild vconf key type : %d", type);
510 DBG("Enabling core now");
511 _bt_hal_enable_core();
514 static void _bt_hal_register_vconf_handler(void)
518 if (vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
519 (vconf_callback_fn)__bt_hal_flight_ps_mode_cb, NULL) < 0)
520 ERR("Unable to register key handler");
521 DBG("Telephony is disabled");
522 if (vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE,
523 (vconf_callback_fn)__bt_hal_flight_ps_mode_cb, NULL) < 0)
524 ERR("Unable to register key handler");
527 void _bt_hal_handle_adapter_event(GVariant *msg, const char *member)
534 if (strcasecmp(member, "DeviceCreated") == 0) {
535 DBG("DeviceCreated: Unhandled");
536 } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
537 DBG("InterfacesRemoved: Unhandled");
538 } else if (strcasecmp(member, "AdvertisingEnabled") == 0) {
539 DBG("AdvertisingEnabled");
540 DBG("Advertising Enabled");
542 gboolean status = FALSE;
543 g_variant_get(msg, "(ib)", &slot_id, &status);
544 DBG("Advertising Enabled : slot_id [%d] status [%d]", slot_id, status);
545 /* Send event to application */
546 _bt_hal_set_advertising_status(slot_id, status);
547 } else if (strcasecmp(member, "RssiEnabled") == 0) {
548 struct hal_ev_rssi_monitor_state_changed ev;
549 gboolean status = FALSE;
550 char *address = NULL;
553 g_variant_get(msg, "(sib)", &address, &link_type, &status);
554 DBG("RSSI monitoring %s for %s",
555 (status ? "Enabled" : "Disabled"), address);
557 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
558 ev.link_type = link_type;
559 ev.state = (status ? HAL_RSSI_MONITORING_ENABLED : HAL_RSSI_MONITORING_DISABLED);
561 ERR("event_cb is NULL");
563 event_cb(HAL_EV_RSSI_MONITOR_STATE_CHANGED, &ev, sizeof(ev));
566 } else if (strcasecmp(member, "RssiAlert") == 0) {
567 struct hal_ev_rssi_alert_recieved ev;
571 char *address = NULL;
573 g_variant_get(msg, "(siii)", &address, &link_type, &alert_type, &rssi_dbm);
574 DBG("RSSI Alert: [Address %s LinkType %d] [Type %d DBM %d]",
575 address, alert_type, rssi_dbm, link_type);
577 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
578 ev.link_type = link_type;
579 ev.alert_type = alert_type;
583 ERR("event_cb is NULL");
585 event_cb(HAL_EV_RSSI_ALERT_RECIEVED, &ev, sizeof(ev));
588 } else if (strcasecmp(member, "RawRssi") == 0) {
589 struct hal_ev_raw_rssi_recieved ev;
592 char *address = NULL;
594 g_variant_get(msg, "(sii)", &address, &link_type, &rssi_dbm);
595 DBG("Raw RSSI: [Address %s] [Link Type %d][RSSI DBM %d]",
596 address, link_type, rssi_dbm);
598 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
599 ev.link_type = link_type;
603 ERR("event_cb is NULL");
605 event_cb(HAL_EV_RAW_RSSI_RECIEVED, &ev, sizeof(ev));
608 } else if (strcasecmp(member, BT_HAL_HARDWARE_ERROR) == 0) {
609 DBG("BT Hardware Error: Unhandled");
610 } else if (strcasecmp(member, BT_HAL_TX_TIMEOUT_ERROR) == 0) {
611 DBG("BT TX Timeout Error: Unhandled");
617 static gboolean __bt_hal_parse_device_properties(GVariant *item)
627 /* Buffer and propety count management */
628 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
629 struct hal_ev_device_found *ev = (void *) buf;
631 memset(buf, 0, sizeof(buf));
635 g_variant_iter_init(&iter, item);
636 while (g_variant_iter_loop(&iter, "{sv}", &key, &val)) {
638 if (strcasecmp(key, "Address") == 0) {
640 char * address = NULL;
641 address = g_variant_dup_string(val, &len);
643 _bt_hal_convert_addr_string_to_type(bdaddr, address);
645 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
646 sizeof(bdaddr), bdaddr);
649 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
651 } else if (strcasecmp(key, "Class") == 0) {
652 unsigned int class = g_variant_get_uint32(val);
653 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
654 sizeof(unsigned int), &class);
656 DBG("Device class [%d] Property num [%d]", class, ev->num_props);
657 } else if (strcasecmp(key, "name") == 0) {
658 char *name = g_variant_dup_string(val, &len);
660 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
661 strlen(name) + 1, name);
663 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
666 } else if (strcasecmp(key, "Connected") == 0) {
667 unsigned int connected = g_variant_get_byte(val);
669 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
670 sizeof(unsigned int), &connected);
672 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
673 } else if (strcasecmp(key, "paired") == 0) {
674 uint8_t paired = (g_variant_get_boolean(val) ? 1 : 0);
675 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
676 sizeof(uint8_t), &paired);
678 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
679 } else if (strcasecmp(key, "Trusted") == 0) {
680 uint8_t trust = (g_variant_get_boolean(val) ? 1 : 0);
681 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
682 sizeof(uint8_t), &trust);
684 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
685 } else if (strcasecmp(key, "RSSI") == 0) {
686 int rssi = g_variant_get_int16(val);
687 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
690 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
691 } else if (strcasecmp(key, "LastAddrType") == 0) {
692 /* TODO: To be handled later*/
693 } else if (!g_strcmp0(key, "IsAliasSet")) {
694 uint8_t is_alias_set = (g_variant_get_boolean(val) ? 1 : 0);
695 DBG("IsAliasSet: %s", (is_alias_set ? "TRUE" : "FALSE"));
696 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
697 sizeof(uint8_t), &is_alias_set);
699 } else if (strcasecmp(key, "UUIDs") == 0) {
704 size1 = g_variant_get_size(val);
705 DBG("UUID count from size [%zu]\n", size1);
706 int num_props_tmp = ev->num_props;
709 uuid_value = (char **)g_variant_get_strv(val, &size1);
710 for (i = 0; uuid_value[i] != NULL; i++)
712 DBG("UUID count [%d]\n", uuid_count);
713 /* UUID collection */
714 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
716 for (i = 0; uuid_value[i] != NULL; i++) {
718 char *uuid_str = NULL;
719 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
720 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
722 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
723 uuid_str = g_strdup(uuid_value[i]);
724 DBG("UUID string [%s]\n", uuid_str);
725 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
726 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
730 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
731 (BT_HAL_STACK_UUID_SIZE * uuid_count),
733 ev->num_props = num_props_tmp + 1;
737 } else if (strcasecmp(key, "LegacyManufacturerDataLen") == 0) {
738 /* TODO: To be handled later*/
739 } else if (strcasecmp(key, "LegacyManufacturerData") == 0) {
740 /* TODO: To be handled later*/
742 ERR("Unhandled Property:[%s]", key);
748 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
749 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
755 static void __bt_hal_handle_avrcp_tg_events(GVariant *msg, const char *path)
758 GVariantIter value_iter;
759 char *property = NULL;
761 GVariant *val = NULL;
762 GVariant *child = NULL;
764 g_variant_iter_init(&value_iter, msg);
765 while ((child = g_variant_iter_next_value(&value_iter))) {
766 g_variant_get(child, "{sv}", &property, &val);
767 INFO("Property %s", property);
768 if (strcasecmp(property, "Connected") == 0) {
769 struct hal_ev_avrcp_tg_conn_state ev;
771 gboolean connected = FALSE;
773 g_variant_get(val, "b", &connected);
775 state = connected ? HAL_AVRCP_TG_STATE_CONNECTED :
776 HAL_AVRCP_TG_STATE_DISCONNECTED;
778 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
780 _bt_hal_convert_device_path_to_address(path, address);
782 DBG("connected: %d", connected);
783 DBG("address: %s", address);
785 /* Prepare to send AVRCP Target connection state event */
786 memset(&ev, 0, sizeof(ev));
787 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
789 if (!avrcp_tg_event_cb)
790 ERR("AVRCP target DBUS handler callback not registered");
792 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_CONN_STATE, (void *)&ev, sizeof(ev));
796 g_variant_unref(child);
797 g_variant_unref(val);
803 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path)
805 char *interface_name = NULL;
806 GVariant *val = NULL;
809 g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, &val, NULL);
811 if (!interface_name) {
812 DBG("Failed to get interface name");
815 g_variant_unref(val);
819 if (strcasecmp(interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
820 DBG("Event: Property Changed: Interface: BT_HAL_ADAPTER_INTERFACE");
821 __bt_hal_adapter_property_changed_event(val);
822 } else if (strcasecmp(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
823 DBG("Event: Property Changed: Interface: BT_HAL_DEVICE_INTERFACE");
824 __bt_hal_device_property_changed_event(val, object_path);
825 } else if (strcasecmp(interface_name, BT_HAL_OBEX_TRANSFER_INTERFACE) == 0) {
826 DBG("Event: Property Changed: Interface: BT_HAL_OBEX_TRANSFER_INTERFACE");
827 /* TODO: Handle event */
828 } else if (strcasecmp(interface_name, BT_HAL_MEDIA_CONTROL_INTERFACE) == 0) {
829 DBG("Event: Property Changed: Interface: BT_HAL_MEDIA_CONTROL_INTERFACE");
830 /* Handle AVRCP target event */
831 __bt_hal_handle_avrcp_tg_events(val, object_path);
832 } else if (strcasecmp(interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
833 DBG("Event: Property Changed: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
834 __bt_hal_handle_avrcp_ctrl_events(val, NULL, object_path);
835 } else if (strcasecmp(interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
836 DBG("Event: Property Changed: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
837 __bt_hal_handle_avrcp_transport_events(val, NULL, object_path);
838 } else if (strcasecmp(interface_name, BT_HAL_NETWORK_CLIENT_INTERFACE) == 0) {
839 DBG("Event: Property Changed: Interface: BT_HAL_NETWORK_CLIENT_INTERFACE");
840 /* TODO: Handle event */
841 } else if (strcasecmp(interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
842 DBG("Event: Property Changed: Interface: BT_HAL_GATT_CHAR_INTERFACE");
843 /* TODO: Handle event */
844 } else if (strcasecmp(interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
845 DBG("Event: Property Changed: Interface: BT_HAL_INPUT_INTERFACE");
846 __bt_hal_handle_input_event(val, object_path);
848 g_variant_unref(val);
851 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters)
855 if (__bt_hal_parse_interface(parameters) == FALSE) {
856 ERR("Fail to parse the properies");
857 g_variant_unref(value);
864 static void __bt_hal_send_hid_connection_state_event(
865 gboolean connected, char *address)
867 struct hal_ev_hidhost_conn_state ev;
869 ev.state = (connected == TRUE) ?
870 HAL_HIDHOST_STATE_CONNECTED :
871 HAL_HIDHOST_STATE_DISCONNECTED;
873 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
876 ERR("HID event handler not registered");
878 hid_event_cb(HAL_EV_HIDHOST_CONN_STATE, &ev, sizeof(ev));
881 static void __bt_hal_handle_input_event(GVariant *msg, const char *path)
883 gboolean property_flag = FALSE;
884 GVariantIter value_iter;
885 char *property = NULL;
886 GVariant *child = NULL, *val = NULL;
889 g_variant_iter_init(&value_iter, msg);
890 while ((child = g_variant_iter_next_value(&value_iter))) {
891 g_variant_get(child, "{sv}", &property, &val);
893 if (property == NULL)
896 if (strcasecmp(property, "Connected") == 0) {
899 g_variant_get(val, "b", &property_flag);
900 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
901 _bt_hal_convert_device_path_to_address(path, address);
902 __bt_hal_send_hid_connection_state_event(property_flag, address);
906 g_variant_unref(val);
907 g_variant_unref(child);
913 static gboolean __bt_hal_parse_interface(GVariant *msg)
916 GVariant *optional_param;
919 char *interface_name = NULL;
920 GVariant *inner_iter = NULL;
921 g_variant_get(msg, "(&o@a{sa{sv}})",
922 &path, &optional_param);
923 g_variant_iter_init(&iter, optional_param);
925 while ((child = g_variant_iter_next_value(&iter))) {
926 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
927 if (g_strcmp0(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
928 DBG("Found a device: %s", path);
929 if (__bt_hal_parse_device_properties(inner_iter) == FALSE) {
930 g_variant_unref(inner_iter);
931 g_variant_unref(child);
932 g_variant_unref(optional_param);
933 ERR("Fail to parse the properies");
936 g_variant_unref(inner_iter);
937 g_variant_unref(child);
938 g_variant_unref(optional_param);
942 g_variant_unref(inner_iter);
943 g_variant_unref(child);
946 g_variant_unref(optional_param);
951 void __bt_hal_handle_gatt_char_event(GVariant *parameters, const char *signal_name)
955 if (signal_name == NULL)
958 if (strcasecmp(signal_name, "GattValueChanged") == 0) {
959 DBG("GattValueChanged event received");
962 const char *char_handle = NULL;
963 GVariant *char_value_var = NULL;
965 char *char_value = NULL;
967 g_variant_get(parameters, "(i&s@ay)", &result, &char_handle, &char_value_var);
968 DBG("char handle: %s", char_handle);
970 len = g_variant_get_size(char_value_var);
972 char_value = (char *)g_variant_get_data(char_value_var);
974 _bt_hal_handle_gattc_value_changed_event(result, char_handle, char_value, len);
976 g_variant_unref(char_value_var);
981 static gboolean __bt_hal_event_manager(gpointer data)
983 bt_hal_event_type_t bt_event = 0x00;
985 char *obj_path = NULL;
987 bt_hal_main_event_data_t *param = (bt_hal_main_event_data_t*)data;
988 if (strcasecmp(param->signal_name, "InterfacesAdded") == 0) {
990 /*TODO: Handle Interfaces Added Signal from stack */
991 DBG("Manager Event: Signal Name: InterfacesAdded");
993 g_variant_get(param->parameters, "(&o@a{sa{sv}})", &obj_path, &value);
995 if (obj_path == NULL) {
996 DBG("obj_path is NULL");
1000 if (strcasecmp(obj_path, BT_HAL_BLUEZ_HCI_PATH) == 0) {
1001 /* TODO: Handle adapter added */
1002 DBG("Manager Event: Signal Name: InterfiacesAdded: Adapter added in bluetoothd: path [hci0]");
1004 bt_event = __bt_hal_parse_event(value);
1005 if (bt_event == BT_HAL_DEVICE_EVENT) {
1006 DBG("Device path : %s ", obj_path);
1007 __bt_hal_handle_device_event(value, param->parameters);
1008 } else if (bt_event == BT_HAL_AVRCP_CONTROL_EVENT) {
1009 DBG("Device path : %s ", obj_path);
1010 _bt_hal_set_control_device_path(obj_path);
1013 g_variant_unref(value);
1015 } else if (strcasecmp(param->signal_name, "InterfacesRemoved") == 0) {
1019 /*TODO: Handle Interfaces Removed Signal from stack */
1020 DBG("Manager Event: Signal Name: InterfacesRemoved");
1022 g_variant_get(param->parameters, "(&oas)", &obj_path, &iter);
1023 DBG("Device path : %s ", obj_path);
1024 while (g_variant_iter_loop(iter, "s", &str)) {
1025 if (g_strcmp0(str, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0)
1026 _bt_hal_remove_control_device_path(obj_path);
1028 g_variant_iter_free(iter);
1029 } else if (strcasecmp(param->signal_name, "NameOwnerChanged") == 0) {
1031 char *previous = NULL;
1032 char *current = NULL;
1034 /* TODO: Handle Name Owener changed Signal */
1035 if (__bt_hal_get_owner_info(param->parameters, &name, &previous, ¤t)) {
1036 DBG("Fail to get the owner info");
1039 if (current && *current != '\0') {
1045 if (strcasecmp(name, BT_HAL_BLUEZ_NAME) == 0) {
1046 DBG("Bluetoothd is terminated");
1048 /* TODO: Handle Bluetoothd terminating scenario */
1049 _bt_hal_le_deinit();
1051 INFO("Name Owner changed [%s]", name);
1056 } else if (g_strcmp0(param->interface_name, BT_HAL_PROPERTIES_INTERFACE) == 0) {
1057 DBG("Manager Event: Interface Name: BT_HAL_PROPERTIES_INTERFACE");
1058 __bt_hal_handle_property_changed_event(param->parameters, param->object_path);
1059 } else if (g_strcmp0(param->interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
1060 DBG("Manager Event: Interface Name: BT_HAL_ADAPTER_INTERFACE");
1061 _bt_hal_handle_adapter_event(param->parameters, param->signal_name);
1062 } else if (g_strcmp0(param->interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
1063 DBG("Manager Event: Interface Name: BT_HAL_INPUT_INTERFACE");
1064 __bt_hal_handle_input_event(param->parameters, param->object_path);
1065 } else if (g_strcmp0(param->interface_name, BT_HAL_NETWORK_SERVER_INTERFACE) == 0) {
1066 /* TODO: Handle Network Server events from stack */
1067 DBG("Manager Event: Interface Name: BT_HAL_NETWORK_SERVER_INTERFACE");
1068 } else if (g_strcmp0(param->interface_name, BT_HAL_HEADSET_INTERFACE) == 0) {
1069 DBG("Manager Event: Interface Name: BT_HAL_HEADSET_INTERFACE");
1070 __bt_hal_handle_headset_events(param->parameters, param->signal_name, param->object_path);
1071 } else if (g_strcmp0(param->interface_name, BT_HAL_SINK_INTERFACE) == 0) {
1072 /* TODO: Handle Sink interface events from stack */
1073 DBG("Manager Event: Interface Name:BT_HAL_SINK_INTERFACE");
1074 } else if (g_strcmp0(param->interface_name, BT_HAL_AGENT_INTERFACE) == 0) {
1075 /* TODO: Handle Agent events from stack */
1076 DBG("Manager Event: Interface Name:BT_HAL_AGENT_INTERFACE");
1077 } else if (g_strcmp0(param->interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
1078 DBG("Manager Event: Interface Name:BT_HAL_DEVICE_INTERFACE");
1079 __bt_hal_handle_device_specific_events(param->parameters, param->signal_name, param->object_path);
1080 } else if (g_strcmp0(param->interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
1081 DBG("Manager Event: Interface Name: BT_HAL_PLAYER_CONTROL_INTERFACE");
1082 __bt_hal_handle_avrcp_ctrl_events(param->parameters, param->signal_name, param->object_path);
1083 } else if (g_strcmp0(param->interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
1084 DBG("Manager Event: Interface Name: BT_HAL_MEDIATRANSPORT_INTERFACE");
1085 __bt_hal_handle_avrcp_transport_events(param->parameters, param->signal_name, param->object_path);
1086 } else if (g_strcmp0(param->interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
1087 DBG("Manager Event: Interface Name: BT_HAL_GATT_CHAR_INTERFACE");
1088 __bt_hal_handle_gatt_char_event(param->parameters, param->signal_name);
1093 g_free(param->sender_name);
1094 g_free(param->object_path);
1095 g_free(param->interface_name);
1096 g_free(param->signal_name);
1097 g_variant_unref(param->parameters);
1102 static void __bt_hal_manager_event_filter(GDBusConnection *connection,
1103 const gchar *sender_name,
1104 const gchar *object_path,
1105 const gchar *interface_name,
1106 const gchar *signal_name,
1107 GVariant *parameters,
1110 if (signal_name == NULL)
1113 bt_hal_main_event_data_t *param = g_new0(bt_hal_main_event_data_t, 1);
1114 param->sender_name = g_strdup(sender_name);
1115 param->object_path = g_strdup(object_path);
1116 param->interface_name = g_strdup(interface_name);
1117 param->signal_name = g_strdup(signal_name);
1118 param->parameters = g_variant_ref(parameters);
1120 g_idle_add(__bt_hal_event_manager, (gpointer)param);
1124 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path)
1126 gboolean property_flag = FALSE;
1127 char *property = NULL;
1128 GVariant *value = NULL;
1129 g_variant_get(msg, "(sv)", &property, &value);
1131 if (property == NULL)
1134 DBG("Property = %s \n", property);
1135 /* We allow only 1 headset connection (HSP or HFP)*/
1136 if (strcasecmp(property, "Connected") == 0) {
1138 g_variant_get(value, "b", &property_flag);
1140 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1142 /* Fix : NULL_RETURNS */
1143 if (address == NULL)
1146 _bt_hal_convert_device_path_to_address(path, address);
1147 __bt_hal_send_hf_audio_connection_state_event(property_flag, address);
1149 } else if (strcasecmp(property, "State") == 0) {
1152 g_variant_get(value, "s", &state);
1154 /* This code assumes we support only 1 headset connection */
1155 /* Need to use the headset list, if we support multi-headsets */
1156 if (strcasecmp(state, "Playing") == 0) {
1157 DBG("Playing: Sco Connected");
1158 } else if (strcasecmp(state, "connected") == 0 ||
1159 strcasecmp(state, "disconnected") == 0) {
1160 if (strcasecmp(state, "connected") == 0)
1161 DBG("Sco Connected");
1163 DBG("Sco Disconnected");
1165 ERR("Not handled state - %s", state);
1170 } else if (strcasecmp(property, "SpeakerGain") == 0) {
1173 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1175 _bt_hal_convert_device_path_to_address(path, address);
1176 INFO("Speaker Gain for address [%s]", address);
1177 /* TODO Handle event sending to HAL */
1180 } else if (strcasecmp(property, "MicrophoneGain") == 0) {
1183 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1185 _bt_hal_convert_device_path_to_address(path, address);
1186 INFO("Microphone Gain for address [%s]", address);
1187 /* TODO Handle event sending to HAL */
1194 g_variant_unref(value);
1197 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn,
1203 static int subs_interface_added_id = -1;
1204 static int subs_interface_removed_id = -1;
1205 static int subs_name_owner_id = -1;
1206 static int subs_property_id = -1;
1207 static int subs_adapter_id = -1;
1212 if (subs_interface_added_id == -1) {
1213 subs_interface_added_id = g_dbus_connection_signal_subscribe(conn,
1214 NULL, BT_HAL_MANAGER_INTERFACE,
1215 BT_HAL_INTERFACES_ADDED, NULL, NULL, 0,
1216 __bt_hal_manager_event_filter,
1219 if (subs_interface_removed_id == -1) {
1220 subs_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
1221 NULL, BT_HAL_MANAGER_INTERFACE,
1222 BT_HAL_INTERFACES_REMOVED, NULL, NULL, 0,
1223 __bt_hal_manager_event_filter,
1226 if (subs_name_owner_id == -1) {
1227 subs_name_owner_id = g_dbus_connection_signal_subscribe(conn,
1228 NULL, BT_HAL_FREEDESKTOP_INTERFACE,
1229 BT_HAL_NAME_OWNER_CHANGED, NULL, NULL, 0,
1230 __bt_hal_manager_event_filter,
1233 if (subs_property_id == -1) {
1234 subs_property_id = g_dbus_connection_signal_subscribe(conn,
1235 NULL, BT_HAL_PROPERTIES_INTERFACE,
1236 BT_HAL_PROPERTIES_CHANGED, NULL, NULL, 0,
1237 __bt_hal_manager_event_filter,
1240 if (subs_adapter_id == -1) {
1241 subs_adapter_id = g_dbus_connection_signal_subscribe(conn,
1242 NULL, BT_HAL_ADAPTER_INTERFACE,
1243 NULL, NULL, NULL, 0,
1244 __bt_hal_manager_event_filter,
1248 if (subs_interface_added_id != -1) {
1249 g_dbus_connection_signal_unsubscribe(conn,
1250 subs_interface_added_id);
1251 subs_interface_added_id = -1;
1253 if (subs_interface_removed_id != -1) {
1254 g_dbus_connection_signal_unsubscribe(conn,
1255 subs_interface_removed_id);
1256 subs_interface_removed_id = -1;
1258 if (subs_name_owner_id != -1) {
1259 g_dbus_connection_signal_unsubscribe(conn,
1260 subs_name_owner_id);
1261 subs_name_owner_id = -1;
1263 if (subs_property_id != -1) {
1264 g_dbus_connection_signal_unsubscribe(conn,
1266 subs_property_id = -1;
1268 if (subs_adapter_id == -1) {
1269 g_dbus_connection_signal_unsubscribe(conn, subs_adapter_id);
1270 subs_adapter_id = -1;
1278 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn,
1281 static int subs_device_id = -1;
1288 if (subs_device_id == -1) {
1289 subs_device_id = g_dbus_connection_signal_subscribe(conn,
1290 NULL, BT_HAL_DEVICE_INTERFACE,
1291 NULL, NULL, NULL, 0,
1292 __bt_hal_manager_event_filter,
1296 if (subs_device_id != -1) {
1297 g_dbus_connection_signal_unsubscribe(conn,
1299 subs_device_id = -1;
1307 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe)
1309 static int subs_input_id = -1;
1317 if (subs_input_id == -1) {
1318 subs_input_id = g_dbus_connection_signal_subscribe(conn,
1319 NULL, BT_HAL_INPUT_INTERFACE,
1320 NULL, NULL, NULL, 0,
1321 __bt_hal_manager_event_filter,
1325 if (subs_input_id != -1) {
1326 g_dbus_connection_signal_unsubscribe(conn,
1337 static int __bt_hal_register_gatt_subscribe_signal(GDBusConnection *conn,
1340 static int subs_gatt_id = -1;
1345 if (subs_gatt_id == -1) {
1346 subs_gatt_id = g_dbus_connection_signal_subscribe(conn,
1347 NULL, BT_HAL_GATT_CHAR_INTERFACE,
1348 NULL, NULL, NULL, 0,
1349 __bt_hal_manager_event_filter,
1353 if (subs_gatt_id == -1) {
1354 g_dbus_connection_signal_unsubscribe(conn,
1360 return BT_HAL_ERROR_NONE;
1365 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type)
1370 return BT_HAL_ERROR_INTERNAL;
1372 /* TODO: Add more events in subsequent patches */
1373 switch (event_type) {
1374 case BT_HAL_MANAGER_EVENT:
1375 __bt_hal_register_manager_subscribe_signal(g_conn, TRUE);
1377 case BT_HAL_DEVICE_EVENT:
1378 __bt_hal_register_device_subscribe_signal(g_conn, TRUE);
1380 case BT_HAL_HID_EVENT:
1381 __bt_hal_register_input_subscribe_signal(g_conn, TRUE);
1383 case BT_HAL_HEADSET_EVENT:
1384 __bt_hal_register_audio_subscribe_signal(g_conn, TRUE);
1386 case BT_HAL_GATT_EVENT:
1387 __bt_hal_register_gatt_subscribe_signal(g_conn, TRUE);
1390 INFO_C("Register Event: event_type [%d]", event_type);
1391 return BT_HAL_ERROR_NOT_SUPPORT;
1394 return BT_HAL_ERROR_NONE;
1397 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn,
1403 static int subs_headset_id = -1;
1404 static int subs_sink_id = -1;
1407 if (subs_headset_id == -1) {
1408 subs_headset_id = g_dbus_connection_signal_subscribe(conn,
1409 NULL, BT_HAL_HEADSET_INTERFACE,
1410 NULL, NULL, NULL, 0,
1411 __bt_hal_manager_event_filter,
1414 if (subs_sink_id == -1) {
1415 subs_sink_id = g_dbus_connection_signal_subscribe(conn,
1416 NULL, BT_HAL_SINK_INTERFACE,
1417 NULL, NULL, NULL, 0,
1418 __bt_hal_manager_event_filter,
1422 if (subs_headset_id != -1) {
1423 g_dbus_connection_signal_unsubscribe(conn,
1425 subs_headset_id = -1;
1427 if (subs_sink_id != -1) {
1428 g_dbus_connection_signal_unsubscribe(conn,
1436 static int __bt_hal_initialize_manager_receiver(void)
1440 GError *error = NULL;
1442 if (manager_conn == NULL) {
1443 manager_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1444 if (error != NULL) {
1445 ERR_C("ERROR: Can't get on system bus [%s]", error->message);
1446 g_clear_error(&error);
1448 if (manager_conn == NULL)
1452 if (__bt_hal_register_service_event(manager_conn,
1453 BT_HAL_MANAGER_EVENT) != BT_HAL_ERROR_NONE)
1455 if (__bt_hal_register_service_event(manager_conn,
1456 BT_HAL_DEVICE_EVENT) != BT_HAL_ERROR_NONE)
1458 if (__bt_hal_register_service_event(manager_conn,
1459 BT_HAL_HID_EVENT) != BT_HAL_ERROR_NONE)
1461 if (__bt_hal_register_service_event(manager_conn,
1462 BT_HAL_HEADSET_EVENT) != BT_HAL_ERROR_NONE)
1464 if (__bt_hal_register_service_event(manager_conn,
1465 BT_HAL_GATT_EVENT) != BT_HAL_ERROR_NONE)
1467 return BT_HAL_ERROR_NONE;
1470 g_object_unref(manager_conn);
1471 manager_conn = NULL;
1476 return BT_HAL_ERROR_INTERNAL;
1479 /* To receive the event from bluez */
1480 int _bt_hal_initialize_event_receiver(handle_stack_msg cb)
1486 return BT_HAL_ERROR_INVALID_PARAM;
1488 result = __bt_hal_initialize_manager_receiver();
1490 DBG("Manager event receiver initialization result [%d]", result);
1491 if (result != BT_HAL_ERROR_NONE)
1494 /*TODO: Initialize Obexd Event receiver */
1496 /* Initialize event receiver for flight mode */
1497 _bt_hal_register_vconf_handler();
1502 return BT_HAL_ERROR_NONE;
1505 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path)
1507 GVariantIter value_iter;
1508 GVariant *value = NULL;
1510 g_variant_iter_init(&value_iter, msg);
1513 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
1514 if (!g_strcmp0(key, "Connected")) {
1515 guint connected = 0;
1516 g_variant_get(value, "i", &connected);
1517 DBG("Device property changed : Connected [%d]", connected);
1518 } else if (!g_strcmp0(key, "RSSI")) {
1519 DBG("Device property changed : RSSI");
1520 __bt_hal_dbus_device_found_properties(path);
1521 } else if (!g_strcmp0(key, "GattConnected")) {
1522 DBG("Device property changed : GattConnected");
1523 gboolean gatt_connected = FALSE;
1524 g_variant_get(value, "b", &gatt_connected);
1525 char *address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1526 _bt_hal_convert_device_path_to_address(path, address);
1527 DBG("@@gatt_connected: %d", gatt_connected);
1528 DBG("@@address: %s", address);
1529 _bt_hal_gatt_connected_state_event(gatt_connected, address);
1530 _bt_hal_handle_gattc_connected_event(address, gatt_connected);
1532 } else if (!g_strcmp0(key, "Paired")) {
1533 gboolean paired = FALSE;
1534 struct hal_ev_bond_state_changed ev;
1535 char address[BT_HAL_ADDRESS_STRING_SIZE];
1537 g_variant_get(value, "b", &paired);
1538 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1540 _bt_hal_agent_set_canceled(FALSE);
1541 _bt_hal_convert_device_path_to_address(path, address);
1543 /* Prepare to send event to HAL bluetooth */
1544 ev.status = BT_STATUS_SUCCESS;
1545 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1546 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1549 ERR("Bluetooth HAL event handler not registered");
1551 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
1552 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1554 } else if (!g_strcmp0(key, "LegacyPaired")) {
1555 DBG("Device property changed : LegacyPaired");
1556 } else if (!g_strcmp0(key, "Trusted")) {
1557 DBG("Device property changed : Trusted");
1558 gboolean trusted = FALSE;
1559 gchar *address = NULL;
1560 g_variant_get(value, "b", &trusted);
1561 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1563 _bt_hal_convert_device_path_to_address(path, address);
1564 DBG("Device [%s] trusted: [%d]", address, trusted);
1566 __bt_hal_send_device_trust_state_event(trusted, address);
1568 } else if (!g_strcmp0(key, "IpspConnected")) {
1569 DBG("Device property changed : IpspConnected");
1570 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
1571 DBG("Device property changed : IpspInitStateChanged");
1572 } else if (!g_strcmp0(key, "TrustedProfiles")) {
1574 char address[BT_HAL_ADDRESS_STRING_SIZE];
1576 g_variant_get(value, "u", &trust_val);
1577 _bt_hal_convert_device_path_to_address(path, address);
1578 DBG("Address: %s, TrustedProfiles: 0x%X", address, trust_val);
1579 __bt_hal_send_device_trusted_profile_changed_event(trust_val, address);
1581 ERR("Unhandled Property:[%s]", key);
1587 static void __bt_hal_dbus_device_found_properties(const char *device_path)
1590 GError *error = NULL;
1591 GDBusProxy *device_proxy;
1592 GDBusConnection *conn;
1597 ERR("Invalid device path");
1601 conn = _bt_hal_get_system_gconn();
1603 ERR("_bt_hal_get_system_gconn failed");
1607 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1611 BT_HAL_PROPERTIES_INTERFACE,
1614 if (!device_proxy) {
1615 ERR("Error creating device_proxy");
1619 result = g_dbus_proxy_call_sync(device_proxy,
1621 g_variant_new("(s)", BT_HAL_DEVICE_INTERFACE),
1622 G_DBUS_CALL_FLAGS_NONE,
1627 ERR("Error occured in Proxy call");
1628 if (error != NULL) {
1629 ERR("Error occured in Proxy call (Error: %s)", error->message);
1630 g_clear_error(&error);
1632 g_object_unref(device_proxy);
1636 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1637 _bt_hal_convert_device_path_to_address(device_path, address);
1639 __bt_hal_device_properties_lookup(result, address);
1641 g_object_unref(device_proxy);
1647 static void __bt_hal_device_properties_lookup(GVariant *result, char *address)
1649 /* Buffer and propety count management */
1650 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
1651 struct hal_ev_device_found *ev = (void *) buf;
1653 memset(buf, 0, sizeof(buf));
1657 GVariant *tmp_value;
1660 gchar *manufacturer_data = NULL;
1663 if (result != NULL) {
1664 g_variant_get(result , "(@a{sv})", &value);
1665 g_variant_unref(result);
1668 tmp_value = g_variant_lookup_value(value, "Alias", G_VARIANT_TYPE_STRING);
1670 g_variant_get(tmp_value, "s", &name);
1672 g_variant_unref(tmp_value);
1674 DBG_SECURE("Alias Name [%s]", name);
1675 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1676 strlen(name) + 1, name);
1678 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1681 tmp_value = g_variant_lookup_value(value, "Name", G_VARIANT_TYPE_STRING);
1682 g_variant_get(tmp_value, "s", &name);
1683 g_variant_unref(tmp_value);
1685 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1686 strlen(name) + 1, name);
1688 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1689 g_variant_get(tmp_value, "s", &name);
1693 tmp_value = g_variant_lookup_value(value, "Class", G_VARIANT_TYPE_UINT32);
1694 unsigned int class = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1695 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
1696 sizeof(unsigned int), &class);
1699 g_variant_unref(tmp_value);
1703 tmp_value = g_variant_lookup_value(value, "Connected", G_VARIANT_TYPE_BOOLEAN);
1704 unsigned int connected = tmp_value ? g_variant_get_boolean(tmp_value) : 0;
1705 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
1706 sizeof(unsigned int), &connected);
1708 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
1710 g_variant_unref(tmp_value);
1713 tmp_value = g_variant_lookup_value(value, "Trusted", G_VARIANT_TYPE_BOOLEAN);
1714 uint8_t trust = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1715 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
1716 sizeof(uint8_t), &trust);
1718 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
1720 g_variant_unref(tmp_value);
1723 tmp_value = g_variant_lookup_value(value, "Paired", G_VARIANT_TYPE_BOOLEAN);
1724 uint8_t paired = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1726 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
1727 sizeof(uint8_t), &paired);
1729 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
1731 g_variant_unref(tmp_value);
1734 tmp_value = g_variant_lookup_value(value, "RSSI", G_VARIANT_TYPE_INT32);
1735 int rssi = tmp_value ? g_variant_get_int32(tmp_value) : 0;
1736 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
1737 sizeof(int), &rssi);
1739 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
1741 g_variant_unref(tmp_value);
1743 /* Last Addr Type */
1744 tmp_value = g_variant_lookup_value(value, "LastAddrType", G_VARIANT_TYPE_UINT32);
1745 unsigned int addr_type = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1747 g_variant_unref(tmp_value);
1748 DBG("Device Last Address Type [0x%x]", addr_type);
1751 tmp_value = g_variant_lookup_value(value, "IsAliasSet", G_VARIANT_TYPE_UINT32);
1752 uint8_t is_alias_set = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1753 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
1754 sizeof(uint8_t), &is_alias_set);
1756 DBG("IsAliasSet: [%s], Property num [%d]", (is_alias_set ? "TRUE" : "FALSE"), ev->num_props);
1758 g_variant_unref(tmp_value);
1761 tmp_value = g_variant_lookup_value(value, "UUIDs", G_VARIANT_TYPE_STRING_ARRAY);
1762 gsize uuid_count = g_variant_get_size(tmp_value);
1763 char **uuid_value = g_variant_dup_strv(tmp_value, &uuid_count);
1765 /* UUID collection */
1770 int num_props_tmp = ev->num_props;
1772 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
1774 for (i = 0; uuid_value[i] != NULL; i++) {
1776 char *uuid_str = NULL;
1777 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
1778 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
1780 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
1781 uuid_str = g_strdup(uuid_value[i]);
1782 DBG("UUID string [%s]\n", uuid_str);
1784 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
1786 for (z = 0; z < 16; z++)
1787 DBG("[0x%x]", uuid[z]);
1790 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
1794 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
1795 (BT_HAL_STACK_UUID_SIZE * uuid_count),
1797 ev->num_props = num_props_tmp + 1;
1800 g_variant_unref(tmp_value);
1802 /* LegacyManufacturerDataLen */
1803 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerDataLen", G_VARIANT_TYPE_UINT32);
1804 unsigned int manufacturer_data_len = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1805 if (manufacturer_data_len > BT_HAL_MANUFACTURER_DATA_LENGTH_MAX) {
1806 ERR("manufacturer_data_len is too long(len = %d)", manufacturer_data_len);
1807 manufacturer_data_len = BT_HAL_MANUFACTURER_DATA_LENGTH_MAX;
1810 g_variant_unref(tmp_value);
1811 /*size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA_LEN,
1812 sizeof(unsigned int), &manufacturer_data_len);
1814 DBG("Device Legacy Manufacturer data length [%u]", manufacturer_data_len);
1816 /* ManufacturerData */
1817 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerData", G_VARIANT_TYPE_BYTESTRING);
1818 manufacturer_data = value ? (gchar *)g_variant_get_bytestring(tmp_value) : NULL;
1819 if (manufacturer_data) {
1820 if (manufacturer_data_len > 0) {
1821 //size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA,
1822 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_BLE_ADV_DATA,
1823 manufacturer_data_len, manufacturer_data);
1828 g_variant_unref(tmp_value);
1832 _bt_hal_convert_addr_string_to_type(bdaddr, address);
1833 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
1834 sizeof(bdaddr), bdaddr);
1836 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
1839 g_variant_unref(value);
1841 ERR("result is NULL\n");
1844 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
1845 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
1850 static void __bt_hal_send_device_acl_connection_state_event(int status, gboolean connected, const char *address)
1853 struct hal_ev_acl_state_changed ev;
1856 ev.state = (connected == TRUE) ?
1857 HAL_ACL_STATE_CONNECTED :
1858 HAL_ACL_STATE_DISCONNECTED;
1860 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1863 ERR("Bluetooth HAL event handler not registered");
1865 event_cb(HAL_EV_ACL_STATE_CHANGED, &ev, sizeof(ev));
1869 static void __bt_hal_send_device_le_connection_state_event(int status, gboolean connected, const char *address)
1872 struct hal_ev_le_conn_state_changed ev;
1875 ev.state = (connected == TRUE) ?
1876 HAL_LE_STATE_CONNECTED :
1877 HAL_LE_STATE_DISCONNECTED;
1879 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1882 ERR("Bluetooth HAL event handler not registered");
1884 event_cb(HAL_EV_LE_CONN_STATE_CHANGED, &ev, sizeof(ev));
1888 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted,
1889 const char *address)
1891 struct hal_ev_device_trust_state_changed ev;
1894 ev.trust = (is_trusted == TRUE) ?
1895 HAL_DEVICE_TRUSTED :
1896 HAL_DEVICE_UNTRUSTED;
1898 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1901 ERR("Bluetooth HAL event handler not registered");
1903 event_cb(HAL_EV_DEVICE_TRUST_CHANGED, &ev, sizeof(ev));
1907 static void __bt_hal_send_device_trusted_profile_changed_event(
1908 uint32_t trust_val, const char *address)
1910 struct hal_ev_device_trusted_profiles_changed ev;
1913 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1914 ev.trust_val = trust_val;
1917 ERR("Bluetooth HAL event handler not registered");
1919 event_cb(HAL_EV_DEVICE_TRUSTED_PROFILES_CHANGED, &ev, sizeof(ev));
1923 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member,
1927 const char *property = NULL;
1931 if (strcasecmp(member, "PropertyChanged") == 0) {
1932 g_variant_get(msg, "(s)", &property);
1933 if (property == NULL)
1935 if (strcasecmp(property, "GattConnected") == 0) {
1936 INFO("GATT Connected");
1937 gboolean connected = FALSE;
1939 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1941 _bt_hal_convert_device_path_to_address(path, address);
1942 g_variant_get(msg, "(b)", &connected);
1944 INFO("Connected device address[%s] connnected[%d]", address, connected);
1946 } else if (strcasecmp(property, "Paired") == 0) {
1947 gboolean paired = FALSE;
1948 struct hal_ev_bond_state_changed ev;
1949 char address[BT_HAL_ADDRESS_STRING_SIZE];
1951 g_variant_get(msg, "(b)", &paired);
1952 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1954 _bt_hal_agent_set_canceled(FALSE);
1955 _bt_hal_convert_device_path_to_address(path, address);
1957 /* Prepare to send event to HAL bluetooth */
1958 ev.status = BT_STATUS_SUCCESS;
1959 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1960 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1963 ERR("Bluetooth HAL event handler not registered");
1965 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
1966 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1968 } else if (strcasecmp(property, "UUIDs") == 0) {
1971 } else if (strcasecmp(member, "DeviceConnected") == 0) {
1972 unsigned char addr_type = 0;
1974 g_variant_get(msg, "(y)", &addr_type);
1976 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1977 _bt_hal_convert_device_path_to_address(path, address);
1979 DBG("Member: [%s]", member);
1980 ERR_C("Connected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
1982 __bt_hal_send_device_acl_connection_state_event(BT_STATUS_SUCCESS, TRUE, address);
1984 __bt_hal_send_device_le_connection_state_event(BT_STATUS_SUCCESS, TRUE, address);
1986 } else if (strcasecmp(member, "Disconnected") == 0) {
1987 unsigned char disc_reason = 0;
1988 unsigned char addr_type = 0;
1991 g_variant_get(msg, "(yy&s)", &addr_type, &disc_reason, &name);
1993 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1994 _bt_hal_convert_device_path_to_address(path, address);
1996 DBG("Member: [%s]", member);
1998 ERR_C("DisConnected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
1999 DBG("Disconnected Reason [%d : %s]", disc_reason, _bt_hal_convert_disc_reason_to_string(disc_reason));
2000 DBG("Name: %s", name);
2002 __bt_hal_send_device_acl_connection_state_event(_bt_hal_convert_disc_reason_to_status(disc_reason), FALSE, address);
2004 __bt_hal_send_device_le_connection_state_event(_bt_hal_convert_disc_reason_to_status(disc_reason), FALSE, address);
2006 } else if (strcasecmp(member, "ProfileStateChanged") == 0) {
2008 char *profile_uuid = NULL;
2010 g_variant_get(msg, "(si)", &profile_uuid, &state);
2011 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2012 _bt_hal_convert_device_path_to_address(path, address);
2014 DBG("Address: %s", address);
2015 DBG("Profile UUID: %s", profile_uuid);
2016 DBG("State: %d", state);
2017 if (strncmp(profile_uuid, HID_UUID, strlen(HID_UUID)) == 0) {
2018 if (state == BT_HAL_PROFILE_STATE_CONNECTED)
2019 __bt_hal_send_hid_connection_state_event(TRUE, address);
2020 else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED)
2021 __bt_hal_send_hid_connection_state_event(FALSE, address);
2023 DBG("Profile state: %d", state);
2025 } else if ((strncmp(profile_uuid, A2DP_SINK_UUID, strlen(A2DP_SINK_UUID)) == 0)) {
2026 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2027 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTED");
2028 __bt_hal_send_av_connection_state_event(TRUE, address);
2029 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2030 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2031 __bt_hal_send_av_connection_state_event(FALSE, address);
2032 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2033 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2034 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2035 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTING");
2037 ERR("A2DP Profile state: Invalid");
2039 } else if ((strncmp(profile_uuid, A2DP_SOURCE_UUID, strlen(A2DP_SOURCE_UUID)) == 0)) {
2040 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2041 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
2042 __bt_hal_send_a2dp_sink_connection_state_event(TRUE, address);
2043 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2044 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
2045 __bt_hal_send_a2dp_sink_connection_state_event(FALSE, address);
2046 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2047 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
2048 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2049 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
2051 } else if (strncmp(profile_uuid, HFP_HF_UUID, strlen(HFP_HF_UUID)) == 0) {
2052 if (state == BT_HAL_PROFILE_STATE_CONNECTING)
2053 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTING");
2054 else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2055 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTED");
2056 __bt_hal_send_hf_connection_state_event(TRUE, address);
2057 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2058 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2059 __bt_hal_send_hf_connection_state_event(FALSE, address);
2060 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2061 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2063 ERR("HFP Profile state: Invalid");
2065 } else if ((strncmp(profile_uuid, AVRCP_TARGET_UUID, strlen(AVRCP_TARGET_UUID)) == 0)) {
2066 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2067 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
2068 __bt_hal_send_avrcp_ctrl_connection_state_event(TRUE, address);
2069 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2070 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
2071 __bt_hal_send_avrcp_ctrl_connection_state_event(FALSE, address);
2072 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2073 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
2074 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2075 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
2078 DBG("Profile[%s] State changed status [%d] ", profile_uuid, state);
2081 g_free(profile_uuid);
2082 } else if (strcasecmp(member, "AdvReport") == 0) {
2083 DBG("Member: [%s]", member);
2084 __bt_hal_handle_adv_report(msg, path);
2088 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path)
2090 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
2091 struct hal_ev_gatt_client_scan_result *ev = (void *)buf;
2093 char *address = NULL;
2094 GVariant *value = NULL;
2095 char *buffer = NULL;
2098 uint8_t addr_type = 0;
2099 uint8_t adv_type = 0;
2105 memset(buf, 0, sizeof(buf));
2108 g_variant_get(msg, "(&syyii@ay)", &address, &addr_type,
2109 &adv_type, &rssi, &data_len, &value);
2111 buffer_len = g_variant_get_size(value);
2113 buffer = (char *)g_variant_get_data(value);
2115 if (data_len != buffer_len) {
2116 ERR("Unexpected: buffer_len: %d, data_len: %d",
2117 buffer_len, data_len);
2118 data_len = buffer_len;
2121 DBG("Address: %s, len: %d, rssi: %d, addr_type: 0x%02X, adv_type: 0x%02X",
2122 address, data_len, rssi, addr_type, adv_type);
2124 _bt_hal_convert_addr_string_to_type(ev->bd_addr, address);
2125 ev->addr_type = addr_type;
2126 ev->adv_type = adv_type;
2129 memcpy(ev->adv_data, buffer, data_len);
2132 DBG("Send le scan result event to HAL, size: [%zd]", size);
2133 gatt_event_cb(HAL_EV_GATT_CLIENT_SCAN_RESULT, buf, size);
2134 g_variant_unref(value);
2137 /* AVRCP Controller Role(Remote:AVRCP Target) Events */
2138 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address)
2141 struct hal_ev_avrcp_ctrl_conn_state ev;
2143 if (connected == TRUE)
2144 INFO("AVRCP(Controller) Profile Connected for address [%s]", address);
2146 INFO("AVRCP(Controller) Profile DisConnected for address [%s]", address);
2148 if (connected == TRUE)
2149 ev.state = HAL_AVRCP_CTRL_STATE_CONNECTED;
2151 ev.state = HAL_AVRCP_CTRL_STATE_DISCONNECTED;
2152 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2154 if (!a2dp_sink_event_cb)
2155 ERR("AV event handler not registered");
2157 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_CONN_STATE, &ev, sizeof(ev));
2160 static int __bt_media_attr_to_type(const char *str)
2162 if (!strcasecmp(str, "Equalizer"))
2163 return HAL_PLAYER_ATTR_EQUALIZER;
2164 else if (!strcasecmp(str, "Repeat"))
2165 return HAL_PLAYER_ATTR_REPEAT;
2166 else if (!strcasecmp(str, "Shuffle"))
2167 return HAL_PLAYER_ATTR_SHUFFLE;
2168 else if (!strcasecmp(str, "Scan"))
2169 return HAL_PLAYER_ATTR_SCAN;
2175 static int __bt_hal_play_status_str_to_type(const char *value)
2177 if (!strcmp(value, "stopped"))
2178 return HAL_PLAYSTATE_STOPPED;
2179 else if (!strcmp(value, "playing"))
2180 return HAL_PLAYSTATE_PLAYING;
2181 else if (!strcmp(value, "paused"))
2182 return HAL_PLAYSTATE_PAUSED;
2183 else if (!strcmp(value, "forward-seek"))
2184 return HAL_PLAYSTATE_FWD_SEEK;
2185 else if (!strcmp(value, "reverse-seek"))
2186 return HAL_PLAYSTATE_REV_SEEK;
2188 return HAL_PLAYSTATE_ERROR;
2191 static void __bt_avrcp_control_parse_properties(struct hal_ev_track_changed *ev, GVariant *item)
2193 GVariant *value = NULL;
2195 char *value_string = NULL;
2196 const char *key = NULL;
2202 g_variant_iter_init(&iter, item);
2203 while (g_variant_iter_loop(&iter, "{sv}", &key, &value)) {
2204 if (strcasecmp(key, "Title") == 0) {
2205 value_string = (char *)g_variant_get_string(value, NULL);
2206 DBG("Value : %s ", value_string);
2207 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TITLE;
2208 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2210 } else if (strcasecmp(key, "Artist") == 0) {
2211 value_string = (char *)g_variant_get_string(value, NULL);
2212 DBG("Value : %s ", value_string);
2213 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ARTIST;
2214 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2216 } else if (strcasecmp(key, "Album") == 0) {
2217 value_string = (char *)g_variant_get_string(value, NULL);
2218 DBG("Value : %s ", value_string);
2219 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ALBUM;
2220 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2222 } else if (strcasecmp(key, "Genre") == 0) {
2223 value_string = (char *)g_variant_get_string(value, NULL);
2224 DBG("Value : %s ", value_string);
2225 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_GENRE;
2226 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2228 } else if (strcasecmp(key, "Duration") == 0) {
2231 val = g_variant_get_uint32(value);
2232 DBG("Value : %li", val);
2233 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_PLAYING_TIME;
2234 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2236 } else if (strcasecmp(key, "NumberOfTracks") == 0) {
2239 val = g_variant_get_uint32(value);
2240 DBG("Value : %li", val);
2241 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_NUM_TRACKS;
2242 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2244 } else if (strcasecmp(key, "TrackNumber") == 0) {
2247 val = g_variant_get_uint32(value);
2248 DBG("Value : %li", val);
2249 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TRACK_NUM;
2250 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2253 DBG("%s not supported, ignoring", key);
2256 if (i >= HAL_MAX_ATTR_NUM) {
2257 ERR(" Received max attribute [%d]", i);
2263 g_variant_iter_free(&iter);
2267 static int __bt_media_attrval_to_val(int type, const char *value)
2272 case HAL_PLAYER_ATTR_EQUALIZER:
2273 if (!strcmp(value, "off"))
2278 case HAL_PLAYER_ATTR_REPEAT:
2279 if (!strcmp(value, "off"))
2280 ret = BTRC_PLAYER_VAL_OFF_REPEAT;
2281 else if (!strcmp(value, "singletrack"))
2282 ret = BTRC_PLAYER_VAL_SINGLE_REPEAT;
2283 else if (!strcmp(value, "alltracks"))
2284 ret = BTRC_PLAYER_VAL_ALL_REPEAT;
2286 ret = BTRC_PLAYER_VAL_GROUP_REPEAT;
2288 case HAL_PLAYER_ATTR_SHUFFLE:
2289 if (!strcmp(value, "off"))
2290 ret = BTRC_PLAYER_VAL_OFF_SHUFFLE;
2291 else if (!strcmp(value, "alltracks"))
2292 ret = BTRC_PLAYER_VAL_ALL_SHUFFLE;
2294 ret = BTRC_PLAYER_VAL_GROUP_SHUFFLE;
2296 case HAL_PLAYER_ATTR_SCAN:
2297 if (!strcmp(value, "off"))
2299 else if (!strcmp(value, "alltracks"))
2305 ERR("Value not handled");
2311 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member,
2314 const char *property = NULL;
2315 GVariant *value = NULL;
2317 char address[BT_HAL_ADDRESS_STRING_SIZE];
2320 ERR("Error returned in method call\n");
2324 if (!avrcp_ctrl_event_cb) {
2325 ERR("AVRCP controller DBUS handler callback not registered");
2329 g_variant_iter_init(&iter, msg);
2331 _bt_hal_convert_device_path_to_address(path, address);
2333 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2334 DBG("Property = %s \n", property);
2335 if ((strcasecmp(property, "Equalizer") == 0) ||
2336 (strcasecmp(property, "Repeat") == 0) ||
2337 (strcasecmp(property, "Shuffle") == 0) ||
2338 (strcasecmp(property, "Scan") == 0)) {
2339 struct hal_ev_player_setting ev;
2343 valstr = g_variant_get_string(value, NULL);
2344 DBG("Value : %s ", valstr);
2347 val = __bt_media_attrval_to_val(__bt_media_attr_to_type(property), valstr);
2350 memset(&ev, 0, sizeof(ev));
2351 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2353 ev.attr_ids[0] = __bt_media_attr_to_type(property);
2354 ev.attr_values[0] = val;
2356 /* Send event to application */
2357 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAYER_APP_SETTING_CHANGED, &ev, sizeof(ev));
2359 } else if ((strcasecmp(property, "Status") == 0)) {
2360 struct hal_ev_play_status_changed ev;
2363 valstr = g_variant_get_string(value, NULL);
2364 DBG("Value : %s ", valstr);
2366 memset(&ev, 0, sizeof(ev));
2367 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2369 ev.status = __bt_hal_play_status_str_to_type(valstr);
2371 /* Send event to application */
2372 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_STATUS_CHANGED, &ev, sizeof(ev));
2374 } else if (strcasecmp(property, "Position") == 0) {
2375 struct hal_ev_play_position ev;
2377 memset(&ev, 0, sizeof(ev));
2378 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2379 ev.pos = g_variant_get_uint32(value);
2380 DBG("Value : %d ", ev.pos);
2382 /* Send event to application */
2383 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_POSITION_CHANGED, &ev, sizeof(ev));
2384 } else if (strcasecmp(property, "Track") == 0) {
2385 struct hal_ev_track_changed ev;
2387 memset(&ev, 0, sizeof(ev));
2388 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2389 __bt_avrcp_control_parse_properties(&ev, value);
2391 /* Send event to application */
2392 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_TRACK_CHANGED, &ev, sizeof(ev));
2394 DBG("Property not handled");
2398 g_free((char *)property);
2399 g_variant_unref(value);
2402 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member,
2405 const char *property = NULL;
2406 GVariant *value = NULL;
2408 char address[BT_HAL_ADDRESS_STRING_SIZE];
2412 ERR("Error returned in method call\n");
2416 if (!avrcp_tg_event_cb) {
2417 ERR("AVRCP target DBUS handler callback not registered");
2421 g_variant_iter_init(&iter, msg);
2423 _bt_hal_convert_device_path_to_address(path, address);
2425 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2426 DBG("Property = %s \n", property);
2427 if ((strcasecmp(property, "Delay") == 0)) {
2428 struct hal_ev_avrcp_tg_delay_changed ev;
2431 memset(&ev, 0, sizeof(ev));
2432 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2434 val = g_variant_get_uint16(value);
2435 DBG("Value : %d", val);
2438 /* Send event to application */
2439 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_DELAY_CHANGE, &ev, sizeof(ev));
2441 DBG("Property not handled");
2446 g_free((char *)property);
2447 g_variant_unref(value);
2450 /* A2DP Src Role(Remote:Sink) Events */
2451 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address)
2454 struct hal_ev_a2dp_conn_state ev;
2456 if (connected == TRUE)
2457 INFO("A2DP(Src) Profile Connected for address [%s]", address);
2459 INFO("A2DP(Src) Profile DisConnected for address [%s]", address);
2461 ev.state = (connected == TRUE) ?
2462 HAL_EV_A2DP_STATE_CONNECTED :
2463 HAL_EV_A2DP_STATE_DISCONNECTED;
2465 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2468 ERR("AV event handler not registered");
2470 av_event_cb(HAL_EV_A2DP_CONN_STATE, &ev, sizeof(ev));
2473 /* A2DP Sink Role(Remote:Source) Events */
2474 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address)
2477 struct hal_ev_a2dp_conn_state ev;
2479 if (connected == TRUE)
2480 INFO("A2DP(Sink) Profile Connected for address [%s]", address);
2482 INFO("A2DP(Sink) Profile DisConnected for address [%s]", address);
2484 ev.state = (connected == TRUE) ?
2485 HAL_EV_A2DP_STATE_CONNECTED :
2486 HAL_EV_A2DP_STATE_DISCONNECTED;
2488 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2490 if (!a2dp_sink_event_cb)
2491 ERR("AV event handler not registered");
2493 a2dp_sink_event_cb(HAL_EV_A2DP_SOURCE_CONN_STATE, &ev, sizeof(ev));
2496 /* HF(AG Role) Audio Events */
2497 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected,
2498 const char *address)
2501 struct hal_ev_handsfree_audio_state ev;
2503 if (connected == TRUE)
2504 INFO("AG Audio Connected for address [%s]", address);
2506 INFO("AG Audio DisConnected for address [%s]", address);
2508 ev.state = (connected == TRUE) ?
2509 HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTED :
2510 HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED;
2512 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2515 ERR("HF event handler not registered");
2517 hf_event_cb(HAL_EV_HANDSFREE_AUDIO_STATE, &ev, sizeof(ev));
2520 /* HF(AG Role) Profile Events */
2521 static void __bt_hal_send_hf_connection_state_event(gboolean connected,
2522 const char *address)
2525 struct hal_ev_handsfree_conn_state ev;
2527 if (connected == TRUE)
2528 INFO("AG Profile Connected for address [%s]", address);
2530 INFO("AG Profile DisConnected for address [%s]", address);
2532 ev.state = (connected == TRUE) ?
2533 HAL_EV_HANDSFREE_CONN_STATE_CONNECTED :
2534 HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTED;
2536 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2539 ERR("HF event handler not registered");
2541 hf_event_cb(HAL_EV_HANDSFREE_CONN_STATE, &ev, sizeof(ev));
2544 void _bt_hal_register_event_handler_cb(bt_hal_module_e module, handle_stack_msg cb)
2554 a2dp_sink_event_cb = cb;
2560 avrcp_tg_event_cb = cb;
2562 case HAL_AVRCP_CTRL:
2563 avrcp_ctrl_event_cb = cb;
2569 ERR("Unknown module: %d", module);
2573 void _bt_hal_unregister_event_handler_cb(bt_hal_module_e module)
2577 hid_event_cb = NULL;
2583 a2dp_sink_event_cb = NULL;
2589 avrcp_tg_event_cb = NULL;
2591 case HAL_AVRCP_CTRL:
2592 avrcp_ctrl_event_cb = NULL;
2595 gatt_event_cb = NULL;
2598 ERR("Unknown module: %d", module);
2602 bool _bt_hal_get_adapter_request_state(void)
2604 return is_adapter_activating;
2607 bool _bt_hal_get_le_request_state(void)
2609 return is_le_activating;
2612 void _bt_hal_set_adapter_request_state(bool enable)
2614 DBG("set_adapter_request_state %d", enable);
2615 is_adapter_activating = enable;
2618 void _bt_hal_set_le_request_state(bool enable)
2620 DBG("set_le_request_state %d", enable);
2621 is_le_activating = enable;