2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
22 #include <vconf-internal-bt-keys.h>
24 #include "bluetooth-api.h"
25 #include "bt-internal-types.h"
27 #include "bt-service-common.h"
28 #include "bt-service-event.h"
29 #include "bt-service-main.h"
30 #include "bt-service-core-device.h"
31 #include "bt-service-obex-server.h"
32 #include "bt-service-obex-agent.h"
33 #include "bt-service-pbap.h"
34 #include "bt-service-opp-client.h"
35 #include "bt-service-map-client.h"
36 #include "bt-service-core-adapter.h"
38 #ifdef TIZEN_FEATURE_BT_DPM
39 #include "bt-service-dpm.h"
42 #define DBUS_TIMEOUT 20 * 1000 /* 20 Sec */
43 static GDBusConnection *manager_conn;
44 static GDBusConnection *obexd_conn;
45 static GDBusConnection *opc_obexd_conn;
46 static GDBusConnection *map_obexd_conn;
48 static GList *p_cache_list = NULL;
50 static guint event_id;
52 static guint session_reinit_timer;
55 bt_remote_dev_info_t *dev_info;
59 * obexd connection type
67 OBEX_PCSUITE = (1 << 6),
68 OBEX_SYNCEVOLUTION = (1 << 7),
71 } bluetooth_obex_connection_type_t;
74 void _bt_handle_property_changed_event(GVariant *msg, const char *object_path);
75 void _bt_opc_property_changed_event(GVariant *msg, char *path);
76 void _bt_map_property_changed_event(GVariant *msg, const char *path);
77 int _bt_register_service_event(GDBusConnection *g_conn, int event_type);
78 void _bt_unregister_service_event(GDBusConnection *g_conn, int event_type);
79 void _bt_opp_client_event_deinit(void);
80 void _bt_map_client_event_deinit(void);
81 void _bt_map_on_transfer_finished(const char *transfer_object_path, const int error);
83 static void __bt_free_cache_info(bt_cache_info_t *cache_info)
85 ret_if(cache_info == NULL);
86 _bt_free_remote_dev(cache_info->dev_info);
91 /* Temp Adapter changes required to make OBEX work for handling device events here ,
92 This code will be removed and moved to OAL Event Handling part .
96 static void __bt_get_uuids(GVariant *value, bt_remote_dev_info_t *info)
98 ret_if(value == NULL);
101 gsize uuid_count = 0;
103 info->uuids = g_variant_dup_strv(value, &uuid_count);
104 info->uuid_count = (unsigned int)uuid_count;
106 BT_DBG("uuid count : %d", uuid_count);
110 void _bt_convert_addr_string_to_secure_string(char *addr,
115 ret_if(address == NULL);
116 ret_if(addr == NULL);
118 len = strlen(address);
119 ret_if(len != BT_ADDRESS_STRING_SIZE - 1);
121 strncpy(addr, address, len);
129 bt_status_t _bt_adapter_get_status_for_Obex(void)
131 int value = VCONFKEY_BT_STATUS_OFF;
133 /* check VCONFKEY_BT_STATUS */
134 if (vconf_get_int(VCONFKEY_BT_STATUS, &value) != 0) {
135 BT_ERR("fail to get vconf key!");
136 return BLUETOOTH_ADAPTER_DISABLED;
142 static int __bt_get_owner_info(GVariant *msg, char **name,
143 char **previous, char **current)
145 g_variant_get(msg, "(sss)", name, previous, current);
146 return BLUETOOTH_ERROR_NONE;
149 static int __bt_get_agent_signal_info(GVariant *msg, char **address,
150 char **name, char **uuid)
152 g_variant_get(msg, "(sss)", address, name, uuid);
153 return BLUETOOTH_ERROR_NONE;
156 void __bt_update_remote_cache_devinfo(const char *address, gboolean paired_status)
160 ret_if(address == NULL);
163 bt_cache_info_t *cache_info;
164 bt_remote_dev_info_t *dev_info;
166 node = g_list_first(p_cache_list);
168 while (node != NULL) {
169 cache_info = (bt_cache_info_t *)node->data;
171 if (cache_info == NULL) {
172 node = g_list_next(node);
176 dev_info = cache_info->dev_info;
177 if (strcasecmp(dev_info->address,
179 BT_DBG("Device Found");
180 if (paired_status == TRUE)
181 cache_info->dev_info->paired = TRUE;
183 cache_info->dev_info->paired = FALSE;
186 node = g_list_next(node);
191 gboolean __bt_handle_is_flight_mode_enabled(void)
193 if (TIZEN_FEATURE_FLIGHTMODE_ENABLED) {
194 int is_flight_mode = 0;
196 ret = vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &is_flight_mode);
198 BT_ERR("vconf_get_bool failed");
200 return (is_flight_mode == 0) ? FALSE : TRUE;
206 void _bt_handle_adapter_event(GVariant *msg, const char *member)
209 ret_if(member == NULL);
211 if (strcasecmp(member, "DeviceCreated") == 0) {
212 char *object_path = NULL;
214 ret_if(_bt_is_device_creating() == FALSE);
216 /* Bonding from remote device */
217 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
219 g_variant_get(msg, "(&o)", &object_path);
220 _bt_convert_device_path_to_address((const char*)object_path, address);
223 } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
224 char *object_path = NULL;
226 bt_cache_info_t *cache_info;
227 bt_remote_dev_info_t *dev_info;
230 /* Bonding from remote device */
231 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
233 g_variant_get(msg, "(&o)", &object_path);
235 _bt_convert_device_path_to_address((const char *)object_path, address);
237 node = g_list_first(p_cache_list);
239 while (node != NULL) {
240 cache_info = (bt_cache_info_t *)node->data;
242 if (cache_info == NULL) {
243 node = g_list_next(node);
247 dev_info = cache_info->dev_info;
248 if (strcasecmp(dev_info->address,
250 p_cache_list = g_list_remove(p_cache_list,
252 __bt_free_cache_info(cache_info);
255 node = g_list_next(node);
258 } else if (strcasecmp(member, BT_HARDWARE_ERROR) == 0) {
259 BT_ERR_C("### Hardware error received from BLUEZ");
260 } else if (strcasecmp(member, BT_TX_TIMEOUT_ERROR) == 0) {
261 BT_ERR_C("### Tx timeout error received from BLUEZ");
265 static void __bt_obex_property_changed_event(GVariant *msg, const char *path)
269 GVariantIter value_iter;
270 GVariant *child = NULL, *val = NULL;
271 char *property = NULL;
272 g_variant_iter_init(&value_iter, msg);
273 while ((child = g_variant_iter_next_value(&value_iter))) {
274 g_variant_get(child, "{sv}", &property, &val);
276 ret_if(property == NULL);
278 BT_DBG("property :%s", property);
280 if (strcasecmp(property, "Status") == 0) {
282 g_variant_get(val, "s", &status);
284 if (strcasecmp(status, "active") == 0) {
285 _bt_obex_transfer_started(path);
286 } else if (strcasecmp(status, "complete") == 0) {
287 _bt_obex_transfer_completed(path, TRUE);
288 _bt_pbap_obex_transfer_completed(path, TRUE);
289 } else if (strcasecmp(status, "error") == 0) {
290 _bt_obex_transfer_completed(path, FALSE);
291 _bt_pbap_obex_transfer_completed(path, FALSE);
294 } else if (strcasecmp(property, "Transferred") == 0) {
295 guint64 transferred = 0;
296 /* As Transferred is expected guint64 so change int to guint64 and
297 * eariler transferred is static because of it can overwrite data
298 * on present on opc_obex_conn or obexd_conn as these are
299 * static memory are in sequential */
300 g_variant_get(val, "t", &transferred);
302 _bt_obex_transfer_progress(path, transferred);
304 /* TODO: MAP, "Complete"? see above */
306 g_variant_unref(val);
307 g_variant_unref(child);
313 static void __bt_device_remote_connected_properties(
314 bt_remote_dev_info_t *remote_dev_info,
315 char *address, gboolean connected)
317 int result = BLUETOOTH_ERROR_NONE;
319 GVariant *param = NULL;
322 if (remote_dev_info->uuid_count > 0) {
323 for (i = 0; i < remote_dev_info->uuid_count; i++) {
324 char *uuid = remote_dev_info->uuids[i];
325 if (strcasecmp(uuid, HID_UUID) == 0) {
326 int event = BLUETOOTH_EVENT_NONE;
328 event = (connected == TRUE) ?
329 BLUETOOTH_HID_CONNECTED :
330 BLUETOOTH_HID_DISCONNECTED;
331 param = g_variant_new("(is)", result,
333 _bt_send_event(BT_HID_EVENT, event,
343 bt_remote_dev_info_t *_bt_get_remote_device_info_by_object_path(
344 const char *object_path)
346 bt_remote_dev_info_t *dev_info;
347 GDBusProxy *adapter_proxy;
348 GDBusProxy *device_proxy;
353 GDBusConnection *conn;
354 GError *error = NULL;
355 GVariant *result = NULL;
356 GVariantIter *value_iter;
360 adapter_proxy = _bt_get_adapter_proxy();
361 retv_if(adapter_proxy == NULL, NULL);
363 retv_if(object_path == NULL, NULL);
365 conn = _bt_gdbus_get_system_gconn();
367 BT_ERR("conn == NULL");
371 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
372 NULL, BT_BLUEZ_NAME, object_path,
373 BT_PROPERTIES_INTERFACE, NULL, NULL);
375 retv_if(device_proxy == NULL, NULL);
377 result = g_dbus_proxy_call_sync(device_proxy, "GetAll",
378 g_variant_new("(s)", BT_DEVICE_INTERFACE),
379 G_DBUS_CALL_FLAGS_NONE,
384 g_object_unref(device_proxy);
386 dev_info = g_malloc0(sizeof(bt_remote_dev_info_t));
388 if (result != NULL) {
389 g_variant_get(result , "(@a{sv})", &value);
390 g_variant_unref(result);
392 tmp_value = g_variant_lookup_value(value, "Alias", G_VARIANT_TYPE_STRING);
394 g_variant_get(tmp_value, "s", &name);
395 g_variant_unref(tmp_value);
397 DBG_SECURE("Alias Name [%s]", name);
399 tmp_value = g_variant_lookup_value(value, "Name", G_VARIANT_TYPE_STRING);
400 g_variant_get(tmp_value, "s", &name);
401 g_variant_unref(tmp_value);
404 tmp_value = g_variant_lookup_value(value, "IsAliasSet", G_VARIANT_TYPE_BOOLEAN);
406 dev_info->is_alias_set = g_variant_get_boolean(tmp_value);
407 g_variant_unref(tmp_value);
409 dev_info->is_alias_set = FALSE;
411 BT_DBG("IsAliasSet: [%s]", dev_info->is_alias_set ? "TRUE" : "FALSE");
413 tmp_value = g_variant_lookup_value(value, "Class", G_VARIANT_TYPE_UINT32);
415 dev_info->class = g_variant_get_uint32(tmp_value);
416 g_variant_unref(tmp_value);
420 tmp_value = g_variant_lookup_value(value, "Connected", G_VARIANT_TYPE_BYTE);
422 dev_info->connected = g_variant_get_byte(tmp_value);
423 g_variant_unref(tmp_value);
425 dev_info->connected = BLUETOOTH_CONNECTED_LINK_NONE;
426 BT_DBG("connected link : %d", dev_info->connected);
428 tmp_value = g_variant_lookup_value(value, "Trusted", G_VARIANT_TYPE_BOOLEAN);
430 dev_info->trust = g_variant_get_boolean(tmp_value);
431 g_variant_unref(tmp_value);
433 dev_info->trust = FALSE;
435 tmp_value = g_variant_lookup_value(value, "Paired", G_VARIANT_TYPE_BOOLEAN);
437 dev_info->paired = g_variant_get_boolean(tmp_value);
438 g_variant_unref(tmp_value);
440 dev_info->paired = FALSE;
442 tmp_value = g_variant_lookup_value(value, "RSSI", G_VARIANT_TYPE_INT16);
444 dev_info->rssi = g_variant_get_int16(tmp_value);
445 g_variant_unref(tmp_value);
449 tmp_value = g_variant_lookup_value(value, "LastAddrType", G_VARIANT_TYPE_BYTE);
451 dev_info->addr_type = g_variant_get_byte(tmp_value);
452 g_variant_unref(tmp_value);
454 dev_info->addr_type = 0;
456 tmp_value = g_variant_lookup_value(value, "UUIDs", G_VARIANT_TYPE_STRING_ARRAY);
458 __bt_get_uuids(tmp_value, dev_info);
459 g_variant_unref(tmp_value);
462 tmp_value = g_variant_lookup_value(value, "ManufacturerDataLen", G_VARIANT_TYPE_UINT16);
464 dev_info->manufacturer_data_len = g_variant_get_uint16(tmp_value);
465 if (dev_info->manufacturer_data_len > BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX) {
466 BT_ERR("manufacturer_data_len is too long(len = %d)", dev_info->manufacturer_data_len);
467 dev_info->manufacturer_data_len = BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX;
469 g_variant_unref(tmp_value);
471 dev_info->manufacturer_data_len = 0;
473 tmp_value = g_variant_lookup_value(value, "ManufacturerData", G_VARIANT_TYPE_ARRAY);
475 if ((dev_info->manufacturer_data_len == 0) ||
476 dev_info->manufacturer_data_len != g_variant_get_size(tmp_value)) {
477 BT_ERR("manufacturer data length doesn't match");
478 dev_info->manufacturer_data_len = 0;
479 dev_info->manufacturer_data = NULL;
481 dev_info->manufacturer_data = g_malloc0(dev_info->manufacturer_data_len);
482 g_variant_get(tmp_value, "ay", &value_iter);
483 while (g_variant_iter_loop(value_iter, "y", &m_value))
484 dev_info->manufacturer_data[i++] = m_value;
486 g_variant_unref(tmp_value);
488 BT_INFO("manufacture data is not a G_VARIANT_TYPE_ARRAY ");
489 dev_info->manufacturer_data_len = 0;
490 dev_info->manufacturer_data = NULL;
493 tmp_value = g_variant_lookup_value(value, "Address", G_VARIANT_TYPE_STRING);
494 g_variant_get(tmp_value, "s", &address);
495 g_variant_unref(tmp_value);
497 dev_info->address = g_strdup(address);
498 dev_info->name = g_strdup(name);
500 g_variant_unref(value);
502 BT_ERR("result is NULL\n");
511 void _bt_handle_property_changed_event(GVariant *msg, const char *object_path)
513 char *interface_name = NULL;
514 GVariant *val = NULL;
516 g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, &val, NULL);
517 BT_DBG("_bt_handle_property_changed_event");
519 if (strcasecmp(interface_name, BT_OBEX_TRANSFER_INTERFACE) == 0) {
520 BT_DBG("BT_OBEX_TRANSFER_INTERFACE");
521 __bt_obex_property_changed_event(val,
524 g_variant_unref(val);
527 void __bt_opc_property_changed_event(GVariant *msg,
530 GVariantIter value_iter;
531 char *property = NULL;
532 GVariant *val = NULL;
533 GVariant *child = NULL;
535 g_variant_iter_init(&value_iter, msg);
536 if ((child = g_variant_iter_next_value(&value_iter))) {
537 g_variant_get(child, "{sv}", &property, &val);
538 ret_if(property == NULL);
540 if (strcasecmp(property, "Status") == 0) {
542 g_variant_get(val, "s", &status);
543 BT_DBG("Status is %s", status);
545 if (strcasecmp(status, "active") == 0)
546 _bt_obex_client_started(path);
547 else if (strcasecmp(status, "complete") == 0)
548 _bt_obex_client_completed(path, TRUE);
549 else if (strcasecmp(status, "error") == 0)
550 _bt_obex_client_completed(path, FALSE);
553 } else if (strcasecmp(property, "Transferred") == 0) {
554 guint64 transferred = 0;
555 g_variant_get(val, "t", &transferred);
557 _bt_obex_client_progress(path, transferred);
559 BT_DBG("property : [%s]", property);
562 g_variant_unref(child);
563 g_variant_unref(val);
567 void _bt_opc_property_changed_event(GVariant *msg, char *path)
569 char *interface_name = NULL;
570 GVariant *value = NULL;
571 g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, &value, NULL);
572 BT_INFO("interface_name = %s", interface_name);
573 if (strcasecmp(interface_name, BT_OBEX_TRANSFER_INTERFACE) == 0) {
574 __bt_opc_property_changed_event(value,
577 BT_DBG("interface_name : [%s]", interface_name);
579 g_variant_unref(value);
583 void __bt_map_property_changed_event(GVariant *msg,
587 GVariantIter value_iter;
588 char *property = NULL;
589 GVariant *val = NULL;
590 GVariant *child = NULL;
592 g_variant_iter_init(&value_iter, msg);
593 while ((child = g_variant_iter_next_value(&value_iter))) {
594 g_variant_get(child, "{sv}", &property, &val);
595 ret_if(property == NULL);
597 if (strcasecmp(property, "Status") == 0) {
599 g_variant_get(val, "s", &status);
600 BT_DBG("Status is %s", status);
602 if (strcasecmp(status, "active") == 0) {
603 BT_DBG("EVENT : STARTED");
604 // currently doing nothing
605 } else if (strcasecmp(status, "complete") == 0) {
606 BT_DBG("EVENT : COMPLETED");
607 _bt_map_on_transfer_finished(path, BLUETOOTH_ERROR_NONE);
608 } else if (strcasecmp(status, "error") == 0) {
609 BT_DBG("EVENT : FAILED");
610 _bt_map_on_transfer_finished(path, BLUETOOTH_ERROR_INTERNAL);
613 } else if (strcasecmp(property, "Transferred") == 0) {
614 guint64 transferred = 0;
615 g_variant_get(val, "t", &transferred);
617 BT_DBG("EVENT : PROGRESS CALLBACK");
618 // currently doing nothing - progress callback type is not used
620 BT_DBG("OTHER EVENT : property : [%s]", property);
623 g_variant_unref(child);
624 g_variant_unref(val);
628 void _bt_map_property_changed_event(GVariant *msg, const char *path)
630 BT_DBG("Entered _bt_map_property_changed_event");
631 char *interface_name = NULL;
632 GVariant *value = NULL;
633 g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, &value, NULL);
634 BT_INFO("interface_name = %s", interface_name);
635 if (strcasecmp(interface_name, BT_OBEX_TRANSFER_INTERFACE) == 0) {
636 __bt_map_property_changed_event(value,
639 BT_DBG("interface_name : [%s]", interface_name);
641 g_variant_unref(value);
645 void _bt_handle_agent_event(GVariant *msg, const char *member)
647 int result = BLUETOOTH_ERROR_NONE;
648 char *address = NULL;
651 GVariant *param = NULL;
652 ret_if(member == NULL);
654 if (strcasecmp(member, "ObexAuthorize") == 0) {
655 __bt_get_agent_signal_info(msg, &address, &name, &uuid);
656 param = g_variant_new("(iss)", result, address, name);
657 _bt_send_event(BT_OPP_SERVER_EVENT,
658 BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE,
660 /* TODO: MAP? see above */
666 static int __bt_get_object_path(GVariant *msg, char **path)
668 g_variant_get(msg, "(o*)", path, NULL);
670 return BLUETOOTH_ERROR_INTERNAL;
672 return BLUETOOTH_ERROR_NONE;
676 static void __bt_get_service_list(GVariant *value, bluetooth_device_info_t *dev)
683 ret_if(value == NULL);
686 dev->service_index = 0;
688 g_variant_get(value, "as", &iter);
689 while (g_variant_iter_loop(iter, "s", &uuid)) {
690 g_strlcpy(dev->uuids[i], uuid, BLUETOOTH_UUID_STRING_MAX);
691 parts = g_strsplit(uuid, "-", -1);
693 if (parts == NULL || parts[0] == NULL) {
698 dev->service_list_array[i] = g_ascii_strtoull(parts[0], NULL, 16);
701 dev->service_index++;
704 g_variant_iter_free(iter);
707 static int __bt_get_bonded_device_info(gchar *device_path,
708 bluetooth_device_info_t *dev_info)
710 GError *error = NULL;
711 GDBusProxy *device_proxy;
712 gchar *address = NULL;
714 unsigned int cod = 0;
716 gboolean trust = FALSE;
717 gboolean paired = FALSE;
718 guchar connected = 0;
719 GByteArray *manufacturer_data = NULL;
721 GDBusConnection *conn;
723 GVariantIter *property_iter;
727 GVariantIter *char_value_iter;
729 BT_CHECK_PARAMETER(device_path, return);
730 BT_CHECK_PARAMETER(dev_info, return);
732 conn = _bt_gdbus_get_system_gconn();
733 retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
735 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
739 BT_PROPERTIES_INTERFACE,
742 retv_if(device_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
744 result = g_dbus_proxy_call_sync(device_proxy,
746 g_variant_new("(s)", BT_DEVICE_INTERFACE),
747 G_DBUS_CALL_FLAGS_NONE,
753 BT_ERR("Error occured in Proxy call");
755 BT_ERR("Error occured in Proxy call (Error: %s)", error->message);
756 g_clear_error(&error);
758 g_object_unref(device_proxy);
759 return BLUETOOTH_ERROR_INTERNAL;
762 g_object_unref(device_proxy);
764 g_variant_get(result, "(a{sv})", &property_iter);
766 while (g_variant_iter_loop(property_iter, "{sv}", &key, &value)) {
767 if (!g_strcmp0(key, "Paired")) {
768 paired = g_variant_get_boolean(value);
769 } else if (!g_strcmp0(key, "Address")) {
770 g_variant_get(value, "s", &address);
771 } else if (!g_strcmp0(key, "Alias")) {
772 g_variant_get(value, "s", &name);
773 } else if (!g_strcmp0(key, "Name")) {
775 g_variant_get(value, "s", &name);
776 } else if (!g_strcmp0(key, "Class")) {
777 cod = g_variant_get_uint32(value);
778 } else if (!g_strcmp0(key, "Connected")) {
779 connected = g_variant_get_byte(value);
780 } else if (!g_strcmp0(key, "Trusted")) {
781 trust = g_variant_get_boolean(value);
782 } else if (!g_strcmp0(key, "RSSI")) {
783 rssi = g_variant_get_int16(value);
784 } else if (!g_strcmp0(key, "UUIDs")) {
785 __bt_get_service_list(value, dev_info);
786 } else if (!g_strcmp0(key, "ManufacturerDataLen")) {
787 dev_info->manufacturer_data.data_len = g_variant_get_uint16(value);
788 } else if (!g_strcmp0(key, "ManufacturerData")) {
789 manufacturer_data = g_byte_array_new();
790 g_variant_get(value, "ay", &char_value_iter);
791 while (g_variant_iter_loop(char_value_iter, "y", &char_value))
792 g_byte_array_append(manufacturer_data, &char_value, 1);
794 g_variant_iter_free(char_value_iter);
796 if (manufacturer_data) {
797 if (manufacturer_data->len > 0) {
798 memcpy(dev_info->manufacturer_data.data, manufacturer_data->data,
799 manufacturer_data->len);
802 g_byte_array_free(manufacturer_data, TRUE);
805 g_variant_iter_free(property_iter);
807 BT_DBG("trust: %d, paired: %d", trust, paired);
809 g_variant_unref(result);
811 if ((paired == FALSE) && (trust == FALSE)) {
814 return BLUETOOTH_ERROR_NOT_PAIRED;
817 _bt_convert_addr_string_to_type(dev_info->device_address.addr,
820 _bt_divide_device_class(&dev_info->device_class, cod);
822 g_strlcpy(dev_info->device_name.name, name,
823 BLUETOOTH_DEVICE_NAME_LENGTH_MAX+1);
825 dev_info->rssi = rssi;
826 dev_info->trust = trust;
827 dev_info->paired = paired;
828 dev_info->connected = connected;
829 ret = BLUETOOTH_ERROR_NONE;
836 int _bt_get_bonded_device_info(bluetooth_device_address_t *device_address,
837 bluetooth_device_info_t *dev_info)
839 char *object_path = NULL;
840 GDBusProxy *adapter_proxy;
841 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
842 int ret = BLUETOOTH_ERROR_NONE;
844 BT_CHECK_PARAMETER(device_address, return);
845 BT_CHECK_PARAMETER(dev_info, return);
847 adapter_proxy = _bt_get_adapter_proxy();
848 retv_if(adapter_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
850 _bt_convert_addr_type_to_string(address, device_address->addr);
852 object_path = _bt_get_device_object_path(address);
854 retv_if(object_path == NULL, BLUETOOTH_ERROR_NOT_PAIRED);
856 ret = __bt_get_bonded_device_info(object_path, dev_info);
863 char *_bt_get_bonded_device_name(char *address)
865 bt_remote_dev_info_t *dev_info;
867 retv_if(address == NULL, strdup(""));
869 dev_info = _bt_service_get_remote_dev_info(address);
870 retv_if(dev_info == NULL, strdup(""));
871 retv_if(dev_info->name == NULL, strdup(""));
873 return g_strdup(dev_info->name);
875 /* Temp Adapter Util changes to make OBEX work.
878 void _bt_handle_device_event(GVariant *msg, const char *member, const char *path)
881 int result = BLUETOOTH_ERROR_NONE;
883 char *dev_name = NULL;
884 // const char *property = NULL;
885 GVariant *param = NULL;
886 char secure_address[BT_ADDRESS_STRING_SIZE] = { 0 };
887 ret_if(path == NULL);
889 if (strcasecmp(member, "DeviceConnected") == 0) {
890 unsigned char addr_type = 0;
892 g_variant_get(msg, "(y)", &addr_type);
894 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
896 _bt_convert_device_path_to_address(path, address);
897 dev_name = _bt_get_bonded_device_name(address);
899 _bt_convert_addr_string_to_secure_string(secure_address, address);
900 BT_INFO("Address : %s Type : %d", secure_address, addr_type);
901 BT_ERR_C("### Connected [%s] [%s]", !addr_type ? "BREDR" : "LE",
902 !addr_type ? dev_name : secure_address);
905 _bt_logging_connection(TRUE, addr_type);
906 param = g_variant_new("(isy)", result, address, addr_type);
907 /*Send event to application*/
908 _bt_send_event(BT_DEVICE_EVENT,
909 BLUETOOTH_EVENT_DEVICE_CONNECTED,
912 } else if (strcasecmp(member, "Disconnected") == 0) {
913 unsigned char disc_reason = 0;
914 unsigned char addr_type = 0;
915 char *dev_name = NULL;
916 gboolean sending = FALSE;
918 g_variant_get(msg, "(yys)", &addr_type, &disc_reason, &dev_name);
920 result = disc_reason;
922 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
924 _bt_convert_device_path_to_address(path, address);
927 0x01 BDADDR_LE_PUBLIC
928 0x02 BDADDR_LE_RANDOM */
929 _bt_convert_addr_string_to_secure_string(secure_address, address);
930 BT_INFO("Address : %s Type : %d", secure_address, addr_type);
931 BT_ERR_C("### Disconnected [%s] [%d : %s] [%s]", !addr_type ? "BREDR" : "LE",
932 disc_reason, _bt_convert_disc_reason_to_string(disc_reason),
933 !addr_type ? dev_name : secure_address);
936 //_bt_headset_set_local_connection(FALSE);
937 _bt_logging_connection(FALSE, addr_type);
940 #ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
942 int bt_device_state = VCONFKEY_BT_DEVICE_NONE;
944 if (vconf_get_int(VCONFKEY_BT_DEVICE, &bt_device_state) != 0)
945 BT_ERR("vconf_get_int failed");
947 BT_INFO("conn_state[0x%x], adapter_state [%d]",
948 bt_device_state, _bt_adapter_get_status_for_Obex());
950 if (disc_reason == BLUETOOTH_ERROR_CONNECTION_TIMEOUT) {
951 _bt_audio_start_auto_connect(TRUE);
952 } else if (bt_device_state &
953 VCONFKEY_BT_DEVICE_A2DP_SOURCE_CONNECTED) {
954 BT_INFO("Disconnected due to turning BT off. Skip a address");
956 char *last_connected = NULL;
957 last_connected = vconf_get_str(BT_LAST_CONNECTED_DEVICE);
958 if (!g_strcmp0(address, last_connected))
959 _bt_audio_set_auto_connect_device_addr("");
961 free(last_connected);
966 /*Check for any OPP transfer on the device and cancel
969 _bt_obex_check_pending_transfer(address);
970 _bt_opp_client_is_sending(&sending);
972 _bt_opp_client_check_pending_transfer(address);
973 /* TODO: MAP? see above */
975 param = g_variant_new("(isy)", result, address, addr_type);
976 _bt_send_event(BT_DEVICE_EVENT,
977 BLUETOOTH_EVENT_DEVICE_DISCONNECTED,
980 } else if (strcasecmp(member, "ProfileStateChanged") == 0) {
982 char *profile_uuid = NULL;
983 bluetooth_device_address_t bd_addr;
985 g_variant_get(msg, "(si)", &profile_uuid, &state);
987 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
989 _bt_convert_device_path_to_address(path, address);
990 _bt_convert_addr_string_to_type(bd_addr.addr, address);
992 _bt_convert_addr_string_to_secure_string(secure_address, address);
993 BT_DBG("Address: %s", secure_address);
994 BT_DBG("Profile UUID: %s", profile_uuid);
995 BT_DBG("State: %d", state);
998 static gboolean __bt_parse_device_properties(GVariant *item,
999 bt_remote_dev_info_t *dev_info)
1008 g_variant_iter_init(&iter, item);
1009 while (g_variant_iter_loop(&iter, "{sv}", &key, &val)) {
1010 if (strcasecmp(key, "Address") == 0) {
1011 dev_info->address = g_variant_dup_string(val, &len);
1012 } else if (strcasecmp(key, "Class") == 0) {
1013 dev_info->class = g_variant_get_uint32(val);
1014 } else if (strcasecmp(key, "name") == 0) {
1015 if (dev_info->name == NULL)
1016 dev_info->name = g_variant_dup_string(val, &len);
1017 } else if (strcasecmp(key, "Connected") == 0) {
1018 dev_info->connected = g_variant_get_byte(val);
1019 } else if (strcasecmp(key, "paired") == 0) {
1020 dev_info->paired = g_variant_get_boolean(val);
1021 } else if (strcasecmp(key, "Trusted") == 0) {
1022 dev_info->trust = g_variant_get_boolean(val);
1023 } else if (strcasecmp(key, "RSSI") == 0) {
1024 dev_info->rssi = g_variant_get_int16(val);
1025 } else if (strcasecmp(key, "LastAddrType") == 0) {
1026 dev_info->addr_type = g_variant_get_byte(val);
1027 } else if (strcasecmp(key, "UUIDs") == 0) {
1031 size = g_variant_get_size(val);
1034 uuid_value = (char **)g_variant_get_strv(val, &size);
1035 if (dev_info->uuids == NULL)
1036 dev_info->uuids = g_malloc0(sizeof(char *) * size);
1038 for (i = 0; uuid_value[i] != NULL; i++) {
1039 dev_info->uuid_count++;
1040 dev_info->uuids[i] = g_strdup(uuid_value[i]);
1044 } else if (strcasecmp(key, "ManufacturerDataLen") == 0) {
1045 g_variant_get(val, "q", &dev_info->manufacturer_data_len);
1046 if (dev_info->manufacturer_data_len > BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX) {
1047 BT_ERR("manufacturer_data_len is too long(len = %d)", dev_info->manufacturer_data_len);
1048 dev_info->manufacturer_data_len = BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX;
1051 if (dev_info->manufacturer_data_len == 0)
1052 dev_info->manufacturer_data = g_strdup("");
1053 } else if (strcasecmp(key, "ManufacturerData") == 0) {
1056 GVariantIter *value_iter;
1059 len = g_variant_get_size(val);
1063 dev_info->manufacturer_data = g_malloc0(len);
1065 g_variant_get(val, "ay", &value_iter);
1066 while (g_variant_iter_loop(value_iter, "y", &m_value))
1067 dev_info->manufacturer_data[i++] = m_value;
1068 g_variant_iter_free(value_iter);
1076 static gboolean __bt_parse_interface(GVariant *msg,
1077 bt_remote_dev_info_t *dev_info)
1080 GVariant *optional_param = NULL;
1083 char *interface_name = NULL;
1084 GVariant *inner_iter = NULL;
1085 g_variant_get(msg, "(&o@a{sa{sv}})",
1086 &path, &optional_param);
1087 g_variant_iter_init(&iter, optional_param);
1089 retv_if(optional_param == NULL, FALSE);
1091 while ((child = g_variant_iter_next_value(&iter))) {
1092 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
1093 if (g_strcmp0(interface_name, BT_DEVICE_INTERFACE) == 0) {
1094 BT_DBG("Found a device: %s", path);
1095 if (__bt_parse_device_properties(inner_iter,
1096 dev_info) == FALSE) {
1097 g_variant_unref(inner_iter);
1098 g_variant_unref(child);
1099 g_variant_unref(optional_param);
1100 BT_ERR("Fail to parse the properies");
1103 g_variant_unref(inner_iter);
1104 g_variant_unref(child);
1105 g_variant_unref(optional_param);
1109 g_variant_unref(inner_iter);
1110 g_variant_unref(child);
1113 g_variant_unref(optional_param);
1118 static int __bt_parse_event(GVariant *msg)
1122 char *interface_name = NULL;
1123 GVariant *inner_iter = NULL;
1125 g_variant_iter_init(&iter, msg);
1127 while ((child = g_variant_iter_next_value(&iter))) {
1128 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
1129 if (g_strcmp0(interface_name,
1130 BT_DEVICE_INTERFACE) == 0) {
1131 g_variant_unref(inner_iter);
1132 g_variant_unref(child);
1133 return BT_DEVICE_EVENT;
1134 } else if (g_strcmp0(interface_name,
1135 BT_MEDIATRANSPORT_INTERFACE) == 0) {
1136 g_variant_unref(inner_iter);
1137 g_variant_unref(child);
1138 return BT_MEDIA_TRANSFER_EVENT;
1139 } else if (g_strcmp0(interface_name,
1140 BT_PLAYER_CONTROL_INTERFACE) == 0) {
1141 g_variant_unref(inner_iter);
1142 g_variant_unref(child);
1143 return BT_AVRCP_CONTROL_EVENT;
1145 g_variant_unref(inner_iter);
1146 g_variant_unref(child);
1152 static void __bt_manager_event_filter(GDBusConnection *connection,
1153 const gchar *sender_name,
1154 const gchar *object_path,
1155 const gchar *interface_name,
1156 const gchar *signal_name,
1157 GVariant *parameters,
1161 bt_event_type_t bt_event = 0x00;
1162 int result = BLUETOOTH_ERROR_NONE;
1164 char *obj_path = NULL;
1165 GVariant *param = NULL;
1166 #ifdef TIZEN_FEATURE_BT_DPM
1167 int desktop_state = DPM_BT_ERROR;
1170 if (signal_name == NULL)
1173 if (strcasecmp(signal_name, "InterfacesAdded") == 0) {
1174 g_variant_get(parameters, "(&o@a{sa{sv}})", &obj_path, &value);
1176 if (strcasecmp(obj_path, BT_BLUEZ_HCI_PATH) == 0) {
1177 if (!TIZEN_FEATURE_BT_USB_DONGLE) {
1178 if (_bt_register_obex_server() != BLUETOOTH_ERROR_NONE)
1179 BT_ERR("Fail to init obex server");
1182 bt_event = __bt_parse_event(value);
1183 if (bt_event == BT_DEVICE_EVENT) {
1184 bt_cache_info_t *cache_info;
1185 bt_remote_dev_info_t *dev_info;
1187 if(_bt_is_discovering() == FALSE) {
1188 g_variant_unref(value);
1192 cache_info = g_malloc0(sizeof(bt_cache_info_t));
1193 ret_if(cache_info == NULL);
1195 dev_info = g_malloc0(sizeof(bt_remote_dev_info_t));
1196 if (dev_info == NULL) {
1197 __bt_free_cache_info(cache_info);
1201 cache_info->dev_info = dev_info;
1203 if (__bt_parse_interface(parameters, dev_info) == FALSE) {
1204 BT_ERR("Fail to parse the properies");
1205 __bt_free_cache_info(cache_info);
1206 g_variant_unref(value);
1210 if (dev_info->addr_type != BDADDR_BREDR) {
1211 /* Whenever emit the property changed from bluez,
1212 some property doesn't reach to bt-service.
1213 So LE device is handled as AdvReport signal */
1214 __bt_free_cache_info(cache_info);
1215 g_variant_unref(value);
1219 if (dev_info->name == NULL)
1220 /* If Remote device name is NULL or still RNR is not done
1221 * then display address as name.
1223 dev_info->name = g_strdup(dev_info->address);
1225 #ifdef TIZEN_FEATURE_BT_DPM
1226 _bt_dpm_get_bluetooth_desktop_connectivity_state(&desktop_state);
1227 if (desktop_state == DPM_RESTRICTED) {
1228 bluetooth_device_class_t device_class;
1229 _bt_divide_device_class(&device_class, dev_info->class);
1230 BT_DBG("[%s]device_class.major_class : %d", dev_info->name, device_class.major_class);
1232 if (device_class.major_class ==
1233 BLUETOOTH_DEVICE_MAJOR_CLASS_COMPUTER) {
1234 __bt_free_cache_info(cache_info);
1235 g_variant_unref(value);
1241 GVariant *uuids = NULL;
1242 GVariantBuilder *builder = NULL;
1244 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1245 for (i = 0; i < dev_info->uuid_count; i++) {
1246 g_variant_builder_add(builder, "s",
1247 dev_info->uuids[i]);
1249 uuids = g_variant_new("as", builder);
1250 g_variant_builder_unref(builder);
1251 GVariant *manufacturer_data = NULL;
1252 manufacturer_data = g_variant_new_from_data(
1253 G_VARIANT_TYPE_BYTESTRING,
1254 dev_info->manufacturer_data,
1255 dev_info->manufacturer_data_len,
1257 param = g_variant_new("(isunsbub@asn@ay)", result,
1263 dev_info->connected,
1266 dev_info->manufacturer_data_len,
1268 _bt_send_event(BT_ADAPTER_EVENT,
1269 BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND,
1271 p_cache_list = g_list_append(p_cache_list, cache_info);
1272 } else if (bt_event == BT_AVRCP_CONTROL_EVENT) {
1273 BT_DBG("Device path : %s ", obj_path);
1274 //_bt_set_control_device_path(obj_path);
1277 g_variant_unref(value);
1278 } else if (strcasecmp(signal_name, "InterfacesRemoved") == 0) {
1279 if (TIZEN_FEATURE_BT_USB_DONGLE) {
1280 if (_bt_unregister_obex_server() != BLUETOOTH_ERROR_NONE)
1281 BT_ERR("Fail to unregister obex server");
1283 } else if (strcasecmp(signal_name, "NameOwnerChanged") == 0) {
1286 char *previous = NULL;
1287 char *current = NULL;
1289 if (__bt_get_owner_info(parameters, &name, &previous, ¤t)) {
1290 BT_ERR("Fail to get the owner info");
1294 if (*current != '\0') {
1303 if (strcasecmp(name, BT_BLUEZ_NAME) == 0) {
1304 BT_INFO_C("### Bluetoothd is terminated");
1306 if (_bt_unregister_obex_server() != BLUETOOTH_ERROR_NONE)
1307 BT_ERR("Fail to unregister obex server");
1311 _bt_obex_server_check_allocation(&value);
1313 if (value == TRUE) {
1314 /* Check if the obex server was terminated abnormally */
1315 _bt_obex_server_check_termination(name);
1321 } else if (g_strcmp0(interface_name, BT_AGENT_INTERFACE) == 0) {
1322 _bt_handle_agent_event(parameters, signal_name);
1323 } else if (g_strcmp0(interface_name, BT_DEVICE_INTERFACE) == 0) {
1324 _bt_handle_device_event(parameters, signal_name, object_path);
1330 static gboolean __bt_is_obexd_event(GVariant *msg, const char *interface)
1333 if (g_strcmp0(interface, BT_PROPERTIES_INTERFACE) == 0) {
1334 char *interface_name = NULL;
1336 g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, NULL, NULL);
1337 retv_if(interface_name == NULL, FALSE);
1339 if (strcasecmp(interface_name, BT_OBEX_TRANSFER_INTERFACE) == 0) {
1340 BT_DBG("BT_OBEX_TRANSFER_INTERFACE");
1348 static void __bt_obexd_event_filter(GDBusConnection *connection,
1349 const gchar *sender_name,
1350 const gchar *object_path,
1351 const gchar *interface_name,
1352 const gchar *signal_name,
1353 GVariant *parameters,
1356 const char *member = signal_name;
1357 char *obj_path = NULL;
1358 ret_if(member == NULL);
1360 if (strcasecmp(member, "InterfacesAdded") == 0) {
1361 if (__bt_get_object_path(parameters, &obj_path)) {
1362 BT_ERR("Fail to get the path");
1365 BT_INFO("object_path = [%s]", obj_path);
1367 /*Handle OPP_SERVER_CONNECTED_EVENT here */
1368 /* TODO: MAP? see above */
1369 if (strncmp(obj_path, BT_SESSION_BASEPATH_SERVER,
1370 strlen(BT_SESSION_BASEPATH_SERVER)) != 0) {
1375 if (g_strrstr(obj_path, "session") && g_strrstr(obj_path, "transfer")) {
1376 BT_DBG("Obex_Server_Session_Transfer connected");
1377 _bt_obex_transfer_connected(obj_path);
1380 } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
1381 /*Handle OPP_SERVER_DISCONNECTED_EVENT here */
1382 /* TODO: MAP? see above */
1383 if (__bt_get_object_path(parameters, &obj_path)) {
1384 BT_ERR("Fail to get the path");
1387 BT_INFO("object_path = [%s]", obj_path);
1389 if (strncmp(obj_path, BT_SESSION_BASEPATH_CLIENT,
1390 strlen(BT_SESSION_BASEPATH_CLIENT)) == 0) {
1391 BT_DBG("Call PBAP Disconnected");
1392 _bt_obex_pbap_client_disconnect(obj_path);
1395 if (strncmp(obj_path, BT_SESSION_BASEPATH_SERVER,
1396 strlen(BT_SESSION_BASEPATH_SERVER)) != 0) {
1401 if (g_strrstr(obj_path, "session") && g_strrstr(obj_path, "transfer")) {
1402 BT_DBG("Obex_Server_Session_Transfer disconnected %s",
1405 _bt_obex_transfer_disconnected(obj_path);
1408 } else if (__bt_is_obexd_event(parameters, interface_name) == TRUE) {
1409 const char *path = object_path;
1411 if (strncmp(path, BT_SESSION_BASEPATH_SERVER,
1412 strlen(BT_SESSION_BASEPATH_SERVER)) != 0 &&
1413 strncmp(path, BT_SESSION_BASEPATH_CLIENT,
1414 strlen(BT_SESSION_BASEPATH_CLIENT)) != 0) {
1415 BT_DBG("DBUS_HANDLER_RESULT_NOT_YET_HANDLED");
1419 _bt_handle_property_changed_event(parameters, path);
1425 static gboolean __bt_is_obexd_client_event(GVariant *msg, const char *interface)
1429 if (g_strcmp0(interface, BT_PROPERTIES_INTERFACE) == 0) {
1430 char *interface_name = NULL;
1432 g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, NULL, NULL);
1434 retv_if(interface_name == NULL, FALSE);
1436 if (strcasecmp(interface_name,
1437 BT_OBEX_TRANSFER_INTERFACE) == 0) {
1448 static void __bt_opc_event_filter(GDBusConnection *connection,
1449 const gchar *sender_name,
1450 const gchar *object_path,
1451 const gchar *interface_name,
1452 const gchar *signal_name,
1453 GVariant *parameters,
1456 const char *member = signal_name;
1457 char *obj_path = NULL;
1458 if (strcasecmp(member, "InterfacesAdded") == 0) {
1459 BT_DBG("InterfacesAdded");
1460 } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
1462 if (__bt_get_object_path(parameters, &obj_path)) {
1463 BT_ERR("Fail to get the path");
1467 BT_DBG("object_path = %s", obj_path);
1469 if (strncmp(obj_path, BT_SESSION_BASEPATH_CLIENT,
1470 strlen(BT_SESSION_BASEPATH_CLIENT)) != 0
1471 || strstr(obj_path, "transfer") == NULL) {
1474 } else if (strncmp(obj_path, BT_SESSION_BASEPATH_CLIENT,
1475 strlen(BT_SESSION_BASEPATH_CLIENT)) == 0) {
1476 BT_DBG("Going to call opc disconnected");
1477 _bt_opc_disconnected(obj_path);
1480 _bt_sending_files();
1482 } else if (__bt_is_obexd_client_event(parameters, interface_name) == TRUE) {
1483 char *path = (char *)object_path;
1484 BT_INFO("object_path %s", path);
1485 if (strncmp(path, BT_SESSION_BASEPATH_CLIENT,
1486 strlen(BT_SESSION_BASEPATH_CLIENT)) != 0) {
1487 BT_DBG("NOT BT_SESSION_BASEPATH_CLIENT");
1491 _bt_opc_property_changed_event(parameters, path);
1497 int _bt_opp_client_event_init(void)
1499 GError *error = NULL;
1501 if (opc_obexd_conn == NULL) {
1502 opc_obexd_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1504 if (!opc_obexd_conn) {
1506 BT_ERR("Unable to connect to dbus: %s", error->message);
1507 g_clear_error(&error);
1509 return BLUETOOTH_ERROR_INTERNAL;
1513 if (_bt_register_service_event(opc_obexd_conn,
1514 BT_OPP_CLIENT_EVENT) != BLUETOOTH_ERROR_NONE) {
1515 g_object_unref(opc_obexd_conn);
1516 opc_obexd_conn = NULL;
1517 return BLUETOOTH_ERROR_INTERNAL;
1520 return BLUETOOTH_ERROR_NONE;
1523 void _bt_opp_client_event_deinit(void)
1525 if (opc_obexd_conn) {
1526 _bt_unregister_service_event(opc_obexd_conn,
1527 BT_OPP_CLIENT_EVENT);
1528 g_object_unref(opc_obexd_conn);
1529 opc_obexd_conn = NULL;
1533 static void __bt_map_event_filter(GDBusConnection *connection,
1534 const gchar *sender_name,
1535 const gchar *object_path,
1536 const gchar *interface_name,
1537 const gchar *signal_name,
1538 GVariant *parameters,
1541 BT_DBG("Entered __bt_map_event_filter");
1542 const char *member = signal_name;
1544 if (strcasecmp(member, "InterfacesAdded") == 0) {
1545 BT_DBG("------------------------------------ADDED------------------------------------");
1546 // currently doing nothing
1547 } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
1548 BT_DBG("------------------------------------REMOVED------------------------------------");
1549 // TODO check if something should be called here?
1550 //_bt_map_on_transfer_finished(object_path, error);
1551 } else if (__bt_is_obexd_client_event(parameters, interface_name) == TRUE) {
1552 BT_DBG("------------------------------------CLIENT EVENT------------------------------------");
1553 _bt_map_property_changed_event(parameters, object_path);
1559 int _bt_map_client_event_init(void)
1561 GError *error = NULL;
1563 if (map_obexd_conn == NULL) {
1564 map_obexd_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1566 if (!map_obexd_conn) {
1568 BT_ERR("Unable to connect to dbus: %s", error->message);
1569 g_clear_error(&error);
1571 return BLUETOOTH_ERROR_INTERNAL;
1575 if (_bt_register_service_event(map_obexd_conn,
1576 BT_MAP_CLIENT_EVENT) != BLUETOOTH_ERROR_NONE) {
1577 g_object_unref(map_obexd_conn);
1578 map_obexd_conn = NULL;
1579 return BLUETOOTH_ERROR_INTERNAL;
1582 return BLUETOOTH_ERROR_NONE;
1585 void _bt_map_client_event_deinit(void)
1587 if (map_obexd_conn) {
1588 _bt_unregister_service_event(map_obexd_conn,
1589 BT_MAP_CLIENT_EVENT);
1590 g_object_unref(map_obexd_conn);
1591 map_obexd_conn = NULL;
1595 int _bt_register_manager_subscribe_signal(GDBusConnection *conn,
1601 static int subs_interface_added_id = -1;
1602 static int subs_interface_removed_id = -1;
1605 if (subs_interface_added_id == -1) {
1606 subs_interface_added_id = g_dbus_connection_signal_subscribe(conn,
1607 NULL, BT_MANAGER_INTERFACE,
1608 BT_INTERFACES_ADDED, NULL, NULL, 0,
1609 __bt_manager_event_filter,
1612 if (subs_interface_removed_id == -1) {
1613 subs_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
1614 NULL, BT_MANAGER_INTERFACE,
1615 BT_INTERFACES_REMOVED, NULL, NULL, 0,
1616 __bt_manager_event_filter,
1621 if (subs_interface_added_id != -1) {
1622 g_dbus_connection_signal_unsubscribe(conn,
1623 subs_interface_added_id);
1624 subs_interface_added_id = -1;
1626 if (subs_interface_removed_id != -1) {
1627 g_dbus_connection_signal_unsubscribe(conn,
1628 subs_interface_removed_id);
1629 subs_interface_removed_id = -1;
1635 int _bt_register_device_subscribe_signal(GDBusConnection *conn,
1641 static int subs_device_id = -1;
1644 if (subs_device_id == -1) {
1645 subs_device_id = g_dbus_connection_signal_subscribe(conn,
1646 NULL, BT_DEVICE_INTERFACE,
1647 NULL, NULL, NULL, 0,
1648 __bt_manager_event_filter,
1652 if (subs_device_id != -1) {
1653 g_dbus_connection_signal_unsubscribe(conn,
1655 subs_device_id = -1;
1661 int _bt_register_input_subscribe_signal(GDBusConnection *conn,
1667 static int subs_input_id = -1;
1670 if (subs_input_id == -1) {
1671 subs_input_id = g_dbus_connection_signal_subscribe(conn,
1672 NULL, BT_INPUT_INTERFACE,
1673 NULL, NULL, NULL, 0,
1674 __bt_manager_event_filter,
1678 if (subs_input_id != -1) {
1679 g_dbus_connection_signal_unsubscribe(conn,
1689 int _bt_register_opp_server_subscribe_signal(GDBusConnection *conn,
1695 static int subs_opp_server_interface_added_id = -1;
1696 static int subs_opp_server_interface_removed_id = -1;
1697 static int subs_opp_server_property_id = -1;
1701 if (subs_opp_server_interface_added_id == -1) {
1702 subs_opp_server_interface_added_id = g_dbus_connection_signal_subscribe(conn,
1703 NULL, BT_MANAGER_INTERFACE,
1704 BT_INTERFACES_ADDED, NULL, NULL, 0,
1705 __bt_obexd_event_filter,
1708 if (subs_opp_server_interface_removed_id == -1) {
1709 subs_opp_server_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
1710 NULL, BT_MANAGER_INTERFACE,
1711 BT_INTERFACES_REMOVED, NULL, NULL, 0,
1712 __bt_obexd_event_filter,
1715 if (subs_opp_server_property_id == -1) {
1716 subs_opp_server_property_id = g_dbus_connection_signal_subscribe(conn,
1717 NULL, BT_PROPERTIES_INTERFACE,
1718 BT_PROPERTIES_CHANGED, NULL, NULL, 0,
1719 __bt_obexd_event_filter,
1723 if (subs_opp_server_interface_added_id != -1) {
1724 g_dbus_connection_signal_unsubscribe(conn,
1725 subs_opp_server_interface_added_id);
1726 subs_opp_server_interface_added_id = -1;
1728 if (subs_opp_server_interface_removed_id != -1) {
1729 g_dbus_connection_signal_unsubscribe(conn,
1730 subs_opp_server_interface_removed_id);
1731 subs_opp_server_interface_removed_id = -1;
1733 if (subs_opp_server_property_id != -1) {
1734 g_dbus_connection_signal_unsubscribe(conn,
1735 subs_opp_server_property_id);
1736 subs_opp_server_property_id = -1;
1742 int _bt_register_opp_client_subscribe_signal(GDBusConnection *conn,
1748 static int subs_opp_client_interface_added_id = -1;
1749 static int subs_opp_client_interface_removed_id = -1;
1750 static int subs_opp_client_property_id = -1;
1754 if (subs_opp_client_interface_added_id == -1) {
1755 subs_opp_client_interface_added_id = g_dbus_connection_signal_subscribe(conn,
1756 NULL, BT_MANAGER_INTERFACE,
1757 BT_INTERFACES_ADDED, NULL, NULL, 0,
1758 __bt_opc_event_filter,
1761 if (subs_opp_client_interface_removed_id == -1) {
1762 subs_opp_client_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
1763 NULL, BT_MANAGER_INTERFACE,
1764 BT_INTERFACES_REMOVED, NULL, NULL, 0,
1765 __bt_opc_event_filter,
1768 if (subs_opp_client_property_id == -1) {
1769 subs_opp_client_property_id = g_dbus_connection_signal_subscribe(conn,
1770 NULL, BT_PROPERTIES_INTERFACE,
1771 BT_PROPERTIES_CHANGED, NULL, NULL, 0,
1772 __bt_opc_event_filter,
1776 if (subs_opp_client_interface_added_id != -1) {
1777 g_dbus_connection_signal_unsubscribe(conn,
1778 subs_opp_client_interface_added_id);
1779 subs_opp_client_interface_added_id = -1;
1781 if (subs_opp_client_interface_removed_id != -1) {
1782 g_dbus_connection_signal_unsubscribe(conn,
1783 subs_opp_client_interface_removed_id);
1784 subs_opp_client_interface_removed_id = -1;
1786 if (subs_opp_client_property_id != -1) {
1787 g_dbus_connection_signal_unsubscribe(conn,
1788 subs_opp_client_property_id);
1789 subs_opp_client_property_id = -1;
1795 int _bt_register_map_client_subscribe_signal(GDBusConnection *conn,
1801 static int subs_map_client_interface_added_id = -1;
1802 static int subs_map_client_interface_removed_id = -1;
1803 static int subs_map_client_property_id = -1;
1807 if (subs_map_client_interface_added_id == -1) {
1808 subs_map_client_interface_added_id = g_dbus_connection_signal_subscribe(conn,
1809 NULL, BT_MANAGER_INTERFACE,
1810 BT_INTERFACES_ADDED, NULL, NULL, 0,
1811 __bt_map_event_filter,
1814 if (subs_map_client_interface_removed_id == -1) {
1815 subs_map_client_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
1816 NULL, BT_MANAGER_INTERFACE,
1817 BT_INTERFACES_REMOVED, NULL, NULL, 0,
1818 __bt_map_event_filter,
1821 if (subs_map_client_property_id == -1) {
1822 subs_map_client_property_id = g_dbus_connection_signal_subscribe(conn,
1823 NULL, BT_PROPERTIES_INTERFACE,
1824 BT_PROPERTIES_CHANGED, NULL, NULL, 0,
1825 __bt_map_event_filter,
1829 if (subs_map_client_interface_added_id != -1) {
1830 g_dbus_connection_signal_unsubscribe(conn,
1831 subs_map_client_interface_added_id);
1832 subs_map_client_interface_added_id = -1;
1834 if (subs_map_client_interface_removed_id != -1) {
1835 g_dbus_connection_signal_unsubscribe(conn,
1836 subs_map_client_interface_removed_id);
1837 subs_map_client_interface_removed_id = -1;
1839 if (subs_map_client_property_id != -1) {
1840 g_dbus_connection_signal_unsubscribe(conn,
1841 subs_map_client_property_id);
1842 subs_map_client_property_id = -1;
1849 int _bt_register_service_event(GDBusConnection *g_conn, int event_type)
1853 retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
1855 switch (event_type) {
1856 case BT_MANAGER_EVENT:
1857 BT_DBG("BT_MANAGER_EVENT: register service event");
1858 _bt_register_manager_subscribe_signal(g_conn, TRUE);
1860 case BT_DEVICE_EVENT:
1861 BT_DBG("BT_DEVICE_EVENT: register service event");
1862 _bt_register_device_subscribe_signal(g_conn, TRUE);
1864 case BT_OPP_SERVER_EVENT:
1865 BT_DBG("BT_OPP_SERVER_EVENT: register service event");
1866 _bt_register_opp_server_subscribe_signal(g_conn, TRUE);
1868 case BT_OPP_CLIENT_EVENT:
1869 BT_DBG("BT_OPP_CLIENT_EVENT: register service event");
1870 _bt_register_opp_client_subscribe_signal(g_conn, TRUE);
1872 case BT_MAP_CLIENT_EVENT:
1873 BT_DBG("BT_MAP_CLIENT_EVENT: register service event");
1874 _bt_register_map_client_subscribe_signal(g_conn, TRUE);
1877 BT_ERR("Unknown event");
1878 return BLUETOOTH_ERROR_INTERNAL;
1881 return BLUETOOTH_ERROR_NONE;
1884 void _bt_unregister_service_event(GDBusConnection *g_conn, int event_type)
1888 ret_if(g_conn == NULL);
1890 switch (event_type) {
1891 case BT_MANAGER_EVENT:
1892 _bt_register_manager_subscribe_signal(g_conn, FALSE);
1893 _bt_register_device_subscribe_signal(g_conn, FALSE);
1894 _bt_register_input_subscribe_signal(g_conn, FALSE);
1896 case BT_OPP_SERVER_EVENT:
1897 _bt_register_opp_server_subscribe_signal(g_conn, FALSE);
1899 case BT_OPP_CLIENT_EVENT:
1900 _bt_register_opp_client_subscribe_signal(g_conn, FALSE);
1902 case BT_MAP_CLIENT_EVENT:
1903 _bt_register_map_client_subscribe_signal(g_conn, FALSE);
1906 BT_ERR("Unknown event");
1913 static int __bt_init_manager_receiver(void)
1917 GError *error = NULL;
1919 if (manager_conn == NULL) {
1920 manager_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1921 if (error != NULL) {
1922 BT_ERR("ERROR: Can't get on system bus [%s]", error->message);
1923 g_clear_error(&error);
1925 retv_if(manager_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
1928 if (_bt_register_service_event(manager_conn,
1929 BT_MANAGER_EVENT) != BLUETOOTH_ERROR_NONE)
1932 if (_bt_register_service_event(manager_conn,
1933 BT_DEVICE_EVENT) != BLUETOOTH_ERROR_NONE)
1936 return BLUETOOTH_ERROR_NONE;
1939 g_object_unref(manager_conn);
1940 manager_conn = NULL;
1945 return BLUETOOTH_ERROR_INTERNAL;
1948 static int __bt_init_obexd_receiver(void)
1951 if (!TIZEN_PROFILE_TV) { /* TODO: obexd doesn't work in TV profile. It should be resolved later. */
1952 GError *error = NULL;
1954 if (obexd_conn == NULL) {
1955 obexd_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1956 if (error != NULL) {
1957 BT_ERR("ERROR: Can't get on session bus [%s]", error->message);
1958 g_clear_error(&error);
1960 retv_if(obexd_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
1963 if (_bt_register_service_event(obexd_conn,
1964 BT_OPP_SERVER_EVENT) != BLUETOOTH_ERROR_NONE) {
1965 BT_ERR("Error while registering service event");
1966 g_object_unref(obexd_conn);
1968 return BLUETOOTH_ERROR_INTERNAL;
1974 return BLUETOOTH_ERROR_NONE;
1977 gboolean __bt_reinit_obexd_receiver(gpointer user_data)
1979 static int retry_cnt = 0;
1980 int result = BLUETOOTH_ERROR_NONE;
1984 result = __bt_init_obexd_receiver();
1985 if (result != BLUETOOTH_ERROR_NONE) {
1986 /* 20 ms * 50 = 10 seconds. During 10 seconds fail to initialize,
1987 then it is not the timing issue. Just can't use the session bus connection */
1988 if (retry_cnt > 100) {
1989 BT_ERR("Fail to init obexd receiver by 50 times.");
1991 session_reinit_timer = 0;
1995 BT_DBG("Retry to initialize the obexd receiver");
2000 session_reinit_timer = 0;
2007 /* To receive the event from bluez */
2008 int _bt_init_obex_event_receiver(void)
2014 result = __bt_init_manager_receiver();
2015 retv_if(result != BLUETOOTH_ERROR_NONE, result);
2017 result = __bt_init_obexd_receiver();
2018 if (result != BLUETOOTH_ERROR_NONE) {
2019 BT_ERR("Fail to init obexd receiver");
2021 /* Try to re-initialize obexd receiver in the timer */
2022 if (session_reinit_timer > 0)
2023 g_source_remove(session_reinit_timer);
2025 session_reinit_timer = g_timeout_add(200,
2026 (GSourceFunc)__bt_reinit_obexd_receiver, NULL);
2031 return BLUETOOTH_ERROR_NONE;
2034 void _bt_deinit_obex_event_receiver(void)
2038 _bt_unregister_service_event(manager_conn, BT_MANAGER_EVENT);
2040 _bt_unregister_service_event(obexd_conn, BT_OPP_SERVER_EVENT);
2043 g_object_unref(manager_conn);
2044 manager_conn = NULL;
2048 g_object_unref(obexd_conn);
2053 g_source_remove(event_id);