4 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #include <dbus/dbus-glib.h>
21 #include <dbus/dbus-glib-lowlevel.h>
22 #include <dbus/dbus.h>
27 #include <vconf-internal-bt-keys.h>
29 #include "bluetooth-api.h"
30 #include "bt-internal-types.h"
32 #include "bt-service-common.h"
33 #include "bt-service-event.h"
34 #include "bt-service-main.h"
35 #include "bt-service-adapter.h"
36 #include "bt-service-device.h"
37 #include "bt-service-obex-server.h"
38 #include "bt-service-rfcomm-server.h"
39 #include "bt-service-opp-client.h"
40 #include "bt-service-audio.h"
42 static DBusGConnection *manager_conn = NULL;
43 static DBusGConnection *obexd_conn = NULL;
44 static DBusGConnection *opc_obexd_conn = NULL;
46 static guint event_id;
48 static bt_remote_dev_info_t *__bt_parse_device_properties(DBusMessageIter *item_iter)
50 DBusMessageIter value_iter;
52 bt_remote_dev_info_t *dev_info;
54 dbus_message_iter_recurse(item_iter, &value_iter);
56 if (dbus_message_iter_get_arg_type(&value_iter) != DBUS_TYPE_DICT_ENTRY) {
61 dev_info = g_malloc0(sizeof(bt_remote_dev_info_t));
63 while (dbus_message_iter_get_arg_type(&value_iter) ==
64 DBUS_TYPE_DICT_ENTRY) {
66 DBusMessageIter dict_entry;
67 DBusMessageIter iter_dict_val;
69 dbus_message_iter_recurse(&value_iter, &dict_entry);
71 dbus_message_iter_get_basic(&dict_entry, &key);
74 dbus_message_iter_next(&value_iter);
78 if (!dbus_message_iter_next(&dict_entry)) {
79 dbus_message_iter_next(&value_iter);
82 dbus_message_iter_recurse(&dict_entry, &iter_dict_val);
84 if (strcasecmp(key, "Address") == 0) {
85 const char *address = NULL;
86 dbus_message_iter_get_basic(&iter_dict_val, &address);
87 dev_info->address = g_strdup(address);
88 } else if (strcasecmp(key, "Class") == 0) {
89 dbus_message_iter_get_basic(&iter_dict_val, &dev_info->class);
90 } else if (strcasecmp(key, "name") == 0) {
91 dbus_message_iter_get_basic(&iter_dict_val, &value);
92 if (dev_info->name == NULL)
93 dev_info->name = g_strdup(value);
94 } else if (strcasecmp(key, "Connected") == 0) {
95 dbus_message_iter_get_basic(&iter_dict_val,
96 &dev_info->connected);
97 } else if (strcasecmp(key, "paired") == 0) {
98 dbus_message_iter_get_basic(&iter_dict_val,
100 } else if (strcasecmp(key, "Trusted") == 0) {
101 dbus_message_iter_get_basic(&iter_dict_val,
103 } else if (strcasecmp(key, "RSSI") == 0) {
104 dbus_message_iter_get_basic(&iter_dict_val,
106 } else if (strcasecmp(key, "UUIDs") == 0) {
107 DBusMessageIter uuid_iter;
108 DBusMessageIter tmp_iter;
111 dbus_message_iter_recurse(&iter_dict_val, &uuid_iter);
113 tmp_iter = uuid_iter;
115 /* Store the uuid count */
116 while (dbus_message_iter_get_arg_type(&tmp_iter) != DBUS_TYPE_INVALID) {
117 dbus_message_iter_get_basic(&tmp_iter,
120 dev_info->uuid_count++;
121 if (!dbus_message_iter_next(&tmp_iter))
125 /* Store the uuids */
126 if (dev_info->uuid_count > 0) {
127 dev_info->uuids = g_new0(char *,
128 dev_info->uuid_count + 1);
130 dbus_message_iter_next(&value_iter);
134 while (dbus_message_iter_get_arg_type(&uuid_iter) != DBUS_TYPE_INVALID) {
135 dbus_message_iter_get_basic(&uuid_iter,
137 dev_info->uuids[i] = g_strdup(value);
139 if (!dbus_message_iter_next(&uuid_iter)) {
146 dbus_message_iter_next(&value_iter);
152 void __bt_parse_media_properties(DBusMessageIter *item_iter)
154 DBusMessageIter value_iter;
155 char *address = NULL;
157 int result = BLUETOOTH_ERROR_NONE;
159 dbus_message_iter_recurse(item_iter, &value_iter);
161 if (dbus_message_iter_get_arg_type(&value_iter) !=
162 DBUS_TYPE_DICT_ENTRY) {
167 while (dbus_message_iter_get_arg_type(&value_iter) ==
168 DBUS_TYPE_DICT_ENTRY) {
170 DBusMessageIter dict_entry;
171 DBusMessageIter iter_dict_val;
173 dbus_message_iter_recurse(&value_iter, &dict_entry);
174 dbus_message_iter_get_basic(&dict_entry, &key);
177 dbus_message_iter_next(&value_iter);
181 if (!dbus_message_iter_next(&dict_entry)) {
182 dbus_message_iter_next(&value_iter);
186 dbus_message_iter_recurse(&dict_entry, &iter_dict_val);
188 BT_DBG("key: %s", key);
190 if (strcasecmp(key, "Device") == 0) {
191 char *object_path = NULL;
193 dbus_message_iter_get_basic(&iter_dict_val, &object_path);
194 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
195 _bt_convert_device_path_to_address(object_path, address);
197 }else if (strcasecmp(key, "UUID") == 0) {
198 dbus_message_iter_get_basic(&iter_dict_val, &uuid);
201 dbus_message_iter_next(&value_iter);
204 if (address != NULL && uuid != NULL){
205 int event = BLUETOOTH_EVENT_AV_CONNECTED;
206 char connected_address[BT_ADDRESS_STRING_SIZE + 1];
207 bluetooth_device_address_t device_address;
210 _bt_send_event(BT_HEADSET_EVENT, event,
211 DBUS_TYPE_INT32, &result,
212 DBUS_TYPE_STRING, &address,
215 connected = _bt_is_headset_type_connected(BT_AUDIO_A2DP,
218 if (g_strcmp0(connected_address, address) != 0) {
219 _bt_convert_addr_string_to_type(
222 _bt_audio_disconnect(0, BT_AUDIO_A2DP,
223 &device_address, NULL);
227 _bt_add_headset_to_list(BT_AUDIO_A2DP,
228 BT_STATE_CONNECTED, address);
234 static void __bt_parse_audio_properties(DBusMessage *msg)
236 DBusMessageIter msg_iter;
237 DBusMessageIter value_iter;
239 ret_if(dbus_message_iter_init(msg, &msg_iter) == FALSE);
241 /* object array (oa) */
242 ret_if(dbus_message_iter_next(&msg_iter) == FALSE);
243 ret_if(dbus_message_iter_get_arg_type(&msg_iter) !=
246 dbus_message_iter_recurse(&msg_iter, &value_iter);
248 /* string array (sa) */
249 while (dbus_message_iter_get_arg_type(&value_iter) ==
250 DBUS_TYPE_DICT_ENTRY) {
251 char *interface_name = NULL;
252 DBusMessageIter interface_iter;
254 dbus_message_iter_recurse(&value_iter, &interface_iter);
256 ret_if(dbus_message_iter_get_arg_type(&interface_iter) !=
259 dbus_message_iter_get_basic(&interface_iter, &interface_name);
261 ret_if(dbus_message_iter_next(&interface_iter) == FALSE);
263 ret_if(dbus_message_iter_get_arg_type(&interface_iter) !=
266 BT_DBG("interface: %s", interface_name);
268 if (g_strcmp0(interface_name,
269 "org.bluez.MediaTransport1") == 0) {
270 __bt_parse_media_properties(&interface_iter);
273 dbus_message_iter_next(&value_iter);
279 static int __bt_parse_event(DBusMessage *msg)
281 DBusMessageIter msg_iter;
282 DBusMessageIter value_iter;
284 retv_if(dbus_message_iter_init(msg, &msg_iter) == FALSE, 0);
286 /* object array (oa) */
287 retv_if(dbus_message_iter_next(&msg_iter) == FALSE, 0);
288 retv_if(dbus_message_iter_get_arg_type(&msg_iter) !=
291 dbus_message_iter_recurse(&msg_iter, &value_iter);
293 /* string array (sa) */
294 while (dbus_message_iter_get_arg_type(&value_iter) ==
295 DBUS_TYPE_DICT_ENTRY) {
296 char *interface_name = NULL;
297 DBusMessageIter interface_iter;
299 dbus_message_iter_recurse(&value_iter, &interface_iter);
301 retv_if(dbus_message_iter_get_arg_type(&interface_iter) !=
302 DBUS_TYPE_STRING, 0);
304 dbus_message_iter_get_basic(&interface_iter,
307 retv_if(dbus_message_iter_next(&interface_iter) == FALSE,
310 retv_if(dbus_message_iter_get_arg_type(&interface_iter) !=
313 BT_DBG("interface: %s", interface_name);
315 if (g_strcmp0(interface_name,
316 "org.bluez.Device1") == 0) {
317 return BT_DEVICE_EVENT;
318 }else if (g_strcmp0(interface_name,
319 "org.bluez.MediaTransport1") == 0) {
320 return BT_MEDIA_TRANSFER_EVENT;
322 dbus_message_iter_next(&value_iter);
328 static int __bt_parse_remove_event(DBusMessage *msg)
330 DBusMessageIter msg_iter;
331 DBusMessageIter value_iter;
333 retv_if(dbus_message_iter_init(msg, &msg_iter) ==
336 retv_if(dbus_message_iter_next(&msg_iter) == FALSE,
338 retv_if(dbus_message_iter_get_arg_type(&msg_iter) !=
341 dbus_message_iter_recurse(&msg_iter, &value_iter);
343 while (dbus_message_iter_get_arg_type(&value_iter)
344 != DBUS_TYPE_INVALID) {
347 dbus_message_iter_get_basic(&value_iter, &key);
350 dbus_message_iter_next(&value_iter);
354 BT_DBG("key = %s", key);
356 if (g_strcmp0(key, "org.bluez.MediaTransport1") == 0) {
357 return BT_MEDIA_TRANSFER_EVENT;
358 }else if (g_strcmp0(key, "org.bluez.Device1") == 0) {
359 return BT_DEVICE_EVENT;
361 dbus_message_iter_next(&value_iter);
367 gboolean _bt_parse_audio_remove_properties(DBusMessage *msg)
369 DBusMessageIter msg_iter;
370 DBusMessageIter value_iter;
371 char *object_path = NULL;
372 char *address = NULL;
373 int result = BLUETOOTH_ERROR_NONE;
374 bt_headset_wait_t *wait_list;
376 retv_if(dbus_message_iter_init(msg, &msg_iter) == FALSE, FALSE);
378 dbus_message_iter_get_basic(&msg_iter, &object_path);
379 retv_if(object_path == NULL, FALSE);
381 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
382 _bt_convert_device_path_to_address(object_path, address);
384 retv_if(dbus_message_iter_next(&msg_iter) == FALSE, FALSE);
385 retv_if(dbus_message_iter_get_arg_type(&msg_iter) !=
386 DBUS_TYPE_ARRAY, FALSE);
388 dbus_message_iter_recurse(&msg_iter, &value_iter);
390 while (dbus_message_iter_get_arg_type(&value_iter)
391 != DBUS_TYPE_INVALID) {
394 dbus_message_iter_get_basic(&value_iter, &key);
397 dbus_message_iter_next(&value_iter);
401 BT_DBG("key = %s", key);
403 if (g_strcmp0(key, "org.bluez.MediaTransport1") == 0) {
404 int event = BLUETOOTH_EVENT_AV_DISCONNECTED;
406 _bt_send_event(BT_HEADSET_EVENT, event,
407 DBUS_TYPE_INT32, &result,
408 DBUS_TYPE_STRING, &address,
411 /* Remove data from the connected list */
412 _bt_remove_headset_from_list(BT_AUDIO_A2DP, address);
413 wait_list = _bt_get_audio_wait_data();
415 if (wait_list == NULL) {
420 if (((wait_list->type == BT_AUDIO_ALL) &&
421 (wait_list->ag_flag == TRUE)) ||
422 (wait_list->type == BT_AUDIO_A2DP) ||
423 (wait_list->disconnection_type == BT_AUDIO_A2DP)) {
424 bluetooth_device_address_t device_address;
425 _bt_convert_addr_string_to_type(
429 _bt_audio_connect(wait_list->req_id,
432 wait_list->out_param1);
438 dbus_message_iter_next(&value_iter);
445 static bt_remote_dev_info_t *__bt_parse_interface(DBusMessage *msg)
447 DBusMessageIter msg_iter;
448 DBusMessageIter value_iter;
449 char *object_path = NULL;
450 bt_remote_dev_info_t *dev_info = NULL;
452 retv_if(dbus_message_iter_init(msg, &msg_iter) == FALSE, NULL);
454 dbus_message_iter_get_basic(&msg_iter, &object_path);
455 retv_if(object_path == NULL, NULL);
457 /* object array (oa) */
458 retv_if(dbus_message_iter_next(&msg_iter) == FALSE, NULL);
459 retv_if(dbus_message_iter_get_arg_type(&msg_iter) !=
460 DBUS_TYPE_ARRAY, NULL);
462 dbus_message_iter_recurse(&msg_iter, &value_iter);
464 /* string array (sa) */
465 while (dbus_message_iter_get_arg_type(&value_iter) ==
466 DBUS_TYPE_DICT_ENTRY) {
467 char *interface_name = NULL;
468 DBusMessageIter interface_iter;
470 dbus_message_iter_recurse(&value_iter, &interface_iter);
472 retv_if(dbus_message_iter_get_arg_type(&interface_iter) !=
473 DBUS_TYPE_STRING, NULL);
475 dbus_message_iter_get_basic(&interface_iter, &interface_name);
477 retv_if(dbus_message_iter_next(&interface_iter) == FALSE, NULL);
479 retv_if(dbus_message_iter_get_arg_type(&interface_iter) !=
480 DBUS_TYPE_ARRAY, NULL);
482 BT_DBG("interface: %s", interface_name);
484 if (g_strcmp0(interface_name, "org.bluez.Device1") == 0) {
485 BT_DBG("Found a device: %s", object_path);
487 dev_info = __bt_parse_device_properties(&interface_iter);
489 if (dev_info == NULL) {
490 BT_ERR("Fail to parse the properies");
495 dbus_message_iter_next(&value_iter);
501 char *__bt_get_headset_name(char *address)
503 bluetooth_device_address_t device_address = { {0} };
504 bluetooth_device_info_t dev_info;
506 retv_if(address == NULL, strdup(""));
508 _bt_convert_addr_string_to_type(device_address.addr, address);
510 memset(&dev_info, 0x00, sizeof(bluetooth_device_info_t));
512 _bt_get_bonded_device_info(&device_address, &dev_info);
514 return g_strdup(dev_info.device_name.name);
517 static int __bt_get_owner_info(DBusMessage *msg, char **name,
518 char **previous, char **current)
520 DBusMessageIter item_iter;
522 dbus_message_iter_init(msg, &item_iter);
524 if (dbus_message_iter_get_arg_type(&item_iter)
525 != DBUS_TYPE_STRING) {
526 BT_ERR("This is bad format dbus\n");
527 return BLUETOOTH_ERROR_INTERNAL;
530 dbus_message_iter_get_basic(&item_iter, name);
532 retv_if(*name == NULL, BLUETOOTH_ERROR_INTERNAL);
534 dbus_message_iter_next(&item_iter);
536 if (dbus_message_iter_get_arg_type(&item_iter)
537 != DBUS_TYPE_STRING) {
538 BT_ERR("This is bad format dbus\n");
539 return BLUETOOTH_ERROR_INTERNAL;
542 dbus_message_iter_get_basic(&item_iter, previous);
544 retv_if(*previous == NULL, BLUETOOTH_ERROR_INTERNAL);
546 dbus_message_iter_next(&item_iter);
548 if (dbus_message_iter_get_arg_type(&item_iter)
549 != DBUS_TYPE_STRING) {
550 BT_ERR("This is bad format dbus\n");
551 return BLUETOOTH_ERROR_INTERNAL;
554 dbus_message_iter_get_basic(&item_iter, current);
556 retv_if(*current == NULL, BLUETOOTH_ERROR_INTERNAL);
558 return BLUETOOTH_ERROR_NONE;
561 static int __bt_get_agent_signal_info(DBusMessage *msg, char **address,
562 char **name, char **uuid)
564 DBusMessageIter item_iter;
566 dbus_message_iter_init(msg, &item_iter);
568 if (dbus_message_iter_get_arg_type(&item_iter)
569 != DBUS_TYPE_STRING) {
570 BT_ERR("This is bad format dbus\n");
571 return BLUETOOTH_ERROR_INTERNAL;
574 dbus_message_iter_get_basic(&item_iter, address);
576 dbus_message_iter_next(&item_iter);
578 if (dbus_message_iter_get_arg_type(&item_iter)
579 != DBUS_TYPE_STRING) {
580 BT_ERR("This is bad format dbus\n");
581 return BLUETOOTH_ERROR_INTERNAL;
584 dbus_message_iter_get_basic(&item_iter, name);
586 dbus_message_iter_next(&item_iter);
588 if (dbus_message_iter_get_arg_type(&item_iter)
589 != DBUS_TYPE_STRING) {
590 BT_ERR("This is bad format dbus\n");
591 return BLUETOOTH_ERROR_INTERNAL;
594 dbus_message_iter_get_basic(&item_iter, uuid);
596 return BLUETOOTH_ERROR_NONE;
599 void _bt_handle_adapter_event(DBusMessage *msg)
601 int result = BLUETOOTH_ERROR_NONE;
602 DBusMessageIter item_iter;
603 const char *member = dbus_message_get_member(msg);
605 ret_if(member == NULL);
607 if (strcasecmp(member, "DeviceCreated") == 0) {
608 const char *object_path = NULL;
610 bt_remote_dev_info_t *remote_dev_info;
612 ret_if(_bt_is_device_creating() == FALSE);
614 /* Bonding from remote device */
615 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
617 dbus_message_iter_init(msg, &item_iter);
618 dbus_message_iter_get_basic(&item_iter, &object_path);
619 dbus_message_iter_next(&item_iter);
621 _bt_convert_device_path_to_address(object_path, address);
623 remote_dev_info = _bt_get_remote_device_info(address);
624 if (remote_dev_info == NULL) {
629 _bt_free_device_info(remote_dev_info);
631 } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
632 const char *object_path = NULL;
635 /* Bonding from remote device */
636 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
638 dbus_message_iter_init(msg, &item_iter);
639 dbus_message_iter_get_basic(&item_iter, &object_path);
640 dbus_message_iter_next(&item_iter);
642 _bt_convert_device_path_to_address(object_path, address);
644 _bt_send_event(BT_ADAPTER_EVENT,
645 BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED,
646 DBUS_TYPE_INT32, &result,
647 DBUS_TYPE_STRING, &address,
654 gboolean _bt_stop_discovery_timeout_cb(gpointer user_data)
656 DBusGProxy *adapter_proxy;
660 adapter_proxy = _bt_get_adapter_proxy();
661 retv_if(adapter_proxy == NULL, FALSE);
663 /* Need to stop searching */
664 dbus_g_proxy_call(adapter_proxy,
673 void _bt_stop_discovery_timeout(void)
678 event_id = g_timeout_add(BT_STOP_DISCOVERY_TIMEOUT,
679 (GSourceFunc)_bt_stop_discovery_timeout_cb, NULL);
682 static gboolean __bt_discovery_finished()
684 int result = BLUETOOTH_ERROR_NONE;
686 if (_bt_get_cancel_by_user() == TRUE) {
687 result = BLUETOOTH_ERROR_CANCEL_BY_USER;
690 _bt_set_cancel_by_user(FALSE);
691 _bt_set_discovery_status(FALSE);
692 _bt_send_event(BT_ADAPTER_EVENT,
693 BLUETOOTH_EVENT_DISCOVERY_FINISHED,
694 DBUS_TYPE_INT32, &result,
700 void __bt_adapter_property_changed_event(DBusMessageIter *msg_iter, const char *path)
702 DBusGProxy *adapter_proxy;
704 int result = BLUETOOTH_ERROR_NONE;
705 DBusMessageIter value_iter;
706 DBusMessageIter dict_iter;
707 DBusMessageIter item_iter;
708 GValue timeout = { 0 };
709 const char *property = NULL;
711 dbus_message_iter_recurse(msg_iter, &item_iter);
713 if (dbus_message_iter_get_arg_type(&item_iter)
714 != DBUS_TYPE_DICT_ENTRY) {
715 BT_ERR("This is bad format dbus\n");
719 dbus_message_iter_recurse(&item_iter, &dict_iter);
721 dbus_message_iter_get_basic(&dict_iter, &property);
722 ret_if(property == NULL);
724 ret_if(!dbus_message_iter_next(&dict_iter));
726 if (strcasecmp(property, "Discovering") == 0) {
727 gboolean discovering = FALSE;
729 dbus_message_iter_recurse(&dict_iter, &value_iter);
730 dbus_message_iter_get_basic(&value_iter, &discovering);
732 /* Send event to application */
733 if (discovering == TRUE) {
734 _bt_set_discovery_status(TRUE);
735 _bt_send_event(BT_ADAPTER_EVENT,
736 BLUETOOTH_EVENT_DISCOVERY_STARTED,
737 DBUS_TYPE_INT32, &result,
741 g_source_remove(event_id);
744 __bt_discovery_finished();
746 } else if (strcasecmp(property, "Name") == 0) {
749 dbus_message_iter_recurse(&dict_iter, &value_iter);
750 dbus_message_iter_get_basic(&value_iter, &name);
752 /* Send event to application */
753 _bt_send_event(BT_ADAPTER_EVENT,
754 BLUETOOTH_EVENT_LOCAL_NAME_CHANGED,
755 DBUS_TYPE_INT32, &result,
756 DBUS_TYPE_STRING, &name,
758 } else if (strcasecmp(property, "Discoverable") == 0) {
759 gboolean discoverable = FALSE;
761 dbus_message_iter_recurse(&dict_iter, &value_iter);
762 dbus_message_iter_get_basic(&value_iter, &discoverable);
764 if (discoverable == FALSE) {
765 if (_bt_get_discoverable_timeout_property() > 0) {
766 g_value_init(&timeout, G_TYPE_UINT);
767 g_value_set_uint(&timeout, 0);
769 adapter_proxy = _bt_get_adapter_properties_proxy();
770 ret_if(adapter_proxy == NULL);
772 dbus_g_proxy_call_no_reply(adapter_proxy, "Set",
773 G_TYPE_STRING, BT_ADAPTER_INTERFACE,
774 G_TYPE_STRING, "DiscoverableTimeout",
775 G_TYPE_VALUE, &timeout,
778 g_value_unset(&timeout);
781 mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
783 /* Send event to application */
784 _bt_send_event(BT_ADAPTER_EVENT,
785 BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
786 DBUS_TYPE_INT32, &result,
787 DBUS_TYPE_INT16, &mode,
790 _bt_get_discoverable_mode(&mode);
792 /* Event will be sent by "DiscoverableTimeout" signal */
793 ret_if(mode != BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE);
795 /* Send event to application */
796 _bt_send_event(BT_ADAPTER_EVENT,
797 BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
798 DBUS_TYPE_INT32, &result,
799 DBUS_TYPE_INT16, &mode,
802 } else if (strcasecmp(property, "DiscoverableTimeout") == 0) {
803 _bt_get_discoverable_mode(&mode);
805 /* Event was already sent by "Discoverable" signal */
806 ret_if(mode == BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE);
808 /* Send event to application */
809 _bt_send_event(BT_ADAPTER_EVENT,
810 BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
811 DBUS_TYPE_INT32, &result,
812 DBUS_TYPE_INT16, &mode,
817 static void __bt_device_remote_connected_properties(
818 bt_remote_dev_info_t *remote_dev_info,
819 char *address, gboolean connected)
821 int result = BLUETOOTH_ERROR_NONE;
826 if (remote_dev_info->uuid_count > 0 ) {
827 for (i = 0; i<remote_dev_info->uuid_count; i++) {
828 char *uuid = remote_dev_info->uuids[i];
829 if (strcasecmp(uuid, HID_UUID) == 0){
830 int event = BLUETOOTH_EVENT_NONE;
832 event = (connected == TRUE) ?
833 BLUETOOTH_HID_CONNECTED :
834 BLUETOOTH_HID_DISCONNECTED;
836 _bt_send_event(BT_HID_EVENT, event,
837 DBUS_TYPE_INT32, &result,
838 DBUS_TYPE_STRING, &address,
848 void __bt_device_property_changed_event(DBusMessageIter *msg_iter, const char *path)
851 int result = BLUETOOTH_ERROR_NONE;
852 DBusMessageIter value_iter;
853 DBusMessageIter dict_iter;
854 DBusMessageIter item_iter;
855 const char *property = NULL;
857 bt_remote_dev_info_t *remote_dev_info;
859 dbus_message_iter_recurse(msg_iter, &item_iter);
861 if (dbus_message_iter_get_arg_type(&item_iter)
862 != DBUS_TYPE_DICT_ENTRY) {
863 BT_ERR("This is bad format dbus\n");
867 dbus_message_iter_recurse(&item_iter, &dict_iter);
869 dbus_message_iter_get_basic(&dict_iter, &property);
870 ret_if(property == NULL);
872 ret_if(!dbus_message_iter_next(&dict_iter));
874 if (strcasecmp(property, "Connected") == 0) {
875 gboolean connected = FALSE;
877 dbus_message_iter_recurse(&dict_iter, &value_iter);
878 dbus_message_iter_get_basic(&value_iter, &connected);
880 event = connected ? BLUETOOTH_EVENT_DEVICE_CONNECTED :
881 BLUETOOTH_EVENT_DEVICE_DISCONNECTED;
883 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
885 _bt_convert_device_path_to_address(path, address);
887 BT_DBG("connected: %d", connected);
888 BT_DBG("address: %s", address);
890 remote_dev_info = _bt_get_remote_device_info(address);
892 if (remote_dev_info != NULL) {
893 __bt_device_remote_connected_properties(
894 remote_dev_info, address, connected);
897 /* Send event to application */
898 _bt_send_event(BT_DEVICE_EVENT,
900 DBUS_TYPE_INT32, &result,
901 DBUS_TYPE_STRING, &address,
906 } else if (strcasecmp(property, "Paired") == 0) {
907 gboolean paired = FALSE;
908 bt_remote_dev_info_t *remote_dev_info;
910 dbus_message_iter_recurse(&dict_iter, &value_iter);
911 dbus_message_iter_get_basic(&value_iter, &paired);
913 ret_if(paired == FALSE);
915 /* BlueZ sends paired signal for each paired device */
916 /* during activation, We should ignore this, otherwise*/
917 /* application thinks that a new device got paired */
918 if (_bt_adapter_get_status() != BT_ACTIVATED) {
919 BT_DBG("BT is not activated, so ignore this");
923 if (_bt_is_device_creating() == TRUE) {
924 BT_DBG("Try to Pair by me");
928 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
930 _bt_convert_device_path_to_address(path, address);
932 remote_dev_info = _bt_get_remote_device_info(address);
933 if (remote_dev_info == NULL) {
938 _bt_send_event(BT_ADAPTER_EVENT,
939 BLUETOOTH_EVENT_BONDING_FINISHED,
940 DBUS_TYPE_INT32, &result,
941 DBUS_TYPE_STRING, &address,
942 DBUS_TYPE_UINT32, &remote_dev_info->class,
943 DBUS_TYPE_INT16, &remote_dev_info->rssi,
944 DBUS_TYPE_STRING, &remote_dev_info->name,
945 DBUS_TYPE_BOOLEAN, &remote_dev_info->paired,
946 DBUS_TYPE_BOOLEAN, &remote_dev_info->connected,
947 DBUS_TYPE_BOOLEAN, &remote_dev_info->trust,
948 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
949 &remote_dev_info->uuids, remote_dev_info->uuid_count,
952 _bt_free_device_info(remote_dev_info);
957 void __bt_obex_property_changed_event(DBusMessageIter *msg_iter, const char *path)
959 DBusMessageIter value_iter;
960 DBusMessageIter dict_iter;
961 DBusMessageIter item_iter;
962 const char *property = NULL;
964 dbus_message_iter_recurse(msg_iter, &item_iter);
966 if (dbus_message_iter_get_arg_type(&item_iter)
967 != DBUS_TYPE_DICT_ENTRY) {
968 BT_ERR("This is bad format dbus\n");
972 dbus_message_iter_recurse(&item_iter, &dict_iter);
974 dbus_message_iter_get_basic(&dict_iter, &property);
975 ret_if(property == NULL);
977 ret_if(!dbus_message_iter_next(&dict_iter));
979 if (strcasecmp(property, "Status") == 0) {
981 dbus_message_iter_recurse(&dict_iter, &value_iter);
982 dbus_message_iter_get_basic(&value_iter, &status);
984 if (strcasecmp(status, "active") == 0){
985 _bt_obex_transfer_started(path);
986 }else if (strcasecmp(status, "complete") == 0) {
987 _bt_obex_transfer_completed(path, TRUE);
988 }else if (strcasecmp(status, "error") == 0){
989 _bt_obex_transfer_completed(path, FALSE);
991 } else if (strcasecmp(property, "Transferred") == 0) {
992 static int transferred = 0;
993 dbus_message_iter_recurse(&dict_iter, &value_iter);
994 dbus_message_iter_get_basic(&value_iter, &transferred);
996 _bt_obex_transfer_progress(path,transferred);
1000 void _bt_handle_input_event(DBusMessage *msg)
1002 int result = BLUETOOTH_ERROR_NONE;
1003 DBusMessageIter item_iter;
1004 DBusMessageIter value_iter;
1005 gboolean property_flag = FALSE;
1006 const char *member = dbus_message_get_member(msg);
1007 const char *path = dbus_message_get_path(msg);
1008 const char *property = NULL;
1010 ret_if(member == NULL);
1012 dbus_message_iter_init(msg, &item_iter);
1014 if (dbus_message_iter_get_arg_type(&item_iter)
1015 != DBUS_TYPE_STRING) {
1016 BT_ERR("This is bad format dbus\n");
1020 dbus_message_iter_get_basic(&item_iter, &property);
1022 ret_if(property == NULL);
1024 if (strcasecmp(property, "Connected") == 0) {
1025 int event = BLUETOOTH_EVENT_NONE;
1028 dbus_message_iter_next(&item_iter);
1029 dbus_message_iter_recurse(&item_iter, &value_iter);
1030 dbus_message_iter_get_basic(&value_iter, &property_flag);
1032 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1034 _bt_convert_device_path_to_address(path, address);
1036 event = (property_flag == TRUE) ?
1037 BLUETOOTH_HID_CONNECTED :
1038 BLUETOOTH_HID_DISCONNECTED;
1040 _bt_send_event(BT_HID_EVENT, event,
1041 DBUS_TYPE_INT32, &result,
1042 DBUS_TYPE_STRING, &address,
1049 void _bt_handle_network_server_event(DBusMessage *msg)
1051 int result = BLUETOOTH_ERROR_NONE;
1052 char *address = NULL;
1053 char *device = NULL;
1054 const char *member = dbus_message_get_member(msg);
1056 ret_if(member == NULL);
1058 if (strcasecmp(member, "PeerConnected") == 0) {
1059 if (!dbus_message_get_args(msg, NULL,
1060 DBUS_TYPE_STRING, &device,
1061 DBUS_TYPE_STRING, &address,
1062 DBUS_TYPE_INVALID)) {
1063 BT_ERR("Unexpected parameters in signal");
1067 _bt_send_event(BT_NETWORK_EVENT, BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED,
1068 DBUS_TYPE_INT32, &result,
1069 DBUS_TYPE_STRING, &device,
1070 DBUS_TYPE_STRING, &address,
1072 } else if (strcasecmp(member, "PeerDisconnected") == 0) {
1073 if (!dbus_message_get_args(msg, NULL,
1074 DBUS_TYPE_STRING, &device,
1075 DBUS_TYPE_STRING, &address,
1076 DBUS_TYPE_INVALID)) {
1077 BT_ERR("Unexpected parameters in signal");
1081 _bt_send_event(BT_NETWORK_EVENT, BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED,
1082 DBUS_TYPE_INT32, &result,
1083 DBUS_TYPE_STRING, &device,
1084 DBUS_TYPE_STRING, &address,
1089 void __bt_handle_network_client_event(DBusMessageIter *msg_iter, const char *path)
1091 int result = BLUETOOTH_ERROR_NONE;
1092 DBusMessageIter item_iter;
1093 DBusMessageIter value_iter;
1094 DBusMessageIter dict_iter;
1095 gboolean property_flag = FALSE;
1096 const char *property = NULL;
1098 dbus_message_iter_recurse(msg_iter, &item_iter);
1100 if (dbus_message_iter_get_arg_type(&item_iter)
1101 != DBUS_TYPE_DICT_ENTRY) {
1102 BT_ERR("This is bad format dbus\n");
1106 dbus_message_iter_recurse(&item_iter, &dict_iter);
1107 dbus_message_iter_get_basic(&dict_iter, &property);
1109 ret_if(property == NULL);
1111 ret_if(!dbus_message_iter_next(&dict_iter));
1113 if (strcasecmp(property, "Connected") == 0) {
1114 int event = BLUETOOTH_EVENT_NONE;
1117 dbus_message_iter_recurse(&dict_iter, &value_iter);
1118 dbus_message_iter_get_basic(&value_iter, &property_flag);
1120 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1122 _bt_convert_device_path_to_address(path, address);
1124 if (property_flag == TRUE) {
1125 event = BLUETOOTH_EVENT_NETWORK_CONNECTED;
1127 event = BLUETOOTH_EVENT_NETWORK_DISCONNECTED;
1130 _bt_send_event(BT_NETWORK_EVENT, event,
1131 DBUS_TYPE_INT32, &result,
1132 DBUS_TYPE_STRING, &address,
1139 void _bt_handle_device_event(DBusMessage *msg)
1142 int result = BLUETOOTH_ERROR_NONE;
1143 DBusMessageIter item_iter;
1144 DBusMessageIter value_iter;
1146 const char *member = dbus_message_get_member(msg);
1147 const char *path = dbus_message_get_path(msg);
1148 const char *property = NULL;
1150 ret_if(path == NULL);
1151 ret_if(member == NULL);
1153 if (strcasecmp(member, "PropertyChanged") == 0) {
1154 dbus_message_iter_init(msg, &item_iter);
1156 if (dbus_message_iter_get_arg_type(&item_iter)
1157 != DBUS_TYPE_STRING) {
1158 BT_ERR("This is bad format dbus\n");
1162 dbus_message_iter_get_basic(&item_iter, &property);
1164 ret_if(property == NULL);
1166 if (strcasecmp(property, "Connected") == 0) {
1167 gboolean connected = FALSE;
1168 dbus_message_iter_next(&item_iter);
1169 dbus_message_iter_recurse(&item_iter, &value_iter);
1170 dbus_message_iter_get_basic(&value_iter, &connected);
1172 event = connected ? BLUETOOTH_EVENT_DEVICE_CONNECTED :
1173 BLUETOOTH_EVENT_DEVICE_DISCONNECTED;
1175 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1177 _bt_convert_device_path_to_address(path, address);
1179 BT_DBG("connected: %d", connected);
1180 BT_DBG("address: %s", address);
1182 /* Send event to application */
1183 _bt_send_event(BT_DEVICE_EVENT,
1185 DBUS_TYPE_INT32, &result,
1186 DBUS_TYPE_STRING, &address,
1190 } else if (strcasecmp(property, "Paired") == 0) {
1191 gboolean paired = FALSE;
1192 bt_remote_dev_info_t *remote_dev_info;
1193 dbus_message_iter_next(&item_iter);
1194 dbus_message_iter_recurse(&item_iter, &value_iter);
1195 dbus_message_iter_get_basic(&value_iter, &paired);
1197 ret_if(paired == FALSE);
1199 /* BlueZ sends paired signal for each paired device */
1200 /* during activation, We should ignore this, otherwise*/
1201 /* application thinks that a new device got paired */
1202 if (_bt_adapter_get_status() != BT_ACTIVATED) {
1203 BT_DBG("BT is not activated, so ignore this");
1207 if (_bt_is_device_creating() == TRUE) {
1208 BT_DBG("Try to Pair by me");
1212 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1214 _bt_convert_device_path_to_address(path, address);
1216 remote_dev_info = _bt_get_remote_device_info(address);
1217 if (remote_dev_info == NULL) {
1222 _bt_send_event(BT_ADAPTER_EVENT,
1223 BLUETOOTH_EVENT_BONDING_FINISHED,
1224 DBUS_TYPE_INT32, &result,
1225 DBUS_TYPE_STRING, &address,
1226 DBUS_TYPE_UINT32, &remote_dev_info->class,
1227 DBUS_TYPE_INT16, &remote_dev_info->rssi,
1228 DBUS_TYPE_STRING, &remote_dev_info->name,
1229 DBUS_TYPE_BOOLEAN, &remote_dev_info->paired,
1230 DBUS_TYPE_BOOLEAN, &remote_dev_info->connected,
1231 DBUS_TYPE_BOOLEAN, &remote_dev_info->trust,
1232 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
1233 &remote_dev_info->uuids, remote_dev_info->uuid_count,
1236 _bt_free_device_info(remote_dev_info);
1242 void __bt_handle_media_control_event(DBusMessageIter *msg_iter,
1245 int result = BLUETOOTH_ERROR_NONE;
1246 DBusMessageIter item_iter;
1247 DBusMessageIter value_iter;
1248 DBusMessageIter dict_iter;
1249 gboolean property_flag = FALSE;
1250 const char *property = NULL;
1252 dbus_message_iter_recurse(msg_iter, &item_iter);
1254 if (dbus_message_iter_get_arg_type(&item_iter)
1255 != DBUS_TYPE_DICT_ENTRY) {
1256 BT_ERR("This is bad format dbus\n");
1260 dbus_message_iter_recurse(&item_iter, &dict_iter);
1262 dbus_message_iter_get_basic(&dict_iter, &property);
1263 ret_if(property == NULL);
1265 ret_if(!dbus_message_iter_next(&dict_iter));
1267 if (strcasecmp(property, "Connected") == 0) {
1268 int event = BLUETOOTH_EVENT_NONE;
1271 dbus_message_iter_recurse(&dict_iter, &value_iter);
1272 dbus_message_iter_get_basic(&value_iter, &property_flag);
1274 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1276 _bt_convert_device_path_to_address(path, address);
1278 event = (property_flag == TRUE) ?
1279 BLUETOOTH_EVENT_AV_CONNECTED :
1280 BLUETOOTH_EVENT_AV_DISCONNECTED;
1282 _bt_send_event(BT_AVRCP_EVENT, event,
1283 DBUS_TYPE_INT32, &result,
1284 DBUS_TYPE_STRING, &address,
1291 void _bt_handle_property_changed_event(DBusMessage *msg)
1293 DBusMessageIter item_iter;
1294 const char *member = dbus_message_get_member(msg);
1295 const char *interface_name = NULL;
1297 ret_if(member == NULL);
1299 dbus_message_iter_init(msg, &item_iter);
1301 if (dbus_message_iter_get_arg_type(&item_iter)
1302 != DBUS_TYPE_STRING) {
1303 BT_ERR("This is bad format dbus\n");
1307 dbus_message_iter_get_basic(&item_iter, &interface_name);
1309 ret_if(interface_name == NULL);
1311 BT_DBG("interface: %s", interface_name);
1313 ret_if(dbus_message_iter_next(&item_iter) == FALSE);
1315 ret_if(dbus_message_iter_get_arg_type(&item_iter) != DBUS_TYPE_ARRAY);
1317 if (strcasecmp(interface_name, BT_ADAPTER_INTERFACE) == 0) {
1318 __bt_adapter_property_changed_event(&item_iter,
1319 dbus_message_get_path(msg));
1320 } else if (strcasecmp(interface_name, BT_DEVICE_INTERFACE) == 0) {
1321 __bt_device_property_changed_event(&item_iter,
1322 dbus_message_get_path(msg));
1323 } else if (strcasecmp(interface_name,
1324 BT_OBEX_TRANSFER_INTERFACE) == 0) {
1325 __bt_obex_property_changed_event(&item_iter,
1326 dbus_message_get_path(msg));
1327 } else if (strcasecmp(interface_name,
1328 BT_MEDIA_CONTROL_INTERFACE) == 0) {
1329 __bt_handle_media_control_event(&item_iter,
1330 dbus_message_get_path(msg));
1331 } else if (strcasecmp(interface_name,
1332 BT_NETWORK_CLIENT_INTERFACE) == 0) {
1333 __bt_handle_network_client_event(&item_iter,
1334 dbus_message_get_path(msg));
1336 BT_DBG("No bluez interface");
1340 void __bt_set_audio_values(gboolean connected, char *address)
1343 int bt_device_state = VCONFKEY_BT_DEVICE_NONE;
1345 /* Set the headset name */
1346 if (connected == TRUE) {
1347 name = __bt_get_headset_name(address);
1349 name = g_strdup("");
1352 if (vconf_set_str(VCONFKEY_BT_HEADSET_NAME,
1354 BT_ERR("vconf_set_str failed");
1359 /* Set the headset state */
1360 if (vconf_get_int(VCONFKEY_BT_DEVICE,
1361 &bt_device_state) != 0) {
1362 BT_ERR("vconf_get_str failed");
1365 if (connected == TRUE) {
1366 bt_device_state |= VCONFKEY_BT_DEVICE_HEADSET_CONNECTED;
1367 } else if (bt_device_state & VCONFKEY_BT_DEVICE_HEADSET_CONNECTED) {
1368 bt_device_state ^= VCONFKEY_BT_DEVICE_HEADSET_CONNECTED;
1371 if (vconf_set_int(VCONFKEY_BT_DEVICE,
1372 bt_device_state) != 0) {
1373 BT_ERR("vconf_set_int failed");
1377 void _bt_handle_headset_event(DBusMessage *msg)
1379 int result = BLUETOOTH_ERROR_NONE;
1380 DBusMessageIter item_iter;
1381 DBusMessageIter value_iter;
1382 gboolean property_flag = FALSE;
1383 const char *member = dbus_message_get_member(msg);
1384 const char *path = dbus_message_get_path(msg);
1385 const char *property = NULL;
1387 ret_if(member == NULL);
1389 dbus_message_iter_init(msg, &item_iter);
1391 if (dbus_message_iter_get_arg_type(&item_iter)
1392 != DBUS_TYPE_STRING) {
1393 BT_ERR("This is bad format dbus\n");
1397 dbus_message_iter_get_basic(&item_iter, &property);
1399 ret_if(property == NULL);
1401 /* We allow only 1 headset connection (HSP or HFP)*/
1402 if (strcasecmp(property, "Connected") == 0) {
1403 int event = BLUETOOTH_EVENT_NONE;
1406 dbus_message_iter_next(&item_iter);
1407 dbus_message_iter_recurse(&item_iter, &value_iter);
1408 dbus_message_iter_get_basic(&value_iter, &property_flag);
1410 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1412 _bt_convert_device_path_to_address(path, address);
1414 if (property_flag == TRUE) {
1415 event = BLUETOOTH_EVENT_AG_CONNECTED;
1417 event = BLUETOOTH_EVENT_AG_DISCONNECTED;
1420 __bt_set_audio_values(property_flag, address);
1422 _bt_send_event(BT_HEADSET_EVENT, event,
1423 DBUS_TYPE_INT32, &result,
1424 DBUS_TYPE_STRING, &address,
1428 } else if (strcasecmp(property, "State") == 0) {
1429 int event = BLUETOOTH_EVENT_NONE;
1430 int sco_connected = FALSE;
1434 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1436 _bt_convert_device_path_to_address(path, address);
1438 dbus_message_iter_next(&item_iter);
1439 dbus_message_iter_recurse(&item_iter, &value_iter);
1440 dbus_message_iter_get_basic(&value_iter, &state);
1442 /* This code assumes we support only 1 headset connection */
1443 /* Need to use the headset list, if we support multi-headsets */
1444 if (strcasecmp(property, "Playing") == 0) {
1445 event = BLUETOOTH_EVENT_AG_AUDIO_CONNECTED;
1446 sco_connected = TRUE;
1447 } else if (strcasecmp(property, "connected") == 0 ||
1448 strcasecmp(property, "disconnected") == 0) {
1449 event = BLUETOOTH_EVENT_AG_AUDIO_DISCONNECTED;
1450 sco_connected = FALSE;
1452 BT_ERR("Not handled state");
1457 if (vconf_set_bool(VCONFKEY_BT_HEADSET_SCO, sco_connected) < 0)
1458 BT_ERR("vconf_set_bool - Failed\n");
1460 _bt_send_event(BT_HEADSET_EVENT, event,
1461 DBUS_TYPE_INT32, &result,
1462 DBUS_TYPE_STRING, &address,
1466 } else if (strcasecmp(property, "SpeakerGain") == 0) {
1470 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1472 _bt_convert_device_path_to_address(path, address);
1474 dbus_message_iter_next(&item_iter);
1475 dbus_message_iter_recurse(&item_iter, &value_iter);
1476 dbus_message_iter_get_basic(&value_iter, &spkr_gain);
1478 _bt_send_event(BT_HEADSET_EVENT, BLUETOOTH_EVENT_AG_SPEAKER_GAIN,
1479 DBUS_TYPE_INT32, &result,
1480 DBUS_TYPE_STRING, &address,
1481 DBUS_TYPE_UINT16, &spkr_gain,
1485 } else if (strcasecmp(property, "MicrophoneGain") == 0) {
1489 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1491 _bt_convert_device_path_to_address(path, address);
1493 dbus_message_iter_next(&item_iter);
1494 dbus_message_iter_recurse(&item_iter, &value_iter);
1495 dbus_message_iter_get_basic(&value_iter, &mic_gain);
1497 _bt_send_event(BT_HEADSET_EVENT, BLUETOOTH_EVENT_AG_MIC_GAIN,
1498 DBUS_TYPE_INT32, &result,
1499 DBUS_TYPE_STRING, &address,
1500 DBUS_TYPE_UINT16, &mic_gain,
1507 void _bt_handle_agent_event(DBusMessage *msg)
1509 const char *member = dbus_message_get_member(msg);
1510 int result = BLUETOOTH_ERROR_NONE;
1511 char *address = NULL;
1515 ret_if(member == NULL);
1517 if (strcasecmp(member, "ObexAuthorize") == 0) {
1518 __bt_get_agent_signal_info(msg, &address, &name, &uuid);
1520 _bt_send_event(BT_OPP_SERVER_EVENT,
1521 BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE,
1522 DBUS_TYPE_INT32, &result,
1523 DBUS_TYPE_STRING, &address,
1524 DBUS_TYPE_STRING, &name,
1526 } else if (strcasecmp(member, "RfcommAuthorize") == 0) {
1527 bt_rfcomm_server_info_t *server_info;
1529 __bt_get_agent_signal_info(msg, &address, &name, &uuid);
1531 server_info = _bt_rfcomm_get_server_info_using_uuid(uuid);
1532 ret_if(server_info == NULL);
1533 ret_if(server_info->server_type != BT_CUSTOM_SERVER);
1535 _bt_send_event(BT_RFCOMM_SERVER_EVENT,
1536 BLUETOOTH_EVENT_RFCOMM_AUTHORIZE,
1537 DBUS_TYPE_INT32, &result,
1538 DBUS_TYPE_STRING, &address,
1539 DBUS_TYPE_STRING, &uuid,
1540 DBUS_TYPE_STRING, &name,
1541 DBUS_TYPE_INT16, &server_info->control_fd,
1546 static int __bt_get_object_path(DBusMessage *msg, char **path)
1548 DBusMessageIter item_iter;
1550 dbus_message_iter_init(msg, &item_iter);
1552 if (dbus_message_iter_get_arg_type(&item_iter)
1553 != DBUS_TYPE_OBJECT_PATH) {
1554 BT_ERR("This is bad format dbus\n");
1555 return BLUETOOTH_ERROR_INTERNAL;
1558 dbus_message_iter_get_basic(&item_iter, path);
1561 return BLUETOOTH_ERROR_INTERNAL;
1563 return BLUETOOTH_ERROR_NONE;
1566 static DBusHandlerResult __bt_manager_event_filter(DBusConnection *conn,
1567 DBusMessage *msg, void *data)
1569 const char *member = dbus_message_get_member(msg);
1570 bt_event_type_t bt_event;
1572 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
1573 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1575 retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1577 if (strcasecmp(member, "InterfacesAdded") == 0) {
1578 char *object_path = NULL;
1580 BT_DBG("InterfacesAdded");
1582 if (__bt_get_object_path(msg, &object_path)) {
1583 BT_ERR("Fail to get the path");
1584 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1587 if (strcasecmp(object_path, BT_BLUEZ_HCI_PATH) == 0) {
1588 _bt_handle_adapter_added();
1590 bt_event = __bt_parse_event(msg);
1592 if (bt_event == BT_DEVICE_EVENT) {
1593 bt_remote_dev_info_t *dev_info;
1594 int result = BLUETOOTH_ERROR_NONE;
1596 retv_if(_bt_is_discovering() == FALSE,
1597 DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1599 dev_info = __bt_parse_interface(msg);
1601 if (dev_info == NULL) {
1602 BT_ERR("Fail to parse the properies");
1604 DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1607 if (dev_info->name == NULL)
1608 dev_info->name = g_strdup("");
1610 _bt_send_event(BT_ADAPTER_EVENT,
1611 BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND,
1612 DBUS_TYPE_INT32, &result,
1613 DBUS_TYPE_STRING, &dev_info->address,
1614 DBUS_TYPE_UINT32, &dev_info->class,
1615 DBUS_TYPE_INT16, &dev_info->rssi,
1616 DBUS_TYPE_STRING, &dev_info->name,
1617 DBUS_TYPE_BOOLEAN, &dev_info->paired,
1619 &dev_info->connected,
1620 DBUS_TYPE_BOOLEAN, &dev_info->trust,
1621 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
1622 &dev_info->uuids, dev_info->uuid_count,
1625 _bt_free_device_info(dev_info);
1626 }else if (bt_event == BT_MEDIA_TRANSFER_EVENT) {
1627 __bt_parse_audio_properties(msg);
1630 } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
1631 BT_DBG("InterfacesRemoved");
1632 bt_event = __bt_parse_remove_event(msg);
1634 if (bt_event == BT_MEDIA_TRANSFER_EVENT){
1635 _bt_parse_audio_remove_properties(msg);
1637 _bt_handle_adapter_event(msg);
1639 } else if (strcasecmp(member, "NameOwnerChanged") == 0) {
1642 char *previous = NULL;
1643 char *current = NULL;
1645 if (__bt_get_owner_info(msg, &name, &previous, ¤t)) {
1646 BT_ERR("Fail to get the owner info");
1647 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1650 if (*current != '\0')
1651 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1653 if (strcasecmp(name, "org.bluez") == 0) {
1654 BT_DBG("Bluetoothd is terminated");
1655 _bt_handle_adapter_removed();
1658 _bt_obex_server_check_allocation(&value);
1660 if (value == TRUE) {
1661 /* Check if the obex server was terminated abnormally */
1662 _bt_obex_server_check_termination(name);
1665 _bt_rfcomm_server_check_existence(&value);
1667 if (value == TRUE) {
1668 /* The obex server was terminated abnormally */
1669 _bt_rfcomm_server_check_termination(name);
1671 } else if (dbus_message_has_interface(msg, BT_PROPERTIES_INTERFACE)) {
1672 _bt_handle_property_changed_event(msg);
1673 } else if (dbus_message_has_interface(msg, BT_ADAPTER_INTERFACE)) {
1674 _bt_handle_adapter_event(msg);
1675 } else if (dbus_message_has_interface(msg, BT_INPUT_INTERFACE)) {
1676 _bt_handle_input_event(msg);
1677 } else if (dbus_message_has_interface(msg, BT_NETWORK_SERVER_INTERFACE)) {
1678 _bt_handle_network_server_event(msg);
1679 } else if (dbus_message_has_interface(msg, BT_HFP_AGENT_INTERFACE)) {
1680 _bt_handle_headset_event(msg);
1681 } else if (dbus_message_has_interface(msg, BT_AGENT_INTERFACE)) {
1682 _bt_handle_agent_event(msg);
1683 } else if (dbus_message_has_interface(msg, BT_DEVICE_INTERFACE)) {
1684 _bt_handle_device_event(msg);
1687 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1690 static gboolean __bt_is_obexd_event(DBusMessage *msg)
1692 const char *member = dbus_message_get_member(msg);
1694 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
1697 retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1699 if (dbus_message_has_interface(msg, BT_PROPERTIES_INTERFACE)) {
1701 DBusMessageIter item_iter;
1702 const char *interface_name = NULL;
1704 dbus_message_iter_init(msg, &item_iter);
1706 if (dbus_message_iter_get_arg_type(&item_iter)
1707 != DBUS_TYPE_STRING) {
1708 BT_ERR("This is bad format dbus\n");
1712 dbus_message_iter_get_basic(&item_iter, &interface_name);
1714 retv_if(interface_name == NULL, FALSE);
1716 BT_DBG("interface: %s", interface_name);
1718 retv_if(dbus_message_iter_next(&item_iter) == FALSE, FALSE);
1720 retv_if(dbus_message_iter_get_arg_type(&item_iter) != DBUS_TYPE_ARRAY,
1723 if (strcasecmp(interface_name, BT_OBEX_TRANSFER_INTERFACE) == 0)
1730 void __bt_opc_property_changed_event(DBusMessageIter *msg_iter,
1733 DBusMessageIter value_iter;
1734 DBusMessageIter dict_iter;
1735 DBusMessageIter item_iter;
1736 const char *property = NULL;
1738 dbus_message_iter_recurse(msg_iter, &item_iter);
1740 if (dbus_message_iter_get_arg_type(&item_iter)
1741 != DBUS_TYPE_DICT_ENTRY) {
1742 BT_ERR("This is bad format dbus\n");
1746 dbus_message_iter_recurse(&item_iter, &dict_iter);
1748 dbus_message_iter_get_basic(&dict_iter, &property);
1749 ret_if(property == NULL);
1751 ret_if(!dbus_message_iter_next(&dict_iter));
1753 if (strcasecmp(property, "Status") == 0) {
1754 const char *status = NULL;
1755 dbus_message_iter_recurse(&dict_iter, &value_iter);
1756 dbus_message_iter_get_basic(&value_iter, &status);
1758 if(strcasecmp(status, "active") == 0){
1759 _bt_obex_client_started(path);
1760 }else if (strcasecmp(status, "complete") == 0) {
1761 _bt_obex_client_completed(TRUE);
1762 }else if (strcasecmp(status, "error") == 0){
1763 _bt_obex_client_completed(FALSE);
1765 } else if (strcasecmp(property, "Transferred") == 0) {
1766 static int transferred = 0;
1767 dbus_message_iter_recurse(&dict_iter, &value_iter);
1768 dbus_message_iter_get_basic(&value_iter, &transferred);
1770 _bt_obex_client_progress(transferred);
1774 void _bt_opc_property_changed_event(DBusMessage *msg)
1776 DBusMessageIter item_iter;
1777 const char *member = dbus_message_get_member(msg);
1778 const char *interface_name = NULL;
1780 ret_if(member == NULL);
1782 dbus_message_iter_init(msg, &item_iter);
1784 if (dbus_message_iter_get_arg_type(&item_iter)
1785 != DBUS_TYPE_STRING) {
1786 BT_ERR("This is bad format dbus\n");
1790 dbus_message_iter_get_basic(&item_iter, &interface_name);
1792 ret_if(interface_name == NULL);
1794 BT_DBG("interface: %s", interface_name);
1796 ret_if(dbus_message_iter_next(&item_iter) == FALSE);
1798 ret_if(dbus_message_iter_get_arg_type(&item_iter) != DBUS_TYPE_ARRAY);
1800 if (strcasecmp(interface_name, BT_OBEX_TRANSFER_INTERFACE) == 0) {
1801 __bt_opc_property_changed_event(&item_iter,
1802 dbus_message_get_path(msg));
1804 BT_DBG("No bluez interface");
1808 static gboolean __bt_is_obexd_client_event(DBusMessage *msg)
1810 const char *member = dbus_message_get_member(msg);
1812 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
1815 retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1817 if (dbus_message_has_interface(msg, BT_PROPERTIES_INTERFACE)) {
1818 DBusMessageIter item_iter;
1819 const char *interface_name = NULL;
1821 dbus_message_iter_init(msg, &item_iter);
1823 if (dbus_message_iter_get_arg_type(&item_iter)
1824 != DBUS_TYPE_STRING) {
1825 BT_ERR("This is bad format dbus\n");
1829 dbus_message_iter_get_basic(&item_iter, &interface_name);
1831 retv_if(interface_name == NULL, FALSE);
1833 BT_DBG("interface: %s", interface_name);
1835 retv_if(dbus_message_iter_next(&item_iter) == FALSE,
1838 retv_if(dbus_message_iter_get_arg_type(&item_iter)
1839 != DBUS_TYPE_ARRAY, FALSE);
1841 if (strcasecmp(interface_name,
1842 BT_OBEX_TRANSFER_INTERFACE) == 0)
1849 static DBusHandlerResult __bt_opc_event_filter(DBusConnection *conn,
1850 DBusMessage *msg, void *data)
1852 const char *member = dbus_message_get_member(msg);
1854 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
1855 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1857 retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1859 if (strcasecmp(member, "InterfacesAdded") == 0) {
1860 BT_DBG("InterfacesAdded");
1861 }else if (strcasecmp(member, "InterfacesRemoved") == 0) {
1862 char *object_path = NULL;
1864 if (__bt_get_object_path(msg, &object_path)) {
1865 BT_ERR("Fail to get the path");
1866 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1869 BT_DBG("object_path =%s",object_path);
1871 if (strncmp(object_path, BT_SESSION_BASEPATH_CLIENT,
1872 strlen(BT_SESSION_BASEPATH_CLIENT)) != 0
1873 || strstr(object_path, "transfer") == NULL)
1874 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1876 _bt_sending_files();
1878 }else if (__bt_is_obexd_client_event(msg) == TRUE){
1879 const char *path = dbus_message_get_path(msg);
1881 if (strncmp(path, BT_SESSION_BASEPATH_CLIENT,
1882 strlen(BT_SESSION_BASEPATH_CLIENT)) != 0)
1883 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1885 _bt_opc_property_changed_event(msg);
1888 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1891 static DBusHandlerResult __bt_obexd_event_filter(DBusConnection *conn,
1892 DBusMessage *msg, void *data)
1894 const char *member = dbus_message_get_member(msg);
1896 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
1897 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1899 retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1901 if (__bt_is_obexd_event(msg) == TRUE){
1902 const char *path = dbus_message_get_path(msg);
1904 if (strncmp(path, BT_SESSION_BASEPATH_SERVER,
1905 strlen(BT_SESSION_BASEPATH_SERVER)) != 0)
1906 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1908 _bt_handle_property_changed_event(msg);
1911 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1914 int _bt_register_service_event(DBusGConnection *g_conn, int event_type)
1916 DBusError dbus_error;
1917 char *match1 = NULL;
1918 char *match2 = NULL;
1919 char *match3 = NULL;
1920 char *match4 = NULL;
1921 DBusConnection *conn;
1922 DBusHandleMessageFunction event_func = NULL;
1924 retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
1926 conn = dbus_g_connection_get_connection(g_conn);
1927 retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
1929 switch (event_type) {
1930 case BT_MANAGER_EVENT:
1931 event_func = __bt_manager_event_filter;
1932 match1 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
1933 BT_MANAGER_INTERFACE,
1934 BT_INTERFACES_ADDED);
1936 match2 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
1937 BT_MANAGER_INTERFACE,
1938 BT_INTERFACES_REMOVED);
1940 match3 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
1941 BT_FREEDESKTOP_INTERFACE,
1942 BT_NAME_OWNER_CHANGED);
1944 match4 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
1945 BT_PROPERTIES_INTERFACE,
1946 BT_PROPERTIES_CHANGED);
1948 case BT_DEVICE_EVENT:
1949 match1 = g_strdup_printf(EVENT_MATCH_RULE,
1950 BT_DEVICE_INTERFACE);
1953 match1 = g_strdup_printf(EVENT_MATCH_RULE,
1954 BT_INPUT_INTERFACE);
1956 case BT_NETWORK_EVENT:
1957 match1 = g_strdup_printf(EVENT_MATCH_RULE,
1958 BT_NETWORK_SERVER_INTERFACE);
1960 match2 = g_strdup_printf(EVENT_MATCH_RULE,
1961 BT_NETWORK_CLIENT_INTERFACE);
1963 case BT_HEADSET_EVENT:
1964 match1 = g_strdup_printf(EVENT_MATCH_RULE,
1965 BT_HFP_AGENT_INTERFACE);
1967 match2 = g_strdup_printf(EVENT_MATCH_RULE,
1970 case BT_OPP_SERVER_EVENT:
1971 event_func = __bt_obexd_event_filter;
1972 match1 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
1973 BT_PROPERTIES_INTERFACE,
1974 BT_PROPERTIES_CHANGED);
1976 case BT_OPP_CLIENT_EVENT:
1977 event_func = __bt_opc_event_filter;
1978 match1 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
1979 BT_PROPERTIES_INTERFACE,
1980 BT_PROPERTIES_CHANGED);
1982 match2 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
1983 BT_MANAGER_INTERFACE,
1984 BT_INTERFACES_ADDED);
1986 match3 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
1987 BT_MANAGER_INTERFACE,
1988 BT_INTERFACES_REMOVED);
1991 BT_ERR("Unknown event");
1992 return BLUETOOTH_ERROR_INTERNAL;
1996 if (!dbus_connection_add_filter(conn, event_func,
1998 BT_ERR("Fail to add filter");
2003 dbus_error_init(&dbus_error);
2006 dbus_bus_add_match(conn, match1, &dbus_error);
2008 if (dbus_error_is_set(&dbus_error)) {
2009 BT_ERR("Fail to add match: %s\n", dbus_error.message);
2010 dbus_error_free(&dbus_error);
2015 dbus_bus_add_match(conn, match2, &dbus_error);
2017 if (dbus_error_is_set(&dbus_error)) {
2018 BT_ERR("Fail to add match: %s\n", dbus_error.message);
2019 dbus_error_free(&dbus_error);
2024 dbus_bus_add_match(conn, match3, &dbus_error);
2026 if (dbus_error_is_set(&dbus_error)) {
2027 BT_ERR("Fail to add match: %s\n", dbus_error.message);
2028 dbus_error_free(&dbus_error);
2033 dbus_bus_add_match(conn, match4, &dbus_error);
2035 if (dbus_error_is_set(&dbus_error)) {
2036 BT_ERR("Fail to add match: %s\n", dbus_error.message);
2037 dbus_error_free(&dbus_error);
2046 return BLUETOOTH_ERROR_NONE;
2052 return BLUETOOTH_ERROR_INTERNAL;
2055 void _bt_unregister_service_event(DBusGConnection *g_conn, int event_type)
2057 DBusConnection *conn;
2058 DBusHandleMessageFunction event_func;
2060 ret_if(g_conn == NULL);
2061 conn = dbus_g_connection_get_connection(g_conn);
2063 switch (event_type) {
2064 case BT_MANAGER_EVENT:
2065 event_func = __bt_manager_event_filter;
2067 case BT_OPP_SERVER_EVENT:
2068 event_func = __bt_obexd_event_filter;
2070 case BT_OPP_CLIENT_EVENT:
2071 event_func = __bt_opc_event_filter;
2074 BT_ERR("Unknown event");
2078 ret_if(conn == NULL);
2080 dbus_connection_remove_filter(conn, event_func, NULL);
2083 static int __bt_init_manager_receiver(void)
2085 GError *error = NULL;
2087 if (manager_conn == NULL) {
2088 manager_conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error);
2089 if (error != NULL) {
2090 BT_ERR("ERROR: Can't get on system bus [%s]", error->message);
2091 g_error_free(error);
2093 retv_if(manager_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
2096 if (_bt_register_service_event(manager_conn,
2097 BT_MANAGER_EVENT) != BLUETOOTH_ERROR_NONE)
2100 if (_bt_register_service_event(manager_conn,
2101 BT_DEVICE_EVENT) != BLUETOOTH_ERROR_NONE)
2104 if (_bt_register_service_event(manager_conn,
2105 BT_HID_EVENT) != BLUETOOTH_ERROR_NONE)
2108 if (_bt_register_service_event(manager_conn,
2109 BT_HEADSET_EVENT) != BLUETOOTH_ERROR_NONE)
2112 if (_bt_register_service_event(manager_conn,
2113 BT_NETWORK_EVENT) != BLUETOOTH_ERROR_NONE)
2116 return BLUETOOTH_ERROR_NONE;
2119 dbus_g_connection_unref(manager_conn);
2120 manager_conn = NULL;
2123 return BLUETOOTH_ERROR_INTERNAL;
2126 static int __bt_init_obexd_receiver(void)
2128 GError *error = NULL;
2130 if (obexd_conn == NULL) {
2131 obexd_conn = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
2132 if (error != NULL) {
2133 BT_ERR("ERROR: Can't get on session bus [%s]", error->message);
2134 g_error_free(error);
2136 retv_if(obexd_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
2139 if (_bt_register_service_event(obexd_conn,
2140 BT_OPP_SERVER_EVENT) != BLUETOOTH_ERROR_NONE) {
2141 dbus_g_connection_unref(obexd_conn);
2143 return BLUETOOTH_ERROR_INTERNAL;
2146 return BLUETOOTH_ERROR_NONE;
2149 /* To receive the event from bluez */
2150 int _bt_init_service_event_receiver(void)
2154 result = __bt_init_manager_receiver();
2155 retv_if(result != BLUETOOTH_ERROR_NONE, result);
2157 result = __bt_init_obexd_receiver();
2158 if (result != BLUETOOTH_ERROR_NONE)
2159 BT_ERR("Fail to init obexd receiver");
2161 return BLUETOOTH_ERROR_NONE;
2164 void _bt_deinit_service_event_reciever(void)
2166 _bt_unregister_service_event(manager_conn, BT_MANAGER_EVENT);
2168 _bt_unregister_service_event(obexd_conn, BT_OPP_SERVER_EVENT);
2171 dbus_g_connection_unref(manager_conn);
2172 manager_conn = NULL;
2176 dbus_g_connection_unref(obexd_conn);
2181 g_source_remove(event_id);
2184 int _bt_opp_client_event_init(void)
2186 GError *error = NULL;
2188 if (opc_obexd_conn == NULL) {
2189 opc_obexd_conn = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
2190 if (error != NULL) {
2191 BT_ERR("ERROR: Can't get on session bus [%s]",
2193 g_error_free(error);
2196 retv_if(opc_obexd_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
2199 if (_bt_register_service_event(opc_obexd_conn,
2200 BT_OPP_CLIENT_EVENT) != BLUETOOTH_ERROR_NONE) {
2201 dbus_g_connection_unref(opc_obexd_conn);
2202 opc_obexd_conn = NULL;
2203 return BLUETOOTH_ERROR_INTERNAL;
2206 return BLUETOOTH_ERROR_NONE;
2209 void _bt_opp_client_event_deinit(void)
2211 if (opc_obexd_conn) {
2212 _bt_unregister_service_event(opc_obexd_conn,
2213 BT_OPP_CLIENT_EVENT);
2214 dbus_g_connection_unref(opc_obexd_conn);
2215 opc_obexd_conn = NULL;
2219 void _bt_get_temp_remote_devinfo(void)
2221 GArray *devinfo = NULL;
2222 bt_remote_dev_info_t dev_info;
2223 int result, size, i;
2225 devinfo = g_array_new(FALSE, FALSE, sizeof(gchar));
2227 result = _bt_get_remote_found_devices(&devinfo);
2229 if (result != BLUETOOTH_ERROR_NONE)
2231 BT_DBG("_bt_get_temp_remote_devinfo failed with [%d]",result);
2235 size = devinfo->len;
2236 size = (devinfo->len) / sizeof(bt_remote_dev_info_t);
2238 for (i=0; i<size; i++)
2240 dev_info = g_array_index(devinfo,
2241 bt_remote_dev_info_t, i);
2243 _bt_send_event(BT_ADAPTER_EVENT,
2244 BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND,
2245 DBUS_TYPE_INT32, &result,
2246 DBUS_TYPE_STRING, &dev_info.address,
2247 DBUS_TYPE_UINT32, &dev_info.class,
2248 DBUS_TYPE_INT16, &dev_info.rssi,
2249 DBUS_TYPE_STRING, &dev_info.name,
2250 DBUS_TYPE_BOOLEAN, &dev_info.paired,
2251 DBUS_TYPE_BOOLEAN, &dev_info.connected,
2252 DBUS_TYPE_BOOLEAN, &dev_info.trust,
2253 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
2254 &dev_info.uuids, dev_info.uuid_count,
2259 g_array_free(devinfo, TRUE);