4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Hocheol Seo <hocheol.seo@samsung.com>
7 * Girishashok Joshi <girish.joshi@samsung.com>
8 * Chanyeol Park <chanyeol.park@samsung.com>
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
14 * http://www.apache.org/licenses/LICENSE-2.0
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
24 #ifdef TIZEN_MDM_ENABLE
25 #include <syspopup_caller.h>
27 #include "bt-internal-types.h"
28 #include "bt-service-common.h"
29 #include "bt-service-main.h"
30 #include "bt-service-mdm.h"
31 #include "bt-service-opp-client.h"
32 #include "bt-service-obex-server.h"
33 #include "bt-service-rfcomm-client.h"
34 #include "bt-service-rfcomm-server.h"
35 #include "bt-service-adapter.h"
36 #include "bt-service-device.h"
37 #include "bt-service-network.h"
38 #include "bt-service-pbap.h"
40 policy_receiver_handle mdm_handle;
42 static int __bt_mdm_is_profile_connected(bluetooth_device_address_t *device_address,
43 char *profile_uuid, gboolean *is_connected)
45 char *object_path = NULL;
46 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
47 DBusGProxy *device_proxy = NULL;
48 DBusGProxy *adapter_proxy = NULL;
49 DBusGConnection *conn;
51 GHashTable *hash = NULL;
53 dbus_bool_t val = FALSE;
55 retv_if(device_address == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
56 retv_if(profile_uuid == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
57 retv_if(is_connected == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
59 *is_connected = FALSE;
61 if (g_strcmp0(profile_uuid, RFCOMM_UUID_STR) == 0)
62 return _bt_rfcomm_is_device_connected(device_address,
64 else if (g_strcmp0(profile_uuid, GATT_UUID) == 0)
65 return _bt_is_gatt_connected(device_address, is_connected);
67 adapter_proxy = _bt_get_adapter_proxy();
68 retv_if(adapter_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
70 conn = _bt_get_system_gconn();
71 retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
73 _bt_convert_addr_type_to_string(address, device_address->addr);
75 if (g_strcmp0(profile_uuid, NAP_UUID) == 0) {
76 object_path = _bt_get_adapter_path();
77 device_proxy = dbus_g_proxy_new_for_name(conn, BT_BLUEZ_NAME,
78 object_path, BT_NETWORK_SERVER_INTERFACE);
80 if (device_proxy == NULL) {
81 BT_DBG("Device don't have this service");
82 return BLUETOOTH_ERROR_INTERNAL;
84 dbus_g_proxy_call(device_proxy, "GetProperties", NULL,
85 G_TYPE_STRING, address,
87 dbus_g_type_get_map("GHashTable",
88 G_TYPE_STRING, G_TYPE_VALUE),
89 &hash, G_TYPE_INVALID);
91 value = g_hash_table_lookup(hash, "Connected");
92 *is_connected = value ? g_value_get_boolean(value) : FALSE;
93 g_hash_table_destroy(hash);
95 } else if (g_strcmp0(profile_uuid, PANU_UUID) == 0)
96 return _bt_is_network_connected(_bt_get_net_conn(),
97 device_address->addr, is_connected);
99 object_path = _bt_get_device_object_path(address);
100 retv_if(object_path == NULL, BLUETOOTH_ERROR_NOT_PAIRED);
102 device_proxy = dbus_g_proxy_new_for_name(conn, BT_BLUEZ_NAME,
103 object_path, BT_DEVICE_INTERFACE);
105 if (device_proxy == NULL) {
106 BT_DBG("Device don't have this service");
107 return BLUETOOTH_ERROR_INTERNAL;
109 dbus_g_proxy_call(device_proxy, "IsConnectedProfile", &error,
110 G_TYPE_STRING, profile_uuid,
112 G_TYPE_BOOLEAN, &val,
115 BT_ERR("Failed to get properties: %s\n", error->message);
123 g_object_unref(device_proxy);
125 return BLUETOOTH_ERROR_NONE;
128 static int __bt_mdm_get_connected_profile_address(char *address, char *UUID)
133 gboolean is_connected = FALSE;
134 GArray *device_list = NULL;
135 bluetooth_device_info_t info;
138 device_list = g_array_new(FALSE, FALSE, sizeof(gchar));
140 if (_bt_get_bonded_devices(&device_list)
141 != BLUETOOTH_ERROR_NONE) {
142 g_array_free(device_list, TRUE);
146 size = (device_list->len) / sizeof(bluetooth_device_info_t);
147 BT_DBG("g arrary size : [%d]", size);
149 for (i = 0; i < size; i++) {
151 info = g_array_index(device_list,
152 bluetooth_device_info_t, i);
154 if (info.connected == TRUE) {
155 BT_DBG("Found Connected device[%s]", info.device_name.name);
156 err = __bt_mdm_is_profile_connected(&info.device_address,
157 UUID, &is_connected);
159 if (err == BLUETOOTH_ERROR_NONE) {
161 BT_DBG("connected device name : %s", info.device_name.name);
162 _bt_convert_addr_type_to_string(address, (unsigned char *)info.device_address.addr);
170 g_array_free(device_list, TRUE);
175 static void __bt_mdm_mode_changed(int mode)
177 int visible = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
179 BT_DBG("allow mode: %d", mode);
183 BT_DBG("MDM_BT_ALLOWED");
186 case MDM_BT_HANDSFREE_ONLY:
187 BT_DBG("MDM_BT_HANDSFREE_ONLY");
189 _bt_get_discoverable_mode(&visible);
190 ret_if(visible == BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE);
192 _bt_set_discoverable_mode(BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE, 0);
194 _bt_opp_client_cancel_all_transfers();
196 _bt_obex_server_cancel_all_transfers();
198 _bt_rfcomm_client_disconnect_all();
200 _bt_rfcomm_server_disconnect_all_connection();
202 _bt_launch_mdm_popup("MDM_POLICY_DISABLE_BT_HANDSFREE");
205 case MDM_BT_RESTRICTED:
206 BT_DBG("MDM_BT_RESTRICTED");
208 _bt_launch_mdm_popup("MDM_POLICY_DISABLE_BT");
211 _bt_disable_adapter();
214 BT_DBG("Unknown mode");
221 static void __bt_mdm_discoverable_state_changed(int state)
223 int visible = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
225 BT_DBG("state: %d", state);
229 BT_DBG("MDM_ALLOWED");
233 BT_DBG("MDM_RESTRICTED");
235 _bt_get_discoverable_mode(&visible);
236 ret_if(visible == BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE);
238 _bt_set_discoverable_mode(BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE, 0);
241 BT_DBG("Unknown mode");
246 static void __bt_mdm_limited_discoverable_state_changed(int state)
248 int visible = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
251 BT_DBG("state: %d", state);
255 BT_DBG("MDM_ALLOWED");
256 if (vconf_get_int(BT_FILE_VISIBLE_TIME, &timeout) != 0)
257 BT_ERR("Fail to get the timeout value");
260 BT_DBG("_bt_set_discoverable_mode");
261 if (_bt_set_discoverable_mode(
262 BLUETOOTH_DISCOVERABLE_MODE_TIME_LIMITED_DISCOVERABLE,
263 timeout) != BLUETOOTH_ERROR_NONE) {
264 if (vconf_set_int(BT_FILE_VISIBLE_TIME, 0) != 0)
265 BT_ERR("Set vconf failed");
272 BT_DBG("MDM_RESTRICTED");
274 _bt_get_discoverable_mode(&visible);
275 ret_if(visible == BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE);
277 _bt_set_discoverable_mode(BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE,
281 BT_DBG("Unknown mode");
286 static int __bt_mdm_idle_cb(void *data)
290 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
292 retv_if(status == NULL, FALSE);
294 BT_DBG("policy: %d", *status);
296 if (mdm_get_service() != MDM_RESULT_SUCCESS) return BT_MDM_NO_SERVICE;
299 case MDM_BT_MODE_CHANGED:
300 mode = mdm_get_allow_bluetooth_mode();
301 __bt_mdm_mode_changed(mode);
303 case MDM_BT_OUTGOING_CALL_CHANGED:
304 BT_DBG("MDM_BT_OUTGOING_CALL_CHANGED");
306 case MDM_BT_A2DP_PROFILE_CHANGED:
307 BT_DBG("MDM_BT_A2DP_PROFILE_CHANGED");
309 if (mdm_get_bluetooth_profile_state(BLUETOOTH_A2DP_PROFILE)
311 if (__bt_mdm_get_connected_profile_address(address,
313 _bt_disconnect_profile(address, A2DP_SINK_UUID,
318 case MDM_BT_AVRCP_PROFILE_CHANGED:
319 BT_DBG("MDM_BT_AVRCP_PROFILE_CHANGED");
321 if (mdm_get_bluetooth_profile_state(BLUETOOTH_AVRCP_PROFILE)
323 if (__bt_mdm_get_connected_profile_address(address,
325 _bt_disconnect_profile(address, AVRCP_REMOTE_UUID,
330 case MDM_BT_BPP_PROFILE_CHANGED:
331 BT_DBG("MDM_BT_BPP_PROFILE_CHANGED");
333 case MDM_BT_DUN_PROFILE_CHANGED:
334 BT_DBG("MDM_BT_DUN_PROFILE_CHANGED");
336 case MDM_BT_FTP_PROFILE_CHANGED:
337 BT_DBG("MDM_BT_FTP_PROFILE_CHANGED");
339 case MDM_BT_HFP_PROFILE_CHANGED:
340 BT_DBG("MDM_BT_HFP_PROFILE_CHANGED");
342 if (mdm_get_bluetooth_profile_state(BLUETOOTH_HFP_PROFILE)
344 if (__bt_mdm_get_connected_profile_address(address,
346 _bt_disconnect_profile(address, HFP_HS_UUID,
351 case MDM_BT_HSP_PROFILE_CHANGED:
352 BT_DBG("MDM_BT_HSP_PROFILE_CHANGED");
354 if (mdm_get_bluetooth_profile_state(BLUETOOTH_HSP_PROFILE)
356 if (__bt_mdm_get_connected_profile_address(address,
358 _bt_disconnect_profile(address, HSP_HS_UUID,
363 case MDM_BT_PBAP_PROFILE_CHANGED:
364 BT_DBG("MDM_BT_PBAP_PROFILE_CHANGED");
366 if (mdm_get_bluetooth_profile_state(BLUETOOTH_PBAP_PROFILE)
368 if (__bt_mdm_get_connected_profile_address(address,
370 bluetooth_device_address_t addr;
371 _bt_convert_addr_string_to_type(addr.addr,
373 _bt_pbap_disconnect(&addr);
378 case MDM_BT_SAP_PROFILE_CHANGED:
379 BT_DBG("MDM_BT_SAP_PROFILE_CHANGED");
381 case MDM_BT_SPP_PROFILE_CHANGED:
382 BT_DBG("MDM_BT_SPP_PROFILE_CHANGED");
384 case MDM_BT_DESKTOP_CONNECTIVITY_STATE_CHANGED:
385 BT_DBG("MDM_BT_DESKTOP_CONNECTIVITY_STATE_CHANGED");
387 case MDM_BT_DISCOVERABLE_STATE_CHANGED:
388 BT_DBG("MDM_BT_DISCOVERABLE_STATE_CHANGED");
390 mode = mdm_get_bluetooth_discoverable_state();
391 __bt_mdm_discoverable_state_changed(mode);
394 case MDM_BT_PARINIG_STATE_CHANGED:
395 BT_DBG("MDM_BT_PARINIG_STATE_CHANGED");
397 case MDM_BT_LIMITED_DISCOVERABLE_STATE_CHANGED:
398 BT_DBG("MDM_BT_LIMITED_DISCOVERABLE_STATE_CHANGED");
400 mode = mdm_get_bluetooth_limited_discoverable_state();
401 __bt_mdm_limited_discoverable_state_changed(mode);
404 case MDM_BT_DATA_TRANSFER_CHANGED:
405 BT_DBG("MDM_BT_DATA_TRANSFER_CHANGED");
407 mode = mdm_get_bluetooth_data_transfer_state();
408 if (mode == MDM_RESTRICTED) {
409 _bt_opp_client_cancel_all_transfers();
410 _bt_obex_server_cancel_all_transfers();
415 BT_DBG("Unknown mode");
421 mdm_release_service();
427 static void __bt_mdm_policy_changed_cb(int status, void *data)
431 BT_DBG("policy: %d", status);
433 mdm_status = g_malloc0(sizeof(int));
435 *mdm_status = status;
437 g_idle_add((GSourceFunc)__bt_mdm_idle_cb, mdm_status);
440 void _bt_init_mdm_handle(void)
442 mdm_handle = mdm_register_policy_receiver(MDM_POLICY_ON_BT,
444 __bt_mdm_policy_changed_cb);
445 if (mdm_handle == (policy_receiver_handle)NULL)
446 BT_ERR("MDM register failed\n");
449 void _bt_deinit_mdm_handle(void)
451 if(mdm_handle != (policy_receiver_handle)NULL) {
452 mdm_deregister_policy_receiver(mdm_handle);
453 mdm_handle = (policy_receiver_handle)NULL;
456 mdm_release_service();
459 int _bt_launch_mdm_popup(char *mode)
465 retv_if(b == NULL, BLUETOOTH_ERROR_INTERNAL);
467 bundle_add(b, "mode", mode);
469 ret = syspopup_launch(BT_MDM_SYSPOPUP, b);
472 BT_DBG("Popup launch failed: %d\n", ret);
479 bt_mdm_status_e _bt_check_mdm_allow_restriction(void)
483 if (mdm_get_service() != MDM_RESULT_SUCCESS) return BT_MDM_NO_SERVICE;
485 mode = mdm_get_allow_bluetooth_mode();
486 mdm_release_service();
488 return (mode == MDM_BT_RESTRICTED) ? BT_MDM_RESTRICTED : BT_MDM_ALLOWED;
492 bt_mdm_status_e _bt_check_mdm_desktop_connectivity_restriction(void)
494 bt_mdm_status_e mdm_status = BT_MDM_ALLOWED;
496 if (mdm_get_service() != MDM_RESULT_SUCCESS)
497 return BT_MDM_NO_SERVICE;
499 if (mdm_get_bluetooth_desktop_connectivity_state() == MDM_RESTRICTED) {
500 /* Not allow to visible on */
501 BT_ERR("Desktop connection is restricted");
502 mdm_status = BT_MDM_RESTRICTED;
504 mdm_release_service();
509 bt_mdm_status_e _bt_check_mdm_visible_restriction(void)
511 bt_mdm_status_e mdm_status = BT_MDM_ALLOWED;
513 if (mdm_get_service() != MDM_RESULT_SUCCESS) return BT_MDM_NO_SERVICE;
515 if (mdm_get_bluetooth_discoverable_state() == MDM_RESTRICTED ||
516 mdm_get_allow_bluetooth_mode() == MDM_BT_HANDSFREE_ONLY) {
517 /* Not allow to visible on */
518 BT_ERR("Restricted to set visible mode");
519 mdm_status = BT_MDM_RESTRICTED;
521 mdm_release_service();
526 bt_mdm_status_e _bt_check_mdm_limited_discoverable_mode(void)
528 bt_mdm_status_e mdm_status = BT_MDM_ALLOWED;
530 if (mdm_get_service() != MDM_RESULT_SUCCESS) return BT_MDM_NO_SERVICE;
532 if (mdm_get_bluetooth_limited_discoverable_state() == MDM_RESTRICTED) {
533 BT_ERR("limited discoverable mode");
534 mdm_status = BT_MDM_RESTRICTED;
536 mdm_release_service();
541 bt_mdm_status_e _bt_check_mdm_blacklist_devices(bluetooth_device_address_t *address)
546 bluetooth_device_info_t dev_info;
547 bt_mdm_status_e mdm_status = BT_MDM_ALLOWED;
549 if (mdm_get_service() != MDM_RESULT_SUCCESS) return BT_MDM_NO_SERVICE;
551 memset(&dev_info, 0x00, sizeof(bluetooth_device_info_t));
553 if (_bt_get_bonded_device_info(address,
554 &dev_info) != BLUETOOTH_ERROR_NONE) {
555 BT_ERR("Not paired device");
559 lp_data = mdm_get_bluetooth_devices_from_blacklist();
560 if (lp_data == NULL) {
561 BT_ERR("No blacklist");
565 for (blacklist = (GList *)lp_data->data; blacklist; blacklist = blacklist->next) {
566 device_name = blacklist->data;
568 DBG_SECURE("blacklist name: %s", device_name);
570 if (g_strcmp0(dev_info.device_name.name,
572 mdm_status = BT_MDM_RESTRICTED;
577 mdm_free_data(lp_data);
579 mdm_release_service();
583 mdm_bt_profile_t convert_uuid_string_to_type(const char* uuid)
585 retv_if (uuid == NULL, MDM_BT_PROFILE_NONE);
587 if (!strcasecmp(uuid, BT_A2DP_UUID))
588 return BLUETOOTH_A2DP_PROFILE;
589 else if (!strcasecmp(uuid, BT_AVRCP_TARGET_UUID))
590 return BLUETOOTH_AVRCP_PROFILE;
591 else if (!strcasecmp(uuid, BT_FTP_UUID))
592 return BLUETOOTH_FTP_PROFILE;
593 else if (!strcasecmp(uuid, BT_HFP_AUDIO_GATEWAY_UUID))
594 return BLUETOOTH_HFP_PROFILE;
595 else if (!strcasecmp(uuid, HSP_AG_UUID))
596 return BLUETOOTH_HSP_PROFILE;
597 else if (!strcasecmp(uuid, OBEX_PSE_UUID))
598 return BLUETOOTH_PBAP_PROFILE;
599 else if (!strcasecmp(uuid, BT_SPP_UUID))
600 return BLUETOOTH_SPP_PROFILE;
602 return MDM_BT_PROFILE_NONE;
605 bt_mdm_status_e _bt_check_mdm_blacklist_uuid(char *uuid)
609 char *blacklist_uuid;
610 bt_mdm_status_e mdm_status = BT_MDM_ALLOWED;
612 retv_if (uuid == NULL, mdm_status);
614 if (mdm_get_service() != MDM_RESULT_SUCCESS) return BT_MDM_NO_SERVICE;
616 lp_data = mdm_get_bluetooth_uuids_from_blacklist();
617 if (lp_data == NULL) {
618 BT_ERR("No blacklist");
622 for (blacklist = (GList *)lp_data->data; blacklist; blacklist = blacklist->next) {
623 blacklist_uuid = blacklist->data;
625 BT_DBG("blacklist_uuid: %s", blacklist_uuid);
627 if (g_strcmp0(blacklist_uuid, uuid) == 0) {
628 mdm_status = BT_MDM_RESTRICTED;
633 if (mdm_status == BT_MDM_ALLOWED) {
634 mdm_bt_profile_t profile;
635 profile = convert_uuid_string_to_type(uuid);
636 if (mdm_get_bluetooth_profile_state(profile) == MDM_RESTRICTED) {
637 BT_ERR("Restricted UUID");
638 mdm_status = BT_MDM_RESTRICTED;
642 mdm_free_data(lp_data);
645 mdm_release_service();