Use Trusted Profiles instead of Restricted Profiles
[platform/core/connectivity/bluetooth-frwk.git] / bt-service / bt-service-event-receiver.c
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  *              http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 #include <glib.h>
19 #include <string.h>
20 #include <dlog.h>
21 #include <vconf.h>
22 #include <vconf-internal-bt-keys.h>
23
24 #include "bluetooth-api.h"
25 #include "bt-internal-types.h"
26
27 #include "bt-service-common.h"
28 #include "bt-service-event.h"
29 #include "bt-service-main.h"
30 #include "bt-service-adapter.h"
31 #include "bt-service-adapter-le.h"
32 #include "bt-service-device.h"
33 #include "bt-service-avrcp.h"
34 #include "bt-service-obex-server.h"
35 #include "bt-service-rfcomm-server.h"
36 #include "bt-service-audio.h"
37 #include "bt-service-agent.h"
38 #include "bt-service-pbap.h"
39 #include "bt-service-headset-connection.h"
40 #include "bt-service-avrcp-controller.h"
41 #include "bt-service-hid.h"
42 #include "bt-service-proximity.h"
43
44 #include "bt-service-opp-client.h"
45 #include "bt-service-map-client.h"
46 #include "bt-service-tds.h"
47
48 #ifdef TIZEN_FEATURE_BT_DPM
49 #include "bt-service-dpm.h"
50 #endif
51
52 #define DBUS_TIMEOUT 20 * 1000 /* 20 Sec */
53 static GDBusConnection *manager_conn;
54 static GDBusConnection *obexd_conn;
55 static GDBusConnection *opc_obexd_conn;
56 static GDBusConnection *map_obexd_conn;
57
58 static GList *p_cache_list = NULL;
59
60 static guint event_id;
61 static guint le_scan_event_id = 0;
62 static guint session_reinit_timer;
63 guint nap_connected_device_count = 0;
64 static guint hid_connected_device_count = 0;
65 static GList *p_adv_ind_list = NULL;
66
67 typedef struct {
68         bt_remote_dev_info_t *dev_info;
69 } bt_cache_info_t;
70
71 /**
72  * obexd connection type
73  */
74 typedef enum {
75         OBEX_OPP = (1 << 1),
76         OBEX_FTP = (1 << 2),
77         OBEX_BIP = (1 << 3),
78         OBEX_PBAP = (1 << 4),
79         OBEX_IRMC = (1 << 5),
80         OBEX_PCSUITE = (1 << 6),
81         OBEX_SYNCEVOLUTION = (1 << 7),
82         OBEX_MAS = (1 << 8),
83         OBEX_MAP = (1 << 9),
84 } bluetooth_obex_connection_type_t;
85
86 void _bt_handle_property_changed_event(GVariant *msg, const char *object_path);
87 void _bt_opc_property_changed_event(GVariant *msg, char *path);
88 void _bt_map_property_changed_event(GVariant *msg, const char *path);
89 int _bt_register_service_event(GDBusConnection *g_conn, int event_type);
90 void _bt_unregister_service_event(GDBusConnection *g_conn, int event_type);
91 void _bt_opp_client_event_deinit(void);
92 void _bt_map_client_event_deinit(void);
93 void _bt_handle_network_client_event(GVariant *msg_iter,
94                                 const char *path);
95 void __bt_gatt_char_property_changed_event(GVariant *msg_iter,
96                                 const char *path);
97 void _bt_map_on_transfer_finished(const char *transfer_object_path, const int error);
98
99 static void __bt_free_bt_le_adv_info_t(gpointer data)
100 {
101         bt_le_adv_info_t *adv_info = data;
102
103         if (adv_info->timer_id)
104                 g_source_remove(adv_info->timer_id);
105         adv_info->timer_id = 0;
106
107         g_free(adv_info->addr);
108         g_free(adv_info->data);
109         g_free(adv_info);
110 }
111
112 static bt_le_adv_info_t *__bt_get_adv_ind_info(char *addr)
113 {
114         retv_if(!addr, NULL);
115         bt_le_adv_info_t *adv_info = NULL;
116         GList *current = g_list_first((GList *)p_adv_ind_list);
117         while (current && current->data) {
118                 adv_info = (bt_le_adv_info_t *)current->data;
119                 if (adv_info && !g_strcmp0(adv_info->addr, addr))
120                         return adv_info;
121                 current = g_list_next(current);
122         }
123         return NULL;
124 }
125
126 static int __bt_add_adv_ind_info(bt_le_adv_info_t *adv_info)
127 {
128         retv_if(!adv_info, -1);
129         if (__bt_get_adv_ind_info(adv_info->addr) != NULL) {
130                 __bt_free_bt_le_adv_info_t(adv_info);
131                 return -1;
132         }
133         p_adv_ind_list = g_list_append(p_adv_ind_list, adv_info);
134
135         return 0;
136 }
137
138 static void __bt_del_adv_ind_info(char *addr)
139 {
140         ret_if(!addr);
141         ret_if(!p_adv_ind_list);
142         bt_le_adv_info_t *adv_info = NULL;
143         GList *current = g_list_first((GList *)p_adv_ind_list);
144         while (current && current->data) {
145                 adv_info = (bt_le_adv_info_t *)current->data;
146                 if (adv_info && !g_strcmp0(adv_info->addr, addr)) {
147                         p_adv_ind_list = g_list_remove(p_adv_ind_list, adv_info);
148                         __bt_free_bt_le_adv_info_t(adv_info);
149                         return;
150                 }
151                 current = g_list_next(current);
152         }
153 }
154
155 static gboolean __bt_adv_scan_req_timeout_cb(gpointer user_data)
156 {
157         bt_remote_le_dev_info_t le_dev_info;
158         bt_le_adv_info_t *adv_info = (bt_le_adv_info_t*)user_data;
159
160         memset(&le_dev_info, 0x00, sizeof(bt_remote_le_dev_info_t));
161
162         le_dev_info.address = adv_info->addr;
163         le_dev_info.addr_type = adv_info->addr_type;
164         le_dev_info.rssi = adv_info->rssi;
165         le_dev_info.adv_data = adv_info->data;
166         le_dev_info.adv_data_len = 0;
167         adv_info->timer_id = 0;
168
169         _bt_send_scan_result_event(&le_dev_info, adv_info);
170         __bt_del_adv_ind_info(adv_info->addr);
171
172         return FALSE;
173 }
174
175 static void __bt_free_cache_info(bt_cache_info_t *cache_info)
176 {
177         ret_if(cache_info == NULL);
178         _bt_free_device_info(cache_info->dev_info);
179         g_free(cache_info);
180 }
181
182 static gboolean __bt_parse_device_properties(GVariant *item,
183                                                 bt_remote_dev_info_t *dev_info)
184 {
185         GVariantIter iter;
186         gchar *key;
187         GVariant *val;
188         gsize len = 0;
189         if (item == NULL)
190                 return FALSE;
191
192         g_variant_iter_init(&iter, item);
193         while (g_variant_iter_loop(&iter, "{sv}", &key, &val)) {
194                 if (strcasecmp(key, "Address") == 0)  {
195                         dev_info->address = g_variant_dup_string(val, &len);
196                 } else if (strcasecmp(key, "Class") == 0) {
197                         dev_info->class = g_variant_get_uint32(val);
198                 } else if (strcasecmp(key, "name") == 0) {
199                         if (dev_info->name == NULL)
200                                 dev_info->name = g_variant_dup_string(val, &len);
201                 } else if (strcasecmp(key, "Connected") == 0) {
202                         dev_info->connected = g_variant_get_byte(val);
203                 } else if (strcasecmp(key, "paired") == 0) {
204                         dev_info->paired = g_variant_get_boolean(val);
205                 } else if (strcasecmp(key, "Trusted") == 0) {
206                         dev_info->trust = g_variant_get_boolean(val);
207                 } else if (strcasecmp(key, "RSSI") == 0) {
208                         dev_info->rssi = g_variant_get_int16(val);
209                 } else if (strcasecmp(key, "LastAddrType") == 0) {
210                         dev_info->addr_type = g_variant_get_byte(val);
211                 } else if (strcasecmp(key, "UUIDs") == 0) {
212                         char **uuid_value;
213                         gsize size = 0;
214                         int i = 0;
215                         size = g_variant_get_size(val);
216
217                         if (size > 0) {
218                                 uuid_value = (char **)g_variant_get_strv(val, &size);
219                                 if (dev_info->uuids == NULL)
220                                         dev_info->uuids = g_malloc0(sizeof(char *) * size);
221
222                                 for (i = 0; uuid_value[i] != NULL; i++) {
223                                         dev_info->uuid_count++;
224                                         dev_info->uuids[i] = g_strdup(uuid_value[i]);
225                                 }
226                                 g_free(uuid_value);
227                         }
228                 } else if (strcasecmp(key, "ManufacturerDataLen") == 0) {
229                         g_variant_get(val, "q", &dev_info->manufacturer_data_len);
230                         if (dev_info->manufacturer_data_len > BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX) {
231                                 BT_ERR("manufacturer_data_len is too long(len = %d)", dev_info->manufacturer_data_len);
232                                 dev_info->manufacturer_data_len = BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX;
233                         }
234
235                         if (dev_info->manufacturer_data_len == 0)
236                                 dev_info->manufacturer_data = g_strdup("");
237                 } else if (strcasecmp(key, "ManufacturerData") == 0) {
238                         int i = 0;
239                         int len = 0;
240                         GVariantIter *value_iter;
241                         guint8 m_value;
242
243                         len = g_variant_get_size(val);
244                         if (len <= 0)
245                                 continue;
246
247                         dev_info->manufacturer_data = g_malloc0(len);
248
249                         g_variant_get(val, "ay", &value_iter);
250                         while (g_variant_iter_loop(value_iter, "y", &m_value))
251                                 dev_info->manufacturer_data[i++] = m_value;
252                         g_variant_iter_free(value_iter);
253                 }
254         }
255
256         BT_DBG("-");
257         return TRUE;
258 }
259
260 static gboolean __bt_parse_interface(GVariant *msg,
261                                         bt_remote_dev_info_t *dev_info)
262 {
263         char *path = NULL;
264         GVariant *optional_param = NULL;
265         GVariantIter iter;
266         GVariant *child;
267         char *interface_name = NULL;
268         GVariant *inner_iter = NULL;
269         g_variant_get(msg, "(&o@a{sa{sv}})",
270                                         &path, &optional_param);
271         g_variant_iter_init(&iter, optional_param);
272
273         retv_if(optional_param == NULL, FALSE);
274
275         while ((child = g_variant_iter_next_value(&iter))) {
276                 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
277                 if (g_strcmp0(interface_name, BT_DEVICE_INTERFACE) == 0) {
278                         BT_DBG("Found a device: %s", path);
279                         if (__bt_parse_device_properties(inner_iter,
280                                 dev_info) == FALSE) {
281                                 g_variant_unref(inner_iter);
282                                 g_variant_unref(child);
283                                 g_variant_unref(optional_param);
284                                 BT_ERR("Fail to parse the properies");
285                                 return FALSE;
286                         } else {
287                                 g_variant_unref(inner_iter);
288                                 g_variant_unref(child);
289                                 g_variant_unref(optional_param);
290                                 return TRUE;
291                         }
292                 }
293                 g_variant_unref(inner_iter);
294                 g_variant_unref(child);
295         }
296
297         g_variant_unref(optional_param);
298
299         return FALSE;
300 }
301
302 static int __bt_get_owner_info(GVariant *msg, char **name,
303                                 char **previous, char **current)
304 {
305         g_variant_get(msg, "(sss)", name, previous, current);
306         return BLUETOOTH_ERROR_NONE;
307 }
308
309 static int __bt_get_agent_signal_info(GVariant *msg, char **address,
310                                 char **name, char **uuid)
311 {
312         g_variant_get(msg, "(sss)", address, name, uuid);
313         return BLUETOOTH_ERROR_NONE;
314 }
315
316 void __bt_set_device_values(gboolean connected, int state)
317 {
318         int bt_device_state = VCONFKEY_BT_DEVICE_NONE;
319
320         if (vconf_get_int(VCONFKEY_BT_DEVICE, &bt_device_state) != 0)
321                 BT_ERR("vconf_get_int failed");
322
323         if (connected == TRUE)
324                 bt_device_state |= state;
325         else if (bt_device_state & state)
326                 bt_device_state ^= state;
327
328         if (vconf_set_int(VCONFKEY_BT_DEVICE, bt_device_state) != 0)
329                 BT_ERR("vconf_set_int failed");
330 }
331
332 gboolean _bt_discovery_finished_cb(gpointer user_data)
333 {
334         int result = BLUETOOTH_ERROR_NONE;
335         event_id = 0;
336         GVariant *param = NULL;
337         if (_bt_get_discovering_property(DISCOVERY_ROLE_BREDR) == FALSE) {
338                 if (_bt_get_cancel_by_user() == TRUE)
339                         result = BLUETOOTH_ERROR_CANCEL_BY_USER;
340
341                 _bt_set_cancel_by_user(FALSE);
342                 _bt_set_discovery_status(FALSE);
343                 param = g_variant_new("(i)", result);
344                 _bt_send_event(BT_ADAPTER_EVENT,
345                         BLUETOOTH_EVENT_DISCOVERY_FINISHED,
346                         param);
347         }
348
349         return FALSE;
350 }
351
352 static gboolean __bt_le_discovery_finished_cb(gpointer user_data)
353 {
354         int result = BLUETOOTH_ERROR_NONE;
355         le_scan_event_id = 0;
356         GVariant *param = NULL;
357         if (_bt_get_discovering_property(DISCOVERY_ROLE_LE) == FALSE) {
358                 if (_bt_get_cancel_by_user() == TRUE)
359                         result = BLUETOOTH_ERROR_CANCEL_BY_USER;
360
361                 g_list_free_full(p_adv_ind_list, __bt_free_bt_le_adv_info_t);
362                 p_adv_ind_list = NULL;
363
364                 _bt_set_cancel_by_user(FALSE);
365                 _bt_disable_all_scanner_status();
366                 _bt_set_le_scan_status(FALSE);
367                 param = g_variant_new("(i)", result);
368                 _bt_send_event(BT_LE_ADAPTER_EVENT,
369                         BLUETOOTH_EVENT_LE_DISCOVERY_FINISHED,
370                         param);
371         }
372
373         return FALSE;
374 }
375
376 void __bt_update_remote_cache_devinfo(const char *address, gboolean paired_status)
377 {
378         BT_DBG("+");
379
380         ret_if(address == NULL);
381
382         GList * node;
383         bt_cache_info_t *cache_info;
384         bt_remote_dev_info_t *dev_info;
385
386         node = g_list_first(p_cache_list);
387
388         while (node != NULL) {
389                 cache_info = (bt_cache_info_t *)node->data;
390
391                 if (cache_info == NULL) {
392                         node = g_list_next(node);
393                         continue;
394                 }
395
396                 dev_info = cache_info->dev_info;
397                 if (strcasecmp(dev_info->address,
398                                         address) == 0) {
399                         BT_DBG("Device Found");
400                         if (paired_status == TRUE)
401                                 cache_info->dev_info->paired = TRUE;
402                         else
403                                 cache_info->dev_info->paired = FALSE;
404                         break;
405                 }
406                 node = g_list_next(node);
407         }
408         BT_DBG("-");
409 }
410
411 gboolean __bt_handle_is_flight_mode_enabled(void)
412 {
413 #ifdef TIZEN_FEATURE_FLIGHTMODE_ENABLED
414         int is_flight_mode = 0;
415         int ret = -1;
416
417         ret = vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &is_flight_mode);
418         if (ret != 0)
419                 BT_ERR("vconf_get_bool failed");
420
421         return (is_flight_mode == 0) ? FALSE : TRUE;
422 #else
423         return FALSE;
424 #endif
425 }
426
427 void _bt_handle_adapter_event(GVariant *msg, const char *member)
428 {
429         BT_DBG("+");
430
431         int result = BLUETOOTH_ERROR_NONE;
432         GVariant *param = NULL;
433         ret_if(member == NULL);
434
435         if (strcasecmp(member, "DeviceCreated") == 0) {
436                 char *object_path = NULL;
437                 char *address;
438                 bt_remote_dev_info_t *remote_dev_info;
439
440                 ret_if(_bt_is_device_creating() == FALSE);
441
442                 /* Bonding from remote device */
443                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
444
445                 g_variant_get(msg, "(&o)", &object_path);
446                 _bt_convert_device_path_to_address((const char*)object_path, address);
447
448                 remote_dev_info = _bt_get_remote_device_info_by_object_path(object_path);
449                 if (remote_dev_info == NULL) {
450                         g_free(address);
451                         return;
452                 }
453
454                 _bt_free_device_info(remote_dev_info);
455                 g_free(address);
456         } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
457                 char *object_path = NULL;
458                 char *address;
459                 bt_cache_info_t *cache_info;
460                 bt_remote_dev_info_t *dev_info;
461                 GList * node;
462
463                 /* Bonding from remote device */
464                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
465
466                 g_variant_get(msg, "(&o)", &object_path);
467
468                 _bt_convert_device_path_to_address((const char *)object_path, address);
469
470                 node = g_list_first(p_cache_list);
471
472                 while (node != NULL) {
473                         cache_info = (bt_cache_info_t *)node->data;
474
475                         if (cache_info == NULL) {
476                                 node = g_list_next(node);
477                                 continue;
478                         }
479
480                         dev_info = cache_info->dev_info;
481                         if (strcasecmp(dev_info->address,
482                                                 address) == 0) {
483                                 p_cache_list = g_list_remove(p_cache_list,
484                                                 cache_info);
485                                 __bt_free_cache_info(cache_info);
486                                 break;
487                         }
488                         node = g_list_next(node);
489                 }
490                 g_free(address);
491         } else if (strcasecmp(member, "AdvertisingEnabled") == 0) {
492                 BT_DBG("Advertising Enabled");
493                 int slot_id;
494                 int event;
495                 int adv_handle;
496                 gboolean status = FALSE;
497
498                 g_variant_get(msg, "(ib)", &slot_id, &status);
499
500                 BT_DBG("Advertising Enabled : slot_id [%d]  status [%d]", slot_id, status);
501
502                 /* Send event to application */
503                 _bt_set_advertising_status(slot_id, status);
504
505                 adv_handle = _bt_get_adv_slot_adv_handle(slot_id);
506
507                 if (status)
508                         event = BLUETOOTH_EVENT_ADVERTISING_STARTED;
509                 else
510                         event = BLUETOOTH_EVENT_ADVERTISING_STOPPED;
511                 param = g_variant_new("(ii)", result,
512                                         adv_handle);
513
514                 const char *sender;
515                 sender = _bt_get_adv_slot_owner(slot_id);
516                 _bt_send_event_to_dest(sender, BT_ADAPTER_EVENT,
517                                 event,
518                                 param);
519
520                 if (event == BLUETOOTH_EVENT_ADVERTISING_STOPPED) {
521                         char *name = g_strdup(sender);
522
523                         _bt_unregister_adv_slot_owner(slot_id);
524
525                         /* Advertising disabled, notify TDS */
526                         _bt_tds_handle_adv_disabled(name, adv_handle);
527                         g_free(name);
528                 }
529         } else if (strcasecmp(member, "RssiEnabled") == 0) {
530                 BT_DBG("RSSI Enabled");
531                 gboolean status = FALSE;
532                 char *address = NULL;
533                 int link_type;
534                 g_variant_get(msg, "(sib)", &address, &link_type, &status);
535
536                 BT_DBG("RSSI Enabled [%s %d]", address, status);
537                 param = g_variant_new("(isib)", result,
538                                         address, link_type, status);
539                 _bt_send_event(BT_DEVICE_EVENT,
540                                 BLUETOOTH_EVENT_RSSI_ENABLED,
541                                 param);
542                 g_free(address);
543         } else if (strcasecmp(member, "RssiAlert") == 0) {
544                 BT_DBG("RSSI Alert");
545                 int alert_type;
546                 int rssi_dbm;
547                 int link_type;
548                 char *address = NULL;
549                 g_variant_get(msg, "(siii)", &address, &link_type, &alert_type, &rssi_dbm);
550
551                 BT_DBG("RSSI Alert: [Address %s LinkType %d] [Type %d DBM %d]",
552                                 address, alert_type, rssi_dbm);
553                 param = g_variant_new("(isiii)", result,
554                                         address, link_type, alert_type, rssi_dbm);
555                 _bt_send_event(BT_DEVICE_EVENT,
556                                 BLUETOOTH_EVENT_RSSI_ALERT,
557                                 param);
558                 g_free(address);
559         } else if (strcasecmp(member, "RawRssi") == 0) {
560                 BT_DBG("RSSI Raw");
561                 int rssi_dbm;
562                 int link_type;
563                 char *address = NULL;
564                 g_variant_get(msg, "(sii)", &address, &link_type, &rssi_dbm);
565
566                 BT_DBG("Raw RSSI: [Address %s] [Link Type %d][RSSI DBM %d]",
567                                 address, link_type, rssi_dbm);
568                 param = g_variant_new("(isii)", result,
569                                         address, link_type, rssi_dbm);
570                 _bt_send_event(BT_DEVICE_EVENT,
571                                 BLUETOOTH_EVENT_RAW_RSSI,
572                                 param);
573                 g_free(address);
574         } else if (strcasecmp(member, BT_HARDWARE_ERROR) == 0) {
575                 BT_ERR_C("### Hardware error received from BLUEZ");
576 /* Don't add the recovery logic into platform */
577 #if 0
578                 _bt_recover_adapter();
579 #endif
580         } else if (strcasecmp(member, BT_TX_TIMEOUT_ERROR) == 0) {
581                 BT_ERR_C("### Tx timeout error received from BLUEZ");
582 /* Don't add the recovery logic into platform */
583 #if 0
584                 _bt_recover_adapter();
585 #endif
586         }
587         BT_DBG("-");
588 }
589
590 static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
591 {
592         GDBusProxy *adapter_proxy;
593         int mode = 0;
594         int result = BLUETOOTH_ERROR_NONE;
595         GVariantIter value_iter;
596         GVariant *val = NULL;
597         GVariant *ret = NULL;
598         GError *err = NULL;
599         char *property = NULL;
600         GVariant *param = NULL;
601         g_variant_iter_init(&value_iter, msg);
602         while ((g_variant_iter_loop(&value_iter, "{sv}", &property, &val))) {
603                 BT_INFO("Property %s", property);
604
605                 if (strcasecmp(property, "Discovering") == 0) {
606                         gboolean discovering = FALSE;
607                         g_variant_get(val, "b", &discovering);
608                         /* Send event to application */
609                         BT_DBG("Discovering %d", discovering);
610                         if (_bt_adapter_get_status() != BT_ACTIVATED)
611                                 return;
612
613                         if (discovering == TRUE) {
614                                 _bt_set_discovery_status(TRUE);
615                                 param = g_variant_new("(i)", result);
616                                 _bt_send_event(BT_ADAPTER_EVENT,
617                                         BLUETOOTH_EVENT_DISCOVERY_STARTED,
618                                         param);
619                         } else {
620                                 ret_if(event_id > 0);
621
622                                 adapter_proxy = _bt_get_adapter_proxy();
623                                 ret_if(adapter_proxy == NULL);
624
625                                 /* Need to stop searching */
626                                 ret = g_dbus_proxy_call_sync(adapter_proxy, "StopDiscovery",
627                                         NULL,
628                                         G_DBUS_CALL_FLAGS_NONE,
629                                         DBUS_TIMEOUT, NULL,
630                                         &err);
631                                 if (err) {
632                                         BT_ERR("Dbus Error : %s", err->message);
633                                         g_clear_error(&err);
634                                 }
635                                 if (ret)
636                                         g_variant_unref(ret);
637
638                                 event_id = g_timeout_add(BT_DISCOVERY_FINISHED_DELAY,
639                                   (GSourceFunc)_bt_discovery_finished_cb, NULL);
640                         }
641                 } else if (strcasecmp(property, "LEDiscovering") == 0) {
642                         gboolean le_discovering = FALSE;
643
644                         g_variant_get(val, "b", &le_discovering);
645                         BT_DBG("LEDiscovering %d", le_discovering);
646                         if (_bt_adapter_get_status() != BT_ACTIVATED ||
647                                 _bt_adapter_get_le_status() != BT_LE_ACTIVATED)
648                                 return;
649
650                         /* Send event to application */
651                         if (le_discovering == TRUE) {
652                                 _bt_set_le_scan_status(TRUE);
653                                 param = g_variant_new("(i)", result);
654                                 _bt_send_event(BT_LE_ADAPTER_EVENT,
655                                 BLUETOOTH_EVENT_LE_DISCOVERY_STARTED,
656                                 param);
657                         } else {
658                                 ret_if(le_scan_event_id > 0);
659
660                                 adapter_proxy = _bt_get_adapter_proxy();
661                                 ret_if(adapter_proxy == NULL);
662
663                                 /* Need to stop searching */
664                                 ret = g_dbus_proxy_call_sync(adapter_proxy, "StopLEDiscovery",
665                                         NULL,
666                                         G_DBUS_CALL_FLAGS_NONE,
667                                         DBUS_TIMEOUT, NULL,
668                                         &err);
669                                 if (err) {
670                                         BT_ERR("Dbus Error %s", err->message);
671                                         g_clear_error(&err);
672                                 }
673                                 if (ret)
674                                         g_variant_unref(ret);
675
676                                 le_scan_event_id = g_timeout_add(BT_DISCOVERY_FINISHED_DELAY,
677                                                 (GSourceFunc)__bt_le_discovery_finished_cb, NULL);
678                                 }
679                 } else if (strcasecmp(property, "Name") == 0) {
680                         char *name = NULL;
681                         g_variant_get(val, "s", &name);
682                         param = g_variant_new("(is)", result, name);
683                         /* Send event to application */
684                         _bt_send_event(BT_ADAPTER_EVENT,
685                                 BLUETOOTH_EVENT_LOCAL_NAME_CHANGED,
686                                 param);
687                         g_free(name);
688                 } else if (strcasecmp(property, "Alias") == 0) {
689                         char *alias = NULL;
690                         g_variant_get(val, "s", &alias);
691                         param = g_variant_new("(is)", result, alias);
692                         /* Send event to application */
693                         _bt_send_event(BT_ADAPTER_EVENT,
694                                 BLUETOOTH_EVENT_LOCAL_NAME_CHANGED,
695                                 param);
696                         g_free(alias);
697                 } else if (strcasecmp(property, "Discoverable") == 0) {
698                         gboolean discoverable = FALSE;
699
700                         g_variant_get(val, "b", &discoverable);
701                         BT_DBG("discoverable %d", discoverable);
702
703                         if (discoverable == FALSE) {
704                                 if (_bt_get_discoverable_timeout_property() > 0) {
705                                         int time = 0;
706                                         adapter_proxy = _bt_get_adapter_properties_proxy();
707                                         ret_if(adapter_proxy == NULL);
708                                         ret = g_dbus_proxy_call_sync(adapter_proxy, "Set",
709                                                 g_variant_new("(ssv)", BT_ADAPTER_INTERFACE,
710                                                 "DiscoverableTimeout",
711                                                 g_variant_new("i", time)),
712                                                 G_DBUS_CALL_FLAGS_NONE,
713                                                 DBUS_TIMEOUT, NULL,
714                                                 &err);
715
716                                         if (err != NULL) {
717                                                 BT_ERR("StopLEDiscovery Failed: %s", err->message);
718                                                 g_error_free(err);
719                                         }
720                                         if (ret)
721                                                 g_variant_unref(ret);
722                                 }
723
724                                 mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
725
726                                 /* Send event to application */
727                                 BT_INFO("[Connectable]");
728                                 param = g_variant_new("(in)", result, mode);
729                                 _bt_send_event(BT_ADAPTER_EVENT,
730                                         BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
731                                         param);
732                         } else {
733                                 _bt_get_discoverable_mode(&mode);
734
735                                 /* Event will be sent by "DiscoverableTimeout" signal */
736                                 if (mode != BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE) {
737                                         g_free(property);
738                                         g_variant_unref(val);
739                                         return;
740                                 }
741
742                                 /* Send event to application */
743                                 BT_INFO("[General Discoverable]");
744                                 param = g_variant_new("(in)", result, mode);
745                                 _bt_send_event(BT_ADAPTER_EVENT,
746                                         BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
747                                         param);
748                         }
749                 } else if (strcasecmp(property, "DiscoverableTimeout") == 0) {
750                         _bt_get_discoverable_mode(&mode);
751
752                         /* Event was already sent by "Discoverable" signal */
753                         if (mode == BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE ||
754                                 mode == BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE) {
755                                 g_free(property);
756                                 g_variant_unref(val);
757                                 return;
758                         }
759
760                         /* Send event to application */
761                         BT_INFO("[Limited Discoverable (Timeout %u secs)]",
762                         _bt_get_discoverable_timeout_property());
763                         param = g_variant_new("(in)", result, mode);
764                         _bt_send_event(BT_ADAPTER_EVENT,
765                                 BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
766                                 param);
767                 } else if (strcasecmp(property, "Powered") == 0) {
768                         /* TODO: Need to check this operation!! */
769                         gboolean powered = FALSE;
770                         int bt_state;
771
772                         g_variant_get(val, "b", &powered);
773                         BT_DBG("Powered = %d", powered);
774                         if (powered == FALSE) {
775 #ifdef TIZEN_FEATURE_BT_USB_DONGLE
776                                 _bt_handle_adapter_removed();
777 #else
778                                 if (vconf_get_int(VCONFKEY_BT_STATUS, &bt_state) == 0 &&
779                                 bt_state != VCONFKEY_BT_STATUS_OFF) {
780                                         if (__bt_handle_is_flight_mode_enabled() == FALSE)
781                                                 _bt_disable_adapter();
782                                         else
783                                                 _bt_handle_adapter_removed();
784                                 }
785 #endif
786                                 if (vconf_get_int(VCONFKEY_BT_LE_STATUS, &bt_state) == 0 &&
787                                         bt_state != VCONFKEY_BT_LE_STATUS_OFF) {
788                                         _bt_set_le_disabled(BLUETOOTH_ERROR_NONE);
789                                 }
790                         } else {
791 #ifdef TIZEN_FEATURE_BT_USB_DONGLE
792                                 _bt_handle_adapter_added();
793 #endif
794                         }
795                 } else if (strcasecmp(property, "Connectable") == 0) {
796                         gboolean connectable = FALSE;
797
798                         g_variant_get(val, "b", &connectable);
799
800                         BT_DBG("Connectable property is changed : %d", connectable);
801                         param = g_variant_new("(b)", connectable);
802                         _bt_send_event(BT_ADAPTER_EVENT,
803                                 BLUETOOTH_EVENT_CONNECTABLE_CHANGED,
804                                 param);
805 #if 0
806                         if (_bt_adapter_get_status() == BT_DEACTIVATING &&
807                         _bt_adapter_get_le_status() == BT_LE_ACTIVATED &&
808                         connectable == 0)
809                         _bt_set_disabled(BLUETOOTH_ERROR_NONE);
810 #endif
811                 } else if (strcasecmp(property, "SupportedLEFeatures") == 0) {
812                         char *name = NULL;
813                         char *value = NULL;
814                         GVariantIter *iter = NULL;
815                         g_variant_get(val, "as", &iter);
816
817                         ret_if(iter == NULL);
818
819                         while (g_variant_iter_loop(iter, "s", &name)) {
820                                 BT_DBG("name = %s", name);
821                                 g_variant_iter_loop(iter, "s", &value);
822                                 BT_DBG("Value = %s", value);
823                                 if (FALSE == _bt_update_le_feature_support(name, value))
824                                         BT_INFO("Fail to update LE feature info");
825                         }
826
827                         g_variant_iter_free(iter);
828                 } else if (strcasecmp(property, "IpspInitStateChanged") == 0) {
829                         gboolean ipsp_initialized = FALSE;
830
831                         g_variant_get(val, "b", &ipsp_initialized);
832                         BT_DBG("IPSP init state changed: %d", ipsp_initialized);
833                         param = g_variant_new("(b)", ipsp_initialized);
834
835                         /* Send event to application */
836                         _bt_send_event(BT_ADAPTER_EVENT,
837                                         BLUETOOTH_EVENT_IPSP_INIT_STATE_CHANGED,
838                                         param);
839                 } else {
840                         BT_DBG("property : [%s]", property);
841                 }
842         }
843 }
844
845 static void __bt_obex_property_changed_event(GVariant *msg, const char *path)
846 {
847         BT_DBG("+");
848
849         GVariantIter value_iter;
850         GVariant *child = NULL, *val = NULL;
851         char *property = NULL;
852         g_variant_iter_init(&value_iter, msg);
853         while ((child = g_variant_iter_next_value(&value_iter))) {
854                 g_variant_get(child, "{sv}", &property, &val);
855
856                 ret_if(property == NULL);
857
858                 BT_DBG("property :%s", property);
859
860                 if (strcasecmp(property, "Status") == 0) {
861                         char  *status;
862                         g_variant_get(val, "s", &status);
863
864                         if (strcasecmp(status, "active") == 0) {
865                                 _bt_obex_transfer_started(path);
866                         } else if (strcasecmp(status, "complete") == 0) {
867                                 _bt_obex_transfer_completed(path, TRUE);
868                                 _bt_pbap_obex_transfer_completed(path, TRUE);
869                         } else if (strcasecmp(status, "error") == 0) {
870                                 _bt_obex_transfer_completed(path, FALSE);
871                                 _bt_pbap_obex_transfer_completed(path, FALSE);
872                         }
873                         g_free(status);
874                 } else if (strcasecmp(property, "Transferred") == 0) {
875                         guint64 transferred  = 0;
876                         /* As Transferred is expected guint64 so change int to guint64 and
877                          * eariler transferred is static because of it can overwrite data
878                          * on present on opc_obex_conn or obexd_conn as these are
879                          * static memory are in sequential */
880                         g_variant_get(val, "t", &transferred);
881
882                         _bt_obex_transfer_progress(path, transferred);
883                 }
884                 /* TODO: MAP, "Complete"? see above */
885                 g_free(property);
886                 g_variant_unref(val);
887                 g_variant_unref(child);
888         }
889         BT_DBG("-");
890 }
891
892 static void __bt_device_property_changed_event(GVariant *msg, const char *path)
893 {
894         BT_DBG("+");
895
896         int event;
897         int result = BLUETOOTH_ERROR_NONE;
898         GVariantIter value_iter;
899         GVariant *val;
900         char *property = NULL;
901         char *address;
902         GVariant *param = NULL;
903         g_variant_iter_init(&value_iter, msg);
904 #ifdef TIZEN_FEATURE_BT_DPM
905         int desktop_state = DPM_BT_ERROR;
906 #endif
907         while ((g_variant_iter_loop(&value_iter, "{sv}", &property, &val))) {
908                 BT_DBG("Property %s", property);
909                 if (strcasecmp(property, "Connected") == 0) {
910                         guint connected = 0;
911
912                         g_variant_get(val, "i", &connected);
913
914                         event = (connected != BLUETOOTH_CONNECTED_LINK_NONE) ?
915                                 BLUETOOTH_EVENT_DEVICE_CONNECTED :
916                                 BLUETOOTH_EVENT_DEVICE_DISCONNECTED;
917
918                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
919
920                         _bt_convert_device_path_to_address(path, address);
921
922                         BT_DBG("connected: %d", connected);
923                         BT_DBG("address: %s", address);
924
925                         param = g_variant_new("(is)", result, address);
926                         /* Send event to application */
927                         _bt_send_event(BT_DEVICE_EVENT,
928                                         event,
929                                         param);
930                         g_free(address);
931                 } else if (strcasecmp(property, "RSSI") == 0) {
932                         bt_remote_dev_info_t *remote_dev_info;
933
934                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
935
936                         _bt_convert_device_path_to_address(path, address);
937                         BT_DBG("address: %s", address);
938
939                         g_free(address);
940
941                         remote_dev_info = _bt_get_remote_device_info_by_object_path(path);
942                         if (remote_dev_info == NULL) {
943                                 g_free(property);
944                                 g_variant_unref(val);
945                                 return;
946                         }
947                         BT_DBG("Address type  %d", remote_dev_info->addr_type);
948
949                         if (remote_dev_info->addr_type == 0) {
950                                 BT_DBG("Name %s", remote_dev_info->name);
951
952 #ifdef TIZEN_FEATURE_BT_DPM
953                                 _bt_dpm_get_bluetooth_desktop_connectivity_state(&desktop_state);
954                                 if (desktop_state == DPM_RESTRICTED) {
955                                         bluetooth_device_class_t device_class;
956                                         _bt_divide_device_class(&device_class, remote_dev_info->class);
957
958                                         if (device_class.major_class ==
959                                                 BLUETOOTH_DEVICE_MAJOR_CLASS_COMPUTER) {
960                                                 _bt_free_device_info(remote_dev_info);
961                                                 g_free(property);
962                                                 g_variant_unref(val);
963                                                 return;
964                                         }
965                                 }
966 #endif
967
968                                 GVariant *uuids = NULL;
969                                 GVariantBuilder *builder = NULL;
970                                 int i = 0;
971                                 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
972                                 for (i = 0; i < remote_dev_info->uuid_count; i++) {
973                                         g_variant_builder_add(builder, "s",
974                                                 remote_dev_info->uuids[i]);
975                                 }
976                                 uuids = g_variant_new("as", builder);
977                                 g_variant_builder_unref(builder);
978                                 GVariant *manufacturer_data =  NULL;
979                                 manufacturer_data = g_variant_new_from_data(G_VARIANT_TYPE_BYTESTRING,
980                                                                         remote_dev_info->manufacturer_data,
981                                                                         remote_dev_info->manufacturer_data_len,
982                                                                         TRUE,
983                                                                         NULL, NULL);
984                                 param = g_variant_new("(isunsbub@asn@ay)", result,
985                                                         remote_dev_info->address,
986                                                         remote_dev_info->class,
987                                                         remote_dev_info->rssi,
988                                                         remote_dev_info->name,
989                                                         remote_dev_info->paired,
990                                                         remote_dev_info->connected,
991                                                         remote_dev_info->trust,
992                                                         uuids,
993                                                         remote_dev_info->manufacturer_data_len,
994                                                         manufacturer_data);
995
996                                 _bt_send_event(BT_ADAPTER_EVENT,
997                                         BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND,
998                                         param);
999                         }
1000                         _bt_free_device_info(remote_dev_info);
1001                 } else if (strcasecmp(property, "GattConnected") == 0) {
1002                         gboolean gatt_connected = FALSE;
1003
1004                         g_variant_get(val, "b", &gatt_connected);
1005
1006                         event = gatt_connected ? BLUETOOTH_EVENT_GATT_CONNECTED :
1007                                         BLUETOOTH_EVENT_GATT_DISCONNECTED;
1008
1009                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1010
1011                         _bt_convert_device_path_to_address(path, address);
1012
1013                         BT_DBG("gatt_connected: %d", gatt_connected);
1014                         BT_DBG("address: %s", address);
1015                         param = g_variant_new("(is)", result, address);
1016                         /* Send event to application */
1017                         _bt_send_event(BT_DEVICE_EVENT,
1018                                         event,
1019                                         param);
1020                         g_free(address);
1021                 } else if (strcasecmp(property, "Paired") == 0) {
1022                         gboolean paired = FALSE;
1023                         bt_remote_dev_info_t *remote_dev_info;
1024                         g_variant_get(val, "b", &paired);
1025                         _bt_agent_set_canceled(FALSE);
1026                         /* BlueZ sends paired signal for each paired device */
1027                         /* during activation, We should ignore this, otherwise*/
1028                         /* application thinks that a new device got paired */
1029                         if (_bt_adapter_get_status() != BT_ACTIVATED) {
1030                                 BT_DBG("BT is not activated, so ignore this");
1031                                 g_free(property);
1032                                 g_variant_unref(val);
1033                                 return;
1034                         }
1035
1036                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1037
1038                         _bt_convert_device_path_to_address(path, address);
1039
1040                         remote_dev_info = _bt_get_remote_device_info_by_object_path(path);
1041                         if (remote_dev_info == NULL) {
1042                                 g_free(property);
1043                                 g_variant_unref(val);
1044                                 g_free(address);
1045                                 return;
1046                         }
1047
1048                         if (paired == FALSE) {
1049                                 BT_INFO("Unpaired: %s", address);
1050                                 __bt_update_remote_cache_devinfo(address, FALSE);
1051                                 param = g_variant_new("(is)", result, address);
1052                                 _bt_send_event(BT_ADAPTER_EVENT,
1053                                         BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED,
1054                                         param);
1055 #ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
1056                                 {
1057                                         char *last_connected = NULL;
1058                                         last_connected = vconf_get_str(BT_LAST_CONNECTED_DEVICE);
1059                                         if (!g_strcmp0(address, last_connected))
1060                                                 _bt_audio_set_auto_connect_device_addr("");
1061                                         if (last_connected)
1062                                                 free(last_connected);
1063                                 }
1064 #endif
1065                         } else {
1066                                 char secure_addr[BT_ADDRESS_STRING_SIZE] = { 0 };
1067
1068                                 _bt_convert_addr_string_to_secure_string(secure_addr, address);
1069                                 BT_INFO("### Paired: %s", secure_addr);
1070                                 __bt_update_remote_cache_devinfo(address, TRUE);
1071
1072                                 if (_bt_is_device_creating() == TRUE) {
1073                                         BT_DBG("Try to Pair by me");
1074                                         _bt_free_device_info(remote_dev_info);
1075                                         g_free(address);
1076                                         g_free(property);
1077                                         g_variant_unref(val);
1078                                         return;
1079                                 }
1080                                 GVariant *uuids = NULL;
1081                                 GVariantBuilder *builder = NULL;
1082                                 int i = 0;
1083                                 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1084                                 for (i = 0; i < remote_dev_info->uuid_count; i++) {
1085                                         g_variant_builder_add(builder, "s",
1086                                                 remote_dev_info->uuids[i]);
1087                                 }
1088                                 uuids = g_variant_new("as", builder);
1089                                 g_variant_builder_unref(builder);
1090                                 GVariant *manufacturer_data =  NULL;
1091                                 manufacturer_data = g_variant_new_from_data(G_VARIANT_TYPE_BYTESTRING,
1092                                                                         remote_dev_info->manufacturer_data,
1093                                                                         remote_dev_info->manufacturer_data_len,
1094                                                                         TRUE,
1095                                                                         NULL, NULL);
1096
1097                                 param = g_variant_new("(isunsbub@asn@ay)", result,
1098                                                         address, remote_dev_info->class,
1099                                                         remote_dev_info->rssi,
1100                                                         remote_dev_info->name,
1101                                                         remote_dev_info->paired,
1102                                                         remote_dev_info->connected,
1103                                                         remote_dev_info->trust,
1104                                                         uuids,
1105                                                         remote_dev_info->manufacturer_data_len,
1106                                                         manufacturer_data);
1107                                 _bt_send_event(BT_ADAPTER_EVENT,
1108                                         BLUETOOTH_EVENT_BONDING_FINISHED,
1109                                         param);
1110                         }
1111                         _bt_free_device_info(remote_dev_info);
1112                         g_free(address);
1113                 } else if (strcasecmp(property, "LegacyPaired") == 0) {
1114                         gboolean paired = FALSE;
1115                         bt_remote_dev_info_t *remote_dev_info;
1116                         unsigned char auth_info[5] = {0, };
1117
1118                         if (_bt_adapter_get_status() != BT_ACTIVATED) {
1119                                 BT_DBG("BT is not activated, so ignore this");
1120                                 g_free(property);
1121                                 g_variant_unref(val);
1122                                 return;
1123                         }
1124
1125                         g_variant_get(val, "b", &paired);
1126                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1127                         BT_DBG("LegacyPaired: %d", paired);
1128                         _bt_convert_device_path_to_address(path, address);
1129
1130                         remote_dev_info = _bt_get_remote_device_info_by_object_path(path);
1131                         if (remote_dev_info == NULL) {
1132                                 g_free(address);
1133                                 g_free(property);
1134                                 g_variant_unref(val);
1135                                 return;
1136                         }
1137                         if (remote_dev_info->is_alias_set == FALSE) {
1138                                 /*minimum Size of the samsung specific manufacturer data is greater than 30 */
1139                                 if ((remote_dev_info->manufacturer_data_len > 30) &&
1140                                         (remote_dev_info->manufacturer_data[0] == 0x00) &&
1141                                         (remote_dev_info->manufacturer_data[1] == 0x75)) {
1142
1143                                         /* 2  samsung (0x00 0x75) + 1 (control and version) + 1 (service ID) +
1144                                         1 (discovery version) + 1 (associated service ID)
1145                                         2 (Proxamity and locality) + 2 (Device type and icon) = 10 */
1146
1147                                         memcpy(auth_info, &(remote_dev_info->manufacturer_data[10]), 5);
1148                                 }
1149                         }
1150
1151                         BT_DBG("LegacyPairing Failed with %s. Show Error Popup", remote_dev_info->name);
1152                         _bt_launch_system_popup(BT_AGENT_EVENT_LEGACY_PAIR_FAILED_FROM_REMOTE,
1153                                                 remote_dev_info->name, auth_info, NULL, NULL, NULL);
1154
1155                         _bt_free_device_info(remote_dev_info);
1156                         g_free(address);
1157                 } else if (strcasecmp(property, "Trusted") == 0) {
1158                         gboolean trusted = FALSE;
1159
1160                         g_variant_get(val, "b", &trusted);
1161
1162                         event = trusted ? BLUETOOTH_EVENT_DEVICE_AUTHORIZED :
1163                                         BLUETOOTH_EVENT_DEVICE_UNAUTHORIZED;
1164
1165                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1166
1167                         _bt_convert_device_path_to_address(path, address);
1168
1169                         BT_DBG("trusted: %d", trusted);
1170                         BT_DBG("address: %s", address);
1171                         param = g_variant_new("(is)", result, address);
1172                         /* Send event to application */
1173                         _bt_send_event(BT_DEVICE_EVENT,
1174                                         event,
1175                                         param);
1176                         g_free(address);
1177                 } else if (strcasecmp(property, "TrustedProfiles") == 0) {
1178                         int trusted = 0;
1179
1180                         g_variant_get(val, "u", &trusted);
1181
1182                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1183                         _bt_convert_device_path_to_address(path, address);
1184
1185                         BT_DBG("Address: %s, TrustedProfiles: %d", address, trusted);
1186                         _bt_send_event(BT_DEVICE_EVENT,
1187                                         BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED,
1188                                         g_variant_new("(isi)", result, address, trusted));
1189                         g_free(address);
1190                 } else if (strcasecmp(property, "IpspConnected") == 0) {
1191                         gboolean connected = FALSE;
1192
1193                         g_variant_get(val, "b", &connected);
1194
1195
1196                         event = connected ? BLUETOOTH_EVENT_IPSP_CONNECTED :
1197                                                         BLUETOOTH_EVENT_IPSP_DISCONNECTED;
1198
1199                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1200
1201                         _bt_convert_device_path_to_address(path, address);
1202
1203                         BT_DBG("Ipspconnected: %d", connected);
1204                         BT_DBG("address: %s", address);
1205                         param = g_variant_new("(is)", result, address);
1206
1207                         /* Send event to application */
1208                         _bt_send_event(BT_DEVICE_EVENT,
1209                                         event,
1210                                         param);
1211                         g_free(address);
1212                 } else if (strcasecmp(property, "IpspBtInterfaceInfo") == 0) {
1213                         char *ifname = NULL;
1214
1215                         g_variant_get(val, "s", &ifname);
1216
1217                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1218
1219                         _bt_convert_device_path_to_address(path, address);
1220
1221                         BT_DBG("Ipsp BT Interface Name: %s", ifname);
1222                         BT_DBG("address: %s", address);
1223                         param = g_variant_new("(iss)", result, address, ifname);
1224
1225                         /* Send event to application */
1226                         _bt_send_event(BT_DEVICE_EVENT,
1227                                         BLUETOOTH_EVENT_IPSP_INTERFACE_INFO,
1228                                         param);
1229                         g_free(address);
1230                 }
1231         }
1232         BT_DBG("-");
1233 }
1234
1235 static void __bt_media_control_changed_event(GVariant *msg, const char *path)
1236 {
1237         int event;
1238         int result = BLUETOOTH_ERROR_NONE;
1239         GVariantIter value_iter;
1240         char *property = NULL;
1241         char *address;
1242         GVariant *val = NULL;
1243         GVariant *child = NULL;
1244         GVariant *param = NULL;
1245         g_variant_iter_init(&value_iter, msg);
1246         while ((child = g_variant_iter_next_value(&value_iter))) {
1247                 g_variant_get(child, "{sv}", &property, &val);
1248                 BT_INFO("Property %s", property);
1249                 if (strcasecmp(property, "Connected") == 0) {
1250                         gboolean connected = FALSE;
1251
1252                         g_variant_get(val, "b", &connected);
1253
1254                         event = connected ? BLUETOOTH_EVENT_AVRCP_CONNECTED :
1255                                         BLUETOOTH_EVENT_AVRCP_DISCONNECTED;
1256
1257                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1258
1259                         _bt_convert_device_path_to_address(path, address);
1260
1261                         BT_DBG("connected: %d", connected);
1262                         BT_DBG("address: %s", address);
1263
1264                         param = g_variant_new("(is)", result, address);
1265                         /* Send event to application */
1266                         _bt_send_event(BT_AVRCP_EVENT,
1267                                 event,
1268                                 param);
1269                         g_free(address);
1270                 }
1271                 g_free(property);
1272                 g_variant_unref(child);
1273                 g_variant_unref(val);
1274         }
1275         BT_DBG("-");
1276 }
1277
1278 int get_alert_level_enum(const char *alert)
1279 {
1280         int lvl = -1;
1281
1282         if (strcmp(alert, "none") == 0)
1283                 lvl = BT_PXP_ALERT_NONE;
1284         else if (strcmp(alert, "mild") == 0)
1285                 lvl = BT_PXP_ALERT_MILD;
1286         else if (strcmp(alert, "high") == 0)
1287                 lvl = BT_PXP_ALERT_HIGH;
1288
1289         return lvl;
1290 }
1291
1292 static void _bt_handle_pxp_property_changed_event(GVariant *msg, const char *path, int role)
1293 {
1294         int result = BLUETOOTH_ERROR_NONE;
1295         int service_type;
1296         int alert_lvl = -1;
1297         GVariantIter value_iter;
1298         char *property = NULL;
1299         char *address;
1300         GVariant *val = NULL;
1301         GVariant *child = NULL;
1302         GVariant *param = NULL;
1303         g_variant_iter_init(&value_iter, msg);
1304
1305         BT_DBG("+");
1306         while ((child = g_variant_iter_next_value(&value_iter))) {
1307                 g_variant_get(child, "{sv}", &property, &val);
1308                 BT_INFO("Property %s", property);
1309
1310                 if ((strcasecmp(property, "LinkLossAlertLevel") == 0) ||
1311                         (strcasecmp(property, "ImmediateAlertLevel") == 0)) {
1312                         char *alert_str = NULL;
1313
1314                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1315                         _bt_convert_device_path_to_address(path, address);
1316
1317                         if (strcasecmp(property, "LinkLossAlertLevel") == 0)
1318                                 service_type = BT_PXP_PROPERTY_LLS;
1319                         else
1320                                 service_type = BT_PXP_PROPERTY_IAS;
1321
1322                         g_variant_get(val, "s", &alert_str);
1323                         if (alert_str)
1324                                 alert_lvl = get_alert_level_enum(alert_str);
1325
1326                         param = g_variant_new("(isiii)", result, address,
1327                                                                 role, service_type, alert_lvl);
1328
1329                         /* Send event to application */
1330                         _bt_send_event(BT_DEVICE_EVENT,
1331                                         BLUETOOTH_EVENT_PXP_PROPERTY_CHANGED,
1332                                         param);
1333                         g_free(address);
1334                         g_free(alert_str);
1335                 }
1336                 g_free(property);
1337                 g_variant_unref(child);
1338                 g_variant_unref(val);
1339         }
1340         BT_DBG("-");
1341 }
1342
1343 void _bt_handle_property_changed_event(GVariant *msg, const char *object_path)
1344 {
1345         char *interface_name = NULL;
1346         GVariant *val = NULL;
1347
1348         g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, &val, NULL);
1349
1350         if (strcasecmp(interface_name, BT_ADAPTER_INTERFACE) == 0) {
1351                 __bt_adapter_property_changed_event(val,
1352                                         object_path);
1353         } else if (strcasecmp(interface_name, BT_DEVICE_INTERFACE) == 0) {
1354                 __bt_device_property_changed_event(val, object_path);
1355         } else if (strcasecmp(interface_name, BT_OBEX_TRANSFER_INTERFACE) == 0) {
1356                 BT_DBG("BT_OBEX_TRANSFER_INTERFACE");
1357                 __bt_obex_property_changed_event(val,
1358                                         object_path);
1359         } else if (strcasecmp(interface_name, BT_MEDIA_CONTROL_INTERFACE) == 0) {
1360                 __bt_media_control_changed_event(val,
1361                                         object_path);
1362         } else if (strcasecmp(interface_name, BT_PLAYER_CONTROL_INTERFACE) == 0) {
1363                 _bt_handle_avrcp_control_event(val,
1364                                         object_path);
1365         } else if (strcasecmp(interface_name, BT_NETWORK_CLIENT_INTERFACE) == 0) {
1366                 BT_DBG("BT_NETWORK_CLIENT_INTERFACE");
1367                 _bt_handle_network_client_event(val,
1368                                         object_path);
1369         } else if (strcasecmp(interface_name, BT_GATT_CHAR_INTERFACE) == 0) {
1370                 __bt_gatt_char_property_changed_event(val,
1371                                         object_path);
1372         } else if (strcasecmp(interface_name, BT_PROXIMITY_REPORTER_INTERFACE) == 0) {
1373                 BT_DBG("BT_PROXIMITY_REPORTER_INTERFACE");
1374                 _bt_handle_pxp_property_changed_event(val,
1375                                         object_path, BT_PXP_REPORTER_ROLE);
1376         }
1377         g_variant_unref(val);
1378 }
1379
1380 void __bt_opc_property_changed_event(GVariant *msg,
1381                                                 const char *path)
1382 {
1383         GVariantIter value_iter;
1384         char *property = NULL;
1385         GVariant *val = NULL;
1386         GVariant *child = NULL;
1387
1388         g_variant_iter_init(&value_iter, msg);
1389         if ((child = g_variant_iter_next_value(&value_iter))) {
1390                 g_variant_get(child, "{sv}", &property, &val);
1391                 ret_if(property == NULL);
1392
1393                 if (strcasecmp(property, "Status") == 0) {
1394                         char *status = NULL;
1395                         g_variant_get(val, "s", &status);
1396                         BT_DBG("Status is %s", status);
1397
1398                         if (strcasecmp(status, "active") == 0)
1399                                 _bt_obex_client_started(path);
1400                         else if (strcasecmp(status, "complete") == 0)
1401                                 _bt_obex_client_completed(path, TRUE);
1402                         else if (strcasecmp(status, "error") == 0)
1403                                 _bt_obex_client_completed(path, FALSE);
1404
1405                         g_free(status);
1406                 } else if (strcasecmp(property, "Transferred") == 0) {
1407                         guint64 transferred  = 0;
1408                         g_variant_get(val, "t", &transferred);
1409
1410                         _bt_obex_client_progress(path, transferred);
1411                 } else {
1412                         BT_DBG("property : [%s]", property);
1413                 }
1414                 g_free(property);
1415                 g_variant_unref(child);
1416                 g_variant_unref(val);
1417         }
1418 }
1419
1420 void _bt_opc_property_changed_event(GVariant *msg, char *path)
1421 {
1422         char *interface_name = NULL;
1423         GVariant *value = NULL;
1424         g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, &value, NULL);
1425         BT_INFO("interface_name = %s", interface_name);
1426         if (strcasecmp(interface_name, BT_OBEX_TRANSFER_INTERFACE) == 0) {
1427                 __bt_opc_property_changed_event(value,
1428                                         path);
1429         } else {
1430                 BT_DBG("interface_name : [%s]", interface_name);
1431         }
1432         g_variant_unref(value);
1433 }
1434
1435
1436 void __bt_map_property_changed_event(GVariant *msg,
1437                                                 const char *path)
1438 {
1439         BT_DBG("Entered");
1440         GVariantIter value_iter;
1441         char *property = NULL;
1442         GVariant *val = NULL;
1443         GVariant *child = NULL;
1444
1445         g_variant_iter_init(&value_iter, msg);
1446         while ((child = g_variant_iter_next_value(&value_iter))) {
1447                 g_variant_get(child, "{sv}", &property, &val);
1448                 ret_if(property == NULL);
1449
1450                 if (strcasecmp(property, "Status") == 0) {
1451                         char *status = NULL;
1452                         g_variant_get(val, "s", &status);
1453                         BT_DBG("Status is %s", status);
1454
1455                         if (strcasecmp(status, "active") == 0) {
1456                                 BT_DBG("EVENT : STARTED");
1457                                 // currently doing nothing
1458                         } else if (strcasecmp(status, "complete") == 0) {
1459                                 BT_DBG("EVENT : COMPLETED");
1460                                 _bt_map_on_transfer_finished(path, BLUETOOTH_ERROR_NONE);
1461                         } else if (strcasecmp(status, "error") == 0) {
1462                                 BT_DBG("EVENT : FAILED");
1463                                 _bt_map_on_transfer_finished(path, BLUETOOTH_ERROR_INTERNAL);
1464                         }
1465                         g_free(status);
1466                 } else if (strcasecmp(property, "Transferred") == 0) {
1467                         guint64 transferred  = 0;
1468                         g_variant_get(val, "t", &transferred);
1469
1470                         BT_DBG("EVENT : PROGRESS CALLBACK");
1471                         // currently doing nothing - progress callback type is not used
1472                 } else {
1473                         BT_DBG("OTHER EVENT : property : [%s]", property);
1474                 }
1475                 g_free(property);
1476                 g_variant_unref(child);
1477                 g_variant_unref(val);
1478         }
1479 }
1480
1481 void _bt_map_property_changed_event(GVariant *msg, const char *path)
1482 {
1483         BT_DBG("Entered _bt_map_property_changed_event");
1484         char *interface_name = NULL;
1485         GVariant *value = NULL;
1486         g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, &value, NULL);
1487         BT_INFO("interface_name = %s", interface_name);
1488         if (strcasecmp(interface_name, BT_OBEX_TRANSFER_INTERFACE) == 0) {
1489                 __bt_map_property_changed_event(value,
1490                                 path);
1491         } else {
1492                 BT_DBG("interface_name : [%s]", interface_name);
1493         }
1494         g_variant_unref(value);
1495 }
1496
1497
1498 void _bt_handle_input_event(GVariant *msg, const char *path)
1499 {
1500         int result = BLUETOOTH_ERROR_NONE;
1501         gboolean property_flag = FALSE;
1502         GVariantIter value_iter;
1503         char *property = NULL;
1504         GVariant *child = NULL, *val = NULL;
1505         bt_remote_dev_info_t *remote_dev_info;
1506         GVariant *param = NULL;
1507         g_variant_iter_init(&value_iter, msg);
1508         while ((child = g_variant_iter_next_value(&value_iter))) {
1509                 g_variant_get(child, "{sv}", &property, &val);
1510
1511                 ret_if(property == NULL);
1512
1513                 if (strcasecmp(property, "Connected") == 0) {
1514                         int event = BLUETOOTH_EVENT_NONE;
1515                         char *address;
1516                         g_variant_get(val, "b", &property_flag);
1517
1518                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1519
1520                         _bt_convert_device_path_to_address(path, address);
1521
1522                         event = (property_flag == TRUE) ?
1523                                         BLUETOOTH_HID_CONNECTED :
1524                                         BLUETOOTH_HID_DISCONNECTED;
1525                         param = g_variant_new("(is)", result, address);
1526                         _bt_send_event(BT_HID_EVENT, event,
1527                                 param);
1528                         /* Check HID connection type (Keyboard or Mouse) and update the status */
1529                         remote_dev_info = _bt_get_remote_device_info_by_object_path(path);
1530
1531                         if (property_flag == TRUE) {
1532                                 hid_connected_device_count++;
1533                                 __bt_set_device_values(TRUE,
1534                                                 VCONFKEY_BT_DEVICE_HID_CONNECTED);
1535                         } else {
1536                                 hid_connected_device_count--;
1537                                 if (hid_connected_device_count == 0)
1538                                         __bt_set_device_values(FALSE,
1539                                                         VCONFKEY_BT_DEVICE_HID_CONNECTED);
1540                         }
1541
1542                         if (remote_dev_info != NULL) {
1543                                 BT_DBG("HID device class [%x]", remote_dev_info->class);
1544                                 if (remote_dev_info->class &
1545                                         BLUETOOTH_DEVICE_MINOR_CLASS_KEY_BOARD) {
1546                                         __bt_set_device_values(property_flag,
1547                                                 VCONFKEY_BT_DEVICE_HID_KEYBOARD_CONNECTED);
1548
1549                                 }
1550
1551                                 if (remote_dev_info->class &
1552                                                 BLUETOOTH_DEVICE_MINOR_CLASS_POINTING_DEVICE) {
1553                                         __bt_set_device_values(property_flag,
1554                                                         VCONFKEY_BT_DEVICE_HID_MOUSE_CONNECTED);
1555                                 }
1556                                 _bt_free_device_info(remote_dev_info);
1557                         }
1558                         g_free(address);
1559                 }
1560                 g_free(property);
1561                 g_variant_unref(val);
1562                 g_variant_unref(child);
1563          }
1564 }
1565
1566 void _bt_handle_network_server_event(GVariant *msg, const char *member)
1567 {
1568         int result = BLUETOOTH_ERROR_NONE;
1569         char *address = NULL;
1570         char *device = NULL;
1571         GVariant *param = NULL;
1572         ret_if(member == NULL);
1573         if (strcasecmp(member, "PeerConnected") == 0) {
1574                 g_variant_get(msg, "(ss)", &device, &address);
1575
1576                 __bt_set_device_values(TRUE,
1577                                 VCONFKEY_BT_DEVICE_PAN_CONNECTED);
1578                 param = g_variant_new("(iss)", result, device, address);
1579                 _bt_send_event(BT_NETWORK_EVENT, BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED,
1580                         param);
1581                 g_free(device);
1582                 g_free(address);
1583                  nap_connected_device_count++;
1584         } else if (strcasecmp(member, "PeerDisconnected") == 0) {
1585                 g_variant_get(msg, "(ss)", &device, &address);
1586                 nap_connected_device_count--;
1587                 if (nap_connected_device_count == 0)
1588                         __bt_set_device_values(FALSE,
1589                                 VCONFKEY_BT_DEVICE_PAN_CONNECTED);
1590                 param = g_variant_new("(iss)", result, device, address);
1591                 _bt_send_event(BT_NETWORK_EVENT, BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED,
1592                         param);
1593                 g_free(device);
1594                 g_free(address);
1595         }
1596 }
1597
1598 void _bt_handle_network_client_event(GVariant *msg,
1599                                 const char *path)
1600 {
1601         BT_DBG("+");
1602
1603         int result = BLUETOOTH_ERROR_NONE;
1604         gboolean property_flag = FALSE;
1605         char *property = NULL;
1606         GVariant *val = NULL;
1607         GVariantIter value_iter;
1608         GVariant *param = NULL;
1609         g_variant_iter_init(&value_iter, msg);
1610         while ((g_variant_iter_loop(&value_iter, "{sv}", &property, &val))) {
1611                 if (strcasecmp(property, "Connected") == 0) {
1612                         int event = BLUETOOTH_EVENT_NONE;
1613                         char *address;
1614
1615                         g_variant_get(val, "b", &property_flag);
1616                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1617
1618                         _bt_convert_device_path_to_address(path, address);
1619
1620                         BT_DBG("property_flag %d", property_flag);
1621                         if (property_flag == TRUE) {
1622                                 event = BLUETOOTH_EVENT_NETWORK_CONNECTED;
1623                                 nap_connected_device_count++;
1624                                 __bt_set_device_values(TRUE,
1625                                         VCONFKEY_BT_DEVICE_PAN_CONNECTED);
1626                         } else {
1627                                 event = BLUETOOTH_EVENT_NETWORK_DISCONNECTED;
1628                                 nap_connected_device_count--;
1629                                 if (nap_connected_device_count == 0)
1630                                         __bt_set_device_values(FALSE,
1631                                                 VCONFKEY_BT_DEVICE_PAN_CONNECTED);
1632                         }
1633                         param = g_variant_new("(is)", result, address);
1634                         _bt_send_event(BT_NETWORK_EVENT, event,
1635                                 param);
1636
1637                         g_free(address);
1638                 }
1639         }
1640         BT_DBG("-");
1641 }
1642
1643 void __bt_gatt_char_property_changed_event(GVariant *msg,
1644                                 const char *path)
1645 {
1646         GVariantIter value_iter;
1647         char *property = NULL;
1648         GVariant *val = NULL;
1649         g_variant_iter_init(&value_iter, msg);
1650         while ((g_variant_iter_loop(&value_iter, "{sv}", &property, &val))) {
1651                 BT_INFO("Property %s", property);
1652
1653                 ret_if(property == NULL);
1654
1655                 if (strcasecmp(property, "Notifying") == 0) {
1656                         gboolean property_flag = FALSE;
1657                         g_variant_get(val, "b", &property_flag);
1658                         if (property_flag == TRUE)
1659                                 BT_DBG("notifying is enabled");
1660                         else
1661                                 BT_DBG("notifying is disabled");
1662                 }
1663         }
1664 }
1665
1666 void _bt_handle_gatt_event(GVariant *msg, const char *member, const char *path)
1667 {
1668         ret_if(path == NULL);
1669         if (strcasecmp(member, "GattValueChanged") == 0) {
1670                 /* Check TDS seekers waiting for Indication  */
1671                 _bt_tds_check_indication(path, msg);
1672         } else {
1673                 BT_INFO("Unhandled event");
1674         }
1675 }
1676
1677 void _bt_handle_device_event(GVariant *msg, const char *member, const char *path)
1678 {
1679         int event = 0;
1680         int result = BLUETOOTH_ERROR_NONE;
1681         char *address;
1682         char *dev_name = NULL;
1683         const char *property = NULL;
1684         GVariant *param = NULL;
1685         char secure_address[BT_ADDRESS_STRING_SIZE] = { 0 };
1686         ret_if(path == NULL);
1687
1688         if (strcasecmp(member, "PropertyChanged") == 0) {
1689
1690                 g_variant_get(msg, "(s)", &property);
1691
1692                 ret_if(property == NULL);
1693
1694                 if (strcasecmp(property, "GattConnected") == 0) {
1695                         gboolean connected = FALSE;
1696                         char *address;
1697                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1698
1699                         _bt_convert_device_path_to_address(path, address);
1700                         g_variant_get(msg, "(b)", &connected);
1701
1702                         event = connected ? BLUETOOTH_EVENT_GATT_CONNECTED :
1703                                         BLUETOOTH_EVENT_GATT_DISCONNECTED;
1704                         param = g_variant_new("(is)", result, address);
1705                         _bt_send_event(BT_DEVICE_EVENT,
1706                                         event,
1707                                         param);
1708                         g_free(address);
1709                 } else if (strcasecmp(property, "Paired") == 0) {
1710                         gboolean paired = FALSE;
1711                         bt_remote_dev_info_t *remote_dev_info;
1712                         g_variant_get(msg, "(b)", &paired);
1713
1714                         ret_if(paired == FALSE);
1715
1716                         /* BlueZ sends paired signal for each paired device */
1717                         /* during activation, We should ignore this, otherwise*/
1718                         /* application thinks that a new device got paired */
1719                         if (_bt_adapter_get_status() != BT_ACTIVATED) {
1720                                 BT_DBG("BT is not activated, so ignore this");
1721                                 return;
1722                         }
1723
1724                         if (_bt_is_device_creating() == TRUE) {
1725                                 BT_DBG("Try to Pair by me");
1726                                 return;
1727                         }
1728
1729                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1730
1731                         _bt_convert_device_path_to_address(path, address);
1732
1733                         remote_dev_info = _bt_get_remote_device_info_by_object_path(path);
1734                         if (remote_dev_info == NULL) {
1735                                 g_free(address);
1736                                 return;
1737                         }
1738                         GVariant *uuids = NULL;
1739                         GVariantBuilder *builder = NULL;
1740                         int i = 0;
1741                         builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1742                         for (i = 0; i < remote_dev_info->uuid_count; i++) {
1743                                 g_variant_builder_add(builder, "s",
1744                                         remote_dev_info->uuids[i]);
1745                         }
1746                         uuids = g_variant_new("as", builder);
1747                         g_variant_builder_unref(builder);
1748                         GVariant *manufacturer_data = NULL;
1749                         manufacturer_data = g_variant_new_from_data(
1750                                                 G_VARIANT_TYPE_BYTESTRING,
1751                                                 remote_dev_info->manufacturer_data,
1752                                                 remote_dev_info->manufacturer_data_len,
1753                                                 TRUE, NULL, NULL);
1754                         param = g_variant_new("(isunsbub@asn@ay)", result,
1755                                                 address,
1756                                                 remote_dev_info->class,
1757                                                 remote_dev_info->rssi,
1758                                                 remote_dev_info->name,
1759                                                 remote_dev_info->paired,
1760                                                 remote_dev_info->connected,
1761                                                 remote_dev_info->trust,
1762                                                 uuids,
1763                                                 remote_dev_info->manufacturer_data_len,
1764                                                 manufacturer_data);
1765                         _bt_send_event(BT_ADAPTER_EVENT,
1766                                 BLUETOOTH_EVENT_BONDING_FINISHED,
1767                                 param);
1768                         _bt_free_device_info(remote_dev_info);
1769                         g_free(address);
1770
1771                 } else if (strcasecmp(property, "UUIDs") == 0) {
1772                         /* Once we get the updated uuid information after
1773                          * reverse service search, update it to application */
1774
1775                         bt_remote_dev_info_t *remote_dev_info;
1776
1777                         ret_if(_bt_is_device_creating() == TRUE);
1778
1779                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1780
1781                         _bt_convert_device_path_to_address(path, address);
1782
1783                         remote_dev_info = _bt_get_remote_device_info_by_object_path(path);
1784                         if (remote_dev_info == NULL) {
1785                                 g_free(address);
1786                                 return;
1787                         }
1788
1789                         BT_DBG("UUID's count = %d", remote_dev_info->uuid_count);
1790                         if (remote_dev_info->paired && remote_dev_info->uuid_count) {
1791                                 GVariant *uuids = NULL;
1792                                 GVariantBuilder *builder = NULL;
1793                                 int i = 0;
1794                                 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1795                                 for (i = 0; i < remote_dev_info->uuid_count; i++) {
1796                                         g_variant_builder_add(builder, "s",
1797                                                 remote_dev_info->uuids[i]);
1798                                 }
1799                                 uuids = g_variant_new("as", builder);
1800                                 g_variant_builder_unref(builder);
1801                                 GVariant *manufacture_data = g_variant_new_from_data((const GVariantType *)"ay",
1802                                                 remote_dev_info->manufacturer_data, remote_dev_info->manufacturer_data_len,
1803                                                 TRUE, NULL, NULL);
1804
1805                                 param = g_variant_new("(isunsbub@asn@ay)", result,
1806                                                         address, remote_dev_info->class,
1807                                                         remote_dev_info->rssi,
1808                                                         remote_dev_info->name,
1809                                                         remote_dev_info->paired,
1810                                                         remote_dev_info->connected,
1811                                                         remote_dev_info->trust,
1812                                                         uuids,
1813                                                         remote_dev_info->manufacturer_data_len,
1814                                                         manufacture_data);
1815                                 _bt_send_event(BT_ADAPTER_EVENT,
1816                                         BLUETOOTH_EVENT_SERVICE_SEARCHED,
1817                                         param);
1818                         }
1819
1820                         _bt_free_device_info(remote_dev_info);
1821                         g_free(address);
1822                 }
1823         } else if (strcasecmp(member, "DeviceConnected") == 0) {
1824                 unsigned char addr_type = 0;
1825
1826                 g_variant_get(msg, "(y)", &addr_type);
1827
1828                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1829
1830                 _bt_convert_device_path_to_address(path, address);
1831                 dev_name = _bt_get_device_name(address);
1832
1833                 _bt_convert_addr_string_to_secure_string(secure_address, address);
1834                 BT_INFO("Address : %s Type : %d", secure_address, addr_type);
1835                 BT_ERR_C("### Connected [%s] [%s]", !addr_type ? "BREDR" : "LE",
1836                                 !addr_type ? dev_name : secure_address);
1837                 g_free(dev_name);
1838
1839                 if (addr_type)
1840                         _bt_add_le_connected_dev_info(address);
1841
1842                 _bt_logging_connection(TRUE, addr_type);
1843                 param = g_variant_new("(isy)", result, address, addr_type);
1844                 /*Send event to application*/
1845                 _bt_send_event(BT_DEVICE_EVENT,
1846                                         BLUETOOTH_EVENT_DEVICE_CONNECTED,
1847                                         param);
1848                 g_free(address);
1849         } else if (strcasecmp(member, "Disconnected") == 0) {
1850                 unsigned char disc_reason = 0;
1851                 unsigned char addr_type = 0;
1852                 char *dev_name = NULL;
1853                 gboolean sending = FALSE;
1854
1855                 g_variant_get(msg, "(yys)", &addr_type, &disc_reason, &dev_name);
1856
1857                 result = disc_reason;
1858
1859                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1860
1861                 _bt_convert_device_path_to_address(path, address);
1862
1863                 /* 0x00 BDADDR_BRDER
1864                       0x01 BDADDR_LE_PUBLIC
1865                       0x02 BDADDR_LE_RANDOM */
1866                 _bt_convert_addr_string_to_secure_string(secure_address, address);
1867                 BT_INFO("Address : %s Type : %d", secure_address, addr_type);
1868                 BT_ERR_C("### Disconnected [%s] [%d : %s] [%s]", !addr_type ? "BREDR" : "LE",
1869                                 disc_reason, _bt_convert_disc_reason_to_string(disc_reason),
1870                                 !addr_type ? dev_name : secure_address);
1871                 g_free(dev_name);
1872
1873                 _bt_headset_set_local_connection(FALSE);
1874                 _bt_logging_connection(FALSE, addr_type);
1875
1876                 if (addr_type)
1877                         _bt_remove_le_connected_dev_info(address);
1878                 else {
1879 #ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
1880                         {
1881                                 int bt_device_state = VCONFKEY_BT_DEVICE_NONE;
1882
1883                                 if (vconf_get_int(VCONFKEY_BT_DEVICE, &bt_device_state) != 0)
1884                                         BT_ERR("vconf_get_int failed");
1885
1886                                 BT_INFO("conn_state[0x%x], adapter_state [%d]",
1887                                                         bt_device_state, _bt_adapter_get_status());
1888
1889                                 if (disc_reason == BLUETOOTH_ERROR_CONNECTION_TIMEOUT) {
1890                                         _bt_audio_start_auto_connect(TRUE);
1891                                 } else if (bt_device_state &
1892                                                         VCONFKEY_BT_DEVICE_A2DP_SOURCE_CONNECTED) {
1893                                         BT_INFO("Disconnected due to turning BT off. Skip a address");
1894                                 } else {
1895                                         char *last_connected = NULL;
1896                                         last_connected = vconf_get_str(BT_LAST_CONNECTED_DEVICE);
1897                                         if (!g_strcmp0(address, last_connected))
1898                                                 _bt_audio_set_auto_connect_device_addr("");
1899                                         if (last_connected)
1900                                                 free(last_connected);
1901                                 }
1902                         }
1903
1904 #endif
1905                         /*Check for any OPP transfer on the device and cancel
1906                          * the transfer
1907                          */
1908                         _bt_obex_check_pending_transfer(address);
1909                         _bt_opp_client_is_sending(&sending);
1910                         if (sending == TRUE)
1911                                 _bt_opp_client_check_pending_transfer(address);
1912                         /* TODO: MAP? see above */
1913                 }
1914                 param = g_variant_new("(isy)", result, address, addr_type);
1915                 _bt_send_event(BT_DEVICE_EVENT,
1916                                         BLUETOOTH_EVENT_DEVICE_DISCONNECTED,
1917                                         param);
1918                 g_free(address);
1919         } else if (strcasecmp(member, "ProfileStateChanged") == 0) {
1920                 int state = 0;
1921                 char *profile_uuid = NULL;
1922                 bt_headset_wait_t *wait_list;
1923                 bluetooth_device_address_t bd_addr;
1924
1925                 g_variant_get(msg, "(si)", &profile_uuid, &state);
1926
1927                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1928
1929                 _bt_convert_device_path_to_address(path, address);
1930                 _bt_convert_addr_string_to_type(bd_addr.addr, address);
1931
1932                 _bt_convert_addr_string_to_secure_string(secure_address, address);
1933                 BT_DBG("Address: %s", secure_address);
1934                 BT_DBG("Profile UUID: %s", profile_uuid);
1935                 BT_DBG("State: %d", state);
1936
1937                 if ((strcmp(profile_uuid, A2DP_SINK_UUID) == 0)  &&
1938                         (state == BT_PROFILE_STATE_CONNECTED)) {
1939
1940                         int event = BLUETOOTH_EVENT_AV_CONNECTED;
1941 #ifndef TIZEN_BT_DUAL_HEADSET_CONNECT
1942                         bluetooth_device_address_t device_address;
1943                         char connected_address[BT_ADDRESS_STRING_SIZE + 1];
1944                         gboolean connected;
1945 #endif
1946                         bt_headset_wait_t *wait_list;
1947                         guint trusted = TRUE;
1948
1949                         __bt_set_device_values(TRUE,
1950                                 VCONFKEY_BT_DEVICE_A2DP_HEADSET_CONNECTED);
1951
1952                         __bt_connection_manager_set_state(address, event);
1953
1954                         _bt_get_trust_profile(&bd_addr, TRUSTED_PROFILE_HFP_HF, &trusted);
1955
1956                         if (_bt_headset_get_local_connection() == FALSE) {
1957                                 if (trusted == TRUE) /* not restricted*/
1958                                         _bt_start_timer_for_connection(address, BT_AUDIO_HSP);
1959                         } else {
1960                                 /* Connection Started from local device therefore no need to
1961                                  * intiate connection for pending profile */
1962                                 _bt_headset_set_local_connection(FALSE);
1963                         }
1964                         param = g_variant_new("(is)", result, address);
1965                         _bt_send_event(BT_HEADSET_EVENT, event,
1966                                 param);
1967 #ifdef TIZEN_BT_DUAL_HEADSET_CONNECT
1968                         _bt_check_already_connected_headset(BT_AUDIO_A2DP,
1969                                                 address);
1970 #else
1971                         connected = _bt_is_headset_type_connected(BT_AUDIO_A2DP,
1972                                                 connected_address);
1973                         if (connected) {
1974                                 if (g_strcmp0(connected_address, address) != 0) {
1975                                         _bt_convert_addr_string_to_type(
1976                                                 device_address.addr,
1977                                                 connected_address);
1978                                         _bt_audio_disconnect(0, BT_AUDIO_A2DP,
1979                                                 &device_address, NULL);
1980                                 }
1981                         }
1982 #endif
1983                         _bt_add_headset_to_list(BT_AUDIO_A2DP,
1984                                                 BT_STATE_CONNECTED, address);
1985
1986                         wait_list = _bt_get_audio_wait_data();
1987                         if (wait_list != NULL &&
1988                                 (g_strcmp0(wait_list->address, address) == 0))
1989                                 _bt_rel_wait_data();
1990
1991                 } else if ((strcmp(profile_uuid, A2DP_SINK_UUID) == 0)  &&
1992                         (state == BT_PROFILE_STATE_DISCONNECTED)) {
1993
1994                         int event = BLUETOOTH_EVENT_AV_DISCONNECTED;
1995
1996                         if (!_bt_is_service_connected(address, BT_AUDIO_A2DP)) {
1997                                 g_free(address);
1998                                 g_free(profile_uuid);
1999                                 return;
2000                         }
2001
2002                         __bt_set_device_values(FALSE,
2003                                 VCONFKEY_BT_DEVICE_A2DP_HEADSET_CONNECTED);
2004
2005                         __bt_connection_manager_set_state(address, event);
2006                         param = g_variant_new("(is)", result, address);
2007                         _bt_send_event(BT_HEADSET_EVENT, event,
2008                                 param);
2009                         /* Remove data from the connected list */
2010                         _bt_remove_headset_from_list(BT_AUDIO_A2DP, address);
2011                         wait_list = _bt_get_audio_wait_data();
2012
2013                         if (wait_list == NULL) {
2014                                 g_free(address);
2015                                 g_free(profile_uuid);
2016                                 return;
2017                         }
2018
2019                         if (((wait_list->type == BT_AUDIO_ALL) &&
2020                                 (wait_list->ag_flag == TRUE)) ||
2021                                 (wait_list->type == BT_AUDIO_A2DP) ||
2022                                 (wait_list->disconnection_type == BT_AUDIO_A2DP)) {
2023                                 bluetooth_device_address_t device_address;
2024                                 _bt_convert_addr_string_to_type(
2025                                                         device_address.addr,
2026                                                         wait_list->address);
2027
2028                                 _bt_audio_connect(wait_list->req_id,
2029                                                         wait_list->type,
2030                                                         &device_address,
2031                                                         NULL);
2032                         }
2033                 } else if (strcmp(profile_uuid, AVRCP_TARGET_UUID) == 0) {
2034
2035                         if (state == BT_PROFILE_STATE_CONNECTED) {
2036                                 int event = BLUETOOTH_EVENT_AVRCP_CONTROL_CONNECTED;
2037                                 char connected_address[BT_ADDRESS_STRING_SIZE + 1];
2038                                 bluetooth_device_address_t device_address;
2039                                 gboolean connected;
2040                                 param = g_variant_new("(is)", result, address);
2041                                 _bt_send_event(BT_AVRCP_CONTROL_EVENT, event,
2042                                         param);
2043                                 connected = _bt_is_headset_type_connected(
2044                                                         BT_AVRCP,
2045                                                         connected_address);
2046                                 if (connected) {
2047                                         if (g_strcmp0(connected_address,
2048                                                                 address) != 0) {
2049                                                 _bt_convert_addr_string_to_type(
2050                                                         device_address.addr,
2051                                                         connected_address);
2052                                                 _bt_audio_disconnect(0,
2053                                                         BT_AVRCP,
2054                                                         &device_address, NULL);
2055                                         }
2056                                 }
2057                                 BT_DBG("device Path: %s", path);
2058                                 _bt_add_headset_to_list(BT_AVRCP,
2059                                                 BT_STATE_CONNECTED, address);
2060                         } else if (state == BT_PROFILE_STATE_DISCONNECTED) {
2061                                 int event = BLUETOOTH_EVENT_AVRCP_CONTROL_DISCONNECTED;
2062                                 param = g_variant_new("(is)", result, address);
2063                                 _bt_send_event(BT_AVRCP_CONTROL_EVENT, event,
2064                                         param);
2065                                 /* Remove data from the connected list */
2066                                 _bt_remove_headset_from_list(BT_AVRCP, address);
2067                                 }
2068                 } else if (strcasecmp(profile_uuid, A2DP_SOURCE_UUID) == 0) {
2069                         if (state == BT_PROFILE_STATE_CONNECTED) {
2070                                 int event = BLUETOOTH_EVENT_AV_SOURCE_CONNECTED;
2071                                 BT_INFO("A2DP Source is connected");
2072 #ifdef TIZEN_BT_A2DP_SINK_ENABLE
2073                                 __bt_set_device_values(TRUE,
2074                                                 VCONFKEY_BT_DEVICE_A2DP_SOURCE_CONNECTED);
2075 #endif
2076
2077 #ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
2078                                 _bt_audio_set_auto_connect_device_addr(address);
2079                                 _bt_audio_stop_auto_connect();
2080 #endif
2081                                 _bt_add_headset_to_list(BT_AUDIO_A2DP_SOURCE,
2082                                                 BT_STATE_CONNECTED, address);
2083                                 _bt_send_event(BT_A2DP_SOURCE_EVENT, event,
2084                                         g_variant_new("(is)", result, address));
2085                         } else if (state == BT_PROFILE_STATE_DISCONNECTED) {
2086                                 int event = BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED;
2087                                 BT_INFO("A2DP Source Disconnected");
2088 #ifdef TIZEN_BT_A2DP_SINK_ENABLE
2089                                 __bt_set_device_values(FALSE,
2090                                                 VCONFKEY_BT_DEVICE_A2DP_SOURCE_CONNECTED);
2091 #endif
2092                                 _bt_remove_headset_from_list(BT_AUDIO_A2DP_SOURCE, address);
2093                                 _bt_send_event(BT_A2DP_SOURCE_EVENT, event,
2094                                                 g_variant_new("(is)", result, address));
2095
2096                                 wait_list = _bt_get_audio_wait_data();
2097                                 if (wait_list && wait_list->type == BT_AUDIO_A2DP_SOURCE) {
2098                                         bluetooth_device_address_t device_address;
2099                                         _bt_convert_addr_string_to_type(
2100                                                         device_address.addr,
2101                                                         wait_list->address);
2102
2103                                         _bt_audio_connect(wait_list->req_id,
2104                                                         wait_list->type,
2105                                                         &device_address,
2106                                                         NULL);
2107                                         /* Now free the wait list */
2108                                         _bt_rel_wait_data();
2109                                 }
2110                         }
2111                 } else if ((strcmp(profile_uuid, HID_UUID) == 0) &&
2112                         ((state == BT_PROFILE_STATE_CONNECTED) ||
2113                                 (state == BT_PROFILE_STATE_DISCONNECTED))) {
2114                         int event;
2115                         if (state == BT_PROFILE_STATE_CONNECTED)
2116                                 event = BLUETOOTH_HID_CONNECTED;
2117                         else
2118                                 event = BLUETOOTH_HID_DISCONNECTED;
2119                         param = g_variant_new("(is)", result, address);
2120                         _bt_send_event(BT_HID_EVENT, event,
2121                                 param);
2122
2123                         /* Set the vconf value for device */
2124                         if (state == BT_PROFILE_STATE_CONNECTED) {
2125                                 hid_connected_device_count++;
2126                                 __bt_set_device_values(TRUE,
2127                                                 VCONFKEY_BT_DEVICE_HID_CONNECTED);
2128                         } else {
2129                                 hid_connected_device_count--;
2130                                 if (hid_connected_device_count == 0)
2131                                         __bt_set_device_values(FALSE,
2132                                                 VCONFKEY_BT_DEVICE_HID_CONNECTED);
2133                         }
2134                 } else if (strcmp(profile_uuid, HID_DEVICE_UUID) == 0) {
2135                         if (state == BT_PROFILE_STATE_CONNECTED) {
2136                                 int event;
2137                                 event = BLUETOOTH_HID_DEVICE_CONNECTED;
2138                                 param = g_variant_new("(is)", result, address);
2139                                 _bt_send_event(BT_HID_DEVICE_EVENT, event,
2140                                         param);
2141                         } else if (state == BT_PROFILE_STATE_DISCONNECTED) {
2142                                 event = BLUETOOTH_HID_DEVICE_DISCONNECTED;
2143                                 param = g_variant_new("(is)", result, address);
2144                                 _bt_send_event(BT_HID_DEVICE_EVENT, event,
2145                                         param);
2146                         }
2147                 }
2148                 g_free(address);
2149                 g_free(profile_uuid);
2150         } else if (strcasecmp(member, "AdvReport") == 0) {
2151
2152                 bt_remote_le_dev_info_t *le_dev_info = NULL;
2153                 char *buffer = NULL;
2154                 int buffer_len = 0;
2155                 bt_le_adv_info_t *adv_info = NULL;
2156                 GVariant *value = NULL;
2157                 ret_if(_bt_is_le_scanning() == FALSE);
2158
2159                 le_dev_info = g_malloc0(sizeof(bt_remote_le_dev_info_t));
2160
2161                 g_variant_get(msg, "(syyii@ay)", &le_dev_info->address,
2162                                                 &le_dev_info->addr_type,
2163                                                 &le_dev_info->adv_type,
2164                                                 &le_dev_info->rssi,
2165                                                 &le_dev_info->adv_data_len,
2166                                                 &value);
2167
2168                 if (value == NULL) {
2169                         _bt_free_le_device_info(le_dev_info);
2170                         return;
2171                 }
2172
2173                 _bt_convert_device_path_to_address(path, le_dev_info->address);
2174
2175                 buffer_len = g_variant_get_size(value);
2176                 if (buffer_len > 0)
2177                         buffer = (char *)g_variant_get_data(value);
2178
2179                 le_dev_info->adv_data = g_memdup(buffer, buffer_len);
2180                 if (le_dev_info->adv_data == NULL &&
2181                         le_dev_info->adv_type != BT_LE_ADV_SCAN_RSP) {
2182                         _bt_free_le_device_info(le_dev_info);
2183                         g_variant_unref(value);
2184                         return;
2185                 }
2186
2187                 if (_bt_get_le_scan_type() == BT_LE_PASSIVE_SCAN) {
2188                         _bt_send_scan_result_event(le_dev_info, NULL);
2189                         _bt_free_le_device_info(le_dev_info);
2190                         g_variant_unref(value);
2191                         return;
2192                 }
2193
2194                 if (le_dev_info->adv_type != BT_LE_ADV_SCAN_RSP) {       /* ADV_IND */
2195                         adv_info = g_malloc0(sizeof(bt_le_adv_info_t));
2196                         adv_info->addr = g_strdup(le_dev_info->address);
2197                         adv_info->addr_type = le_dev_info->addr_type;
2198                         adv_info->rssi = le_dev_info->rssi;
2199                         adv_info->data_len = le_dev_info->adv_data_len;
2200                         adv_info->data = g_malloc0(le_dev_info->adv_data_len);
2201                         memcpy(adv_info->data, le_dev_info->adv_data,
2202                                         le_dev_info->adv_data_len);
2203
2204                         if (__bt_add_adv_ind_info(adv_info) == 0) {
2205                                 adv_info->timer_id = g_timeout_add(1000,
2206                                         (GSourceFunc)__bt_adv_scan_req_timeout_cb, (void*)adv_info);
2207                         }
2208                 } else {     /* SCAN_RSP */
2209                         adv_info = __bt_get_adv_ind_info(le_dev_info->address);
2210                         if (adv_info) {
2211                                 _bt_send_scan_result_event(le_dev_info, adv_info);
2212                                 __bt_del_adv_ind_info(le_dev_info->address);
2213                         }
2214                 }
2215                 _bt_free_le_device_info(le_dev_info);
2216                 g_variant_unref(value);
2217         } else if  (strcasecmp(member, "LEDataLengthChanged") == 0) {
2218                 guint16 tx_octets = 0;
2219                 guint16 tx_time = 0;
2220                 guint16 rx_octets = 0;
2221                 guint16 rx_time = 0;
2222
2223                 g_variant_get(msg, "(qqqq)",
2224                                 &tx_octets, &tx_time, &rx_octets, &rx_time);
2225
2226                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
2227                 _bt_convert_device_path_to_address(path, address);
2228
2229                 param = g_variant_new("(isqqqq)", result, address, tx_octets, tx_time,
2230                                 rx_octets, rx_time);
2231                 /* Send event to application */
2232                 _bt_send_event(BT_DEVICE_EVENT,
2233                                 BLUETOOTH_EVENT_LE_DATA_LENGTH_CHANGED, param);
2234                 g_free(address);
2235         } else if  (strcasecmp(member, "IpspStateChanged") == 0) {
2236                 gboolean connected = FALSE;
2237                 char *ifname = NULL;
2238                 GVariant *ipsp_param = NULL;
2239
2240                 g_variant_get(msg, "(bs)", &connected, &ifname);
2241
2242                 event = connected ? BLUETOOTH_EVENT_IPSP_CONNECTED :
2243                                                 BLUETOOTH_EVENT_IPSP_DISCONNECTED;
2244
2245                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
2246                 _bt_convert_device_path_to_address(path, address);
2247
2248                 BT_DBG("Ipsp BT Interface Name: %s", ifname);
2249                 BT_DBG("address: %s", address);
2250                 param = g_variant_new("(iss)", result, address, ifname);
2251                 ipsp_param = g_variant_new("(ss)", ifname, address);
2252
2253                 /* Set Ipv6 Addr */
2254                 GDBusProxy *ipsp_proxy;
2255                 if (connected) {
2256                         BT_DBG("IPSP connected, Set Ipv6 Addr");
2257                         ipsp_proxy = _bt_get_ipsp_proxy();
2258                         if (ipsp_proxy == NULL) {
2259                                 BT_ERR("can not get ipsp proxy");
2260                                 g_free(address);
2261                                 return;
2262                         }
2263
2264                         g_dbus_proxy_call(ipsp_proxy, "SetIpv6Addr",
2265                                         ipsp_param, G_DBUS_CALL_FLAGS_NONE,
2266                                         -1, NULL, NULL, NULL);
2267                 } else {
2268                         BT_DBG("IPSP disconnected");
2269                         ipsp_proxy = _bt_get_ipsp_proxy();
2270                         if (ipsp_proxy == NULL) {
2271                                 BT_ERR("can not get ipsp proxy");
2272                                 g_free(address);
2273                                 return;
2274                         }
2275
2276                         g_dbus_proxy_call(ipsp_proxy, "DisableIpsp",
2277                                         NULL, G_DBUS_CALL_FLAGS_NONE,
2278                                         -1, NULL, NULL, NULL);
2279                 }
2280
2281                 /* Send event to application */
2282                 _bt_send_event(BT_DEVICE_EVENT,
2283                                                 event,
2284                                                 param);
2285                 g_free(address);
2286         } else if (strcasecmp(member, "AttMtuChanged") == 0) {
2287                 int result = BLUETOOTH_ERROR_NONE;
2288                 guint16 mtu = 0;
2289                 guint8 status = 0;
2290
2291                 g_variant_get(msg, "(q)", &mtu);
2292
2293                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
2294
2295                 _bt_convert_device_path_to_address(path, address);
2296                 _bt_convert_addr_string_to_secure_string(secure_address, address);
2297                 BT_DBG("Address : %s MTU changed : %d", secure_address, mtu);
2298
2299                 param = g_variant_new("(isqy)",
2300                         result,
2301                         address,
2302                         mtu,
2303                         status);
2304
2305                 /* Send the event to application */
2306                 _bt_send_event(BT_DEVICE_EVENT,
2307                         BLUETOOTH_EVENT_GATT_ATT_MTU_CHANGED,
2308                         param);
2309
2310                 g_free(address);
2311         }
2312 }
2313
2314 void __bt_set_audio_values(gboolean connected, char *address)
2315 {
2316         char *name = NULL;
2317         int bt_device_state = VCONFKEY_BT_DEVICE_NONE;
2318
2319         /*  Set the headset name */
2320         if (connected == TRUE)
2321                 name = _bt_get_device_name(address);
2322         else
2323                 name = g_strdup("");
2324
2325         if (vconf_set_str(VCONFKEY_BT_HEADSET_NAME, name) != 0)
2326                 BT_ERR("vconf_set_str failed");
2327
2328         g_free(name);
2329
2330         /*  Set the headset state */
2331         if (vconf_get_int(VCONFKEY_BT_DEVICE, &bt_device_state) != 0)
2332                 BT_ERR("vconf_get_int failed");
2333
2334 #ifdef TIZEN_SUPPORT_DUAL_HF
2335         if ((connected == TRUE) &&
2336                 (FALSE == __bt_is_companion_device(address))) {
2337                 bt_device_state |= VCONFKEY_BT_DEVICE_HEADSET_CONNECTED;
2338         } else if ((bt_device_state & VCONFKEY_BT_DEVICE_HEADSET_CONNECTED) &&
2339                         (FALSE == __bt_is_companion_device(address))) {
2340                 bt_device_state ^= VCONFKEY_BT_DEVICE_HEADSET_CONNECTED;
2341         }
2342 #else
2343         if (connected == TRUE)
2344                 bt_device_state |= VCONFKEY_BT_DEVICE_HEADSET_CONNECTED;
2345         else if (bt_device_state & VCONFKEY_BT_DEVICE_HEADSET_CONNECTED)
2346                 bt_device_state ^= VCONFKEY_BT_DEVICE_HEADSET_CONNECTED;
2347 #endif
2348
2349         if (vconf_set_int(VCONFKEY_BT_DEVICE,
2350                                 bt_device_state) != 0) {
2351                 BT_ERR("vconf_set_int failed");
2352         }
2353 }
2354
2355 void _bt_handle_headset_event(GVariant *msg, const char *path)
2356 {
2357         int result = BLUETOOTH_ERROR_NONE;
2358         gboolean property_flag = FALSE;
2359         char *property = NULL;
2360         GVariant *value = NULL;
2361         GVariant *param = NULL;
2362         g_variant_get(msg, "(sv)", &property, &value);
2363         bluetooth_device_address_t bd_addr;
2364
2365         ret_if(property == NULL);
2366
2367         BT_DBG("Property = %s \n", property);
2368         /* We allow only 1 headset connection (HSP or HFP)*/
2369         if (strcasecmp(property, "Connected") == 0) {
2370                 int event = BLUETOOTH_EVENT_NONE;
2371                 bt_headset_wait_t *wait_list;
2372                 char *address;
2373                 guint trusted = TRUE;
2374                 g_variant_get(value, "b", &property_flag);
2375
2376                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
2377
2378                 _bt_convert_device_path_to_address(path, address);
2379                 _bt_convert_addr_string_to_type(bd_addr.addr, address);
2380
2381                 if (property_flag == TRUE) {
2382                         event = BLUETOOTH_EVENT_AG_CONNECTED;
2383                         _bt_get_trust_profile(&bd_addr, TRUSTED_PROFILE_A2DP, &trusted);
2384
2385                         if (_bt_headset_get_local_connection() == FALSE) {
2386                                 if (trusted == TRUE) /* not restricted*/
2387                                         _bt_start_timer_for_connection(address, BT_AUDIO_A2DP);
2388                         } else
2389                                 _bt_headset_set_local_connection(FALSE);
2390                 } else {
2391                         int previous_state;
2392
2393                         event = BLUETOOTH_EVENT_AG_DISCONNECTED;
2394
2395                         previous_state = _bt_get_device_state_from_list(BT_AUDIO_HSP, address);
2396                         if (previous_state == BT_STATE_DISCONNECTING)
2397                                 _bt_send_hf_local_term_event(address);
2398                 }
2399                 /* Set the State machine here */
2400                 __bt_connection_manager_set_state(address, event);
2401                 __bt_set_audio_values(property_flag, address);
2402                 param = g_variant_new("(is)", result, address);
2403                 _bt_send_event(BT_HEADSET_EVENT, event,
2404                         param);
2405
2406                 if (event == BLUETOOTH_EVENT_AG_DISCONNECTED) {
2407                         /* Remove data from the connected list */
2408                         _bt_remove_headset_from_list(BT_AUDIO_HSP, address);
2409
2410                         wait_list = _bt_get_audio_wait_data();
2411                         if (wait_list == NULL) {
2412                                 g_free(address);
2413                                 return;
2414                         }
2415
2416                         bluetooth_device_address_t device_address;
2417
2418                         _bt_set_audio_wait_data_flag(TRUE);
2419
2420                         _bt_convert_addr_string_to_type(device_address.addr,
2421                                                         wait_list->address);
2422                         _bt_audio_connect(wait_list->req_id, wait_list->type,
2423                                         &device_address, NULL);
2424                 } else if (event == BLUETOOTH_EVENT_AG_CONNECTED) {
2425                         /* Add data to the connected list */
2426                         _bt_add_headset_to_list(BT_AUDIO_HSP,
2427                                                 BT_STATE_CONNECTED, address);
2428
2429                         wait_list = _bt_get_audio_wait_data();
2430                         if (wait_list != NULL &&
2431                                 (g_strcmp0(wait_list->address, address) == 0))
2432                         _bt_rel_wait_data();
2433
2434                         BT_INFO("Check A2DP pending connect");
2435                         _bt_audio_check_pending_connect();
2436                 }
2437                 g_free(address);
2438         } else if (strcasecmp(property, "State") == 0) {
2439                 char *state = NULL;
2440
2441                 g_variant_get(value, "s", &state);
2442
2443                 /* This code assumes we support only 1 headset connection */
2444                 /* Need to use the headset list, if we support multi-headsets */
2445                 if (strcasecmp(state, "Playing") == 0) {
2446                         BT_DBG("Playing: Sco Connected");
2447                 } else if (strcasecmp(state, "connected") == 0 ||
2448                                 strcasecmp(state, "disconnected") == 0) {
2449                         BT_DBG("connected/disconnected: Sco Disconnected");
2450                 } else {
2451                         BT_ERR("Not handled state - %s", state);
2452                         g_free(state);
2453                         return;
2454                 }
2455                 g_free(state);
2456         } else if (strcasecmp(property, "SpeakerGain") == 0) {
2457                 guint16 spkr_gain;
2458                 char *address;
2459
2460                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
2461
2462                 _bt_convert_device_path_to_address(path, address);
2463
2464                 spkr_gain = g_variant_get_uint16(value);
2465
2466                 BT_DBG("spkr_gain: %d", spkr_gain);
2467
2468                 param = g_variant_new("(i&sq)", result, address, spkr_gain);
2469                 _bt_send_event(BT_HEADSET_EVENT, BLUETOOTH_EVENT_AG_SPEAKER_GAIN,
2470                         param);
2471
2472                 g_free(address);
2473         } else if (strcasecmp(property, "MicrophoneGain") == 0) {
2474                 guint16 mic_gain;
2475                 char *address;
2476
2477                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
2478
2479                 _bt_convert_device_path_to_address(path, address);
2480
2481                 mic_gain = g_variant_get_uint16(value);
2482
2483                 param = g_variant_new("(i&sq)", result, address, mic_gain);
2484                 _bt_send_event(BT_HEADSET_EVENT, BLUETOOTH_EVENT_AG_MIC_GAIN,
2485                         param);
2486                 g_free(address);
2487         }
2488
2489         if (property)
2490                 g_free(property);
2491         g_variant_unref(value);
2492 }
2493
2494 void _bt_handle_sink_event(GVariant *msg, const char *path)
2495 {
2496         GVariantIter value_iter;
2497         char *property = NULL;
2498
2499         bt_headset_wait_t *wait_list;
2500
2501         GVariant *child = NULL;
2502         GVariant *val = NULL;
2503         GVariant *param = NULL;
2504         g_variant_iter_init(&value_iter, msg);
2505         while ((child = g_variant_iter_next_value(&value_iter))) {
2506
2507                 g_variant_get(child, "{sv}", &property, &val);
2508
2509                 ret_if(property == NULL);
2510
2511                 BT_DBG("Property = %s \n", property);
2512
2513
2514                 if (strcasecmp(property, "State") == 0) {
2515                         int result = BLUETOOTH_ERROR_NONE;
2516                         char *value;
2517
2518                         g_variant_get(val, "s", &value);
2519                         BT_DBG("value: %s", value);
2520
2521                         if (g_strcmp0(value, "disconnected") == 0) {
2522                                 char *address;
2523
2524                                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
2525
2526                                 _bt_convert_device_path_to_address(path, address);
2527
2528                                 __bt_set_device_values(FALSE,
2529                                         VCONFKEY_BT_DEVICE_A2DP_HEADSET_CONNECTED);
2530                                 param = g_variant_new("(is)", result, address);
2531                                 _bt_send_event(BT_HEADSET_EVENT,
2532                                         BLUETOOTH_EVENT_AV_DISCONNECTED,
2533                                         param);
2534
2535                                 /* Remove data from the connected list */
2536                                 _bt_remove_headset_from_list(BT_AUDIO_A2DP, address);
2537                                 wait_list = _bt_get_audio_wait_data();
2538                                 if (wait_list == NULL) {
2539                                         g_free(value);
2540                                         g_free(property);
2541                                         g_variant_unref(val);
2542                                         g_variant_unref(child);
2543                                         g_free(address);
2544                                         return;
2545                                 }
2546
2547                                 if (((wait_list->type == BT_AUDIO_ALL) &&
2548                                         (wait_list->ag_flag == TRUE)) ||
2549                                         (wait_list->type == BT_AUDIO_A2DP) ||
2550                                         (wait_list->disconnection_type == BT_AUDIO_A2DP)) {
2551                                         bluetooth_device_address_t device_address;
2552                                         _bt_convert_addr_string_to_type(
2553                                                                 device_address.addr,
2554                                                                 wait_list->address);
2555
2556                                         _bt_audio_connect(wait_list->req_id,
2557                                                                 wait_list->type,
2558                                                                 &device_address,
2559                                                                 NULL);
2560                                 }
2561                                 g_free(address);
2562                         } else if (strcasecmp(value, "Connected") == 0) {
2563                                 char *address;
2564                                 char connected_address[BT_ADDRESS_STRING_SIZE + 1];
2565                                 bluetooth_device_address_t device_address;
2566                                 gboolean connected;
2567
2568                                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
2569
2570                                 _bt_convert_device_path_to_address(path, address);
2571
2572                                 __bt_set_device_values(TRUE,
2573                                                 VCONFKEY_BT_DEVICE_A2DP_HEADSET_CONNECTED);
2574                                 param = g_variant_new("(is)", result, address);
2575                                 _bt_send_event(BT_HEADSET_EVENT,
2576                                         BLUETOOTH_EVENT_AV_CONNECTED,
2577                                         param);
2578                                 /* Check for existing Media device to disconnect */
2579                                 connected = _bt_is_headset_type_connected(BT_AUDIO_A2DP,
2580                                                                         connected_address);
2581                                 if (connected) {
2582                                         /* Match connected device address */
2583                                         if (g_strcmp0(connected_address, address) != 0) {
2584                                                 /* Convert BD adress from string type */
2585                                                 _bt_convert_addr_string_to_type(
2586                                                                 device_address.addr,
2587                                                                 connected_address);
2588                                                 _bt_audio_disconnect(0, BT_AUDIO_A2DP,
2589                                                                 &device_address, NULL);
2590                                         }
2591                                 }
2592
2593                                 /* Add data to the connected list */
2594                                 _bt_add_headset_to_list(BT_AUDIO_A2DP,
2595                                                 BT_STATE_CONNECTED, address);
2596
2597                                 g_free(address);
2598                         }
2599                         g_free(value);
2600                 }
2601                 g_free(property);
2602                 g_variant_unref(val);
2603                 g_variant_unref(child);
2604         }
2605 }
2606
2607 void _bt_handle_agent_event(GVariant *msg, const char *member)
2608 {
2609         int result = BLUETOOTH_ERROR_NONE;
2610         char *address = NULL;
2611         char *name = NULL;
2612         char *uuid = NULL;
2613         GVariant *param = NULL;
2614         ret_if(member == NULL);
2615
2616         if (strcasecmp(member, "ObexAuthorize") == 0) {
2617                 __bt_get_agent_signal_info(msg, &address, &name, &uuid);
2618                 param = g_variant_new("(iss)", result, address, name);
2619                 _bt_send_event(BT_OPP_SERVER_EVENT,
2620                         BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE,
2621                         param);
2622                 /* TODO: MAP? see above */
2623                 g_free(address);
2624                 g_free(name);
2625         } else if (strcasecmp(member, "RfcommAuthorize") == 0) {
2626                 bt_rfcomm_server_info_t *server_info;
2627
2628                 __bt_get_agent_signal_info(msg, &address, &name, &uuid);
2629
2630                 server_info = _bt_rfcomm_get_server_info_using_uuid(uuid);
2631                 ret_if(server_info == NULL);
2632                 ret_if(server_info->server_type != BT_CUSTOM_SERVER);
2633                 param = g_variant_new("(isssn)", result, address, uuid, name,
2634                                         server_info->control_fd);
2635                 _bt_send_event(BT_RFCOMM_SERVER_EVENT,
2636                         BLUETOOTH_EVENT_RFCOMM_AUTHORIZE,
2637                         param);
2638                 g_free(address);
2639                 g_free(uuid);
2640                 g_free(name);
2641         }
2642 }
2643
2644 void _bt_handle_tds_provider_event(GVariant *msg, const char *member, const char *path)
2645 {
2646         BT_INFO("member: %s, path: %s", member, path);
2647
2648         ret_if(path == NULL);
2649
2650         if (strcasecmp(member, "TdsActivationRequested") == 0) {
2651                 GVariant *value = NULL;
2652                 int len = 0;
2653                 unsigned char *buffer = NULL;
2654                 unsigned char org_id;
2655
2656                 g_variant_get(msg, "(y@ay)", &org_id, &value);
2657                 BT_DBG("org_id: %.2x", org_id);
2658                 len = g_variant_get_size(value);
2659                 if (len > 0) {
2660                         int i;
2661                         buffer = (unsigned char *)g_variant_get_data(value);
2662                         for (i = 0; i < len; i++)
2663                                 BT_DBG("%.2x", buffer[i]);
2664                 }
2665
2666                 /* Send event only registered client */
2667                 _bt_tds_handle_activation_request(path, org_id, buffer, len);
2668                 g_variant_unref(value);
2669         }
2670 }
2671
2672 static int __bt_get_object_path(GVariant *msg, char **path)
2673 {
2674         g_variant_get(msg, "(o*)", path, NULL);
2675         if (*path == NULL)
2676                 return BLUETOOTH_ERROR_INTERNAL;
2677
2678         return BLUETOOTH_ERROR_NONE;
2679 }
2680
2681 static void __bt_devices_list_free(void)
2682 {
2683         bt_cache_info_t *cache_info;
2684         GList *node;
2685
2686         node = g_list_first(p_cache_list);
2687
2688         while (node != NULL) {
2689                 cache_info = (bt_cache_info_t *)node->data;
2690                 p_cache_list = g_list_remove(p_cache_list, cache_info);
2691                 __bt_free_cache_info(cache_info);
2692
2693                 node = g_list_next(node);
2694         }
2695 }
2696
2697 static int __bt_parse_event(GVariant *msg)
2698 {
2699         GVariantIter iter;
2700         GVariant *child;
2701         char *interface_name = NULL;
2702         GVariant *inner_iter = NULL;
2703
2704         g_variant_iter_init(&iter, msg);
2705
2706         while ((child = g_variant_iter_next_value(&iter))) {
2707                 g_variant_get(child, "{&s@a{sv}}", &interface_name, &inner_iter);
2708                 if (g_strcmp0(interface_name,
2709                                 BT_DEVICE_INTERFACE) == 0) {
2710                         g_variant_unref(inner_iter);
2711                         g_variant_unref(child);
2712                         return BT_DEVICE_EVENT;
2713                 } else if (g_strcmp0(interface_name,
2714                                 BT_MEDIATRANSPORT_INTERFACE) == 0) {
2715                         g_variant_unref(inner_iter);
2716                         g_variant_unref(child);
2717                         return BT_MEDIA_TRANSFER_EVENT;
2718                 } else if (g_strcmp0(interface_name,
2719                                 BT_PLAYER_CONTROL_INTERFACE) == 0) {
2720                         g_variant_unref(inner_iter);
2721                         g_variant_unref(child);
2722                         return BT_AVRCP_CONTROL_EVENT;
2723                 }
2724                 g_variant_unref(inner_iter);
2725                 g_variant_unref(child);
2726         }
2727
2728         return 0;
2729 }
2730
2731 static  void __bt_manager_event_filter(GDBusConnection *connection,
2732                                         const gchar *sender_name,
2733                                         const gchar *object_path,
2734                                         const gchar *interface_name,
2735                                         const gchar *signal_name,
2736                                         GVariant *parameters,
2737                                         gpointer user_data)
2738 {
2739         bt_event_type_t bt_event = 0x00;
2740         int result = BLUETOOTH_ERROR_NONE;
2741         GVariant *value;
2742         char *obj_path = NULL;
2743         GVariant *param = NULL;
2744         if (signal_name == NULL)
2745                 return;
2746         if (strcasecmp(signal_name, "InterfacesAdded") == 0) {
2747                 g_variant_get(parameters, "(&o@a{sa{sv}})", &obj_path, &value);
2748
2749                 if (strcasecmp(obj_path, BT_BLUEZ_HCI_PATH) == 0) {
2750 #ifdef TIZEN_FEATURE_BT_USB_DONGLE
2751                         BT_DBG("Enable Adapter");
2752                         _bt_enable_adapter();
2753 #else
2754                         _bt_handle_adapter_added();
2755 #endif
2756                 } else {
2757                         bt_event = __bt_parse_event(value);
2758                         if (bt_event == BT_DEVICE_EVENT) {
2759                                 bt_cache_info_t *cache_info;
2760                                 bt_remote_dev_info_t *dev_info;
2761 #ifdef TIZEN_FEATURE_BT_DPM
2762                                 int desktop_state = DPM_BT_ERROR;
2763 #endif
2764                                 ret_if(_bt_is_discovering() == FALSE &&
2765                                                 _bt_is_le_scanning() == FALSE);
2766
2767                                 cache_info = g_malloc0(sizeof(bt_cache_info_t));
2768
2769                                 dev_info = g_malloc0(sizeof(bt_remote_dev_info_t));
2770
2771                                 cache_info->dev_info = dev_info;
2772
2773                                 if (__bt_parse_interface(parameters, dev_info) == FALSE) {
2774                                         BT_ERR("Fail to parse the properies");
2775                                         __bt_free_cache_info(cache_info);
2776                                         g_variant_unref(value);
2777                                         return;
2778                                 }
2779
2780                                 if (dev_info->addr_type != BDADDR_BREDR) {
2781                                         /* Whenever emit the property changed from bluez,
2782                                                 some property doesn't reach to bt-service.
2783                                                 So LE device is handled as AdvReport signal */
2784                                         __bt_free_cache_info(cache_info);
2785                                         g_variant_unref(value);
2786                                         return;
2787                                 }
2788
2789                                 if (dev_info->name == NULL)
2790                                         /* If Remote device name is NULL or still RNR is not done
2791                                          * then display address as name.
2792                                          */
2793                                         dev_info->name = g_strdup(dev_info->address);
2794
2795 #ifdef TIZEN_FEATURE_BT_DPM
2796                                 _bt_dpm_get_bluetooth_desktop_connectivity_state(&desktop_state);
2797                                 if (desktop_state == DPM_RESTRICTED) {
2798                                         bluetooth_device_class_t device_class;
2799                                         _bt_divide_device_class(&device_class, dev_info->class);
2800                                         BT_DBG("[%s]device_class.major_class : %d", dev_info->name, device_class.major_class);
2801
2802                                         if (device_class.major_class ==
2803                                                 BLUETOOTH_DEVICE_MAJOR_CLASS_COMPUTER) {
2804                                                 __bt_free_cache_info(cache_info);
2805                                                 g_variant_unref(value);
2806                                                 return;
2807                                         }
2808                                 }
2809 #endif
2810
2811                                 GVariant *uuids = NULL;
2812                                 GVariantBuilder *builder = NULL;
2813                                 int i = 0;
2814                                 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
2815                                 for (i = 0; i < dev_info->uuid_count; i++) {
2816                                         g_variant_builder_add(builder, "s",
2817                                                 dev_info->uuids[i]);
2818                                 }
2819                                 uuids = g_variant_new("as", builder);
2820                                 g_variant_builder_unref(builder);
2821                                 GVariant *manufacturer_data = NULL;
2822                                 manufacturer_data = g_variant_new_from_data(
2823                                                         G_VARIANT_TYPE_BYTESTRING,
2824                                                         dev_info->manufacturer_data,
2825                                                         dev_info->manufacturer_data_len,
2826                                                         TRUE, NULL, NULL);
2827                                 param = g_variant_new("(isunsbub@asn@ay)", result,
2828                                                         dev_info->address,
2829                                                         dev_info->class,
2830                                                         dev_info->rssi,
2831                                                         dev_info->name,
2832                                                         dev_info->paired,
2833                                                         dev_info->connected,
2834                                                         dev_info->trust,
2835                                                         uuids,
2836                                                         dev_info->manufacturer_data_len,
2837                                                         manufacturer_data);
2838                                 _bt_send_event(BT_ADAPTER_EVENT,
2839                                         BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND,
2840                                          param);
2841                                 p_cache_list = g_list_append(p_cache_list, cache_info);
2842                         } else if (bt_event == BT_AVRCP_CONTROL_EVENT) {
2843                                 BT_DBG("Device path : %s ", obj_path);
2844                                 _bt_set_control_device_path(obj_path);
2845                         }
2846                 }
2847                 g_variant_unref(value);
2848         } else if (strcasecmp(signal_name, "InterfacesRemoved") == 0) {
2849 #ifdef TIZEN_FEATURE_BT_USB_DONGLE
2850                 BT_DBG("InterfacesRemoved");
2851                 _bt_handle_adapter_removed();
2852 #endif
2853                 if (g_strcmp0(interface_name, BT_MEDIATRANSPORT_INTERFACE) == 0)
2854                         bt_event = BT_MEDIA_TRANSFER_EVENT;
2855                 else if (g_strcmp0(interface_name, BT_DEVICE_INTERFACE) == 0)
2856                         bt_event = BT_DEVICE_EVENT;
2857                 else if (g_strcmp0(interface_name, BT_PLAYER_CONTROL_INTERFACE) == 0)
2858                         bt_event = BT_AVRCP_CONTROL_EVENT;
2859
2860                 if ((bt_event != 0) && (bt_event != BT_MEDIA_TRANSFER_EVENT)) {
2861                         _bt_handle_adapter_event(parameters, signal_name);
2862                         if (bt_event == BT_AVRCP_CONTROL_EVENT) {
2863                                 BT_INFO("Object Path %s", obj_path);
2864                                 _bt_remove_control_device_path(obj_path);
2865                         }
2866                 }
2867         } else if (strcasecmp(signal_name, "NameOwnerChanged") == 0) {
2868                 gboolean value;
2869                 char *name = NULL;
2870                 char *previous = NULL;
2871                 char *current = NULL;
2872
2873                 if (__bt_get_owner_info(parameters, &name, &previous, &current)) {
2874                         BT_ERR("Fail to get the owner info");
2875                         return;
2876                 }
2877
2878                 if (*current != '\0') {
2879                         g_free(current);
2880                         if (name)
2881                                 g_free(name);
2882                         if (previous)
2883                                 g_free(previous);
2884                         return;
2885                 }
2886
2887                 if (strcasecmp(name, BT_BLUEZ_NAME) == 0) {
2888                         BT_INFO_C("### Bluetoothd is terminated");
2889                         if (_bt_adapter_get_status() != BT_DEACTIVATING &&
2890                                 _bt_adapter_get_status() != BT_DEACTIVATED) {
2891                                 BT_INFO_C("Turn Off Bluetooth");
2892                                 _bt_set_le_disabled(BLUETOOTH_ERROR_NONE);
2893                                 _bt_disable_cb();
2894                         }
2895                         _bt_handle_adapter_removed();
2896                         __bt_devices_list_free();
2897                         _bt_service_adapter_le_deinit();
2898                 }
2899
2900                 _bt_obex_server_check_allocation(&value);
2901
2902                 if (value == TRUE) {
2903                         /* Check if the obex server was terminated abnormally */
2904                         _bt_obex_server_check_termination(name);
2905                 }
2906
2907                 _bt_rfcomm_server_check_existence(&value);
2908
2909                 if (value == TRUE) {
2910                         /* The obex server was terminated abnormally */
2911                         _bt_rfcomm_server_check_termination(name);
2912                 }
2913
2914                 /* Reset connection interval */
2915                 _bt_remove_all_le_conn_param_info(name);
2916
2917                 /* Stop advertising started by terminated process */
2918                 _bt_stop_advertising_by_terminated_process(name);
2919                 /* Stop LE Scan */
2920                 _bt_stop_le_scan(name);
2921
2922                 /* Stop the Proximity reporter service */
2923                 _bt_proximity_reporter_stop_by_terminated_process(name);
2924
2925                 /* Stop the Transport Discovery service */
2926                 _bt_tds_stop_by_terminated_process(name);
2927
2928                 g_free(name);
2929                 g_free(previous);
2930                 g_free(current);
2931         } else if (g_strcmp0(interface_name, BT_PROPERTIES_INTERFACE) == 0) {
2932                 const char *path = object_path;
2933
2934                 if (strncmp(path, BT_MEDIA_OBJECT_PATH,
2935                                 strlen(BT_MEDIA_OBJECT_PATH)) == 0)
2936                         return;
2937
2938                 _bt_handle_property_changed_event(parameters, object_path);
2939         } else if (g_strcmp0(interface_name, BT_ADAPTER_INTERFACE) == 0) {
2940                 _bt_handle_adapter_event(parameters, signal_name);
2941         } else if (g_strcmp0(interface_name, BT_INPUT_INTERFACE) == 0) {
2942                 _bt_handle_input_event(parameters, object_path);
2943         } else if (g_strcmp0(interface_name, BT_NETWORK_SERVER_INTERFACE) == 0) {
2944                 _bt_handle_network_server_event(parameters, signal_name);
2945         } else if (g_strcmp0(interface_name, BT_HEADSET_INTERFACE) == 0) {
2946                 _bt_handle_headset_event(parameters, object_path);
2947         } else if (g_strcmp0(interface_name, BT_SINK_INTERFACE) == 0) {
2948                 _bt_handle_sink_event(parameters, object_path);
2949         } else if (g_strcmp0(interface_name, BT_AGENT_INTERFACE) == 0) {
2950                 _bt_handle_agent_event(parameters, signal_name);
2951         } else if (g_strcmp0(interface_name, BT_DEVICE_INTERFACE) == 0) {
2952                 _bt_handle_device_event(parameters, signal_name, object_path);
2953         } else if (g_strcmp0(interface_name, BT_TDS_PROVIDER_INTERFACE) == 0) {
2954                 _bt_handle_tds_provider_event(parameters, signal_name, object_path);
2955         } else if (g_strcmp0(interface_name, BT_GATT_CHAR_INTERFACE) == 0) {
2956                 _bt_handle_gatt_event(parameters, signal_name, object_path);
2957         }
2958
2959         return;
2960 }
2961
2962 static gboolean __bt_is_obexd_event(GVariant *msg, const char *interface)
2963 {
2964
2965         if (g_strcmp0(interface, BT_PROPERTIES_INTERFACE) == 0) {
2966                 char *interface_name = NULL;
2967
2968                 g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, NULL, NULL);
2969                 retv_if(interface_name == NULL, FALSE);
2970
2971                 if (strcasecmp(interface_name, BT_OBEX_TRANSFER_INTERFACE) == 0) {
2972                         BT_DBG("BT_OBEX_TRANSFER_INTERFACE");
2973                         return TRUE;
2974                 }
2975         }
2976
2977         return FALSE;
2978 }
2979
2980 static  void __bt_obexd_event_filter(GDBusConnection *connection,
2981                                         const gchar *sender_name,
2982                                         const gchar *object_path,
2983                                         const gchar *interface_name,
2984                                         const gchar *signal_name,
2985                                         GVariant *parameters,
2986                                         gpointer user_data)
2987 {
2988         const char *member = signal_name;
2989         char *obj_path = NULL;
2990         ret_if(member == NULL);
2991
2992         if (strcasecmp(member, "InterfacesAdded") == 0) {
2993                 if (__bt_get_object_path(parameters, &obj_path)) {
2994                         BT_ERR("Fail to get the path");
2995                         return;
2996                 }
2997                 BT_INFO("object_path = [%s]", obj_path);
2998
2999                 /*Handle OPP_SERVER_CONNECTED_EVENT here */
3000                 /* TODO: MAP? see above */
3001                 if (strncmp(obj_path, BT_SESSION_BASEPATH_SERVER,
3002                                 strlen(BT_SESSION_BASEPATH_SERVER)) != 0) {
3003                         g_free(obj_path);
3004                         return;
3005                 }
3006
3007                 if (g_strrstr(obj_path, "session") && g_strrstr(obj_path, "transfer")) {
3008                         BT_DBG("Obex_Server_Session_Transfer connected");
3009                         _bt_obex_transfer_connected(obj_path);
3010                 }
3011                 g_free(obj_path);
3012         } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
3013                 /*Handle OPP_SERVER_DISCONNECTED_EVENT here */
3014                 /* TODO: MAP? see above */
3015                 if (__bt_get_object_path(parameters, &obj_path)) {
3016                         BT_ERR("Fail to get the path");
3017                         return;
3018                 }
3019                 BT_INFO("object_path = [%s]", obj_path);
3020
3021                 if (strncmp(obj_path, BT_SESSION_BASEPATH_CLIENT,
3022                                 strlen(BT_SESSION_BASEPATH_CLIENT)) == 0) {
3023                         BT_DBG("Call PBAP Disconnected");
3024                         _bt_obex_pbap_client_disconnect(obj_path);
3025                 }
3026
3027                 if (strncmp(obj_path, BT_SESSION_BASEPATH_SERVER,
3028                                 strlen(BT_SESSION_BASEPATH_SERVER)) != 0) {
3029                         g_free(obj_path);
3030                         return;
3031                 }
3032
3033                 if (g_strrstr(obj_path, "session") && g_strrstr(obj_path, "transfer")) {
3034                         BT_DBG("Obex_Server_Session_Transfer disconnected %s",
3035                                                                 obj_path);
3036
3037                         _bt_obex_transfer_disconnected(obj_path);
3038                 }
3039                 g_free(obj_path);
3040         } else if (__bt_is_obexd_event(parameters, interface_name) == TRUE) {
3041                 const char *path = object_path;
3042
3043                 if (strncmp(path, BT_SESSION_BASEPATH_SERVER,
3044                                 strlen(BT_SESSION_BASEPATH_SERVER)) != 0 &&
3045                         strncmp(path, BT_SESSION_BASEPATH_CLIENT,
3046                                 strlen(BT_SESSION_BASEPATH_CLIENT)) != 0) {
3047                         BT_DBG("DBUS_HANDLER_RESULT_NOT_YET_HANDLED");
3048                         return;
3049                 }
3050
3051                 _bt_handle_property_changed_event(parameters, path);
3052         }
3053         BT_DBG("-");
3054         return;
3055 }
3056
3057 static gboolean __bt_is_obexd_client_event(GVariant *msg, const char *interface)
3058 {
3059         BT_DBG("+");
3060
3061         if (g_strcmp0(interface, BT_PROPERTIES_INTERFACE) == 0) {
3062                 char *interface_name = NULL;
3063
3064                 g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, NULL, NULL);
3065
3066                 retv_if(interface_name == NULL, FALSE);
3067
3068                 if (strcasecmp(interface_name,
3069                                         BT_OBEX_TRANSFER_INTERFACE) == 0) {
3070                         BT_DBG("-");
3071                         return TRUE;
3072                 }
3073         }
3074
3075         BT_DBG("-");
3076
3077         return FALSE;
3078 }
3079
3080 static  void __bt_opc_event_filter(GDBusConnection *connection,
3081                                         const gchar *sender_name,
3082                                         const gchar *object_path,
3083                                         const gchar *interface_name,
3084                                         const gchar *signal_name,
3085                                         GVariant *parameters,
3086                                         gpointer user_data)
3087 {
3088         const char *member = signal_name;
3089         char *obj_path = NULL;
3090         if (strcasecmp(member, "InterfacesAdded") == 0) {
3091                 BT_DBG("InterfacesAdded");
3092         } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
3093
3094                 if (__bt_get_object_path(parameters, &obj_path)) {
3095                         BT_ERR("Fail to get the path");
3096                         return;
3097                 }
3098
3099                 BT_DBG("object_path = %s", obj_path);
3100
3101                 if (strncmp(obj_path, BT_SESSION_BASEPATH_CLIENT,
3102                                 strlen(BT_SESSION_BASEPATH_CLIENT)) != 0
3103                                 || strstr(obj_path, "transfer") == NULL) {
3104                         g_free(obj_path);
3105                         return;
3106                 } else if (strncmp(obj_path, BT_SESSION_BASEPATH_CLIENT,
3107                                 strlen(BT_SESSION_BASEPATH_CLIENT)) == 0) {
3108                         BT_DBG("Going to call opc disconnected");
3109                         _bt_opc_disconnected(obj_path);
3110                 }
3111
3112                 _bt_sending_files();
3113                 g_free(obj_path);
3114         } else if (__bt_is_obexd_client_event(parameters, interface_name) == TRUE) {
3115                 char *path = (char *)object_path;
3116                 BT_INFO("object_path %s", path);
3117                 if (strncmp(path, BT_SESSION_BASEPATH_CLIENT,
3118                         strlen(BT_SESSION_BASEPATH_CLIENT)) != 0) {
3119                         BT_DBG("NOT BT_SESSION_BASEPATH_CLIENT");
3120                         return;
3121                 }
3122
3123                 _bt_opc_property_changed_event(parameters, path);
3124         }
3125
3126         return;
3127 }
3128
3129 int _bt_opp_client_event_init(void)
3130 {
3131         GError *error = NULL;
3132
3133         if (opc_obexd_conn == NULL) {
3134                 opc_obexd_conn = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error);
3135
3136                 if (!opc_obexd_conn) {
3137                         if (error) {
3138                                 BT_ERR("Unable to connect to dbus: %s", error->message);
3139                                 g_clear_error(&error);
3140                         }
3141                 return BLUETOOTH_ERROR_INTERNAL;
3142                 }
3143         }
3144
3145         if (_bt_register_service_event(opc_obexd_conn,
3146                         BT_OPP_CLIENT_EVENT) != BLUETOOTH_ERROR_NONE) {
3147                         g_object_unref(opc_obexd_conn);
3148                         opc_obexd_conn = NULL;
3149                         return BLUETOOTH_ERROR_INTERNAL;
3150         }
3151
3152         return BLUETOOTH_ERROR_NONE;
3153 }
3154
3155 void _bt_opp_client_event_deinit(void)
3156 {
3157         if (opc_obexd_conn) {
3158                 _bt_unregister_service_event(opc_obexd_conn,
3159                                                 BT_OPP_CLIENT_EVENT);
3160                  g_object_unref(opc_obexd_conn);
3161                  opc_obexd_conn = NULL;
3162         }
3163 }
3164
3165 static  void __bt_map_event_filter(GDBusConnection *connection,
3166                                         const gchar *sender_name,
3167                                         const gchar *object_path,
3168                                         const gchar *interface_name,
3169                                         const gchar *signal_name,
3170                                         GVariant *parameters,
3171                                         gpointer user_data)
3172 {
3173         BT_DBG("Entered __bt_map_event_filter");
3174         const char *member = signal_name;
3175
3176         if (strcasecmp(member, "InterfacesAdded") == 0) {
3177                 BT_DBG("------------------------------------ADDED------------------------------------");
3178                 // currently doing nothing
3179         } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
3180                 BT_DBG("------------------------------------REMOVED------------------------------------");
3181                 // TODO check if something should be called here?
3182                 //_bt_map_on_transfer_finished(object_path, error);
3183         } else if (__bt_is_obexd_client_event(parameters, interface_name) == TRUE) {
3184                 BT_DBG("------------------------------------CLIENT EVENT------------------------------------");
3185                 _bt_map_property_changed_event(parameters, object_path);
3186         }
3187
3188         return;
3189 }
3190
3191 int _bt_map_client_event_init(void)
3192 {
3193         GError *error = NULL;
3194
3195         if (map_obexd_conn == NULL) {
3196                 map_obexd_conn = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error);
3197
3198                 if (!map_obexd_conn) {
3199                         if (error) {
3200                                 BT_ERR("Unable to connect to dbus: %s", error->message);
3201                                 g_clear_error(&error);
3202                         }
3203                 return BLUETOOTH_ERROR_INTERNAL;
3204                 }
3205         }
3206
3207         if (_bt_register_service_event(map_obexd_conn,
3208                         BT_MAP_CLIENT_EVENT) != BLUETOOTH_ERROR_NONE) {
3209                         g_object_unref(map_obexd_conn);
3210                         map_obexd_conn = NULL;
3211                         return BLUETOOTH_ERROR_INTERNAL;
3212         }
3213
3214         return BLUETOOTH_ERROR_NONE;
3215 }
3216
3217 void _bt_map_client_event_deinit(void)
3218 {
3219         if (map_obexd_conn) {
3220                 _bt_unregister_service_event(map_obexd_conn,
3221                                                 BT_MAP_CLIENT_EVENT);
3222                  g_object_unref(map_obexd_conn);
3223                  map_obexd_conn = NULL;
3224         }
3225 }
3226
3227 int _bt_register_manager_subscribe_signal(GDBusConnection *conn,
3228                 int subscribe)
3229 {
3230         if (conn == NULL)
3231                 return -1;
3232
3233         static guint subs_interface_added_id;
3234         static guint subs_interface_removed_id;
3235         static guint subs_name_owner_id;
3236         static guint subs_property_id;
3237         static guint subs_adapter_id;
3238         static guint subs_gatt_id;
3239
3240         if (subscribe) {
3241                 if (subs_interface_added_id == 0) {
3242                         subs_interface_added_id = g_dbus_connection_signal_subscribe(conn,
3243                                 NULL, BT_MANAGER_INTERFACE,
3244                                 BT_INTERFACES_ADDED, NULL, NULL, 0,
3245                                 __bt_manager_event_filter,
3246                                 NULL, NULL);
3247                 }
3248                 if (subs_interface_removed_id == 0) {
3249                         subs_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
3250                                 NULL, BT_MANAGER_INTERFACE,
3251                                 BT_INTERFACES_REMOVED, NULL, NULL, 0,
3252                                 __bt_manager_event_filter,
3253                                 NULL, NULL);
3254                 }
3255                 if (subs_name_owner_id == 0) {
3256                         subs_name_owner_id = g_dbus_connection_signal_subscribe(conn,
3257                                 NULL, BT_FREEDESKTOP_INTERFACE,
3258                                 BT_NAME_OWNER_CHANGED, NULL, NULL, 0,
3259                                 __bt_manager_event_filter,
3260                                 NULL, NULL);
3261                 }
3262                 if (subs_property_id == 0) {
3263                         subs_property_id = g_dbus_connection_signal_subscribe(conn,
3264                                 NULL, BT_PROPERTIES_INTERFACE,
3265                                 BT_PROPERTIES_CHANGED, NULL, NULL, 0,
3266                                 __bt_manager_event_filter,
3267                                 NULL, NULL);
3268                 }
3269                 if (subs_adapter_id == 0) {
3270                         subs_adapter_id = g_dbus_connection_signal_subscribe(conn,
3271                                 NULL, BT_ADAPTER_INTERFACE,
3272                                 NULL, NULL, NULL, 0,
3273                                 __bt_manager_event_filter,
3274                                 NULL, NULL);
3275                 }
3276                 if (subs_gatt_id == 0) {
3277                         subs_gatt_id = g_dbus_connection_signal_subscribe(conn,
3278                                 NULL, BT_GATT_CHAR_INTERFACE,
3279                                 NULL, NULL, NULL, 0,
3280                                 __bt_manager_event_filter,
3281                                 NULL, NULL);
3282                 }
3283         } else {
3284                 if (subs_interface_added_id > 0) {
3285                         g_dbus_connection_signal_unsubscribe(conn,
3286                                         subs_interface_added_id);
3287                         subs_interface_added_id = 0;
3288                 }
3289                 if (subs_interface_removed_id > 0) {
3290                         g_dbus_connection_signal_unsubscribe(conn,
3291                                         subs_interface_removed_id);
3292                         subs_interface_removed_id = 0;
3293                 }
3294                 if (subs_name_owner_id > 0) {
3295                         g_dbus_connection_signal_unsubscribe(conn,
3296                                         subs_name_owner_id);
3297                         subs_name_owner_id = 0;
3298                 }
3299                 if (subs_property_id > 0) {
3300                         g_dbus_connection_signal_unsubscribe(conn,
3301                                         subs_property_id);
3302                         subs_property_id = 0;
3303                 }
3304                 if (subs_adapter_id > 0) {
3305                         g_dbus_connection_signal_unsubscribe(conn, subs_adapter_id);
3306                         subs_adapter_id = 0;
3307                 }
3308                 if (subs_gatt_id > 0) {
3309                         g_dbus_connection_signal_unsubscribe(conn, subs_gatt_id);
3310                         subs_gatt_id = 0;
3311                 }
3312         }
3313         return 0;
3314 }
3315
3316 int _bt_register_device_subscribe_signal(GDBusConnection *conn,
3317                 int subscribe)
3318 {
3319         if (conn == NULL)
3320                 return -1;
3321
3322         static guint subs_device_id;
3323
3324         if (subscribe) {
3325                 if (subs_device_id == 0) {
3326                         subs_device_id = g_dbus_connection_signal_subscribe(conn,
3327                                 NULL, BT_DEVICE_INTERFACE,
3328                                 NULL, NULL, NULL, 0,
3329                                 __bt_manager_event_filter,
3330                                 NULL, NULL);
3331                 }
3332         } else {
3333                 if (subs_device_id > 0) {
3334                         g_dbus_connection_signal_unsubscribe(conn,
3335                                         subs_device_id);
3336                         subs_device_id = 0;
3337                 }
3338         }
3339         return 0;
3340 }
3341
3342 int _bt_register_input_subscribe_signal(GDBusConnection *conn,
3343                 int subscribe)
3344 {
3345         if (conn == NULL)
3346                 return -1;
3347
3348         static int subs_input_id;
3349
3350         if (subscribe) {
3351                 if (subs_input_id == 0) {
3352                         subs_input_id = g_dbus_connection_signal_subscribe(conn,
3353                                 NULL, BT_INPUT_INTERFACE,
3354                                 NULL, NULL, NULL, 0,
3355                                 __bt_manager_event_filter,
3356                                 NULL, NULL);
3357                 }
3358         } else {
3359                 if (subs_input_id > 0) {
3360                         g_dbus_connection_signal_unsubscribe(conn,
3361                                         subs_input_id);
3362                         subs_input_id = 0;
3363                 }
3364         }
3365         return 0;
3366 }
3367
3368 int _bt_register_network_subscribe_signal(GDBusConnection *conn,
3369                 int subscribe)
3370 {
3371         if (conn == NULL)
3372                 return -1;
3373
3374         static guint subs_serv_id;
3375         static guint subs_client_id;
3376
3377         if (subscribe) {
3378                 if (subs_serv_id == 0) {
3379                         subs_serv_id = g_dbus_connection_signal_subscribe(conn,
3380                                 NULL, BT_NETWORK_SERVER_INTERFACE,
3381                                 NULL, NULL, NULL, 0,
3382                                 __bt_manager_event_filter,
3383                                 NULL, NULL);
3384                 }
3385                 if (subs_client_id == 0) {
3386                         subs_client_id = g_dbus_connection_signal_subscribe(conn,
3387                                 NULL, BT_NETWORK_CLIENT_INTERFACE,
3388                                 NULL, NULL, NULL, 0,
3389                                 __bt_manager_event_filter,
3390                                 NULL, NULL);
3391                 }
3392         } else {
3393                 if (subs_serv_id > 0) {
3394                         g_dbus_connection_signal_unsubscribe(conn,
3395                                         subs_serv_id);
3396                         subs_serv_id = 0;
3397                 }
3398                 if (subs_client_id > 0) {
3399                         g_dbus_connection_signal_unsubscribe(conn,
3400                                         subs_client_id);
3401                         subs_client_id = 0;
3402                 }
3403         }
3404         return 0;
3405 }
3406
3407 int _bt_register_audio_subscribe_signal(GDBusConnection *conn,
3408                 int subscribe)
3409 {
3410         if (conn == NULL)
3411                 return -1;
3412
3413         static guint subs_headset_id;
3414         static guint subs_sink_id;
3415
3416         if (subscribe) {
3417                 if (subs_headset_id == 0) {
3418                         subs_headset_id = g_dbus_connection_signal_subscribe(conn,
3419                                 NULL, BT_HEADSET_INTERFACE,
3420                                 NULL, NULL, NULL, 0,
3421                                 __bt_manager_event_filter,
3422                                 NULL, NULL);
3423                 }
3424                 if (subs_sink_id == 0) {
3425                         subs_sink_id = g_dbus_connection_signal_subscribe(conn,
3426                                 NULL, BT_SINK_INTERFACE,
3427                                 NULL, NULL, NULL, 0,
3428                                 __bt_manager_event_filter,
3429                                 NULL, NULL);
3430                 }
3431         } else {
3432                 if (subs_headset_id > 0) {
3433                         g_dbus_connection_signal_unsubscribe(conn,
3434                                         subs_headset_id);
3435                         subs_headset_id = 0;
3436                 }
3437                 if (subs_sink_id > 0) {
3438                         g_dbus_connection_signal_unsubscribe(conn,
3439                                         subs_sink_id);
3440                         subs_sink_id = 0;
3441                 }
3442         }
3443         return 0;
3444 }
3445
3446 int _bt_register_opp_server_subscribe_signal(GDBusConnection *conn,
3447                 int subscribe)
3448 {
3449         if (conn == NULL)
3450                 return -1;
3451
3452         static guint subs_opp_server_interface_added_id;
3453         static guint subs_opp_server_interface_removed_id;
3454         static guint subs_opp_server_property_id;
3455
3456
3457         if (subscribe) {
3458                 if (subs_opp_server_interface_added_id == 0) {
3459                         subs_opp_server_interface_added_id = g_dbus_connection_signal_subscribe(conn,
3460                                 NULL, BT_MANAGER_INTERFACE,
3461                                 BT_INTERFACES_ADDED, NULL, NULL, 0,
3462                                 __bt_obexd_event_filter,
3463                                 NULL, NULL);
3464                 }
3465                 if (subs_opp_server_interface_removed_id == 0) {
3466                         subs_opp_server_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
3467                                 NULL, BT_MANAGER_INTERFACE,
3468                                 BT_INTERFACES_REMOVED, NULL, NULL, 0,
3469                                 __bt_obexd_event_filter,
3470                                 NULL, NULL);
3471                 }
3472                 if (subs_opp_server_property_id == 0) {
3473                         subs_opp_server_property_id = g_dbus_connection_signal_subscribe(conn,
3474                                 NULL, BT_PROPERTIES_INTERFACE,
3475                                 BT_PROPERTIES_CHANGED, NULL, NULL, 0,
3476                                 __bt_obexd_event_filter,
3477                                 NULL, NULL);
3478                 }
3479         } else {
3480                 if (subs_opp_server_interface_added_id > 0) {
3481                         g_dbus_connection_signal_unsubscribe(conn,
3482                                         subs_opp_server_interface_added_id);
3483                         subs_opp_server_interface_added_id = 0;
3484                 }
3485                 if (subs_opp_server_interface_removed_id > 0) {
3486                         g_dbus_connection_signal_unsubscribe(conn,
3487                                         subs_opp_server_interface_removed_id);
3488                         subs_opp_server_interface_removed_id = 0;
3489                 }
3490                 if (subs_opp_server_property_id > 0) {
3491                         g_dbus_connection_signal_unsubscribe(conn,
3492                                         subs_opp_server_property_id);
3493                         subs_opp_server_property_id = 0;
3494                 }
3495         }
3496         return 0;
3497 }
3498
3499 int _bt_register_opp_client_subscribe_signal(GDBusConnection *conn,
3500                 int subscribe)
3501 {
3502         if (conn == NULL)
3503                 return -1;
3504
3505         static guint subs_opp_client_interface_added_id;
3506         static guint subs_opp_client_interface_removed_id;
3507         static guint subs_opp_client_property_id;
3508
3509
3510         if (subscribe) {
3511                 if (subs_opp_client_interface_added_id == 0) {
3512                         subs_opp_client_interface_added_id = g_dbus_connection_signal_subscribe(conn,
3513                                 NULL, BT_MANAGER_INTERFACE,
3514                                 BT_INTERFACES_ADDED, NULL, NULL, 0,
3515                                 __bt_opc_event_filter,
3516                                 NULL, NULL);
3517                 }
3518                 if (subs_opp_client_interface_removed_id == 0) {
3519                         subs_opp_client_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
3520                                 NULL, BT_MANAGER_INTERFACE,
3521                                 BT_INTERFACES_REMOVED, NULL, NULL, 0,
3522                                 __bt_opc_event_filter,
3523                                 NULL, NULL);
3524                 }
3525                 if (subs_opp_client_property_id == 0) {
3526                         subs_opp_client_property_id = g_dbus_connection_signal_subscribe(conn,
3527                                 NULL, BT_PROPERTIES_INTERFACE,
3528                                 BT_PROPERTIES_CHANGED, NULL, NULL, 0,
3529                                 __bt_opc_event_filter,
3530                                 NULL, NULL);
3531                 }
3532         } else {
3533                 if (subs_opp_client_interface_added_id > 0) {
3534                         g_dbus_connection_signal_unsubscribe(conn,
3535                                         subs_opp_client_interface_added_id);
3536                         subs_opp_client_interface_added_id = 0;
3537                 }
3538                 if (subs_opp_client_interface_removed_id > 0) {
3539                         g_dbus_connection_signal_unsubscribe(conn,
3540                                         subs_opp_client_interface_removed_id);
3541                         subs_opp_client_interface_removed_id = 0;
3542                 }
3543                 if (subs_opp_client_property_id > 0) {
3544                         g_dbus_connection_signal_unsubscribe(conn,
3545                                         subs_opp_client_property_id);
3546                         subs_opp_client_property_id = 0;
3547                 }
3548         }
3549         return 0;
3550 }
3551
3552 int _bt_register_map_client_subscribe_signal(GDBusConnection *conn,
3553                 int subscribe)
3554 {
3555         if (conn == NULL)
3556                 return -1;
3557
3558         static guint subs_map_client_interface_added_id;
3559         static guint subs_map_client_interface_removed_id;
3560         static guint subs_map_client_property_id;
3561
3562
3563         if (subscribe) {
3564                 if (subs_map_client_interface_added_id == 0) {
3565                         subs_map_client_interface_added_id = g_dbus_connection_signal_subscribe(conn,
3566                                 NULL, BT_MANAGER_INTERFACE,
3567                                 BT_INTERFACES_ADDED, NULL, NULL, 0,
3568                                 __bt_map_event_filter,
3569                                 NULL, NULL);
3570                 }
3571                 if (subs_map_client_interface_removed_id == 0) {
3572                         subs_map_client_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
3573                                 NULL, BT_MANAGER_INTERFACE,
3574                                 BT_INTERFACES_REMOVED, NULL, NULL, 0,
3575                                 __bt_map_event_filter,
3576                                 NULL, NULL);
3577                 }
3578                 if (subs_map_client_property_id == 0) {
3579                         subs_map_client_property_id = g_dbus_connection_signal_subscribe(conn,
3580                                 NULL, BT_PROPERTIES_INTERFACE,
3581                                 BT_PROPERTIES_CHANGED, NULL, NULL, 0,
3582                                 __bt_map_event_filter,
3583                                 NULL, NULL);
3584                 }
3585         } else {
3586                 if (subs_map_client_interface_added_id > 0) {
3587                         g_dbus_connection_signal_unsubscribe(conn,
3588                                         subs_map_client_interface_added_id);
3589                         subs_map_client_interface_added_id = 0;
3590                 }
3591                 if (subs_map_client_interface_removed_id > 0) {
3592                         g_dbus_connection_signal_unsubscribe(conn,
3593                                         subs_map_client_interface_removed_id);
3594                         subs_map_client_interface_removed_id = 0;
3595                 }
3596                 if (subs_map_client_property_id > 0) {
3597                         g_dbus_connection_signal_unsubscribe(conn,
3598                                         subs_map_client_property_id);
3599                         subs_map_client_property_id = 0;
3600                 }
3601         }
3602         return 0;
3603 }
3604
3605 int _bt_register_a2dp_subscribe_signal(GDBusConnection *conn,
3606                 int subscribe)
3607 {
3608         if (conn == NULL)
3609                 return -1;
3610
3611         static guint subs_a2dp_source_id;
3612         static guint subs_a2dp_sink_id;
3613
3614         if (subscribe) {
3615                 if (subs_a2dp_source_id == 0) {
3616                         subs_a2dp_source_id = g_dbus_connection_signal_subscribe(conn,
3617                                 NULL, BT_A2DP_SOURCE_INTERFACE,
3618                                 NULL, NULL, NULL, 0,
3619                                 __bt_opc_event_filter,
3620                                 NULL, NULL);
3621                 }
3622                 if (subs_a2dp_sink_id == 0) {
3623                         subs_a2dp_sink_id = g_dbus_connection_signal_subscribe(conn,
3624                                 NULL, BT_SINK_INTERFACE,
3625                                 NULL, NULL, NULL, 0,
3626                                 __bt_opc_event_filter,
3627                                 NULL, NULL);
3628                 }
3629         } else {
3630                 if (subs_a2dp_source_id > 0) {
3631                         g_dbus_connection_signal_unsubscribe(conn,
3632                                         subs_a2dp_source_id);
3633                         subs_a2dp_source_id = 0;
3634                 }
3635                 if (subs_a2dp_sink_id > 0) {
3636                         g_dbus_connection_signal_unsubscribe(conn,
3637                                         subs_a2dp_sink_id);
3638                         subs_a2dp_sink_id = 0;
3639                 }
3640         }
3641         return 0;
3642 }
3643
3644 int _bt_register_tds_provider_subscribe_signal(GDBusConnection *conn, int subscribe)
3645 {
3646         if (conn == NULL)
3647                 return -1;
3648
3649         static guint subs_custom_id;
3650
3651         if (subscribe) {
3652                 if (subs_custom_id == 0) {
3653                         subs_custom_id = g_dbus_connection_signal_subscribe(conn,
3654                                 NULL, BT_TDS_PROVIDER_INTERFACE,
3655                                 NULL, NULL, NULL, 0,
3656                                 __bt_manager_event_filter,
3657                                 NULL, NULL);
3658                 }
3659         } else {
3660                 if (subs_custom_id > 0) {
3661                         g_dbus_connection_signal_unsubscribe(conn,
3662                                         subs_custom_id);
3663                         subs_custom_id = 0;
3664                 }
3665         }
3666
3667         return 0;
3668 }
3669
3670 static void __bt_dump_event_filter(GDBusConnection *connection,
3671                                         const gchar *sender_name,
3672                                         const gchar *object_path,
3673                                         const gchar *interface_name,
3674                                         const gchar *signal_name,
3675                                         GVariant *parameters,
3676                                         gpointer user_data)
3677 {
3678         return;
3679 }
3680
3681 int __bt_register_dump_subscribe_signal(GDBusConnection *conn,
3682                 gboolean subscribe)
3683 {
3684         if (conn == NULL)
3685                 return -1;
3686
3687         static guint subs_source_id;
3688
3689         if (subscribe) {
3690                 if (subs_source_id == 0) {
3691                         subs_source_id = g_dbus_connection_signal_subscribe(conn,
3692                                 NULL, BT_DUMP_SERVICE_INTERFACE,
3693                                 BT_DUMP_SERVICE_SIGNAL, BT_DUMP_SERVICE_PATH, NULL, 0,
3694                                 __bt_dump_event_filter,
3695                                 NULL, NULL);
3696                 }
3697         } else {
3698                 if (subs_source_id > 0) {
3699                         g_dbus_connection_signal_unsubscribe(conn,
3700                                         subs_source_id);
3701                         subs_source_id = 0;
3702                 }
3703         }
3704         return 0;
3705 }
3706
3707 int _bt_register_service_event(GDBusConnection *g_conn, int event_type)
3708 {
3709         BT_DBG("+");
3710
3711         retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
3712
3713         switch (event_type) {
3714         case BT_MANAGER_EVENT:
3715                 _bt_register_manager_subscribe_signal(g_conn, TRUE);
3716                 break;
3717         case BT_DEVICE_EVENT:
3718                 _bt_register_device_subscribe_signal(g_conn, TRUE);
3719                 break;
3720         case BT_HID_EVENT:
3721                 _bt_register_input_subscribe_signal(g_conn, TRUE);
3722                 break;
3723         case BT_NETWORK_EVENT:
3724                 _bt_register_network_subscribe_signal(g_conn, TRUE);
3725                 break;
3726         case BT_HEADSET_EVENT:
3727                 _bt_register_audio_subscribe_signal(g_conn, TRUE);
3728                 break;
3729         case BT_OPP_SERVER_EVENT:
3730                 BT_ERR("BT_OPP_SERVER_EVENT: register service event");
3731                 _bt_register_opp_server_subscribe_signal(g_conn, TRUE);
3732                 break;
3733
3734         case BT_OPP_CLIENT_EVENT:
3735                 BT_ERR("BT_OPP_CLIENT_EVENT: register service event");
3736                 _bt_register_opp_client_subscribe_signal(g_conn, TRUE);
3737                 break;
3738         case BT_MAP_CLIENT_EVENT:
3739                 BT_ERR("BT_MAP_CLIENT_EVENT: register service event");
3740                 _bt_register_map_client_subscribe_signal(g_conn, TRUE);
3741                 break;
3742         case BT_A2DP_SOURCE_EVENT:
3743                 BT_INFO("A2dp Source event");
3744                 _bt_register_a2dp_subscribe_signal(g_conn, TRUE);
3745                 break;
3746         case BT_TDS_EVENT:
3747                 BT_INFO("TDS provider event");
3748                 _bt_register_tds_provider_subscribe_signal(g_conn, TRUE);
3749                 break;
3750         default:
3751                 BT_ERR("Unknown event");
3752                 return BLUETOOTH_ERROR_INTERNAL;
3753         }
3754
3755         return BLUETOOTH_ERROR_NONE;
3756 }
3757
3758 void _bt_unregister_service_event(GDBusConnection *g_conn, int event_type)
3759 {
3760         BT_DBG("+");
3761
3762         ret_if(g_conn == NULL);
3763
3764         switch (event_type) {
3765         case BT_MANAGER_EVENT:
3766                 _bt_register_manager_subscribe_signal(g_conn, FALSE);
3767                 _bt_register_device_subscribe_signal(g_conn, FALSE);
3768                 _bt_register_input_subscribe_signal(g_conn, FALSE);
3769                 _bt_register_network_subscribe_signal(g_conn, FALSE);
3770                 _bt_register_audio_subscribe_signal(g_conn, FALSE);
3771                 break;
3772         case BT_OPP_SERVER_EVENT:
3773                 _bt_register_opp_server_subscribe_signal(g_conn, FALSE);
3774                 break;
3775         case BT_OPP_CLIENT_EVENT:
3776                 _bt_register_opp_client_subscribe_signal(g_conn, FALSE);
3777                 break;
3778         case BT_MAP_CLIENT_EVENT:
3779                 _bt_register_map_client_subscribe_signal(g_conn, FALSE);
3780                 break;
3781         default:
3782                 BT_ERR("Unknown event");
3783                 return;
3784         }
3785
3786         BT_DBG("-");
3787 }
3788
3789 static int __bt_init_manager_receiver(void)
3790 {
3791         BT_DBG("+");
3792
3793         GError *error = NULL;
3794
3795         if (manager_conn == NULL) {
3796                 manager_conn =  g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
3797                 if (error != NULL) {
3798                         BT_ERR("ERROR: Can't get on system bus [%s]", error->message);
3799                         g_clear_error(&error);
3800                 }
3801                 retv_if(manager_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
3802         }
3803
3804         if (_bt_register_service_event(manager_conn,
3805                                 BT_MANAGER_EVENT) != BLUETOOTH_ERROR_NONE)
3806                 goto fail;
3807         if (_bt_register_service_event(manager_conn,
3808                                 BT_DEVICE_EVENT) != BLUETOOTH_ERROR_NONE)
3809                 goto fail;
3810
3811         if (_bt_register_service_event(manager_conn,
3812                                 BT_HID_EVENT) != BLUETOOTH_ERROR_NONE)
3813                 goto fail;
3814
3815         if (_bt_register_service_event(manager_conn,
3816                                 BT_HEADSET_EVENT) != BLUETOOTH_ERROR_NONE)
3817                 goto fail;
3818
3819         if (_bt_register_service_event(manager_conn,
3820                                 BT_NETWORK_EVENT) != BLUETOOTH_ERROR_NONE)
3821                 goto fail;
3822
3823         if (_bt_register_service_event(manager_conn,
3824                                 BT_TDS_EVENT) != BLUETOOTH_ERROR_NONE)
3825                 goto fail;
3826
3827         __bt_register_dump_subscribe_signal(manager_conn, TRUE);
3828         return BLUETOOTH_ERROR_NONE;
3829 fail:
3830         if (manager_conn) {
3831                 g_object_unref(manager_conn);
3832                 manager_conn = NULL;
3833         }
3834
3835         BT_DBG("-");
3836
3837         return BLUETOOTH_ERROR_INTERNAL;
3838 }
3839
3840 static int __bt_init_obexd_receiver(void)
3841 {
3842         BT_DBG("+");
3843 #ifndef TIZEN_PROFILE_TV /* TODO: obexd doesn't work in TV profile. It should be resolved later. */
3844         GError *error = NULL;
3845
3846         if (obexd_conn == NULL) {
3847                 obexd_conn = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error);
3848                 if (error != NULL) {
3849                         BT_ERR("ERROR: Can't get on session bus [%s]", error->message);
3850                         g_clear_error(&error);
3851                 }
3852                 retv_if(obexd_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
3853         }
3854
3855         if (_bt_register_service_event(obexd_conn,
3856                                 BT_OPP_SERVER_EVENT) != BLUETOOTH_ERROR_NONE) {
3857                 BT_ERR("Error while registering service event");
3858                 g_object_unref(obexd_conn);
3859                 obexd_conn = NULL;
3860                 return BLUETOOTH_ERROR_INTERNAL;
3861         }
3862 #endif
3863         BT_DBG("-");
3864
3865         return BLUETOOTH_ERROR_NONE;
3866 }
3867
3868 gboolean __bt_reinit_obexd_receiver(gpointer user_data)
3869 {
3870         static int retry_cnt = 0;
3871         int result = BLUETOOTH_ERROR_NONE;
3872
3873         BT_DBG("+");
3874
3875         result = __bt_init_obexd_receiver();
3876         if (result != BLUETOOTH_ERROR_NONE) {
3877                 /* 20 ms * 50 = 10 seconds. During 10 seconds fail to initialize,
3878                    then it is not the timing issue. Just can't use the session bus connection */
3879                 if (retry_cnt > 100) {
3880                         BT_ERR("Fail to init obexd receiver by 50 times.");
3881                         retry_cnt = 0;
3882                         session_reinit_timer = 0;
3883                         return FALSE;
3884                 }
3885                 retry_cnt++;
3886                 BT_DBG("Retry to initialize the obexd receiver");
3887                 return TRUE;
3888         }
3889
3890         retry_cnt = 0;
3891         session_reinit_timer = 0;
3892
3893         BT_DBG("-");
3894
3895         return FALSE;
3896 }
3897
3898 /* To receive the event from bluez */
3899 int _bt_init_service_event_receiver(void)
3900 {
3901         BT_DBG("+");
3902
3903         int result;
3904
3905         result = __bt_init_manager_receiver();
3906         retv_if(result != BLUETOOTH_ERROR_NONE, result);
3907
3908         result = __bt_init_obexd_receiver();
3909         if (result != BLUETOOTH_ERROR_NONE) {
3910                 BT_ERR("Fail to init obexd receiver");
3911
3912                 /* Try to re-initialize obexd receiver in the timer */
3913                 if (session_reinit_timer > 0)
3914                         g_source_remove(session_reinit_timer);
3915
3916                 session_reinit_timer = g_timeout_add(BT_SESSION_BUS_GET_TIMEOUT,
3917                                                         (GSourceFunc)__bt_reinit_obexd_receiver, NULL);
3918         }
3919
3920         BT_DBG("-");
3921
3922         return BLUETOOTH_ERROR_NONE;
3923 }
3924
3925 void _bt_deinit_service_event_receiver(void)
3926 {
3927         BT_DBG("+");
3928
3929         _bt_unregister_service_event(manager_conn, BT_MANAGER_EVENT);
3930
3931         _bt_unregister_service_event(obexd_conn, BT_OPP_SERVER_EVENT);
3932
3933         __bt_register_dump_subscribe_signal(manager_conn, FALSE);
3934
3935         if (manager_conn) {
3936                 g_object_unref(manager_conn);
3937                 manager_conn = NULL;
3938         }
3939
3940         if (obexd_conn) {
3941                 g_object_unref(obexd_conn);
3942                 obexd_conn = NULL;
3943         }
3944
3945         if (event_id > 0)
3946                 g_source_remove(event_id);
3947         event_id = 0;
3948
3949         if (le_scan_event_id > 0)
3950                 g_source_remove(le_scan_event_id);
3951         le_scan_event_id = 0;
3952
3953         BT_DBG("-");
3954 }
3955