211d8554b3a0bd214562d08550eb448943783641
[platform/core/connectivity/bluetooth-frwk.git] / bt-core / bt-core-adapter.c
1 /*
2  * Bluetooth-frwk
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact:  Hocheol Seo <hocheol.seo@samsung.com>
7  *               Girishashok Joshi <girish.joshi@samsung.com>
8  *               Chanyeol Park <chanyeol.park@samsung.com>
9  *
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
13  *
14  *              http://www.apache.org/licenses/LICENSE-2.0
15  *
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.
21  *
22  */
23
24 #include <vconf.h>
25 #include <vconf-keys.h>
26
27 #include "bt-core-main.h"
28 #include "bt-core-adapter.h"
29 #include "bt-core-common.h"
30 #include "bt-core-dbus-handler.h"
31 #include "bt-core-noti-handler.h"
32
33 static bt_status_t adapter_status = BT_DEACTIVATED;
34 static bt_le_status_t adapter_le_status = BT_LE_DEACTIVATED;
35 static gboolean is_recovery_mode = FALSE;
36
37 static int bt_status_before[BT_MODE_MAX] = { VCONFKEY_BT_STATUS_OFF, };
38 static int bt_le_status_before[BT_MODE_MAX] = { 0, };
39
40 static DBusGConnection *conn = NULL;
41
42 static void __bt_core_set_status(bt_status_t status)
43 {
44         adapter_status = status;
45 }
46
47 bt_status_t _bt_core_get_status(void)
48 {
49         return adapter_status;
50 }
51
52 static void __bt_core_set_le_status(bt_le_status_t status)
53 {
54         adapter_le_status = status;
55 }
56
57 bt_le_status_t _bt_core_get_le_status(void)
58 {
59         return adapter_le_status;
60 }
61
62 int _bt_core_get_bt_status(bt_mode_e mode)
63 {
64         return bt_status_before[mode];
65 }
66
67 int _bt_core_get_bt_le_status(bt_mode_e mode)
68 {
69         return bt_le_status_before[mode];
70 }
71
72 void _bt_core_set_bt_status(bt_mode_e mode, int status)
73 {
74         bt_status_before[mode] = status;
75 }
76
77 void _bt_core_set_bt_le_status(bt_mode_e mode, int status)
78 {
79         bt_le_status_before[mode] = status;
80 }
81
82 gboolean _bt_core_is_recovery_mode(void)
83 {
84         return is_recovery_mode;
85 }
86
87 gboolean _bt_core_is_flight_mode_enabled(void)
88 {
89 #ifdef TIZEN_TELEPHONY_ENABLED
90         int isFlightMode = 0;
91         int ret = -1;
92
93         ret = vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &isFlightMode);
94         if (ret != 0) {
95                 BT_ERR("vconf_get_bool failed");
96         }
97         return isFlightMode;
98 #else
99         return FALSE;
100 #endif
101 }
102
103 static gboolean bt_core_enable_adapter(BtCore *agent,
104                                                 DBusGMethodInvocation *context);
105
106 static gboolean bt_core_disable_adapter(BtCore *agent,
107                                                 DBusGMethodInvocation *context);
108
109 static gboolean bt_core_recover_adapter(BtCore *agent,
110                                                 DBusGMethodInvocation *context);
111
112 static gboolean bt_core_enable_adapter_le(BtCore *agent,
113                                                 DBusGMethodInvocation *context);
114
115 static gboolean bt_core_disable_adapter_le(BtCore *agent,
116                                                 DBusGMethodInvocation *context);
117
118 static gboolean bt_core_reset_adapter(BtCore *agent,
119                                                 DBusGMethodInvocation *context);
120
121 static gboolean bt_core_enable_core(BtCore *agent,
122                                                 DBusGMethodInvocation *context);
123
124 static int __execute_command(const char *cmd, char *const arg_list[]);
125
126 #include "bt-core-adapter-method.h"
127
128
129 G_DEFINE_TYPE(BtCore, bt_core, G_TYPE_OBJECT);
130
131 /*This is part of platform provided code skeleton for client server model*/
132 static void bt_core_class_init (BtCoreClass *bt_core_class)
133 {
134         dbus_g_object_type_install_info(G_TYPE_FROM_CLASS(bt_core_class),
135                                         &dbus_glib_bt_core_object_info);
136 }
137
138 /*This is part of platform provided code skeleton for client server model*/
139 static void bt_core_init (BtCore *core)
140 {
141 }
142
143 typedef enum {
144         BT_CORE_ERROR_REJECT,
145         BT_CORE_ERROR_CANCEL,
146         BT_CORE_ERROR_TIMEOUT,
147 } BtCoreError;
148
149 #define BT_CORE_ERROR (bt_core_error_quark())
150
151 static GQuark bt_core_error_quark(void)
152 {
153         static GQuark quark = 0;
154         if (!quark)
155                 quark = g_quark_from_static_string("BtCore");
156
157         return quark;
158 }
159
160 #define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
161
162 static GError *bt_core_error(BtCoreError error, const char *err_msg)
163 {
164         return g_error_new(BT_CORE_ERROR, error, err_msg, NULL);
165 }
166
167 static int __execute_command(const char *cmd, char *const arg_list[])
168 {
169         int pid;
170         int pid2;
171         int status = 0;
172         BT_DBG("+");
173
174         pid = fork();
175         switch (pid) {
176         case -1:
177                 BT_ERR("fork failed");
178                 return -1;
179
180         case 0:
181                 pid2 = fork();
182                 if (pid2 == -1) {
183                         BT_ERR("fork failed");
184                 } else if (pid2 == 0) {
185                         execv(cmd, arg_list);
186                         exit(256);
187                 }
188                 exit(0);
189                 break;
190
191         default:
192                 BT_DBG("parent : forked[%d]", pid);
193                 waitpid(pid, &status, 0);
194                 BT_DBG("child is terminated : %d", status);
195                 break;
196         }
197         BT_DBG("-");
198         return 0;
199 }
200
201 static DBusGProxy *_bt_get_connman_proxy(void)
202 {
203         DBusGProxy *proxy;
204
205         if (conn == NULL) {
206                 conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL);
207                 retv_if(conn == NULL, NULL);
208         }
209
210         proxy = dbus_g_proxy_new_for_name(conn,
211                         CONNMAN_DBUS_NAME,
212                         CONNMAN_BLUETOOTH_TECHNOLOGY_PATH,
213                         CONNMAN_BLUETOTOH_TECHNOLOGY_INTERFACE);
214         retv_if(proxy == NULL, NULL);
215
216         return proxy;
217 }
218
219 static int _bt_power_adapter(gboolean powered)
220 {
221         GValue state = { 0 };
222         GError *error = NULL;
223         DBusGProxy *proxy;
224
225         proxy = _bt_get_connman_proxy();
226         retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
227
228         g_value_init(&state, G_TYPE_BOOLEAN);
229         g_value_set_boolean(&state, powered);
230
231         BT_DBG("set power property state: %d to connman", powered);
232
233         dbus_g_proxy_call(proxy, "SetProperty", &error,
234                                 G_TYPE_STRING, "Powered",
235                                 G_TYPE_VALUE, &state,
236                                 G_TYPE_INVALID, G_TYPE_INVALID);
237
238         if (error != NULL) {
239                 BT_ERR("Powered set err: \n [%s]", error->message);
240                 g_error_free(error);
241                 g_value_unset(&state);
242                 return BLUETOOTH_ERROR_INTERNAL;
243         }
244         return BLUETOOTH_ERROR_NONE;
245 }
246
247 int _bt_enable_adapter(void)
248 {
249         int ret;
250         bt_status_t status;
251         bt_le_status_t le_status;
252 #ifdef __TIZEN_MOBILE__
253         __bt_core_set_status(BT_ACTIVATING);
254
255         ret = __execute_command("/usr/etc/bluetooth/bt-stack-up.sh", NULL);
256         if (ret < 0) {
257                 BT_ERR("running script failed");
258                 ret = __execute_command("/usr/etc/bluetooth/bt-dev-end.sh", NULL);
259                 __bt_core_set_status(BT_DEACTIVATED);
260                 return -1;
261         }
262 #else
263         _bt_power_adapter(TRUE);
264 #endif
265
266         return 0;
267 }
268
269 int _bt_disable_adapter(void)
270 {
271         BT_INFO_C("Disable adapter");
272 #if __TIZEN_MOBILE__
273         __bt_core_set_status(BT_DEACTIVATING);
274
275         if (__execute_command("/usr/etc/bluetooth/bt-stack-down.sh", NULL) < 0) {
276                 BT_ERR("running script failed");
277                 __bt_core_set_status(BT_ACTIVATED);
278                 return -1;
279         }
280 #else
281         _bt_power_adapter(FALSE);
282 #endif
283         return 0;
284 }
285
286 int _bt_enable_adapter_le(void)
287 {
288         BT_DBG("");
289 #ifdef __TIZEN_MOBILE__
290         int ret;
291         status = _bt_core_get_status();
292         if (status == BT_DEACTIVATED) {
293                 __bt_core_set_le_status(BT_LE_ACTIVATING);
294                 BT_DBG("Activate BT");
295                 ret = system("/usr/etc/bluetooth/bt-stack-up.sh &");
296                 if (ret < 0) {
297                         BT_ERR("running script failed");
298                         ret = __execute_command("/usr/etc/bluetooth/bt-dev-end.sh &", NULL);
299                         __bt_core_set_status(BT_DEACTIVATED);
300                         __bt_core_set_le_status(BT_LE_DEACTIVATED);
301                         return -1;
302                 }
303         } else {
304                 __bt_core_set_le_status(BT_LE_ACTIVATED);
305         }
306 #else
307         _bt_power_adapter(TRUE);
308 #endif
309         return 0;
310 }
311
312 int _bt_disable_adapter_le(void)
313 {
314         BT_DBG("+");
315
316 #ifdef __TIZEN_MOBILE__
317         status = _bt_core_get_status();
318         BT_DBG("status : %d", status);
319
320         if (status == BT_DEACTIVATED) {
321                 __bt_core_set_le_status(BT_LE_DEACTIVATING);
322
323                 if (__execute_command("/usr/etc/bluetooth/bt-stack-down.sh", NULL) < 0) {
324                         BT_ERR("running script failed");
325                         __bt_core_set_le_status(BT_LE_ACTIVATED);
326                         return -1;
327                 }
328         }
329         __bt_core_set_le_status(BT_LE_DEACTIVATED);
330 #else
331         _bt_power_adapter(FALSE);
332 #endif
333
334         BT_DBG("-");
335         return 0;
336 }
337
338 int _bt_core_service_request_adapter(int service_function)
339 {
340         int ret = -1;
341
342         GArray *in_param1 = NULL;
343         GArray *in_param2 = NULL;
344         GArray *in_param3 = NULL;
345         GArray *in_param4 = NULL;
346         GArray *out_param = NULL;
347
348         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
349
350         ret = _bt_core_service_request(BT_CORE_SERVICE, service_function,
351                         in_param1, in_param2, in_param3, in_param4, &out_param);
352         if (ret < 0)
353                 BT_ERR("_bt_core_service_request_adapter() failed");
354
355         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
356
357         return ret;
358 }
359
360 static void __bt_core_update_status(void)
361 {
362         int bt_status = VCONFKEY_BT_STATUS_OFF;
363         int bt_le_status = 0;
364
365         if (vconf_get_int(VCONFKEY_BT_STATUS, &bt_status) < 0)
366                 BT_ERR("no bluetooth device info, so BT was disabled at previous session");
367 #ifdef ENABLE_TIZEN_2_4
368         if (vconf_get_int(VCONFKEY_BT_LE_STATUS, &bt_le_status) < 0)
369                 BT_ERR("no bluetooth le info, so BT LE was disabled at previous session");
370 #endif
371
372         BT_INFO("bt_status = %d, bt_le_status = %d", bt_status, bt_le_status);
373
374         if (bt_status == VCONFKEY_BT_STATUS_OFF)
375                 __bt_core_set_status(BT_DEACTIVATED);
376         else
377                 __bt_core_set_status(BT_ACTIVATED);
378
379         if (bt_le_status == 0)
380                 __bt_core_set_le_status(BT_LE_DEACTIVATED);
381         else
382                 __bt_core_set_le_status(BT_LE_ACTIVATED);
383 }
384
385 static gboolean bt_core_enable_adapter(BtCore *agent,
386                                                 DBusGMethodInvocation *context)
387 {
388         char *sender = dbus_g_method_get_sender(context);
389         int ret;
390
391         if (sender == NULL)
392                 return FALSE;
393
394         _bt_set_flightmode_request(FALSE);
395         if (vconf_set_int(BT_OFF_DUE_TO_FLIGHT_MODE, 0) != 0)
396                 BT_ERR("Set vconf failed");
397
398         ret = _bt_enable_adapter();
399         if (ret < 0) {
400                 GError *error = bt_core_error(BT_CORE_ERROR_REJECT,
401                                                         "Activation failed");
402                 dbus_g_method_return_error(context, error);
403                 g_error_free(error);
404                 g_free(sender);
405                 return FALSE;
406         } else {
407                 dbus_g_method_return(context);
408         }
409
410         g_free(sender);
411         return TRUE;
412 }
413
414 static gboolean bt_core_disable_adapter(BtCore *agent,
415                                                 DBusGMethodInvocation *context)
416 {
417         char *sender = dbus_g_method_get_sender(context);
418         int ret;
419
420         if (sender == NULL)
421                 return FALSE;
422
423         _bt_set_flightmode_request(FALSE);
424         if (vconf_set_int(BT_OFF_DUE_TO_FLIGHT_MODE, 0) != 0)
425                 BT_ERR("Set vconf failed");
426
427         ret = _bt_disable_adapter();
428         if (ret < 0) {
429                 GError *error = bt_core_error(BT_CORE_ERROR_REJECT,
430                                                         "Deactivation failed");
431                 dbus_g_method_return_error(context, error);
432                 g_error_free(error);
433                 g_free(sender);
434                 return FALSE;
435         } else {
436                 dbus_g_method_return(context);
437         }
438
439         g_free(sender);
440         return TRUE;
441 }
442
443 static gboolean bt_core_recover_adapter(BtCore *agent,
444                                                 DBusGMethodInvocation *context)
445 {
446         int ret;
447         int ret_le;
448
449         BT_INFO_C("Recover bt adapter");
450
451         dbus_g_method_return(context);
452
453         _bt_set_flightmode_request(FALSE);
454         if (vconf_set_int(BT_OFF_DUE_TO_FLIGHT_MODE, 0) != 0)
455                 BT_ERR("Set vconf failed");
456
457         is_recovery_mode = TRUE;
458
459         __bt_core_update_status();
460
461         if (_bt_core_get_status() == BT_ACTIVATED) {
462                 _bt_core_set_bt_status(BT_RECOVERY_MODE, 1);
463                 _bt_core_service_request_adapter(BT_DISABLE_ADAPTER);
464         }
465         if (_bt_core_get_le_status() == BT_LE_ACTIVATED) {
466                 _bt_core_set_bt_le_status(BT_RECOVERY_MODE, 1);
467                 _bt_core_service_request_adapter(BT_DISABLE_ADAPTER_LE);
468         }
469
470         ret = _bt_disable_adapter();
471         if (ret < 0)
472                 BT_ERR("_bt_disable_adapter() failed");
473         ret_le = _bt_disable_adapter_le();
474         if (ret_le < 0)
475                 BT_ERR("_bt_disable_adapter_le() failed");
476
477         return TRUE;
478 }
479
480 static gboolean bt_core_enable_adapter_le(BtCore *agent,
481                                                 DBusGMethodInvocation *context)
482 {
483         char *sender = dbus_g_method_get_sender(context);
484         int ret;
485
486         if (sender == NULL)
487                 return FALSE;
488
489         ret = _bt_enable_adapter_le();
490         if (ret < 0) {
491                 GError *error = bt_core_error(BT_CORE_ERROR_REJECT,
492                                                         "LE Activation failed");
493                 dbus_g_method_return_error(context, error);
494                 g_error_free(error);
495                 g_free(sender);
496                 BT_DBG("-");
497                 return FALSE;
498         } else {
499                 dbus_g_method_return(context);
500         }
501
502         g_free(sender);
503         BT_DBG("-");
504         return TRUE;
505 }
506
507 static gboolean bt_core_disable_adapter_le(BtCore *agent,
508                                                 DBusGMethodInvocation *context)
509 {
510         BT_DBG("+");
511
512         char *sender = dbus_g_method_get_sender(context);
513         BT_DBG("sender : %s", sender);
514         int ret;
515
516         if (sender == NULL)
517                 return FALSE;
518
519         ret = _bt_disable_adapter_le();
520         if (ret < 0) {
521                 GError *error = bt_core_error(BT_CORE_ERROR_REJECT,
522                                                         "LE Deactivation failed");
523                 dbus_g_method_return_error(context, error);
524                 g_error_free(error);
525                 g_free(sender);
526                 return FALSE;
527         } else {
528                 dbus_g_method_return(context);
529         }
530
531         g_free(sender);
532         BT_DBG("-");
533         return TRUE;
534 }
535
536 static int __bt_reset_adapter(void)
537 {
538         /* Forcely terminate */
539         if (__execute_command("/usr/etc/bluetooth/bt-reset-env.sh", NULL) < 0) {
540                 BT_ERR("running script failed");
541         }
542         _bt_core_terminate();
543         return 0;
544 }
545
546 static gboolean bt_core_reset_adapter(BtCore *agent,
547                                                 DBusGMethodInvocation *context)
548 {
549         char *sender = dbus_g_method_get_sender(context);
550         int ret;
551
552         if (sender == NULL)
553                 return FALSE;
554
555         ret = __bt_reset_adapter();
556         if (ret < 0) {
557                 GError *error = bt_core_error(BT_CORE_ERROR_REJECT,
558                                                         "Deactivation failed");
559                 dbus_g_method_return_error(context, error);
560                 g_error_free(error);
561                 g_free(sender);
562                 return FALSE;
563         } else {
564                 dbus_g_method_return(context);
565         }
566
567         g_free(sender);
568         return TRUE;
569 }
570
571 static gboolean __bt_core_enable_core_timeout_cb(gpointer data)
572 {
573         BT_DBG("+");
574
575         _bt_core_init_vconf_value();
576
577         return FALSE;
578 }
579
580 static gboolean bt_core_enable_core(BtCore *agent,
581                                                 DBusGMethodInvocation *context)
582 {
583         char *sender = dbus_g_method_get_sender(context);
584
585         if (sender == NULL)
586                 return FALSE;
587
588         BT_DBG("+");
589
590         __bt_core_update_status();
591
592         g_timeout_add(200, (GSourceFunc)__bt_core_enable_core_timeout_cb, NULL);
593
594         dbus_g_method_return(context);
595
596         g_free(sender);
597
598         BT_DBG("-");
599         return TRUE;
600 }
601
602 static gboolean __bt_core_recovery_cb(gpointer data)
603 {
604         int ret = 0;
605         gboolean is_request_failed = FALSE;
606         static gboolean is_first_failure = TRUE;
607
608         BT_DBG("+");
609
610         if (_bt_core_get_bt_status(BT_RECOVERY_MODE) == 1) {
611                 ret = _bt_core_service_request_adapter(BT_ENABLE_ADAPTER);
612                 if (ret < 0)
613                         is_request_failed = TRUE;
614         }
615
616         if (_bt_core_get_bt_le_status(BT_RECOVERY_MODE) == 1) {
617                 ret = _bt_core_service_request_adapter(BT_ENABLE_ADAPTER_LE);
618                 if (ret < 0)
619                         is_request_failed = TRUE;
620         }
621
622         if (is_request_failed == TRUE) {
623                 BT_ERR("Recovery is failed.");
624                 if (is_first_failure == TRUE) {
625                         g_timeout_add(2000, (GSourceFunc)__bt_core_recovery_cb, NULL);
626                         is_first_failure = FALSE;
627                         return FALSE;
628                 } else {
629                         is_first_failure = TRUE;
630                         return FALSE;
631                 }
632         } else
633                 is_first_failure = TRUE;
634
635         if (_bt_core_get_bt_status(BT_RECOVERY_MODE) == 1) {
636                 _bt_core_set_bt_status(BT_RECOVERY_MODE, 0);
637                 ret = _bt_enable_adapter();
638                 if (ret < 0)
639                         BT_ERR("_bt_enable_adapter() failed");
640         }
641         if (_bt_core_get_bt_le_status(BT_RECOVERY_MODE) == 1) {
642                 _bt_core_set_bt_le_status(BT_RECOVERY_MODE, 0);
643                 ret = _bt_enable_adapter_le();
644                 if (ret < 0)
645                         BT_ERR("_bt_enable_adapter_le() failed");
646         }
647
648         is_recovery_mode = FALSE;
649
650         BT_DBG("-");
651
652         return FALSE;
653 }
654
655 static gboolean __bt_core_enable_timeout_cb(gpointer data)
656 {
657         bt_status_t adapter_status;
658         bt_le_status_t adapter_status_le;
659
660         BT_DBG("");
661
662         if (vconf_set_int(BT_OFF_DUE_TO_FLIGHT_MODE, 0) != 0)
663                 BT_ERR("Set vconf failed");
664
665         adapter_status = _bt_core_get_status();
666         adapter_status_le = _bt_core_get_le_status();
667
668         if (adapter_status == BT_DEACTIVATED &&
669                         _bt_core_get_bt_status(BT_FLIGHT_MODE) != 0) {
670                 _bt_core_set_bt_status(BT_FLIGHT_MODE, 0);
671                 _bt_core_service_request_adapter(BT_ENABLE_ADAPTER);
672                 _bt_enable_adapter();
673         }
674
675         if (adapter_status_le == BT_LE_DEACTIVATED &&
676                         _bt_core_get_bt_le_status(BT_FLIGHT_MODE) != 0) {
677                 _bt_core_set_bt_le_status(BT_FLIGHT_MODE, 0);
678                 _bt_core_service_request_adapter(BT_ENABLE_ADAPTER_LE);
679                 _bt_enable_adapter_le();
680         }
681
682         return FALSE;
683 }
684
685 static gboolean __bt_core_disable_timeout_cb(gpointer data)
686 {
687         bt_status_t adapter_status;
688         bt_le_status_t adapter_status_le;
689
690         BT_DBG("");
691
692         if (vconf_set_int(BT_OFF_DUE_TO_FLIGHT_MODE, 1) != 0)
693                 BT_ERR("Set vconf failed");
694
695         adapter_status = _bt_core_get_status();
696         adapter_status_le = _bt_core_get_le_status();
697
698         if (adapter_status == BT_ACTIVATED) {
699                 int bt_status_before_mode = 0;
700
701                 if (vconf_get_int(VCONFKEY_BT_STATUS, &bt_status_before_mode) == 0)
702                         _bt_core_set_bt_status(BT_FLIGHT_MODE, bt_status_before_mode);
703
704                 _bt_core_service_request_adapter(BT_DISABLE_ADAPTER);
705                 _bt_disable_adapter();
706         }
707
708         if (adapter_status_le == BT_LE_ACTIVATED) {
709                 int bt_le_status_before_mode = 0;
710
711 #ifdef ENABLE_TIZEN_2_4
712                 if (vconf_get_int(VCONFKEY_BT_LE_STATUS, &bt_le_status_before_mode) == 0)
713                         _bt_core_set_bt_le_status(BT_FLIGHT_MODE, bt_le_status_before_mode);
714 #endif
715
716                 _bt_core_service_request_adapter(BT_DISABLE_ADAPTER_LE);
717                 _bt_disable_adapter_le();
718         }
719
720         return FALSE;
721 }
722
723 void _bt_core_adapter_added_cb(void)
724 {
725         bt_status_t status;
726         bt_le_status_t le_status;
727         gboolean flight_mode_status;
728
729         BT_DBG("");
730
731         status = _bt_core_get_status();
732         BT_DBG("status : %d", status);
733         le_status = _bt_core_get_le_status();
734         BT_DBG("le_status : %d", le_status);
735
736         if (status == BT_ACTIVATING)
737                 __bt_core_set_status(BT_ACTIVATED);
738         if (le_status == BT_LE_ACTIVATING)
739                 __bt_core_set_le_status(BT_LE_ACTIVATED);
740
741         flight_mode_status = _bt_core_is_flight_mode_enabled();
742
743         if (flight_mode_status == TRUE && _bt_is_flightmode_request() == TRUE) {
744                 _bt_set_flightmode_request(FALSE);
745                 g_timeout_add(2000, (GSourceFunc)__bt_core_disable_timeout_cb, NULL);
746                 return;
747         }
748         _bt_set_flightmode_request(FALSE);
749
750         _bt_core_terminate();
751 }
752
753 void _bt_core_adapter_removed_cb(void)
754 {
755         int flight_mode_value = 0;
756         int power_saving_mode = 0;
757         gboolean flight_mode_status;
758         static int timer_id = -1;
759
760         BT_DBG("");
761
762         __bt_core_set_status(BT_DEACTIVATED);
763         __bt_core_set_le_status(BT_LE_DEACTIVATED);
764         if (vconf_set_int(VCONFKEY_BT_STATUS, VCONFKEY_BT_STATUS_OFF) != 0)
765                 BT_ERR("Set vconf failed");
766 #ifdef ENABLE_TIZEN_2_4
767         if (vconf_set_int(VCONFKEY_BT_LE_STATUS, VCONFKEY_BT_LE_STATUS_OFF) != 0)
768                 BT_ERR("Set vconf failed");
769 #endif
770
771         if (is_recovery_mode == TRUE)
772         {
773                 if (timer_id < 0)
774                         timer_id = g_timeout_add(2000, (GSourceFunc)__bt_core_recovery_cb, NULL);
775                 return;
776         }
777
778         if (vconf_get_int(BT_OFF_DUE_TO_FLIGHT_MODE, &flight_mode_value) != 0)
779                 BT_ERR("Fail to get the flight_mode_deactivated value");
780
781         if (vconf_get_int(BT_OFF_DUE_TO_POWER_SAVING_MODE, &power_saving_mode) != 0)
782                 BT_ERR("Fail to get the ps_mode_deactivated value");
783
784         flight_mode_status = _bt_core_is_flight_mode_enabled();
785
786         if (flight_mode_status == FALSE && _bt_is_flightmode_request() == TRUE) {
787                 _bt_set_flightmode_request(FALSE);
788                 if (timer_id < 0)
789                         timer_id = g_timeout_add(2000, (GSourceFunc)__bt_core_enable_timeout_cb, NULL);
790                 return;
791         }
792         _bt_set_flightmode_request(FALSE);
793         
794         if (flight_mode_value == 1 || power_saving_mode == 1){
795                 BT_DBG("Bt Core not terminated");
796                 return;
797         }
798
799         _bt_core_terminate();
800 }
801