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 hid_device_event_cb = NULL;
56 static handle_stack_msg av_event_cb = NULL;
57 static handle_stack_msg a2dp_sink_event_cb = NULL;
58 static handle_stack_msg hf_event_cb = NULL;
59 static handle_stack_msg hf_client_event_cb = NULL;
60 static handle_stack_msg avrcp_ctrl_event_cb = NULL;
61 static handle_stack_msg avrcp_tg_event_cb = NULL;
62 static handle_stack_msg gatt_event_cb = NULL;
63 static guint event_id;
65 /*State Management sepration Control for Adapter and LE */
66 static gboolean is_adapter_activating = FALSE;
67 static gboolean is_le_activating = FALSE;
72 gchar* interface_name;
75 } bt_hal_main_event_data_t;
77 /* Forward declarations */
78 static gboolean __bt_hal_event_manager(gpointer param);
79 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type);
80 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn, int subscribe);
81 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn, int subscribe);
82 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe);
84 static int __bt_hal_parse_event(GVariant *msg);
85 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current);
87 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path);
88 static void __bt_hal_adapter_property_changed_event(GVariant *msg);
89 static void __bt_hal_manager_event_filter(GDBusConnection *connection, const gchar *sender_name,
90 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
91 GVariant *parameters, gpointer user_data);
92 static int __bt_hal_initialize_manager_receiver(void);
93 static gboolean __bt_hal_parse_interface(GVariant *msg);
94 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters);
95 static gboolean __bt_hal_parse_device_properties(GVariant *item);
96 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data);
97 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path);
98 static void __bt_hal_dbus_device_found_properties(const char *device_path);
99 static void __bt_hal_device_properties_lookup(GVariant *result, char *address);
100 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member, const char *path);
101 static void __bt_hal_send_device_acl_connection_state_event(int status, gboolean connected, const char *address);
102 static void __bt_hal_handle_input_event(GVariant *msg, const char *path);
103 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address);
104 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address);
105 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address);
106 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member, const char *path);
107 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member, const char *path);
109 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted, const char *address);
110 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn, int subscribe);
111 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path);
112 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected, const char *address);
113 static void __bt_hal_send_hf_connection_state_event(gboolean connected, const char *address);
114 static void __bt_hal_send_device_trusted_profile_changed_event(uint32_t trust_val, const char *address);
115 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path);
116 static void __bt_hal_handle_gatts_mtu_changed_event(char *address, int mtu);
117 static void __bt_hal_send_hf_client_connection_state_event(gboolean connected, const char *address);
120 static gboolean __bt_hal_discovery_finished_cb(gpointer user_data)
124 struct hal_ev_discovery_state_changed ev;
125 ev.state = HAL_DISCOVERY_STATE_STOPPED;
126 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
132 static int __bt_hal_parse_event(GVariant *msg)
136 char *interface_name = NULL;
137 GVariant *inner_iter = NULL;
139 g_variant_iter_init(&iter, msg);
141 while ((child = g_variant_iter_next_value(&iter))) {
142 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
143 if (g_strcmp0(interface_name,
144 BT_HAL_DEVICE_INTERFACE) == 0) {
145 DBG("__bt_hal_parse_event: Interface: BT_HAL_DEVICE_INTERFACE");
146 g_variant_unref(inner_iter);
147 g_variant_unref(child);
148 return BT_HAL_DEVICE_EVENT;
149 } else if (g_strcmp0(interface_name,
150 BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
151 DBG("__bt_hal_parse_event: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
152 g_variant_unref(inner_iter);
153 g_variant_unref(child);
154 return BT_HAL_MEDIA_TRANSFER_EVENT;
155 } else if (g_strcmp0(interface_name,
156 BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
157 DBG("__bt_hal_parse_event: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
158 g_variant_unref(inner_iter);
159 g_variant_unref(child);
160 return BT_HAL_AVRCP_CONTROL_EVENT;
162 g_variant_unref(inner_iter);
163 g_variant_unref(child);
169 static int __bt_hal_get_owner_info(GVariant *msg, char **name, char **previous, char **current)
171 g_variant_get(msg, "(&s&s&s)", name, previous, current);
172 return BT_HAL_ERROR_NONE;
175 int __bt_insert_hal_properties(void *buf, uint8_t type, uint16_t len, const void *val)
176 { struct hal_property *prop = buf;
182 memcpy(prop->val, val, len);
184 return sizeof(*prop) + len;
187 handle_stack_msg _bt_hal_get_stack_message_handler(void)
192 static void __bt_hal_adapter_property_changed_event(GVariant *msg)
194 GVariantIter value_iter;
195 GVariant *value = NULL;
196 GDBusProxy *adapter_proxy;
199 g_variant_iter_init(&value_iter, msg);
201 /* Buffer and propety count management */
202 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
203 struct hal_ev_adapter_props_changed *ev = (void*) buf;
205 const gchar *address = NULL;
207 unsigned int cod = 0;
208 unsigned int a2dp_role = 0;
209 gboolean discoverable;
210 gboolean connectable;
211 unsigned int scan_mode = BT_SCAN_MODE_NONE;
212 unsigned int disc_timeout;
213 const gchar *version;
214 gboolean ipsp_initialized;
217 unsigned int pairable_timeout;
218 gboolean scan_mode_property_update = FALSE;
219 gboolean is_discovering;
220 gboolean is_le_discovering;
222 memset(buf, 0, sizeof(buf));
225 ev->status = BT_STATUS_SUCCESS;
229 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
230 if (!g_strcmp0(key, "Address")) {
233 address = g_variant_get_string(value, NULL);
234 DBG("##Address [%s]", address);
235 _bt_hal_convert_addr_string_to_type(bdaddr, address);
236 size += __bt_insert_hal_properties(buf + size,
237 HAL_PROP_ADAPTER_ADDR, sizeof(bdaddr), bdaddr);
239 } else if (!g_strcmp0(key, "Alias")) {
240 g_variant_get(value, "&s", &name);
241 DBG("##Alias [%s] ", name);
242 size += __bt_insert_hal_properties(buf + size,
243 HAL_PROP_ADAPTER_NAME, strlen(name) + 1, name);
245 } else if (!g_strcmp0(key, "Class")) {
246 cod = g_variant_get_uint32(value);
247 DBG("##Class [%d]", cod);
248 size += __bt_insert_hal_properties(buf + size,
249 HAL_PROP_ADAPTER_CLASS, sizeof(unsigned int), &cod);
251 } else if (!g_strcmp0(key, "Discoverable")) {
252 discoverable = g_variant_get_boolean(value);
253 DBG("##Discoverable [%d]", discoverable);
255 scan_mode = BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE;
257 scan_mode = BT_SCAN_MODE_CONNECTABLE;
258 scan_mode_property_update = TRUE;
259 } else if (!g_strcmp0(key, "DiscoverableTimeout")) {
260 disc_timeout = g_variant_get_uint32(value);
261 DBG("##Discoverable Timeout [%d]", disc_timeout);
262 size += __bt_insert_hal_properties(buf + size,
263 HAL_PROP_ADAPTER_DISC_TIMEOUT, sizeof(unsigned int), &disc_timeout);
265 } else if (!g_strcmp0(key, "Connectable")) {
266 connectable = g_variant_get_boolean(value);
267 DBG("##Connectable [%d]", connectable);
269 scan_mode = BT_SCAN_MODE_NONE;
270 else if (scan_mode == BT_SCAN_MODE_NONE)
271 scan_mode = BT_SCAN_MODE_CONNECTABLE;
272 scan_mode_property_update = TRUE;
273 } else if (!g_strcmp0(key, "Version")) {
274 version = g_variant_get_string(value, NULL);
275 DBG("##Version [%s]", version);
276 size += __bt_insert_hal_properties(buf + size,
277 HAL_PROP_ADAPTER_VERSION, strlen(version) + 1, version);
279 } else if (!g_strcmp0(key, "Name")) {
280 g_variant_get(value, "&s", &name);
281 DBG("##Name [%s]", name);
282 size += __bt_insert_hal_properties(buf + size,
283 HAL_PROP_ADAPTER_NAME, strlen(name) + 1, name);
285 } else if (!g_strcmp0(key, "Powered")) {
286 powered = g_variant_get_boolean(value);
287 DBG("##Powered = %d", powered);
288 /* TODO: Need to check this operation!! */
289 if (powered == FALSE) {
290 DBG("###### Adapter Powered Down ######");
291 struct hal_ev_adapter_state_changed ev;
292 ev.state = HAL_POWER_OFF;
293 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
295 struct hal_ev_le_state_changed le_ev;
296 le_ev.state = HAL_POWER_OFF;
297 event_cb(HAL_EV_LE_STATE_CHANGED, &le_ev, sizeof(le_ev));
300 _bt_hal_destroy_adapter_agent();
302 DBG("###### Adapter Powered Up ######");
303 if (_bt_hal_get_adapter_request_state()) {
304 DBG("Sending STATE CHANGE EVENT for Adapter... ");
305 _bt_hal_set_adapter_request_state(FALSE);
306 struct hal_ev_adapter_state_changed ev;
307 ev.state = HAL_POWER_ON;
308 event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev));
311 if (_bt_hal_get_le_request_state()) {
312 DBG("Sending STATE CHANGE EVENT for LE... ");
313 _bt_hal_set_le_request_state(FALSE);
314 struct hal_ev_le_state_changed ev;
315 ev.state = HAL_POWER_ON;
316 event_cb(HAL_EV_LE_STATE_CHANGED, &ev, sizeof(ev));
320 _bt_hal_initialize_adapter_agent();
323 } else if (!g_strcmp0(key, "Pairable")) {
324 pairable = g_variant_get_boolean(value);
325 DBG("##Pairable [%d]", pairable);
326 } else if (!g_strcmp0(key, "PairableTimeout")) {
327 pairable_timeout = g_variant_get_uint32(value);
328 DBG("##Pairable Timeout = %d", pairable_timeout);
329 } else if (!g_strcmp0(key, "UUIDs")) {
334 size1 = g_variant_get_size(value);
335 int num_props_tmp = ev->num_props;
337 uuid_value = (char **)g_variant_get_strv(value, &size1);
338 for (i = 0; uuid_value[i] != NULL; i++)
340 /* UUID collection */
341 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
342 for (i = 0; uuid_value[i] != NULL; i++) {
343 char *uuid_str = NULL;
344 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
345 uuid_str = g_strdup(uuid_value[i]);
346 DBG("##UUID string [%s]\n", uuid_str);
347 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
348 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
351 size += __bt_insert_hal_properties(buf + size, HAL_PROP_ADAPTER_UUIDS,
352 (BT_HAL_STACK_UUID_SIZE * uuid_count),
354 ev->num_props = num_props_tmp + 1;
357 } else if (!g_strcmp0(key, "Discovering")) {
358 is_discovering = g_variant_get_boolean(value);
359 DBG("##Discovering = [%d]", is_discovering);
361 if (is_discovering == FALSE) {
362 DBG("###### Adapter Has stopped Discovering ######");
363 /* In Tizen Bluez, this actually does not mean Discovery is stopped
364 in Bluez. Tizen Bluez sends this event after a certain timeout,
365 Therefore, we must forecefully call StopDiscovery to stop discovery in BlueZ */
369 adapter_proxy = _bt_hal_get_adapter_proxy();
371 if (adapter_proxy == NULL)
374 /* Need to stop searching */
375 DBG("Event though Bluez reported DIscovering stopped, we force stop Discovery ");
376 g_dbus_proxy_call_sync(adapter_proxy, "StopDiscovery",
378 G_DBUS_CALL_FLAGS_NONE,
382 ERR("Dbus Error : %s", err->message);
384 /* This error is thrown by Bluez, as Discovery is already stopped.
385 Discovery is stopped if user cancels on going discovery.
386 In order to maintain correct state of Bluetooth Discovery state,
387 simply send Discovery stopped event to HAL user */
388 struct hal_ev_discovery_state_changed ev;
389 ev.state = HAL_DISCOVERY_STATE_STOPPED;
390 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
395 event_id = g_timeout_add(BT_HAL_DISCOVERY_FINISHED_DELAY,
396 (GSourceFunc)__bt_hal_discovery_finished_cb, NULL);
400 DBG("###### Adapter Has started Discovering ######");
401 struct hal_ev_discovery_state_changed ev;
402 ev.state = HAL_DISCOVERY_STATE_STARTED;
403 event_cb(HAL_EV_DISCOVERY_STATE_CHANGED, &ev, sizeof(ev));
406 } else if (!g_strcmp0(key, "LEDiscovering")) {
409 is_le_discovering = g_variant_get_boolean(value);
410 DBG("##LE Discovering = [%d]", is_le_discovering);
412 if (is_le_discovering) {
413 /* Send LE discovering started event */
414 size += __bt_insert_hal_properties(buf + size,
415 HAL_PROP_ADAPTER_LE_DISCOVERY_STARTED, 0, NULL);
420 adapter_proxy = _bt_hal_get_adapter_proxy();
421 if (adapter_proxy == NULL) {
422 ERR("adapter_proxy == NULL");
426 /* Need to stop searching */
427 result = g_dbus_proxy_call_sync(adapter_proxy, "StopLEDiscovery",
428 NULL, G_DBUS_CALL_FLAGS_NONE,
429 DBUS_TIMEOUT, NULL, &err);
431 ERR("Error occured in Proxy call");
433 ERR("(Error: %s)", err->message);
437 g_variant_unref(result);
440 /* Send LE discovering finished event */
441 size += __bt_insert_hal_properties(buf + size,
442 HAL_PROP_ADAPTER_LE_DISCOVERY_STOPPED, 0, NULL);
444 } else if (!g_strcmp0(key, "Modalias")) {
445 char *modalias = NULL;
446 g_variant_get(value, "s", &modalias);
447 DBG("##Adapter ModAlias [%s]", modalias);
448 } else if (!g_strcmp0(key, "SupportedLEFeatures")) {
449 DBG("##LE Supported features");
452 GVariantIter *iter = NULL;
453 g_variant_get(value, "as", &iter);
454 bt_local_le_features_t le_features;
455 gboolean le_features_present = FALSE;
460 memset(&le_features, 0x00, sizeof(le_features));
462 while (g_variant_iter_next(iter, "&s", &name) &&
463 g_variant_iter_next(iter, "&s", &val)) {
464 DBG("name = %s, Value = %s", name, val);
465 if (FALSE == _bt_hal_update_le_feature_support(name, val, &le_features))
466 ERR("Failed to update LE feature (name = %s, value = %s)", name, val);
468 le_features_present = TRUE;
471 g_variant_iter_free(iter);
472 if (le_features_present) {
473 size += __bt_insert_hal_properties(buf + size,
474 HAL_PROP_ADAPTER_LOCAL_LE_FEAT, sizeof(le_features), &le_features);
477 DBG("le supported features values are NOT provided by Stack");
479 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
480 g_variant_get(value, "b" , &ipsp_initialized);
481 DBG("##IPSP Initialized = %d", ipsp_initialized);
482 } else if (!g_strcmp0(key, "A2dpRole")) {
483 a2dp_role = g_variant_get_uint32(value);
484 DBG("##A2dp Role [%d]", a2dp_role);
485 size += __bt_insert_hal_properties(buf + size,
486 HAL_PROP_ADAPTER_A2DP_ROLE, sizeof(unsigned int), &a2dp_role);
489 ERR("Unhandled Property:[%s]", key);
493 if (scan_mode_property_update) {
494 size += __bt_insert_hal_properties(buf + size,
495 HAL_PROP_ADAPTER_SCAN_MODE, sizeof(int), &scan_mode);
501 DBG("Send Adapter properties changed event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
502 event_cb(HAL_EV_ADAPTER_PROPS_CHANGED, buf, size);
508 static void __bt_hal_flight_ps_mode_cb(keynode_t *node, void *data)
510 gboolean flight_mode = FALSE;
512 DBG_SECURE("HAL callback hit");
513 DBG_SECURE("key=%s", vconf_keynode_get_name(node));
514 type = vconf_keynode_get_type(node);
515 if (type == VCONF_TYPE_BOOL) {
516 flight_mode = vconf_keynode_get_bool(node);
517 if (flight_mode != TRUE) {
518 ERR("Ignore the event");
521 ERR("Flight Mode == TRUE");
524 ERR("Invaild vconf key type : %d", type);
527 DBG("Enabling core now");
528 _bt_hal_enable_core();
531 static void _bt_hal_register_vconf_handler(void)
535 if (vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
536 (vconf_callback_fn)__bt_hal_flight_ps_mode_cb, NULL) < 0)
537 ERR("Unable to register key handler");
538 DBG("Telephony is disabled");
539 if (vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE,
540 (vconf_callback_fn)__bt_hal_flight_ps_mode_cb, NULL) < 0)
541 ERR("Unable to register key handler");
544 void _bt_hal_handle_adapter_event(GVariant *msg, const char *member)
551 if (strcasecmp(member, "DeviceCreated") == 0) {
552 DBG("DeviceCreated: Unhandled");
553 } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
554 DBG("InterfacesRemoved: Unhandled");
555 } else if (strcasecmp(member, "AdvertisingEnabled") == 0) {
556 DBG("AdvertisingEnabled");
557 DBG("Advertising Enabled");
559 gboolean status = FALSE;
560 g_variant_get(msg, "(ib)", &slot_id, &status);
561 DBG("Advertising Enabled : server_slot_id [%d] status [%d]", slot_id, status);
562 /* Send event to application */
563 _bt_hal_set_advertising_status(slot_id, status);
564 } else if (strcasecmp(member, "RssiEnabled") == 0) {
565 struct hal_ev_rssi_monitor_state_changed ev;
566 gboolean status = FALSE;
567 char *address = NULL;
570 g_variant_get(msg, "(sib)", &address, &link_type, &status);
571 DBG("RSSI monitoring %s for %s",
572 (status ? "Enabled" : "Disabled"), address);
574 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
575 ev.link_type = link_type;
576 ev.state = (status ? HAL_RSSI_MONITORING_ENABLED : HAL_RSSI_MONITORING_DISABLED);
578 ERR("event_cb is NULL");
580 event_cb(HAL_EV_RSSI_MONITOR_STATE_CHANGED, &ev, sizeof(ev));
583 } else if (strcasecmp(member, "RssiAlert") == 0) {
584 struct hal_ev_rssi_alert_recieved ev;
588 char *address = NULL;
590 g_variant_get(msg, "(siii)", &address, &link_type, &alert_type, &rssi_dbm);
591 DBG("RSSI Alert: [Address %s LinkType %d] [Type %d DBM %d]",
592 address, alert_type, rssi_dbm, link_type);
594 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
595 ev.link_type = link_type;
596 ev.alert_type = alert_type;
600 ERR("event_cb is NULL");
602 event_cb(HAL_EV_RSSI_ALERT_RECIEVED, &ev, sizeof(ev));
605 } else if (strcasecmp(member, "RawRssi") == 0) {
606 struct hal_ev_raw_rssi_recieved ev;
609 char *address = NULL;
611 g_variant_get(msg, "(sii)", &address, &link_type, &rssi_dbm);
612 DBG("Raw RSSI: [Address %s] [Link Type %d][RSSI DBM %d]",
613 address, link_type, rssi_dbm);
615 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
616 ev.link_type = link_type;
620 ERR("event_cb is NULL");
622 event_cb(HAL_EV_RAW_RSSI_RECIEVED, &ev, sizeof(ev));
625 } else if (strcasecmp(member, BT_HAL_HARDWARE_ERROR) == 0) {
626 DBG("BT Hardware Error: Unhandled");
627 } else if (strcasecmp(member, BT_HAL_TX_TIMEOUT_ERROR) == 0) {
628 DBG("BT TX Timeout Error: Unhandled");
634 static gboolean __bt_hal_parse_device_properties(GVariant *item)
644 /* Buffer and propety count management */
645 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
646 struct hal_ev_device_found *ev = (void *) buf;
648 memset(buf, 0, sizeof(buf));
652 g_variant_iter_init(&iter, item);
653 while (g_variant_iter_loop(&iter, "{sv}", &key, &val)) {
655 if (strcasecmp(key, "Address") == 0) {
657 char * address = NULL;
658 address = g_variant_dup_string(val, &len);
660 _bt_hal_convert_addr_string_to_type(bdaddr, address);
662 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
663 sizeof(bdaddr), bdaddr);
666 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
668 } else if (strcasecmp(key, "Class") == 0) {
669 unsigned int class = g_variant_get_uint32(val);
670 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
671 sizeof(unsigned int), &class);
673 DBG("Device class [%d] Property num [%d]", class, ev->num_props);
674 } else if (strcasecmp(key, "name") == 0) {
675 char *name = g_variant_dup_string(val, &len);
677 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
678 strlen(name) + 1, name);
680 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
683 } else if (strcasecmp(key, "Connected") == 0) {
684 unsigned int connected = g_variant_get_byte(val);
686 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
687 sizeof(unsigned int), &connected);
689 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
690 } else if (strcasecmp(key, "paired") == 0) {
691 uint8_t paired = (g_variant_get_boolean(val) ? 1 : 0);
692 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
693 sizeof(uint8_t), &paired);
695 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
696 } else if (strcasecmp(key, "Trusted") == 0) {
697 uint8_t trust = (g_variant_get_boolean(val) ? 1 : 0);
698 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
699 sizeof(uint8_t), &trust);
701 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
702 } else if (strcasecmp(key, "RSSI") == 0) {
703 int rssi = g_variant_get_int16(val);
704 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
707 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
708 } else if (strcasecmp(key, "LastAddrType") == 0) {
709 /* TODO: To be handled later*/
710 } else if (!g_strcmp0(key, "IsAliasSet")) {
711 uint8_t is_alias_set = (g_variant_get_boolean(val) ? 1 : 0);
712 DBG("IsAliasSet: %s", (is_alias_set ? "TRUE" : "FALSE"));
713 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
714 sizeof(uint8_t), &is_alias_set);
716 } else if (strcasecmp(key, "UUIDs") == 0) {
721 size1 = g_variant_get_size(val);
722 DBG("UUID count from size [%zu]\n", size1);
723 int num_props_tmp = ev->num_props;
726 uuid_value = (char **)g_variant_get_strv(val, &size1);
727 for (i = 0; uuid_value[i] != NULL; i++)
729 DBG("UUID count [%d]\n", uuid_count);
730 /* UUID collection */
731 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
733 for (i = 0; uuid_value[i] != NULL; i++) {
735 char *uuid_str = NULL;
736 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
737 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
739 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
740 uuid_str = g_strdup(uuid_value[i]);
741 DBG("UUID string [%s]\n", uuid_str);
742 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
743 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
747 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
748 (BT_HAL_STACK_UUID_SIZE * uuid_count),
750 ev->num_props = num_props_tmp + 1;
754 } else if (strcasecmp(key, "LegacyManufacturerDataLen") == 0) {
755 /* TODO: To be handled later*/
756 } else if (strcasecmp(key, "LegacyManufacturerData") == 0) {
757 /* TODO: To be handled later*/
759 ERR("Unhandled Property:[%s]", key);
765 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
766 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
772 static void __bt_hal_handle_avrcp_tg_events(GVariant *msg, const char *path)
775 GVariantIter value_iter;
776 char *property = NULL;
778 GVariant *val = NULL;
779 GVariant *child = NULL;
781 g_variant_iter_init(&value_iter, msg);
782 while ((child = g_variant_iter_next_value(&value_iter))) {
783 g_variant_get(child, "{sv}", &property, &val);
784 INFO("Property %s", property);
785 if (strcasecmp(property, "Connected") == 0) {
786 struct hal_ev_avrcp_tg_conn_state ev;
788 gboolean connected = FALSE;
790 g_variant_get(val, "b", &connected);
792 state = connected ? HAL_AVRCP_TG_STATE_CONNECTED :
793 HAL_AVRCP_TG_STATE_DISCONNECTED;
795 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
797 _bt_hal_convert_device_path_to_address(path, address);
799 DBG("connected: %d", connected);
800 DBG("address: %s", address);
802 /* Prepare to send AVRCP Target connection state event */
803 memset(&ev, 0, sizeof(ev));
804 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
806 if (!avrcp_tg_event_cb)
807 ERR("AVRCP target DBUS handler callback not registered");
809 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_CONN_STATE, (void *)&ev, sizeof(ev));
813 g_variant_unref(child);
814 g_variant_unref(val);
820 static void __bt_hal_handle_property_changed_event(GVariant *msg, const char *object_path)
822 char *interface_name = NULL;
823 GVariant *val = NULL;
825 g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, &val, NULL);
827 if (!interface_name) {
828 DBG("Failed to get interface name");
831 g_variant_unref(val);
835 if (strcasecmp(interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
836 DBG("Event: Property Changed: Interface: BT_HAL_ADAPTER_INTERFACE");
837 __bt_hal_adapter_property_changed_event(val);
838 } else if (strcasecmp(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
839 DBG("Event: Property Changed: Interface: BT_HAL_DEVICE_INTERFACE");
840 __bt_hal_device_property_changed_event(val, object_path);
841 } else if (strcasecmp(interface_name, BT_HAL_OBEX_TRANSFER_INTERFACE) == 0) {
842 DBG("Event: Property Changed: Interface: BT_HAL_OBEX_TRANSFER_INTERFACE");
843 /* TODO: Handle event */
844 } else if (strcasecmp(interface_name, BT_HAL_MEDIA_CONTROL_INTERFACE) == 0) {
845 DBG("Event: Property Changed: Interface: BT_HAL_MEDIA_CONTROL_INTERFACE");
846 /* Handle AVRCP target event */
847 __bt_hal_handle_avrcp_tg_events(val, object_path);
848 } else if (strcasecmp(interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
849 DBG("Event: Property Changed: Interface: BT_HAL_PLAYER_CONTROL_INTERFACE");
850 __bt_hal_handle_avrcp_ctrl_events(val, NULL, object_path);
851 } else if (strcasecmp(interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
852 DBG("Event: Property Changed: Interface: BT_HAL_MEDIATRANSPORT_INTERFACE");
853 __bt_hal_handle_avrcp_transport_events(val, NULL, object_path);
854 } else if (strcasecmp(interface_name, BT_HAL_NETWORK_CLIENT_INTERFACE) == 0) {
855 DBG("Event: Property Changed: Interface: BT_HAL_NETWORK_CLIENT_INTERFACE");
856 /* TODO: Handle event */
857 } else if (strcasecmp(interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
858 DBG("Event: Property Changed: Interface: BT_HAL_GATT_CHAR_INTERFACE");
859 /* TODO: Handle event */
860 } else if (strcasecmp(interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
861 DBG("Event: Property Changed: Interface: BT_HAL_INPUT_INTERFACE");
862 __bt_hal_handle_input_event(val, object_path);
864 g_variant_unref(val);
867 static void __bt_hal_handle_device_event(GVariant *value, GVariant *parameters)
871 if (__bt_hal_parse_interface(parameters) == FALSE) {
872 ERR("Fail to parse the properies");
873 g_variant_unref(value);
880 static void __bt_hal_send_hid_connection_state_event(
881 gboolean connected, const char *address)
883 struct hal_ev_hidhost_conn_state ev;
885 ev.state = (connected == TRUE) ?
886 HAL_HIDHOST_STATE_CONNECTED :
887 HAL_HIDHOST_STATE_DISCONNECTED;
889 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
892 ERR("HID event handler not registered");
894 hid_event_cb(HAL_EV_HIDHOST_CONN_STATE, &ev, sizeof(ev));
897 static void __bt_hal_send_hid_device_connection_state_event(
898 gboolean connected, const char *address)
900 struct hal_ev_hiddevice_conn_state ev;
902 ev.state = (connected == TRUE) ?
903 HAL_HIDDEVICE_STATE_CONNECTED :
904 HAL_HIDDEVICE_STATE_DISCONNECTED;
906 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
908 if (!hid_device_event_cb)
909 ERR("HID device event handler not registered");
911 hid_device_event_cb(HAL_EV_HIDDEVICE_CONN_STATE, &ev, sizeof(ev));
914 static void __bt_hal_handle_input_event(GVariant *msg, const char *path)
916 gboolean property_flag = FALSE;
917 GVariantIter value_iter;
918 char *property = NULL;
919 GVariant *child = NULL, *val = NULL;
922 g_variant_iter_init(&value_iter, msg);
923 while ((child = g_variant_iter_next_value(&value_iter))) {
924 g_variant_get(child, "{sv}", &property, &val);
926 if (property == NULL)
929 if (strcasecmp(property, "Connected") == 0) {
932 g_variant_get(val, "b", &property_flag);
933 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
934 _bt_hal_convert_device_path_to_address(path, address);
935 __bt_hal_send_hid_connection_state_event(property_flag, address);
939 g_variant_unref(val);
940 g_variant_unref(child);
946 static gboolean __bt_hal_parse_interface(GVariant *msg)
949 GVariant *optional_param;
952 char *interface_name = NULL;
953 GVariant *inner_iter = NULL;
954 g_variant_get(msg, "(&o@a{sa{sv}})",
955 &path, &optional_param);
956 g_variant_iter_init(&iter, optional_param);
958 while ((child = g_variant_iter_next_value(&iter))) {
959 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
960 if (g_strcmp0(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
961 DBG("Found a device: %s", path);
962 if (__bt_hal_parse_device_properties(inner_iter) == FALSE) {
963 g_variant_unref(inner_iter);
964 g_variant_unref(child);
965 g_variant_unref(optional_param);
966 ERR("Fail to parse the properies");
969 g_variant_unref(inner_iter);
970 g_variant_unref(child);
971 g_variant_unref(optional_param);
975 g_variant_unref(inner_iter);
976 g_variant_unref(child);
979 g_variant_unref(optional_param);
984 void __bt_hal_handle_gatt_char_event(GVariant *parameters, const char *signal_name)
988 if (signal_name == NULL)
991 if (strcasecmp(signal_name, "GattValueChanged") == 0) {
992 DBG("GattValueChanged event received");
995 const char *char_handle = NULL;
996 GVariant *char_value_var = NULL;
998 char *char_value = NULL;
1000 g_variant_get(parameters, "(i&s@ay)", &result, &char_handle, &char_value_var);
1001 DBG("char handle: %s", char_handle);
1003 len = g_variant_get_size(char_value_var);
1005 char_value = (char *)g_variant_get_data(char_value_var);
1007 _bt_hal_handle_gattc_value_changed_event(result, char_handle, char_value, len);
1009 g_variant_unref(char_value_var);
1014 static gboolean __bt_hal_event_manager(gpointer data)
1016 bt_hal_event_type_t bt_event = 0x00;
1018 char *obj_path = NULL;
1020 bt_hal_main_event_data_t *param = (bt_hal_main_event_data_t*)data;
1021 if (strcasecmp(param->signal_name, "InterfacesAdded") == 0) {
1023 /*TODO: Handle Interfaces Added Signal from stack */
1025 g_variant_get(param->parameters, "(&o@a{sa{sv}})", &obj_path, &value);
1027 if (obj_path == NULL) {
1028 DBG("obj_path is NULL");
1032 if (strcasecmp(obj_path, BT_HAL_BLUEZ_HCI_PATH) == 0) {
1033 /* TODO: Handle adapter added */
1034 DBG("Manager Event: Signal Name: InterfiacesAdded: Adapter added in bluetoothd: path [hci0]");
1036 bt_event = __bt_hal_parse_event(value);
1037 if (bt_event == BT_HAL_DEVICE_EVENT) {
1038 __bt_hal_handle_device_event(value, param->parameters);
1039 } else if (bt_event == BT_HAL_AVRCP_CONTROL_EVENT) {
1040 _bt_hal_set_control_device_path(obj_path);
1043 g_variant_unref(value);
1045 } else if (strcasecmp(param->signal_name, "InterfacesRemoved") == 0) {
1049 /*TODO: Handle Interfaces Removed Signal from stack */
1051 g_variant_get(param->parameters, "(&oas)", &obj_path, &iter);
1053 while (g_variant_iter_loop(iter, "s", &str)) {
1054 if (g_strcmp0(str, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0)
1055 _bt_hal_remove_control_device_path(obj_path);
1057 g_variant_iter_free(iter);
1058 } else if (strcasecmp(param->signal_name, "NameOwnerChanged") == 0) {
1060 char *previous = NULL;
1061 char *current = NULL;
1063 if (g_strcmp0(g_variant_get_type_string(param->parameters), "(sss)") != 0) {
1064 ERR("Invalid variant format");
1068 /* TODO: Handle Name Owener changed Signal */
1069 if (__bt_hal_get_owner_info(param->parameters, &name, &previous, ¤t)) {
1070 DBG("Fail to get the owner info");
1074 if (*current != '\0')
1080 if (strcasecmp(name, BT_HAL_BLUEZ_NAME) == 0) {
1081 DBG("Bluetoothd is terminated");
1083 /* TODO: Handle Bluetoothd terminating scenario */
1084 _bt_hal_le_deinit();
1086 } else if (g_strcmp0(param->interface_name, BT_HAL_PROPERTIES_INTERFACE) == 0) {
1087 __bt_hal_handle_property_changed_event(param->parameters, param->object_path);
1088 } else if (g_strcmp0(param->interface_name, BT_HAL_ADAPTER_INTERFACE) == 0) {
1089 _bt_hal_handle_adapter_event(param->parameters, param->signal_name);
1090 } else if (g_strcmp0(param->interface_name, BT_HAL_INPUT_INTERFACE) == 0) {
1091 __bt_hal_handle_input_event(param->parameters, param->object_path);
1092 } else if (g_strcmp0(param->interface_name, BT_HAL_NETWORK_SERVER_INTERFACE) == 0) {
1093 /* TODO: Handle Network Server events from stack */
1094 DBG("Manager Event: Interface Name: BT_HAL_NETWORK_SERVER_INTERFACE");
1095 } else if (g_strcmp0(param->interface_name, BT_HAL_HEADSET_INTERFACE) == 0) {
1096 __bt_hal_handle_headset_events(param->parameters, param->signal_name, param->object_path);
1097 } else if (g_strcmp0(param->interface_name, BT_HAL_SINK_INTERFACE) == 0) {
1098 /* TODO: Handle Sink interface events from stack */
1099 DBG("Manager Event: Interface Name:BT_HAL_SINK_INTERFACE");
1100 } else if (g_strcmp0(param->interface_name, BT_HAL_AGENT_INTERFACE) == 0) {
1101 /* TODO: Handle Agent events from stack */
1102 DBG("Manager Event: Interface Name:BT_HAL_AGENT_INTERFACE");
1103 } else if (g_strcmp0(param->interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
1104 __bt_hal_handle_device_specific_events(param->parameters, param->signal_name, param->object_path);
1105 } else if (g_strcmp0(param->interface_name, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
1106 __bt_hal_handle_avrcp_ctrl_events(param->parameters, param->signal_name, param->object_path);
1107 } else if (g_strcmp0(param->interface_name, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
1108 __bt_hal_handle_avrcp_transport_events(param->parameters, param->signal_name, param->object_path);
1109 } else if (g_strcmp0(param->interface_name, BT_HAL_GATT_CHAR_INTERFACE) == 0) {
1110 __bt_hal_handle_gatt_char_event(param->parameters, param->signal_name);
1115 g_free(param->sender_name);
1116 g_free(param->object_path);
1117 g_free(param->interface_name);
1118 g_free(param->signal_name);
1119 g_variant_unref(param->parameters);
1124 static void __bt_hal_manager_event_filter(GDBusConnection *connection,
1125 const gchar *sender_name,
1126 const gchar *object_path,
1127 const gchar *interface_name,
1128 const gchar *signal_name,
1129 GVariant *parameters,
1132 if (signal_name == NULL)
1135 bt_hal_main_event_data_t *param = g_new0(bt_hal_main_event_data_t, 1);
1136 param->sender_name = g_strdup(sender_name);
1137 param->object_path = g_strdup(object_path);
1138 param->interface_name = g_strdup(interface_name);
1139 param->signal_name = g_strdup(signal_name);
1140 param->parameters = g_variant_ref(parameters);
1142 g_idle_add(__bt_hal_event_manager, (gpointer)param);
1146 static void __bt_hal_handle_headset_events(GVariant *msg, const char *member, const char *path)
1148 gboolean property_flag = FALSE;
1149 char *property = NULL;
1150 GVariant *value = NULL;
1151 g_variant_get(msg, "(sv)", &property, &value);
1153 if (property == NULL)
1156 DBG("Property = %s \n", property);
1157 /* We allow only 1 headset connection (HSP or HFP)*/
1158 if (strcasecmp(property, "Connected") == 0) {
1160 g_variant_get(value, "b", &property_flag);
1162 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1164 /* Fix : NULL_RETURNS */
1165 if (address == NULL)
1168 _bt_hal_convert_device_path_to_address(path, address);
1169 __bt_hal_send_hf_audio_connection_state_event(property_flag, address);
1171 } else if (strcasecmp(property, "State") == 0) {
1174 g_variant_get(value, "s", &state);
1176 /* This code assumes we support only 1 headset connection */
1177 /* Need to use the headset list, if we support multi-headsets */
1178 if (strcasecmp(state, "Playing") == 0) {
1179 DBG("Playing: Sco Connected");
1180 } else if (strcasecmp(state, "connected") == 0 ||
1181 strcasecmp(state, "disconnected") == 0) {
1182 if (strcasecmp(state, "connected") == 0)
1183 DBG("Sco Connected");
1185 DBG("Sco Disconnected");
1187 ERR("Not handled state - %s", state);
1192 } else if (strcasecmp(property, "SpeakerGain") == 0) {
1195 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1197 _bt_hal_convert_device_path_to_address(path, address);
1198 INFO("Speaker Gain for address [%s]", address);
1199 /* TODO Handle event sending to HAL */
1202 } else if (strcasecmp(property, "MicrophoneGain") == 0) {
1205 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1207 _bt_hal_convert_device_path_to_address(path, address);
1208 INFO("Microphone Gain for address [%s]", address);
1209 /* TODO Handle event sending to HAL */
1216 g_variant_unref(value);
1219 static int __bt_hal_register_manager_subscribe_signal(GDBusConnection *conn,
1225 static int subs_interface_added_id = -1;
1226 static int subs_interface_removed_id = -1;
1227 static int subs_name_owner_id = -1;
1228 static int subs_property_id = -1;
1229 static int subs_adapter_id = -1;
1234 if (subs_interface_added_id == -1) {
1235 subs_interface_added_id = g_dbus_connection_signal_subscribe(conn,
1236 NULL, BT_HAL_MANAGER_INTERFACE,
1237 BT_HAL_INTERFACES_ADDED, NULL, NULL, 0,
1238 __bt_hal_manager_event_filter,
1241 if (subs_interface_removed_id == -1) {
1242 subs_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
1243 NULL, BT_HAL_MANAGER_INTERFACE,
1244 BT_HAL_INTERFACES_REMOVED, NULL, NULL, 0,
1245 __bt_hal_manager_event_filter,
1248 if (subs_name_owner_id == -1) {
1249 subs_name_owner_id = g_dbus_connection_signal_subscribe(conn,
1250 NULL, BT_HAL_FREEDESKTOP_INTERFACE,
1251 BT_HAL_NAME_OWNER_CHANGED, NULL, NULL, 0,
1252 __bt_hal_manager_event_filter,
1255 if (subs_property_id == -1) {
1256 subs_property_id = g_dbus_connection_signal_subscribe(conn,
1257 NULL, BT_HAL_PROPERTIES_INTERFACE,
1258 BT_HAL_PROPERTIES_CHANGED, NULL, NULL, 0,
1259 __bt_hal_manager_event_filter,
1262 if (subs_adapter_id == -1) {
1263 subs_adapter_id = g_dbus_connection_signal_subscribe(conn,
1264 NULL, BT_HAL_ADAPTER_INTERFACE,
1265 NULL, NULL, NULL, 0,
1266 __bt_hal_manager_event_filter,
1270 if (subs_interface_added_id != -1) {
1271 g_dbus_connection_signal_unsubscribe(conn,
1272 subs_interface_added_id);
1273 subs_interface_added_id = -1;
1275 if (subs_interface_removed_id != -1) {
1276 g_dbus_connection_signal_unsubscribe(conn,
1277 subs_interface_removed_id);
1278 subs_interface_removed_id = -1;
1280 if (subs_name_owner_id != -1) {
1281 g_dbus_connection_signal_unsubscribe(conn,
1282 subs_name_owner_id);
1283 subs_name_owner_id = -1;
1285 if (subs_property_id != -1) {
1286 g_dbus_connection_signal_unsubscribe(conn,
1288 subs_property_id = -1;
1290 if (subs_adapter_id == -1) {
1291 g_dbus_connection_signal_unsubscribe(conn, subs_adapter_id);
1292 subs_adapter_id = -1;
1300 static int __bt_hal_register_device_subscribe_signal(GDBusConnection *conn,
1303 static int subs_device_id = -1;
1310 if (subs_device_id == -1) {
1311 subs_device_id = g_dbus_connection_signal_subscribe(conn,
1312 NULL, BT_HAL_DEVICE_INTERFACE,
1313 NULL, NULL, NULL, 0,
1314 __bt_hal_manager_event_filter,
1318 if (subs_device_id != -1) {
1319 g_dbus_connection_signal_unsubscribe(conn,
1321 subs_device_id = -1;
1329 static int __bt_hal_register_input_subscribe_signal(GDBusConnection *conn, int subscribe)
1331 static int subs_input_id = -1;
1339 if (subs_input_id == -1) {
1340 subs_input_id = g_dbus_connection_signal_subscribe(conn,
1341 NULL, BT_HAL_INPUT_INTERFACE,
1342 NULL, NULL, NULL, 0,
1343 __bt_hal_manager_event_filter,
1347 if (subs_input_id != -1) {
1348 g_dbus_connection_signal_unsubscribe(conn,
1359 static int __bt_hal_register_gatt_subscribe_signal(GDBusConnection *conn,
1362 static int subs_gatt_id = -1;
1367 if (subs_gatt_id == -1) {
1368 subs_gatt_id = g_dbus_connection_signal_subscribe(conn,
1369 NULL, BT_HAL_GATT_CHAR_INTERFACE,
1370 NULL, NULL, NULL, 0,
1371 __bt_hal_manager_event_filter,
1375 if (subs_gatt_id == -1) {
1376 g_dbus_connection_signal_unsubscribe(conn,
1382 return BT_HAL_ERROR_NONE;
1387 static int __bt_hal_register_service_event(GDBusConnection *g_conn, int event_type)
1392 return BT_HAL_ERROR_INTERNAL;
1394 /* TODO: Add more events in subsequent patches */
1395 switch (event_type) {
1396 case BT_HAL_MANAGER_EVENT:
1397 __bt_hal_register_manager_subscribe_signal(g_conn, TRUE);
1399 case BT_HAL_DEVICE_EVENT:
1400 __bt_hal_register_device_subscribe_signal(g_conn, TRUE);
1402 case BT_HAL_HID_EVENT:
1403 __bt_hal_register_input_subscribe_signal(g_conn, TRUE);
1405 case BT_HAL_HEADSET_EVENT:
1406 __bt_hal_register_audio_subscribe_signal(g_conn, TRUE);
1408 case BT_HAL_GATT_EVENT:
1409 __bt_hal_register_gatt_subscribe_signal(g_conn, TRUE);
1412 INFO_C("Register Event: event_type [%d]", event_type);
1413 return BT_HAL_ERROR_NOT_SUPPORT;
1416 return BT_HAL_ERROR_NONE;
1419 static int __bt_hal_register_audio_subscribe_signal(GDBusConnection *conn,
1425 static int subs_headset_id = -1;
1426 static int subs_sink_id = -1;
1429 if (subs_headset_id == -1) {
1430 subs_headset_id = g_dbus_connection_signal_subscribe(conn,
1431 NULL, BT_HAL_HEADSET_INTERFACE,
1432 NULL, NULL, NULL, 0,
1433 __bt_hal_manager_event_filter,
1436 if (subs_sink_id == -1) {
1437 subs_sink_id = g_dbus_connection_signal_subscribe(conn,
1438 NULL, BT_HAL_SINK_INTERFACE,
1439 NULL, NULL, NULL, 0,
1440 __bt_hal_manager_event_filter,
1444 if (subs_headset_id != -1) {
1445 g_dbus_connection_signal_unsubscribe(conn,
1447 subs_headset_id = -1;
1449 if (subs_sink_id != -1) {
1450 g_dbus_connection_signal_unsubscribe(conn,
1458 static int __bt_hal_initialize_manager_receiver(void)
1462 GError *error = NULL;
1464 if (manager_conn == NULL) {
1465 manager_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1466 if (error != NULL) {
1467 ERR_C("ERROR: Can't get on system bus [%s]", error->message);
1468 g_clear_error(&error);
1470 if (manager_conn == NULL)
1474 if (__bt_hal_register_service_event(manager_conn,
1475 BT_HAL_MANAGER_EVENT) != BT_HAL_ERROR_NONE)
1477 if (__bt_hal_register_service_event(manager_conn,
1478 BT_HAL_DEVICE_EVENT) != BT_HAL_ERROR_NONE)
1480 if (__bt_hal_register_service_event(manager_conn,
1481 BT_HAL_HID_EVENT) != BT_HAL_ERROR_NONE)
1483 if (__bt_hal_register_service_event(manager_conn,
1484 BT_HAL_HEADSET_EVENT) != BT_HAL_ERROR_NONE)
1486 if (__bt_hal_register_service_event(manager_conn,
1487 BT_HAL_GATT_EVENT) != BT_HAL_ERROR_NONE)
1489 return BT_HAL_ERROR_NONE;
1492 g_object_unref(manager_conn);
1493 manager_conn = NULL;
1498 return BT_HAL_ERROR_INTERNAL;
1501 /* To receive the event from bluez */
1502 int _bt_hal_initialize_event_receiver(handle_stack_msg cb)
1508 return BT_HAL_ERROR_INVALID_PARAM;
1510 result = __bt_hal_initialize_manager_receiver();
1512 DBG("Manager event receiver initialization result [%d]", result);
1513 if (result != BT_HAL_ERROR_NONE)
1516 /*TODO: Initialize Obexd Event receiver */
1518 /* Initialize event receiver for flight mode */
1519 _bt_hal_register_vconf_handler();
1524 return BT_HAL_ERROR_NONE;
1527 static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path)
1529 GVariantIter value_iter;
1530 GVariant *value = NULL;
1532 g_variant_iter_init(&value_iter, msg);
1535 while (g_variant_iter_loop(&value_iter, "{sv}", &key, &value)) {
1536 if (!g_strcmp0(key, "Connected")) {
1537 guint connected = 0;
1538 g_variant_get(value, "i", &connected);
1539 DBG("Device property changed : Connected [%d]", connected);
1540 } else if (!g_strcmp0(key, "RSSI")) {
1541 DBG("Device property changed : RSSI");
1542 __bt_hal_dbus_device_found_properties(path);
1543 } else if (!g_strcmp0(key, "GattConnected")) {
1544 DBG("Device property changed : GattConnected");
1545 gboolean gatt_connected = FALSE;
1546 g_variant_get(value, "b", &gatt_connected);
1547 char *address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1548 _bt_hal_convert_device_path_to_address(path, address);
1549 DBG("@@gatt_connected: %d", gatt_connected);
1550 DBG("@@address: %s", address);
1551 if (_bt_hal_check_gattc_is_existing(address) == TRUE) {
1552 DBG("GattConnected event will be handled on CLIENT side");
1553 _bt_hal_handle_gattc_connected_event(address, gatt_connected);
1555 DBG("GattConnected event will be handled on SERVER side");
1556 _bt_hal_gatt_connected_state_event(gatt_connected, address);
1559 } else if (!g_strcmp0(key, "Paired")) {
1560 gboolean paired = FALSE;
1561 struct hal_ev_bond_state_changed ev;
1562 char address[BT_HAL_ADDRESS_STRING_SIZE];
1564 g_variant_get(value, "b", &paired);
1565 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1567 _bt_hal_agent_set_canceled(FALSE);
1568 _bt_hal_convert_device_path_to_address(path, address);
1570 /* Prepare to send event to HAL bluetooth */
1571 ev.status = BT_STATUS_SUCCESS;
1572 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1573 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1576 ERR("Bluetooth HAL event handler not registered");
1578 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
1579 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1581 } else if (!g_strcmp0(key, "LegacyPaired")) {
1582 DBG("Device property changed : LegacyPaired");
1583 } else if (!g_strcmp0(key, "Trusted")) {
1584 DBG("Device property changed : Trusted");
1585 gboolean trusted = FALSE;
1586 gchar *address = NULL;
1587 g_variant_get(value, "b", &trusted);
1588 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1590 _bt_hal_convert_device_path_to_address(path, address);
1591 DBG("Device [%s] trusted: [%d]", address, trusted);
1593 __bt_hal_send_device_trust_state_event(trusted, address);
1595 } else if (!g_strcmp0(key, "IpspConnected")) {
1596 DBG("Device property changed : IpspConnected");
1597 } else if (!g_strcmp0(key, "IpspInitStateChanged")) {
1598 DBG("Device property changed : IpspInitStateChanged");
1599 } else if (!g_strcmp0(key, "TrustedProfiles")) {
1601 char address[BT_HAL_ADDRESS_STRING_SIZE];
1603 g_variant_get(value, "u", &trust_val);
1604 _bt_hal_convert_device_path_to_address(path, address);
1605 DBG("Address: %s, TrustedProfiles: 0x%X", address, trust_val);
1606 __bt_hal_send_device_trusted_profile_changed_event(trust_val, address);
1608 ERR("Unhandled Property:[%s]", key);
1614 static void __bt_hal_dbus_device_found_properties(const char *device_path)
1617 GError *error = NULL;
1618 GDBusProxy *device_proxy;
1619 GDBusConnection *conn;
1624 ERR("Invalid device path");
1628 conn = _bt_hal_get_system_gconn();
1630 ERR("_bt_hal_get_system_gconn failed");
1634 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
1638 BT_HAL_PROPERTIES_INTERFACE,
1641 if (!device_proxy) {
1642 ERR("Error creating device_proxy");
1646 result = g_dbus_proxy_call_sync(device_proxy,
1648 g_variant_new("(s)", BT_HAL_DEVICE_INTERFACE),
1649 G_DBUS_CALL_FLAGS_NONE,
1654 ERR("Error occured in Proxy call");
1655 if (error != NULL) {
1656 ERR("Error occured in Proxy call (Error: %s)", error->message);
1657 g_clear_error(&error);
1659 g_object_unref(device_proxy);
1663 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1664 _bt_hal_convert_device_path_to_address(device_path, address);
1666 __bt_hal_device_properties_lookup(result, address);
1668 g_object_unref(device_proxy);
1674 static void __bt_hal_device_properties_lookup(GVariant *result, char *address)
1676 /* Buffer and propety count management */
1677 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
1678 struct hal_ev_device_found *ev = (void *) buf;
1680 memset(buf, 0, sizeof(buf));
1684 GVariant *tmp_value;
1687 gchar *manufacturer_data = NULL;
1690 if (result != NULL) {
1691 g_variant_get(result , "(@a{sv})", &value);
1692 g_variant_unref(result);
1695 tmp_value = g_variant_lookup_value(value, "Alias", G_VARIANT_TYPE_STRING);
1697 g_variant_get(tmp_value, "s", &name);
1699 g_variant_unref(tmp_value);
1701 DBG_SECURE("Alias Name [%s]", name);
1702 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1703 strlen(name) + 1, name);
1705 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1708 tmp_value = g_variant_lookup_value(value, "Name", G_VARIANT_TYPE_STRING);
1709 g_variant_get(tmp_value, "s", &name);
1710 g_variant_unref(tmp_value);
1712 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_NAME,
1713 strlen(name) + 1, name);
1715 DBG("Device Name [%s] Property num [%d]", name, ev->num_props);
1716 g_variant_get(tmp_value, "s", &name);
1720 tmp_value = g_variant_lookup_value(value, "Class", G_VARIANT_TYPE_UINT32);
1721 unsigned int class = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1722 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CLASS,
1723 sizeof(unsigned int), &class);
1726 g_variant_unref(tmp_value);
1730 tmp_value = g_variant_lookup_value(value, "Connected", G_VARIANT_TYPE_BOOLEAN);
1731 unsigned int connected = tmp_value ? g_variant_get_boolean(tmp_value) : 0;
1732 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_CONNECTED,
1733 sizeof(unsigned int), &connected);
1735 DBG("Device connected [%u] Property num [%d]", connected, ev->num_props);
1737 g_variant_unref(tmp_value);
1740 tmp_value = g_variant_lookup_value(value, "Trusted", G_VARIANT_TYPE_BOOLEAN);
1741 uint8_t trust = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1742 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_TRUSTED,
1743 sizeof(uint8_t), &trust);
1745 DBG("Device trusted [%d] Property num [%d]", trust, ev->num_props);
1747 g_variant_unref(tmp_value);
1750 tmp_value = g_variant_lookup_value(value, "Paired", G_VARIANT_TYPE_BOOLEAN);
1751 uint8_t paired = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1753 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_PAIRED,
1754 sizeof(uint8_t), &paired);
1756 DBG("Device Paired [%d] Property num [%d]", paired, ev->num_props);
1758 g_variant_unref(tmp_value);
1761 tmp_value = g_variant_lookup_value(value, "RSSI", G_VARIANT_TYPE_INT32);
1762 int rssi = tmp_value ? g_variant_get_int32(tmp_value) : 0;
1763 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_RSSI,
1764 sizeof(int), &rssi);
1766 DBG("Device RSSI [%d] Property num [%d]", rssi, ev->num_props);
1768 g_variant_unref(tmp_value);
1770 /* Last Addr Type */
1771 tmp_value = g_variant_lookup_value(value, "LastAddrType", G_VARIANT_TYPE_UINT32);
1772 unsigned int addr_type = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1774 g_variant_unref(tmp_value);
1775 DBG("Device Last Address Type [0x%x]", addr_type);
1778 tmp_value = g_variant_lookup_value(value, "IsAliasSet", G_VARIANT_TYPE_UINT32);
1779 uint8_t is_alias_set = tmp_value ? (g_variant_get_boolean(tmp_value) ? 1 : 0) : 0;
1780 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_IS_ALIAS_SET,
1781 sizeof(uint8_t), &is_alias_set);
1783 DBG("IsAliasSet: [%s], Property num [%d]", (is_alias_set ? "TRUE" : "FALSE"), ev->num_props);
1785 g_variant_unref(tmp_value);
1788 tmp_value = g_variant_lookup_value(value, "UUIDs", G_VARIANT_TYPE_STRING_ARRAY);
1789 gsize uuid_count = g_variant_get_size(tmp_value);
1790 char **uuid_value = g_variant_dup_strv(tmp_value, &uuid_count);
1792 /* UUID collection */
1797 int num_props_tmp = ev->num_props;
1799 uint8_t uuids[BT_HAL_STACK_UUID_SIZE * uuid_count];
1801 for (i = 0; uuid_value[i] != NULL; i++) {
1803 char *uuid_str = NULL;
1804 uint8_t uuid[BT_HAL_STACK_UUID_SIZE];
1805 memset(uuid, 0x00, BT_HAL_STACK_UUID_SIZE);
1807 DBG("UUID string from Bluez [%s]\n", uuid_value[i]);
1808 uuid_str = g_strdup(uuid_value[i]);
1809 DBG("UUID string [%s]\n", uuid_str);
1811 _bt_hal_convert_uuid_string_to_type(uuid, uuid_str);
1813 for (z = 0; z < 16; z++)
1814 DBG("[0x%x]", uuid[z]);
1817 memcpy(uuids+i*BT_HAL_STACK_UUID_SIZE, uuid, BT_HAL_STACK_UUID_SIZE);
1821 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_UUIDS,
1822 (BT_HAL_STACK_UUID_SIZE * uuid_count),
1824 ev->num_props = num_props_tmp + 1;
1827 g_variant_unref(tmp_value);
1829 /* LegacyManufacturerDataLen */
1830 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerDataLen", G_VARIANT_TYPE_UINT32);
1831 unsigned int manufacturer_data_len = tmp_value ? g_variant_get_uint32(tmp_value) : 0;
1832 if (manufacturer_data_len > BT_HAL_MANUFACTURER_DATA_LENGTH_MAX) {
1833 ERR("manufacturer_data_len is too long(len = %d)", manufacturer_data_len);
1834 manufacturer_data_len = BT_HAL_MANUFACTURER_DATA_LENGTH_MAX;
1837 g_variant_unref(tmp_value);
1838 /*size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA_LEN,
1839 sizeof(unsigned int), &manufacturer_data_len);
1841 DBG("Device Legacy Manufacturer data length [%u]", manufacturer_data_len);
1843 /* ManufacturerData */
1844 tmp_value = g_variant_lookup_value(value, "LegacyManufacturerData", G_VARIANT_TYPE_BYTESTRING);
1845 manufacturer_data = value ? (gchar *)g_variant_get_bytestring(tmp_value) : NULL;
1846 if (manufacturer_data) {
1847 if (manufacturer_data_len > 0) {
1848 //size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_MANUFACTURER_DATA,
1849 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_BLE_ADV_DATA,
1850 manufacturer_data_len, manufacturer_data);
1855 g_variant_unref(tmp_value);
1859 _bt_hal_convert_addr_string_to_type(bdaddr, address);
1860 size += __bt_insert_hal_properties(buf + size, HAL_PROP_DEVICE_ADDR,
1861 sizeof(bdaddr), bdaddr);
1863 DBG("Device address [%s] property Num [%d]", address, ev->num_props);
1866 g_variant_unref(value);
1868 ERR("result is NULL\n");
1871 DBG("Send Device found event to HAL user, Num Prop [%d] total size [%zd]", ev->num_props, size);
1872 event_cb(HAL_EV_DEVICE_FOUND, (void*) buf, size);
1877 static void __bt_hal_send_device_acl_connection_state_event(int status, gboolean connected, const char *address)
1880 struct hal_ev_acl_state_changed ev;
1883 ev.state = (connected == TRUE) ?
1884 HAL_ACL_STATE_CONNECTED :
1885 HAL_ACL_STATE_DISCONNECTED;
1887 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1890 ERR("Bluetooth HAL event handler not registered");
1892 event_cb(HAL_EV_ACL_STATE_CHANGED, &ev, sizeof(ev));
1896 static void __bt_hal_send_device_le_connection_state_event(int status, gboolean connected, const char *address)
1899 struct hal_ev_le_conn_state_changed ev;
1902 ev.state = (connected == TRUE) ?
1903 HAL_LE_STATE_CONNECTED :
1904 HAL_LE_STATE_DISCONNECTED;
1906 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1909 ERR("Bluetooth HAL event handler not registered");
1911 event_cb(HAL_EV_LE_CONN_STATE_CHANGED, &ev, sizeof(ev));
1915 static void __bt_hal_send_device_trust_state_event(gboolean is_trusted,
1916 const char *address)
1918 struct hal_ev_device_trust_state_changed ev;
1921 ev.trust = (is_trusted == TRUE) ?
1922 HAL_DEVICE_TRUSTED :
1923 HAL_DEVICE_UNTRUSTED;
1925 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1928 ERR("Bluetooth HAL event handler not registered");
1930 event_cb(HAL_EV_DEVICE_TRUST_CHANGED, &ev, sizeof(ev));
1934 static void __bt_hal_send_device_trusted_profile_changed_event(
1935 uint32_t trust_val, const char *address)
1937 struct hal_ev_device_trusted_profiles_changed ev;
1940 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1941 ev.trust_val = trust_val;
1944 ERR("Bluetooth HAL event handler not registered");
1946 event_cb(HAL_EV_DEVICE_TRUSTED_PROFILES_CHANGED, &ev, sizeof(ev));
1950 static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member,
1954 const char *property = NULL;
1958 if (strcasecmp(member, "PropertyChanged") == 0) {
1959 g_variant_get(msg, "(s)", &property);
1960 if (property == NULL)
1962 if (strcasecmp(property, "GattConnected") == 0) {
1963 INFO("GATT Connected");
1964 gboolean connected = FALSE;
1966 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
1968 _bt_hal_convert_device_path_to_address(path, address);
1969 g_variant_get(msg, "(b)", &connected);
1971 INFO("Connected device address[%s] connnected[%d]", address, connected);
1973 } else if (strcasecmp(property, "Paired") == 0) {
1974 gboolean paired = FALSE;
1975 struct hal_ev_bond_state_changed ev;
1976 char address[BT_HAL_ADDRESS_STRING_SIZE];
1978 g_variant_get(msg, "(b)", &paired);
1979 DBG("Device property changed : Paired = %s", (paired ? "TRUE" : "FALSE"));
1981 _bt_hal_agent_set_canceled(FALSE);
1982 _bt_hal_convert_device_path_to_address(path, address);
1984 /* Prepare to send event to HAL bluetooth */
1985 ev.status = BT_STATUS_SUCCESS;
1986 ev.state = paired ? BT_BOND_STATE_BONDED : BT_BOND_STATE_NONE;
1987 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
1990 ERR("Bluetooth HAL event handler not registered");
1992 DBG("Sending HAL_EV_BOND_STATE_CHANGED event");
1993 event_cb(HAL_EV_BOND_STATE_CHANGED, (void*)&ev, sizeof(ev));
1995 } else if (strcasecmp(property, "UUIDs") == 0) {
1998 } else if (strcasecmp(member, "DeviceConnected") == 0) {
1999 unsigned char addr_type = 0;
2001 g_variant_get(msg, "(y)", &addr_type);
2003 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2004 _bt_hal_convert_device_path_to_address(path, address);
2006 DBG("Member: [%s]", member);
2007 ERR_C("Connected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
2009 __bt_hal_send_device_acl_connection_state_event(BT_STATUS_SUCCESS, TRUE, address);
2011 __bt_hal_send_device_le_connection_state_event(BT_STATUS_SUCCESS, TRUE, address);
2013 } else if (strcasecmp(member, "Disconnected") == 0) {
2014 unsigned char disc_reason = 0;
2015 unsigned char addr_type = 0;
2018 g_variant_get(msg, "(yy&s)", &addr_type, &disc_reason, &name);
2020 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2021 _bt_hal_convert_device_path_to_address(path, address);
2023 DBG("Member: [%s]", member);
2025 ERR_C("DisConnected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
2026 DBG("Disconnected Reason [%d : %s]", disc_reason, _bt_hal_convert_disc_reason_to_string(disc_reason));
2027 DBG("Name: %s", name);
2029 __bt_hal_send_device_acl_connection_state_event(_bt_hal_convert_disc_reason_to_status(disc_reason), FALSE, address);
2031 __bt_hal_send_device_le_connection_state_event(_bt_hal_convert_disc_reason_to_status(disc_reason), FALSE, address);
2033 } else if (strcasecmp(member, "ProfileStateChanged") == 0) {
2035 char *profile_uuid = NULL;
2037 g_variant_get(msg, "(si)", &profile_uuid, &state);
2038 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2039 _bt_hal_convert_device_path_to_address(path, address);
2041 DBG("Address: %s", address);
2042 DBG("Profile UUID: %s", profile_uuid);
2043 DBG("State: %d", state);
2044 if (strcmp(profile_uuid, HID_UUID) == 0) {
2045 DBG("HID Host Profile state: %d", state);
2046 if (state == BT_HAL_PROFILE_STATE_CONNECTED)
2047 __bt_hal_send_hid_connection_state_event(TRUE, address);
2048 else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED)
2049 __bt_hal_send_hid_connection_state_event(FALSE, address);
2051 DBG("HID Host Profile state: Invalid");
2052 } else if (strcmp(profile_uuid, HID_DEVICE_UUID) == 0) {
2053 DBG("HID Device Profile state: %d", state);
2054 if (state == BT_HAL_PROFILE_STATE_CONNECTED)
2055 __bt_hal_send_hid_device_connection_state_event(TRUE, address);
2056 else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED)
2057 __bt_hal_send_hid_device_connection_state_event(FALSE, address);
2059 DBG("HID Device Profile state: Invalid");
2060 } else if ((strcmp(profile_uuid, A2DP_SINK_UUID) == 0)) {
2061 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2062 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTED");
2063 __bt_hal_send_av_connection_state_event(TRUE, address);
2064 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2065 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2066 __bt_hal_send_av_connection_state_event(FALSE, address);
2067 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2068 DBG("A2DP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2069 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2070 DBG("A2DP Profile state changed: BT_PROFILE_STATE_CONNECTING");
2072 ERR("A2DP Profile state: Invalid");
2074 } else if ((strcmp(profile_uuid, A2DP_SOURCE_UUID) == 0)) {
2075 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2076 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
2077 __bt_hal_send_a2dp_sink_connection_state_event(TRUE, address);
2078 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2079 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
2080 __bt_hal_send_a2dp_sink_connection_state_event(FALSE, address);
2081 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2082 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
2083 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2084 DBG("A2DP Sink Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
2086 } else if (strcmp(profile_uuid, HFP_HF_UUID) == 0) {
2087 if (state == BT_HAL_PROFILE_STATE_CONNECTING)
2088 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTING");
2089 else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2090 DBG("HFP Profile state changed: BT_PROFILE_STATE_CONNECTED");
2091 __bt_hal_send_hf_connection_state_event(TRUE, address);
2092 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2093 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2094 __bt_hal_send_hf_connection_state_event(FALSE, address);
2095 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2096 DBG("HFP Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2098 ERR("HFP Profile state: Invalid");
2100 } else if (strcmp(profile_uuid, HFP_AG_UUID) == 0) {
2101 if (state == BT_HAL_PROFILE_STATE_CONNECTING)
2102 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_CONNECTING");
2103 else if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2104 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_CONNECTED");
2105 __bt_hal_send_hf_client_connection_state_event(TRUE, address);
2106 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2107 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_DISCONNECTED");
2108 __bt_hal_send_hf_client_connection_state_event(FALSE, address);
2109 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2110 DBG("HFP Client Profile state changed: BT_PROFILE_STATE_DISCONNECTING");
2112 ERR("HFP Client Profile state: Invalid");
2114 } else if ((strcmp(profile_uuid, AVRCP_TARGET_UUID) == 0)) {
2115 if (state == BT_HAL_PROFILE_STATE_CONNECTED) {
2116 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTED");
2117 __bt_hal_send_avrcp_ctrl_connection_state_event(TRUE, address);
2118 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTED) {
2119 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTED");
2120 __bt_hal_send_avrcp_ctrl_connection_state_event(FALSE, address);
2121 } else if (state == BT_HAL_PROFILE_STATE_DISCONNECTING) {
2122 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_DISCONNECTING");
2123 } else if (state == BT_HAL_PROFILE_STATE_CONNECTING) {
2124 DBG("AVRCP Controller Profile state changed: BT_HAL_PROFILE_STATE_CONNECTING");
2127 DBG("Profile[%s] State changed status [%d] ", profile_uuid, state);
2130 g_free(profile_uuid);
2131 } else if (strcasecmp(member, "AttMtuChanged") == 0) {
2135 address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
2137 DBG("Member: [%s]", member);
2139 _bt_hal_convert_device_path_to_address(path, address);
2140 g_variant_get(msg, "(q)", &mtu);
2142 __bt_hal_handle_gatts_mtu_changed_event(address, mtu);
2145 } else if (strcasecmp(member, "AdvReport") == 0) {
2146 DBG("Member: [%s]", member);
2147 __bt_hal_handle_adv_report(msg, path);
2151 static void __bt_hal_handle_adv_report(GVariant *msg, const char *path)
2153 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
2154 struct hal_ev_gatt_client_scan_result *ev = (void *)buf;
2156 char *address = NULL;
2157 GVariant *value = NULL;
2158 char *buffer = NULL;
2161 uint8_t addr_type = 0;
2162 uint8_t adv_type = 0;
2168 memset(buf, 0, sizeof(buf));
2171 g_variant_get(msg, "(&syyii@ay)", &address, &addr_type,
2172 &adv_type, &rssi, &data_len, &value);
2174 buffer_len = g_variant_get_size(value);
2176 buffer = (char *)g_variant_get_data(value);
2178 if (data_len != buffer_len) {
2179 ERR("Unexpected: buffer_len: %d, data_len: %d",
2180 buffer_len, data_len);
2181 data_len = buffer_len;
2184 DBG("Address: %s, len: %d, rssi: %d, addr_type: 0x%02X, adv_type: 0x%02X",
2185 address, data_len, rssi, addr_type, adv_type);
2187 _bt_hal_convert_addr_string_to_type(ev->bd_addr, address);
2188 ev->addr_type = addr_type;
2189 ev->adv_type = adv_type;
2192 memcpy(ev->adv_data, buffer, data_len);
2195 DBG("Send le scan result event to HAL, size: [%zd]", size);
2196 gatt_event_cb(HAL_EV_GATT_CLIENT_SCAN_RESULT, buf, size);
2197 g_variant_unref(value);
2200 static void __bt_hal_handle_gatts_mtu_changed_event(char *address, int mtu)
2202 uint8_t buf[BT_HAL_MAX_PROPERTY_BUF_SIZE];
2203 struct hal_ev_gatt_server_mtu_changed *ev = (void *)buf;
2209 memset(buf, 0, sizeof(buf));
2212 DBG("Address: %s, mtu: %d", address, mtu);
2214 ev->conn_id = _bt_get_remote_gatt_client_conn_id(address);
2217 DBG("Send GATT server mtu changed event to HAL, size: [%zd]", size);
2218 gatt_event_cb(HAL_EV_GATT_SERVER_MTU_CHANGED, buf, size);
2221 /* AVRCP Controller Role(Remote:AVRCP Target) Events */
2222 static void __bt_hal_send_avrcp_ctrl_connection_state_event(gboolean connected, const char *address)
2225 struct hal_ev_avrcp_ctrl_conn_state ev;
2227 if (connected == TRUE)
2228 INFO("AVRCP(Controller) Profile Connected for address [%s]", address);
2230 INFO("AVRCP(Controller) Profile DisConnected for address [%s]", address);
2232 if (connected == TRUE)
2233 ev.state = HAL_AVRCP_CTRL_STATE_CONNECTED;
2235 ev.state = HAL_AVRCP_CTRL_STATE_DISCONNECTED;
2236 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2238 if (!a2dp_sink_event_cb)
2239 ERR("AV event handler not registered");
2241 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_CONN_STATE, &ev, sizeof(ev));
2244 static int __bt_media_attr_to_type(const char *str)
2246 if (!strcasecmp(str, "Equalizer"))
2247 return HAL_PLAYER_ATTR_EQUALIZER;
2248 else if (!strcasecmp(str, "Repeat"))
2249 return HAL_PLAYER_ATTR_REPEAT;
2250 else if (!strcasecmp(str, "Shuffle"))
2251 return HAL_PLAYER_ATTR_SHUFFLE;
2252 else if (!strcasecmp(str, "Scan"))
2253 return HAL_PLAYER_ATTR_SCAN;
2259 static int __bt_hal_play_status_str_to_type(const char *value)
2261 if (!strcmp(value, "stopped"))
2262 return HAL_PLAYSTATE_STOPPED;
2263 else if (!strcmp(value, "playing"))
2264 return HAL_PLAYSTATE_PLAYING;
2265 else if (!strcmp(value, "paused"))
2266 return HAL_PLAYSTATE_PAUSED;
2267 else if (!strcmp(value, "forward-seek"))
2268 return HAL_PLAYSTATE_FWD_SEEK;
2269 else if (!strcmp(value, "reverse-seek"))
2270 return HAL_PLAYSTATE_REV_SEEK;
2272 return HAL_PLAYSTATE_ERROR;
2275 static void __bt_avrcp_control_parse_properties(struct hal_ev_track_changed *ev, GVariant *item)
2277 GVariant *value = NULL;
2279 char *value_string = NULL;
2280 const char *key = NULL;
2286 g_variant_iter_init(&iter, item);
2287 while (g_variant_iter_loop(&iter, "{sv}", &key, &value)) {
2288 if (strcasecmp(key, "Title") == 0) {
2289 value_string = (char *)g_variant_get_string(value, NULL);
2290 DBG("Value : %s ", value_string);
2291 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TITLE;
2292 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2294 } else if (strcasecmp(key, "Artist") == 0) {
2295 value_string = (char *)g_variant_get_string(value, NULL);
2296 DBG("Value : %s ", value_string);
2297 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ARTIST;
2298 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2300 } else if (strcasecmp(key, "Album") == 0) {
2301 value_string = (char *)g_variant_get_string(value, NULL);
2302 DBG("Value : %s ", value_string);
2303 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_ALBUM;
2304 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2306 } else if (strcasecmp(key, "Genre") == 0) {
2307 value_string = (char *)g_variant_get_string(value, NULL);
2308 DBG("Value : %s ", value_string);
2309 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_GENRE;
2310 g_strlcpy((gchar *)ev->attr[i].text, value_string, HAL_MAX_ATTR_STR_LEN);
2312 } else if (strcasecmp(key, "Duration") == 0) {
2315 val = g_variant_get_uint32(value);
2316 DBG("Value : %li", val);
2317 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_PLAYING_TIME;
2318 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2320 } else if (strcasecmp(key, "NumberOfTracks") == 0) {
2323 val = g_variant_get_uint32(value);
2324 DBG("Value : %li", val);
2325 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_NUM_TRACKS;
2326 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2328 } else if (strcasecmp(key, "TrackNumber") == 0) {
2331 val = g_variant_get_uint32(value);
2332 DBG("Value : %li", val);
2333 ev->attr[i].attr_id = HAL_MEDIA_ATTR_ID_TRACK_NUM;
2334 snprintf((char*)ev->attr[i].text, HAL_MAX_ATTR_STR_LEN, "%ld", val);
2337 DBG("%s not supported, ignoring", key);
2340 if (i >= HAL_MAX_ATTR_NUM) {
2341 ERR(" Received max attribute [%d]", i);
2347 g_variant_iter_free(&iter);
2351 static int __bt_media_attrval_to_val(int type, const char *value)
2356 case HAL_PLAYER_ATTR_EQUALIZER:
2357 if (!strcmp(value, "off"))
2362 case HAL_PLAYER_ATTR_REPEAT:
2363 if (!strcmp(value, "off"))
2364 ret = BTRC_PLAYER_VAL_OFF_REPEAT;
2365 else if (!strcmp(value, "singletrack"))
2366 ret = BTRC_PLAYER_VAL_SINGLE_REPEAT;
2367 else if (!strcmp(value, "alltracks"))
2368 ret = BTRC_PLAYER_VAL_ALL_REPEAT;
2370 ret = BTRC_PLAYER_VAL_GROUP_REPEAT;
2372 case HAL_PLAYER_ATTR_SHUFFLE:
2373 if (!strcmp(value, "off"))
2374 ret = BTRC_PLAYER_VAL_OFF_SHUFFLE;
2375 else if (!strcmp(value, "alltracks"))
2376 ret = BTRC_PLAYER_VAL_ALL_SHUFFLE;
2378 ret = BTRC_PLAYER_VAL_GROUP_SHUFFLE;
2380 case HAL_PLAYER_ATTR_SCAN:
2381 if (!strcmp(value, "off"))
2383 else if (!strcmp(value, "alltracks"))
2389 ERR("Value not handled");
2395 static void __bt_hal_handle_avrcp_ctrl_events(GVariant *msg, const char *member,
2398 const char *property = NULL;
2399 GVariant *value = NULL;
2401 char address[BT_HAL_ADDRESS_STRING_SIZE];
2404 ERR("Error returned in method call\n");
2408 if (!avrcp_ctrl_event_cb) {
2409 ERR("AVRCP controller DBUS handler callback not registered");
2413 g_variant_iter_init(&iter, msg);
2415 _bt_hal_convert_device_path_to_address(path, address);
2417 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2418 DBG("Property = %s \n", property);
2419 if ((strcasecmp(property, "Equalizer") == 0) ||
2420 (strcasecmp(property, "Repeat") == 0) ||
2421 (strcasecmp(property, "Shuffle") == 0) ||
2422 (strcasecmp(property, "Scan") == 0)) {
2423 struct hal_ev_player_setting ev;
2427 valstr = g_variant_get_string(value, NULL);
2428 DBG("Value : %s ", valstr);
2431 val = __bt_media_attrval_to_val(__bt_media_attr_to_type(property), valstr);
2434 memset(&ev, 0, sizeof(ev));
2435 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2437 ev.attr_ids[0] = __bt_media_attr_to_type(property);
2438 ev.attr_values[0] = val;
2440 /* Send event to application */
2441 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAYER_APP_SETTING_CHANGED, &ev, sizeof(ev));
2443 } else if ((strcasecmp(property, "Status") == 0)) {
2444 struct hal_ev_play_status_changed ev;
2447 valstr = g_variant_get_string(value, NULL);
2448 DBG("Value : %s ", valstr);
2450 memset(&ev, 0, sizeof(ev));
2451 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2453 ev.status = __bt_hal_play_status_str_to_type(valstr);
2455 /* Send event to application */
2456 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_STATUS_CHANGED, &ev, sizeof(ev));
2458 } else if (strcasecmp(property, "Position") == 0) {
2459 struct hal_ev_play_position ev;
2461 memset(&ev, 0, sizeof(ev));
2462 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2463 ev.pos = g_variant_get_uint32(value);
2464 DBG("Value : %d ", ev.pos);
2466 /* Send event to application */
2467 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_PLAY_POSITION_CHANGED, &ev, sizeof(ev));
2468 } else if (strcasecmp(property, "Track") == 0) {
2469 struct hal_ev_track_changed ev;
2471 memset(&ev, 0, sizeof(ev));
2472 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2473 __bt_avrcp_control_parse_properties(&ev, value);
2475 /* Send event to application */
2476 avrcp_ctrl_event_cb(HAL_EV_AVRCP_CTRL_TRACK_CHANGED, &ev, sizeof(ev));
2478 DBG("Property not handled");
2482 g_free((char *)property);
2483 g_variant_unref(value);
2486 static void __bt_hal_handle_avrcp_transport_events(GVariant *msg, const char *member,
2489 const char *property = NULL;
2490 GVariant *value = NULL;
2492 char address[BT_HAL_ADDRESS_STRING_SIZE];
2496 ERR("Error returned in method call\n");
2500 if (!avrcp_tg_event_cb) {
2501 ERR("AVRCP target DBUS handler callback not registered");
2505 g_variant_iter_init(&iter, msg);
2507 _bt_hal_convert_device_path_to_address(path, address);
2509 while (g_variant_iter_loop(&iter, "{sv}", &property, &value)) {
2510 DBG("Property = %s \n", property);
2511 if ((strcasecmp(property, "Delay") == 0)) {
2512 struct hal_ev_avrcp_tg_delay_changed ev;
2515 memset(&ev, 0, sizeof(ev));
2516 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2518 val = g_variant_get_uint16(value);
2519 DBG("Value : %d", val);
2522 /* Send event to application */
2523 avrcp_tg_event_cb(HAL_EV_AVRCP_TG_DELAY_CHANGE, &ev, sizeof(ev));
2525 DBG("Property not handled");
2530 g_free((char *)property);
2531 g_variant_unref(value);
2534 /* A2DP Src Role(Remote:Sink) Events */
2535 static void __bt_hal_send_av_connection_state_event(gboolean connected, const char *address)
2538 struct hal_ev_a2dp_conn_state ev;
2540 if (connected == TRUE)
2541 INFO("A2DP(Src) Profile Connected for address [%s]", address);
2543 INFO("A2DP(Src) Profile DisConnected for address [%s]", address);
2545 ev.state = (connected == TRUE) ?
2546 HAL_EV_A2DP_STATE_CONNECTED :
2547 HAL_EV_A2DP_STATE_DISCONNECTED;
2549 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2552 ERR("AV event handler not registered");
2554 av_event_cb(HAL_EV_A2DP_CONN_STATE, &ev, sizeof(ev));
2557 /* A2DP Sink Role(Remote:Source) Events */
2558 static void __bt_hal_send_a2dp_sink_connection_state_event(gboolean connected, const char *address)
2561 struct hal_ev_a2dp_conn_state ev;
2563 if (connected == TRUE)
2564 INFO("A2DP(Sink) Profile Connected for address [%s]", address);
2566 INFO("A2DP(Sink) Profile DisConnected for address [%s]", address);
2568 ev.state = (connected == TRUE) ?
2569 HAL_EV_A2DP_STATE_CONNECTED :
2570 HAL_EV_A2DP_STATE_DISCONNECTED;
2572 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2574 if (!a2dp_sink_event_cb)
2575 ERR("AV event handler not registered");
2577 a2dp_sink_event_cb(HAL_EV_A2DP_SOURCE_CONN_STATE, &ev, sizeof(ev));
2580 /* HF(AG Role) Audio Events */
2581 static void __bt_hal_send_hf_audio_connection_state_event(gboolean connected,
2582 const char *address)
2585 struct hal_ev_handsfree_audio_state ev;
2587 if (connected == TRUE)
2588 INFO("AG Audio Connected for address [%s]", address);
2590 INFO("AG Audio DisConnected for address [%s]", address);
2592 ev.state = (connected == TRUE) ?
2593 HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTED :
2594 HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED;
2596 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2599 ERR("HF event handler not registered");
2601 hf_event_cb(HAL_EV_HANDSFREE_AUDIO_STATE, &ev, sizeof(ev));
2604 /* HF(AG Role) Profile Events */
2605 static void __bt_hal_send_hf_connection_state_event(gboolean connected,
2606 const char *address)
2609 struct hal_ev_handsfree_conn_state ev;
2611 if (connected == TRUE)
2612 INFO("AG Profile Connected for address [%s]", address);
2614 INFO("AG Profile DisConnected for address [%s]", address);
2616 ev.state = (connected == TRUE) ?
2617 HAL_EV_HANDSFREE_CONN_STATE_CONNECTED :
2618 HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTED;
2620 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2623 ERR("HF event handler not registered");
2625 hf_event_cb(HAL_EV_HANDSFREE_CONN_STATE, &ev, sizeof(ev));
2628 /* HF(Client Role) Profile Events */
2629 static void __bt_hal_send_hf_client_connection_state_event(gboolean connected,
2630 const char *address)
2632 struct hal_ev_hf_client_conn_state ev;
2634 if (connected == TRUE)
2635 INFO("HF Client Profile Connected for address [%s]", address);
2637 INFO("HF Client Profile DisConnected for address [%s]", address);
2639 ev.state = (connected == TRUE) ?
2640 HAL_EV_HF_CLIENT_CONN_STATE_CONNECTED :
2641 HAL_EV_HF_CLIENT_CONN_STATE_DISCONNECTED;
2643 _bt_hal_convert_addr_string_to_type(ev.bdaddr, address);
2645 if (!hf_client_event_cb)
2646 ERR("HF Client event handler not registered");
2648 hf_client_event_cb(HAL_EV_HF_CLIENT_CONN_STATE, &ev, sizeof(ev));
2651 void _bt_hal_register_event_handler_cb(bt_hal_module_e module, handle_stack_msg cb)
2658 hid_device_event_cb = cb;
2664 a2dp_sink_event_cb = cb;
2670 hf_client_event_cb = cb;
2673 avrcp_tg_event_cb = cb;
2675 case HAL_AVRCP_CTRL:
2676 avrcp_ctrl_event_cb = cb;
2682 ERR("Unknown module: %d", module);
2686 void _bt_hal_unregister_event_handler_cb(bt_hal_module_e module)
2690 hid_event_cb = NULL;
2696 a2dp_sink_event_cb = NULL;
2702 hf_client_event_cb = NULL;
2705 avrcp_tg_event_cb = NULL;
2707 case HAL_AVRCP_CTRL:
2708 avrcp_ctrl_event_cb = NULL;
2711 gatt_event_cb = NULL;
2714 ERR("Unknown module: %d", module);
2718 bool _bt_hal_get_adapter_request_state(void)
2720 return is_adapter_activating;
2723 bool _bt_hal_get_le_request_state(void)
2725 return is_le_activating;
2728 void _bt_hal_set_adapter_request_state(bool enable)
2730 DBG("set_adapter_request_state %d", enable);
2731 is_adapter_activating = enable;
2734 void _bt_hal_set_le_request_state(bool enable)
2736 DBG("set_le_request_state %d", enable);
2737 is_le_activating = enable;