4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Hocheol Seo <hocheol.seo@samsung.com>
7 * Girishashok Joshi <girish.joshi@samsung.com>
8 * Chanyeol Park <chanyeol.park@samsung.com>
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
14 * http://www.apache.org/licenses/LICENSE-2.0
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
24 #include <dbus/dbus-glib.h>
25 #include <dbus/dbus-glib-lowlevel.h>
26 #include <dbus/dbus.h>
31 #include <vconf-internal-bt-keys.h>
33 #include <journal/device.h>
36 #include "bluetooth-api.h"
37 #include "bt-internal-types.h"
39 #include "bt-service-common.h"
40 #include "bt-service-event.h"
41 #include "bt-service-main.h"
42 #include "bt-service-adapter.h"
43 #include "bt-service-adapter-le.h"
44 #include "bt-service-device.h"
45 #include "bt-service-avrcp.h"
46 #include "bt-service-obex-server.h"
47 #include "bt-service-rfcomm-server.h"
48 #include "bt-service-audio.h"
49 #include "bt-service-agent.h"
50 #include "bt-service-pbap.h"
51 #include "bt-service-headset-connection.h"
52 #include "bt-service-opp-client.h"
54 static DBusGConnection *manager_conn = NULL;
55 static DBusGConnection *obexd_conn = NULL;
56 static GList *p_cache_list = NULL;
57 static DBusGConnection *opc_obexd_conn = NULL;
60 static guint event_id;
61 guint nap_connected_device_count = 0;
62 static guint hid_connected_device_count = 0;
63 static GList *p_adv_ind_list;
72 bt_remote_dev_info_t *dev_info;
76 * obexd connection type
84 OBEX_PCSUITE = (1 << 6),
85 OBEX_SYNCEVOLUTION = (1 << 7),
87 } bluetooth_obex_connection_type_t;
89 void _bt_handle_property_changed_event(DBusMessage *msg);
90 void _bt_opc_property_changed_event(DBusMessage *msg);
91 int _bt_register_service_event(DBusGConnection *g_conn, int event_type);
92 void _bt_unregister_service_event(DBusGConnection *g_conn, int event_type);
93 void _bt_opp_client_event_deinit(void);
95 static void __bt_free_bt_le_adv_info_t(bt_le_adv_info_t *adv_info)
97 g_free(adv_info->addr);
98 g_free(adv_info->data);
102 static bt_le_adv_info_t *__bt_get_adv_ind_info(char *addr)
104 retv_if(!addr, NULL);
105 bt_le_adv_info_t *adv_info = NULL;
106 GList *current = g_list_first((GList *)p_adv_ind_list);
107 while(current && current->data) {
108 adv_info = (bt_le_adv_info_t *)current->data;
109 retv_if(adv_info && !g_strcmp0(adv_info->addr, addr), adv_info);
110 current = g_list_next(current);
115 static void __bt_add_adv_ind_info(bt_le_adv_info_t *adv_info)
118 if (__bt_get_adv_ind_info(adv_info->addr) != NULL) {
119 BT_ERR("adv_info is already added");
120 __bt_free_bt_le_adv_info_t(adv_info);
123 p_adv_ind_list = g_list_append(p_adv_ind_list, adv_info);
126 static void __bt_del_adv_ind_info(char *addr)
129 ret_if(!p_adv_ind_list);
130 bt_le_adv_info_t *adv_info = NULL;
131 GList *current = g_list_first((GList *)p_adv_ind_list);
132 while(current && current->data) {
133 adv_info = (bt_le_adv_info_t *)current->data;
134 if (adv_info && !g_strcmp0(adv_info->addr, addr)) {
135 p_adv_ind_list = g_list_remove(p_adv_ind_list, adv_info);
136 __bt_free_bt_le_adv_info_t(adv_info);
139 current = g_list_next(current);
143 static void __bt_free_cache_info(bt_cache_info_t *cache_info)
145 ret_if(cache_info == NULL);
147 _bt_free_device_info(cache_info->dev_info);
151 static gboolean __bt_parse_device_properties(DBusMessageIter *item_iter,
152 bt_remote_dev_info_t *dev_info)
155 DBusMessageIter value_iter;
158 dbus_message_iter_recurse(item_iter, &value_iter);
160 if (dbus_message_iter_get_arg_type(&value_iter) != DBUS_TYPE_DICT_ENTRY) {
165 while (dbus_message_iter_get_arg_type(&value_iter) ==
166 DBUS_TYPE_DICT_ENTRY) {
168 DBusMessageIter dict_entry;
169 DBusMessageIter iter_dict_val;
171 dbus_message_iter_recurse(&value_iter, &dict_entry);
173 dbus_message_iter_get_basic(&dict_entry, &key);
176 dbus_message_iter_next(&value_iter);
180 if (!dbus_message_iter_next(&dict_entry)) {
181 dbus_message_iter_next(&value_iter);
184 dbus_message_iter_recurse(&dict_entry, &iter_dict_val);
187 if (strcasecmp(key, "Address") == 0) {
188 const char *address = NULL;
189 dbus_message_iter_get_basic(&iter_dict_val, &address);
190 dev_info->address = g_strdup(address);
191 } else if (strcasecmp(key, "Class") == 0) {
192 dbus_message_iter_get_basic(&iter_dict_val, &dev_info->class);
193 } else if (strcasecmp(key, "Name") == 0) {
194 dbus_message_iter_get_basic(&iter_dict_val, &value);
195 if (dev_info->name == NULL)
196 dev_info->name = g_strdup(value);
197 } else if (strcasecmp(key, "Connected") == 0) {
198 dbus_message_iter_get_basic(&iter_dict_val,
199 &dev_info->connected);
200 } else if (strcasecmp(key, "Paired") == 0) {
201 dbus_message_iter_get_basic(&iter_dict_val,
203 } else if (strcasecmp(key, "Trusted") == 0) {
204 dbus_message_iter_get_basic(&iter_dict_val,
206 } else if (strcasecmp(key, "RSSI") == 0) {
207 dbus_message_iter_get_basic(&iter_dict_val,
209 } else if (strcasecmp(key, "LastAddrType") == 0) {
210 dbus_message_iter_get_basic(&iter_dict_val,
211 &dev_info->addr_type);
212 } else if (strcasecmp(key, "UUIDs") == 0) {
213 DBusMessageIter uuid_iter;
214 DBusMessageIter tmp_iter;
217 dbus_message_iter_recurse(&iter_dict_val, &uuid_iter);
219 tmp_iter = uuid_iter;
221 /* Store the uuid count */
222 while (dbus_message_iter_get_arg_type(&tmp_iter) != DBUS_TYPE_INVALID) {
223 dbus_message_iter_get_basic(&tmp_iter,
226 dev_info->uuid_count++;
227 if (!dbus_message_iter_next(&tmp_iter))
231 /* Store the uuids */
232 if (dev_info->uuid_count > 0) {
233 dev_info->uuids = g_new0(char *,
234 dev_info->uuid_count + 1);
236 dbus_message_iter_next(&value_iter);
240 while (dbus_message_iter_get_arg_type(&uuid_iter) != DBUS_TYPE_INVALID) {
241 dbus_message_iter_get_basic(&uuid_iter,
243 dev_info->uuids[i] = g_strdup(value);
245 if (!dbus_message_iter_next(&uuid_iter)) {
249 } else if (strcasecmp(key, "ManufacturerDataLen") == 0) {
250 dbus_message_iter_get_basic(&iter_dict_val,
251 &dev_info->manufacturer_data_len);
253 if (dev_info->manufacturer_data_len > BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX) {
254 BT_ERR("manufacturer_data_len is too long(len = %d)", dev_info->manufacturer_data_len);
255 dev_info->manufacturer_data_len = BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX;
258 if (dev_info->manufacturer_data_len == 0)
259 dev_info->manufacturer_data = g_strdup("");
260 } else if (strcasecmp(key, "ManufacturerData") == 0) {
261 DBusMessageIter manufacturer_iter;
264 char *manufacturer_data = NULL;
267 dbus_message_iter_recurse(&iter_dict_val, &manufacturer_iter);
268 len = dbus_message_iter_get_array_len(&manufacturer_iter);
270 dev_info->manufacturer_data = g_malloc0(len);
271 manufacturer_data = dev_info->manufacturer_data;
273 while (dbus_message_iter_get_arg_type(&manufacturer_iter) == DBUS_TYPE_BYTE) {
274 dbus_message_iter_get_basic(&manufacturer_iter, &byte);
275 manufacturer_data[i] = byte;
277 dbus_message_iter_next(&manufacturer_iter);
282 dbus_message_iter_next(&value_iter);
289 static gboolean __bt_parse_interface(DBusMessage *msg,
290 bt_remote_dev_info_t *dev_info)
294 DBusMessageIter msg_iter;
295 DBusMessageIter value_iter;
296 char *object_path = NULL;
298 retv_if(dbus_message_iter_init(msg, &msg_iter) == FALSE, FALSE);
300 dbus_message_iter_get_basic(&msg_iter, &object_path);
301 retv_if(object_path == NULL, FALSE);
303 /* object array (oa) */
304 retv_if(dbus_message_iter_next(&msg_iter) == FALSE, FALSE);
305 retv_if(dbus_message_iter_get_arg_type(&msg_iter) !=
306 DBUS_TYPE_ARRAY, FALSE);
308 dbus_message_iter_recurse(&msg_iter, &value_iter);
310 /* string array (sa) */
311 while (dbus_message_iter_get_arg_type(&value_iter) ==
312 DBUS_TYPE_DICT_ENTRY) {
313 char *interface_name = NULL;
314 DBusMessageIter interface_iter;
316 dbus_message_iter_recurse(&value_iter, &interface_iter);
318 retv_if(dbus_message_iter_get_arg_type(&interface_iter) !=
319 DBUS_TYPE_STRING, FALSE);
321 dbus_message_iter_get_basic(&interface_iter, &interface_name);
323 retv_if(dbus_message_iter_next(&interface_iter) == FALSE, FALSE);
325 retv_if(dbus_message_iter_get_arg_type(&interface_iter) !=
326 DBUS_TYPE_ARRAY, FALSE);
328 BT_DBG("interface: %s", interface_name);
330 if (g_strcmp0(interface_name, "org.bluez.Device1") == 0) {
331 BT_DBG("Found a device: %s", object_path);
333 if (__bt_parse_device_properties(&interface_iter,
334 dev_info) == FALSE) {
335 BT_ERR("Fail to parse the properies");
342 dbus_message_iter_next(&value_iter);
350 char *__bt_get_headset_name(char *address)
352 bluetooth_device_address_t device_address = { {0} };
353 bluetooth_device_info_t dev_info;
355 retv_if(address == NULL, strdup(""));
357 _bt_convert_addr_string_to_type(device_address.addr, address);
359 memset(&dev_info, 0x00, sizeof(bluetooth_device_info_t));
361 _bt_get_bonded_device_info(&device_address, &dev_info);
363 return g_strdup(dev_info.device_name.name);
366 static int __bt_get_owner_info(DBusMessage *msg, char **name,
367 char **previous, char **current)
369 DBusMessageIter item_iter;
371 dbus_message_iter_init(msg, &item_iter);
373 if (dbus_message_iter_get_arg_type(&item_iter)
374 != DBUS_TYPE_STRING) {
375 BT_ERR("This is bad format dbus");
376 return BLUETOOTH_ERROR_INTERNAL;
379 dbus_message_iter_get_basic(&item_iter, name);
381 retv_if(*name == NULL, BLUETOOTH_ERROR_INTERNAL);
383 dbus_message_iter_next(&item_iter);
385 if (dbus_message_iter_get_arg_type(&item_iter)
386 != DBUS_TYPE_STRING) {
387 BT_ERR("This is bad format dbus");
388 return BLUETOOTH_ERROR_INTERNAL;
391 dbus_message_iter_get_basic(&item_iter, previous);
393 retv_if(*previous == NULL, BLUETOOTH_ERROR_INTERNAL);
395 dbus_message_iter_next(&item_iter);
397 if (dbus_message_iter_get_arg_type(&item_iter)
398 != DBUS_TYPE_STRING) {
399 BT_ERR("This is bad format dbus");
400 return BLUETOOTH_ERROR_INTERNAL;
403 dbus_message_iter_get_basic(&item_iter, current);
405 retv_if(*current == NULL, BLUETOOTH_ERROR_INTERNAL);
407 return BLUETOOTH_ERROR_NONE;
410 static int __bt_get_agent_signal_info(DBusMessage *msg, char **address,
411 char **name, char **uuid)
415 DBusMessageIter item_iter;
417 dbus_message_iter_init(msg, &item_iter);
419 if (dbus_message_iter_get_arg_type(&item_iter)
420 != DBUS_TYPE_STRING) {
421 BT_ERR("This is bad format dbus");
422 return BLUETOOTH_ERROR_INTERNAL;
425 dbus_message_iter_get_basic(&item_iter, address);
427 dbus_message_iter_next(&item_iter);
429 if (dbus_message_iter_get_arg_type(&item_iter)
430 != DBUS_TYPE_STRING) {
431 BT_ERR("This is bad format dbus");
432 return BLUETOOTH_ERROR_INTERNAL;
435 dbus_message_iter_get_basic(&item_iter, name);
437 dbus_message_iter_next(&item_iter);
439 if (dbus_message_iter_get_arg_type(&item_iter)
440 != DBUS_TYPE_STRING) {
441 BT_ERR("This is bad format dbus");
442 return BLUETOOTH_ERROR_INTERNAL;
445 dbus_message_iter_get_basic(&item_iter, uuid);
449 return BLUETOOTH_ERROR_NONE;
452 void __bt_set_device_values(gboolean connected, int state)
454 int bt_device_state = VCONFKEY_BT_DEVICE_NONE;
456 if (vconf_get_int(VCONFKEY_BT_DEVICE, &bt_device_state) != 0) {
457 BT_ERR("vconf_get_int failed");
460 if (connected == TRUE)
461 bt_device_state |= state;
462 else if (bt_device_state & state)
463 bt_device_state ^= state;
465 if (vconf_set_int(VCONFKEY_BT_DEVICE, bt_device_state) != 0) {
466 BT_ERR("vconf_set_int failed");
470 gboolean _bt_discovery_finished_cb(gpointer user_data)
472 int result = BLUETOOTH_ERROR_NONE;
475 if (_bt_get_discovering_property(DISCOVERY_ROLE_BREDR) == FALSE) {
476 if (_bt_get_cancel_by_user() == TRUE) {
477 result = BLUETOOTH_ERROR_CANCEL_BY_USER;
480 _bt_set_cancel_by_user(FALSE);
481 _bt_set_discovery_status(FALSE);
482 _bt_send_event(BT_ADAPTER_EVENT,
483 BLUETOOTH_EVENT_DISCOVERY_FINISHED,
484 DBUS_TYPE_INT32, &result,
491 gboolean _bt_stop_discovery_timeout_cb(gpointer user_data)
493 DBusGProxy *adapter_proxy;
497 adapter_proxy = _bt_get_adapter_proxy();
498 retv_if(adapter_proxy == NULL, FALSE);
500 /* Need to stop searching */
501 dbus_g_proxy_call(adapter_proxy,
510 void _bt_stop_discovery_timeout(void)
515 event_id = g_timeout_add(BT_STOP_DISCOVERY_TIMEOUT,
516 (GSourceFunc)_bt_stop_discovery_timeout_cb, NULL);
519 static gboolean __bt_le_discovery_finished_cb(gpointer user_data)
521 int result = BLUETOOTH_ERROR_NONE;
524 if (_bt_get_discovering_property(DISCOVERY_ROLE_LE) == FALSE) {
525 if (_bt_get_cancel_by_user() == TRUE) {
526 result = BLUETOOTH_ERROR_CANCEL_BY_USER;
529 _bt_set_cancel_by_user(FALSE);
530 _bt_set_le_discovery_status(FALSE);
531 _bt_send_event(BT_LE_ADAPTER_EVENT,
532 BLUETOOTH_EVENT_LE_DISCOVERY_FINISHED,
533 DBUS_TYPE_INT32, &result,
540 void __bt_update_remote_cache_devinfo(const char *address, gboolean paired_status)
544 ret_if(address == NULL);
547 bt_cache_info_t *cache_info;
548 bt_remote_dev_info_t *dev_info;
550 node = g_list_first(p_cache_list);
552 while (node != NULL){
553 cache_info = (bt_cache_info_t *)node->data;
555 if (cache_info == NULL) {
556 node = g_list_next(node);
560 dev_info = cache_info->dev_info;
561 if (strcasecmp(dev_info->address,
563 BT_DBG("Device Found");
564 if (paired_status == TRUE)
565 cache_info->dev_info->paired = TRUE;
567 cache_info->dev_info->paired = FALSE;
570 node = g_list_next(node);
575 static void __bt_device_remote_connected_properties(
576 bt_remote_dev_info_t *remote_dev_info,
577 char *address, gboolean connected)
579 int result = BLUETOOTH_ERROR_NONE;
584 if (remote_dev_info->uuid_count > 0 ) {
585 for (i = 0; i<remote_dev_info->uuid_count; i++) {
586 char *uuid = remote_dev_info->uuids[i];
587 if (strcasecmp(uuid, HID_UUID) == 0){
588 int event = BLUETOOTH_EVENT_NONE;
590 event = (connected == TRUE) ?
591 BLUETOOTH_HID_CONNECTED :
592 BLUETOOTH_HID_DISCONNECTED;
594 _bt_send_event(BT_HID_EVENT, event,
595 DBUS_TYPE_INT32, &result,
596 DBUS_TYPE_STRING, &address,
606 void _bt_handle_adapter_event(DBusMessage *msg)
610 int result = BLUETOOTH_ERROR_NONE;
611 DBusMessageIter item_iter;
612 const char *member = dbus_message_get_member(msg);
614 ret_if(member == NULL);
616 if (strcasecmp(member, "DeviceCreated") == 0) {
617 const char *object_path = NULL;
619 bt_remote_dev_info_t *remote_dev_info;
621 ret_if(_bt_is_device_creating() == FALSE);
623 /* Bonding from remote device */
624 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
626 dbus_message_iter_init(msg, &item_iter);
627 dbus_message_iter_get_basic(&item_iter, &object_path);
628 dbus_message_iter_next(&item_iter);
630 _bt_convert_device_path_to_address(object_path, address);
632 remote_dev_info = _bt_get_remote_device_info(address);
633 if (remote_dev_info == NULL) {
638 _bt_free_device_info(remote_dev_info);
640 } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
641 const char *object_path = NULL;
643 bt_cache_info_t *cache_info;
644 bt_remote_dev_info_t *dev_info;
647 /* Bonding from remote device */
648 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
650 dbus_message_iter_init(msg, &item_iter);
651 dbus_message_iter_get_basic(&item_iter, &object_path);
652 dbus_message_iter_next(&item_iter);
654 _bt_convert_device_path_to_address(object_path, address);
656 _bt_send_event(BT_ADAPTER_EVENT,
657 BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED,
658 DBUS_TYPE_INT32, &result,
659 DBUS_TYPE_STRING, &address,
662 node = g_list_first(p_cache_list);
664 while (node != NULL){
665 cache_info = (bt_cache_info_t *)node->data;
667 if (cache_info == NULL) {
668 node = g_list_next(node);
672 dev_info = cache_info->dev_info;
673 if (strcasecmp(dev_info->address,
675 p_cache_list = g_list_remove(p_cache_list,
677 __bt_free_cache_info(cache_info);
680 node = g_list_next(node);
684 } else if (strcasecmp(member, "AdvertisingEnabled") == 0) {
685 BT_DBG("Advertising Enabled");
688 gboolean status = FALSE;
690 dbus_message_iter_init(msg, &item_iter);
692 dbus_message_iter_get_basic(&item_iter, &slot_id);
693 dbus_message_iter_next(&item_iter);
694 dbus_message_iter_get_basic(&item_iter, &status);
696 BT_DBG("Advertising Enabled : slot_id [%d] status [%d]", slot_id, status);
698 /* Send event to application */
699 _bt_set_advertising_status(slot_id, status);
701 sender = _bt_get_adv_slot_owner(slot_id);
703 bluetooth_advertising_params_t adv_params = {0, };
705 _bt_get_advertising_params(&adv_params);
706 _bt_send_event_to_dest(sender, BT_ADAPTER_EVENT,
707 BLUETOOTH_EVENT_ADVERTISING_STARTED,
708 DBUS_TYPE_INT32, &result,
709 DBUS_TYPE_DOUBLE, &adv_params.interval_min,
710 DBUS_TYPE_DOUBLE, &adv_params.interval_max,
713 _bt_send_event_to_dest(sender, BT_ADAPTER_EVENT,
714 BLUETOOTH_EVENT_ADVERTISING_STOPPED,
715 DBUS_TYPE_INT32, &result,
718 } else if (strcasecmp(member, "RssiEnabled") == 0) {
719 BT_DBG("RSSI Enabled");
720 gboolean status = FALSE;
721 char *address = NULL;
724 dbus_message_iter_init(msg, &item_iter);
725 dbus_message_iter_get_basic(&item_iter, &address);
726 dbus_message_iter_next(&item_iter);
727 dbus_message_iter_get_basic(&item_iter, &link_type);
728 dbus_message_iter_next(&item_iter);
729 dbus_message_iter_get_basic(&item_iter, &status);
731 BT_DBG("RSSI Enabled [%s %d]", address, status);
732 _bt_send_event(BT_DEVICE_EVENT,
733 BLUETOOTH_EVENT_RSSI_ENABLED,
734 DBUS_TYPE_INT32, &result,
735 DBUS_TYPE_STRING, &address,
736 DBUS_TYPE_INT32, &link_type,
737 DBUS_TYPE_BOOLEAN, &status,
739 } else if (strcasecmp(member, "RssiAlert") == 0) {
740 BT_DBG("RSSI Alert");
744 char *address = NULL;
746 dbus_message_iter_init(msg, &item_iter);
747 dbus_message_iter_get_basic(&item_iter, &address);
748 dbus_message_iter_next(&item_iter);
749 dbus_message_iter_get_basic(&item_iter, &link_type);
750 dbus_message_iter_next(&item_iter);
751 dbus_message_iter_get_basic(&item_iter, &alert_type);
752 dbus_message_iter_next(&item_iter);
753 dbus_message_iter_get_basic(&item_iter, &rssi_dbm);
755 BT_DBG("RSSI Alert: [Address %s LinkType %d] [Type %d DBM %d]",
756 address, alert_type, rssi_dbm);
758 _bt_send_event(BT_DEVICE_EVENT,
759 BLUETOOTH_EVENT_RSSI_ALERT,
760 DBUS_TYPE_INT32, &result,
761 DBUS_TYPE_STRING, &address,
762 DBUS_TYPE_INT32, &link_type,
763 DBUS_TYPE_INT32, &alert_type,
764 DBUS_TYPE_INT32, &rssi_dbm,
766 } else if (strcasecmp(member, "RawRssi") == 0) {
770 char *address = NULL;
772 dbus_message_iter_init(msg, &item_iter);
773 dbus_message_iter_get_basic(&item_iter, &address);
774 dbus_message_iter_next(&item_iter);
775 dbus_message_iter_get_basic(&item_iter, &link_type);
776 dbus_message_iter_next(&item_iter);
777 dbus_message_iter_get_basic(&item_iter, &rssi_dbm);
779 BT_DBG("Raw RSSI: [Address %s] [Link Type %d][RSSI DBM %d]",
780 address, link_type, rssi_dbm);
782 _bt_send_event(BT_DEVICE_EVENT,
783 BLUETOOTH_EVENT_RAW_RSSI,
784 DBUS_TYPE_INT32, &result,
785 DBUS_TYPE_STRING, &address,
786 DBUS_TYPE_INT32, &link_type,
787 DBUS_TYPE_INT32, &rssi_dbm,
789 } else if (strcasecmp(member, BT_HARDWARE_ERROR) == 0) {
790 BT_ERR_C("Hardware error received from BLUEZ");
791 _bt_recover_adapter();
792 } else if (strcasecmp(member, BT_TX_TIMEOUT_ERROR) == 0) {
793 BT_ERR_C("Tx timeout error received from BLUEZ");
794 _bt_recover_adapter();
799 static void __bt_adapter_property_changed_event(DBusMessageIter *msg_iter, const char *path)
801 DBusGProxy *adapter_proxy;
803 int result = BLUETOOTH_ERROR_NONE;
804 DBusMessageIter value_iter;
805 DBusMessageIter dict_iter;
806 DBusMessageIter item_iter;
807 GValue timeout = { 0 };
808 const char *property = NULL;
810 dbus_message_iter_recurse(msg_iter, &item_iter);
812 if (dbus_message_iter_get_arg_type(&item_iter)
813 != DBUS_TYPE_DICT_ENTRY) {
814 BT_ERR("This is bad format dbus");
819 dbus_message_iter_recurse(&item_iter, &dict_iter);
821 dbus_message_iter_get_basic(&dict_iter, &property);
822 ret_if(property == NULL);
824 ret_if(!dbus_message_iter_next(&dict_iter));
826 if (strcasecmp(property, "Discovering") == 0) {
827 gboolean discovering = FALSE;
829 dbus_message_iter_recurse(&dict_iter, &value_iter);
830 dbus_message_iter_get_basic(&value_iter, &discovering);
832 /* Send event to application */
833 if (discovering == TRUE) {
834 _bt_set_discovery_status(TRUE);
835 _bt_send_event(BT_ADAPTER_EVENT,
836 BLUETOOTH_EVENT_DISCOVERY_STARTED,
837 DBUS_TYPE_INT32, &result,
841 g_source_remove(event_id);
845 } else if (strcasecmp(property, "LEDiscovering") == 0) {
846 gboolean le_discovering = FALSE;
848 dbus_message_iter_recurse(&dict_iter, &value_iter);
849 dbus_message_iter_get_basic(&value_iter, &le_discovering);
851 /* Send event to application */
852 if (le_discovering == TRUE) {
853 _bt_set_le_discovery_status(TRUE);
854 _bt_send_event(BT_LE_ADAPTER_EVENT,
855 BLUETOOTH_EVENT_LE_DISCOVERY_STARTED,
856 DBUS_TYPE_INT32, &result,
859 ret_if(event_id > 0);
861 adapter_proxy = _bt_get_adapter_proxy();
862 ret_if(adapter_proxy == NULL);
864 /* Need to stop searching */
865 dbus_g_proxy_call(adapter_proxy,
871 event_id = g_timeout_add(BT_DISCOVERY_FINISHED_DELAY,
872 (GSourceFunc)__bt_le_discovery_finished_cb, NULL);
874 } else if (strcasecmp(property, "Name") == 0) {
877 dbus_message_iter_recurse(&dict_iter, &value_iter);
878 dbus_message_iter_get_basic(&value_iter, &name);
880 /* Send event to application */
881 _bt_send_event(BT_ADAPTER_EVENT,
882 BLUETOOTH_EVENT_LOCAL_NAME_CHANGED,
883 DBUS_TYPE_INT32, &result,
884 DBUS_TYPE_STRING, &name,
886 } else if (strcasecmp(property, "Alias") == 0) {
889 dbus_message_iter_recurse(&dict_iter, &value_iter);
890 dbus_message_iter_get_basic(&value_iter, &alias);
892 /* Send event to application */
893 _bt_send_event(BT_ADAPTER_EVENT,
894 BLUETOOTH_EVENT_LOCAL_NAME_CHANGED,
895 DBUS_TYPE_INT32, &result,
896 DBUS_TYPE_STRING, &alias,
898 } else if (strcasecmp(property, "Discoverable") == 0) {
899 gboolean discoverable = FALSE;
901 dbus_message_iter_recurse(&dict_iter, &value_iter);
902 dbus_message_iter_get_basic(&value_iter, &discoverable);
904 if (discoverable == FALSE) {
905 if (_bt_get_discoverable_timeout_property() > 0) {
906 g_value_init(&timeout, G_TYPE_UINT);
907 g_value_set_uint(&timeout, 0);
909 adapter_proxy = _bt_get_adapter_properties_proxy();
910 ret_if(adapter_proxy == NULL);
912 dbus_g_proxy_call_no_reply(adapter_proxy, "Set",
913 G_TYPE_STRING, BT_ADAPTER_INTERFACE,
914 G_TYPE_STRING, "DiscoverableTimeout",
915 G_TYPE_VALUE, &timeout,
918 g_value_unset(&timeout);
921 mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
923 /* Send event to application */
924 BT_INFO("[Connectable]");
925 _bt_send_event(BT_ADAPTER_EVENT,
926 BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
927 DBUS_TYPE_INT32, &result,
928 DBUS_TYPE_INT16, &mode,
931 _bt_get_discoverable_mode(&mode);
933 /* Event will be sent by "DiscoverableTimeout" signal */
934 if (mode != BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE)
937 /* Send event to application */
938 BT_INFO("[General Discoverable]");
939 _bt_send_event(BT_ADAPTER_EVENT,
940 BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
941 DBUS_TYPE_INT32, &result,
942 DBUS_TYPE_INT16, &mode,
945 } else if (strcasecmp(property, "DiscoverableTimeout") == 0) {
946 _bt_get_discoverable_mode(&mode);
948 /* Event was already sent by "Discoverable" signal */
949 if (mode == BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE ||
950 mode == BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE)
953 /* Send event to application */
954 BT_INFO("[Limited Discoverable (Timeout %u secs)]",
955 _bt_get_discoverable_timeout_property());
957 _bt_send_event(BT_ADAPTER_EVENT,
958 BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
959 DBUS_TYPE_INT32, &result,
960 DBUS_TYPE_INT16, &mode,
962 } else if (strcasecmp(property, "Powered") == 0) {
963 /* TODO: Need to check this operation!! */
964 gboolean powered = FALSE;
966 dbus_message_iter_recurse(&dict_iter, &value_iter);
967 dbus_message_iter_get_basic(&value_iter, &powered);
968 BT_DBG("Powered = %d", powered);
970 if (powered == TRUE) {
971 BT_ERR("calling _bt_handle_adapter_added ...........");
972 _bt_handle_adapter_added();
975 _bt_set_disabled(BLUETOOTH_ERROR_NONE);
978 if (vconf_get_int(VCONFKEY_BT_LE_STATUS, &bt_state) == 0 &&
979 bt_state != VCONFKEY_BT_LE_STATUS_OFF) {
980 _bt_set_le_disabled(BLUETOOTH_ERROR_NONE);
983 } else if (strcasecmp(property, "Connectable") == 0) {
984 gboolean connectable = FALSE;
986 dbus_message_iter_recurse(&dict_iter, &value_iter);
987 dbus_message_iter_get_basic(&value_iter, &connectable);
989 BT_DBG("Connectable property is changed : %d", connectable);
991 _bt_send_event(BT_ADAPTER_EVENT,
992 BLUETOOTH_EVENT_CONNECTABLE_CHANGED,
993 DBUS_TYPE_BOOLEAN, &connectable,
996 if (_bt_adapter_get_status() == BT_DEACTIVATING &&
997 _bt_adapter_get_le_status() == BT_LE_ACTIVATED &&
999 _bt_set_disabled(BLUETOOTH_ERROR_NONE);
1000 } else if (strcasecmp(property, "SupportedLEFeatures") == 0) {
1003 DBusMessageIter array_iter;
1005 dbus_message_iter_recurse(&dict_iter, &value_iter);
1007 if(dbus_message_iter_get_arg_type(&value_iter) == DBUS_TYPE_ARRAY) {
1008 dbus_message_iter_recurse(&value_iter, &array_iter);
1010 while (dbus_message_iter_get_arg_type(&array_iter) !=
1011 DBUS_TYPE_INVALID) {
1012 dbus_message_iter_get_basic(&array_iter, &name);
1013 if (!dbus_message_iter_next(&array_iter))
1016 dbus_message_iter_get_basic(&array_iter, &val);
1018 BT_DBG("name[%s] value[%s]", name, val);
1020 if (FALSE == _bt_update_le_feature_support(name, val))
1021 BT_INFO("Fail to update LE feature info");
1023 if (!dbus_message_iter_next(&array_iter))
1028 BT_DBG("property : [%s]", property);
1030 } while(dbus_message_iter_next(&item_iter));
1033 static void __bt_device_property_changed_event(DBusMessageIter *msg_iter, const char *path)
1038 int result = BLUETOOTH_ERROR_NONE;
1039 DBusMessageIter value_iter;
1040 DBusMessageIter dict_iter;
1041 DBusMessageIter item_iter;
1042 const char *property = NULL;
1044 bt_remote_dev_info_t *remote_dev_info;
1047 dbus_message_iter_recurse(msg_iter, &item_iter);
1049 if (dbus_message_iter_get_arg_type(&item_iter)
1050 != DBUS_TYPE_DICT_ENTRY) {
1051 BT_ERR("This is bad format dbus");
1056 dbus_message_iter_recurse(&item_iter, &dict_iter);
1058 dbus_message_iter_get_basic(&dict_iter, &property);
1059 ret_if(property == NULL);
1061 ret_if(!dbus_message_iter_next(&dict_iter));
1063 BT_ERR(" device property changed \n %s" , property);
1065 if (strcasecmp(property, "Connected") == 0) {
1066 gboolean connected = FALSE;
1068 dbus_message_iter_recurse(&dict_iter, &value_iter);
1069 dbus_message_iter_get_basic(&value_iter, &connected);
1071 event = connected ? BLUETOOTH_EVENT_DEVICE_CONNECTED :
1072 BLUETOOTH_EVENT_DEVICE_DISCONNECTED;
1074 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1076 _bt_convert_device_path_to_address(path, address);
1078 BT_DBG("connected: %d", connected);
1079 BT_DBG("address: %s", address);
1081 remote_dev_info = _bt_get_remote_device_info(address);
1083 if (remote_dev_info != NULL) {
1084 __bt_device_remote_connected_properties(
1085 remote_dev_info, address, connected);
1086 _bt_free_device_info(remote_dev_info);
1089 /* Send event to application */
1090 _bt_send_event(BT_DEVICE_EVENT,
1092 DBUS_TYPE_INT32, &result,
1093 DBUS_TYPE_STRING, &address,
1097 } else if (strcasecmp(property, "RSSI") == 0) {
1098 bt_remote_dev_info_t *remote_dev_info;
1100 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1102 _bt_convert_device_path_to_address(path, address);
1103 BT_DBG("address: %s", address);
1105 remote_dev_info = _bt_get_remote_device_info(address);
1106 if (remote_dev_info == NULL) {
1110 BT_DBG("Address type %d", remote_dev_info->addr_type);
1112 if (remote_dev_info && remote_dev_info->addr_type == 0) {
1113 BT_DBG("Name %s", remote_dev_info->name);
1115 _bt_send_event(BT_ADAPTER_EVENT,
1116 BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND,
1117 DBUS_TYPE_INT32, &result,
1118 DBUS_TYPE_STRING, &remote_dev_info->address,
1119 DBUS_TYPE_UINT32, &remote_dev_info->class,
1120 DBUS_TYPE_INT16, &remote_dev_info->rssi,
1121 DBUS_TYPE_STRING, &remote_dev_info->name,
1122 DBUS_TYPE_BOOLEAN, &remote_dev_info->paired,
1123 DBUS_TYPE_BOOLEAN, &remote_dev_info->connected,
1124 DBUS_TYPE_BOOLEAN, &remote_dev_info->trust,
1125 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
1126 &remote_dev_info->uuids, remote_dev_info->uuid_count,
1127 DBUS_TYPE_INT16, &remote_dev_info->manufacturer_data_len,
1128 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
1129 &remote_dev_info->manufacturer_data, remote_dev_info->manufacturer_data_len,
1132 _bt_free_device_info(remote_dev_info);
1134 } else if (strcasecmp(property, "GattConnected") == 0) {
1135 gboolean gatt_connected = FALSE;
1137 dbus_message_iter_recurse(&dict_iter, &value_iter);
1138 dbus_message_iter_get_basic(&value_iter, &gatt_connected);
1140 event = gatt_connected ? BLUETOOTH_EVENT_GATT_CONNECTED :
1141 BLUETOOTH_EVENT_GATT_DISCONNECTED;
1143 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1145 _bt_convert_device_path_to_address(path, address);
1147 BT_DBG("gatt_connected: %d", gatt_connected);
1148 BT_DBG("address: %s", address);
1150 /* Send event to application */
1151 _bt_send_event(BT_DEVICE_EVENT,
1153 DBUS_TYPE_INT32, &result,
1154 DBUS_TYPE_STRING, &address,
1158 } else if (strcasecmp(property, "Paired") == 0) {
1159 gboolean paired = FALSE;
1160 bt_remote_dev_info_t *remote_dev_info;
1162 dbus_message_iter_recurse(&dict_iter, &value_iter);
1163 dbus_message_iter_get_basic(&value_iter, &paired);
1165 _bt_agent_set_canceled(FALSE);
1166 /* BlueZ sends paired signal for each paired device */
1167 /* during activation, We should ignore this, otherwise*/
1168 /* application thinks that a new device got paired */
1169 if (_bt_adapter_get_status() != BT_ACTIVATED) {
1170 BT_DBG("BT is not activated, so ignore this");
1174 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1176 _bt_convert_device_path_to_address(path, address);
1178 remote_dev_info = _bt_get_remote_device_info(address);
1179 if (remote_dev_info == NULL) {
1184 if(paired == FALSE) {
1185 BT_INFO("Unpaired: %s", address);
1186 __bt_update_remote_cache_devinfo(address, FALSE);
1187 _bt_send_event(BT_ADAPTER_EVENT,
1188 BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED,
1189 DBUS_TYPE_INT32, &result,
1190 DBUS_TYPE_STRING, &address,
1193 BT_INFO("Paired: %s", address);
1194 __bt_update_remote_cache_devinfo(address, TRUE);
1197 if (_bt_is_device_creating() == TRUE) {
1198 BT_DBG("Try to Pair by me");
1199 _bt_free_device_info(remote_dev_info);
1204 _bt_send_event(BT_ADAPTER_EVENT,
1205 BLUETOOTH_EVENT_BONDING_FINISHED,
1206 DBUS_TYPE_INT32, &result,
1207 DBUS_TYPE_STRING, &address,
1208 DBUS_TYPE_UINT32, &remote_dev_info->class,
1209 DBUS_TYPE_INT16, &remote_dev_info->rssi,
1210 DBUS_TYPE_STRING, &remote_dev_info->name,
1211 DBUS_TYPE_BOOLEAN, &remote_dev_info->paired,
1212 DBUS_TYPE_BOOLEAN, &remote_dev_info->connected,
1213 DBUS_TYPE_BOOLEAN, &remote_dev_info->trust,
1214 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
1215 &remote_dev_info->uuids, remote_dev_info->uuid_count,
1216 DBUS_TYPE_INT16, &remote_dev_info->manufacturer_data_len,
1217 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
1218 &remote_dev_info->manufacturer_data, remote_dev_info->manufacturer_data_len,
1221 _bt_free_device_info(remote_dev_info);
1223 } else if (strcasecmp(property, "LegacyPaired") == 0) {
1224 gboolean paired = FALSE;
1225 bt_remote_dev_info_t *remote_dev_info;
1227 if (_bt_adapter_get_status() != BT_ACTIVATED) {
1228 BT_DBG("BT is not activated, so ignore this");
1232 dbus_message_iter_recurse(&dict_iter, &value_iter);
1233 dbus_message_iter_get_basic(&value_iter, &paired);
1234 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1235 BT_DBG("LegacyPaired: %d", paired);
1236 _bt_convert_device_path_to_address(path, address);
1238 remote_dev_info = _bt_get_remote_device_info(address);
1239 if (remote_dev_info == NULL) {
1244 BT_DBG("LegacyPairing Failed with %s. Show Error Popup",
1245 remote_dev_info->name);
1246 _bt_launch_system_popup(BT_AGENT_EVENT_LEGACY_PAIR_FAILED_FROM_REMOTE,
1247 remote_dev_info->name, NULL, NULL, NULL);
1249 _bt_free_device_info(remote_dev_info);
1251 } else if (strcasecmp(property, "Trusted") == 0) {
1252 gboolean trusted = FALSE;
1254 dbus_message_iter_recurse(&dict_iter, &value_iter);
1255 dbus_message_iter_get_basic(&value_iter, &trusted);
1257 event = trusted ? BLUETOOTH_EVENT_DEVICE_AUTHORIZED :
1258 BLUETOOTH_EVENT_DEVICE_UNAUTHORIZED;
1260 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1262 _bt_convert_device_path_to_address(path, address);
1264 BT_DBG("trusted: %d", trusted);
1265 BT_DBG("address: %s", address);
1267 remote_dev_info = _bt_get_remote_device_info(address);
1269 /* Send event to application */
1270 _bt_send_event(BT_DEVICE_EVENT,
1272 DBUS_TYPE_INT32, &result,
1273 DBUS_TYPE_STRING, &address,
1278 dbus_message_iter_next(&item_iter);
1279 } while (dbus_message_iter_get_arg_type(&item_iter) ==
1280 DBUS_TYPE_DICT_ENTRY);
1284 static void __bt_media_control_changed_event(DBusMessageIter *msg_iter, const char *path)
1287 int result = BLUETOOTH_ERROR_NONE;
1288 DBusMessageIter value_iter;
1289 DBusMessageIter dict_iter;
1290 DBusMessageIter item_iter;
1291 const char *property = NULL;
1293 bt_remote_dev_info_t *remote_dev_info;
1295 dbus_message_iter_recurse(msg_iter, &item_iter);
1297 if (dbus_message_iter_get_arg_type(&item_iter)
1298 != DBUS_TYPE_DICT_ENTRY) {
1299 BT_ERR("This is bad format dbus");
1303 dbus_message_iter_recurse(&item_iter, &dict_iter);
1305 dbus_message_iter_get_basic(&dict_iter, &property);
1306 ret_if(property == NULL);
1308 ret_if(!dbus_message_iter_next(&dict_iter));
1310 if (strcasecmp(property, "Connected") == 0) {
1311 gboolean connected = FALSE;
1313 dbus_message_iter_recurse(&dict_iter, &value_iter);
1314 dbus_message_iter_get_basic(&value_iter, &connected);
1316 event = connected ? BLUETOOTH_EVENT_AVRCP_CONNECTED :
1317 BLUETOOTH_EVENT_AVRCP_DISCONNECTED;
1319 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1321 _bt_convert_device_path_to_address(path, address);
1323 BT_DBG("connected: %d", connected);
1324 BT_DBG("address: %s", address);
1326 remote_dev_info = _bt_get_remote_device_info(address);
1328 if (remote_dev_info != NULL) {
1329 __bt_device_remote_connected_properties(
1330 remote_dev_info, address, connected);
1331 _bt_free_device_info(remote_dev_info);
1334 /* Send event to application */
1335 _bt_send_event(BT_AVRCP_EVENT,
1337 DBUS_TYPE_INT32, &result,
1338 DBUS_TYPE_STRING, &address,
1346 static void __bt_obex_property_changed_event(DBusMessageIter *msg_iter, const char *path)
1350 DBusMessageIter value_iter;
1351 DBusMessageIter dict_iter;
1352 DBusMessageIter item_iter;
1353 const char *property = NULL;
1355 dbus_message_iter_recurse(msg_iter, &item_iter);
1357 if (dbus_message_iter_get_arg_type(&item_iter)
1358 != DBUS_TYPE_DICT_ENTRY) {
1359 BT_ERR("This is bad format dbus");
1364 dbus_message_iter_recurse(&item_iter, &dict_iter);
1366 dbus_message_iter_get_basic(&dict_iter, &property);
1367 ret_if(property == NULL);
1369 ret_if(!dbus_message_iter_next(&dict_iter));
1371 BT_DBG("property :%s", property);
1373 if (strcasecmp(property, "Status") == 0) {
1375 dbus_message_iter_recurse(&dict_iter, &value_iter);
1376 dbus_message_iter_get_basic(&value_iter, &status);
1378 if (strcasecmp(status, "active") == 0){
1379 _bt_obex_transfer_started(path);
1380 } else if (strcasecmp(status, "complete") == 0) {
1381 _bt_obex_transfer_completed(path, TRUE);
1382 _bt_pbap_obex_transfer_completed(path, TRUE);
1383 } else if (strcasecmp(status, "error") == 0){
1384 _bt_obex_transfer_completed(path, FALSE);
1385 _bt_pbap_obex_transfer_completed(path, FALSE);
1387 } else if (strcasecmp(property, "Transferred") == 0) {
1388 static int transferred = 0;
1389 dbus_message_iter_recurse(&dict_iter, &value_iter);
1390 dbus_message_iter_get_basic(&value_iter, &transferred);
1392 _bt_obex_transfer_progress(path,transferred);
1395 dbus_message_iter_next(&item_iter);
1396 } while (dbus_message_iter_get_arg_type(&item_iter) ==
1397 DBUS_TYPE_DICT_ENTRY);
1403 void _bt_handle_property_changed_event(DBusMessage *msg)
1405 DBusMessageIter item_iter;
1406 const char *member = dbus_message_get_member(msg);
1407 const char *interface_name = NULL;
1409 ret_if(member == NULL);
1411 dbus_message_iter_init(msg, &item_iter);
1413 if (dbus_message_iter_get_arg_type(&item_iter)
1414 != DBUS_TYPE_STRING) {
1415 BT_ERR("This is bad format dbus");
1419 dbus_message_iter_get_basic(&item_iter, &interface_name);
1421 ret_if(interface_name == NULL);
1423 ret_if(dbus_message_iter_next(&item_iter) == FALSE);
1425 ret_if(dbus_message_iter_get_arg_type(&item_iter) != DBUS_TYPE_ARRAY);
1427 if (strcasecmp(interface_name, BT_ADAPTER_INTERFACE) == 0) {
1428 __bt_adapter_property_changed_event(&item_iter,
1429 dbus_message_get_path(msg));
1430 } else if (strcasecmp(interface_name, BT_DEVICE_INTERFACE) == 0) {
1431 __bt_device_property_changed_event(&item_iter,
1432 dbus_message_get_path(msg));
1434 } else if (strcasecmp(interface_name, BT_OBEX_TRANSFER_INTERFACE) == 0) {
1435 BT_DBG("BT_OBEX_TRANSFER_INTERFACE");
1436 __bt_obex_property_changed_event(&item_iter,
1437 dbus_message_get_path(msg));
1438 } else if (strcasecmp(interface_name, BT_MEDIA_CONTROL_INTERFACE) == 0) {
1439 __bt_media_control_changed_event(&item_iter,
1440 dbus_message_get_path(msg));
1441 } else if (strcasecmp(interface_name, BT_PLAYER_CONTROL_INTERFACE) == 0) {
1442 _bt_handle_avrcp_control_event(&item_iter,
1443 dbus_message_get_path(msg));
1444 } else if (strcasecmp(interface_name, BT_NETWORK_CLIENT_INTERFACE) == 0) {
1445 BT_DBG("BT_NETWORK_CLIENT_INTERFACE");
1446 _bt_handle_network_client_event(&item_iter,
1447 dbus_message_get_path(msg));
1451 void _bt_handle_input_event(DBusMessage *msg)
1453 int result = BLUETOOTH_ERROR_NONE;
1454 DBusMessageIter item_iter;
1455 DBusMessageIter value_iter;
1456 gboolean property_flag = FALSE;
1457 const char *member = dbus_message_get_member(msg);
1458 const char *path = dbus_message_get_path(msg);
1459 const char *property = NULL;
1460 bt_remote_dev_info_t *remote_dev_info;
1462 ret_if(member == NULL);
1464 dbus_message_iter_init(msg, &item_iter);
1466 if (dbus_message_iter_get_arg_type(&item_iter)
1467 != DBUS_TYPE_STRING) {
1468 BT_ERR("This is bad format dbus");
1472 dbus_message_iter_get_basic(&item_iter, &property);
1474 ret_if(property == NULL);
1476 if (strcasecmp(property, "Connected") == 0) {
1477 int event = BLUETOOTH_EVENT_NONE;
1480 dbus_message_iter_next(&item_iter);
1481 dbus_message_iter_recurse(&item_iter, &value_iter);
1482 dbus_message_iter_get_basic(&value_iter, &property_flag);
1484 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1486 _bt_convert_device_path_to_address(path, address);
1488 event = (property_flag == TRUE) ?
1489 BLUETOOTH_HID_CONNECTED :
1490 BLUETOOTH_HID_DISCONNECTED;
1492 _bt_send_event(BT_HID_EVENT, event,
1493 DBUS_TYPE_INT32, &result,
1494 DBUS_TYPE_STRING, &address,
1497 /* Check HID connection type (Keyboard or Mouse) and update the status */
1498 remote_dev_info = _bt_get_remote_device_info(address);
1500 if (property_flag == TRUE) {
1501 hid_connected_device_count++;
1502 __bt_set_device_values(TRUE,
1503 VCONFKEY_BT_DEVICE_HID_CONNECTED);
1505 hid_connected_device_count--;
1506 if (hid_connected_device_count == 0)
1507 __bt_set_device_values(FALSE,
1508 VCONFKEY_BT_DEVICE_HID_CONNECTED);
1511 if (remote_dev_info != NULL) {
1512 BT_DBG("HID device class [%x]", remote_dev_info->class);
1513 if (remote_dev_info->class &
1514 BLUETOOTH_DEVICE_MINOR_CLASS_KEY_BOARD) {
1516 __bt_set_device_values(property_flag,
1517 VCONFKEY_BT_DEVICE_HID_KEYBOARD_CONNECTED);
1520 if (remote_dev_info->class &
1521 BLUETOOTH_DEVICE_MINOR_CLASS_POINTING_DEVICE)
1524 __bt_set_device_values(property_flag,
1525 VCONFKEY_BT_DEVICE_HID_MOUSE_CONNECTED);
1528 _bt_free_device_info(remote_dev_info);
1535 void _bt_handle_network_server_event(DBusMessage *msg)
1537 int result = BLUETOOTH_ERROR_NONE;
1538 char *address = NULL;
1539 char *device = NULL;
1540 const char *member = dbus_message_get_member(msg);
1542 ret_if(member == NULL);
1544 if (strcasecmp(member, "PeerConnected") == 0) {
1545 if (!dbus_message_get_args(msg, NULL,
1546 DBUS_TYPE_STRING, &device,
1547 DBUS_TYPE_STRING, &address,
1548 DBUS_TYPE_INVALID)) {
1549 BT_ERR("Unexpected parameters in signal");
1553 __bt_set_device_values(TRUE,
1554 VCONFKEY_BT_DEVICE_PAN_CONNECTED);
1556 _bt_send_event(BT_NETWORK_EVENT, BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED,
1557 DBUS_TYPE_INT32, &result,
1558 DBUS_TYPE_STRING, &device,
1559 DBUS_TYPE_STRING, &address,
1561 nap_connected_device_count++;
1562 } else if (strcasecmp(member, "PeerDisconnected") == 0) {
1563 if (!dbus_message_get_args(msg, NULL,
1564 DBUS_TYPE_STRING, &device,
1565 DBUS_TYPE_STRING, &address,
1566 DBUS_TYPE_INVALID)) {
1567 BT_ERR("Unexpected parameters in signal");
1570 nap_connected_device_count--;
1571 if (nap_connected_device_count == 0)
1572 __bt_set_device_values(FALSE,
1573 VCONFKEY_BT_DEVICE_PAN_CONNECTED);
1575 _bt_send_event(BT_NETWORK_EVENT, BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED,
1576 DBUS_TYPE_INT32, &result,
1577 DBUS_TYPE_STRING, &device,
1578 DBUS_TYPE_STRING, &address,
1583 void _bt_handle_network_client_event(DBusMessageIter *msg_iter,
1588 int result = BLUETOOTH_ERROR_NONE;
1589 DBusMessageIter item_iter;
1590 DBusMessageIter dict_iter;
1591 DBusMessageIter value_iter;
1592 gboolean property_flag = FALSE;
1593 const char *property = NULL;
1595 dbus_message_iter_recurse(msg_iter, &item_iter);
1597 if (dbus_message_iter_get_arg_type(&item_iter)
1598 != DBUS_TYPE_DICT_ENTRY) {
1599 BT_ERR("This is bad format dbus");
1603 dbus_message_iter_recurse(&item_iter, &dict_iter);
1604 dbus_message_iter_get_basic(&dict_iter, &property);
1606 ret_if(property == NULL);
1607 ret_if(!dbus_message_iter_next(&dict_iter));
1609 if (strcasecmp(property, "Connected") == 0) {
1610 int event = BLUETOOTH_EVENT_NONE;
1613 dbus_message_iter_recurse(&dict_iter, &value_iter);
1614 dbus_message_iter_get_basic(&value_iter, &property_flag);
1616 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1618 _bt_convert_device_path_to_address(path, address);
1620 BT_DBG("property_flag %d", property_flag);
1621 if (property_flag == TRUE) {
1622 event = BLUETOOTH_EVENT_NETWORK_CONNECTED;
1623 nap_connected_device_count++;
1624 __bt_set_device_values(TRUE,
1625 VCONFKEY_BT_DEVICE_PAN_CONNECTED);
1627 event = BLUETOOTH_EVENT_NETWORK_DISCONNECTED;
1628 nap_connected_device_count--;
1629 if (nap_connected_device_count == 0)
1630 __bt_set_device_values(FALSE,
1631 VCONFKEY_BT_DEVICE_PAN_CONNECTED);
1634 _bt_send_event(BT_NETWORK_EVENT, event,
1635 DBUS_TYPE_INT32, &result,
1636 DBUS_TYPE_STRING, &address,
1644 void _bt_handle_device_event(DBusMessage *msg)
1647 int result = BLUETOOTH_ERROR_NONE;
1648 DBusMessageIter item_iter;
1649 DBusMessageIter value_iter;
1651 const char *member = dbus_message_get_member(msg);
1652 const char *path = dbus_message_get_path(msg);
1653 const char *property = NULL;
1655 ret_if(path == NULL);
1656 ret_if(member == NULL);
1658 if (strcasecmp(member, "PropertyChanged") == 0) {
1659 dbus_message_iter_init(msg, &item_iter);
1661 if (dbus_message_iter_get_arg_type(&item_iter)
1662 != DBUS_TYPE_STRING) {
1663 BT_ERR("This is bad format dbus");
1667 dbus_message_iter_get_basic(&item_iter, &property);
1669 ret_if(property == NULL);
1671 if (strcasecmp(property, "GattConnected") == 0) {
1672 gboolean connected = FALSE;
1675 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1676 _bt_convert_device_path_to_address(path, address);
1678 dbus_message_iter_next(&item_iter);
1679 dbus_message_iter_recurse(&item_iter, &value_iter);
1680 dbus_message_iter_get_basic(&value_iter, &connected);
1682 event = connected ? BLUETOOTH_EVENT_GATT_CONNECTED :
1683 BLUETOOTH_EVENT_GATT_DISCONNECTED;
1685 _bt_send_event(BT_DEVICE_EVENT,
1687 DBUS_TYPE_INT32, &result,
1688 DBUS_TYPE_STRING, &address,
1692 } else if (strcasecmp(property, "Paired") == 0) {
1693 gboolean paired = FALSE;
1694 bt_remote_dev_info_t *remote_dev_info;
1695 dbus_message_iter_next(&item_iter);
1696 dbus_message_iter_recurse(&item_iter, &value_iter);
1697 dbus_message_iter_get_basic(&value_iter, &paired);
1699 ret_if(paired == FALSE);
1701 /* BlueZ sends paired signal for each paired device */
1702 /* during activation, We should ignore this, otherwise*/
1703 /* application thinks that a new device got paired */
1704 if (_bt_adapter_get_status() != BT_ACTIVATED) {
1705 BT_DBG("BT is not activated, so ignore this");
1709 if (_bt_is_device_creating() == TRUE) {
1710 BT_DBG("Try to Pair by me");
1714 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1716 _bt_convert_device_path_to_address(path, address);
1718 remote_dev_info = _bt_get_remote_device_info(address);
1719 if (remote_dev_info == NULL) {
1724 _bt_send_event(BT_ADAPTER_EVENT,
1725 BLUETOOTH_EVENT_BONDING_FINISHED,
1726 DBUS_TYPE_INT32, &result,
1727 DBUS_TYPE_STRING, &address,
1728 DBUS_TYPE_UINT32, &remote_dev_info->class,
1729 DBUS_TYPE_INT16, &remote_dev_info->rssi,
1730 DBUS_TYPE_STRING, &remote_dev_info->name,
1731 DBUS_TYPE_BOOLEAN, &remote_dev_info->paired,
1732 DBUS_TYPE_BOOLEAN, &remote_dev_info->connected,
1733 DBUS_TYPE_BOOLEAN, &remote_dev_info->trust,
1734 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
1735 &remote_dev_info->uuids, remote_dev_info->uuid_count,
1736 DBUS_TYPE_INT16, &remote_dev_info->manufacturer_data_len,
1737 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
1738 &remote_dev_info->manufacturer_data, remote_dev_info->manufacturer_data_len,
1741 _bt_free_device_info(remote_dev_info);
1744 } else if (strcasecmp(property, "UUIDs") == 0) {
1745 /* Once we get the updated uuid information after
1746 * reverse service search, update it to application */
1748 bt_remote_dev_info_t *remote_dev_info;
1750 ret_if(_bt_is_device_creating() == TRUE);
1752 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1754 _bt_convert_device_path_to_address(path, address);
1756 remote_dev_info = _bt_get_remote_device_info(address);
1757 if (remote_dev_info == NULL) {
1762 BT_DBG("UUID's count = %d", remote_dev_info->uuid_count);
1763 if (remote_dev_info->paired && remote_dev_info->uuid_count)
1764 _bt_send_event(BT_ADAPTER_EVENT,
1765 BLUETOOTH_EVENT_SERVICE_SEARCHED,
1766 DBUS_TYPE_INT32, &result,
1767 DBUS_TYPE_STRING, &address,
1768 DBUS_TYPE_UINT32, &remote_dev_info->class,
1769 DBUS_TYPE_INT16, &remote_dev_info->rssi,
1770 DBUS_TYPE_STRING, &remote_dev_info->name,
1771 DBUS_TYPE_BOOLEAN, &remote_dev_info->paired,
1772 DBUS_TYPE_BOOLEAN, &remote_dev_info->connected,
1773 DBUS_TYPE_BOOLEAN, &remote_dev_info->trust,
1774 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
1775 &remote_dev_info->uuids, remote_dev_info->uuid_count,
1778 _bt_free_device_info(remote_dev_info);
1781 } else if (strcasecmp(member, "DeviceConnected") == 0) {
1782 unsigned char addr_type = 0;
1784 dbus_message_iter_init(msg, &item_iter);
1785 dbus_message_iter_get_basic(&item_iter, &addr_type);
1787 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1789 _bt_convert_device_path_to_address(path, address);
1791 BT_INFO("Address : %s Type : %d", address, addr_type);
1792 BT_ERR_C("Connected [%s]", !addr_type ? "BREDR" : "LE");
1794 _bt_logging_connection(TRUE, addr_type);
1796 journal_bt_connected();
1799 /*Send event to application*/
1800 _bt_send_event(BT_DEVICE_EVENT,
1801 BLUETOOTH_EVENT_DEVICE_CONNECTED,
1802 DBUS_TYPE_INT32, &result,
1803 DBUS_TYPE_STRING, &address,
1804 DBUS_TYPE_BYTE, &addr_type,
1808 } else if (strcasecmp(member, "Disconnected") == 0) {
1809 unsigned char disc_reason = 0;
1810 unsigned char addr_type = 0;
1811 gboolean sending = FALSE;
1813 if (!dbus_message_get_args(msg, NULL,
1814 DBUS_TYPE_BYTE, &addr_type,
1815 DBUS_TYPE_BYTE, &disc_reason,
1819 result = disc_reason;
1821 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1823 _bt_convert_device_path_to_address(path, address);
1825 journal_bt_disconnected();
1828 /* 0x00 BDADDR_BRDER
1829 0x01 BDADDR_LE_PUBLIC
1830 0x02 BDADDR_LE_RANDOM */
1831 BT_INFO("Address : %s Type : %d", address, addr_type);
1832 BT_ERR_C("Disconnected [%s] [%d : %s]", !addr_type ? "BREDR" : "LE",
1833 disc_reason, _bt_convert_disc_reason_to_string(disc_reason));
1835 _bt_headset_set_local_connection(FALSE);
1836 _bt_logging_connection(FALSE, addr_type);
1838 /*Check for any OPP transfer on the device and cancel
1841 _bt_obex_check_pending_transfer(address);
1842 _bt_opp_client_is_sending(&sending);
1844 _bt_opp_client_check_pending_transfer(address);
1846 _bt_send_event(BT_DEVICE_EVENT,
1847 BLUETOOTH_EVENT_DEVICE_DISCONNECTED,
1848 DBUS_TYPE_INT32, &result,
1849 DBUS_TYPE_STRING, &address,
1850 DBUS_TYPE_BYTE, &addr_type,
1854 } else if (strcasecmp(member, "ProfileStateChanged") == 0) {
1856 char *profile_uuid = NULL;
1857 bt_headset_wait_t *wait_list;
1859 if (!dbus_message_get_args(msg, NULL,
1860 DBUS_TYPE_STRING, &profile_uuid,
1861 DBUS_TYPE_INT32, &state,
1862 DBUS_TYPE_INVALID)) {
1865 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1867 _bt_convert_device_path_to_address(path, address);
1869 BT_DBG("Address: %s", address);
1870 BT_DBG("Profile UUID: %s", profile_uuid);
1871 BT_DBG("State: %d", state);
1873 if ((strcmp(profile_uuid, A2DP_SINK_UUID) == 0) &&
1874 (state == BT_PROFILE_STATE_CONNECTED)) {
1876 int event = BLUETOOTH_EVENT_AV_CONNECTED;
1877 char connected_address[BT_ADDRESS_STRING_SIZE + 1];
1878 bluetooth_device_address_t device_address;
1880 bt_headset_wait_t *wait_list;
1882 __bt_set_device_values(TRUE,
1883 VCONFKEY_BT_DEVICE_A2DP_HEADSET_CONNECTED);
1885 __bt_connection_manager_set_state(address, event);
1887 if (_bt_headset_get_local_connection() == FALSE)
1888 _bt_start_timer_for_connection(address, BT_AUDIO_HSP);
1890 /* Connection Started from local device therefore no need to
1891 * intiate connection for pending profile */
1892 _bt_headset_set_local_connection(FALSE);
1895 _bt_send_event(BT_HEADSET_EVENT, event,
1896 DBUS_TYPE_INT32, &result,
1897 DBUS_TYPE_STRING, &address,
1900 connected = _bt_is_headset_type_connected(BT_AUDIO_A2DP,
1903 if (g_strcmp0(connected_address, address) != 0) {
1904 _bt_convert_addr_string_to_type(
1905 device_address.addr,
1907 _bt_audio_disconnect(0, BT_AUDIO_A2DP,
1908 &device_address, NULL);
1912 _bt_add_headset_to_list(BT_AUDIO_A2DP,
1913 BT_STATE_CONNECTED, address);
1915 wait_list = _bt_get_audio_wait_data();
1916 if (wait_list != NULL &&
1917 (g_strcmp0(wait_list->address, address) == 0))
1918 _bt_rel_wait_data();
1920 } else if ((strcmp(profile_uuid, A2DP_SINK_UUID) == 0) &&
1921 (state == BT_PROFILE_STATE_DISCONNECTED)) {
1923 int event = BLUETOOTH_EVENT_AV_DISCONNECTED;
1925 if (!_bt_is_service_connected(address, BT_AUDIO_A2DP)) {
1930 __bt_set_device_values(FALSE,
1931 VCONFKEY_BT_DEVICE_A2DP_HEADSET_CONNECTED);
1933 __bt_connection_manager_set_state(address, event);
1935 _bt_send_event(BT_HEADSET_EVENT, event,
1936 DBUS_TYPE_INT32, &result,
1937 DBUS_TYPE_STRING, &address,
1940 /* Remove data from the connected list */
1941 _bt_remove_headset_from_list(BT_AUDIO_A2DP, address);
1942 wait_list = _bt_get_audio_wait_data();
1944 if (wait_list == NULL) {
1949 if (((wait_list->type == BT_AUDIO_ALL) &&
1950 (wait_list->ag_flag == TRUE)) ||
1951 (wait_list->type == BT_AUDIO_A2DP) ||
1952 (wait_list->disconnection_type == BT_AUDIO_A2DP)) {
1953 bluetooth_device_address_t device_address;
1954 _bt_convert_addr_string_to_type(
1955 device_address.addr,
1956 wait_list->address);
1958 _bt_audio_connect(wait_list->req_id,
1961 wait_list->out_param1);
1963 } else if (strcmp(profile_uuid, AVRCP_TARGET_UUID) == 0) {
1965 if (state == BT_PROFILE_STATE_CONNECTED) {
1966 int event = BLUETOOTH_EVENT_AVRCP_CONTROL_CONNECTED;
1967 char connected_address[BT_ADDRESS_STRING_SIZE + 1];
1968 bluetooth_device_address_t device_address;
1971 _bt_send_event(BT_AVRCP_CONTROL_EVENT, event,
1972 DBUS_TYPE_INT32, &result,
1973 DBUS_TYPE_STRING, &address,
1975 connected = _bt_is_headset_type_connected(
1979 if (g_strcmp0(connected_address,
1981 _bt_convert_addr_string_to_type(
1982 device_address.addr,
1984 _bt_audio_disconnect(0,
1986 &device_address, NULL);
1989 BT_DBG("device Path: %s", path);
1990 _bt_add_headset_to_list(BT_AVRCP,
1991 BT_STATE_CONNECTED, address);
1992 } else if (state == BT_PROFILE_STATE_DISCONNECTED) {
1993 int event = BLUETOOTH_EVENT_AVRCP_CONTROL_DISCONNECTED;
1995 _bt_send_event(BT_AVRCP_CONTROL_EVENT, event,
1996 DBUS_TYPE_INT32, &result,
1997 DBUS_TYPE_STRING, &address,
2000 /* Remove data from the connected list */
2001 _bt_remove_headset_from_list(BT_AVRCP, address);
2003 } else if ((strcmp(profile_uuid, HID_UUID) == 0) &&
2004 ((state == BT_PROFILE_STATE_CONNECTED) ||
2005 (state == BT_PROFILE_STATE_DISCONNECTED))) {
2007 if (state == BT_PROFILE_STATE_CONNECTED)
2008 event = BLUETOOTH_HID_CONNECTED;
2010 event = BLUETOOTH_HID_DISCONNECTED;
2012 _bt_send_event(BT_HID_EVENT, event,
2013 DBUS_TYPE_INT32, &result,
2014 DBUS_TYPE_STRING, &address,
2018 } else if (strcasecmp(member, "AdvReport") == 0) {
2020 bt_remote_le_dev_info_t *le_dev_info = NULL;
2021 char *buffer = NULL;
2023 bt_le_adv_info_t *adv_info = NULL;
2025 ret_if(_bt_is_le_discovering() == FALSE);
2027 le_dev_info = g_malloc0(sizeof(bt_remote_le_dev_info_t));
2029 if (!dbus_message_get_args(msg, NULL,
2030 DBUS_TYPE_STRING, &le_dev_info->address,
2031 DBUS_TYPE_BYTE, &le_dev_info->addr_type,
2032 DBUS_TYPE_BYTE, &le_dev_info->adv_type,
2033 DBUS_TYPE_INT32, &le_dev_info->rssi,
2034 DBUS_TYPE_INT32, &le_dev_info->adv_data_len,
2035 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &buffer, &buffer_len,
2036 DBUS_TYPE_INVALID)) {
2037 g_free(le_dev_info);
2041 le_dev_info->adv_data = g_memdup(buffer, buffer_len);
2043 if (_bt_get_le_discovery_type() == BT_LE_PASSIVE_SCAN) {
2045 _bt_send_event(BT_LE_ADAPTER_EVENT,
2046 BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND,
2047 DBUS_TYPE_INT32, &result,
2048 DBUS_TYPE_STRING, &le_dev_info->address,
2049 DBUS_TYPE_INT16, &le_dev_info->addr_type,
2050 DBUS_TYPE_INT16, &le_dev_info->rssi,
2051 DBUS_TYPE_INT16, &le_dev_info->adv_data_len,
2052 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
2053 &le_dev_info->adv_data, le_dev_info->adv_data_len,
2054 DBUS_TYPE_INT16, &len,
2055 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
2056 &le_dev_info->adv_data, len,
2058 _bt_free_le_device_info(le_dev_info);
2062 if (le_dev_info->adv_type != BT_LE_ADV_SCAN_RSP) { /* ADV_IND */
2063 adv_info = g_malloc0(sizeof(bt_le_adv_info_t));
2064 adv_info->addr = g_strdup(le_dev_info->address);
2065 adv_info->data_len = le_dev_info->adv_data_len;
2066 adv_info->data = g_malloc0(le_dev_info->adv_data_len);
2067 memcpy(adv_info->data, le_dev_info->adv_data,
2068 le_dev_info->adv_data_len);
2070 __bt_add_adv_ind_info(adv_info);
2072 } else { /* SCAN_RSP */
2073 adv_info = __bt_get_adv_ind_info(le_dev_info->address);
2075 _bt_send_event(BT_LE_ADAPTER_EVENT,
2076 BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND,
2077 DBUS_TYPE_INT32, &result,
2078 DBUS_TYPE_STRING, &le_dev_info->address,
2079 DBUS_TYPE_INT16, &le_dev_info->addr_type,
2080 DBUS_TYPE_INT16, &le_dev_info->rssi,
2081 DBUS_TYPE_INT16, &adv_info->data_len,
2082 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
2083 &adv_info->data, adv_info->data_len,
2084 DBUS_TYPE_INT16, &le_dev_info->adv_data_len,
2085 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
2086 &le_dev_info->adv_data, le_dev_info->adv_data_len,
2088 __bt_del_adv_ind_info(le_dev_info->address);
2091 _bt_free_le_device_info(le_dev_info);
2095 void __bt_set_audio_values(gboolean connected, char *address)
2098 int bt_device_state = VCONFKEY_BT_DEVICE_NONE;
2100 /* Set the headset name */
2101 if (connected == TRUE) {
2102 name = __bt_get_headset_name(address);
2104 name = g_strdup("");
2107 if (vconf_set_str(VCONFKEY_BT_HEADSET_NAME,
2109 BT_ERR("vconf_set_str failed");
2114 /* Set the headset state */
2115 if (vconf_get_int(VCONFKEY_BT_DEVICE,
2116 &bt_device_state) != 0) {
2117 BT_ERR("vconf_get_str failed");
2120 #ifdef TIZEN_SUPPORT_DUAL_HF
2121 if ((connected == TRUE) &&
2122 (FALSE == __bt_is_companion_device(address))) {
2123 bt_device_state |= VCONFKEY_BT_DEVICE_HEADSET_CONNECTED;
2124 } else if ((bt_device_state & VCONFKEY_BT_DEVICE_HEADSET_CONNECTED) &&
2125 (FALSE == __bt_is_companion_device(address))) {
2126 bt_device_state ^= VCONFKEY_BT_DEVICE_HEADSET_CONNECTED;
2129 if (connected == TRUE) {
2130 bt_device_state |= VCONFKEY_BT_DEVICE_HEADSET_CONNECTED;
2131 } else if (bt_device_state & VCONFKEY_BT_DEVICE_HEADSET_CONNECTED) {
2132 bt_device_state ^= VCONFKEY_BT_DEVICE_HEADSET_CONNECTED;
2136 if (vconf_set_int(VCONFKEY_BT_DEVICE,
2137 bt_device_state) != 0) {
2138 BT_ERR("vconf_set_int failed");
2142 void _bt_handle_headset_event(DBusMessage *msg)
2144 int result = BLUETOOTH_ERROR_NONE;
2145 DBusMessageIter item_iter;
2146 DBusMessageIter value_iter;
2147 gboolean property_flag = FALSE;
2148 const char *member = dbus_message_get_member(msg);
2149 const char *path = dbus_message_get_path(msg);
2150 const char *property = NULL;
2152 ret_if(member == NULL);
2154 dbus_message_iter_init(msg, &item_iter);
2156 if (dbus_message_iter_get_arg_type(&item_iter)
2157 != DBUS_TYPE_STRING) {
2158 BT_ERR("This is bad format dbus");
2162 dbus_message_iter_get_basic(&item_iter, &property);
2164 ret_if(property == NULL);
2166 BT_DBG("Property = %s \n", property);
2168 /* We allow only 1 headset connection (HSP or HFP)*/
2169 if (strcasecmp(property, "Connected") == 0) {
2170 int event = BLUETOOTH_EVENT_NONE;
2171 bt_headset_wait_t *wait_list;
2174 dbus_message_iter_next(&item_iter);
2175 dbus_message_iter_recurse(&item_iter, &value_iter);
2176 dbus_message_iter_get_basic(&value_iter, &property_flag);
2178 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
2180 _bt_convert_device_path_to_address(path, address);
2182 if (property_flag == TRUE) {
2183 event = BLUETOOTH_EVENT_AG_CONNECTED;
2184 if (_bt_headset_get_local_connection() == FALSE)
2185 _bt_start_timer_for_connection(address, BT_AUDIO_A2DP);
2187 _bt_headset_set_local_connection(FALSE);
2191 event = BLUETOOTH_EVENT_AG_DISCONNECTED;
2193 previous_state = _bt_get_device_state_from_list(BT_AUDIO_HSP, address);
2194 if (previous_state == BT_STATE_DISCONNECTING)
2195 _bt_send_hf_local_term_event(address);
2197 /* Set the State machine here */
2198 __bt_connection_manager_set_state(address, event);
2199 __bt_set_audio_values(property_flag, address);
2201 _bt_send_event(BT_HEADSET_EVENT, event,
2202 DBUS_TYPE_INT32, &result,
2203 DBUS_TYPE_STRING, &address,
2206 if (event == BLUETOOTH_EVENT_AG_DISCONNECTED) {
2207 /* Remove data from the connected list */
2208 _bt_remove_headset_from_list(BT_AUDIO_HSP, address);
2210 wait_list = _bt_get_audio_wait_data();
2211 if (wait_list == NULL) {
2216 bluetooth_device_address_t device_address;
2218 _bt_set_audio_wait_data_flag(TRUE);
2220 _bt_convert_addr_string_to_type(device_address.addr,
2221 wait_list->address);
2222 _bt_audio_connect(wait_list->req_id, wait_list->type,
2223 &device_address, wait_list->out_param1);
2224 _bt_rel_wait_data();
2225 } else if (event == BLUETOOTH_EVENT_AG_CONNECTED) {
2226 /* Add data to the connected list */
2227 _bt_add_headset_to_list(BT_AUDIO_HSP,
2228 BT_STATE_CONNECTED, address);
2230 wait_list = _bt_get_audio_wait_data();
2231 if (wait_list != NULL &&
2232 (g_strcmp0(wait_list->address, address) == 0))
2233 _bt_rel_wait_data();
2235 BT_INFO("Check A2DP pending connect");
2236 _bt_audio_check_pending_connect();
2239 } else if (strcasecmp(property, "State") == 0) {
2242 dbus_message_iter_next(&item_iter);
2243 dbus_message_iter_recurse(&item_iter, &value_iter);
2244 dbus_message_iter_get_basic(&value_iter, &state);
2246 /* This code assumes we support only 1 headset connection */
2247 /* Need to use the headset list, if we support multi-headsets */
2248 if (strcasecmp(state, "Playing") == 0) {
2249 BT_DBG("Playing: Sco Connected");
2250 } else if (strcasecmp(state, "connected") == 0 ||
2251 strcasecmp(state, "disconnected") == 0) {
2252 BT_DBG("connected/disconnected: Sco Disconnected");
2254 BT_ERR("Not handled state - %s", state);
2257 } else if (strcasecmp(property, "SpeakerGain") == 0) {
2261 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
2263 _bt_convert_device_path_to_address(path, address);
2265 dbus_message_iter_next(&item_iter);
2266 dbus_message_iter_recurse(&item_iter, &value_iter);
2267 dbus_message_iter_get_basic(&value_iter, &spkr_gain);
2269 _bt_send_event(BT_HEADSET_EVENT, BLUETOOTH_EVENT_AG_SPEAKER_GAIN,
2270 DBUS_TYPE_INT32, &result,
2271 DBUS_TYPE_STRING, &address,
2272 DBUS_TYPE_UINT16, &spkr_gain,
2276 } else if (strcasecmp(property, "MicrophoneGain") == 0) {
2280 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
2282 _bt_convert_device_path_to_address(path, address);
2284 dbus_message_iter_next(&item_iter);
2285 dbus_message_iter_recurse(&item_iter, &value_iter);
2286 dbus_message_iter_get_basic(&value_iter, &mic_gain);
2288 _bt_send_event(BT_HEADSET_EVENT, BLUETOOTH_EVENT_AG_MIC_GAIN,
2289 DBUS_TYPE_INT32, &result,
2290 DBUS_TYPE_STRING, &address,
2291 DBUS_TYPE_UINT16, &mic_gain,
2298 void _bt_handle_sink_event(DBusMessage *msg)
2300 int result = BLUETOOTH_ERROR_NONE;
2301 DBusMessageIter item_iter;
2302 DBusMessageIter value_iter;
2303 const char *member = dbus_message_get_member(msg);
2304 const char *path = dbus_message_get_path(msg);
2305 const char *property = NULL;
2307 bt_headset_wait_t *wait_list;
2309 ret_if(member == NULL);
2311 dbus_message_iter_init(msg, &item_iter);
2313 if (dbus_message_iter_get_arg_type(&item_iter)
2314 != DBUS_TYPE_STRING) {
2315 BT_ERR("This is bad format dbus");
2319 dbus_message_iter_get_basic(&item_iter, &property);
2321 ret_if(property == NULL);
2323 BT_DBG("Property: %s", property);
2325 if (strcasecmp(property, "State") == 0) {
2329 dbus_message_iter_next(&item_iter);
2330 dbus_message_iter_recurse(&item_iter, &value_iter);
2331 dbus_message_iter_get_basic(&value_iter, &value);
2333 BT_DBG("value: %s", value);
2335 if (g_strcmp0(value, "disconnected") == 0) {
2338 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
2340 _bt_convert_device_path_to_address(path, address);
2342 __bt_set_device_values(FALSE,
2343 VCONFKEY_BT_DEVICE_A2DP_HEADSET_CONNECTED);
2345 _bt_send_event(BT_HEADSET_EVENT,
2346 BLUETOOTH_EVENT_AV_DISCONNECTED,
2347 DBUS_TYPE_INT32, &result,
2348 DBUS_TYPE_STRING, &address,
2351 /* Remove data from the connected list */
2352 _bt_remove_headset_from_list(BT_AUDIO_A2DP, address);
2353 wait_list = _bt_get_audio_wait_data();
2354 if (wait_list == NULL) {
2359 if (((wait_list->type == BT_AUDIO_ALL) &&
2360 (wait_list->ag_flag == TRUE)) ||
2361 (wait_list->type == BT_AUDIO_A2DP) ||
2362 (wait_list->disconnection_type == BT_AUDIO_A2DP)) {
2363 bluetooth_device_address_t device_address;
2364 _bt_convert_addr_string_to_type(
2365 device_address.addr,
2366 wait_list->address);
2368 _bt_audio_connect(wait_list->req_id,
2371 wait_list->out_param1);
2374 }else if (strcasecmp(value, "Connected") == 0) {
2376 char connected_address[BT_ADDRESS_STRING_SIZE + 1];
2377 bluetooth_device_address_t device_address;
2380 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
2382 _bt_convert_device_path_to_address(path, address);
2384 __bt_set_device_values(TRUE,
2385 VCONFKEY_BT_DEVICE_A2DP_HEADSET_CONNECTED);
2387 _bt_send_event(BT_HEADSET_EVENT,
2388 BLUETOOTH_EVENT_AV_CONNECTED,
2389 DBUS_TYPE_INT32, &result,
2390 DBUS_TYPE_STRING, &address,
2393 /* Check for existing Media device to disconnect */
2394 connected = _bt_is_headset_type_connected(BT_AUDIO_A2DP,
2397 /* Match connected device address */
2398 if (g_strcmp0(connected_address, address) != 0) {
2399 /* Convert BD adress from string type */
2400 _bt_convert_addr_string_to_type(
2401 device_address.addr,
2403 _bt_audio_disconnect(0, BT_AUDIO_A2DP,
2404 &device_address, NULL);
2408 /* Add data to the connected list */
2409 _bt_add_headset_to_list(BT_AUDIO_A2DP,
2410 BT_STATE_CONNECTED, address);
2417 void _bt_handle_agent_event(DBusMessage *msg)
2419 const char *member = dbus_message_get_member(msg);
2420 int result = BLUETOOTH_ERROR_NONE;
2421 char *address = NULL;
2425 ret_if(member == NULL);
2427 if (strcasecmp(member, "ObexAuthorize") == 0) {
2428 __bt_get_agent_signal_info(msg, &address, &name, &uuid);
2430 _bt_send_event(BT_OPP_SERVER_EVENT,
2431 BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE,
2432 DBUS_TYPE_INT32, &result,
2433 DBUS_TYPE_STRING, &address,
2434 DBUS_TYPE_STRING, &name,
2436 } else if (strcasecmp(member, "RfcommAuthorize") == 0) {
2437 bt_rfcomm_server_info_t *server_info;
2439 __bt_get_agent_signal_info(msg, &address, &name, &uuid);
2441 server_info = _bt_rfcomm_get_server_info_using_uuid(uuid);
2442 ret_if(server_info == NULL);
2443 ret_if(server_info->server_type != BT_CUSTOM_SERVER);
2445 _bt_send_event(BT_RFCOMM_SERVER_EVENT,
2446 BLUETOOTH_EVENT_RFCOMM_AUTHORIZE,
2447 DBUS_TYPE_INT32, &result,
2448 DBUS_TYPE_STRING, &address,
2449 DBUS_TYPE_STRING, &uuid,
2450 DBUS_TYPE_STRING, &name,
2451 DBUS_TYPE_INT16, &server_info->control_fd,
2456 static int __bt_get_object_path(DBusMessage *msg, char **path)
2458 DBusMessageIter item_iter;
2460 dbus_message_iter_init(msg, &item_iter);
2462 if (dbus_message_iter_get_arg_type(&item_iter)
2463 != DBUS_TYPE_OBJECT_PATH) {
2464 BT_ERR("This is bad format dbus");
2465 return BLUETOOTH_ERROR_INTERNAL;
2468 dbus_message_iter_get_basic(&item_iter, path);
2471 return BLUETOOTH_ERROR_INTERNAL;
2473 return BLUETOOTH_ERROR_NONE;
2476 static int __bt_parse_event(DBusMessage *msg)
2478 DBusMessageIter msg_iter;
2479 DBusMessageIter value_iter;
2481 retv_if(dbus_message_iter_init(msg, &msg_iter) == FALSE, 0);
2483 /* object array (oa) */
2484 retv_if(dbus_message_iter_next(&msg_iter) == FALSE, 0);
2485 retv_if(dbus_message_iter_get_arg_type(&msg_iter) !=
2486 DBUS_TYPE_ARRAY, 0);
2488 dbus_message_iter_recurse(&msg_iter, &value_iter);
2490 /* string array (sa) */
2491 while (dbus_message_iter_get_arg_type(&value_iter) ==
2492 DBUS_TYPE_DICT_ENTRY) {
2493 char *interface_name = NULL;
2494 DBusMessageIter interface_iter;
2496 dbus_message_iter_recurse(&value_iter, &interface_iter);
2498 retv_if(dbus_message_iter_get_arg_type(&interface_iter) !=
2499 DBUS_TYPE_STRING, 0);
2501 dbus_message_iter_get_basic(&interface_iter,
2504 retv_if(dbus_message_iter_next(&interface_iter) == FALSE,
2507 retv_if(dbus_message_iter_get_arg_type(&interface_iter) !=
2508 DBUS_TYPE_ARRAY, 0);
2510 BT_DBG("interface: %s", interface_name);
2512 if (g_strcmp0(interface_name,
2513 BT_DEVICE_INTERFACE) == 0) {
2514 return BT_DEVICE_EVENT;
2515 } else if (g_strcmp0(interface_name,
2516 BT_MEDIATRANSPORT_INTERFACE) == 0) {
2517 return BT_MEDIA_TRANSFER_EVENT;
2519 } else if (g_strcmp0(interface_name,
2520 BT_PLAYER_CONTROL_INTERFACE) == 0) {
2521 return BT_AVRCP_CONTROL_EVENT;
2524 dbus_message_iter_next(&value_iter);
2530 static int __bt_parse_remove_event(DBusMessage *msg)
2532 DBusMessageIter msg_iter;
2533 DBusMessageIter value_iter;
2535 retv_if(dbus_message_iter_init(msg, &msg_iter) ==
2538 retv_if(dbus_message_iter_next(&msg_iter) == FALSE,
2540 retv_if(dbus_message_iter_get_arg_type(&msg_iter) !=
2541 DBUS_TYPE_ARRAY, 0);
2543 dbus_message_iter_recurse(&msg_iter, &value_iter);
2545 while (dbus_message_iter_get_arg_type(&value_iter)
2546 != DBUS_TYPE_INVALID) {
2549 dbus_message_iter_get_basic(&value_iter, &key);
2552 dbus_message_iter_next(&value_iter);
2556 BT_DBG("key = %s", key);
2558 if (g_strcmp0(key, BT_MEDIATRANSPORT_INTERFACE) == 0) {
2559 return BT_MEDIA_TRANSFER_EVENT;
2560 } else if (g_strcmp0(key, BT_DEVICE_INTERFACE) == 0) {
2561 return BT_DEVICE_EVENT;
2562 } else if (g_strcmp0(key, BT_PLAYER_CONTROL_INTERFACE) == 0) {
2563 return BT_AVRCP_CONTROL_EVENT;
2565 dbus_message_iter_next(&value_iter);
2571 static void __bt_devices_list_free(void)
2573 bt_cache_info_t *cache_info;
2576 node = g_list_first(p_cache_list);
2578 while (node != NULL){
2579 cache_info = (bt_cache_info_t *)node->data;
2581 p_cache_list = g_list_remove(p_cache_list, cache_info);
2582 __bt_free_cache_info(cache_info);
2584 node = g_list_next(node);
2588 static DBusHandlerResult __bt_manager_event_filter(DBusConnection *conn,
2589 DBusMessage *msg, void *data)
2591 const char *member = dbus_message_get_member(msg);
2592 bt_event_type_t bt_event;
2593 int result = BLUETOOTH_ERROR_NONE;
2595 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
2596 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
2598 retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
2600 if (strcasecmp(member, "InterfacesAdded") == 0) {
2602 char *object_path = NULL;
2604 BT_DBG("InterfacesAdded");
2606 if (__bt_get_object_path(msg, &object_path)) {
2607 BT_ERR("Fail to get the path");
2608 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
2611 if (strcasecmp(object_path, BT_BLUEZ_HCI_PATH) == 0) {
2612 _bt_handle_adapter_added();
2614 bt_event = __bt_parse_event(msg);
2615 if (bt_event == BT_DEVICE_EVENT) {
2616 bt_cache_info_t *cache_info;
2617 bt_remote_dev_info_t *dev_info;
2619 retv_if(_bt_is_discovering() == FALSE &&
2620 _bt_is_le_discovering() == FALSE,
2621 DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
2623 cache_info = g_malloc0(sizeof(bt_cache_info_t));
2624 dev_info = g_malloc0(sizeof(bt_remote_dev_info_t));
2625 cache_info->dev_info = dev_info;
2627 if (__bt_parse_interface(msg, dev_info) == FALSE) {
2628 BT_ERR("Fail to parse the properies");
2629 __bt_free_cache_info(cache_info);
2630 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
2633 if (dev_info->addr_type != BDADDR_BREDR) {
2634 /* Whenever emit the property changed from bluez,
2635 some property doesn't reach to bt-service.
2636 So LE device is handled as AdvReport signal */
2637 __bt_free_cache_info(cache_info);
2638 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
2641 if (dev_info->name == NULL)
2642 /* If Remote device name is NULL or still RNR is not done
2643 * then display address as name.
2645 dev_info->name = g_strdup(dev_info->address);
2647 _bt_send_event(BT_ADAPTER_EVENT,
2648 BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND,
2649 DBUS_TYPE_INT32, &result,
2650 DBUS_TYPE_STRING, &dev_info->address,
2651 DBUS_TYPE_UINT32, &dev_info->class,
2652 DBUS_TYPE_INT16, &dev_info->rssi,
2653 DBUS_TYPE_STRING, &dev_info->name,
2654 DBUS_TYPE_BOOLEAN, &dev_info->paired,
2655 DBUS_TYPE_BOOLEAN, &dev_info->connected,
2656 DBUS_TYPE_BOOLEAN, &dev_info->trust,
2657 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
2658 &dev_info->uuids, dev_info->uuid_count,
2659 DBUS_TYPE_INT16, &dev_info->manufacturer_data_len,
2660 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
2661 &dev_info->manufacturer_data, dev_info->manufacturer_data_len,
2664 p_cache_list = g_list_append(p_cache_list, cache_info);
2667 } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
2669 bt_event = __bt_parse_remove_event(msg);
2671 if ((bt_event != 0) && (bt_event != BT_MEDIA_TRANSFER_EVENT))
2672 _bt_handle_adapter_event(msg);
2674 } else if (strcasecmp(member, "NameOwnerChanged") == 0) {
2677 char *previous = NULL;
2678 char *current = NULL;
2680 BT_DBG("NameOwnerChanged");
2682 if (__bt_get_owner_info(msg, &name, &previous, ¤t)) {
2683 BT_ERR("Fail to get the owner info");
2684 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
2687 if (*current != '\0')
2688 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
2690 if (strcasecmp(name, BT_BLUEZ_NAME) == 0) {
2691 BT_DBG("Bluetoothd is terminated");
2692 if (_bt_adapter_get_status() != BT_DEACTIVATING) {
2695 _bt_handle_adapter_removed();
2696 __bt_devices_list_free();
2699 _bt_obex_server_check_allocation(&value);
2701 if (value == TRUE) {
2702 /* Check if the obex server was terminated abnormally */
2703 _bt_obex_server_check_termination(name);
2706 _bt_rfcomm_server_check_existence(&value);
2708 if (value == TRUE) {
2709 /* The obex server was terminated abnormally */
2710 _bt_rfcomm_server_check_termination(name);
2712 } else if (dbus_message_has_interface(msg, BT_PROPERTIES_INTERFACE)) {
2713 const char *path = dbus_message_get_path(msg);
2715 if (strncmp(path, BT_MEDIA_OBJECT_PATH,
2716 strlen(BT_MEDIA_OBJECT_PATH)) == 0)
2717 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
2719 _bt_handle_property_changed_event(msg);
2720 } else if (dbus_message_has_interface(msg, BT_ADAPTER_INTERFACE)) {
2721 _bt_handle_adapter_event(msg);
2722 } else if (dbus_message_has_interface(msg, BT_INPUT_INTERFACE)) {
2723 _bt_handle_input_event(msg);
2724 } else if (dbus_message_has_interface(msg, BT_NETWORK_SERVER_INTERFACE)) {
2725 _bt_handle_network_server_event(msg);
2726 } else if (dbus_message_has_interface(msg, BT_HEADSET_INTERFACE)) {
2727 _bt_handle_headset_event(msg);
2728 } else if (dbus_message_has_interface(msg, BT_SINK_INTERFACE)) {
2729 _bt_handle_sink_event(msg);
2730 } else if (dbus_message_has_interface(msg, BT_AGENT_INTERFACE)) {
2731 _bt_handle_agent_event(msg);
2732 } else if (dbus_message_has_interface(msg, BT_DEVICE_INTERFACE)) {
2733 _bt_handle_device_event(msg);
2736 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
2739 static gboolean __bt_is_obexd_event(DBusMessage *msg)
2741 const char *member = dbus_message_get_member(msg);
2743 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
2746 retv_if(member == NULL, FALSE);
2748 if (dbus_message_has_interface(msg, BT_PROPERTIES_INTERFACE)) {
2750 DBusMessageIter item_iter;
2751 const char *interface_name = NULL;
2753 dbus_message_iter_init(msg, &item_iter);
2755 if (dbus_message_iter_get_arg_type(&item_iter)
2756 != DBUS_TYPE_STRING) {
2757 BT_ERR("This is bad format dbus");
2761 dbus_message_iter_get_basic(&item_iter, &interface_name);
2763 retv_if(interface_name == NULL, FALSE);
2765 BT_DBG("interface: %s", interface_name);
2767 retv_if(dbus_message_iter_next(&item_iter) == FALSE, FALSE);
2769 retv_if(dbus_message_iter_get_arg_type(&item_iter) != DBUS_TYPE_ARRAY,
2772 if (strcasecmp(interface_name, BT_OBEX_TRANSFER_INTERFACE) == 0) {
2773 BT_DBG("BT_OBEX_TRANSFER_INTERFACE");
2781 void __bt_opc_property_changed_event(DBusMessageIter *msg_iter,
2784 DBusMessageIter value_iter;
2785 DBusMessageIter dict_iter;
2786 DBusMessageIter item_iter;
2787 const char *property = NULL;
2789 dbus_message_iter_recurse(msg_iter, &item_iter);
2791 if (dbus_message_iter_get_arg_type(&item_iter)
2792 != DBUS_TYPE_DICT_ENTRY) {
2793 BT_ERR("This is bad format dbus");
2797 dbus_message_iter_recurse(&item_iter, &dict_iter);
2799 dbus_message_iter_get_basic(&dict_iter, &property);
2800 ret_if(property == NULL);
2802 ret_if(!dbus_message_iter_next(&dict_iter));
2804 if (strcasecmp(property, "Status") == 0) {
2805 const char *status = NULL;
2806 dbus_message_iter_recurse(&dict_iter, &value_iter);
2807 dbus_message_iter_get_basic(&value_iter, &status);
2809 BT_INFO("Status is %s", status);
2811 if(strcasecmp(status, "active") == 0){
2812 _bt_obex_client_started(path);
2813 }else if (strcasecmp(status, "complete") == 0) {
2814 _bt_obex_client_completed(path, TRUE);
2815 }else if (strcasecmp(status, "error") == 0){
2816 _bt_obex_client_completed(path, FALSE);
2818 } else if (strcasecmp(property, "Transferred") == 0) {
2819 static int transferred = 0;
2820 dbus_message_iter_recurse(&dict_iter, &value_iter);
2821 dbus_message_iter_get_basic(&value_iter, &transferred);
2823 _bt_obex_client_progress(path, transferred);
2825 BT_DBG("property : [%s]", property);
2829 void _bt_opc_property_changed_event(DBusMessage *msg)
2831 DBusMessageIter item_iter;
2832 const char *member = dbus_message_get_member(msg);
2833 const char *interface_name = NULL;
2835 ret_if(member == NULL);
2837 dbus_message_iter_init(msg, &item_iter);
2839 if (dbus_message_iter_get_arg_type(&item_iter)
2840 != DBUS_TYPE_STRING) {
2841 BT_ERR("This is bad format dbus");
2845 dbus_message_iter_get_basic(&item_iter, &interface_name);
2847 ret_if(interface_name == NULL);
2849 BT_DBG("interface: %s", interface_name);
2851 ret_if(dbus_message_iter_next(&item_iter) == FALSE);
2853 ret_if(dbus_message_iter_get_arg_type(&item_iter) != DBUS_TYPE_ARRAY);
2855 if (strcasecmp(interface_name, BT_OBEX_TRANSFER_INTERFACE) == 0) {
2856 __bt_opc_property_changed_event(&item_iter,
2857 dbus_message_get_path(msg));
2859 BT_DBG("interface_name : [%s]", interface_name);
2863 static gboolean __bt_is_obexd_client_event(DBusMessage *msg)
2867 const char *member = dbus_message_get_member(msg);
2869 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
2872 retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
2874 if (dbus_message_has_interface(msg, BT_PROPERTIES_INTERFACE)) {
2875 DBusMessageIter item_iter;
2876 const char *interface_name = NULL;
2878 dbus_message_iter_init(msg, &item_iter);
2880 if (dbus_message_iter_get_arg_type(&item_iter)
2881 != DBUS_TYPE_STRING) {
2882 BT_ERR("This is bad format dbus");
2886 dbus_message_iter_get_basic(&item_iter, &interface_name);
2888 retv_if(interface_name == NULL, FALSE);
2890 BT_DBG("interface: %s", interface_name);
2892 retv_if(dbus_message_iter_next(&item_iter) == FALSE,
2895 retv_if(dbus_message_iter_get_arg_type(&item_iter)
2896 != DBUS_TYPE_ARRAY, FALSE);
2898 if (strcasecmp(interface_name,
2899 BT_OBEX_TRANSFER_INTERFACE) == 0) {
2910 static DBusHandlerResult __bt_opc_event_filter(DBusConnection *conn,
2911 DBusMessage *msg, void *data)
2913 const char *member = dbus_message_get_member(msg);
2915 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
2916 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
2918 retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
2920 if (strcasecmp(member, "InterfacesAdded") == 0) {
2921 BT_DBG("InterfacesAdded");
2922 }else if (strcasecmp(member, "InterfacesRemoved") == 0) {
2923 char *object_path = NULL;
2925 BT_DBG("InterfacesRemoved");
2927 if (__bt_get_object_path(msg, &object_path)) {
2928 BT_ERR("Fail to get the path");
2929 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
2932 BT_DBG("object_path =%s",object_path);
2934 if (strncmp(object_path, BT_SESSION_BASEPATH_CLIENT,
2935 strlen(BT_SESSION_BASEPATH_CLIENT)) != 0
2936 || strstr(object_path, "transfer") == NULL)
2937 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
2938 else if (strncmp(object_path, BT_SESSION_BASEPATH_CLIENT,
2939 strlen(BT_SESSION_BASEPATH_CLIENT)) == 0) {
2940 BT_DBG("Going to call opc disconnected");
2941 _bt_opc_disconnected(object_path);
2944 _bt_sending_files();
2946 }else if (__bt_is_obexd_client_event(msg) == TRUE){
2947 const char *path = dbus_message_get_path(msg);
2949 if (strncmp(path, BT_SESSION_BASEPATH_CLIENT,
2950 strlen(BT_SESSION_BASEPATH_CLIENT)) != 0) {
2951 BT_DBG("NOT BT_SESSION_BASEPATH_CLIENT");
2952 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
2955 _bt_opc_property_changed_event(msg);
2958 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
2961 static DBusHandlerResult __bt_obexd_event_filter(DBusConnection *conn,
2962 DBusMessage *msg, void *data)
2964 const char *member = dbus_message_get_member(msg);
2965 char *object_path = NULL;
2967 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
2968 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
2970 retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
2972 if (strcasecmp(member, "InterfacesAdded") == 0) {
2973 BT_DBG("InterfacesAdded");
2974 if (__bt_get_object_path(msg, &object_path)) {
2975 BT_ERR("Fail to get the path");
2976 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
2979 BT_INFO("object_path = [%s]", object_path);
2981 /*Handle OPP_SERVER_CONNECTED_EVENT here */
2982 if (strncmp(object_path, BT_SESSION_BASEPATH_SERVER,
2983 strlen(BT_SESSION_BASEPATH_SERVER)) != 0)
2984 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
2986 if (g_strrstr(object_path, "session") && g_strrstr(object_path, "transfer")) {
2987 BT_DBG("Obex_Server_Session_Transfer connected");
2988 _bt_obex_transfer_connected();
2990 } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
2991 /*Handle OPP_SERVER_DISCONNECTED_EVENT here */
2992 BT_DBG("InterfacesRemoved");
2993 if (__bt_get_object_path(msg, &object_path)) {
2994 BT_ERR("Fail to get the path");
2995 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
2998 BT_INFO("object_path = [%s]", object_path);
3000 if (strncmp(object_path, BT_SESSION_BASEPATH_SERVER,
3001 strlen(BT_SESSION_BASEPATH_SERVER)) != 0)
3002 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
3004 if (g_strrstr(object_path, "session") && g_strrstr(object_path, "transfer")) {
3005 BT_DBG("Obex_Server_Session_Transfer disconnected");
3006 _bt_obex_transfer_disconnected();
3008 } else if (__bt_is_obexd_event(msg) == TRUE) {
3009 const char *path = dbus_message_get_path(msg);
3011 if (strncmp(path, BT_SESSION_BASEPATH_SERVER,
3012 strlen(BT_SESSION_BASEPATH_SERVER)) != 0 &&
3013 strncmp(path, BT_SESSION_BASEPATH_CLIENT,
3014 strlen(BT_SESSION_BASEPATH_CLIENT)) != 0) {
3015 BT_DBG("DBUS_HANDLER_RESULT_NOT_YET_HANDLED");
3016 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
3019 _bt_handle_property_changed_event(msg);
3021 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
3024 int _bt_register_service_event(DBusGConnection *g_conn, int event_type)
3028 DBusError dbus_error;
3029 char *match1 = NULL;
3030 char *match2 = NULL;
3031 char *match3 = NULL;
3032 char *match4 = NULL;
3033 DBusConnection *conn;
3034 DBusHandleMessageFunction event_func = NULL;
3036 retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
3038 conn = dbus_g_connection_get_connection(g_conn);
3039 retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
3041 switch (event_type) {
3042 case BT_MANAGER_EVENT:
3043 BT_ERR("BT_MANAGER_EVENT_REC: \n register service event");
3044 event_func = __bt_manager_event_filter;
3045 match1 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
3046 BT_MANAGER_INTERFACE,
3047 BT_INTERFACES_ADDED);
3049 match2 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
3050 BT_MANAGER_INTERFACE,
3051 BT_INTERFACES_REMOVED);
3053 match3 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
3054 BT_FREEDESKTOP_INTERFACE,
3055 BT_NAME_OWNER_CHANGED);
3057 match4 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
3058 BT_PROPERTIES_INTERFACE,
3059 BT_PROPERTIES_CHANGED);
3061 case BT_DEVICE_EVENT:
3062 match1 = g_strdup_printf(EVENT_MATCH_RULE,
3063 BT_DEVICE_INTERFACE);
3066 match1 = g_strdup_printf(EVENT_MATCH_RULE,
3067 BT_INPUT_INTERFACE);
3069 case BT_NETWORK_EVENT:
3070 match1 = g_strdup_printf(EVENT_MATCH_RULE,
3071 BT_NETWORK_SERVER_INTERFACE);
3073 match2 = g_strdup_printf(EVENT_MATCH_RULE,
3074 BT_NETWORK_CLIENT_INTERFACE);
3076 case BT_HEADSET_EVENT:
3077 match1 = g_strdup_printf(EVENT_MATCH_RULE,
3078 BT_HFP_AGENT_INTERFACE);
3080 match2 = g_strdup_printf(EVENT_MATCH_RULE,
3083 case BT_OPP_SERVER_EVENT:
3084 BT_ERR("BT_OPP_SERVER_EVENT: register service event");
3085 event_func = __bt_obexd_event_filter;
3086 match1 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
3087 BT_PROPERTIES_INTERFACE,
3088 BT_PROPERTIES_CHANGED);
3090 match2 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
3091 BT_MANAGER_INTERFACE,
3092 BT_INTERFACES_ADDED);
3094 match3 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
3095 BT_MANAGER_INTERFACE,
3096 BT_INTERFACES_REMOVED);
3098 case BT_OPP_CLIENT_EVENT:
3099 BT_ERR("BT_OPP_CLIENT_EVENT: register service event");
3100 event_func = __bt_opc_event_filter;
3101 match1 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
3102 BT_PROPERTIES_INTERFACE,
3103 BT_PROPERTIES_CHANGED);
3105 match2 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
3106 BT_MANAGER_INTERFACE,
3107 BT_INTERFACES_ADDED);
3109 match3 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
3110 BT_MANAGER_INTERFACE,
3111 BT_INTERFACES_REMOVED);
3114 BT_ERR("Unknown event");
3115 return BLUETOOTH_ERROR_INTERNAL;
3119 if (!dbus_connection_add_filter(conn, event_func,
3121 BT_ERR("Fail to add filter");
3126 dbus_error_init(&dbus_error);
3129 dbus_bus_add_match(conn, match1, &dbus_error);
3131 if (dbus_error_is_set(&dbus_error)) {
3132 BT_ERR("Fail to add match: %s\n", dbus_error.message);
3133 dbus_error_free(&dbus_error);
3138 dbus_bus_add_match(conn, match2, &dbus_error);
3140 if (dbus_error_is_set(&dbus_error)) {
3141 BT_ERR("Fail to add match: %s\n", dbus_error.message);
3142 dbus_error_free(&dbus_error);
3147 dbus_bus_add_match(conn, match3, &dbus_error);
3149 if (dbus_error_is_set(&dbus_error)) {
3150 BT_ERR("Fail to add match: %s\n", dbus_error.message);
3151 dbus_error_free(&dbus_error);
3156 dbus_bus_add_match(conn, match4, &dbus_error);
3158 if (dbus_error_is_set(&dbus_error)) {
3159 BT_ERR("Fail to add match: %s\n", dbus_error.message);
3160 dbus_error_free(&dbus_error);
3170 return BLUETOOTH_ERROR_NONE;
3180 return BLUETOOTH_ERROR_INTERNAL;
3183 void _bt_unregister_service_event(DBusGConnection *g_conn, int event_type)
3187 DBusConnection *conn;
3188 DBusHandleMessageFunction event_func;
3190 ret_if(g_conn == NULL);
3191 conn = dbus_g_connection_get_connection(g_conn);
3193 switch (event_type) {
3194 case BT_MANAGER_EVENT:
3195 event_func = __bt_manager_event_filter;
3197 case BT_OPP_SERVER_EVENT:
3198 event_func = __bt_obexd_event_filter;
3200 case BT_OPP_CLIENT_EVENT:
3201 event_func = __bt_opc_event_filter;
3204 BT_ERR("Unknown event");
3208 ret_if(conn == NULL);
3210 dbus_connection_remove_filter(conn, event_func, NULL);
3214 static int __bt_init_manager_receiver(void)
3218 GError *error = NULL;
3220 if (manager_conn == NULL) {
3221 manager_conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error);
3222 if (error != NULL) {
3223 BT_ERR("ERROR: Can't get on system bus [%s]", error->message);
3224 g_error_free(error);
3226 retv_if(manager_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
3229 if (_bt_register_service_event(manager_conn,
3230 BT_MANAGER_EVENT) != BLUETOOTH_ERROR_NONE)
3233 if (_bt_register_service_event(manager_conn,
3234 BT_DEVICE_EVENT) != BLUETOOTH_ERROR_NONE)
3237 if (_bt_register_service_event(manager_conn,
3238 BT_HID_EVENT) != BLUETOOTH_ERROR_NONE)
3241 if (_bt_register_service_event(manager_conn,
3242 BT_HEADSET_EVENT) != BLUETOOTH_ERROR_NONE)
3245 if (_bt_register_service_event(manager_conn,
3246 BT_NETWORK_EVENT) != BLUETOOTH_ERROR_NONE)
3249 return BLUETOOTH_ERROR_NONE;
3252 dbus_g_connection_unref(manager_conn);
3253 manager_conn = NULL;
3256 BT_DBG("REGISTER successfull");
3258 return BLUETOOTH_ERROR_INTERNAL;
3261 static int __bt_init_obexd_receiver(void)
3264 GError *error = NULL;
3266 if (obexd_conn == NULL) {
3267 obexd_conn = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
3268 if (error != NULL) {
3269 BT_ERR("ERROR: Can't get on session bus [%s]", error->message);
3270 g_error_free(error);
3272 retv_if(obexd_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
3275 if (_bt_register_service_event(obexd_conn,
3276 BT_OPP_SERVER_EVENT) != BLUETOOTH_ERROR_NONE) {
3277 dbus_g_connection_unref(obexd_conn);
3279 return BLUETOOTH_ERROR_INTERNAL;
3284 return BLUETOOTH_ERROR_NONE;
3287 /* To receive the event from bluez */
3288 int _bt_init_service_event_receiver(void)
3294 result = __bt_init_manager_receiver();
3295 retv_if(result != BLUETOOTH_ERROR_NONE, result);
3297 result = __bt_init_obexd_receiver();
3298 if (result != BLUETOOTH_ERROR_NONE)
3299 BT_ERR("Fail to init obexd receiver");
3303 return BLUETOOTH_ERROR_NONE;
3306 void _bt_deinit_service_event_receiver(void)
3310 _bt_unregister_service_event(manager_conn, BT_MANAGER_EVENT);
3312 _bt_unregister_service_event(obexd_conn, BT_OPP_SERVER_EVENT);
3315 dbus_g_connection_unref(manager_conn);
3316 manager_conn = NULL;
3320 dbus_g_connection_unref(obexd_conn);
3325 g_source_remove(event_id);
3330 int _bt_opp_client_event_init(void)
3332 GError *error = NULL;
3334 if (opc_obexd_conn == NULL) {
3335 opc_obexd_conn = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
3336 if (error != NULL) {
3337 BT_ERR("ERROR: Can't get on session bus [%s]",
3339 g_error_free(error);
3340 return BLUETOOTH_ERROR_INTERNAL;
3343 retv_if(opc_obexd_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
3346 if (_bt_register_service_event(opc_obexd_conn,
3347 BT_OPP_CLIENT_EVENT) != BLUETOOTH_ERROR_NONE) {
3348 dbus_g_connection_unref(opc_obexd_conn);
3349 opc_obexd_conn = NULL;
3350 return BLUETOOTH_ERROR_INTERNAL;
3353 return BLUETOOTH_ERROR_NONE;
3356 void _bt_opp_client_event_deinit(void)
3358 if (opc_obexd_conn) {
3359 _bt_unregister_service_event(opc_obexd_conn,
3360 BT_OPP_CLIENT_EVENT);
3361 dbus_g_connection_unref(opc_obexd_conn);
3362 opc_obexd_conn = NULL;