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