4 * Copyright (c) 2015 -2016 Samsung Electronics Co., Ltd All Rights Reserved.
6 * Contact: Anupam Roy <anupam.r@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
33 #include "bt-hal-log.h"
34 #include "bt-hal-msg.h"
35 #include "bt-hal-internal.h"
36 #include "bt-hal-event-receiver.h"
37 #include "bt-hal-dbus-common-utils.h"
38 #include "bt-hal-agent.h"
39 #include "bt-hal-adapter-le.h"
40 #include "bt-hal-gatt-server.h"
41 #include "bt-hal-gatt-client.h"
43 #define BASELEN_PROP_CHANGED (sizeof(struct hal_ev_adapter_props_changed) \
44 + sizeof(struct hal_property))
46 /*TODO: Basic filters are currently added,
47 Need to add different event filters like HID,
48 Device etc in subsequent patches */
50 /* Global variables and structures */
51 static GDBusConnection *manager_conn;
52 static handle_stack_msg event_cb = NULL;
53 static handle_stack_msg hid_event_cb = NULL;
54 static handle_stack_msg av_event_cb = NULL;
55 static handle_stack_msg a2dp_sink_event_cb = NULL;
56 static handle_stack_msg hf_event_cb = NULL;
57 static handle_stack_msg avrcp_ctrl_event_cb = NULL;
58 static handle_stack_msg avrcp_tg_event_cb = NULL;
59 static handle_stack_msg gatt_event_cb = NULL;
60 static guint event_id;
62 /*State Management sepration Control for Adapter and LE */
63 static gboolean is_adapter_activating = FALSE;
64 static gboolean is_le_activating = FALSE;
69 gchar* interface_name;
72 } bt_hal_main_event_data_t;
74 /* Forward declarations */
75 static gboolean __bt_hal_event_manager(gpointer param);
76 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type);
77 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn, int subscribe);
78 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn, int subscribe);
79 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe);
81 static int __bt_hal_parse_event(GVariant *msg);
82 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current);
84 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path);
85 static void __bt_hal_adapter_property_changed_event(GVariant *msg);
86 static void __bt_hal_manager_event_filter(GDBusConnection *connection, const gchar *sender_name,
87 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
88 GVariant *parameters, gpointer user_data);
89 static int __bt_hal_initialize_manager_receiver(void);
90 static gboolean __bt_hal_parse_interface(GVariant *msg);
91 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters);
92 static gboolean __bt_hal_parse_device_properties(GVariant *item);
93 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data);
94 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path);
95 static void __bt_hal_dbus_device_found_properties(const char *device_path);
96 static void __bt_hal_device_properties_lookup(GVariant *result, char *address);
97 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member, const char *path);
98 static void __bt_hal_send_device_acl_connection_state_event(int status, gboolean connected, const char *address);
99 static void __bt_hal_handle_input_event(GVariant *msg, const char *path);
100 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address);
101 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address);
102 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address);
103 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member, const char *path);
104 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member, const char *path);
106 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted, const char *address);
107 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn, int subscribe);
108 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path);
109 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected, const char *address);
110 static void __bt_hal_send_hf_connection_state_event(gboolean connected, const char *address);
111 static void __bt_hal_send_device_trusted_profile_changed_event(uint32_t trust_val, const char *address);
112 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path);
114 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data)
118 struct hal_ev_discovery_state_changed ev;
119 ev.state = HAL_DISCOVERY_STATE_STOPPED;
120 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
126 static int __bt_hal_parse_event(GVariant *msg)
130 char *interface_name = NULL;
131 GVariant *inner_iter = NULL;
133 g_variant_iter_init(&iter, msg);
135 while ((child = g_variant_iter_next_value(&iter))) {
136 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
137 if (g_strcmp0(interface_name,
138 BT_HAL_DEVICE_INTERFACE) == 0) {
139 DBG("__bt_hal_parse_event: Interface: BT_HAL_DEVICE_INTERFACE");
140 g_variant_unref(inner_iter);
141 g_variant_unref(child);
142 return BT_HAL_DEVICE_EVENT;
143 } else if (g_strcmp0(interface_name,
144 BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
145 DBG("__bt_hal_parse_event: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
146 g_variant_unref(inner_iter);
147 g_variant_unref(child);
148 return BT_HAL_MEDIA_TRANSFER_EVENT;
149 } else if (g_strcmp0(interface_name,
150 BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
151 DBG("__bt_hal_parse_event: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
152 g_variant_unref(inner_iter);
153 g_variant_unref(child);
154 return BT_HAL_AVRCP_CONTROL_EVENT;
156 g_variant_unref(inner_iter);
157 g_variant_unref(child);
163 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current)
165 g_variant_get(msg, "(sss)", name, previous, current);
166 return BT_HAL_ERROR_NONE;
169 int __bt_insert_hal_properties(void *buf, uint8_t type, uint16_t len, const void *val)
170 { struct hal_property *prop = buf;
176 memcpy(prop->val, val, len);
178 return sizeof(*prop) + len;
181 handle_stack_msg _bt_hal_get_stack_message_handler(void)
186 static void __bt_hal_adapter_property_changed_event(GVariant *msg)
188 GVariantIter value_iter;
189 GVariant *value = NULL;
190 GDBusProxy *adapter_proxy;
193 g_variant_iter_init(&value_iter, msg);
195 /* Buffer and propety count management */
196 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
197 struct hal_ev_adapter_props_changed *ev = (void*) buf;
199 const gchar *address = NULL;
201 unsigned int cod = 0;
202 gboolean discoverable;
203 gboolean connectable;
204 unsigned int scan_mode = BT_SCAN_MODE_NONE;
205 unsigned int disc_timeout;
206 const gchar *version;
207 gboolean ipsp_initialized;
210 unsigned int pairable_timeout;
211 gboolean scan_mode_property_update = FALSE;
212 gboolean is_discovering;
213 gboolean is_le_discovering;
215 memset(buf, 0, sizeof(buf));
218 ev->status = BT_STATUS_SUCCESS;
222 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
223 if (!g_strcmp0(key, "Address")) {
226 address = g_variant_get_string(value, NULL);
227 DBG("##Address [%s]", address);
228 _bt_hal_convert_addr_string_to_type(bdaddr, address);
229 size += __bt_insert_hal_properties(buf + size,
230 HAL_PROP_ADAPTER_ADDR, sizeof(bdaddr), bdaddr);
232 } else if (!g_strcmp0(key, "Alias")) {
233 g_variant_get(value, "&s", &name);
234 DBG("##Alias [%s] ", name);
235 size += __bt_insert_hal_properties(buf + size,
236 HAL_PROP_ADAPTER_NAME, strlen(name) + 1, name);
238 } else if (!g_strcmp0(key, "Class")) {
239 cod = g_variant_get_uint32(value);
240 DBG("##Class [%d]", cod);
241 size += __bt_insert_hal_properties(buf + size,
242 HAL_PROP_ADAPTER_CLASS, sizeof(unsigned int), &cod);
244 } else if (!g_strcmp0(key, "Discoverable")) {
245 discoverable = g_variant_get_boolean(value);
246 DBG("##Discoverable [%d]", discoverable);
248 scan_mode = BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE;
250 scan_mode = BT_SCAN_MODE_CONNECTABLE;
251 scan_mode_property_update = TRUE;
252 } else if (!g_strcmp0(key, "DiscoverableTimeout")) {
253 disc_timeout = g_variant_get_uint32(value);
254 DBG("##Discoverable Timeout [%d]", disc_timeout);
255 size += __bt_insert_hal_properties(buf + size,
256 HAL_PROP_ADAPTER_DISC_TIMEOUT, sizeof(unsigned int), &disc_timeout);
258 } else if (!g_strcmp0(key, "Connectable")) {
259 connectable = g_variant_get_boolean(value);
260 DBG("##Connectable [%d]", connectable);
262 scan_mode = BT_SCAN_MODE_NONE;
263 else if (scan_mode == BT_SCAN_MODE_NONE)
264 scan_mode = BT_SCAN_MODE_CONNECTABLE;
265 scan_mode_property_update = TRUE;
266 } else if (!g_strcmp0(key, "Version")) {
267 version = g_variant_get_string(value, NULL);
268 DBG("##Version [%s]", version);
269 size += __bt_insert_hal_properties(buf + size,
270 HAL_PROP_ADAPTER_VERSION, strlen(version) + 1, version);
272 } else if (!g_strcmp0(key, "Name")) {
273 g_variant_get(value, "&s", &name);
274 DBG("##Name [%s]", name);
275 size += __bt_insert_hal_properties(buf + size,
276 HAL_PROP_ADAPTER_NAME, strlen(name) + 1, name);
278 } else if (!g_strcmp0(key, "Powered")) {
279 powered = g_variant_get_boolean(value);
280 DBG("##Powered = %d", powered);
281 /* TODO: Need to check this operation!! */
282 if (powered == FALSE) {
283 DBG("###### Adapter Powered Down ######");
284 struct hal_ev_adapter_state_changed ev;
285 ev.state = HAL_POWER_OFF;
286 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
288 struct hal_ev_le_state_changed le_ev;
289 le_ev.state = HAL_POWER_OFF;
290 event_cb(HAL_EV_LE_STATE_CHANGED, &le_ev, sizeof(le_ev));
293 _bt_hal_destroy_adapter_agent();
295 DBG("###### Adapter Powered Up ######");
296 int is_flight_mode=1, ret = -1;
297 ret = vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &is_flight_mode);
299 ERR("vconf_get_bool failed");
300 if (_bt_hal_get_adapter_request_state() || !is_flight_mode) {
301 DBG("Sending STATE CHANGE EVENT for Adapter... ");
302 _bt_hal_set_adapter_request_state(FALSE);
303 struct hal_ev_adapter_state_changed ev;
304 ev.state = HAL_POWER_ON;
305 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
308 if (_bt_hal_get_le_request_state() || !is_flight_mode) {
309 DBG("Sending STATE CHANGE EVENT for LE... ");
310 _bt_hal_set_le_request_state(FALSE);
311 struct hal_ev_le_state_changed ev;
312 ev.state = HAL_POWER_ON;
313 event_cb(HAL_EV_LE_STATE_CHANGED, &ev, sizeof(ev));
317 _bt_hal_initialize_adapter_agent();
320 } else if (!g_strcmp0(key, "Pairable")) {
321 pairable = g_variant_get_boolean(value);
322 DBG("##Pairable [%d]", pairable);
323 } else if (!g_strcmp0(key, "PairableTimeout")) {
324 pairable_timeout = g_variant_get_uint32(value);
325 DBG("##Pairable Timeout = %d", pairable_timeout);
326 } else if (!g_strcmp0(key, "UUIDs")) {
331 size1 = g_variant_get_size(value);
332 int num_props_tmp = ev->num_props;
334 uuid_value = (char **)g_variant_get_strv(value, &size1);
335 for (i = 0; uuid_value[i] != NULL; i++)
337 /* UUID collection */
338 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
339 for (i = 0; uuid_value[i] != NULL; i++) {
340 char *uuid_str = NULL;
341 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
342 uuid_str = g_strdup(uuid_value[i]);
343 DBG("##UUID string [%s]\n", uuid_str);
344 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
345 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
348 size += __bt_insert_hal_properties(buf + size, HAL_PROP_ADAPTER_UUIDS,
349 (BT_HAL_STACK_UUID_SIZE * uuid_count),
351 ev->num_props = num_props_tmp + 1;
354 } else if (!g_strcmp0(key, "Discovering")) {
355 is_discovering = g_variant_get_boolean(value);
356 DBG("##Discovering = [%d]", is_discovering);
358 if (is_discovering == FALSE) {
359 DBG("###### Adapter Has stopped Discovering ######");
360 /* In Tizen Bluez, this actually does not mean Discovery is stopped
361 in Bluez. Tizen Bluez sends this event after a certain timeout,
362 Therefore, we must forecefully call StopDiscovery to stop discovery in BlueZ */
366 adapter_proxy = _bt_hal_get_adapter_proxy();
368 if (adapter_proxy == NULL)
371 /* Need to stop searching */
372 DBG("Event though Bluez reported DIscovering stopped, we force stop Discovery ");
373 g_dbus_proxy_call_sync(adapter_proxy, "StopDiscovery",
375 G_DBUS_CALL_FLAGS_NONE,
379 ERR("Dbus Error : %s", err->message);
381 /* This error is thrown by Bluez, as Discovery is already stopped.
382 Discovery is stopped if user cancels on going discovery.
383 In order to maintain correct state of Bluetooth Discovery state,
384 simply send Discovery stopped event to HAL user */
385 struct hal_ev_discovery_state_changed ev;
386 ev.state = HAL_DISCOVERY_STATE_STOPPED;
387 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
392 event_id = g_timeout_add(BT_HAL_DISCOVERY_FINISHED_DELAY,
393 (GSourceFunc)__bt_hal_discovery_finished_cb, NULL);
397 DBG("###### Adapter Has started Discovering ######");
398 struct hal_ev_discovery_state_changed ev;
399 ev.state = HAL_DISCOVERY_STATE_STARTED;
400 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
403 } else if (!g_strcmp0(key, "LEDiscovering")) {
406 is_le_discovering = g_variant_get_boolean(value);
407 DBG("##LE Discovering = [%d]", is_le_discovering);
409 if (is_le_discovering)
412 adapter_proxy = _bt_hal_get_adapter_proxy();
413 if (adapter_proxy == NULL) {
414 ERR("adapter_proxy == NULL");
418 /* Need to stop searching */
419 result = g_dbus_proxy_call_sync(adapter_proxy, "StopLEDiscovery",
420 NULL, G_DBUS_CALL_FLAGS_NONE,
421 DBUS_TIMEOUT, NULL, &err);
423 ERR("Error occured in Proxy call");
425 ERR("(Error: %s)", err->message);
430 g_variant_unref(result);
431 } else if (!g_strcmp0(key, "Modalias")) {
432 char *modalias = NULL;
433 g_variant_get(value, "s", &modalias);
434 DBG("##Adapter ModAlias [%s]", modalias);
435 } else if (!g_strcmp0(key, "SupportedLEFeatures")) {
436 DBG("##LE Supported features");
439 GVariantIter *iter = NULL;
440 g_variant_get(value, "as", &iter);
441 bt_local_le_features_t le_features;
442 gboolean le_features_present = FALSE;
447 memset(&le_features, 0x00, sizeof(le_features));
449 while (g_variant_iter_next(iter, "&s", &name) &&
450 g_variant_iter_next(iter, "&s", &val)) {
451 DBG("name = %s, Value = %s", name, val);
452 if (FALSE == _bt_hal_update_le_feature_support(name, val, &le_features))
453 ERR("Failed to update LE feature (name = %s, value = %s)", name, val);
455 le_features_present = TRUE;
458 g_variant_iter_free(iter);
459 if (le_features_present) {
460 size += __bt_insert_hal_properties(buf + size,
461 HAL_PROP_ADAPTER_LOCAL_LE_FEAT, sizeof(le_features), &le_features);
464 DBG("le supported features values are NOT provided by Stack");
466 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
467 g_variant_get(value, "b" , &ipsp_initialized);
468 DBG("##IPSP Initialized = %d", ipsp_initialized);
470 ERR("Unhandled Property:[%s]", key);
474 if (scan_mode_property_update) {
475 size += __bt_insert_hal_properties(buf + size,
476 HAL_PROP_ADAPTER_SCAN_MODE, sizeof(int), &scan_mode);
482 DBG("Send Adapter properties changed event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
483 event_cb(HAL_EV_ADAPTER_PROPS_CHANGED, buf, size);
489 void _bt_hal_handle_adapter_event(GVariant *msg, const char *member)
496 if (strcasecmp(member, "DeviceCreated") == 0) {
497 DBG("DeviceCreated: Unhandled");
498 } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
499 DBG("InterfacesRemoved: Unhandled");
500 } else if (strcasecmp(member, "AdvertisingEnabled") == 0) {
501 DBG("AdvertisingEnabled");
502 DBG("Advertising Enabled");
504 gboolean status = FALSE;
505 g_variant_get(msg, "(ib)", &slot_id, &status);
506 DBG("Advertising Enabled : slot_id [%d] status [%d]", slot_id, status);
507 /* Send event to application */
508 _bt_hal_set_advertising_status(slot_id, status);
509 } else if (strcasecmp(member, "RssiEnabled") == 0) {
510 struct hal_ev_rssi_monitor_state_changed ev;
511 gboolean status = FALSE;
512 char *address = NULL;
515 g_variant_get(msg, "(sib)", &address, &link_type, &status);
516 DBG("RSSI monitoring %s for %s",
517 (status ? "Enabled" : "Disabled"), address);
519 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
520 ev.link_type = link_type;
521 ev.state = (status ? HAL_RSSI_MONITORING_ENABLED : HAL_RSSI_MONITORING_DISABLED);
523 ERR("event_cb is NULL");
525 event_cb(HAL_EV_RSSI_MONITOR_STATE_CHANGED, &ev, sizeof(ev));
528 } else if (strcasecmp(member, "RssiAlert") == 0) {
529 struct hal_ev_rssi_alert_recieved ev;
533 char *address = NULL;
535 g_variant_get(msg, "(siii)", &address, &link_type, &alert_type, &rssi_dbm);
536 DBG("RSSI Alert: [Address %s LinkType %d] [Type %d DBM %d]",
537 address, alert_type, rssi_dbm, link_type);
539 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
540 ev.link_type = link_type;
541 ev.alert_type = alert_type;
545 ERR("event_cb is NULL");
547 event_cb(HAL_EV_RSSI_ALERT_RECIEVED, &ev, sizeof(ev));
550 } else if (strcasecmp(member, "RawRssi") == 0) {
551 struct hal_ev_raw_rssi_recieved ev;
554 char *address = NULL;
556 g_variant_get(msg, "(sii)", &address, &link_type, &rssi_dbm);
557 DBG("Raw RSSI: [Address %s] [Link Type %d][RSSI DBM %d]",
558 address, link_type, rssi_dbm);
560 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
561 ev.link_type = link_type;
565 ERR("event_cb is NULL");
567 event_cb(HAL_EV_RAW_RSSI_RECIEVED, &ev, sizeof(ev));
570 } else if (strcasecmp(member, BT_HAL_HARDWARE_ERROR) == 0) {
571 DBG("BT Hardware Error: Unhandled");
572 } else if (strcasecmp(member, BT_HAL_TX_TIMEOUT_ERROR) == 0) {
573 DBG("BT TX Timeout Error: Unhandled");
579 static gboolean __bt_hal_parse_device_properties(GVariant *item)
589 /* Buffer and propety count management */
590 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
591 struct hal_ev_device_found *ev = (void *) buf;
593 memset(buf, 0, sizeof(buf));
597 g_variant_iter_init(&iter, item);
598 while (g_variant_iter_loop(&iter, "{sv}", &key, &val)) {
600 if (strcasecmp(key, "Address") == 0) {
602 char * address = NULL;
603 address = g_variant_dup_string(val, &len);
605 _bt_hal_convert_addr_string_to_type(bdaddr, address);
607 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
608 sizeof(bdaddr), bdaddr);
611 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
613 } else if (strcasecmp(key, "Class") == 0) {
614 unsigned int class = g_variant_get_uint32(val);
615 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
616 sizeof(unsigned int), &class);
618 DBG("Device class [%d] Property num [%d]", class, ev->num_props);
619 } else if (strcasecmp(key, "name") == 0) {
620 char *name = g_variant_dup_string(val, &len);
622 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
623 strlen(name) + 1, name);
625 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
628 } else if (strcasecmp(key, "Connected") == 0) {
629 unsigned int connected = g_variant_get_byte(val);
631 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
632 sizeof(unsigned int), &connected);
634 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
635 } else if (strcasecmp(key, "paired") == 0) {
636 uint8_t paired = (g_variant_get_boolean(val) ? 1 : 0);
637 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
638 sizeof(uint8_t), &paired);
640 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
641 } else if (strcasecmp(key, "Trusted") == 0) {
642 uint8_t trust = (g_variant_get_boolean(val) ? 1 : 0);
643 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
644 sizeof(uint8_t), &trust);
646 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
647 } else if (strcasecmp(key, "RSSI") == 0) {
648 int rssi = g_variant_get_int16(val);
649 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
652 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
653 } else if (strcasecmp(key, "LastAddrType") == 0) {
654 /* TODO: To be handled later*/
655 } else if (!g_strcmp0(key, "IsAliasSet")) {
656 uint8_t is_alias_set = (g_variant_get_boolean(val) ? 1 : 0);
657 DBG("IsAliasSet: %s", (is_alias_set ? "TRUE" : "FALSE"));
658 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
659 sizeof(uint8_t), &is_alias_set);
661 } else if (strcasecmp(key, "UUIDs") == 0) {
666 size1 = g_variant_get_size(val);
667 DBG("UUID count from size [%zu]\n", size1);
668 int num_props_tmp = ev->num_props;
671 uuid_value = (char **)g_variant_get_strv(val, &size1);
672 for (i = 0; uuid_value[i] != NULL; i++)
674 DBG("UUID count [%d]\n", uuid_count);
675 /* UUID collection */
676 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
678 for (i = 0; uuid_value[i] != NULL; i++) {
680 char *uuid_str = NULL;
681 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
682 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
684 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
685 uuid_str = g_strdup(uuid_value[i]);
686 DBG("UUID string [%s]\n", uuid_str);
687 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
688 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
692 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
693 (BT_HAL_STACK_UUID_SIZE * uuid_count),
695 ev->num_props = num_props_tmp + 1;
699 } else if (strcasecmp(key, "LegacyManufacturerDataLen") == 0) {
700 /* TODO: To be handled later*/
701 } else if (strcasecmp(key, "LegacyManufacturerData") == 0) {
702 /* TODO: To be handled later*/
704 ERR("Unhandled Property:[%s]", key);
710 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
711 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
717 static void __bt_hal_handle_avrcp_tg_events(GVariant *msg, const char *path)
720 GVariantIter value_iter;
721 char *property = NULL;
723 GVariant *val = NULL;
724 GVariant *child = NULL;
726 g_variant_iter_init(&value_iter, msg);
727 while ((child = g_variant_iter_next_value(&value_iter))) {
728 g_variant_get(child, "{sv}", &property, &val);
729 INFO("Property %s", property);
730 if (strcasecmp(property, "Connected") == 0) {
731 struct hal_ev_avrcp_tg_conn_state ev;
733 gboolean connected = FALSE;
735 g_variant_get(val, "b", &connected);
737 state = connected ? HAL_AVRCP_TG_STATE_CONNECTED :
738 HAL_AVRCP_TG_STATE_DISCONNECTED;
740 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
742 _bt_hal_convert_device_path_to_address(path, address);
744 DBG("connected: %d", connected);
745 DBG("address: %s", address);
747 /* Prepare to send AVRCP Target connection state event */
748 memset(&ev, 0, sizeof(ev));
749 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
751 if (!avrcp_tg_event_cb)
752 ERR("AVRCP target DBUS handler callback not registered");
754 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_CONN_STATE, (void *)&ev, sizeof(ev));
758 g_variant_unref(child);
759 g_variant_unref(val);
765 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path)
767 char *interface_name = NULL;
768 GVariant *val = NULL;
771 g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, &val, NULL);
773 if (!interface_name) {
774 DBG("Failed to get interface name");
777 g_variant_unref(val);
781 if (strcasecmp(interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
782 DBG("Event: Property Changed: Interface: BT_HAL_ADAPTER_INTERFACE");
783 __bt_hal_adapter_property_changed_event(val);
784 } else if (strcasecmp(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
785 DBG("Event: Property Changed: Interface: BT_HAL_DEVICE_INTERFACE");
786 __bt_hal_device_property_changed_event(val, object_path);
787 } else if (strcasecmp(interface_name, BT_HAL_OBEX_TRANSFER_INTERFACE) == 0) {
788 DBG("Event: Property Changed: Interface: BT_HAL_OBEX_TRANSFER_INTERFACE");
789 /* TODO: Handle event */
790 } else if (strcasecmp(interface_name, BT_HAL_MEDIA_CONTROL_INTERFACE) == 0) {
791 DBG("Event: Property Changed: Interface: BT_HAL_MEDIA_CONTROL_INTERFACE");
792 /* Handle AVRCP target event */
793 __bt_hal_handle_avrcp_tg_events(val, object_path);
794 } else if (strcasecmp(interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
795 DBG("Event: Property Changed: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
796 __bt_hal_handle_avrcp_ctrl_events(val, NULL, object_path);
797 } else if (strcasecmp(interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
798 DBG("Event: Property Changed: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
799 __bt_hal_handle_avrcp_transport_events(val, NULL, object_path);
800 } else if (strcasecmp(interface_name, BT_HAL_NETWORK_CLIENT_INTERFACE) == 0) {
801 DBG("Event: Property Changed: Interface: BT_HAL_NETWORK_CLIENT_INTERFACE");
802 /* TODO: Handle event */
803 } else if (strcasecmp(interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
804 DBG("Event: Property Changed: Interface: BT_HAL_GATT_CHAR_INTERFACE");
805 /* TODO: Handle event */
806 } else if (strcasecmp(interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
807 DBG("Event: Property Changed: Interface: BT_HAL_INPUT_INTERFACE");
808 __bt_hal_handle_input_event(val, object_path);
810 g_variant_unref(val);
813 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters)
817 if (__bt_hal_parse_interface(parameters) == FALSE) {
818 ERR("Fail to parse the properies");
819 g_variant_unref(value);
826 static void __bt_hal_send_hid_connection_state_event(
827 gboolean connected, char *address)
829 struct hal_ev_hidhost_conn_state ev;
831 ev.state = (connected == TRUE) ?
832 HAL_HIDHOST_STATE_CONNECTED :
833 HAL_HIDHOST_STATE_DISCONNECTED;
835 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
838 ERR("HID event handler not registered");
840 hid_event_cb(HAL_EV_HIDHOST_CONN_STATE, &ev, sizeof(ev));
843 static void __bt_hal_handle_input_event(GVariant *msg, const char *path)
845 gboolean property_flag = FALSE;
846 GVariantIter value_iter;
847 char *property = NULL;
848 GVariant *child = NULL, *val = NULL;
851 g_variant_iter_init(&value_iter, msg);
852 while ((child = g_variant_iter_next_value(&value_iter))) {
853 g_variant_get(child, "{sv}", &property, &val);
855 if (property == NULL)
858 if (strcasecmp(property, "Connected") == 0) {
861 g_variant_get(val, "b", &property_flag);
862 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
863 _bt_hal_convert_device_path_to_address(path, address);
864 __bt_hal_send_hid_connection_state_event(property_flag, address);
868 g_variant_unref(val);
869 g_variant_unref(child);
875 static gboolean __bt_hal_parse_interface(GVariant *msg)
878 GVariant *optional_param;
881 char *interface_name = NULL;
882 GVariant *inner_iter = NULL;
883 g_variant_get(msg, "(&o@a{sa{sv}})",
884 &path, &optional_param);
885 g_variant_iter_init(&iter, optional_param);
887 while ((child = g_variant_iter_next_value(&iter))) {
888 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
889 if (g_strcmp0(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
890 DBG("Found a device: %s", path);
891 if (__bt_hal_parse_device_properties(inner_iter) == FALSE) {
892 g_variant_unref(inner_iter);
893 g_variant_unref(child);
894 g_variant_unref(optional_param);
895 ERR("Fail to parse the properies");
898 g_variant_unref(inner_iter);
899 g_variant_unref(child);
900 g_variant_unref(optional_param);
904 g_variant_unref(inner_iter);
905 g_variant_unref(child);
908 g_variant_unref(optional_param);
913 void __bt_hal_handle_gatt_char_event(GVariant *parameters, const char *signal_name)
917 if (signal_name == NULL)
920 if (strcasecmp(signal_name, "GattValueChanged") == 0) {
921 DBG("GattValueChanged event received");
924 const char *char_handle = NULL;
925 GVariant *char_value_var = NULL;
927 char *char_value = NULL;
929 g_variant_get(parameters, "(i&s@ay)", &result, &char_handle, &char_value_var);
930 DBG("char handle: %s", char_handle);
932 len = g_variant_get_size(char_value_var);
934 char_value = (char *)g_variant_get_data(char_value_var);
936 _bt_hal_handle_gattc_value_changed_event(result, char_handle, char_value, len);
938 g_variant_unref(char_value_var);
943 static gboolean __bt_hal_event_manager(gpointer data)
945 bt_hal_event_type_t bt_event = 0x00;
947 char *obj_path = NULL;
949 bt_hal_main_event_data_t *param = (bt_hal_main_event_data_t*)data;
950 if (strcasecmp(param->signal_name, "InterfacesAdded") == 0) {
952 /*TODO: Handle Interfaces Added Signal from stack */
953 DBG("Manager Event: Signal Name: InterfacesAdded");
955 g_variant_get(param->parameters, "(&o@a{sa{sv}})", &obj_path, &value);
957 if (obj_path == NULL) {
958 DBG("obj_path is NULL");
962 if (strcasecmp(obj_path, BT_HAL_BLUEZ_HCI_PATH) == 0) {
963 /* TODO: Handle adapter added */
964 DBG("Manager Event: Signal Name: InterfiacesAdded: Adapter added in bluetoothd: path [hci0]");
966 bt_event = __bt_hal_parse_event(value);
967 if (bt_event == BT_HAL_DEVICE_EVENT) {
968 DBG("Device path : %s ", obj_path);
969 __bt_hal_handle_device_event(value, param->parameters);
970 } else if (bt_event == BT_HAL_AVRCP_CONTROL_EVENT) {
971 DBG("Device path : %s ", obj_path);
972 _bt_hal_set_control_device_path(obj_path);
975 g_variant_unref(value);
977 } else if (strcasecmp(param->signal_name, "InterfacesRemoved") == 0) {
981 /*TODO: Handle Interfaces Removed Signal from stack */
982 DBG("Manager Event: Signal Name: InterfacesRemoved");
984 g_variant_get(param->parameters, "(&oas)", &obj_path, &iter);
985 DBG("Device path : %s ", obj_path);
986 while (g_variant_iter_loop(iter, "s", &str)) {
987 if (g_strcmp0(str, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0)
988 _bt_hal_remove_control_device_path(obj_path);
990 g_variant_iter_free(iter);
991 } else if (strcasecmp(param->signal_name, "NameOwnerChanged") == 0) {
993 char *previous = NULL;
994 char *current = NULL;
996 /* TODO: Handle Name Owener changed Signal */
997 if (__bt_hal_get_owner_info(param->parameters, &name, &previous, ¤t)) {
998 DBG("Fail to get the owner info");
1001 if (current && *current != '\0') {
1007 if (strcasecmp(name, BT_HAL_BLUEZ_NAME) == 0) {
1008 DBG("Bluetoothd is terminated");
1010 /* TODO: Handle Bluetoothd terminating scenario */
1011 _bt_hal_le_deinit();
1013 INFO("Name Owner changed [%s]", name);
1018 } else if (g_strcmp0(param->interface_name, BT_HAL_PROPERTIES_INTERFACE) == 0) {
1019 DBG("Manager Event: Interface Name: BT_HAL_PROPERTIES_INTERFACE");
1020 __bt_hal_handle_property_changed_event(param->parameters, param->object_path);
1021 } else if (g_strcmp0(param->interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
1022 DBG("Manager Event: Interface Name: BT_HAL_ADAPTER_INTERFACE");
1023 _bt_hal_handle_adapter_event(param->parameters, param->signal_name);
1024 } else if (g_strcmp0(param->interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
1025 DBG("Manager Event: Interface Name: BT_HAL_INPUT_INTERFACE");
1026 __bt_hal_handle_input_event(param->parameters, param->object_path);
1027 } else if (g_strcmp0(param->interface_name, BT_HAL_NETWORK_SERVER_INTERFACE) == 0) {
1028 /* TODO: Handle Network Server events from stack */
1029 DBG("Manager Event: Interface Name: BT_HAL_NETWORK_SERVER_INTERFACE");
1030 } else if (g_strcmp0(param->interface_name, BT_HAL_HEADSET_INTERFACE) == 0) {
1031 DBG("Manager Event: Interface Name: BT_HAL_HEADSET_INTERFACE");
1032 __bt_hal_handle_headset_events(param->parameters, param->signal_name, param->object_path);
1033 } else if (g_strcmp0(param->interface_name, BT_HAL_SINK_INTERFACE) == 0) {
1034 /* TODO: Handle Sink interface events from stack */
1035 DBG("Manager Event: Interface Name:BT_HAL_SINK_INTERFACE");
1036 } else if (g_strcmp0(param->interface_name, BT_HAL_AGENT_INTERFACE) == 0) {
1037 /* TODO: Handle Agent events from stack */
1038 DBG("Manager Event: Interface Name:BT_HAL_AGENT_INTERFACE");
1039 } else if (g_strcmp0(param->interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
1040 DBG("Manager Event: Interface Name:BT_HAL_DEVICE_INTERFACE");
1041 __bt_hal_handle_device_specific_events(param->parameters, param->signal_name, param->object_path);
1042 } else if (g_strcmp0(param->interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
1043 DBG("Manager Event: Interface Name: BT_HAL_PLAYER_CONTROL_INTERFACE");
1044 __bt_hal_handle_avrcp_ctrl_events(param->parameters, param->signal_name, param->object_path);
1045 } else if (g_strcmp0(param->interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
1046 DBG("Manager Event: Interface Name: BT_HAL_MEDIATRANSPORT_INTERFACE");
1047 __bt_hal_handle_avrcp_transport_events(param->parameters, param->signal_name, param->object_path);
1048 } else if (g_strcmp0(param->interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
1049 DBG("Manager Event: Interface Name: BT_HAL_GATT_CHAR_INTERFACE");
1050 __bt_hal_handle_gatt_char_event(param->parameters, param->signal_name);
1055 g_free(param->sender_name);
1056 g_free(param->object_path);
1057 g_free(param->interface_name);
1058 g_free(param->signal_name);
1059 g_variant_unref(param->parameters);
1064 static void __bt_hal_manager_event_filter(GDBusConnection *connection,
1065 const gchar *sender_name,
1066 const gchar *object_path,
1067 const gchar *interface_name,
1068 const gchar *signal_name,
1069 GVariant *parameters,
1072 if (signal_name == NULL)
1075 bt_hal_main_event_data_t *param = g_new0(bt_hal_main_event_data_t, 1);
1076 param->sender_name = g_strdup(sender_name);
1077 param->object_path = g_strdup(object_path);
1078 param->interface_name = g_strdup(interface_name);
1079 param->signal_name = g_strdup(signal_name);
1080 param->parameters = g_variant_ref(parameters);
1082 g_idle_add(__bt_hal_event_manager, (gpointer)param);
1086 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path)
1088 gboolean property_flag = FALSE;
1089 char *property = NULL;
1090 GVariant *value = NULL;
1091 g_variant_get(msg, "(sv)", &property, &value);
1093 if (property == NULL)
1096 DBG("Property = %s \n", property);
1097 /* We allow only 1 headset connection (HSP or HFP)*/
1098 if (strcasecmp(property, "Connected") == 0) {
1100 g_variant_get(value, "b", &property_flag);
1102 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1104 /* Fix : NULL_RETURNS */
1105 if (address == NULL)
1108 _bt_hal_convert_device_path_to_address(path, address);
1109 __bt_hal_send_hf_audio_connection_state_event(property_flag, address);
1111 } else if (strcasecmp(property, "State") == 0) {
1114 g_variant_get(value, "s", &state);
1116 /* This code assumes we support only 1 headset connection */
1117 /* Need to use the headset list, if we support multi-headsets */
1118 if (strcasecmp(state, "Playing") == 0) {
1119 DBG("Playing: Sco Connected");
1120 } else if (strcasecmp(state, "connected") == 0 ||
1121 strcasecmp(state, "disconnected") == 0) {
1122 if (strcasecmp(state, "connected") == 0)
1123 DBG("Sco Connected");
1125 DBG("Sco Disconnected");
1127 ERR("Not handled state - %s", state);
1132 } else if (strcasecmp(property, "SpeakerGain") == 0) {
1135 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1137 _bt_hal_convert_device_path_to_address(path, address);
1138 INFO("Speaker Gain for address [%s]", address);
1139 /* TODO Handle event sending to HAL */
1142 } else if (strcasecmp(property, "MicrophoneGain") == 0) {
1145 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1147 _bt_hal_convert_device_path_to_address(path, address);
1148 INFO("Microphone Gain for address [%s]", address);
1149 /* TODO Handle event sending to HAL */
1156 g_variant_unref(value);
1159 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn,
1165 static int subs_interface_added_id = -1;
1166 static int subs_interface_removed_id = -1;
1167 static int subs_name_owner_id = -1;
1168 static int subs_property_id = -1;
1169 static int subs_adapter_id = -1;
1174 if (subs_interface_added_id == -1) {
1175 subs_interface_added_id = g_dbus_connection_signal_subscribe(conn,
1176 NULL, BT_HAL_MANAGER_INTERFACE,
1177 BT_HAL_INTERFACES_ADDED, NULL, NULL, 0,
1178 __bt_hal_manager_event_filter,
1181 if (subs_interface_removed_id == -1) {
1182 subs_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
1183 NULL, BT_HAL_MANAGER_INTERFACE,
1184 BT_HAL_INTERFACES_REMOVED, NULL, NULL, 0,
1185 __bt_hal_manager_event_filter,
1188 if (subs_name_owner_id == -1) {
1189 subs_name_owner_id = g_dbus_connection_signal_subscribe(conn,
1190 NULL, BT_HAL_FREEDESKTOP_INTERFACE,
1191 BT_HAL_NAME_OWNER_CHANGED, NULL, NULL, 0,
1192 __bt_hal_manager_event_filter,
1195 if (subs_property_id == -1) {
1196 subs_property_id = g_dbus_connection_signal_subscribe(conn,
1197 NULL, BT_HAL_PROPERTIES_INTERFACE,
1198 BT_HAL_PROPERTIES_CHANGED, NULL, NULL, 0,
1199 __bt_hal_manager_event_filter,
1202 if (subs_adapter_id == -1) {
1203 subs_adapter_id = g_dbus_connection_signal_subscribe(conn,
1204 NULL, BT_HAL_ADAPTER_INTERFACE,
1205 NULL, NULL, NULL, 0,
1206 __bt_hal_manager_event_filter,
1210 if (subs_interface_added_id != -1) {
1211 g_dbus_connection_signal_unsubscribe(conn,
1212 subs_interface_added_id);
1213 subs_interface_added_id = -1;
1215 if (subs_interface_removed_id != -1) {
1216 g_dbus_connection_signal_unsubscribe(conn,
1217 subs_interface_removed_id);
1218 subs_interface_removed_id = -1;
1220 if (subs_name_owner_id != -1) {
1221 g_dbus_connection_signal_unsubscribe(conn,
1222 subs_name_owner_id);
1223 subs_name_owner_id = -1;
1225 if (subs_property_id != -1) {
1226 g_dbus_connection_signal_unsubscribe(conn,
1228 subs_property_id = -1;
1230 if (subs_adapter_id == -1) {
1231 g_dbus_connection_signal_unsubscribe(conn, subs_adapter_id);
1232 subs_adapter_id = -1;
1240 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn,
1243 static int subs_device_id = -1;
1250 if (subs_device_id == -1) {
1251 subs_device_id = g_dbus_connection_signal_subscribe(conn,
1252 NULL, BT_HAL_DEVICE_INTERFACE,
1253 NULL, NULL, NULL, 0,
1254 __bt_hal_manager_event_filter,
1258 if (subs_device_id != -1) {
1259 g_dbus_connection_signal_unsubscribe(conn,
1261 subs_device_id = -1;
1269 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe)
1271 static int subs_input_id = -1;
1279 if (subs_input_id == -1) {
1280 subs_input_id = g_dbus_connection_signal_subscribe(conn,
1281 NULL, BT_HAL_INPUT_INTERFACE,
1282 NULL, NULL, NULL, 0,
1283 __bt_hal_manager_event_filter,
1287 if (subs_input_id != -1) {
1288 g_dbus_connection_signal_unsubscribe(conn,
1299 static int __bt_hal_register_gatt_subscribe_signal(GDBusConnection *conn,
1302 static int subs_gatt_id = -1;
1307 if (subs_gatt_id == -1) {
1308 subs_gatt_id = g_dbus_connection_signal_subscribe(conn,
1309 NULL, BT_HAL_GATT_CHAR_INTERFACE,
1310 NULL, NULL, NULL, 0,
1311 __bt_hal_manager_event_filter,
1315 if (subs_gatt_id == -1) {
1316 g_dbus_connection_signal_unsubscribe(conn,
1322 return BT_HAL_ERROR_NONE;
1327 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type)
1332 return BT_HAL_ERROR_INTERNAL;
1334 /* TODO: Add more events in subsequent patches */
1335 switch (event_type) {
1336 case BT_HAL_MANAGER_EVENT:
1337 __bt_hal_register_manager_subscribe_signal(g_conn, TRUE);
1339 case BT_HAL_DEVICE_EVENT:
1340 __bt_hal_register_device_subscribe_signal(g_conn, TRUE);
1342 case BT_HAL_HID_EVENT:
1343 __bt_hal_register_input_subscribe_signal(g_conn, TRUE);
1345 case BT_HAL_HEADSET_EVENT:
1346 __bt_hal_register_audio_subscribe_signal(g_conn, TRUE);
1348 case BT_HAL_GATT_EVENT:
1349 __bt_hal_register_gatt_subscribe_signal(g_conn, TRUE);
1352 INFO_C("Register Event: event_type [%d]", event_type);
1353 return BT_HAL_ERROR_NOT_SUPPORT;
1356 return BT_HAL_ERROR_NONE;
1359 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn,
1365 static int subs_headset_id = -1;
1366 static int subs_sink_id = -1;
1369 if (subs_headset_id == -1) {
1370 subs_headset_id = g_dbus_connection_signal_subscribe(conn,
1371 NULL, BT_HAL_HEADSET_INTERFACE,
1372 NULL, NULL, NULL, 0,
1373 __bt_hal_manager_event_filter,
1376 if (subs_sink_id == -1) {
1377 subs_sink_id = g_dbus_connection_signal_subscribe(conn,
1378 NULL, BT_HAL_SINK_INTERFACE,
1379 NULL, NULL, NULL, 0,
1380 __bt_hal_manager_event_filter,
1384 if (subs_headset_id != -1) {
1385 g_dbus_connection_signal_unsubscribe(conn,
1387 subs_headset_id = -1;
1389 if (subs_sink_id != -1) {
1390 g_dbus_connection_signal_unsubscribe(conn,
1398 static int __bt_hal_initialize_manager_receiver(void)
1402 GError *error = NULL;
1404 if (manager_conn == NULL) {
1405 manager_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1406 if (error != NULL) {
1407 ERR_C("ERROR: Can't get on system bus [%s]", error->message);
1408 g_clear_error(&error);
1410 if (manager_conn == NULL)
1414 if (__bt_hal_register_service_event(manager_conn,
1415 BT_HAL_MANAGER_EVENT) != BT_HAL_ERROR_NONE)
1417 if (__bt_hal_register_service_event(manager_conn,
1418 BT_HAL_DEVICE_EVENT) != BT_HAL_ERROR_NONE)
1420 if (__bt_hal_register_service_event(manager_conn,
1421 BT_HAL_HID_EVENT) != BT_HAL_ERROR_NONE)
1423 if (__bt_hal_register_service_event(manager_conn,
1424 BT_HAL_HEADSET_EVENT) != BT_HAL_ERROR_NONE)
1426 if (__bt_hal_register_service_event(manager_conn,
1427 BT_HAL_GATT_EVENT) != BT_HAL_ERROR_NONE)
1429 return BT_HAL_ERROR_NONE;
1432 g_object_unref(manager_conn);
1433 manager_conn = NULL;
1438 return BT_HAL_ERROR_INTERNAL;
1441 /* To receive the event from bluez */
1442 int _bt_hal_initialize_event_receiver(handle_stack_msg cb)
1448 return BT_HAL_ERROR_INVALID_PARAM;
1450 result = __bt_hal_initialize_manager_receiver();
1452 DBG("Manager event receiver initialization result [%d]", result);
1453 if (result != BT_HAL_ERROR_NONE)
1456 /*TODO: Initialize Obexd Event receiver */
1461 return BT_HAL_ERROR_NONE;
1464 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path)
1466 GVariantIter value_iter;
1467 GVariant *value = NULL;
1469 g_variant_iter_init(&value_iter, msg);
1472 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
1473 if (!g_strcmp0(key, "Connected")) {
1474 guint connected = 0;
1475 g_variant_get(value, "i", &connected);
1476 DBG("Device property changed : Connected [%d]", connected);
1477 } else if (!g_strcmp0(key, "RSSI")) {
1478 DBG("Device property changed : RSSI");
1479 __bt_hal_dbus_device_found_properties(path);
1480 } else if (!g_strcmp0(key, "GattConnected")) {
1481 DBG("Device property changed : GattConnected");
1482 gboolean gatt_connected = FALSE;
1483 g_variant_get(value, "b", &gatt_connected);
1484 char *address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1485 _bt_hal_convert_device_path_to_address(path, address);
1486 DBG("@@gatt_connected: %d", gatt_connected);
1487 DBG("@@address: %s", address);
1488 _bt_hal_gatt_connected_state_event(gatt_connected, address);
1489 _bt_hal_handle_gattc_connected_event(address, gatt_connected);
1491 } else if (!g_strcmp0(key, "Paired")) {
1492 gboolean paired = FALSE;
1493 struct hal_ev_bond_state_changed ev;
1494 char address[BT_HAL_ADDRESS_STRING_SIZE];
1496 g_variant_get(value, "b", &paired);
1497 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1499 _bt_hal_agent_set_canceled(FALSE);
1500 _bt_hal_convert_device_path_to_address(path, address);
1502 /* Prepare to send event to HAL bluetooth */
1503 ev.status = BT_STATUS_SUCCESS;
1504 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1505 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1508 ERR("Bluetooth HAL event handler not registered");
1510 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
1511 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1513 } else if (!g_strcmp0(key, "LegacyPaired")) {
1514 DBG("Device property changed : LegacyPaired");
1515 } else if (!g_strcmp0(key, "Trusted")) {
1516 DBG("Device property changed : Trusted");
1517 gboolean trusted = FALSE;
1518 gchar *address = NULL;
1519 g_variant_get(value, "b", &trusted);
1520 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1522 _bt_hal_convert_device_path_to_address(path, address);
1523 DBG("Device [%s] trusted: [%d]", address, trusted);
1525 __bt_hal_send_device_trust_state_event(trusted, address);
1527 } else if (!g_strcmp0(key, "IpspConnected")) {
1528 DBG("Device property changed : IpspConnected");
1529 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
1530 DBG("Device property changed : IpspInitStateChanged");
1531 } else if (!g_strcmp0(key, "TrustedProfiles")) {
1533 char address[BT_HAL_ADDRESS_STRING_SIZE];
1535 g_variant_get(value, "u", &trust_val);
1536 _bt_hal_convert_device_path_to_address(path, address);
1537 DBG("Address: %s, TrustedProfiles: 0x%X", address, trust_val);
1538 __bt_hal_send_device_trusted_profile_changed_event(trust_val, address);
1540 ERR("Unhandled Property:[%s]", key);
1546 static void __bt_hal_dbus_device_found_properties(const char *device_path)
1549 GError *error = NULL;
1550 GDBusProxy *device_proxy;
1551 GDBusConnection *conn;
1556 ERR("Invalid device path");
1560 conn = _bt_hal_get_system_gconn();
1562 ERR("_bt_hal_get_system_gconn failed");
1566 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1570 BT_HAL_PROPERTIES_INTERFACE,
1573 if (!device_proxy) {
1574 ERR("Error creating device_proxy");
1578 result = g_dbus_proxy_call_sync(device_proxy,
1580 g_variant_new("(s)", BT_HAL_DEVICE_INTERFACE),
1581 G_DBUS_CALL_FLAGS_NONE,
1586 ERR("Error occured in Proxy call");
1587 if (error != NULL) {
1588 ERR("Error occured in Proxy call (Error: %s)", error->message);
1589 g_clear_error(&error);
1591 g_object_unref(device_proxy);
1595 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1596 _bt_hal_convert_device_path_to_address(device_path, address);
1598 __bt_hal_device_properties_lookup(result, address);
1600 g_object_unref(device_proxy);
1606 static void __bt_hal_device_properties_lookup(GVariant *result, char *address)
1608 /* Buffer and propety count management */
1609 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
1610 struct hal_ev_device_found *ev = (void *) buf;
1612 memset(buf, 0, sizeof(buf));
1616 GVariant *tmp_value;
1619 gchar *manufacturer_data = NULL;
1622 if (result != NULL) {
1623 g_variant_get(result , "(@a{sv})", &value);
1624 g_variant_unref(result);
1627 tmp_value = g_variant_lookup_value(value, "Alias", G_VARIANT_TYPE_STRING);
1629 g_variant_get(tmp_value, "s", &name);
1631 g_variant_unref(tmp_value);
1633 DBG_SECURE("Alias Name [%s]", name);
1634 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1635 strlen(name) + 1, name);
1637 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1640 tmp_value = g_variant_lookup_value(value, "Name", G_VARIANT_TYPE_STRING);
1641 g_variant_get(tmp_value, "s", &name);
1642 g_variant_unref(tmp_value);
1644 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1645 strlen(name) + 1, name);
1647 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1648 g_variant_get(tmp_value, "s", &name);
1652 tmp_value = g_variant_lookup_value(value, "Class", G_VARIANT_TYPE_UINT32);
1653 unsigned int class = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1654 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
1655 sizeof(unsigned int), &class);
1658 g_variant_unref(tmp_value);
1662 tmp_value = g_variant_lookup_value(value, "Connected", G_VARIANT_TYPE_BOOLEAN);
1663 unsigned int connected = tmp_value ? g_variant_get_boolean(tmp_value) : 0;
1664 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
1665 sizeof(unsigned int), &connected);
1667 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
1669 g_variant_unref(tmp_value);
1672 tmp_value = g_variant_lookup_value(value, "Trusted", G_VARIANT_TYPE_BOOLEAN);
1673 uint8_t trust = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1674 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
1675 sizeof(uint8_t), &trust);
1677 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
1679 g_variant_unref(tmp_value);
1682 tmp_value = g_variant_lookup_value(value, "Paired", G_VARIANT_TYPE_BOOLEAN);
1683 uint8_t paired = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1685 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
1686 sizeof(uint8_t), &paired);
1688 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
1690 g_variant_unref(tmp_value);
1693 tmp_value = g_variant_lookup_value(value, "RSSI", G_VARIANT_TYPE_INT32);
1694 int rssi = tmp_value ? g_variant_get_int32(tmp_value) : 0;
1695 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
1696 sizeof(int), &rssi);
1698 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
1700 g_variant_unref(tmp_value);
1702 /* Last Addr Type */
1703 tmp_value = g_variant_lookup_value(value, "LastAddrType", G_VARIANT_TYPE_UINT32);
1704 unsigned int addr_type = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1706 g_variant_unref(tmp_value);
1707 DBG("Device Last Address Type [0x%x]", addr_type);
1710 tmp_value = g_variant_lookup_value(value, "IsAliasSet", G_VARIANT_TYPE_UINT32);
1711 uint8_t is_alias_set = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1712 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
1713 sizeof(uint8_t), &is_alias_set);
1715 DBG("IsAliasSet: [%s], Property num [%d]", (is_alias_set ? "TRUE" : "FALSE"), ev->num_props);
1717 g_variant_unref(tmp_value);
1720 tmp_value = g_variant_lookup_value(value, "UUIDs", G_VARIANT_TYPE_STRING_ARRAY);
1721 gsize uuid_count = g_variant_get_size(tmp_value);
1722 char **uuid_value = g_variant_dup_strv(tmp_value, &uuid_count);
1724 /* UUID collection */
1729 int num_props_tmp = ev->num_props;
1731 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
1733 for (i = 0; uuid_value[i] != NULL; i++) {
1735 char *uuid_str = NULL;
1736 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
1737 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
1739 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
1740 uuid_str = g_strdup(uuid_value[i]);
1741 DBG("UUID string [%s]\n", uuid_str);
1743 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
1745 for (z = 0; z < 16; z++)
1746 DBG("[0x%x]", uuid[z]);
1749 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
1753 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
1754 (BT_HAL_STACK_UUID_SIZE * uuid_count),
1756 ev->num_props = num_props_tmp + 1;
1759 g_variant_unref(tmp_value);
1761 /* LegacyManufacturerDataLen */
1762 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerDataLen", G_VARIANT_TYPE_UINT32);
1763 unsigned int manufacturer_data_len = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1764 if (manufacturer_data_len > BT_HAL_MANUFACTURER_DATA_LENGTH_MAX) {
1765 ERR("manufacturer_data_len is too long(len = %d)", manufacturer_data_len);
1766 manufacturer_data_len = BT_HAL_MANUFACTURER_DATA_LENGTH_MAX;
1769 g_variant_unref(tmp_value);
1770 /*size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA_LEN,
1771 sizeof(unsigned int), &manufacturer_data_len);
1773 DBG("Device Legacy Manufacturer data length [%u]", manufacturer_data_len);
1775 /* ManufacturerData */
1776 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerData", G_VARIANT_TYPE_BYTESTRING);
1777 manufacturer_data = value ? (gchar *)g_variant_get_bytestring(tmp_value) : NULL;
1778 if (manufacturer_data) {
1779 if (manufacturer_data_len > 0) {
1780 //size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA,
1781 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_BLE_ADV_DATA,
1782 manufacturer_data_len, manufacturer_data);
1787 g_variant_unref(tmp_value);
1791 _bt_hal_convert_addr_string_to_type(bdaddr, address);
1792 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
1793 sizeof(bdaddr), bdaddr);
1795 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
1798 g_variant_unref(value);
1800 ERR("result is NULL\n");
1803 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
1804 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
1809 static void __bt_hal_send_device_acl_connection_state_event(int status, gboolean connected, const char *address)
1812 struct hal_ev_acl_state_changed ev;
1815 ev.state = (connected == TRUE) ?
1816 HAL_ACL_STATE_CONNECTED :
1817 HAL_ACL_STATE_DISCONNECTED;
1819 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1822 ERR("Bluetooth HAL event handler not registered");
1824 event_cb(HAL_EV_ACL_STATE_CHANGED, &ev, sizeof(ev));
1828 static void __bt_hal_send_device_le_connection_state_event(int status, gboolean connected, const char *address)
1831 struct hal_ev_le_conn_state_changed ev;
1834 ev.state = (connected == TRUE) ?
1835 HAL_LE_STATE_CONNECTED :
1836 HAL_LE_STATE_DISCONNECTED;
1838 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1841 ERR("Bluetooth HAL event handler not registered");
1843 event_cb(HAL_EV_LE_CONN_STATE_CHANGED, &ev, sizeof(ev));
1847 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted,
1848 const char *address)
1850 struct hal_ev_device_trust_state_changed ev;
1853 ev.trust = (is_trusted == TRUE) ?
1854 HAL_DEVICE_TRUSTED :
1855 HAL_DEVICE_UNTRUSTED;
1857 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1860 ERR("Bluetooth HAL event handler not registered");
1862 event_cb(HAL_EV_DEVICE_TRUST_CHANGED, &ev, sizeof(ev));
1866 static void __bt_hal_send_device_trusted_profile_changed_event(
1867 uint32_t trust_val, const char *address)
1869 struct hal_ev_device_trusted_profiles_changed ev;
1872 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1873 ev.trust_val = trust_val;
1876 ERR("Bluetooth HAL event handler not registered");
1878 event_cb(HAL_EV_DEVICE_TRUSTED_PROFILES_CHANGED, &ev, sizeof(ev));
1882 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member,
1886 const char *property = NULL;
1890 if (strcasecmp(member, "PropertyChanged") == 0) {
1891 g_variant_get(msg, "(s)", &property);
1892 if (property == NULL)
1894 if (strcasecmp(property, "GattConnected") == 0) {
1895 INFO("GATT Connected");
1896 gboolean connected = FALSE;
1898 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1900 _bt_hal_convert_device_path_to_address(path, address);
1901 g_variant_get(msg, "(b)", &connected);
1903 INFO("Connected device address[%s] connnected[%d]", address, connected);
1905 } else if (strcasecmp(property, "Paired") == 0) {
1906 gboolean paired = FALSE;
1907 struct hal_ev_bond_state_changed ev;
1908 char address[BT_HAL_ADDRESS_STRING_SIZE];
1910 g_variant_get(msg, "(b)", &paired);
1911 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1913 _bt_hal_agent_set_canceled(FALSE);
1914 _bt_hal_convert_device_path_to_address(path, address);
1916 /* Prepare to send event to HAL bluetooth */
1917 ev.status = BT_STATUS_SUCCESS;
1918 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1919 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1922 ERR("Bluetooth HAL event handler not registered");
1924 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
1925 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1927 } else if (strcasecmp(property, "UUIDs") == 0) {
1930 } else if (strcasecmp(member, "DeviceConnected") == 0) {
1931 unsigned char addr_type = 0;
1933 g_variant_get(msg, "(y)", &addr_type);
1935 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1936 _bt_hal_convert_device_path_to_address(path, address);
1938 DBG("Member: [%s]", member);
1939 ERR_C("Connected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
1941 __bt_hal_send_device_acl_connection_state_event(BT_STATUS_SUCCESS, TRUE, address);
1943 __bt_hal_send_device_le_connection_state_event(BT_STATUS_SUCCESS, TRUE, address);
1945 } else if (strcasecmp(member, "Disconnected") == 0) {
1946 unsigned char disc_reason = 0;
1947 unsigned char addr_type = 0;
1950 g_variant_get(msg, "(yy&s)", &addr_type, &disc_reason, &name);
1952 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1953 _bt_hal_convert_device_path_to_address(path, address);
1955 DBG("Member: [%s]", member);
1957 ERR_C("DisConnected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
1958 DBG("Disconnected Reason [%d : %s]", disc_reason, _bt_hal_convert_disc_reason_to_string(disc_reason));
1959 DBG("Name: %s", name);
1961 __bt_hal_send_device_acl_connection_state_event(_bt_hal_convert_disc_reason_to_status(disc_reason), FALSE, address);
1963 __bt_hal_send_device_le_connection_state_event(_bt_hal_convert_disc_reason_to_status(disc_reason), FALSE, address);
1965 } else if (strcasecmp(member, "ProfileStateChanged") == 0) {
1967 char *profile_uuid = NULL;
1969 g_variant_get(msg, "(si)", &profile_uuid, &state);
1970 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1971 _bt_hal_convert_device_path_to_address(path, address);
1973 DBG("Address: %s", address);
1974 DBG("Profile UUID: %s", profile_uuid);
1975 DBG("State: %d", state);
1976 if (strncmp(profile_uuid, HID_UUID, strlen(HID_UUID)) == 0) {
1977 if (state == BT_HAL_PROFILE_STATE_CONNECTED)
1978 __bt_hal_send_hid_connection_state_event(TRUE, address);
1979 else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED)
1980 __bt_hal_send_hid_connection_state_event(FALSE, address);
1982 DBG("Profile state: %d", state);
1984 } else if ((strncmp(profile_uuid, A2DP_SINK_UUID, strlen(A2DP_SINK_UUID)) == 0)) {
1985 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
1986 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTED");
1987 __bt_hal_send_av_connection_state_event(TRUE, address);
1988 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
1989 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
1990 __bt_hal_send_av_connection_state_event(FALSE, address);
1991 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
1992 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
1993 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
1994 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTING");
1996 ERR("A2DP Profile state: Invalid");
1998 } else if ((strncmp(profile_uuid, A2DP_SOURCE_UUID, strlen(A2DP_SOURCE_UUID)) == 0)) {
1999 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2000 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
2001 __bt_hal_send_a2dp_sink_connection_state_event(TRUE, address);
2002 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2003 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
2004 __bt_hal_send_a2dp_sink_connection_state_event(FALSE, address);
2005 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2006 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
2007 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2008 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
2010 } else if (strncmp(profile_uuid, HFP_HF_UUID, strlen(HFP_HF_UUID)) == 0) {
2011 if (state == BT_HAL_PROFILE_STATE_CONNECTING)
2012 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTING");
2013 else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2014 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTED");
2015 __bt_hal_send_hf_connection_state_event(TRUE, address);
2016 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2017 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2018 __bt_hal_send_hf_connection_state_event(FALSE, address);
2019 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2020 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2022 ERR("HFP Profile state: Invalid");
2024 } else if ((strncmp(profile_uuid, AVRCP_TARGET_UUID, strlen(AVRCP_TARGET_UUID)) == 0)) {
2025 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2026 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
2027 __bt_hal_send_avrcp_ctrl_connection_state_event(TRUE, address);
2028 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2029 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
2030 __bt_hal_send_avrcp_ctrl_connection_state_event(FALSE, address);
2031 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2032 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
2033 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2034 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
2037 DBG("Profile[%s] State changed status [%d] ", profile_uuid, state);
2040 g_free(profile_uuid);
2041 } else if (strcasecmp(member, "AdvReport") == 0) {
2042 DBG("Member: [%s]", member);
2043 __bt_hal_handle_adv_report(msg, path);
2047 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path)
2049 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
2050 struct hal_ev_gatt_client_scan_result *ev = (void *)buf;
2052 char *address = NULL;
2053 GVariant *value = NULL;
2054 char *buffer = NULL;
2057 uint8_t addr_type = 0;
2058 uint8_t adv_type = 0;
2064 memset(buf, 0, sizeof(buf));
2067 g_variant_get(msg, "(&syyii@ay)", &address, &addr_type,
2068 &adv_type, &rssi, &data_len, &value);
2070 buffer_len = g_variant_get_size(value);
2072 buffer = (char *)g_variant_get_data(value);
2074 if (data_len != buffer_len) {
2075 ERR("Unexpected: buffer_len: %d, data_len: %d",
2076 buffer_len, data_len);
2077 data_len = buffer_len;
2080 DBG("Address: %s, len: %d, rssi: %d, addr_type: 0x%02X, adv_type: 0x%02X",
2081 address, data_len, rssi, addr_type, adv_type);
2083 _bt_hal_convert_addr_string_to_type(ev->bd_addr, address);
2084 ev->addr_type = addr_type;
2085 ev->adv_type = adv_type;
2088 memcpy(ev->adv_data, buffer, data_len);
2091 DBG("Send le scan result event to HAL, size: [%zd]", size);
2092 gatt_event_cb(HAL_EV_GATT_CLIENT_SCAN_RESULT, buf, size);
2093 g_variant_unref(value);
2096 /* AVRCP Controller Role(Remote:AVRCP Target) Events */
2097 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address)
2100 struct hal_ev_avrcp_ctrl_conn_state ev;
2102 if (connected == TRUE)
2103 INFO("AVRCP(Controller) Profile Connected for address [%s]", address);
2105 INFO("AVRCP(Controller) Profile DisConnected for address [%s]", address);
2107 if (connected == TRUE)
2108 ev.state = HAL_AVRCP_CTRL_STATE_CONNECTED;
2110 ev.state = HAL_AVRCP_CTRL_STATE_DISCONNECTED;
2111 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2113 if (!a2dp_sink_event_cb)
2114 ERR("AV event handler not registered");
2116 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_CONN_STATE, &ev, sizeof(ev));
2119 static int __bt_media_attr_to_type(const char *str)
2121 if (!strcasecmp(str, "Equalizer"))
2122 return HAL_PLAYER_ATTR_EQUALIZER;
2123 else if (!strcasecmp(str, "Repeat"))
2124 return HAL_PLAYER_ATTR_REPEAT;
2125 else if (!strcasecmp(str, "Shuffle"))
2126 return HAL_PLAYER_ATTR_SHUFFLE;
2127 else if (!strcasecmp(str, "Scan"))
2128 return HAL_PLAYER_ATTR_SCAN;
2134 static int __bt_hal_play_status_str_to_type(const char *value)
2136 if (!strcmp(value, "stopped"))
2137 return HAL_PLAYSTATE_STOPPED;
2138 else if (!strcmp(value, "playing"))
2139 return HAL_PLAYSTATE_PLAYING;
2140 else if (!strcmp(value, "paused"))
2141 return HAL_PLAYSTATE_PAUSED;
2142 else if (!strcmp(value, "forward-seek"))
2143 return HAL_PLAYSTATE_FWD_SEEK;
2144 else if (!strcmp(value, "reverse-seek"))
2145 return HAL_PLAYSTATE_REV_SEEK;
2147 return HAL_PLAYSTATE_ERROR;
2150 static void __bt_avrcp_control_parse_properties(struct hal_ev_track_changed *ev, GVariant *item)
2152 GVariant *value = NULL;
2154 char *value_string = NULL;
2155 const char *key = NULL;
2161 g_variant_iter_init(&iter, item);
2162 while (g_variant_iter_loop(&iter, "{sv}", &key, &value)) {
2163 if (strcasecmp(key, "Title") == 0) {
2164 value_string = (char *)g_variant_get_string(value, NULL);
2165 DBG("Value : %s ", value_string);
2166 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TITLE;
2167 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2169 } else if (strcasecmp(key, "Artist") == 0) {
2170 value_string = (char *)g_variant_get_string(value, NULL);
2171 DBG("Value : %s ", value_string);
2172 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ARTIST;
2173 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2175 } else if (strcasecmp(key, "Album") == 0) {
2176 value_string = (char *)g_variant_get_string(value, NULL);
2177 DBG("Value : %s ", value_string);
2178 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ALBUM;
2179 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2181 } else if (strcasecmp(key, "Genre") == 0) {
2182 value_string = (char *)g_variant_get_string(value, NULL);
2183 DBG("Value : %s ", value_string);
2184 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_GENRE;
2185 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2187 } else if (strcasecmp(key, "Duration") == 0) {
2190 val = g_variant_get_uint32(value);
2191 DBG("Value : %li", val);
2192 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_PLAYING_TIME;
2193 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2195 } else if (strcasecmp(key, "NumberOfTracks") == 0) {
2198 val = g_variant_get_uint32(value);
2199 DBG("Value : %li", val);
2200 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_NUM_TRACKS;
2201 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2203 } else if (strcasecmp(key, "TrackNumber") == 0) {
2206 val = g_variant_get_uint32(value);
2207 DBG("Value : %li", val);
2208 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TRACK_NUM;
2209 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2212 DBG("%s not supported, ignoring", key);
2215 if (i >= HAL_MAX_ATTR_NUM) {
2216 ERR(" Received max attribute [%d]", i);
2222 g_variant_iter_free(&iter);
2226 static int __bt_media_attrval_to_val(int type, const char *value)
2231 case HAL_PLAYER_ATTR_EQUALIZER:
2232 if (!strcmp(value, "off"))
2237 case HAL_PLAYER_ATTR_REPEAT:
2238 if (!strcmp(value, "off"))
2239 ret = BTRC_PLAYER_VAL_OFF_REPEAT;
2240 else if (!strcmp(value, "singletrack"))
2241 ret = BTRC_PLAYER_VAL_SINGLE_REPEAT;
2242 else if (!strcmp(value, "alltracks"))
2243 ret = BTRC_PLAYER_VAL_ALL_REPEAT;
2245 ret = BTRC_PLAYER_VAL_GROUP_REPEAT;
2247 case HAL_PLAYER_ATTR_SHUFFLE:
2248 if (!strcmp(value, "off"))
2249 ret = BTRC_PLAYER_VAL_OFF_SHUFFLE;
2250 else if (!strcmp(value, "alltracks"))
2251 ret = BTRC_PLAYER_VAL_ALL_SHUFFLE;
2253 ret = BTRC_PLAYER_VAL_GROUP_SHUFFLE;
2255 case HAL_PLAYER_ATTR_SCAN:
2256 if (!strcmp(value, "off"))
2258 else if (!strcmp(value, "alltracks"))
2264 ERR("Value not handled");
2270 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member,
2273 const char *property = NULL;
2274 GVariant *value = NULL;
2276 char address[BT_HAL_ADDRESS_STRING_SIZE];
2279 ERR("Error returned in method call\n");
2283 if (!avrcp_ctrl_event_cb) {
2284 ERR("AVRCP controller DBUS handler callback not registered");
2288 g_variant_iter_init(&iter, msg);
2290 _bt_hal_convert_device_path_to_address(path, address);
2292 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2293 DBG("Property = %s \n", property);
2294 if ((strcasecmp(property, "Equalizer") == 0) ||
2295 (strcasecmp(property, "Repeat") == 0) ||
2296 (strcasecmp(property, "Shuffle") == 0) ||
2297 (strcasecmp(property, "Scan") == 0)) {
2298 struct hal_ev_player_setting ev;
2302 valstr = g_variant_get_string(value, NULL);
2303 DBG("Value : %s ", valstr);
2306 val = __bt_media_attrval_to_val(__bt_media_attr_to_type(property), valstr);
2309 memset(&ev, 0, sizeof(ev));
2310 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2312 ev.attr_ids[0] = __bt_media_attr_to_type(property);
2313 ev.attr_values[0] = val;
2315 /* Send event to application */
2316 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAYER_APP_SETTING_CHANGED, &ev, sizeof(ev));
2318 } else if ((strcasecmp(property, "Status") == 0)) {
2319 struct hal_ev_play_status_changed ev;
2322 valstr = g_variant_get_string(value, NULL);
2323 DBG("Value : %s ", valstr);
2325 memset(&ev, 0, sizeof(ev));
2326 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2328 ev.status = __bt_hal_play_status_str_to_type(valstr);
2330 /* Send event to application */
2331 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_STATUS_CHANGED, &ev, sizeof(ev));
2333 } else if (strcasecmp(property, "Position") == 0) {
2334 struct hal_ev_play_position ev;
2336 memset(&ev, 0, sizeof(ev));
2337 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2338 ev.pos = g_variant_get_uint32(value);
2339 DBG("Value : %d ", ev.pos);
2341 /* Send event to application */
2342 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_POSITION_CHANGED, &ev, sizeof(ev));
2343 } else if (strcasecmp(property, "Track") == 0) {
2344 struct hal_ev_track_changed ev;
2346 memset(&ev, 0, sizeof(ev));
2347 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2348 __bt_avrcp_control_parse_properties(&ev, value);
2350 /* Send event to application */
2351 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_TRACK_CHANGED, &ev, sizeof(ev));
2353 DBG("Property not handled");
2357 g_free((char *)property);
2358 g_variant_unref(value);
2361 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member,
2364 const char *property = NULL;
2365 GVariant *value = NULL;
2367 char address[BT_HAL_ADDRESS_STRING_SIZE];
2371 ERR("Error returned in method call\n");
2375 if (!avrcp_tg_event_cb) {
2376 ERR("AVRCP target DBUS handler callback not registered");
2380 g_variant_iter_init(&iter, msg);
2382 _bt_hal_convert_device_path_to_address(path, address);
2384 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2385 DBG("Property = %s \n", property);
2386 if ((strcasecmp(property, "Delay") == 0)) {
2387 struct hal_ev_avrcp_tg_delay_changed ev;
2390 memset(&ev, 0, sizeof(ev));
2391 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2393 val = g_variant_get_uint16(value);
2394 DBG("Value : %d", val);
2397 /* Send event to application */
2398 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_DELAY_CHANGE, &ev, sizeof(ev));
2400 DBG("Property not handled");
2405 g_free((char *)property);
2406 g_variant_unref(value);
2409 /* A2DP Src Role(Remote:Sink) Events */
2410 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address)
2413 struct hal_ev_a2dp_conn_state ev;
2415 if (connected == TRUE)
2416 INFO("A2DP(Src) Profile Connected for address [%s]", address);
2418 INFO("A2DP(Src) Profile DisConnected for address [%s]", address);
2420 ev.state = (connected == TRUE) ?
2421 HAL_EV_A2DP_STATE_CONNECTED :
2422 HAL_EV_A2DP_STATE_DISCONNECTED;
2424 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2427 ERR("AV event handler not registered");
2429 av_event_cb(HAL_EV_A2DP_CONN_STATE, &ev, sizeof(ev));
2432 /* A2DP Sink Role(Remote:Source) Events */
2433 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address)
2436 struct hal_ev_a2dp_conn_state ev;
2438 if (connected == TRUE)
2439 INFO("A2DP(Sink) Profile Connected for address [%s]", address);
2441 INFO("A2DP(Sink) Profile DisConnected for address [%s]", address);
2443 ev.state = (connected == TRUE) ?
2444 HAL_EV_A2DP_STATE_CONNECTED :
2445 HAL_EV_A2DP_STATE_DISCONNECTED;
2447 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2449 if (!a2dp_sink_event_cb)
2450 ERR("AV event handler not registered");
2452 a2dp_sink_event_cb(HAL_EV_A2DP_SOURCE_CONN_STATE, &ev, sizeof(ev));
2455 /* HF(AG Role) Audio Events */
2456 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected,
2457 const char *address)
2460 struct hal_ev_handsfree_audio_state ev;
2462 if (connected == TRUE)
2463 INFO("AG Audio Connected for address [%s]", address);
2465 INFO("AG Audio DisConnected for address [%s]", address);
2467 ev.state = (connected == TRUE) ?
2468 HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTED :
2469 HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED;
2471 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2474 ERR("HF event handler not registered");
2476 hf_event_cb(HAL_EV_HANDSFREE_AUDIO_STATE, &ev, sizeof(ev));
2479 /* HF(AG Role) Profile Events */
2480 static void __bt_hal_send_hf_connection_state_event(gboolean connected,
2481 const char *address)
2484 struct hal_ev_handsfree_conn_state ev;
2486 if (connected == TRUE)
2487 INFO("AG Profile Connected for address [%s]", address);
2489 INFO("AG Profile DisConnected for address [%s]", address);
2491 ev.state = (connected == TRUE) ?
2492 HAL_EV_HANDSFREE_CONN_STATE_CONNECTED :
2493 HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTED;
2495 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2498 ERR("HF event handler not registered");
2500 hf_event_cb(HAL_EV_HANDSFREE_CONN_STATE, &ev, sizeof(ev));
2503 void _bt_hal_register_event_handler_cb(bt_hal_module_e module, handle_stack_msg cb)
2513 a2dp_sink_event_cb = cb;
2519 avrcp_tg_event_cb = cb;
2521 case HAL_AVRCP_CTRL:
2522 avrcp_ctrl_event_cb = cb;
2528 ERR("Unknown module: %d", module);
2532 void _bt_hal_unregister_event_handler_cb(bt_hal_module_e module)
2536 hid_event_cb = NULL;
2542 a2dp_sink_event_cb = NULL;
2548 avrcp_tg_event_cb = NULL;
2550 case HAL_AVRCP_CTRL:
2551 avrcp_ctrl_event_cb = NULL;
2554 gatt_event_cb = NULL;
2557 ERR("Unknown module: %d", module);
2561 bool _bt_hal_get_adapter_request_state(void)
2563 return is_adapter_activating;
2566 bool _bt_hal_get_le_request_state(void)
2568 return is_le_activating;
2571 void _bt_hal_set_adapter_request_state(bool enable)
2573 DBG("set_adapter_request_state %d", enable);
2574 is_adapter_activating = enable;
2577 void _bt_hal_set_le_request_state(bool enable)
2579 DBG("set_le_request_state %d", enable);
2580 is_le_activating = enable;