Fix BT enable issue on XU3 TV profile
[platform/core/connectivity/bluetooth-frwk.git] / bt-api / bt-event-handler.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 <string.h>
19 #include <glib.h>
20 #include <dlog.h>
21 #include <vconf.h>
22
23 #include "bluetooth-api.h"
24 #include "bluetooth-audio-api.h"
25 #include "bluetooth-hid-api.h"
26 #include "bt-internal-types.h"
27 #include "bluetooth-media-control.h"
28
29 #ifndef GATT_DIRECT
30 #include "bluetooth-gatt-server-api.h"
31 #endif
32
33 #include "bt-common.h"
34 #include "bt-event-handler.h"
35 #include "bt-gatt-client.h"
36 #include "bt-request-sender.h"
37 #include "bt-gatt-server.h"
38
39 #define PROFILE_SUPPORTED 0x3 /* This corresponds to binary 0b11*/
40 #define BT_RELIABLE_DISABLE_TIME 300 /* 300 ms */
41
42 typedef struct {
43         int server_fd;
44 } bt_server_info_t;
45
46 typedef struct {
47         int request_id;
48 } bt_sending_info_t;
49
50 static int obex_server_id;
51 static guint disable_timer_id;
52 static gboolean is_initialized;
53 static GSList *sending_list;
54 static GSList *server_list;
55 static GSList *event_list;
56 static guint owner_sig_id;
57
58 void _bt_add_push_request_id(int request_id)
59 {
60         bt_sending_info_t *info;
61
62         info = g_new0(bt_sending_info_t, 1);
63         info->request_id = request_id;
64
65         sending_list = g_slist_append(sending_list, info);
66 }
67
68 static gboolean __bt_is_request_id_exist(int request_id)
69 {
70         GSList *l;
71         bt_sending_info_t *info;
72
73         for (l = sending_list; l != NULL; l = g_slist_next(l)) {
74                 info = l->data;
75                 if (info == NULL)
76                         continue;
77
78                 BT_DBG("compare %d  with %d", info->request_id, request_id);
79                 if (info->request_id == request_id)
80                         return TRUE;
81         }
82
83         return FALSE;
84 }
85
86 static void __bt_remove_push_request_id(int request_id)
87 {
88         GSList *l;
89         bt_sending_info_t *info;
90
91         for (l = sending_list; l != NULL; l = g_slist_next(l)) {
92                 info = l->data;
93                 if (info == NULL)
94                         continue;
95
96                 BT_DBG("info->request_id = %d\n", info->request_id);
97                 BT_DBG("request_id = %d\n", request_id);
98                 if (info->request_id == request_id) {
99                         sending_list = g_slist_remove(sending_list, (void *)info);
100                         g_free(info);
101                         break;
102                 }
103         }
104 }
105
106 static void __bt_remove_all_push_request_id(void)
107 {
108         GSList *l;
109         bt_sending_info_t *info;
110
111         for (l = sending_list; l != NULL; l = g_slist_next(l)) {
112                 info = l->data;
113                 g_free(info);
114         }
115
116         g_slist_free(sending_list);
117         sending_list = NULL;
118 }
119
120 static void __bt_remove_all_server(void)
121 {
122         GSList *l;
123         bt_server_info_t *info;
124
125         for (l = server_list; l != NULL; l = g_slist_next(l)) {
126                 info = l->data;
127                 g_free(info);
128         }
129
130         g_slist_free(server_list);
131         server_list = NULL;
132 }
133
134 static gboolean __bt_is_server_exist(int server_fd)
135 {
136         GSList *l;
137         bt_server_info_t *info;
138
139         for (l = server_list; l != NULL; l = g_slist_next(l)) {
140                 info = l->data;
141                 if (info == NULL)
142                         continue;
143
144                 retv_if(info->server_fd == server_fd, TRUE);
145         }
146
147         return FALSE;
148 }
149
150 static void __bt_get_uuid_info(bluetooth_device_info_t *dev_info,
151                                 char **uuids,
152                                 int uuid_count)
153 {
154         int i;
155         char **parts;
156
157         ret_if(dev_info == NULL);
158         ret_if(uuids == NULL);
159         ret_if(uuid_count <= 0);
160
161         dev_info->service_index = uuid_count;
162
163         for (i = 0; i < uuid_count && uuids[i] != NULL; i++) {
164                 g_strlcpy(dev_info->uuids[i], uuids[i], BLUETOOTH_UUID_STRING_MAX);
165
166                 parts = g_strsplit(uuids[i], "-", -1);
167
168                 if (parts == NULL || parts[0] == NULL) {
169                         g_strfreev(parts);
170                         continue;
171                 }
172
173                 dev_info->service_list_array[i] = g_ascii_strtoull(parts[0], NULL, 16);
174                 g_strfreev(parts);
175         }
176 }
177 static int __bt_call_list_create(bt_hf_call_list_s **list)
178 {
179         bt_hf_call_list_s *handle;
180
181         if (*list != NULL) {
182                 BT_DBG("Already Initialized");
183                 return BLUETOOTH_ERROR_NONE;
184         }
185         handle = g_malloc0(sizeof(bt_hf_call_list_s));
186         *list = handle;
187         return BLUETOOTH_ERROR_NONE;
188 }
189
190 static int __bt_call_list_reset(bt_hf_call_list_s *list)
191 {
192         bt_hf_call_list_s *handle;
193         bt_hf_call_status_info_t *call_status;
194
195         if (list == NULL) {
196                 BT_ERR("invalid parameter");
197                 return BLUETOOTH_ERROR_INVALID_PARAM;
198         }
199         handle = (bt_hf_call_list_s *)list;
200         do  {
201                 call_status = (bt_hf_call_status_info_t *)g_list_nth_data(handle->list, 0);
202                 if (call_status == NULL)
203                         break;
204                 handle->list = g_list_remove(handle->list, call_status);
205                 g_free(call_status->number);
206                 g_free(call_status);
207         } while (1);
208         return BLUETOOTH_ERROR_NONE;
209 }
210
211 static int __bt_call_list_destroy(bt_hf_call_list_s *list)
212 {
213         int result;
214         bt_hf_call_list_s *handle;
215
216         if (list == NULL) {
217                 BT_ERR("invalid parameter");
218                 return BLUETOOTH_ERROR_INVALID_PARAM;
219         }
220         handle = (bt_hf_call_list_s *)list;
221         result = __bt_call_list_reset(list);
222         g_free(handle);
223         return result;
224 }
225 static int __bt_call_list_add(bt_hf_call_list_s *list, char * number,
226                                                                 int dir, int status, int mpart, int idx)
227 {
228         bt_hf_call_list_s *handle;
229         bt_hf_call_status_info_t *call_status;
230
231         if (list == NULL) {
232                 BT_ERR("invalid parameter");
233                 return BLUETOOTH_ERROR_INVALID_PARAM;
234         }
235         handle = (bt_hf_call_list_s *)list;
236         call_status = g_malloc0(sizeof(bt_hf_call_status_info_t));
237         call_status->number = g_strdup(number);
238         call_status->direction = dir;
239         call_status->status = status;
240         call_status->mpart = mpart;
241         call_status->idx = idx;
242         handle->list = g_list_append(handle->list, (gpointer)call_status);
243         return BLUETOOTH_ERROR_NONE;
244 }
245
246 static bluetooth_device_info_t *__bt_get_device_info_in_message(GVariant *parameters, int *ret)
247 {
248         bluetooth_device_info_t *dev_info;
249         const char *address = NULL;
250         const char *name = NULL;
251         gchar **uuids = NULL;
252         unsigned int dev_class = 0;
253         short rssi = 0;
254         gboolean paired = FALSE;
255         guint connected = 0;
256         gboolean trust = FALSE;
257         gsize uuid_count;
258         int result = BLUETOOTH_ERROR_NONE;
259         GVariant *string_var;
260         int i = 0, len = 0;
261         int manufacturer_data_len = 0;
262         GVariant *manufacturer_var = NULL;
263         const char *manufacturer_data = NULL;
264
265         g_variant_get(parameters, "(i&sun&sbub@asn@ay)", &result, &address,
266                         &dev_class, &rssi, &name, &paired,
267                         &connected, &trust,  &string_var, &manufacturer_data_len, &manufacturer_var);
268
269         if (string_var == NULL) {
270                 BT_ERR("invalid parameters in signal");
271                 return NULL;
272         }
273
274         uuids = (gchar **)g_variant_get_strv(string_var, &uuid_count);
275
276         len = g_variant_get_size(manufacturer_var);
277         if (len > 0)
278                 manufacturer_data = (char *)g_variant_get_data(manufacturer_var);
279
280         dev_info = g_malloc0(sizeof(bluetooth_device_info_t));
281         dev_info->rssi = rssi;
282         dev_info->paired = paired;
283         dev_info->connected = connected;
284         dev_info->trust = trust;
285
286         g_strlcpy(dev_info->device_name.name, name,
287                 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
288
289         _bt_divide_device_class(&dev_info->device_class, dev_class);
290
291         _bt_convert_addr_string_to_type(dev_info->device_address.addr,
292                                         address);
293
294         if (uuid_count > 0)
295                 __bt_get_uuid_info(dev_info, uuids, uuid_count);
296
297         if (manufacturer_data_len > BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX) {
298                 BT_ERR("manufacturer_data_len is too long(len = %d)", manufacturer_data_len);
299                 manufacturer_data_len = BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX;
300         }
301         dev_info->manufacturer_data.data_len = manufacturer_data_len;
302         if (manufacturer_data)
303                 for (i = 0; i < manufacturer_data_len; i++)
304                         dev_info->manufacturer_data.data[i] = manufacturer_data[i];
305         *ret = result;
306         g_free(uuids);
307         g_variant_unref(string_var);
308         g_variant_unref(manufacturer_var);
309         return dev_info;
310 }
311
312 static bluetooth_le_device_info_t *__bt_get_le_device_info_in_message(GVariant *parameters, int *ret)
313 {
314         bluetooth_le_device_info_t *le_dev_info;
315         const char *address = NULL;
316         int i;
317         short addr_type = 0;
318         short rssi = 0;
319         int len = 0;
320         int adv_data_len = 0;
321         GVariant *adv_var = NULL;
322         const char *adv_data = NULL;
323         int scan_data_len = 0;
324         GVariant *scan_var = NULL;
325         const char *scan_data = NULL;
326         int result = BLUETOOTH_ERROR_NONE;
327
328         g_variant_get(parameters, "(i&snnn@ayn@ay)", &result, &address,
329                         &addr_type, &rssi, &adv_data_len, &adv_var, &scan_data_len, &scan_var);
330
331         len = g_variant_get_size(adv_var);
332         if (len > 0)
333                 adv_data = (char *)g_variant_get_data(adv_var);
334
335         len = g_variant_get_size(scan_var);
336         if (len > 0)
337                 scan_data = (char *)g_variant_get_data(scan_var);
338
339         le_dev_info = g_malloc0(sizeof(bluetooth_le_device_info_t));
340         _bt_convert_addr_string_to_type(le_dev_info->device_address.addr, address);
341         le_dev_info->addr_type = addr_type;
342         le_dev_info->rssi = rssi;
343         le_dev_info->adv_ind_data.data_len = adv_data_len;
344
345         for (i = 0; i < adv_data_len; i++)
346                 if (adv_data)
347                         le_dev_info->adv_ind_data.data.data[i] = adv_data[i];
348
349         le_dev_info->scan_resp_data.data_len = scan_data_len;
350
351         for (i = 0; i < scan_data_len; i++)
352                 if (scan_data)
353                         le_dev_info->scan_resp_data.data.data[i] = scan_data[i];
354
355         *ret = result;
356         g_variant_unref(adv_var);
357         g_variant_unref(scan_var);
358         return le_dev_info;
359 }
360
361 gboolean __bt_reliable_disable_cb(gpointer user_data)
362 {
363         BT_DBG("+");
364         bt_event_info_t *event_info = user_data;
365
366         _bt_set_le_scan_status(FALSE);
367
368         _bt_set_adapter_internal_status(FALSE);
369
370         if (is_initialized != FALSE) {
371                 _bt_common_event_cb(BLUETOOTH_EVENT_DISABLED,
372                                 BLUETOOTH_ERROR_NONE, NULL,
373                                 event_info->cb, event_info->user_data);
374         }
375
376         obex_server_id = BT_NO_SERVER;
377         __bt_remove_all_server();
378         __bt_remove_all_push_request_id();
379 #ifdef TIZEN_FEATURE_BT_RFCOMM_DIRECT
380          _bt_rfcomm_server_free_all();
381 #endif
382
383         _bt_hid_free_hid_info();
384
385         BT_DBG("-");
386         return FALSE;
387 }
388
389 static void __bt_fill_garray_from_variant(GVariant *var, GArray *param)
390 {
391         char *data;
392         int size;
393
394         size = g_variant_get_size(var);
395         if (size > 0) {
396                 data = (char *)g_variant_get_data(var);
397                 if (data)
398                         param = g_array_append_vals(param, data, size);
399
400         }
401 }
402
403 void __bt_adapter_event_filter(GDBusConnection *connection,
404                                                  const gchar *sender_name,
405                                                  const gchar *object_path,
406                                                  const gchar *interface_name,
407                                                  const gchar *signal_name,
408                                                  GVariant *parameters,
409                                                  gpointer user_data)
410 {
411         bt_event_info_t *event_info;
412         int result = BLUETOOTH_ERROR_NONE;
413
414         event_info = (bt_event_info_t *)user_data;
415         ret_if(event_info == NULL);
416
417         if (strcasecmp(object_path, BT_ADAPTER_PATH) != 0)
418                 return;
419         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
420                 return;
421
422         if (strcasecmp(signal_name, BT_ENABLED) == 0) {
423                 BT_INFO("BT_ENABLED");
424                 g_variant_get(parameters, "(i)", &result);
425
426                 _bt_common_event_cb(BLUETOOTH_EVENT_ENABLED,
427                                 result, NULL,
428                                 event_info->cb, event_info->user_data);
429         } else if (strcasecmp(signal_name, BT_DISABLED) == 0) {
430                 BT_INFO("BT_DISABLED");
431
432                 /* Wait for the termining time of bt-service  */
433                 if (disable_timer_id > 0)
434                         g_source_remove(disable_timer_id);
435
436                 disable_timer_id = g_timeout_add(BT_RELIABLE_DISABLE_TIME,
437                                 (GSourceFunc)__bt_reliable_disable_cb,
438                                 event_info);
439         } else if (strcasecmp(signal_name, BT_DISABLED_BATTERY_DATA) == 0) {
440                 BT_INFO("BT_DISABLED_BATTERY_DATA");
441
442                 int result;
443                 GVariant *param = NULL;
444                 GArray *dbus_data = NULL;
445                 bt_battery_dbus_data_t *info = NULL;
446                 bt_battery_data *data = NULL;
447
448                 g_variant_get(parameters, "(iv)", &result, &param);
449
450                 if (!param) {
451                         result = BLUETOOTH_ERROR_INTERNAL;
452                         BT_ERR("No data reveived");
453                         _bt_common_event_cb(BLUETOOTH_EVENT_DISABLED_BATTERY_DATA,
454                                 result, data,
455                                 event_info->cb, event_info->user_data);
456                         return;
457                 }
458
459                 dbus_data = g_array_new(TRUE, TRUE, sizeof(gchar));
460
461                 if (dbus_data == NULL) {
462                         BT_ERR("g_array_new failed");
463                         g_variant_unref(param);
464                         return;
465                 }
466                 __bt_fill_garray_from_variant(param, dbus_data);
467                 g_variant_unref(param);
468
469                 info = &g_array_index(dbus_data, bt_battery_dbus_data_t, 0);
470
471                 data = g_new0(bt_battery_data, 1);
472
473                 data->session_start_time = info->session_start_time;
474                 data->session_end_time = info->session_end_time;
475                 data->session_scan_time = info->session_scan_time;
476                 data->session_connected_time = info->session_connected_time;
477                 data->atm_list = NULL;
478
479                 BT_INFO("Received battery data in bt-api: %ld %ld %d %d.",
480                 data->session_start_time, data->session_end_time,
481                         data->session_scan_time, data->session_connected_time);
482
483                 /*Copying app wise details*/
484                 int n = NUM_APP_MAX < info->num_app ? NUM_APP_MAX : info->num_app; //Maximum NUM_APP_MAX details will be fetched
485
486                 for (int i = 0; i < n; i++) {
487                         bt_battery_app_data *app_data = NULL;
488                         app_data = g_malloc0(sizeof(bt_battery_app_data));
489                         memcpy(app_data, &(info->app_data[i]), sizeof(bt_battery_app_data));
490                         data->atm_list = g_slist_append(data->atm_list, app_data);
491                 }
492
493                 if (data->atm_list == NULL) {
494                         BT_INFO("No app data transaction in this session");
495                 }
496                 else {
497                         BT_INFO("App-wise data transaction details:");
498                         for (GSList *l = data->atm_list; l != NULL; l = g_slist_next(l)) {
499                                 bt_battery_app_data *t = (bt_battery_app_data *)(l->data);
500                                 BT_DBG("%ld %ld %d %d %u", (long int)(t->uid), (long int)(t->pid), t->rx_bytes, t->tx_bytes, t->time);
501                         }
502                 }
503
504                 _bt_common_event_cb(BLUETOOTH_EVENT_DISABLED_BATTERY_DATA,
505                                 result, data,
506                                 event_info->cb, event_info->user_data);
507                 g_slist_free(data->atm_list);
508                 g_free(data);
509                 g_array_free(dbus_data, TRUE);
510         } else if (strcasecmp(signal_name, BT_DISCOVERABLE_MODE_CHANGED) == 0) {
511                 int mode = 0;
512
513                 g_variant_get(parameters, "(in)", &result, &mode);
514                 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
515                                 result, &mode,
516                                 event_info->cb, event_info->user_data);
517         } else if (strcasecmp(signal_name, BT_DISCOVERABLE_TIMEOUT_CHANGED) == 0) {
518                 int timeout = 0;
519
520                 g_variant_get(parameters, "(in)", &result, &timeout);
521                 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED,
522                                 result, &timeout,
523                                 event_info->cb, event_info->user_data);
524         } else if (strcasecmp(signal_name, BT_CONNECTABLE_CHANGED) == 0) {
525                 gboolean connectable = FALSE;
526
527                 g_variant_get(parameters, "(b)", &connectable);
528                 BT_DBG("Connectable is changed : %d", connectable);
529
530                 _bt_common_event_cb(BLUETOOTH_EVENT_CONNECTABLE_CHANGED,
531                                 result, &connectable,
532                                 event_info->cb, event_info->user_data);
533         } else if (strcasecmp(signal_name, BT_ADAPTER_NAME_CHANGED) == 0) {
534                 char *adapter_name = NULL;
535
536                 g_variant_get(parameters, "(i&s)", &result, &adapter_name);
537                 _bt_common_event_cb(BLUETOOTH_EVENT_LOCAL_NAME_CHANGED,
538                                 result, adapter_name,
539                                 event_info->cb, event_info->user_data);
540         } else if (strcasecmp(signal_name, BT_DISCOVERY_STARTED) == 0) {
541                 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERY_STARTED,
542                                 BLUETOOTH_ERROR_NONE, NULL,
543                                 event_info->cb, event_info->user_data);
544         } else if (strcasecmp(signal_name, BT_DISCOVERY_FINISHED) == 0) {
545                 g_variant_get(parameters, "(i)", &result);
546                 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERY_FINISHED,
547                                 result, NULL,
548                                 event_info->cb, event_info->user_data);
549         } else if (strcasecmp(signal_name, BT_ADVERTISING_STARTED) == 0) {
550                 int adv_handle;
551
552                 g_variant_get(parameters, "(ii)", &result, &adv_handle);
553                 _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_STARTED,
554                                 result, &adv_handle,
555                                 event_info->cb, event_info->user_data);
556         } else if (strcasecmp(signal_name, BT_ADVERTISING_STOPPED) == 0) {
557                 int adv_handle;
558
559                 g_variant_get(parameters, "(ii)", &result, &adv_handle);
560                 _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_STOPPED,
561                                 result, &adv_handle,
562                                 event_info->cb, event_info->user_data);
563         } else if (strcasecmp(signal_name, BT_ADVERTISING_MANUFACTURER_DATA_CHANGED) == 0) {
564                 GVariant *var = NULL;
565                 char *data;
566                 int len;
567
568                 g_variant_get(parameters, "(@ay)", &var);
569                 len = g_variant_get_size(var);
570                 data = (char *)g_variant_get_data(var);
571
572                 _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_MANUFACTURER_DATA_CHANGED,
573                                 len, data,
574                                 event_info->cb, event_info->user_data);
575
576                 g_variant_unref(var);
577         }  else if (strcasecmp(signal_name, BT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED) == 0) {
578                 GVariant *var = NULL;
579                 char *data;
580                 int len;
581
582                 g_variant_get(parameters, "(@ay)", &var);
583                 len = g_variant_get_size(var);
584                 data = (char *)g_variant_get_data(var);
585
586                 _bt_common_event_cb(BLUETOOTH_EVENT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED,
587                                 len, data,
588                                 event_info->cb, event_info->user_data);
589
590                 g_variant_unref(var);
591         } else if (strcasecmp(signal_name, BT_MANUFACTURER_DATA_CHANGED) == 0) {
592                 GVariant *var = NULL;
593                 char *data;
594                 int len;
595
596                 g_variant_get(parameters, "(@ay)", &var);
597                 len = g_variant_get_size(var);
598                 data = (char *)g_variant_get_data(var);
599
600                 _bt_common_event_cb(BLUETOOTH_EVENT_MANUFACTURER_DATA_CHANGED,
601                                 len, data,
602                                 event_info->cb, event_info->user_data);
603
604                 g_variant_unref(var);
605         } else if (strcasecmp(signal_name, BT_PASSKEY_NOTIFICATION) == 0) {
606                 const char *address = NULL;
607                 const char *passkey = NULL;
608                 const char *passkey_info[2];
609
610                 g_variant_get(parameters, "(&s&s)", &address, &passkey);
611                 passkey_info[0] = address;
612                 passkey_info[1] = passkey;
613
614                 _bt_common_event_cb(BLUETOOTH_EVENT_PASSKEY_NOTIFICATION,
615                                 BLUETOOTH_ERROR_NONE, (void*)passkey_info,
616                                 event_info->cb, event_info->user_data);
617         } else if (strcasecmp(signal_name, BT_DEVICE_FOUND) == 0) {
618                 int event;
619                 bluetooth_device_info_t *device_info;
620
621                 device_info = __bt_get_device_info_in_message(parameters,
622                                                                 &result);
623                 ret_if(device_info == NULL);
624
625                 if (strlen(device_info->device_name.name) > 0)
626                         event = BLUETOOTH_EVENT_REMOTE_DEVICE_NAME_UPDATED;
627                 else
628                         event = BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND;
629
630                 _bt_common_event_cb(event,
631                                 result, device_info,
632                                 event_info->cb, event_info->user_data);
633
634                 g_free(device_info);
635         } else if (strcasecmp(signal_name, BT_BOND_CREATED) == 0) {
636                 bluetooth_device_info_t *device_info;
637
638                 device_info = __bt_get_device_info_in_message(parameters,
639                                                                 &result);
640                 ret_if(device_info == NULL);
641
642                 _bt_common_event_cb(BLUETOOTH_EVENT_BONDING_FINISHED,
643                                 result, device_info,
644                                 event_info->cb, event_info->user_data);
645
646                 g_free(device_info);
647         } else if (strcasecmp(signal_name, BT_BOND_DESTROYED) == 0) {
648                 const char *address = NULL;
649                 bluetooth_device_address_t dev_address = { {0} };
650
651                 g_variant_get(parameters, "(i&s)", &result, &address);
652
653                 _bt_convert_addr_string_to_type(dev_address.addr,
654                                                 address);
655
656                 _bt_common_event_cb(BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED,
657                                 result, &dev_address,
658                                 event_info->cb, event_info->user_data);
659         } else if (strcasecmp(signal_name, BT_SERVICE_SEARCHED) == 0) {
660                 bluetooth_device_info_t *device_info;
661                 bt_sdp_info_t sdp_info;
662
663                 device_info = __bt_get_device_info_in_message(parameters,
664                                                                 &result);
665                 ret_if(device_info == NULL);
666
667                 memset(&sdp_info, 0x00, sizeof(bt_sdp_info_t));
668
669                 sdp_info.service_index = device_info->service_index;
670
671                 memcpy(&sdp_info.device_addr,
672                         &device_info->device_address,
673                         BLUETOOTH_ADDRESS_LENGTH);
674
675                 memcpy(sdp_info.service_list_array,
676                         device_info->service_list_array,
677                         BLUETOOTH_MAX_SERVICES_FOR_DEVICE);
678
679                 memcpy(sdp_info.uuids,
680                         device_info->uuids,
681                         BLUETOOTH_MAX_SERVICES_FOR_DEVICE * BLUETOOTH_UUID_STRING_MAX);
682
683                 _bt_common_event_cb(BLUETOOTH_EVENT_SERVICE_SEARCHED,
684                                 result, &sdp_info,
685                                 event_info->cb, event_info->user_data);
686
687                 g_free(device_info);
688         } else if (strcasecmp(signal_name, BT_IPSP_INITIALIZED) == 0) {
689                 gboolean ipsp_intialized = FALSE;
690                 g_variant_get(parameters, "(b)", &ipsp_intialized);
691
692                 BT_DBG("IPSP init state changed to : %d", ipsp_intialized);
693
694                 _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_INIT_STATE_CHANGED,
695                                 BLUETOOTH_ERROR_NONE, &ipsp_intialized,
696                                 event_info->cb, event_info->user_data);
697         } else if (strcasecmp(signal_name, BT_KBD_PASSKEY_DISPLAY_REQ_RECEIVED) == 0) {
698                 const char *address =  NULL;
699                 const char *name =  NULL;
700                 const char *str_passkey = NULL;
701                 bool incoming = false;
702
703                 bluetooth_authentication_request_info_t auth_info;
704                 memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
705
706                 g_variant_get(parameters, "(b&s&s&s)", &incoming, &address, &name, &str_passkey);
707
708                 g_strlcpy(auth_info.device_name.name, name,
709                         BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
710                 _bt_convert_addr_string_to_type(auth_info.device_address.addr,
711                         address);
712                 g_strlcpy(auth_info.str_passkey, str_passkey, strlen(str_passkey)+1);
713                 auth_info.incoming = incoming;
714
715                 BT_INFO("BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY");
716                 _bt_common_event_cb(BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY,
717                         result, &auth_info,
718                         event_info->cb, event_info->user_data);
719         } else if (strcasecmp(signal_name, BT_PIN_REQ_RECEIVED) == 0) {
720                 const char *address =  NULL;
721                 const char *name =  NULL;
722                 bool incoming = false;
723
724                 bluetooth_authentication_request_info_t auth_info;
725                 memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
726
727                 g_variant_get(parameters, "(b&s&s)", &incoming, &address, &name);
728
729                 g_strlcpy(auth_info.device_name.name, name,
730                         BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
731                 _bt_convert_addr_string_to_type(auth_info.device_address.addr,
732                         address);
733                 auth_info.incoming = incoming;
734
735                 BT_INFO("BLUETOOTH_EVENT_PIN_REQUEST");
736
737                 _bt_common_event_cb(BLUETOOTH_EVENT_PIN_REQUEST,
738                         result, &auth_info,
739                         event_info->cb, event_info->user_data);
740         } else if (strcasecmp(signal_name, BT_PASSKEY_REQ_RECEIVED) == 0) {
741                 const char *address = NULL;
742                 const char *name =  NULL;
743                 bool incoming = false;
744
745                 bluetooth_authentication_request_info_t auth_info;
746                 memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
747
748                 g_variant_get(parameters, "(b&s&s)", &incoming, &address, &name);
749
750                 g_strlcpy(auth_info.device_name.name, name,
751                         BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
752                 _bt_convert_addr_string_to_type(auth_info.device_address.addr,
753                         address);
754                 auth_info.incoming = incoming;
755
756                 BT_INFO("BLUETOOTH_EVENT_PASSKEY_REQUEST");
757
758                 _bt_common_event_cb(BLUETOOTH_EVENT_PASSKEY_REQUEST,
759                         result, &auth_info,
760                         event_info->cb, event_info->user_data);
761         } else if (strcasecmp(signal_name, BT_PASSKEY_CFM_REQ_RECEIVED) == 0) {
762                 const char *address =  NULL;
763                 const char *name =  NULL;
764                 const char *str_passkey = NULL;
765                 bool incoming = false;
766
767                 bluetooth_authentication_request_info_t auth_info;
768                 memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
769
770                 g_variant_get(parameters, "(b&s&s&s)", &incoming, &address, &name, &str_passkey);
771
772                 g_strlcpy(auth_info.device_name.name, name,
773                         BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
774                 _bt_convert_addr_string_to_type(auth_info.device_address.addr,
775                         address);
776                 g_strlcpy(auth_info.str_passkey, str_passkey, strlen(str_passkey)+1);
777                 auth_info.incoming = incoming;
778
779                 BT_INFO("BLUETOOTH_EVENT_PASSKEY_CONFIRM_REQUEST");
780
781                 _bt_common_event_cb(BLUETOOTH_EVENT_PASSKEY_CONFIRM_REQUEST,
782                         result, &auth_info,
783                         event_info->cb, event_info->user_data);
784         }
785 }
786
787 void __bt_adapter_le_event_filter(GDBusConnection *connection,
788                                                  const gchar *sender_name,
789                                                  const gchar *object_path,
790                                                  const gchar *interface_name,
791                                                  const gchar *signal_name,
792                                                  GVariant *parameters,
793                                                  gpointer user_data)
794 {
795         bt_event_info_t *event_info;
796         int result = BLUETOOTH_ERROR_NONE;
797
798         event_info = (bt_event_info_t *)user_data;
799         ret_if(event_info == NULL);
800
801         if (strcasecmp(object_path, BT_LE_ADAPTER_PATH) != 0)
802                 return;
803         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
804                 return;
805
806         if (strcasecmp(signal_name, BT_LE_ENABLED) == 0) {
807                 BT_INFO("BT_LE_ENABLED");
808                 g_variant_get(parameters, "(i)", &result);
809                 _bt_common_event_cb(BLUETOOTH_EVENT_LE_ENABLED,
810                                 result, NULL,
811                                 event_info->cb, event_info->user_data);
812         } else if (strcasecmp(signal_name, BT_LE_DISABLED) == 0) {
813                 BT_INFO("BT_LE_DISABLED");
814                 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISABLED,
815                                 result, NULL,
816                                 event_info->cb, event_info->user_data);
817         } else if (strcasecmp(signal_name, BT_LE_DISCOVERY_STARTED) == 0) {
818                 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISCOVERY_STARTED,
819                                 BLUETOOTH_ERROR_NONE, NULL,
820                                 event_info->cb, event_info->user_data);
821         } else if (strcasecmp(signal_name, BT_LE_DISCOVERY_FINISHED) == 0) {
822                 _bt_set_le_scan_status(FALSE);
823                 g_variant_get(parameters, "(i)", &result);
824                 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISCOVERY_FINISHED,
825                                 result, NULL,
826                                 event_info->cb, event_info->user_data);
827         } else if (strcasecmp(signal_name, BT_LE_DEVICE_FOUND) == 0) {
828                 bluetooth_le_device_info_t *le_device_info;
829
830                 le_device_info = __bt_get_le_device_info_in_message(parameters,
831                                                                 &result);
832                 ret_if(le_device_info == NULL);
833
834                 if (bluetooth_is_le_scanning() == TRUE) {
835                         _bt_common_event_cb(BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND,
836                                 result, le_device_info,
837                                 event_info->cb, event_info->user_data);
838                 }
839
840                 g_free(le_device_info);
841         }
842 }
843
844 void __bt_device_event_filter(GDBusConnection *connection,
845                                                  const gchar *sender_name,
846                                                  const gchar *object_path,
847                                                  const gchar *interface_name,
848                                                  const gchar *signal_name,
849                                                  GVariant *parameters,
850                                                  gpointer user_data)
851 {
852         bt_event_info_t *event_info;
853         int result = BLUETOOTH_ERROR_NONE;
854
855         event_info = (bt_event_info_t *)user_data;
856         ret_if(event_info == NULL);
857
858 #ifdef GATT_NO_RELAY
859         gboolean gatt_interface = FALSE;
860
861         if (strcasecmp(interface_name, BT_GATT_CHARACTERISTIC_INTERFACE) == 0)
862                 gatt_interface = TRUE;
863
864         if (strcasecmp(object_path, BT_DEVICE_PATH) != 0 &&
865                  gatt_interface == FALSE)
866                 return;
867         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0 &&
868                  gatt_interface == FALSE)
869                 return;
870 #else
871         if (strcasecmp(object_path, BT_DEVICE_PATH) != 0)
872                 return;
873         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
874                 return;
875 #endif
876
877         ret_if(signal_name == NULL);
878 #ifdef TIZEN_GATT_CLIENT
879         if (strcasecmp(signal_name, BT_GATT_SERVER_CONNECTED) == 0) {
880                 const char *address = NULL;
881                 bluetooth_device_address_t dev_address = { {0} };
882                 BT_DBG("BT_GATT_SERVER_CONNECTED");
883                 g_variant_get(parameters, "(i&s)", &result, &address);
884
885                 _bt_convert_addr_string_to_type(dev_address.addr, address);
886                 BT_DBG("Sending Event to Framework");
887                 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_SERVER_CONNECTED,
888                                 result, &dev_address,
889                                 event_info->cb, event_info->user_data);
890         } else if (strcasecmp(signal_name, BT_GATT_SERVER_DISCONNECTED) == 0) {
891                 const char *address = NULL;
892                 bluetooth_device_address_t dev_address = { {0} };
893                 BT_DBG("BT_GATT_SERVER_DISCONNECTED");
894                 g_variant_get(parameters, "(i&s)", &result, &address);
895
896                 _bt_convert_addr_string_to_type(dev_address.addr, address);
897                 BT_DBG("Sending Event to Framework");
898                 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_SERVER_DISCONNECTED,
899                                 result, &dev_address,
900                                 event_info->cb, event_info->user_data);
901         } else if (strcasecmp(signal_name, BT_GATT_CLIENT_CONNECTED) == 0) {
902                 const char *address = NULL;
903                 bluetooth_device_address_t dev_address = { {0} };
904                 BT_DBG("BT_GATT_CLIENT_CONNECTED");
905                 g_variant_get(parameters, "(i&s)", &result, &address);
906
907                 _bt_convert_addr_string_to_type(dev_address.addr, address);
908                 BT_DBG("Sending Event to Framework");
909                 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_CLIENT_CONNECTED,
910                                 result, &dev_address,
911                                 event_info->cb, event_info->user_data);
912         } else if (strcasecmp(signal_name, BT_GATT_CLIENT_DISCONNECTED) == 0) {
913                 const char *address = NULL;
914                 bluetooth_device_address_t dev_address = { {0} };
915                 BT_DBG("BT_GATT_CLIENT_DISCONNECTED");
916                 g_variant_get(parameters, "(i&s)", &result, &address);
917
918                 _bt_convert_addr_string_to_type(dev_address.addr, address);
919                 BT_DBG("Sending Event to Framework");
920                 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_CLIENT_DISCONNECTED,
921                                 result, &dev_address,
922                                 event_info->cb, event_info->user_data);
923 #else
924         if (strcasecmp(signal_name, BT_GATT_CONNECTED) == 0) {
925                 const char *address = NULL;
926                 bluetooth_device_address_t dev_address = { {0} };
927                 BT_DBG("BT_GATT_CONNECTED");
928                 g_variant_get(parameters, "(i&s)", &result, &address);
929
930                 _bt_convert_addr_string_to_type(dev_address.addr, address);
931                 BT_DBG("Sending Event to Framework");
932                 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_CONNECTED,
933                                 result, &dev_address,
934                                 event_info->cb, event_info->user_data);
935         } else if (strcasecmp(signal_name, BT_GATT_DISCONNECTED) == 0) {
936                 const char *address = NULL;
937                 bluetooth_device_address_t dev_address = { {0} };
938                 BT_DBG("BT_GATT_DISCONNECTED");
939                 g_variant_get(parameters, "(i&s)", &result, &address);
940
941                 _bt_convert_addr_string_to_type(dev_address.addr, address);
942                 BT_DBG("Sending Event to Framework");
943                 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_DISCONNECTED,
944                                 result, &dev_address,
945                                 event_info->cb, event_info->user_data);
946 #endif
947         } else if (strcasecmp(signal_name, BT_GATT_REQ_ATT_MTU_CHANGED) == 0) {
948                 const char *address = NULL;
949                 bluetooth_device_address_t dev_address = { {0} };
950                 bluetooth_le_att_mtu_info_t att_mtu_info;
951                 guint16 mtu;
952                 guint8 status;
953                 BT_DBG("BT_GATT_REQ_ATT_MTU_CHANGED");
954                 g_variant_get(parameters, "(i&sqy)", &result, &address, &mtu, &status);
955                 BT_DBG("Result [%d] Address [%s] MTU [%d] status [%d]", result, address, mtu, status);
956
957                 _bt_convert_addr_string_to_type(dev_address.addr, address);
958
959                 memset(&att_mtu_info, 0x00, sizeof(bluetooth_le_att_mtu_info_t));
960                 memcpy(att_mtu_info.device_address.addr,
961                                         dev_address.addr,
962                                         BLUETOOTH_ADDRESS_LENGTH);
963
964                 att_mtu_info.mtu = mtu;
965                 att_mtu_info.status = status;
966
967                 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_ATT_MTU_CHANGED,
968                                 result, &att_mtu_info,
969                                 event_info->cb, event_info->user_data);
970 #ifdef GATT_NO_RELAY
971         } else if (strcasecmp(signal_name, BT_GATT_BLUEZ_CHAR_VAL_CHANGED) == 0) {
972 #else
973         } else if (strcasecmp(signal_name, BT_GATT_CHAR_VAL_CHANGED) == 0) {
974 #endif
975                 const char *char_handle = NULL;
976                 int len = 0;
977                 const char * value = NULL;
978                 GVariant *char_value_var = NULL;
979                 bt_gatt_char_value_t char_val = { 0, };
980                 BT_DBG("BT_GATT_CHAR_VAL_CHANGED");
981
982                 g_variant_get(parameters, "(i&s@ay)", &result, &char_handle, &char_value_var);
983
984                 len = g_variant_get_size(char_value_var);
985                 ret_if(char_value_var == NULL);
986
987                 if (len > 0)
988                         value = (char *)g_variant_get_data(char_value_var);
989
990                 char_val.char_handle = g_strdup(char_handle);
991                 char_val.val_len = len;
992                 /* Fix : FORWARD_NULL : g_variant_get_data can return NULL */
993                 if (char_val.val_len > 0 && value != NULL) {
994                         char_val.char_value = (unsigned char*) g_malloc0(char_val.val_len);
995                         memcpy(char_val.char_value, value, len);
996                         _bt_common_event_cb(BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED,
997                                         result, &char_val,
998                                         event_info->cb, event_info->user_data);
999                         g_free(char_val.char_value);
1000                         g_variant_unref(char_value_var);
1001                 }
1002                 g_free(char_val.char_handle);
1003         } else if (strcasecmp(signal_name, BT_DEVICE_CONNECTED) == 0) {
1004                 const char *address = NULL;
1005                 unsigned char addr_type;
1006                 bt_connection_info_t conn_info;
1007                 bluetooth_device_address_t dev_address = { {0} };
1008                 BT_DBG("BT_DEVICE_CONNECTED");
1009                 g_variant_get(parameters, "(i&sy)", &result, &address, &addr_type);
1010
1011                 _bt_convert_addr_string_to_type(dev_address.addr,
1012                                                 address);
1013
1014                 memset(&conn_info, 0x00, sizeof(bt_connection_info_t));
1015
1016                 memcpy(conn_info.device_addr.addr,
1017                                         dev_address.addr,
1018                                         BLUETOOTH_ADDRESS_LENGTH);
1019
1020                 conn_info.addr_type = addr_type;
1021                 conn_info.disc_reason = 0;
1022                 BT_DBG("Sending Event to Framework");
1023                 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_CONNECTED,
1024                                 result, &conn_info,
1025                                 event_info->cb, event_info->user_data);
1026
1027         } else if (strcasecmp(signal_name, BT_DEVICE_DISCONNECTED) == 0) {
1028                 const char *address = NULL;
1029                 unsigned char addr_type;
1030                 bt_connection_info_t conn_info;
1031                 bluetooth_device_address_t dev_address = { {0} };
1032                 int rssi;
1033                 BT_DBG("BT_DEVICE_DISCONNECTED");
1034                 g_variant_get(parameters, "(i&syi)", &result, &address, &addr_type, &rssi);
1035
1036                 _bt_convert_addr_string_to_type(dev_address.addr,
1037                                                 address);
1038
1039                 memset(&conn_info, 0x00, sizeof(bt_connection_info_t));
1040
1041                 memcpy(conn_info.device_addr.addr,
1042                                         dev_address.addr,
1043                                         BLUETOOTH_ADDRESS_LENGTH);
1044
1045                 conn_info.addr_type = addr_type;
1046                 conn_info.disc_reason = result;
1047                 conn_info.rssi = rssi;
1048                 BT_DBG("Sending Event to Framework, disconnect reason [0x%x]", result);
1049                 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_DISCONNECTED,
1050                                 result, &conn_info,
1051                                 event_info->cb, event_info->user_data);
1052
1053         } else if (strcasecmp(signal_name, BT_RSSI_MONITORING_ENABLED) == 0) {
1054                 bt_rssi_enabled_t enabled = { 0, };
1055                 char *address;
1056                 int link_type;
1057                 gboolean rssi_enabled = FALSE;
1058
1059                 g_variant_get(parameters, "(isib)", &result, &address,
1060                                         &link_type, &rssi_enabled);
1061
1062                 BT_DBG("RSSI Enabled[Address:%s LinkType:%d RSSI_dbm:%d]",
1063                                 address, link_type, rssi_enabled);
1064                 enabled.address = address;
1065                 enabled.link_type = link_type;
1066                 enabled.rssi_enabled = rssi_enabled;
1067
1068                 _bt_common_event_cb(BLUETOOTH_EVENT_RSSI_ENABLED,
1069                                 result, &enabled,
1070                                 event_info->cb, event_info->user_data);
1071         } else if (strcasecmp(signal_name, BT_RSSI_ALERT) == 0) {
1072                 int alert_type;
1073                 int rssi_dbm;
1074                 char *address;
1075                 int link_type;
1076                 bt_rssi_alert_t alert = { 0, };
1077
1078                 g_variant_get(parameters, "(isiii)", &result, &address,
1079                                         &link_type, &alert_type, &rssi_dbm);
1080
1081                 alert.alert_type = alert_type;
1082                 alert.rssi_dbm = rssi_dbm;
1083                 alert.address = address;
1084                 alert.link_type = link_type;
1085                 BT_DBG("Address [%s] LinkType[%d] AlertType[%d] RSSI dBm[%d]",
1086                                 address, link_type, alert_type, rssi_dbm);
1087                 _bt_common_event_cb(BLUETOOTH_EVENT_RSSI_ALERT,
1088                                 result, &alert,
1089                                 event_info->cb, event_info->user_data);
1090         } else if (strcasecmp(signal_name, BT_RAW_RSSI_EVENT) == 0) {
1091                 int rssi_dbm;
1092                 int link_type;
1093                 char *address;
1094                 bt_raw_rssi_t raw_rssi = { 0, };
1095
1096                 g_variant_get(parameters, "(isii)", &result,
1097                                         &address, &link_type, &rssi_dbm);
1098
1099                 BT_DBG("Address [%s] Link Type[%d] dBm[%d]",
1100                                 address, link_type, rssi_dbm);
1101
1102                 raw_rssi.rssi_dbm = rssi_dbm;
1103                 raw_rssi.address = address;
1104                 raw_rssi.link_type = link_type;
1105
1106                 _bt_common_event_cb(BLUETOOTH_EVENT_RAW_RSSI,
1107                                 result, &raw_rssi,
1108                                 event_info->cb, event_info->user_data);
1109         } else if (strcasecmp(signal_name, BT_DEVICE_AUTHORIZED) == 0) {
1110                 const char *address = NULL;
1111                 bluetooth_device_address_t dev_address = { {0} };
1112
1113                 g_variant_get(parameters, "(i&s)", &result, &address);
1114
1115                 _bt_convert_addr_string_to_type(dev_address.addr,
1116                                                 address);
1117
1118                 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_AUTHORIZED,
1119                                 result, &dev_address,
1120                                 event_info->cb, event_info->user_data);
1121         } else if (strcasecmp(signal_name, BT_DEVICE_UNAUTHORIZED) == 0) {
1122                 const char *address = NULL;
1123                 bluetooth_device_address_t dev_address = { {0} };
1124
1125                 g_variant_get(parameters, "(i&s)", &result, &address);
1126
1127                 _bt_convert_addr_string_to_type(dev_address.addr,
1128                                                 address);
1129
1130                 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_UNAUTHORIZED,
1131                                 result, &dev_address,
1132                                 event_info->cb, event_info->user_data);
1133         } else if (strcasecmp(signal_name, BT_SUPPORTED_PROFILE_TRUSTED) == 0) {
1134                 char *address;
1135                 bt_supported_profile_trusted_t profile_info = { 0, };
1136                 int trust;
1137
1138                 g_variant_get(parameters, "(i&si)", &result,
1139                                         &address, &trust);
1140
1141                 BT_DBG("Address [%s] trust[%d]", address, trust);
1142                 profile_info.address = address;
1143                 if (trust & (PROFILE_SUPPORTED << 0)) { /* Bit 0 & 1 - for PBAP Supported */
1144                         profile_info.profile = TRUSTED_PROFILE_PBAP;
1145                         profile_info.supported = TRUE;
1146                         if (trust & (1 << 1)) /* Bit 1 - for PBAP Trusted */
1147                                 profile_info.trusted = TRUE;
1148                         else
1149                                 profile_info.trusted = FALSE;
1150
1151                         _bt_common_event_cb(BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED,
1152                                         result, &profile_info,
1153                                         event_info->cb, event_info->user_data);
1154                 }
1155                 if (trust & (PROFILE_SUPPORTED << 2)) { /* Bit 2 & 3 - for MAP Supported */
1156                         profile_info.profile = TRUSTED_PROFILE_MAP;
1157                         profile_info.supported = TRUE;
1158                         if (trust & (1 << 3)) /* Bit 3 - for PBAP Trusted */
1159                                 profile_info.trusted = TRUE;
1160                         else
1161                                 profile_info.trusted = FALSE;
1162
1163                         _bt_common_event_cb(BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED,
1164                                         result, &profile_info,
1165                                         event_info->cb, event_info->user_data);
1166                 }
1167                 if (trust & (PROFILE_SUPPORTED << 4)) { /* Bit 4 & 5- for SAP Supported */
1168                         profile_info.profile = TRUSTED_PROFILE_SAP;
1169                         profile_info.supported = TRUE;
1170                         if (trust & (1 << 5)) /* Bit 5 - for SAP Trusted */
1171                                 profile_info.trusted = TRUE;
1172                         else
1173                                 profile_info.trusted = FALSE;
1174
1175                         _bt_common_event_cb(BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED,
1176                                         result, &profile_info,
1177                                         event_info->cb, event_info->user_data);
1178                 }
1179         } else if (strcasecmp(signal_name, BT_IPSP_CONNECTED) == 0) {
1180                 const char *address = NULL;
1181                 const char *if_name = NULL;
1182                 bt_ipsp_connection_info_t bt_ipsp_iface_info;
1183                 memset(&bt_ipsp_iface_info, 0, sizeof(bt_ipsp_iface_info));
1184
1185                 BT_DBG("BT_IPSP_CONNECTED");
1186                 g_variant_get(parameters, "(i&s&s)", &result, &address, &if_name);
1187
1188                 _bt_convert_addr_string_to_type(bt_ipsp_iface_info.btaddr.addr, address);
1189                 memcpy(bt_ipsp_iface_info.if_name, if_name, 16);
1190
1191                 _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_CONNECTED,
1192                                 result, &bt_ipsp_iface_info,
1193                                 event_info->cb, event_info->user_data);
1194         } else if (strcasecmp(signal_name, BT_IPSP_DISCONNECTED) == 0) {
1195                 const char *address = NULL;
1196                 const char *if_name = NULL;
1197                 bt_ipsp_connection_info_t bt_ipsp_iface_info;
1198                 memset(&bt_ipsp_iface_info, 0, sizeof(bt_ipsp_iface_info));
1199
1200                 BT_DBG("BT_IPSP_DISCONNECTED");
1201                 g_variant_get(parameters, "(i&s&s)", &result, &address, &if_name);
1202
1203                 _bt_convert_addr_string_to_type(bt_ipsp_iface_info.btaddr.addr, address);
1204                 memcpy(bt_ipsp_iface_info.if_name, if_name, 16);
1205
1206                 _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_DISCONNECTED,
1207                                 result, &bt_ipsp_iface_info,
1208                                 event_info->cb, event_info->user_data);
1209         } else if (strcasecmp(signal_name, BT_LE_DATA_LENGTH_CHANGED) == 0) {
1210                 const char *address = NULL;
1211                 bluetooth_device_address_t dev_address = { {0} };
1212                 uint tx_octets = 0;
1213                 uint tx_time = 0;
1214                 uint rx_octets = 0;
1215                 uint rx_time = 0;
1216                 bt_le_data_length_params_t params;
1217
1218                 BT_DBG("BT_LE_DATA_LENGTH_CHANGED");
1219
1220                 g_variant_get(parameters, "(i&sqqqq)", &result, &address,
1221                                 &tx_octets, &tx_time, &rx_octets, &rx_time);
1222
1223                 params.max_tx_octets = tx_octets;
1224                 params.max_tx_time = tx_time;
1225                 params.max_rx_octets = rx_octets;
1226                 params.max_rx_time = rx_time;
1227
1228                 _bt_convert_addr_string_to_type(dev_address.addr, address);
1229
1230                 memcpy(&params.device_address,
1231                         &dev_address, BLUETOOTH_ADDRESS_LENGTH);
1232
1233                 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DATA_LENGTH_CHANGED,
1234                                 result, &params, event_info->cb, event_info->user_data);
1235         } else if (strcasecmp(signal_name, BT_PXP_PROPERTY_CHANGED) == 0) {
1236                 const char *address = NULL;
1237                 bluetooth_device_address_t dev_address = { {0} };
1238                 int role, type, level;
1239                 bt_pxp_property_changed_params_t params;
1240
1241                 BT_DBG("BT_PXP_PROPERTY_CHANGED");
1242
1243                 g_variant_get(parameters, "(isiii)", &result, &address, &role, &type, &level);
1244
1245                 _bt_convert_addr_string_to_type(dev_address.addr, address);
1246                 memcpy(&params.device_address, &dev_address, BLUETOOTH_ADDRESS_LENGTH);
1247                 params.role = role;
1248                 params.service_type = type;
1249                 params.alert_lvl = level;
1250
1251                 _bt_common_event_cb(BLUETOOTH_EVENT_PXP_PROPERTY_CHANGED,
1252                                 result, &params, event_info->cb, event_info->user_data);
1253         }
1254 }
1255
1256 void __bt_hid_event_filter(GDBusConnection *connection,
1257                                                  const gchar *sender_name,
1258                                                  const gchar *object_path,
1259                                                  const gchar *interface_name,
1260                                                  const gchar *signal_name,
1261                                                  GVariant *parameters,
1262                                                  gpointer user_data)
1263 {
1264         bt_event_info_t *event_info;
1265         int result = BLUETOOTH_ERROR_NONE;
1266
1267         event_info = (bt_event_info_t *)user_data;
1268         ret_if(event_info == NULL);
1269
1270         if (strcasecmp(object_path, BT_HID_PATH) != 0)
1271                 return;
1272         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1273                 return;
1274
1275         ret_if(signal_name == NULL);
1276
1277         if (strcasecmp(signal_name, BT_INPUT_CONNECTED) == 0) {
1278                 const char *address = NULL;
1279                 bluetooth_device_address_t dev_address = { {0} };
1280
1281                 g_variant_get(parameters, "(i&s)", &result, &address);
1282
1283                 _bt_convert_addr_string_to_type(dev_address.addr,
1284                                                 address);
1285
1286                 _bt_input_event_cb(BLUETOOTH_HID_CONNECTED,
1287                                 result, &dev_address,
1288                                 event_info->cb, event_info->user_data);
1289         } else if (strcasecmp(signal_name, BT_INPUT_DISCONNECTED) == 0) {
1290                 const char *address = NULL;
1291                 bluetooth_device_address_t dev_address = { {0} };
1292
1293                 g_variant_get(parameters, "(i&s)", &result, &address);
1294
1295                 BT_DBG("address: %s", address);
1296
1297                 _bt_convert_addr_string_to_type(dev_address.addr,
1298                                                 address);
1299
1300                 _bt_input_event_cb(BLUETOOTH_HID_DISCONNECTED,
1301                                 result, &dev_address,
1302                                 event_info->cb, event_info->user_data);
1303         }
1304 }
1305
1306 void __bt_headset_event_filter(GDBusConnection *connection,
1307                                                  const gchar *sender_name,
1308                                                  const gchar *object_path,
1309                                                  const gchar *interface_name,
1310                                                  const gchar *signal_name,
1311                                                  GVariant *parameters,
1312                                                  gpointer user_data)
1313 {
1314         bt_event_info_t *event_info;
1315         int result = BLUETOOTH_ERROR_NONE;
1316         event_info = (bt_event_info_t *)user_data;
1317         ret_if(event_info == NULL);
1318
1319         if (strcasecmp(object_path, BT_HEADSET_PATH) != 0)
1320                 return;
1321         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1322                 return;
1323
1324         ret_if(signal_name == NULL);
1325
1326         if (strcasecmp(signal_name, BT_HEADSET_CONNECTED) == 0) {
1327                 char *address = NULL;
1328
1329                 g_variant_get(parameters, "(i&s)", &result, &address);
1330
1331                 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_CONNECTED,
1332                                 result, address,
1333                                 event_info->cb, event_info->user_data);
1334         } else if (strcasecmp(signal_name, BT_HEADSET_DISCONNECTED) == 0) {
1335                 char *address = NULL;
1336
1337                 g_variant_get(parameters, "(i&s)", &result, &address);
1338
1339                 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_DISCONNECTED,
1340                                 result, address,
1341                                 event_info->cb, event_info->user_data);
1342         } else if (strcasecmp(signal_name, BT_STEREO_HEADSET_CONNECTED) == 0) {
1343                 char *address = NULL;
1344
1345                 g_variant_get(parameters, "(i&s)", &result, &address);
1346
1347                 _bt_headset_event_cb(BLUETOOTH_EVENT_AV_CONNECTED,
1348                                 result, address,
1349                                 event_info->cb, event_info->user_data);
1350         } else if (strcasecmp(signal_name, BT_STEREO_HEADSET_DISCONNECTED) == 0) {
1351                 char *address = NULL;
1352
1353                 g_variant_get(parameters, "(i&s)", &result, &address);
1354
1355                 _bt_headset_event_cb(BLUETOOTH_EVENT_AV_DISCONNECTED,
1356                                 result, address,
1357                                 event_info->cb, event_info->user_data);
1358         } else if (strcasecmp(signal_name, BT_A2DP_SOURCE_CONNECTED) == 0) {
1359                 char *address = NULL;
1360
1361                 g_variant_get(parameters, "(i&s)", &result, &address);
1362                 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_CONNECTED,
1363                                                 result, address,
1364                                                 event_info->cb, event_info->user_data);
1365         } else if (strcasecmp(signal_name, BT_A2DP_SOURCE_DISCONNECTED) == 0) {
1366                 char *address = NULL;
1367
1368                 g_variant_get(parameters, "(i&s)", &result, &address);
1369
1370                 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED,
1371                                                 result, address,
1372                                                 event_info->cb, event_info->user_data);
1373         } else if (strcasecmp(signal_name, BT_SPEAKER_GAIN) == 0) {
1374                 unsigned int gain;
1375                 guint16 spkr_gain;
1376                 char *address = NULL;
1377
1378                 g_variant_get(parameters, "(i&sq)", &result, &address,
1379                                                                 &spkr_gain);
1380                 gain = (unsigned int)spkr_gain;
1381
1382                 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_SPEAKER_GAIN,
1383                                 result, &gain,
1384                                 event_info->cb, event_info->user_data);
1385         } else if (strcasecmp(signal_name, BT_MICROPHONE_GAIN) == 0) {
1386                 unsigned int gain;
1387                 guint16 mic_gain;
1388                 char *address = NULL;
1389
1390                 g_variant_get(parameters, "(i&sq)", &result,
1391                                                 &address, &mic_gain);
1392                 gain = (unsigned int)mic_gain;
1393
1394                 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_MIC_GAIN,
1395                                 result, &gain,
1396                                 event_info->cb, event_info->user_data);
1397         }
1398 }
1399
1400 void __bt_hid_device_event_filter(GDBusConnection *connection,
1401                                                  const gchar *sender_name,
1402                                                  const gchar *object_path,
1403                                                  const gchar *interface_name,
1404                                                  const gchar *signal_name,
1405                                                  GVariant *parameters,
1406                                                  gpointer user_data)
1407 {
1408         bt_event_info_t *event_info;
1409         int result = BLUETOOTH_ERROR_NONE;
1410
1411         event_info = (bt_event_info_t *)user_data;
1412         ret_if(event_info == NULL);
1413         if (strcasecmp(object_path, BT_HID_DEVICE_PATH) != 0)
1414                 return;
1415         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1416                 return;
1417
1418         ret_if(signal_name == NULL);
1419
1420         if (strcasecmp(signal_name, BT_HID_DEVICE_CONNECTED) == 0) {
1421                 const char *address = NULL;
1422                 bluetooth_device_address_t dev_address = { {0} };
1423
1424                 g_variant_get(parameters, "(i&s)", &result, &address);
1425
1426                 _bt_convert_addr_string_to_type(dev_address.addr,
1427                                                 address);
1428
1429                 _bt_input_event_cb(BLUETOOTH_HID_DEVICE_CONNECTED,
1430                                 result, &dev_address,
1431                                 event_info->cb, event_info->user_data);
1432         } else if (strcasecmp(signal_name, BT_HID_DEVICE_DISCONNECTED) == 0) {
1433                 const char *address = NULL;
1434                 bluetooth_device_address_t dev_address = { {0} };
1435
1436                 g_variant_get(parameters, "(i&s)", &result, &address);
1437
1438                 BT_DBG("address: %s", address);
1439
1440                 _bt_convert_addr_string_to_type(dev_address.addr,
1441                                                 address);
1442
1443                 _bt_input_event_cb(BLUETOOTH_HID_DEVICE_DISCONNECTED,
1444                                 result, &dev_address,
1445                                 event_info->cb, event_info->user_data);
1446         } else if (strcasecmp(signal_name, BT_INPUT_HID_DEVICE_CONNECTED) == 0) {
1447                 BT_INFO_C("Type %s", g_variant_get_type_string(parameters));
1448                 const char *address = NULL;
1449                 bluetooth_device_address_t dev_address = { {0} };
1450
1451                 g_variant_get(parameters, "(i&s)", &result, &address);
1452
1453                 BT_DBG("address: %s", address);
1454                 _bt_convert_addr_string_to_type(dev_address.addr,
1455                                                 address);
1456                 int ctrl = -1, intr = -1;
1457                 _bt_hid_device_get_fd(address, &ctrl, &intr);
1458                 if (ctrl != -1 && intr != -1)
1459                         _bt_hid_new_connection(&dev_address, ctrl, intr);
1460                 else
1461                         BT_ERR("fd is invalid.(ctrl=%d, intr=%d)", ctrl, intr);
1462         } else if (strcasecmp(signal_name, BT_INPUT_HID_DEVICE_DISCONNECTED) == 0) {
1463                 const char *address = NULL;
1464                 g_variant_get(parameters, "(i&s)", &result, &address);
1465
1466                 BT_DBG("address: %s", address);
1467         }
1468 }
1469 void __bt_a2dp_source_event_filter(GDBusConnection *connection,
1470                                                  const gchar *sender_name,
1471                                                  const gchar *object_path,
1472                                                  const gchar *interface_name,
1473                                                  const gchar *signal_name,
1474                                                  GVariant *parameters,
1475                                                  gpointer user_data)
1476 {
1477         bt_event_info_t *event_info;
1478         int result = BLUETOOTH_ERROR_NONE;
1479         event_info = (bt_event_info_t *)user_data;
1480         ret_if(event_info == NULL);
1481
1482         if (strcasecmp(object_path, BT_A2DP_SOURCE_PATH) != 0)
1483                 return;
1484         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1485                 return;
1486
1487         ret_if(signal_name == NULL);
1488
1489         if (strcasecmp(signal_name, BT_A2DP_SOURCE_CONNECTED) == 0) {
1490                 char *address = NULL;
1491
1492                 g_variant_get(parameters, "(i&s)", &result, &address);
1493                 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_CONNECTED,
1494                                                 result, address,
1495                                                 event_info->cb, event_info->user_data);
1496         } else if (strcasecmp(signal_name, BT_A2DP_SOURCE_DISCONNECTED) == 0) {
1497                 char *address = NULL;
1498
1499                 g_variant_get(parameters, "(i&s)", &result, &address);
1500
1501                 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED,
1502                                                 result, address,
1503                                                 event_info->cb, event_info->user_data);
1504         }
1505 }
1506
1507 void __bt_network_event_filter(GDBusConnection *connection,
1508                                                  const gchar *sender_name,
1509                                                  const gchar *object_path,
1510                                                  const gchar *interface_name,
1511                                                  const gchar *signal_name,
1512                                                  GVariant *parameters,
1513                                                  gpointer user_data)
1514 {
1515         bt_event_info_t *event_info;
1516         int result = BLUETOOTH_ERROR_NONE;
1517         event_info = (bt_event_info_t *)user_data;
1518         ret_if(event_info == NULL);
1519
1520         if (strcasecmp(object_path, BT_NETWORK_PATH) != 0)
1521                 return;
1522         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1523                 return;
1524
1525         ret_if(signal_name == NULL);
1526
1527         if (strcasecmp(signal_name, BT_NETWORK_CONNECTED) == 0) {
1528                 const char *address = NULL;
1529                 bluetooth_device_address_t dev_address = { {0} };
1530
1531                 g_variant_get(parameters, "(i&s)", &result, &address);
1532
1533                 _bt_convert_addr_string_to_type(dev_address.addr,
1534                                                 address);
1535
1536                 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_CONNECTED,
1537                                 result, &dev_address,
1538                                 event_info->cb, event_info->user_data);
1539         } else if (strcasecmp(signal_name, BT_NETWORK_DISCONNECTED) == 0) {
1540                 const char *address = NULL;
1541                 bluetooth_device_address_t dev_address = { {0} };
1542
1543                 g_variant_get(parameters, "(i&s)", &result, &address);
1544
1545                 _bt_convert_addr_string_to_type(dev_address.addr,
1546                                                 address);
1547
1548                 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_DISCONNECTED,
1549                                 result, &dev_address,
1550                                 event_info->cb, event_info->user_data);
1551         } else if (strcasecmp(signal_name, BT_NETWORK_SERVER_CONNECTED) == 0) {
1552                 const char *device = NULL;
1553                 const char *address = NULL;
1554                 bluetooth_network_device_info_t network_info;
1555
1556                 g_variant_get(parameters, "(i&s&s)", &result,
1557                                                         &device, &address);
1558
1559                 memset(&network_info, 0x00, sizeof(bluetooth_network_device_info_t));
1560
1561                 _bt_convert_addr_string_to_type(network_info.device_address.addr,
1562                                                 address);
1563
1564                 _bt_print_device_address_t(&network_info.device_address);
1565                 g_strlcpy(network_info.interface_name, device,
1566                                         sizeof(network_info.interface_name));
1567
1568                 DBG_SECURE("Interface: %s", network_info.interface_name);
1569
1570                 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED,
1571                                 result, &network_info,
1572                                 event_info->cb, event_info->user_data);
1573         } else if (strcasecmp(signal_name, BT_NETWORK_SERVER_DISCONNECTED) == 0) {
1574                 const char *device = NULL;
1575                 const char *address = NULL;
1576                 bluetooth_network_device_info_t network_info;
1577
1578                 g_variant_get(parameters, "(i&s&s)", &result, &device, &address);
1579
1580                 memset(&network_info, 0x00, sizeof(bluetooth_network_device_info_t));
1581
1582                 _bt_convert_addr_string_to_type(network_info.device_address.addr,
1583                                                 address);
1584
1585                 _bt_print_device_address_t(&network_info.device_address);
1586
1587                 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED,
1588                                 result, &network_info,
1589                                 event_info->cb, event_info->user_data);
1590         }
1591 }
1592
1593 void __bt_avrcp_event_filter(GDBusConnection *connection,
1594                                                  const gchar *sender_name,
1595                                                  const gchar *object_path,
1596                                                  const gchar *interface_name,
1597                                                  const gchar *signal_name,
1598                                                  GVariant *parameters,
1599                                                  gpointer user_data)
1600 {
1601         bt_event_info_t *event_info;
1602         int result = BLUETOOTH_ERROR_NONE;
1603         event_info = (bt_event_info_t *)user_data;
1604         ret_if(event_info == NULL);
1605
1606         if (strcasecmp(object_path, BT_AVRCP_PATH) != 0)
1607                 return;
1608         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1609                 return;
1610
1611         ret_if(signal_name == NULL);
1612
1613         if (strcasecmp(signal_name, BT_AVRCP_CONNECTED) == 0) {
1614                 char *address = NULL;
1615
1616                 g_variant_get(parameters, "(i&s)", &result, &address);
1617
1618                 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONNECTED,
1619                                 result, address,
1620                                 event_info->cb, event_info->user_data);
1621         } else if (strcasecmp(signal_name, BT_AVRCP_DISCONNECTED) == 0) {
1622                 char *address = NULL;
1623
1624                 g_variant_get(parameters, "(i&s)", &result, &address);
1625
1626                 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_DISCONNECTED,
1627                                 result, address,
1628                                 event_info->cb, event_info->user_data);
1629         } else if (strcasecmp(signal_name, BT_MEDIA_SHUFFLE_STATUS) == 0) {
1630                 unsigned int status;
1631
1632                 g_variant_get(parameters, "(u)", &status);
1633                 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_SHUFFLE_STATUS,
1634                                 result, &status,
1635                                 event_info->cb, event_info->user_data);
1636         } else if (strcasecmp(signal_name, BT_MEDIA_EQUALIZER_STATUS) == 0) {
1637                 unsigned int status;
1638
1639                 g_variant_get(parameters, "(u)", &status);
1640                 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_EQUALIZER_STATUS,
1641                                 result, &status,
1642                                 event_info->cb, event_info->user_data);
1643         } else if (strcasecmp(signal_name, BT_MEDIA_REPEAT_STATUS) == 0) {
1644                 unsigned int status;
1645
1646                 g_variant_get(parameters, "(u)", &status);
1647                 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_REPEAT_STATUS,
1648                                 result, &status,
1649                                 event_info->cb, event_info->user_data);
1650         }  else if (strcasecmp(signal_name, BT_MEDIA_SCAN_STATUS) == 0) {
1651                 unsigned int status;
1652
1653                 g_variant_get(parameters, "(u)", &status);
1654                 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_SCAN_STATUS,
1655                                 result, &status,
1656                                 event_info->cb, event_info->user_data);
1657         }  else if (strcasecmp(signal_name, BT_MEDIA_DELAY_CHANGE) == 0) {
1658                 unsigned int delay;
1659
1660                 g_variant_get(parameters, "(u)", &delay);
1661                 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_DELAY_CHANGED,
1662                                 result, &delay,
1663                                 event_info->cb, event_info->user_data);
1664         }
1665 }
1666
1667 void __bt_avrcp_control_event_filter(GDBusConnection *connection,
1668                                                 const gchar *sender_name,
1669                                                 const gchar *object_path,
1670                                                 const gchar *interface_name,
1671                                                 const gchar *signal_name,
1672                                                 GVariant *parameters,
1673                                                 gpointer user_data)
1674 {
1675         bt_event_info_t *event_info;
1676         int result = BLUETOOTH_ERROR_NONE;
1677         event_info = (bt_event_info_t *)user_data;
1678         ret_if(event_info == NULL);
1679
1680         if (strcasecmp(object_path, BT_AVRCP_CONTROL_PATH) != 0)
1681                 return;
1682         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1683                 return;
1684
1685         ret_if(signal_name == NULL);
1686
1687         if (strcasecmp(signal_name, BT_AVRCP_CONNECTED) == 0) {
1688                 char *address = NULL;
1689
1690                 g_variant_get(parameters, "(i&s)", &result, &address);
1691
1692                 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_CONNECTED,
1693                                 result, address,
1694                                 event_info->cb, event_info->user_data);
1695         } else if (strcasecmp(signal_name, BT_AVRCP_DISCONNECTED) == 0) {
1696                 char *address = NULL;
1697
1698                 g_variant_get(parameters, "(i&s)", &result, &address);
1699
1700                 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_DISCONNECTED,
1701                                 result, address,
1702                                 event_info->cb, event_info->user_data);
1703         } else if (strcasecmp(signal_name, BT_MEDIA_SHUFFLE_STATUS) == 0) {
1704                 unsigned int status;
1705
1706                 g_variant_get(parameters, "(u)", &status);
1707                 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_SHUFFLE_STATUS,
1708                                 result, &status,
1709                                 event_info->cb, event_info->user_data);
1710         } else if (strcasecmp(signal_name, BT_MEDIA_EQUALIZER_STATUS) == 0) {
1711                 unsigned int status;
1712
1713                 g_variant_get(parameters, "(u)", &status);
1714                 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_EQUALIZER_STATUS,
1715                                 result, &status,
1716                                 event_info->cb, event_info->user_data);
1717         } else if (strcasecmp(signal_name, BT_MEDIA_REPEAT_STATUS) == 0) {
1718                 unsigned int status;
1719
1720                 g_variant_get(parameters, "(u)", &status);
1721                 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_REPEAT_STATUS,
1722                                 result, &status,
1723                                 event_info->cb, event_info->user_data);
1724         }  else if (strcasecmp(signal_name, BT_MEDIA_SCAN_STATUS) == 0) {
1725                 unsigned int status;
1726
1727                 g_variant_get(parameters, "(u)", &status);
1728                 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_SCAN_STATUS,
1729                                 result, &status,
1730                                 event_info->cb, event_info->user_data);
1731         } else if (strcasecmp(signal_name, BT_MEDIA_PLAY_STATUS) == 0) {
1732                 unsigned int status;
1733
1734                 g_variant_get(parameters, "(u)", &status);
1735                 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_PLAY_STATUS_CHANGED,
1736                                 result, &status,
1737                                 event_info->cb, event_info->user_data);
1738         } else if (strcasecmp(signal_name, BT_MEDIA_POSITION_STATUS) == 0) {
1739                 unsigned int status;
1740
1741                 g_variant_get(parameters, "(u)", &status);
1742                 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SONG_POSITION_STATUS,
1743                                 result, &status,
1744                                 event_info->cb, event_info->user_data);
1745         } else if (strcasecmp(signal_name, BT_MEDIA_TRACK_CHANGE) == 0) {
1746                 media_metadata_attributes_t metadata;
1747                 GVariant *title = NULL;
1748                 GVariant *artist = NULL;
1749                 GVariant *album = NULL;
1750                 GVariant *genre = NULL;
1751
1752                 unsigned int total_tracks;
1753                 unsigned int number;
1754                 unsigned int duration;
1755
1756                 g_variant_get(parameters, "(@ay@ay@ay@ayuuu)",
1757                                 &title, &artist, &album, &genre,
1758                                 &total_tracks, &number, &duration);
1759
1760                 metadata.title = g_variant_get_bytestring(title);
1761                 metadata.artist = g_variant_get_bytestring(artist);
1762                 metadata.album = g_variant_get_bytestring(album);
1763                 metadata.genre = g_variant_get_bytestring(genre);
1764                 metadata.total_tracks = total_tracks;
1765                 metadata.number = number;
1766                 metadata.duration = duration;
1767
1768                 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_TRACK_CHANGED,
1769                                 result, &metadata,
1770                                 event_info->cb, event_info->user_data);
1771
1772                 g_variant_unref(title);
1773                 g_variant_unref(artist);
1774                 g_variant_unref(album);
1775                 g_variant_unref(genre);
1776         }
1777 }
1778
1779 void __bt_opp_client_event_filter(GDBusConnection *connection,
1780                                                  const gchar *sender_name,
1781                                                  const gchar *object_path,
1782                                                  const gchar *interface_name,
1783                                                  const gchar *signal_name,
1784                                                  GVariant *parameters,
1785                                                  gpointer user_data)
1786 {
1787         bt_event_info_t *event_info;
1788         int result = BLUETOOTH_ERROR_NONE;
1789         event_info = (bt_event_info_t *)user_data;
1790         ret_if(event_info == NULL);
1791
1792         if (strcasecmp(object_path, BT_OPP_CLIENT_PATH) != 0)
1793                 return;
1794         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1795                 return;
1796
1797         ret_if(signal_name == NULL);
1798
1799         if (strcasecmp(signal_name, BT_OPP_CONNECTED) == 0) {
1800                 const char *address = NULL;
1801                 int request_id = 0;
1802                 bluetooth_device_address_t dev_address = { {0} };
1803
1804                 g_variant_get(parameters, "(i&si)", &result,
1805                                                 &address, &request_id);
1806
1807                 if (__bt_is_request_id_exist(request_id) == FALSE) {
1808                         BT_ERR("Different request id!");
1809                         return;
1810                 }
1811
1812                 _bt_convert_addr_string_to_type(dev_address.addr,
1813                                                 address);
1814
1815                 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_CONNECTED,
1816                                 result, &dev_address,
1817                                 event_info->cb, event_info->user_data);
1818
1819                 if (result != BLUETOOTH_ERROR_NONE)
1820                         __bt_remove_push_request_id(request_id);
1821
1822         } else if (strcasecmp(signal_name, BT_OPP_DISCONNECTED) == 0) {
1823                 const char *address = NULL;
1824                 int request_id = 0;
1825                 bluetooth_device_address_t dev_address = { {0} };
1826
1827                 g_variant_get(parameters, "(i&si)", &result, &address,
1828                                                         &request_id);
1829
1830                 if (__bt_is_request_id_exist(request_id) == FALSE) {
1831                         BT_ERR("Different request id!");
1832                         return;
1833                 }
1834
1835                 _bt_convert_addr_string_to_type(dev_address.addr,
1836                                                 address);
1837
1838                 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_DISCONNECTED,
1839                                 result, &dev_address,
1840                                 event_info->cb, event_info->user_data);
1841
1842                 __bt_remove_push_request_id(request_id);
1843         } else if (strcasecmp(signal_name, BT_TRANSFER_STARTED) == 0) {
1844                 const char *file_name = NULL;
1845                 const char *device_addr = NULL;
1846                 int request_id = 0;
1847                 guint64 size = 0;
1848                 bt_opc_transfer_info_t transfer_info;
1849
1850                 g_variant_get(parameters, "(i&s&sti)", &result, &device_addr, &file_name,
1851                                                 &size, &request_id);
1852
1853                 if (__bt_is_request_id_exist(request_id) == FALSE) {
1854                         BT_ERR("Different request id!");
1855                         return;
1856                 }
1857
1858                 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1859
1860                 transfer_info.filename = g_strdup(file_name);
1861                 transfer_info.device_addr = g_strdup(device_addr);
1862                 transfer_info.size = size;
1863
1864                 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_STARTED,
1865                                 result, &transfer_info,
1866                                 event_info->cb, event_info->user_data);
1867
1868                 g_free(transfer_info.device_addr);
1869                 g_free(transfer_info.filename);
1870         } else if (strcasecmp(signal_name, BT_TRANSFER_PROGRESS) == 0) {
1871                 const char *file_name = NULL;
1872                 int request_id = 0;
1873                 guint64 size = 0;
1874                 int progress = 0;
1875                 bt_opc_transfer_info_t transfer_info;
1876
1877                 g_variant_get(parameters, "(i&stii)", &result,
1878                         &file_name, &size, &progress, &request_id);
1879
1880                 if (__bt_is_request_id_exist(request_id) == FALSE) {
1881                         BT_ERR("Different request id!");
1882                         return;
1883                 }
1884
1885                 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1886
1887                 transfer_info.filename = g_strdup(file_name);
1888                 transfer_info.size = size;
1889                 transfer_info.percentage = progress;
1890
1891                 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS,
1892                                 result, &transfer_info,
1893                                 event_info->cb, event_info->user_data);
1894
1895                 g_free(transfer_info.filename);
1896         } else if (strcasecmp(signal_name, BT_TRANSFER_COMPLETED) == 0) {
1897                 const char *file_name = NULL;
1898                 const char *device_addr = NULL;
1899                 int request_id = 0;
1900                 guint64 size = 0;
1901                 bt_opc_transfer_info_t transfer_info;
1902
1903                 g_variant_get(parameters, "(i&s&sti)", &result, &device_addr,
1904                                         &file_name, &size, &request_id);
1905
1906                 if (__bt_is_request_id_exist(request_id) == FALSE) {
1907                         BT_ERR("Different request id!");
1908                         return;
1909                 }
1910
1911                 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1912
1913                 transfer_info.device_addr = g_strdup(device_addr);
1914                 transfer_info.filename = g_strdup(file_name);
1915                 transfer_info.size = size;
1916
1917                 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE,
1918                                 result, &transfer_info,
1919                                 event_info->cb, event_info->user_data);
1920
1921                 g_free(transfer_info.device_addr);
1922                 g_free(transfer_info.filename);
1923         }
1924 }
1925
1926 void __bt_opp_server_event_filter(GDBusConnection *connection,
1927                                                  const gchar *sender_name,
1928                                                  const gchar *object_path,
1929                                                  const gchar *interface_name,
1930                                                  const gchar *signal_name,
1931                                                  GVariant *parameters,
1932                                                  gpointer user_data)
1933 {
1934         bt_event_info_t *event_info;
1935         int result = BLUETOOTH_ERROR_NONE;
1936         event_info = (bt_event_info_t *)user_data;
1937         ret_if(event_info == NULL);
1938
1939         if (strcasecmp(object_path, BT_OPP_SERVER_PATH) != 0)
1940                 return;
1941         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1942                 return;
1943
1944         ret_if(signal_name == NULL);
1945
1946         if (strcasecmp(signal_name, BT_TRANSFER_AUTHORIZED) == 0) {
1947                 /* Native only event */
1948                 const char *file_name = NULL;
1949                 const char *address = NULL;
1950                 const char *device_name = NULL;
1951                 guint64 size = 0;
1952                 bt_obex_server_authorize_into_t auth_info;
1953
1954                 g_variant_get(parameters, "(i&st&s&s)", &result, &file_name, &size,
1955                                 &address, &device_name);
1956
1957                 /* OSP server: Don't get this event */
1958                 ret_if(obex_server_id == BT_CUSTOM_SERVER);
1959
1960                 memset(&auth_info, 0x00, sizeof(bt_obex_server_authorize_into_t));
1961
1962                 auth_info.filename = g_strdup(file_name);
1963                 auth_info.length = size;
1964                 auth_info.address = g_strdup(address);
1965                 auth_info.name = g_strdup(device_name);
1966                 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE,
1967                                 result, &auth_info,
1968                                 event_info->cb, event_info->user_data);
1969
1970                 g_free(auth_info.filename);
1971                 g_free(auth_info.address);
1972                 g_free(auth_info.name);
1973         } else if (strcasecmp(signal_name, BT_CONNECTION_AUTHORIZED) == 0) {
1974                 /* OSP only event */
1975                 const char *address = NULL;
1976                 const char *name = NULL;
1977                 bluetooth_device_address_t dev_address = { {0} };
1978
1979                 g_variant_get(parameters, "(i&s&s)", &result, &address, &name);
1980
1981                 /* Native server: Don't get this event */
1982                 ret_if(obex_server_id == BT_NATIVE_SERVER);
1983
1984                 _bt_convert_addr_string_to_type(dev_address.addr,
1985                                                 address);
1986
1987                 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE,
1988                                 result, &dev_address,
1989                                 event_info->cb, event_info->user_data);
1990         } else if (strcasecmp(signal_name, BT_TRANSFER_CONNECTED) == 0) {
1991                 bt_obex_server_connection_info_t conn_info = {0, };
1992                 char *address = NULL;
1993                 char *name = NULL;
1994                 int transfer_id = -1;
1995                 g_variant_get(parameters, "(i&s&si)", &result,
1996                                 &address, &name, &transfer_id);
1997
1998                 conn_info.address = g_strdup(address);
1999                 conn_info.device_name = g_strdup(name);
2000                 conn_info.transfer_id = transfer_id;
2001
2002                 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_CONNECTED,
2003                                         result, &conn_info, event_info->cb,
2004                                         event_info->user_data);
2005
2006                 g_free(conn_info.address);
2007                 g_free(conn_info.device_name);
2008         } else if (strcasecmp(signal_name, BT_TRANSFER_DISCONNECTED) == 0) {
2009                 bt_obex_server_transfer_info_t transfer_info = {0, };
2010                 char *address = NULL;
2011                 int transfer_id = -1;
2012                 g_variant_get(parameters, "(i&si)", &result, &address, &transfer_id);
2013                 DBG_SECURE("address: %s, transfer_id: %d", address, transfer_id);
2014
2015                 transfer_info.address = g_strdup(address);
2016                 transfer_info.transfer_id = transfer_id;
2017
2018                 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED,
2019                                         result, &transfer_info, event_info->cb,
2020                                         event_info->user_data);
2021                 g_free(transfer_info.address);
2022         } else if (strcasecmp(signal_name, BT_TRANSFER_STARTED) == 0) {
2023                 const char *device_name = NULL;
2024                 const char *file_name = NULL;
2025                 const char *type = NULL;
2026                 const char *address = NULL;
2027                 GVariantIter *iter = NULL;
2028                 int i = 0;
2029                 guchar byte;
2030                 int transfer_id = 0;
2031                 int server_type = 0; /* bt_server_type_t */
2032                 guint64 size = 0;
2033                 bt_obex_server_transfer_info_t transfer_info;
2034
2035                 g_variant_get(parameters, "(i&s&s&s&stii(ay))", &result, &device_name,
2036                         &file_name, &type, &address, &size, &transfer_id, &server_type, &iter);
2037
2038                 /* Other server's event */
2039                 ret_if(obex_server_id != server_type &&
2040                         server_type != BT_FTP_SERVER);
2041
2042                 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
2043
2044                 transfer_info.contact_auth_info = g_malloc0(sizeof(unsigned char) * 5);
2045
2046                 for (i = 0; i < 5 && g_variant_iter_loop(iter, "y", &byte); ++i)
2047                         transfer_info.contact_auth_info[i] = byte;
2048
2049                 transfer_info.device_name = g_strdup(device_name);
2050                 transfer_info.filename = g_strdup(file_name);
2051                 transfer_info.type = g_strdup(type);
2052                 transfer_info.address = g_strdup(address);
2053                 transfer_info.file_size = size;
2054                 transfer_info.transfer_id = transfer_id;
2055                 transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
2056                                                 FTP_SERVER : OPP_SERVER;
2057
2058                 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED,
2059                                 result, &transfer_info,
2060                                 event_info->cb, event_info->user_data);
2061
2062                 g_free(transfer_info.filename);
2063                 g_free(transfer_info.type);
2064                 g_free(transfer_info.device_name);
2065                 g_free(transfer_info.address);
2066                 g_free(transfer_info.contact_auth_info);
2067                 g_variant_iter_free(iter);
2068         } else if (strcasecmp(signal_name, BT_TRANSFER_PROGRESS) == 0) {
2069                 const char *file_name = NULL;
2070                 const char *type = NULL;
2071                 const char *device_name = NULL;
2072                 const char *address = NULL;
2073                 int transfer_id = 0;
2074                 int progress = 0;
2075                 int server_type = 0; /* bt_server_type_t */
2076                 guint64 size = 0;
2077                 bt_obex_server_transfer_info_t transfer_info;
2078
2079                 g_variant_get(parameters, "(i&s&s&s&stiii)", &result, &file_name,
2080                                                 &type, &device_name, &address, &size, &transfer_id,
2081                                                 &progress, &server_type);
2082
2083                 /* Other server's event */
2084                 ret_if(obex_server_id != server_type &&
2085                         server_type != BT_FTP_SERVER);
2086
2087                 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
2088
2089                 transfer_info.filename = g_strdup(file_name);
2090                 transfer_info.type = g_strdup(type);
2091                 transfer_info.device_name = g_strdup(device_name);
2092                 transfer_info.address = g_strdup(address);
2093                 transfer_info.file_size = size;
2094                 transfer_info.transfer_id = transfer_id;
2095                 transfer_info.percentage = progress;
2096                 transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
2097                                                 FTP_SERVER : OPP_SERVER;
2098
2099                 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS,
2100                                 result, &transfer_info,
2101                                 event_info->cb, event_info->user_data);
2102
2103                 g_free(transfer_info.filename);
2104                 g_free(transfer_info.device_name);
2105                 g_free(transfer_info.address);
2106                 g_free(transfer_info.type);
2107         } else if (strcasecmp(signal_name, BT_TRANSFER_COMPLETED) == 0) {
2108                 const char *file_name = NULL;
2109                 const char *device_name = NULL;
2110                 const char *address = NULL;
2111                 const char *type = NULL;
2112                 const char *file_path;
2113                 int transfer_id = 0;
2114                 int server_type = 0; /* bt_server_type_t */
2115                 guint64 size = 0;
2116                 bt_obex_server_transfer_info_t transfer_info;
2117
2118                 g_variant_get(parameters, "(i&s&s&s&s&stii)", &result, &file_name,
2119                                         &type, &device_name, &file_path, &address, &size,
2120                                         &transfer_id, &server_type);
2121
2122                 /* Other server's event */
2123                 ret_if(obex_server_id != server_type &&
2124                         server_type != BT_FTP_SERVER);
2125
2126                 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
2127
2128                 transfer_info.filename = g_strdup(file_name);
2129                 transfer_info.type = g_strdup(type);
2130                 transfer_info.device_name = g_strdup(device_name);
2131                 transfer_info.file_path = g_strdup(file_path);
2132                 transfer_info.address = g_strdup(address);
2133                 transfer_info.file_size = size;
2134                 transfer_info.transfer_id = transfer_id;
2135                 transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
2136                                                 FTP_SERVER : OPP_SERVER;
2137
2138                 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_COMPLETED,
2139                                 result, &transfer_info,
2140                                 event_info->cb, event_info->user_data);
2141
2142                 g_free(transfer_info.filename);
2143                 g_free(transfer_info.type);
2144                 g_free(transfer_info.device_name);
2145                 g_free(transfer_info.address);
2146                 g_free(transfer_info.file_path);
2147         }
2148 }
2149
2150 void __bt_map_client_event_filter(GDBusConnection *connection,
2151                                                  const gchar *sender_name,
2152                                                  const gchar *object_path,
2153                                                  const gchar *interface_name,
2154                                                  const gchar *signal_name,
2155                                                  GVariant *parameters,
2156                                                  gpointer user_data)
2157 {
2158         BT_DBG("Entered __bt_map_client_event_filter");
2159         bt_event_info_t *event_info;
2160         int result = BLUETOOTH_ERROR_NONE;
2161         event_info = (bt_event_info_t *)user_data;
2162         ret_if(event_info == NULL);
2163
2164         if (strcasecmp(object_path, BT_MAP_CLIENT_PATH) != 0)
2165                 return;
2166         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
2167                 return;
2168
2169         ret_if(signal_name == NULL);
2170
2171         if (strcasecmp(signal_name, BT_MAP_CONNECTED) == 0) {
2172                 const char *address = NULL;
2173                 int request_id = 0;
2174                 bluetooth_device_address_t dev_address = { {0} };
2175
2176                 g_variant_get(parameters, "(i&si)", &result,
2177                                                 &address, &request_id);
2178
2179                 if (__bt_is_request_id_exist(request_id) == FALSE) {
2180                         BT_ERR("Different request id!");
2181                         return;
2182                 }
2183
2184                 _bt_convert_addr_string_to_type(dev_address.addr,
2185                                                 address);
2186
2187                 _bt_common_event_cb(BLUETOOTH_EVENT_MAP_CONNECTED,
2188                                 result, &dev_address,
2189                                 event_info->cb, event_info->user_data);
2190
2191                 if (result != BLUETOOTH_ERROR_NONE)
2192                         __bt_remove_push_request_id(request_id);
2193         } else if (strcasecmp(signal_name, BT_MAP_DISCONNECTED) == 0) {
2194                 const char *address = NULL;
2195                 int request_id = 0;
2196                 bluetooth_device_address_t dev_address = { {0} };
2197
2198                 g_variant_get(parameters, "(i&si)", &result, &address,
2199                                 &request_id);
2200
2201                 if (__bt_is_request_id_exist(request_id) == FALSE) {
2202                         BT_ERR("Different request id!");
2203                         return;
2204                 }
2205
2206                 _bt_convert_addr_string_to_type(dev_address.addr,
2207                                 address);
2208
2209                 _bt_common_event_cb(BLUETOOTH_EVENT_MAP_DISCONNECTED,
2210                                 result, &dev_address,
2211                                 event_info->cb, event_info->user_data);
2212
2213                 __bt_remove_push_request_id(request_id);
2214         } else if (strcasecmp(signal_name, BT_MAP_LIST_FOLDERS_COMPLETE) == 0) {
2215                 int request_id = 0;
2216                 GVariant* folder_list_var = NULL;
2217
2218                 g_variant_get(parameters, "(iiv)", &result, &request_id, &folder_list_var);
2219                 if (__bt_is_request_id_exist(request_id) == FALSE) {
2220                         BT_ERR("Different request id!");
2221                         return;
2222                 }
2223
2224                 GVariantIter* iter;
2225
2226                 bt_map_client_folders_s folders_struct = {0,};
2227                 g_variant_get(folder_list_var, "(aa{sv})", &iter);
2228
2229                 folders_struct.size = g_variant_iter_n_children(iter);
2230                 folders_struct.names = (char**) g_malloc0(folders_struct.size * sizeof(*(folders_struct.names)));
2231                 BT_DBG("g_variant_iter_n_children: %lli", (long long int)folders_struct.size);
2232                 GVariantIter* res = NULL;
2233                 int i = 0;
2234                 while (g_variant_iter_loop(iter, "a{sv}", &res)) {
2235                         char* key = NULL;
2236                         GVariant* value = NULL;
2237                         while (g_variant_iter_loop(res, "{sv}", &key, &value)) {
2238                                 char* string_value = NULL;
2239                                 g_variant_get(value, "s", &string_value);
2240                                 BT_DBG("got folder name: %s", string_value);
2241                                 folders_struct.names[i] = strdup(string_value);
2242                         }
2243                         ++i;
2244                 }
2245                 _bt_common_event_cb(BLUETOOTH_EVENT_MAP_LIST_FOLDERS_COMPLETE,
2246                                 result, &folders_struct,
2247                                 event_info->cb, event_info->user_data);
2248
2249                 __bt_remove_push_request_id(request_id);
2250
2251                 // freeing resources
2252                 while (--i >= 0) {
2253                         free(folders_struct.names[i]);
2254                         folders_struct.names[i] = NULL;
2255                 }
2256                 g_free(folders_struct.names);
2257
2258                 g_variant_unref(folder_list_var);
2259
2260         } else if (strcasecmp(signal_name, BT_MAP_FILTER_FIELDS_COMPLETE) == 0) {
2261                 BT_DBG("BT_MAP_LIST_FOLDERS_COMPLETE");
2262
2263                 GVariant *value;
2264                 int request_id = 0;
2265                 int i = 0;
2266                 bt_map_list_filter_fields_info_t fields_info = {0,};
2267
2268                 g_variant_get(parameters, "(ivi)", &result, &value, &request_id);
2269
2270                 if (__bt_is_request_id_exist(request_id) == FALSE) {
2271                         BT_ERR("Different request id!");
2272                         return;
2273                 }
2274
2275                 if (value) {
2276                         GVariantIter *iter = NULL;
2277                         g_variant_get(value, "(as)", &iter);
2278                         fields_info.size  = g_variant_iter_n_children(iter);
2279                         char* field = NULL;
2280
2281                         fields_info.fields = g_malloc0(fields_info.size * sizeof(char*));
2282                         while (g_variant_iter_loop(iter, "s", &field)) {
2283                                 fields_info.fields[i] = strdup(field);
2284                                 i++;
2285                         }
2286                 }
2287
2288                 _bt_common_event_cb(BLUETOOTH_EVENT_MAP_LIST_FILTER_FIELD_COMPLETE,
2289                                 request_id, &fields_info,
2290                                 event_info->cb, event_info->user_data);
2291
2292                 while (--i >= 0) {
2293                         free(fields_info.fields[i]);
2294                         fields_info.fields[i] = NULL;
2295                 }
2296                 g_free(fields_info.fields);
2297
2298                 __bt_remove_push_request_id(request_id);
2299                 g_variant_unref(value);
2300         } else if (strcasecmp(signal_name, BT_MAP_LIST_MESSAGES_COMPLETE) == 0) {
2301                 int request_id = 0;
2302                 GVariant* messages_list_var = NULL;
2303                 g_variant_get(parameters, "(iiv)", &result, &request_id, &messages_list_var);
2304                 if (__bt_is_request_id_exist(request_id) == FALSE) {
2305                         BT_ERR("Different request id!");
2306                         return;
2307                 }
2308
2309                 bt_map_client_message_items_s messages_struct = {0,};
2310
2311                 GVariantIter* iter;
2312                 g_variant_get(messages_list_var, "(a{oa{sv}})", &iter);
2313                 messages_struct.size = g_variant_iter_n_children(iter);
2314                 messages_struct.message_items = (bt_map_client_message_item_t*)
2315                         g_malloc(messages_struct.size * sizeof(*(messages_struct.message_items)));
2316                 BT_DBG("g_variant_iter_n_children: %lli", (long long int)messages_struct.size);
2317
2318                 char *object = NULL;
2319                 GVariantIter *properites = NULL;
2320                 int i = 0;
2321                 while (g_variant_iter_loop(iter, "{oa{sv}}", &object, &properites)) {
2322                         messages_struct.message_items[i].message_object = strdup(object);
2323                         BT_DBG("Message found: %s", messages_struct.message_items[i].message_object);
2324                         messages_struct.message_items[i].folder = NULL;
2325                         messages_struct.message_items[i].subject = NULL;
2326                         messages_struct.message_items[i].timestamp = NULL;
2327                         messages_struct.message_items[i].sender = NULL;
2328                         messages_struct.message_items[i].sender_address = NULL;
2329                         messages_struct.message_items[i].reply_to = NULL;
2330                         messages_struct.message_items[i].recipient = NULL;
2331                         messages_struct.message_items[i].recipient_address = NULL;
2332                         messages_struct.message_items[i].type = NULL;
2333                         messages_struct.message_items[i].size = -1;
2334                         messages_struct.message_items[i].is_text = -1;
2335                         messages_struct.message_items[i].status = NULL;
2336                         messages_struct.message_items[i].attachment_size = -1;
2337                         messages_struct.message_items[i].is_priority = -1;
2338                         messages_struct.message_items[i].is_read = -1;
2339                         messages_struct.message_items[i].is_sent = -1;
2340                         messages_struct.message_items[i].is_protected = -1;
2341                         char *key = NULL;
2342                         GVariant *value = NULL;
2343                         while (g_variant_iter_loop(properites, "{sv}", &key, &value)) {
2344                                 char *value_string = NULL;
2345                                 uint64_t value_int = -1;
2346                                 bool value_bool = false;
2347                                 if (strcmp(key, "Folder") == 0) {
2348                                         g_variant_get(value, "s", &value_string);
2349                                         messages_struct.message_items[i].folder = strdup(value_string);
2350                                         BT_DBG("  Folder: %s", value_string);
2351                                 } else if (strcmp(key, "Subject") == 0) {
2352                                         g_variant_get(value, "s", &value_string);
2353                                         messages_struct.message_items[i].subject = strdup(value_string);
2354                                         BT_DBG("  Subject: %s", value_string);
2355                                 } else if (strcmp(key, "Timestamp") == 0) {
2356                                         g_variant_get(value, "s", &value_string);
2357                                         messages_struct.message_items[i].timestamp = strdup(value_string);
2358                                         BT_DBG("  Timestamp: %s", value_string);
2359                                 } else if (strcmp(key, "Sender") == 0) {
2360                                         g_variant_get(value, "s", &value_string);
2361                                         messages_struct.message_items[i].sender = strdup(value_string);
2362                                         BT_DBG("  Sender: %s", value_string);
2363                                 } else if (strcmp(key, "SenderAddress") == 0) {
2364                                         g_variant_get(value, "s", &value_string);
2365                                         messages_struct.message_items[i].sender_address = strdup(value_string);
2366                                         BT_DBG("  SenderAddress: %s", value_string);
2367                                 } else if (strcmp(key, "ReplyTo") == 0) {
2368                                         g_variant_get(value, "s", &value_string);
2369                                         messages_struct.message_items[i].reply_to = strdup(value_string);
2370                                         BT_DBG("  ReplyTo: %s", value_string);
2371                                 } else if (strcmp(key, "Recipient") == 0) {
2372                                         g_variant_get(value, "s", &value_string);
2373                                         messages_struct.message_items[i].recipient = strdup(value_string);
2374                                         BT_DBG("  Recipient: %s", value_string);
2375                                 } else if (strcmp(key, "RecipientAddress") == 0) {
2376                                         g_variant_get(value, "s", &value_string);
2377                                         messages_struct.message_items[i].recipient_address = strdup(value_string);
2378                                         BT_DBG("  RecipientAddress: %s", value_string);
2379                                 } else if (strcmp(key, "Type") == 0) {
2380                                         g_variant_get(value, "s", &value_string);
2381                                         messages_struct.message_items[i].type = strdup(value_string);
2382                                         BT_DBG("  Type: %s", value_string);
2383                                 } else if (strcmp(key, "Size") == 0) {
2384                                         g_variant_get(value, "t", &value_int);
2385                                         messages_struct.message_items[i].size = value_int;
2386                                         BT_DBG("  Size: %llu", (unsigned long long int)value_int);
2387                                 } else if (strcmp(key, "Text") == 0) {
2388                                         g_variant_get(value, "b", &value_bool);
2389                                         messages_struct.message_items[i].is_text = value_bool ? 1 : 0;
2390                                         BT_DBG("  Text: %s", value_bool ? "true" : "false");
2391                                 } else if (strcmp(key, "Status") == 0) {
2392                                         g_variant_get(value, "s", &value_string);
2393                                         messages_struct.message_items[i].status = strdup(value_string);
2394                                         BT_DBG("  Status: %s", value_string);
2395                                 } else if (strcmp(key, "AttachmentSize") == 0) {
2396                                         g_variant_get(value, "t", &value_int);
2397                                         messages_struct.message_items[i].attachment_size = value_int;
2398                                         BT_DBG("  AttachmentSize: %llu", (unsigned long long int)value_int);
2399                                 } else if (strcmp(key, "Priority") == 0) {
2400                                         g_variant_get(value, "b", &value_bool);
2401                                         messages_struct.message_items[i].is_priority = value_bool ? 1 : 0;
2402                                         BT_DBG("  Priority: %s", value_bool ? "true" : "false");
2403                                 } else if (strcmp(key, "Read") == 0) {
2404                                         g_variant_get(value, "b", &value_bool);
2405                                         messages_struct.message_items[i].is_read = value_bool ? 1 : 0;
2406                                         BT_DBG("  Read: %s", value_bool ? "true" : "false");
2407                                 } else if (strcmp(key, "Sent") == 0) {
2408                                         g_variant_get(value, "b", &value_bool);
2409                                         messages_struct.message_items[i].is_sent = value_bool ? 1 : 0;
2410                                         BT_DBG("  Sent: %s", value_bool ? "true" : "false");
2411                                 } else if (strcmp(key, "Protected") == 0) {
2412                                         g_variant_get(value, "b", &value_bool);
2413                                         messages_struct.message_items[i].is_protected = value_bool ? 1 : 0;
2414                                         BT_DBG("  Protected: %s", value_bool ? "true" : "false");
2415                                 }
2416                         }
2417                         ++i;
2418                 }
2419
2420                 _bt_common_event_cb(BLUETOOTH_EVENT_MAP_LIST_MESSAGES_COMPLETE,
2421                                 result, &messages_struct,
2422                                 event_info->cb, event_info->user_data);
2423
2424                 __bt_remove_push_request_id(request_id);
2425
2426                 while (--i >= 0) {
2427                         free(messages_struct.message_items[i].folder);
2428                         free(messages_struct.message_items[i].subject);
2429                         free(messages_struct.message_items[i].timestamp);
2430                         free(messages_struct.message_items[i].sender);
2431                         free(messages_struct.message_items[i].sender_address);
2432                         free(messages_struct.message_items[i].reply_to);
2433                         free(messages_struct.message_items[i].recipient);
2434                         free(messages_struct.message_items[i].recipient_address);
2435                         free(messages_struct.message_items[i].type);
2436                         free(messages_struct.message_items[i].status);
2437                 }
2438                 g_free(messages_struct.message_items);
2439
2440                 g_variant_unref(messages_list_var);
2441         } else if (strcasecmp(signal_name, BT_MAP_GET_MESSAGE_COMPLETE) == 0) {
2442                 BT_DBG("BT_MAP_GET_MESSAGE_COMPLETE");
2443                 int request_id = 0;
2444
2445                 g_variant_get(parameters, "(ii)", &result, &request_id);
2446                 if (__bt_is_request_id_exist(request_id) == FALSE) {
2447                         BT_ERR("Different request id!");
2448                         return;
2449                 }
2450
2451                 // currently there is no result value passed from here, just passing NULL
2452                 void* some_result_value = NULL;
2453                 _bt_common_event_cb(BLUETOOTH_EVENT_MAP_GET_MESSAGE_COMPLETE,
2454                                 result, some_result_value, event_info->cb, event_info->user_data);
2455
2456                 __bt_remove_push_request_id(request_id);
2457         } else if (strcasecmp(signal_name, BT_MAP_PUSH_MESSAGE_COMPLETE) == 0) {
2458                 BT_DBG("BT_MAP_PUSH_MESSAGE_COMPLETE");
2459                 int request_id = 0;
2460
2461                 g_variant_get(parameters, "(ii)", &result, &request_id);
2462                 if (__bt_is_request_id_exist(request_id) == FALSE) {
2463                         BT_ERR("Different request id!");
2464                         return;
2465                 }
2466
2467                 // currently there is no result value passed from here, just passing NULL
2468                 void* some_result_value = NULL;
2469                 _bt_common_event_cb(BLUETOOTH_EVENT_MAP_PUSH_MESSAGE_COMPLETE,
2470                                 result, some_result_value, event_info->cb, event_info->user_data);
2471
2472                 __bt_remove_push_request_id(request_id);
2473         }
2474
2475 }
2476
2477 void __bt_pbap_client_event_filter(GDBusConnection *connection,
2478                                                  const gchar *sender_name,
2479                                                  const gchar *object_path,
2480                                                  const gchar *interface_name,
2481                                                  const gchar *signal_name,
2482                                                  GVariant *parameters,
2483                                                  gpointer user_data)
2484 {
2485         bt_event_info_t *event_info;
2486         int result = BLUETOOTH_ERROR_NONE;
2487         event_info = (bt_event_info_t *)user_data;
2488
2489         ret_if(event_info == NULL);
2490
2491         if (strcasecmp(object_path, BT_PBAP_CLIENT_PATH) != 0)
2492                 return;
2493
2494         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
2495                 return;
2496
2497         ret_if(signal_name == NULL);
2498
2499         BT_DBG("Type: %s", g_variant_get_type_string(parameters));
2500
2501         if (strcasecmp(signal_name, BT_PBAP_CONNECTED) == 0) {
2502                 bt_pbap_connected_t connected = { { { 0 }, }, };
2503                 char *address = NULL;
2504
2505                 g_variant_get(parameters, "(i&s)", &result, &address);
2506                 BT_DBG("address: %s", address);
2507
2508                 _bt_convert_addr_string_to_type(connected.btaddr.addr,
2509                                                 address);
2510                 if (result == 0)
2511                         connected.connected = 1;
2512                 else
2513                         connected.connected = 0;
2514
2515                 _bt_common_event_cb(BLUETOOTH_PBAP_CONNECTED,
2516                                 result, &connected,
2517                                 event_info->cb, event_info->user_data);
2518         } else if (strcasecmp(signal_name, BT_PBAP_DISCONNECTED) == 0) {
2519                 bt_pbap_connected_t disconnected = { { { 0 }, }, };
2520                 char *address = NULL;
2521
2522                 g_variant_get(parameters, "(i&s)", &result, &address);
2523                 BT_DBG("address: %s", address);
2524
2525                 _bt_convert_addr_string_to_type(disconnected.btaddr.addr,
2526                                                 address);
2527                 disconnected.connected = 0;
2528
2529                 _bt_common_event_cb(BLUETOOTH_PBAP_DISCONNECTED,
2530                                 result, &disconnected,
2531                                 event_info->cb, event_info->user_data);
2532         } else if (strcasecmp(signal_name, BT_PBAP_PHONEBOOK_SIZE) == 0) {
2533                 bt_pbap_phonebook_size_t pb_size = { { { 0 }, }, };
2534                 char *address = NULL;
2535                 int size = 0;
2536
2537                 g_variant_get(parameters, "(i&si)", &result, &address, &size);
2538
2539                 BT_DBG("address: %s, size: %d", address, size);
2540
2541                 _bt_convert_addr_string_to_type(pb_size.btaddr.addr,
2542                                                 address);
2543                 pb_size.size = size;
2544
2545                 _bt_common_event_cb(BLUETOOTH_PBAP_PHONEBOOK_SIZE,
2546                                 result, &pb_size,
2547                                 event_info->cb, event_info->user_data);
2548         } else if (strcasecmp(signal_name, BT_PBAP_PHONEBOOK_PULL) == 0) {
2549                 bt_pbap_phonebook_pull_t pb_pull = { { { 0 } }, };
2550                 char *address = NULL;
2551                 char *vcf_file = NULL;
2552                 int success = -1;
2553
2554                 g_variant_get(parameters, "(i&s&si)", &result, &address, &vcf_file, &success);
2555
2556                 BT_DBG("address: %s, vcf_file: %s, success: %d",
2557                                                 address, vcf_file, success);
2558
2559                 _bt_convert_addr_string_to_type(pb_pull.btaddr.addr,
2560                                                 address);
2561                 pb_pull.vcf_file = vcf_file;
2562                 pb_pull.success = success;
2563                 _bt_common_event_cb(BLUETOOTH_PBAP_PHONEBOOK_PULL,
2564                                 result, &pb_pull,
2565                                 event_info->cb, event_info->user_data);
2566         } else if (strcasecmp(signal_name, BT_PBAP_VCARD_LIST) == 0) {
2567                 bt_pbap_vcard_list_t vc_list = { { { 0 } }, };
2568                 char *address = NULL;
2569                 gsize count = 0;
2570                 gchar **list = NULL;
2571                 GVariant *string_var;
2572                 int success = -1;
2573                 int i = 0;
2574
2575                 g_variant_get(parameters, "(i&sv)", &result, &address, &string_var);
2576
2577                 list = (gchar **)g_variant_get_strv(string_var, &count);
2578
2579                 success = !result;
2580
2581                 for (i = 0; i < count; i++)
2582                         BT_DBG("%s", list[i]);
2583
2584                 BT_DBG("address: %s, result: %d, count: %zd, success: %d",
2585                                         address, result, count, success);
2586
2587                 _bt_convert_addr_string_to_type(vc_list.btaddr.addr,
2588                                                 address);
2589                 vc_list.vcards = list;
2590                 vc_list.length = count;
2591                 vc_list.success = success;
2592                 _bt_common_event_cb(BLUETOOTH_PBAP_VCARD_LIST,
2593                                 result, &vc_list,
2594                                 event_info->cb, event_info->user_data);
2595
2596                 g_variant_unref(string_var);
2597                 //free lists
2598         } else if (strcasecmp(signal_name, BT_PBAP_VCARD_PULL) == 0) {
2599                 bt_pbap_vcard_pull_t vc_pull = { { { 0 } }, };
2600                 char *address = NULL;
2601                 char *vcf_file = NULL;
2602                 int success = -1;
2603
2604                 g_variant_get(parameters, "(i&s&si)",
2605                                         &result, &address, &vcf_file, &success);
2606
2607                 BT_DBG("address: %s, vcf_file: %s, success: %d",
2608                                                 address, vcf_file, success);
2609
2610                 _bt_convert_addr_string_to_type(vc_pull.btaddr.addr, address);
2611                 vc_pull.vcf_file = vcf_file;
2612                 vc_pull.success = success;
2613                 _bt_common_event_cb(BLUETOOTH_PBAP_VCARD_PULL,
2614                                 result, &vc_pull,
2615                                 event_info->cb, event_info->user_data);
2616         } else if (strcasecmp(signal_name, BT_PBAP_SEARCH_PHONEBOOK) == 0) {
2617                 bt_pbap_phonebook_search_list_t vc_list = { { { 0 } }, };
2618                 char *address = NULL;
2619                 gsize count = 0;
2620                 gchar **list = NULL;
2621                 GVariant *string_var;
2622                 int success = -1;
2623                 int i = 0;
2624
2625                 g_variant_get(parameters, "(i&s@as)", &result, &address, &string_var);
2626
2627                 list = (gchar **)g_variant_get_strv(string_var, &count);
2628                 success = !result;
2629                 for (i = 0; i < count; i++)
2630                         BT_DBG("%s", list[i]);
2631
2632                 BT_DBG("address: %s success: %d", address, success);
2633
2634                 _bt_convert_addr_string_to_type(vc_list.btaddr.addr, address);
2635                 vc_list.vcards = list;
2636                 vc_list.length = count;
2637                 vc_list.success = success;
2638                 _bt_common_event_cb(BLUETOOTH_PBAP_PHONEBOOK_SEARCH,
2639                                 result, &vc_list,
2640                                 event_info->cb, event_info->user_data);
2641
2642                 g_variant_unref(string_var);
2643                 //free lists
2644         }
2645 }
2646
2647 void __bt_rfcomm_client_event_filter(GDBusConnection *connection,
2648                                                  const gchar *sender_name,
2649                                                  const gchar *object_path,
2650                                                  const gchar *interface_name,
2651                                                  const gchar *signal_name,
2652                                                  GVariant *parameters,
2653                                                  gpointer user_data)
2654 {
2655         bt_event_info_t *event_info;
2656         int result = BLUETOOTH_ERROR_NONE;
2657         event_info = (bt_event_info_t *)user_data;
2658         ret_if(event_info == NULL);
2659
2660         if (strcasecmp(object_path, BT_RFCOMM_CLIENT_PATH) != 0)
2661                 return;
2662         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
2663                 return;
2664
2665         ret_if(signal_name == NULL);
2666
2667         if (strcasecmp(signal_name, BT_RFCOMM_CONNECTED) == 0) {
2668                 const char *address = NULL;
2669                 const char *uuid = NULL;
2670                 int socket_fd = 0;
2671                 bluetooth_rfcomm_connection_t conn_info;
2672
2673                 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2674                                                         &uuid, &socket_fd);
2675
2676                 memset(&conn_info, 0x00, sizeof(bluetooth_rfcomm_connection_t));
2677                 conn_info.device_role = RFCOMM_ROLE_CLIENT;
2678                 g_strlcpy(conn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2679                 conn_info.socket_fd = socket_fd;
2680                 _bt_convert_addr_string_to_type(conn_info.device_addr.addr,
2681                                                 address);
2682
2683                 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_CONNECTED,
2684                                 result, &conn_info,
2685                                 event_info->cb, event_info->user_data);
2686         } else if (strcasecmp(signal_name, BT_RFCOMM_DISCONNECTED) == 0) {
2687                 const char *address = NULL;
2688                 const char *uuid = NULL;
2689                 int socket_fd = 0;
2690                 bluetooth_rfcomm_disconnection_t disconn_info;
2691
2692                 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2693                                                                 &uuid, &socket_fd);
2694
2695                 memset(&disconn_info, 0x00, sizeof(bluetooth_rfcomm_disconnection_t));
2696                 disconn_info.device_role = RFCOMM_ROLE_CLIENT;
2697                 g_strlcpy(disconn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2698                 disconn_info.socket_fd = socket_fd;
2699                 _bt_convert_addr_string_to_type(disconn_info.device_addr.addr,
2700                                                 address);
2701
2702                 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DISCONNECTED,
2703                                 result, &disconn_info,
2704                                 event_info->cb, event_info->user_data);
2705         } else if (strcasecmp(signal_name, BT_RFCOMM_DATA_RECEIVED) == 0) {
2706                 char *buffer;
2707                 int buffer_len = 0;
2708                 int socket_fd = 0;
2709                 bluetooth_rfcomm_received_data_t data_r;
2710                 GVariant *byte_var;
2711
2712                 g_variant_get(parameters, "(in@ay)", &result, &socket_fd,
2713                                                                 &byte_var);
2714
2715                 buffer_len = g_variant_get_size(byte_var);
2716                 buffer = (char *) g_variant_get_data(byte_var);
2717
2718                 data_r.socket_fd = socket_fd;
2719                 data_r.buffer_size = buffer_len;
2720                 data_r.buffer = buffer;
2721
2722                 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED,
2723                                 result, &data_r,
2724                                 event_info->cb, event_info->user_data);
2725                 g_variant_unref(byte_var);
2726         }
2727 }
2728
2729 void __bt_rfcomm_server_event_filter(GDBusConnection *connection,
2730                                                  const gchar *sender_name,
2731                                                  const gchar *object_path,
2732                                                  const gchar *interface_name,
2733                                                  const gchar *signal_name,
2734                                                  GVariant *parameters,
2735                                                  gpointer user_data)
2736 {
2737         bt_event_info_t *event_info;
2738         int result = BLUETOOTH_ERROR_NONE;
2739         event_info = (bt_event_info_t *)user_data;
2740         ret_if(event_info == NULL);
2741
2742         if (strcasecmp(object_path, BT_RFCOMM_SERVER_PATH) != 0)
2743                 return;
2744         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
2745                 return;
2746
2747         ret_if(signal_name == NULL);
2748
2749         if (strcasecmp(signal_name, BT_RFCOMM_CONNECTED) == 0) {
2750                 const char *address = NULL;
2751                 const char *uuid = NULL;
2752                 int socket_fd = 0;
2753                 bluetooth_rfcomm_connection_t conn_info;
2754
2755                 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2756                                                         &uuid, &socket_fd);
2757
2758                 memset(&conn_info, 0x00, sizeof(bluetooth_rfcomm_connection_t));
2759                 conn_info.device_role = RFCOMM_ROLE_SERVER;
2760                 g_strlcpy(conn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2761                 conn_info.socket_fd = socket_fd;
2762                 _bt_convert_addr_string_to_type(conn_info.device_addr.addr,
2763                                                 address);
2764
2765                 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_CONNECTED,
2766                                 result, &conn_info,
2767                                 event_info->cb, event_info->user_data);
2768         } else if (strcasecmp(signal_name, BT_RFCOMM_DISCONNECTED) == 0) {
2769                 const char *address = NULL;
2770                 const char *uuid = NULL;
2771                 int socket_fd = 0;
2772                 bluetooth_rfcomm_disconnection_t disconn_info;
2773
2774                 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2775                                                                 &uuid, &socket_fd);
2776
2777                 memset(&disconn_info, 0x00, sizeof(bluetooth_rfcomm_disconnection_t));
2778                 disconn_info.device_role = RFCOMM_ROLE_SERVER;
2779                 g_strlcpy(disconn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2780                 disconn_info.socket_fd = socket_fd;
2781                 _bt_convert_addr_string_to_type(disconn_info.device_addr.addr,
2782                                                 address);
2783
2784                 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DISCONNECTED,
2785                                 result, &disconn_info,
2786                                 event_info->cb, event_info->user_data);
2787         } else if (strcasecmp(signal_name, BT_CONNECTION_AUTHORIZED) == 0) {
2788                 /* OSP only event */
2789                 bluetooth_rfcomm_connection_request_t req_ind;
2790                 char *address = NULL;
2791                 char *uuid = NULL;
2792                 int socket_fd = 0;
2793 #ifdef TIZEN_FEATURE_BT_RFCOMM_DIRECT
2794                 char *name = NULL;
2795                 char *path = NULL;
2796
2797                 g_variant_get(parameters, "(i&s&s&s&sn)", &result, &address,
2798                                                 &uuid, &name, &path, &socket_fd);
2799
2800                 if (_check_uuid_path(path, uuid) == FALSE)
2801                         return;
2802 #else
2803                 gboolean auto_accept = FALSE;
2804
2805                 g_variant_get(parameters, "(i&s&s)", &result, &address, &uuid);
2806                 socket_fd = _get_rfcomm_server_id(uuid, &auto_accept);
2807                 if (0 > socket_fd)
2808                         return;
2809
2810                 _bt_rfcomm_server_set_pending_conn(socket_fd, address);
2811                 if (auto_accept) {
2812                         bluetooth_rfcomm_accept_connection(socket_fd);
2813                         return;
2814                 }
2815 #endif
2816                 memset(&req_ind, 0x00, sizeof(bluetooth_rfcomm_connection_request_t));
2817                 _bt_convert_addr_string_to_type(req_ind.device_addr.addr,
2818                                                 address);
2819
2820                 req_ind.socket_fd = socket_fd;
2821
2822                 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_AUTHORIZE,
2823                                 result, &req_ind,
2824                                 event_info->cb, event_info->user_data);
2825         } else if (strcasecmp(signal_name, BT_RFCOMM_SERVER_REMOVED) == 0) {
2826                 /* OSP only event */
2827                 int socket_fd = 0;
2828
2829                 g_variant_get(parameters, "(in)", &result, &socket_fd);
2830
2831                 ret_if(__bt_is_server_exist(socket_fd) == FALSE);
2832
2833                 _bt_remove_server(socket_fd);
2834         } else if (strcasecmp(signal_name, BT_RFCOMM_DATA_RECEIVED) == 0) {
2835                 char *buffer = NULL;
2836                 int buffer_len = 0;
2837                 int socket_fd = 0;
2838                 bluetooth_rfcomm_received_data_t data_r;
2839                 GVariant *byte_var;
2840
2841                 g_variant_get(parameters, "(in@ay)", &result,
2842                                                 &socket_fd, &byte_var);
2843
2844                 buffer_len = g_variant_get_size(byte_var);
2845                 buffer = (char *) g_variant_get_data(byte_var);
2846
2847                 data_r.socket_fd = socket_fd;
2848                 data_r.buffer_size = buffer_len;
2849                 data_r.buffer = buffer;
2850
2851                 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED,
2852                                 result, &data_r,
2853                                 event_info->cb, event_info->user_data);
2854                 g_variant_unref(byte_var);
2855         }
2856 }
2857
2858 void __bt_hf_agent_event_filter(GDBusConnection *connection,
2859                                                  const gchar *sender_name,
2860                                                  const gchar *object_path,
2861                                                  const gchar *interface_name,
2862                                                  const gchar *signal_name,
2863                                                  GVariant *parameters,
2864                                                  gpointer user_data)
2865 {
2866         BT_DBG("+");
2867
2868         bt_event_info_t *event_info;
2869         int result = BLUETOOTH_ERROR_NONE;
2870         event_info = (bt_event_info_t *)user_data;
2871         ret_if(event_info == NULL);
2872
2873         if (strcasecmp(object_path, BT_HF_AGENT_PATH) != 0)
2874                 return;
2875         if (strcasecmp(interface_name, BT_HF_SERVICE_INTERFACE) != 0)
2876                 return;
2877
2878         ret_if(signal_name == NULL);
2879
2880         BT_DBG("%s", signal_name);
2881         if (strcasecmp(signal_name, "Connected") == 0) {
2882                 char *address = NULL;
2883
2884                 g_variant_get(parameters, "(&s)", &address);
2885                 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CONNECTED,
2886                                 result, address,
2887                                 event_info->cb, event_info->user_data);
2888         } else if (strcasecmp(signal_name, "Disconnected") == 0) {
2889                 char *address = NULL;
2890
2891                 g_variant_get(parameters, "(&s)", &address);
2892                 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_DISCONNECTED,
2893                                 result, address,
2894                                 event_info->cb, event_info->user_data);
2895         } else if (strcasecmp(signal_name, "AudioConnected") == 0) {
2896                 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_AUDIO_CONNECTED,
2897                                 result, NULL,
2898                                 event_info->cb, event_info->user_data);
2899         } else if (strcasecmp(signal_name, "AudioDisconnected") == 0) {
2900                 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_AUDIO_DISCONNECTED,
2901                                 result, NULL,
2902                                 event_info->cb, event_info->user_data);
2903         } else if (strcasecmp(signal_name, "Ring") == 0) {
2904                 char *phoneno = NULL;
2905
2906                 g_variant_get(parameters, "(&s)", &phoneno);
2907
2908                 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_RING_INDICATOR,
2909                                 result, phoneno,
2910                                 event_info->cb, event_info->user_data);
2911         } else if (strcasecmp(signal_name, "CallWaiting") == 0) {
2912                 char *phoneno = NULL;
2913
2914                 g_variant_get(parameters, "(&s)", &phoneno);
2915
2916                 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_WAITING,
2917                                 result, phoneno,
2918                                 event_info->cb, event_info->user_data);
2919         }  else if (strcasecmp(signal_name, "CallTerminated") == 0) {
2920                 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_TERMINATED,
2921                                 result, NULL,
2922                                 event_info->cb, event_info->user_data);
2923         }  else if (strcasecmp(signal_name, "FailedToDial") == 0) {
2924                 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_FAILED_TO_DIAL,
2925                                 result, NULL,
2926                                 event_info->cb, event_info->user_data);
2927         } else if (strcasecmp(signal_name, "CallIdle") == 0) {
2928                 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_IDLE,
2929                                 result, NULL,
2930                                 event_info->cb, event_info->user_data);
2931         } else if (strcasecmp(signal_name, "CallSetupIncoming") == 0) {
2932                 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALLSETUP_INCOMING,
2933                                 result, NULL,
2934                                 event_info->cb, event_info->user_data);
2935         } else if (strcasecmp(signal_name, "CallSetupDialing") == 0) {
2936                 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALLSETUP_DIALING,
2937                                 result, NULL,
2938                                 event_info->cb, event_info->user_data);
2939         } else if (strcasecmp(signal_name, "CallSetupAlerting") == 0) {
2940                 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALLSETUP_ALERTING,
2941                                 result, NULL,
2942                                 event_info->cb, event_info->user_data);
2943         } else if (strcasecmp(signal_name, "CallStarted") == 0) {
2944                 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_STARTED,
2945                                 result, NULL,
2946                                 event_info->cb, event_info->user_data);
2947         } else if (strcasecmp(signal_name, "CallEnded") == 0) {
2948                 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_ENDED,
2949                                 result, NULL,
2950                                 event_info->cb, event_info->user_data);
2951         }  else if (strcasecmp(signal_name, "NoCallsHeld") == 0) {
2952                 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_UNHOLD,
2953                                 result, NULL,
2954                                 event_info->cb, event_info->user_data);
2955         } else if (strcasecmp(signal_name, "CallsSwapped") == 0) {
2956                 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_SWAPPED,
2957                                 result, NULL,
2958                                 event_info->cb, event_info->user_data);
2959         } else if (strcasecmp(signal_name, "CallOnHold") == 0) {
2960                 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_ON_HOLD,
2961                                 result, NULL,
2962                                 event_info->cb, event_info->user_data);
2963         } else if (strcasecmp(signal_name, "CallStatusUpdate") == 0) {
2964                 int call_count;
2965                 GVariant *var_data = NULL;
2966                 char *number = NULL;
2967                 int idx, dir, status, mpart;
2968                 bt_hf_call_list_s *handle = NULL;
2969
2970                 g_variant_get(parameters, "(i@a(siiii))", &call_count,
2971                                                                 &var_data);
2972                 BT_DBG("call count : %d", call_count);
2973
2974                 if (var_data) {
2975                         GVariantIter *iter = NULL;
2976                         __bt_call_list_create(&handle);
2977
2978                         g_variant_get(var_data, "a(siiii)", &iter);
2979                         while (g_variant_iter_loop(iter, "(siiii)", &number,
2980                                                 &dir, &status, &mpart, &idx)) {
2981                                 BT_DBG("call number:%s, dir:%d, status : %d",
2982                                                         number, dir, status);
2983                                 BT_DBG("call mpart : %d, idx : %d", mpart, idx);
2984                                 __bt_call_list_add(handle, number, dir,
2985                                                         status, mpart, idx);
2986                         }
2987                         g_variant_iter_free(iter);
2988                         g_variant_unref(var_data);
2989                 }
2990
2991                 if (handle && (call_count == g_list_length(handle->list))) {
2992                         handle->count = call_count;
2993                         _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_STATUS,
2994                                         result, handle,
2995                                         event_info->cb, event_info->user_data);
2996                 } else {
2997                         BT_ERR(" Mismatch in call count : %d", call_count);
2998                 }
2999
3000                 __bt_call_list_destroy(handle);
3001         } else if (strcasecmp(signal_name, "VoiceRecognition") == 0) {
3002                 int status;
3003                 g_variant_get(parameters, "(i)", &status);
3004                 BT_DBG("status = [%d]\n", status);
3005                 if (status)
3006                         _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VOICE_RECOGNITION_ENABLED,
3007                                         result, NULL,
3008                                         event_info->cb, event_info->user_data);
3009                 else
3010                         _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VOICE_RECOGNITION_DISABLED,
3011                                         result, NULL,
3012                                         event_info->cb, event_info->user_data);
3013         } else if (strcasecmp(signal_name, "VolumeSpeaker") == 0) {
3014                 int value;
3015                 g_variant_get(parameters, "(i)", &value);
3016                 BT_DBG("Value = [%d]\n", value);
3017                         _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VOLUME_SPEAKER,
3018                                         result, &value,
3019                                         event_info->cb, event_info->user_data);
3020         } else if (strcasecmp(signal_name, "SamsungXSAT") == 0) {
3021                 int value = 0;
3022                 char *msg = NULL;
3023                 bluetooth_vendor_dep_at_cmd_t cmd;
3024                 g_variant_get(parameters, "(i&s)", &value, &msg);
3025                 BT_DBG("Value = [%d], message = %s\n", value, msg);
3026                 cmd.app_id =  value;
3027                 cmd.message = msg;
3028                 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VENDOR_DEP_CMD,
3029                                 result, &cmd,
3030                                 event_info->cb, event_info->user_data);
3031         } else if (strcasecmp(signal_name, "PropertyChanged") == 0) {
3032                 GVariant *value;
3033                 gchar *property;
3034                 bluetooth_hf_ciev_device_event_t dev_event;
3035
3036                 g_variant_get(parameters, "(&sv)", &property, &value);
3037                 dev_event.value  = g_variant_get_uint16(value);
3038
3039                 BT_DBG("Property: %s , value: %d", property, dev_event.value);
3040                 g_variant_unref(value);
3041
3042                 if (strcasecmp(property, "BatteryCharge") == 0) {
3043                         dev_event.event = BLUETOOTH_HF_CIEV_BATTCHG;
3044                         _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED,
3045                                         result, &dev_event,
3046                                         event_info->cb, event_info->user_data);
3047                 } else if (strcasecmp(property, "SignalStrength") == 0) {
3048                         dev_event.event = BLUETOOTH_HF_CIEV_SIGNAL;
3049                         _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED,
3050                                         result, &dev_event,
3051                                         event_info->cb, event_info->user_data);
3052                 } else if (strcasecmp(property, "RegistrationStatus") == 0) {
3053                         dev_event.event = BLUETOOTH_HF_CIEV_SERVICE;
3054                         _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED,
3055                                         result, &dev_event,
3056                                         event_info->cb, event_info->user_data);
3057                 }
3058         }
3059         BT_DBG("-");
3060 }
3061
3062 static void __bt_tds_event_filter(GDBusConnection *connection,
3063                 const gchar *sender_name,
3064                 const gchar *object_path,
3065                 const gchar *interface_name,
3066                 const gchar *signal_name,
3067                 GVariant *parameters,
3068                 gpointer user_data)
3069 {
3070         bt_event_info_t *event_info;
3071         event_info = (bt_event_info_t *)user_data;
3072         int result = BLUETOOTH_ERROR_NONE;
3073
3074         ret_if(event_info == NULL);
3075
3076         if (strcasecmp(object_path, BT_TDS_PATH) != 0)
3077                 return;
3078         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
3079                 return;
3080
3081         ret_if(signal_name == NULL);
3082
3083         BT_DBG("+");
3084
3085         if (strcasecmp(signal_name, BT_TDS_ACTIVATION_REQUESTED) == 0) {
3086                 bluetooth_tds_activation_req_t act_req;
3087                 const char *address = NULL;
3088                 char *buffer = NULL;
3089                 int transport = 0;
3090                 GVariant *byte_var;
3091
3092                 g_variant_get(parameters, "(&si@ay)", &address,
3093                                 &transport, &byte_var);
3094
3095                 memset(&act_req, 0x00, sizeof(bluetooth_tds_activation_req_t));
3096
3097                 act_req.transport = transport;
3098
3099                 act_req.tds_data.length = g_variant_get_size(byte_var);
3100                 if (act_req.tds_data.length > BLUETOOTH_TDS_DATA_LENGTH_MAX) {
3101                         BT_INFO("tds data length > BLUETOOTH_TDS_DATA_LENGTH_MAX");
3102                         act_req.tds_data.length = BLUETOOTH_TDS_DATA_LENGTH_MAX;
3103                 }
3104                 buffer = (char *) g_variant_get_data(byte_var);
3105                 memcpy(act_req.tds_data.data, buffer, act_req.tds_data.length);
3106                 g_variant_unref(byte_var);
3107
3108                 _bt_convert_addr_string_to_type(act_req.rem_addr.addr, address);
3109
3110                 _bt_common_event_cb(BLUETOOTH_EVENT_TDS_ACTIVATION_REQUESTED,
3111                                 BLUETOOTH_ERROR_NONE, &act_req,
3112                                 event_info->cb, event_info->user_data);
3113         } else if (strcasecmp(signal_name, BT_TDS_TRANSPORT_DATA_RECEIVED) == 0) {
3114                 BT_DBG("TDS Complete Block Data received");
3115                 const char *address = NULL;
3116                 char *data;
3117                 int data_len = 0;
3118                 int k;
3119                 GVariant *var = NULL;
3120                 bluetooth_tds_transport_data_info_t *info = NULL;
3121
3122                 /* Extract data from DBUS params */
3123                 g_variant_get(parameters, "(i&sn@ay)", &result, &address, &data_len, &var);
3124                 data = (char *)g_variant_get_data(var);
3125
3126                 if (data) {
3127                         BT_DBG("Address [%s]", address);
3128                         BT_DBG("Data len [%d]", data_len);
3129
3130                         /* DEBUG */
3131                         for (k = 0; k < data_len ; k++)
3132                                 BT_DBG("Data[%d] [0x%x]", k, data[k]);
3133
3134                         if (data_len == 0) {
3135                                 BT_ERR("No data");
3136                                 g_variant_unref(var);
3137                                 return;
3138                         }
3139
3140                         info = g_malloc0(sizeof(bluetooth_tds_transport_data_info_t));
3141                         info->data_length = data_len;
3142                         info->data = g_memdup(data, data_len);
3143
3144                         _bt_convert_addr_string_to_type(info->device_address.addr,
3145                                         address);
3146
3147                         _bt_common_event_cb(BLUETOOTH_EVENT_TDS_TRANSPORT_DATA_RECEIVED,
3148                                         result, info,
3149                                         event_info->cb, event_info->user_data);
3150
3151                         if (info->data) {
3152                                 g_free(info->data);
3153                                 g_free(info);
3154                         }
3155                 }
3156                 g_variant_unref(var);
3157         } else if (strcasecmp(signal_name, BT_TDS_ACTIVATION_RESULT) == 0) {
3158                 BT_DBG("TDS Control point Activation result");
3159                 const char *address = NULL;
3160                 bluetooth_device_address_t dev_address = { {0} };
3161
3162                 /* Extract data from DBUS params */
3163                 g_variant_get(parameters, "(i&s)", &result, &address);
3164                 BT_DBG("Address [%s]", address);
3165                 BT_DBG("Result  [%d]", result);
3166
3167                 _bt_convert_addr_string_to_type(dev_address.addr,
3168                                 address);
3169
3170                 _bt_common_event_cb(BLUETOOTH_EVENT_TDS_ACTIVATION_RESULT,
3171                                 result, &dev_address,
3172                                 event_info->cb, event_info->user_data);
3173         } else if (strcasecmp(signal_name, BT_TDS_ACTIVATION_INDICATION) == 0) {
3174                 BT_DBG("TDS Control point Indication Response");
3175                 bluetooth_tds_indication_res_t ind_res;
3176                 const char *address = NULL;
3177                 char *buffer = NULL;
3178                 GVariant *byte_var = NULL;
3179
3180                 g_variant_get(parameters, "(&s@ay)", &address, &byte_var);
3181
3182                 memset(&ind_res, 0x00, sizeof(bluetooth_tds_indication_res_t));
3183
3184                 ind_res.tds_data.length = g_variant_get_size(byte_var);
3185
3186                 buffer = (char *) g_variant_get_data(byte_var);
3187                 BT_DBG("[len = %d]", ind_res.tds_data.length);
3188                 memcpy(ind_res.tds_data.data, buffer, ind_res.tds_data.length);
3189
3190                 _bt_convert_addr_string_to_type(ind_res.rem_addr.addr, address);
3191
3192                 _bt_common_event_cb(BLUETOOTH_EVENT_TDS_ACTIVATION_INDICATION,
3193                                 BLUETOOTH_ERROR_NONE,  &ind_res,
3194                                 event_info->cb, event_info->user_data);
3195
3196                 g_variant_unref(byte_var);
3197         } else if (strcasecmp(signal_name, BT_TDS_CONTROL_POINT_ENABLED) == 0) {
3198                 BT_DBG("TDS Control point Enabled event");
3199                 const char *address = NULL;
3200                 bluetooth_device_address_t dev_address = { {0} };
3201
3202                 /* Extract data from DBUS params */
3203                 g_variant_get(parameters, "(i&s)", &result, &address);
3204                 BT_DBG("Address [%s]", address);
3205                 BT_DBG("Result  [%d]", result);
3206
3207                 _bt_convert_addr_string_to_type(dev_address.addr,
3208                                 address);
3209
3210                 _bt_common_event_cb(BLUETOOTH_EVENT_TDS_CONTROL_POINT_ENABLED,
3211                                 result, &dev_address,
3212                                 event_info->cb, event_info->user_data);
3213         }
3214
3215         BT_DBG("-");
3216 }
3217
3218 static void __bt_otp_event_filter(GDBusConnection *connection,
3219                 const gchar *sender_name,
3220                 const gchar *object_path,
3221                 const gchar *interface_name,
3222                 const gchar *signal_name,
3223                 GVariant *parameters,
3224                 gpointer user_data)
3225 {
3226         bt_event_info_t *event_info;
3227         event_info = (bt_event_info_t *)user_data;
3228         int result = BLUETOOTH_ERROR_NONE;
3229
3230         ret_if(event_info == NULL);
3231
3232         if (strcasecmp(object_path, BT_OTP_PATH) != 0)
3233                 return;
3234         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
3235                 return;
3236
3237         ret_if(signal_name == NULL);
3238
3239         BT_DBG("+");
3240
3241         if (strcasecmp(signal_name, BT_OTP_SERVER_STATE_CHANGED) == 0) {
3242                 BT_DBG("OTP Server State Changed Event");
3243                 bool status = FALSE;
3244
3245                 /* Extract data from DBUS params */
3246                 g_variant_get(parameters, "(ib)", &result, &status);
3247                 BT_DBG("Result [%d]", result);
3248                 BT_DBG("Status  [%s]", status ? "enabled" : "disabled");
3249
3250                 _bt_common_event_cb(BLUETOOTH_EVENT_OTP_SERVER_STATE_CHANGED,
3251                                 result, &status, event_info->cb, event_info->user_data);
3252         } else if (strcasecmp(signal_name, BT_OTP_READ_CHAR_VAL) == 0) {
3253                 BT_DBG("OTP Read Data received");
3254                 const char *handle = NULL;
3255                 char *data;
3256                 int data_len = 0;
3257                 GVariant *var = NULL;
3258                 bluetooth_otp_resp_info_t *info = NULL;
3259
3260                 /* Extract data from DBUS params */
3261                 g_variant_get(parameters, "(i&sn@ay)", &result, &handle, &data_len, &var);
3262                 if (!var) {
3263                         BT_ERR("No data");
3264                         return;
3265                 }
3266                 data = (char *)g_variant_get_data(var);
3267
3268                 BT_DBG("Handle [%s]", handle);
3269                 BT_DBG("Data len [%d]", data_len);
3270
3271                 if (data_len == 0) {
3272                         BT_ERR("No data");
3273                         if (var)
3274                                 g_variant_unref(var);
3275                         return;
3276                 }
3277
3278                 info = g_malloc0(sizeof(bluetooth_otp_resp_info_t));
3279                 info->data_length = data_len;
3280                 info->data = g_memdup(data, data_len);
3281                 info->handle = g_strdup(handle);
3282
3283                 _bt_common_event_cb(BLUETOOTH_EVENT_OTP_READ_CHAR_VAL,
3284                                 result, info,
3285                                 event_info->cb, event_info->user_data);
3286
3287                 if (info->handle)
3288                         g_free(info->handle);
3289
3290                 if (info->data) {
3291                         g_free(info->data);
3292                         g_free(info);
3293                 }
3294                 g_variant_unref(var);
3295         } else if (strcasecmp(signal_name, BT_OTP_NOTIFICATION_ENABLED) == 0) {
3296                 BT_DBG("OTP Notification Enabled event");
3297                 char *handle = NULL;
3298
3299                 /* Extract data from DBUS params */
3300                 g_variant_get(parameters, "(i&s)", &result, &handle);
3301                 BT_DBG("Handle [%s]", handle);
3302                 BT_DBG("Result  [%d]", result);
3303
3304                 _bt_common_event_cb(BLUETOOTH_EVENT_OTP_NOTIFICATION_ENABLED,
3305                                 result, handle,
3306                                 event_info->cb, event_info->user_data);
3307         } else if (strcasecmp(signal_name, BT_OTP_WRITE_CHAR_VAL) == 0) {
3308                 BT_DBG("OTP Control point Activation result");
3309                 char *handle = NULL;
3310
3311                 /* Extract data from DBUS params */
3312                 g_variant_get(parameters, "(i&s)", &result, &handle);
3313                 BT_DBG("Handle [%s]", handle);
3314                 BT_DBG("Result  [%d]", result);
3315
3316                 _bt_common_event_cb(BLUETOOTH_EVENT_OTP_WRITE_CHAR_VAL,
3317                                 result, handle,
3318                                 event_info->cb, event_info->user_data);
3319         } else if (strcasecmp(signal_name, BT_OTP_INDICATION) == 0) {
3320                 BT_DBG("OTP Control point Indication Response");
3321                 bluetooth_otp_resp_info_t *ind_res = NULL;
3322                 char *buffer = NULL;
3323                 GVariant *byte_var = NULL;
3324                 char *handle = NULL;
3325
3326                 g_variant_get(parameters, "(i&s@ay)", &result, &handle, &byte_var);
3327                 if (!byte_var) {
3328                         BT_ERR("No Indication data from Server");
3329                         return;
3330                 }
3331
3332                 ind_res = g_malloc0(sizeof(bluetooth_otp_resp_info_t));
3333                 ind_res->data_length = g_variant_get_size(byte_var);
3334                 buffer = (char *)g_variant_get_data(byte_var);
3335                 ind_res->data = g_memdup(buffer, ind_res->data_length);
3336                 ind_res->handle = g_strdup(handle);
3337
3338                 _bt_common_event_cb(BLUETOOTH_EVENT_OTP_INDICATION,
3339                                 result,  ind_res,
3340                                 event_info->cb, event_info->user_data);
3341
3342                 if (ind_res->handle)
3343                         g_free(ind_res->handle);
3344
3345                 if (ind_res->data) {
3346                         g_free(ind_res->data);
3347                         g_free(ind_res);
3348                 }
3349                 g_variant_unref(byte_var);
3350         }  else if (strcasecmp(signal_name, BT_OTC_STATE_CHANGED) == 0) {
3351                 BT_DBG("OTC State Changed");
3352                 char *address = NULL;
3353                 int fd = -1;
3354                 gboolean connected = FALSE;
3355                 bluetooth_otc_info_t *otc_info = NULL;
3356
3357                 /* Extract data from DBUS params */
3358                 g_variant_get(parameters, "(ib&sn)", &result, &connected, &address, &fd);
3359                 BT_DBG("Result  [%d]", result);
3360                 BT_DBG("Address [%s]", address);
3361                 BT_DBG("Connected [%d]", connected);
3362                 BT_DBG("Fd  [%d]", fd);
3363
3364                 otc_info = g_malloc0(sizeof(bluetooth_otc_info_t));
3365                 otc_info->fd = fd;
3366                 otc_info->connected = connected;
3367                 otc_info->address = g_strdup(address);
3368
3369                 _bt_common_event_cb(BLUETOOTH_EVENT_OTC_STATE_CHANGED,
3370                                 result, otc_info,
3371                                 event_info->cb, event_info->user_data);
3372         }
3373
3374         BT_DBG("-");
3375 }
3376
3377 void __bt_hdp_event_filter(GDBusConnection *connection,
3378                                                  const gchar *sender_name,
3379                                                  const gchar *object_path,
3380                                                  const gchar *interface_name,
3381                                                  const gchar *signal_name,
3382                                                  GVariant *parameters,
3383                                                  gpointer user_data)
3384 {
3385         bt_event_info_t *event_info;
3386         int result = BLUETOOTH_ERROR_NONE;
3387
3388         BT_DBG("+");
3389         event_info = (bt_event_info_t *)user_data;
3390         ret_if(event_info == NULL);
3391
3392         if (strcasecmp(object_path, BT_HDP_DEVICE_PATH) != 0)
3393                 return;
3394         if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
3395                 return;
3396
3397         ret_if(signal_name == NULL);
3398
3399         if (strcasecmp(signal_name, BT_HDP_CONNECTED) == 0) {
3400                 const char *address = NULL;
3401                 char *app_handle = NULL;
3402                 bt_hdp_connected_t conn_info;
3403
3404                 g_variant_get(parameters, "(i&s&sui)", &result,
3405                                 &address, &app_handle,
3406                                 &(conn_info.channel_id), &(conn_info.type));
3407
3408                 conn_info.app_handle = app_handle;
3409
3410                 BT_DBG("address: %s, app_handle: %s, ch_id: %d, ch_type: %d",
3411                         address, conn_info.app_handle, conn_info.channel_id, conn_info.type);
3412                 _bt_convert_addr_string_to_type(conn_info.device_address.addr, address);
3413
3414                 if (BLUETOOTH_ERROR_NONE == result)
3415                         result = _bt_hdp_app_acquire_fd(&conn_info);
3416
3417                 _bt_common_event_cb(BLUETOOTH_EVENT_HDP_CONNECTED,
3418                                 result, &conn_info,
3419                                 event_info->cb, event_info->user_data);
3420         } else if (strcasecmp(signal_name, BT_HDP_DISCONNECTED) == 0) {
3421                 const char *address = NULL;
3422                 bt_hdp_disconnected_t disconn_info;
3423
3424                 g_variant_get(parameters, "(i&su)", &result,
3425                                 &address, &(disconn_info.channel_id));
3426
3427                 BT_DBG("address: %s", address);
3428                 _bt_convert_addr_string_to_type(disconn_info.device_address.addr, address);
3429
3430                 _bt_hdp_app_remove_obj_info(disconn_info.channel_id);
3431                 _bt_common_event_cb(BLUETOOTH_EVENT_HDP_DISCONNECTED,
3432                                 result, &disconn_info,
3433                                 event_info->cb, event_info->user_data);
3434         }
3435
3436         BT_DBG("-");
3437 }
3438
3439 static void __bt_remove_all_events(void)
3440 {
3441         bt_event_info_t *info;
3442
3443         while ((info = g_slist_nth_data(event_list, 0)) != NULL)
3444                 _bt_unregister_event(info->event_type);
3445
3446         if (event_list) {
3447                 g_slist_free(event_list);
3448                 event_list = NULL;
3449         }
3450 }
3451
3452 static gboolean __bt_event_is_registered(int event_type)
3453 {
3454         GSList *l;
3455         bt_event_info_t *info;
3456
3457         for (l = event_list; l != NULL; l = g_slist_next(l)) {
3458                 info = l->data;
3459                 if (info == NULL)
3460                         continue;
3461
3462                 if (info->event_type == event_type)
3463                         return TRUE;
3464         }
3465
3466         return FALSE;
3467 }
3468
3469 bt_event_info_t *_bt_event_get_cb_data(int event_type)
3470 {
3471         GSList *l;
3472         bt_event_info_t *info;
3473
3474         for (l = event_list; l != NULL; l = g_slist_next(l)) {
3475                 info = l->data;
3476                 if (info == NULL)
3477                         continue;
3478
3479                 if (info->event_type == event_type)
3480                         return info;
3481         }
3482
3483         return NULL;
3484 }
3485
3486 void _bt_add_server(int server_fd)
3487 {
3488         bt_server_info_t *info;
3489
3490         info = g_new0(bt_server_info_t, 1);
3491         info->server_fd = server_fd;
3492
3493         server_list = g_slist_append(server_list, info);
3494 }
3495
3496 void _bt_remove_server(int server_fd)
3497 {
3498         GSList *l;
3499         bt_server_info_t *info;
3500
3501         for (l = server_list; l != NULL; l = g_slist_next(l)) {
3502                 info = l->data;
3503                 if (info == NULL)
3504                         continue;
3505
3506                 if (info->server_fd == server_fd)
3507                         server_list = g_slist_remove(server_list, (void *)info);
3508
3509                 g_free(info);
3510         }
3511 }
3512
3513 void _bt_set_obex_server_id(int server_type)
3514 {
3515         obex_server_id = server_type;
3516 }
3517
3518 int _bt_get_obex_server_id(void)
3519 {
3520         return obex_server_id;
3521 }
3522
3523 int _bt_init_event_handler(void)
3524 {
3525         if (is_initialized == TRUE) {
3526                 BT_ERR("Connection already exist");
3527                 return BLUETOOTH_ERROR_ALREADY_INITIALIZED;
3528         }
3529
3530         __bt_remove_all_events();
3531
3532         is_initialized = TRUE;
3533
3534         return BLUETOOTH_ERROR_NONE;
3535 }
3536
3537 int _bt_deinit_event_handler(void)
3538 {
3539         if (is_initialized == FALSE) {
3540                 BT_ERR("Connection dose not exist");
3541                 return BLUETOOTH_ERROR_INTERNAL;
3542         }
3543
3544         __bt_remove_all_events();
3545
3546         if (disable_timer_id > 0) {
3547                 g_source_remove(disable_timer_id);
3548                 disable_timer_id = 0;
3549         }
3550
3551         is_initialized = FALSE;
3552
3553         return BLUETOOTH_ERROR_NONE;
3554 }
3555
3556 static void __bt_event_data_free(void *data)
3557 {
3558         bt_event_info_t *cb_data = data;
3559
3560         ret_if(cb_data == NULL);
3561
3562         g_free(cb_data);
3563 }
3564
3565 #ifdef TIZEN_GATT_CLIENT
3566 static void __bt_gatt_client_event_filter(GDBusConnection *connection,
3567                 const gchar *sender_name,
3568                 const gchar *object_path,
3569                 const gchar *interface_name,
3570                 const gchar *signal_name,
3571                 GVariant *parameters,
3572                 gpointer user_data)
3573 {
3574         bt_event_info_t *event_info;
3575         int result = BLUETOOTH_ERROR_NONE;
3576
3577         event_info = (bt_event_info_t *)user_data;
3578         ret_if(event_info == NULL);
3579
3580         if (strcasecmp(signal_name, BT_GATT_CHAR_VAL_CHANGED) == 0) { /* Done */
3581                 /* Event: BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED */
3582                 BT_DBG("GATT Client event[BT_GATT_CHAR_VAL_CHANGED]");
3583                 bt_gatt_char_property_t char_prop;
3584                 const char *address = NULL;
3585                 GVariant *data_var = NULL;
3586                 GVariant *svc_uuid_var = NULL;
3587                 int svc_inst;
3588                 GVariant *char_uuid_var = NULL;
3589                 int svc_uuid_len = 0;
3590                 int char_uuid_len = 0;
3591
3592                 memset(&char_prop, 0x00, sizeof(bt_gatt_char_property_t));
3593
3594                 /* Extract data from DBUS params */
3595                 g_variant_get(parameters, "(i&sn@ayin@ayin@ay)",
3596                                 &result,
3597                                 &address,
3598                                 &svc_uuid_len,
3599                                 &svc_uuid_var,
3600                                 &svc_inst,
3601                                 &char_uuid_len,
3602                                 &char_uuid_var,
3603                                 &char_prop.prop.instance_id,
3604                                 &char_prop.val_len,
3605                                 &data_var);
3606                 g_strlcpy(char_prop.address, address, BT_ADDRESS_STRING_SIZE);
3607
3608                 BT_INFO("GATT Client Char value changed in remote Server [%s]", address);
3609                 BT_INFO("GATT Client Char Val len: [%d]", char_prop.val_len);
3610
3611                 if (char_prop.val_len > 0) {
3612                         /* Copy Data */
3613                         memcpy(&char_prop.value, g_variant_get_data(data_var), char_prop.val_len);
3614                 }
3615
3616                 memcpy(&char_prop.prop.uuid, g_variant_get_data(char_uuid_var), 16);
3617
3618                 /* Copy SVC data */
3619                 memcpy(&char_prop.svc_prop.uuid, g_variant_get_data(svc_uuid_var), 16);
3620                 char_prop.svc_prop.instance_id = svc_inst;
3621
3622                 /* DEBUG */
3623         //      for (i = 0; i < char_prop.val_len; i++)
3624         //              BT_INFO("Data[%d] = [0x%x]", i, char_prop.value[i]);
3625
3626                 _bt_gatt_client_event_cb(BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED,
3627                                 result, &char_prop,
3628                                 event_info->cb, event_info->user_data);
3629         } else if (strcasecmp(signal_name, BT_GATT_CLIENT_READ_CHAR) == 0) { /* Done */
3630                 /* Event: BLUETOOTH_EVENT_GATT_READ_CHAR */
3631                 BT_DBG("GATT Client event[BT_GATT_CLIENT_READ_CHAR]");
3632                 bt_gatt_char_property_t char_prop;
3633                 const char *address = NULL;
3634                 GVariant *data_var = NULL;
3635                 GVariant *svc_uuid_var = NULL;
3636                 int svc_inst = 0;
3637                 GVariant *char_uuid_var = NULL;
3638                 int svc_uuid_len = 0;
3639                 int char_uuid_len = 0;
3640
3641                 memset(&char_prop, 0x00, sizeof(bt_gatt_char_property_t));
3642
3643                 /* Extract data from DBUS params */
3644                 g_variant_get(parameters, "(i&sn@ayin@ayin@ay)",
3645                                 &result,
3646                                 &address,
3647                                 &svc_uuid_len,
3648                                 &svc_uuid_var,
3649                                 &svc_inst,
3650                                 &char_uuid_len,
3651                                 &char_uuid_var,
3652                                 &char_prop.prop.instance_id,
3653                                 &char_prop.val_len,
3654                                 &data_var);
3655                 g_strlcpy(char_prop.address, address, BT_ADDRESS_STRING_SIZE);
3656
3657                 BT_DBG("GATT Client Read Callback from [%s] svc inst [%d] char val len [%d] char inst [%d]",
3658                                 address, svc_inst, char_prop.val_len, char_prop.prop.instance_id);
3659
3660                 if (char_prop.val_len > 0) {
3661                         /* Copy Data */
3662                         memcpy(&char_prop.value, g_variant_get_data(data_var), char_prop.val_len);
3663                 }
3664
3665                 memcpy(&char_prop.prop.uuid, g_variant_get_data(char_uuid_var), 16);
3666
3667                 /* Copy Svc Data */
3668                 memcpy(&char_prop.svc_prop.uuid, g_variant_get_data(svc_uuid_var), 16);
3669                 char_prop.svc_prop.instance_id = svc_inst;
3670
3671                 /* DEBUG */
3672         //      for (i = 0; i < char_prop.val_len; i++)
3673         //              BT_INFO("Data[%d] = [0x%x]", i, char_prop.value[i]);
3674
3675                 _bt_gatt_client_event_cb(BLUETOOTH_EVENT_GATT_READ_CHAR,
3676                                 result, &char_prop,
3677                                 event_info->cb, event_info->user_data);
3678         } else if (strcasecmp(signal_name, BT_GATT_CLIENT_WRITE_CHAR) == 0) { /* Done */
3679                 /* Event: BLUETOOTH_EVENT_GATT_WRITE_CHAR */
3680                 BT_DBG("GATT Client event[BT_GATT_CLIENT_WRITE_CHAR]");
3681                 bt_gatt_char_property_t char_prop;
3682                 const char *address = NULL;
3683                 GVariant *svc_uuid_var = NULL;
3684                 int svc_inst = 0;
3685                 GVariant *char_uuid_var = NULL;
3686                 int svc_uuid_len = 0;
3687                 int char_uuid_len = 0;
3688
3689                 memset(&char_prop, 0x00, sizeof(bt_gatt_char_property_t));
3690
3691                 /* Extract data from DBUS params */
3692                 g_variant_get(parameters, "(i&sn@ayin@ayi)",
3693                                 &result,
3694                                 &address,
3695                                 &svc_uuid_len,
3696                                 &svc_uuid_var,
3697                                 &svc_inst,
3698                                 &char_uuid_len,
3699                                 &char_uuid_var,
3700                                 &char_prop.prop.instance_id);
3701
3702                 g_strlcpy(char_prop.address, address, BT_ADDRESS_STRING_SIZE);
3703
3704                 BT_DBG("GATT Client Char Write Done in remote Server [%s]", address);
3705
3706                 /* Copy Data */
3707                 memcpy(&char_prop.prop.uuid, g_variant_get_data(char_uuid_var), 16);
3708
3709                 /* Copy Svc Data */
3710                 memcpy(&char_prop.svc_prop.uuid, g_variant_get_data(svc_uuid_var), 16);
3711                 char_prop.svc_prop.instance_id = svc_inst;
3712
3713                 _bt_gatt_client_event_cb(BLUETOOTH_EVENT_GATT_WRITE_CHAR,
3714                                 result, &char_prop,
3715                                 event_info->cb, event_info->user_data);
3716         } else if (strcasecmp(signal_name, BT_GATT_CLIENT_READ_DESC) == 0) { /* Done */
3717                 /* Event: BLUETOOTH_EVENT_GATT_READ_DESC */
3718                 BT_DBG("GATT Client event[BT_GATT_CLIENT_READ_DESC]");
3719                 bt_gatt_char_descriptor_property_t desc_prop;
3720                 const char *address = NULL;
3721                 GVariant *data_var = NULL;
3722                 GVariant *svc_uuid_var = NULL;
3723                 int svc_inst = 0;
3724                 GVariant *char_uuid_var = NULL;
3725                 int char_inst = 0;
3726                 GVariant *desc_uuid_var = NULL;
3727                 int svc_uuid_len = 0;
3728                 int char_uuid_len = 0;
3729                 int desc_uuid_len = 0;
3730                 unsigned int i;
3731
3732                 memset(&desc_prop, 0x00, sizeof(bt_gatt_char_descriptor_property_t));
3733
3734                 /* Extract data from DBUS params */
3735                 g_variant_get(parameters, "(i&sn@ayin@ayin@ayin@ay)",
3736                                 &result,
3737                                 &address,
3738                                 &svc_uuid_len,
3739                                 &svc_uuid_var,
3740                                 &svc_inst,
3741                                 &char_uuid_len,
3742                                 &char_uuid_var,
3743                                 &char_inst,
3744                                 &desc_uuid_len,
3745                                 &desc_uuid_var,
3746                                 &desc_prop.prop.instance_id,
3747                                 &desc_prop.val_len,
3748                                 &data_var);
3749                 g_strlcpy(desc_prop.address, address, BT_ADDRESS_STRING_SIZE);
3750
3751                 BT_DBG("GATT Client Read Descriptor Callback from [%s]", address);
3752                 BT_DBG("GATT Client Descriptor Val len: [%d]", desc_prop.val_len);
3753
3754                 /* Copy Data */
3755                 if (desc_prop.val_len > 0) {
3756                         BT_INFO("Get the desc read data");
3757                         memcpy(&desc_prop.value, g_variant_get_data(data_var), desc_prop.val_len);
3758                 }
3759
3760                 memcpy(&desc_prop.prop.uuid, g_variant_get_data(desc_uuid_var), 16);
3761
3762                 /* Copy Char Data */
3763                 memcpy(&desc_prop.char_prop.uuid, g_variant_get_data(char_uuid_var), 16);
3764                 desc_prop.char_prop.instance_id = char_inst;
3765
3766                 /* Copy Svc Data */
3767                 memcpy(&desc_prop.svc_prop.uuid, g_variant_get_data(svc_uuid_var), 16);
3768                 desc_prop.svc_prop.instance_id = svc_inst;
3769
3770                 /* DEBUG */
3771                 for (i = 0; i < desc_prop.val_len; i++)
3772                         BT_INFO("Data[%d] = [0x%x]", i, desc_prop.value[i]);
3773
3774                 _bt_gatt_client_event_cb(BLUETOOTH_EVENT_GATT_READ_DESC,
3775                                 result, &desc_prop,
3776                                 event_info->cb, event_info->user_data);
3777         } else if (strcasecmp(signal_name, BT_GATT_CLIENT_WRITE_DESC) == 0) { /* Done */
3778                 /* Event: BLUETOOTH_EVENT_GATT_WRITE_DESC */
3779                 BT_DBG("GATT Client event[BT_GATT_CLIENT_WRITE_DESC]");
3780                 bt_gatt_char_descriptor_property_t desc_prop;
3781                 const char *address = NULL;
3782                 GVariant *svc_uuid_var = NULL;
3783                 int svc_inst = 0;
3784                 GVariant *char_uuid_var = NULL;
3785                 int char_inst;
3786                 GVariant *desc_uuid_var = NULL;
3787                 int svc_uuid_len = 0;
3788                 int char_uuid_len = 0;
3789                 int desc_uuid_len = 0;
3790
3791                 memset(&desc_prop, 0x00, sizeof(bt_gatt_char_descriptor_property_t));
3792
3793                 /* Extract data from DBUS params */
3794                 g_variant_get(parameters, "(i&sn@ayin@ayin@ayi)",
3795                                 &result,
3796                                 &address,
3797                                 &svc_uuid_len,
3798                                 &svc_uuid_var,
3799                                 &svc_inst,
3800                                 &char_uuid_len,
3801                                 &char_uuid_var,
3802                                 &char_inst,
3803                                 &desc_uuid_len,
3804                                 &desc_uuid_var,
3805                                 &desc_prop.prop.instance_id);
3806
3807                 g_strlcpy(desc_prop.address, address, BT_ADDRESS_STRING_SIZE);
3808
3809                 BT_INFO("GATT Client Write Descriptor Callback from [%s]", address);
3810                 BT_INFO("GATT Client Descriptor Val len: [%d]", desc_prop.val_len);
3811
3812                 /* Copy Data */
3813                 memcpy(&desc_prop.prop.uuid, g_variant_get_data(desc_uuid_var), 16);
3814
3815                 /* Copy Char Data */
3816                 memcpy(&desc_prop.char_prop.uuid, g_variant_get_data(char_uuid_var), 16);
3817                 desc_prop.char_prop.instance_id = char_inst;
3818
3819                 /* Copy Svc Data */
3820                 memcpy(&desc_prop.svc_prop.uuid, g_variant_get_data(svc_uuid_var), 16);
3821                 desc_prop.svc_prop.instance_id = svc_inst;
3822
3823                 _bt_gatt_client_event_cb(BLUETOOTH_EVENT_GATT_WRITE_DESC,
3824                                 result, &desc_prop,
3825                                 event_info->cb, event_info->user_data);
3826         } else if (strcasecmp(signal_name, BT_GATT_CLIENT_SERVICE_CHANGED) == 0) {
3827                 BT_DBG("GATT Client event[BT_GATT_CLIENT_SERVICE_CHANGED]");
3828                 bt_gatt_service_change_t change = {0, };
3829                 char *address_str = NULL;
3830                 char *name = NULL;
3831
3832                 g_variant_get(parameters, "(i&s&s)", &change.change_type, &address_str, &change.uuid);
3833
3834                 _bt_convert_addr_string_to_type(change.device_addr.addr, address_str);
3835                 bluetooth_get_uuid_name(change.uuid, &name);
3836                 BT_INFO(" ### GATT Service %s [%s]", change.change_type ? "Added" : "Removed", name);
3837                 g_free(name);
3838
3839                 if (_bluetooth_gatt_check_service_change_watcher_address(&change.device_addr) == FALSE) {
3840                         BT_INFO("No watcher for %s", address_str);
3841                         return;
3842                 }
3843
3844                 _bt_gatt_client_event_cb(BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED,
3845                                 BLUETOOTH_ERROR_NONE, &change,
3846                                 event_info->cb, event_info->user_data);
3847         }
3848 }
3849
3850 #endif
3851
3852
3853 #ifndef GATT_DIRECT
3854 static void __bt_gatt_server_event_filter(GDBusConnection *connection,
3855                 const gchar *sender_name,
3856                 const gchar *object_path,
3857                 const gchar *interface_name,
3858                 const gchar *signal_name,
3859                 GVariant *parameters,
3860                 gpointer user_data)
3861 {
3862         BT_INFO("GATT Server event handler Entry >>");
3863
3864         bt_event_info_t *event_info;
3865         int result = BLUETOOTH_ERROR_NONE;
3866
3867         event_info = (bt_event_info_t *)user_data;
3868         ret_if(event_info == NULL);
3869 #ifdef TIZEN_GATT_CLIENT
3870         if (strcasecmp(signal_name, BT_GATT_VALUE_CHANGED) == 0) {
3871 #else
3872         if (strcasecmp(signal_name, BT_GATT_CONNECTED) == 0) {
3873                 const char *address = NULL;
3874                 bluetooth_device_address_t dev_address = { {0} };
3875                 BT_DBG("BT_GATT_CONNECTED");
3876                 g_variant_get(parameters, "(i&s)", &result, &address);
3877
3878                 _bt_convert_addr_string_to_type(dev_address.addr, address);
3879                 _bt_gatt_server_event_cb(BLUETOOTH_EVENT_GATT_CONNECTED,
3880                                 result, &dev_address,
3881                                 event_info->cb, event_info->user_data);
3882         } else if (strcasecmp(signal_name, BT_GATT_DISCONNECTED) == 0) {
3883                 const char *address = NULL;
3884                 bluetooth_device_address_t dev_address = { {0} };
3885                 BT_DBG("BT_GATT_DISCONNECTED");
3886                 g_variant_get(parameters, "(i&s)", &result, &address);
3887
3888                 _bt_convert_addr_string_to_type(dev_address.addr, address);
3889                 _bt_gatt_server_event_cb(BLUETOOTH_EVENT_GATT_DISCONNECTED,
3890                                 result, &dev_address,
3891                                 event_info->cb, event_info->user_data);
3892         } else if (strcasecmp(signal_name, BT_GATT_VALUE_CHANGED) == 0) {
3893 #endif
3894                 BT_INFO("GATT Server event[BT_GATT_SERVER_WRITE_REQUESTED]");
3895                 const char *address = NULL;
3896                 GVariant *data_var = NULL;
3897                 int i;
3898                 bluetooth_device_address_t dev_address = { {0} };
3899
3900                 bluetooth_gatt_server_write_requested_info_t write_info;
3901                 memset(&write_info, 0x00, sizeof(bluetooth_gatt_server_write_requested_info_t));
3902
3903                 /* Extract data from DBUS params */
3904                 g_variant_get(parameters, "(iiiiiibb&sn@ay)",
3905                                 &result,
3906                                 &write_info.connection_id,
3907                                 &write_info.request_id,
3908                                 &write_info.attribute_handle,
3909                                 &write_info.offset,
3910                                 &write_info.length,
3911                                 &write_info.need_resp,
3912                                 &write_info.is_prep_write,
3913                                 &address,
3914                                 &write_info.length,
3915                                 &data_var);
3916
3917                 _bt_convert_addr_string_to_type(dev_address.addr,
3918                                 address);
3919
3920                 BT_DBG("GATT Server Write From Remote Client [%s]", address);
3921                 BT_DBG("GATT Server Write len: [%d]", write_info.length);
3922                 BT_DBG("GATT Server Conn ID:   [%d]", write_info.connection_id);
3923                 BT_DBG("GATT Server Req ID:    [%d]", write_info.request_id);
3924                 BT_DBG("GATT Server att handle:[%d]", write_info.attribute_handle);
3925                 BT_DBG("GATT Server Offset:    [%d]", write_info.offset);
3926                 BT_DBG("GATT Server Need Resp: [%d]", write_info.need_resp);
3927                 BT_DBG("GATT Server Is Prep:   [%d]", write_info.is_prep_write);
3928
3929                 /* Copy Data */
3930                 memcpy(&write_info.data.data, g_variant_get_data(data_var), write_info.length);
3931
3932                 memcpy(write_info.device_address.addr,
3933                                 dev_address.addr,
3934                                 BLUETOOTH_ADDRESS_LENGTH);
3935
3936                 /* DEBUG */
3937                 for (i = 0; i < write_info.length; i++)
3938                         BT_DBG("Data[%d] = [0x%x]", i, write_info.data.data[i]);
3939
3940                 _bt_gatt_server_event_cb(BLUETOOTH_EVENT_GATT_SERVER_VALUE_CHANGED,
3941                                 BLUETOOTH_ERROR_NONE, &write_info,
3942                                 event_info->cb, event_info->user_data);
3943         } else if (strcasecmp(signal_name, BT_GATT_SERVER_READ_REQ) == 0) {
3944                 const char *address = NULL;
3945                 bluetooth_device_address_t dev_address = { {0} };
3946                 bluetooth_gatt_server_read_requested_info_t read_info;
3947
3948                 memset(&read_info, 0x00, sizeof(bluetooth_gatt_server_read_requested_info_t));
3949
3950                 /* Extract data from DBUS params */
3951                 g_variant_get(parameters, "(iiiiib&s)", &result,
3952                                 &read_info.connection_id, &read_info.request_id,
3953                                 &read_info.attribute_handle, &read_info.offset,
3954                                 &read_info.is_long, &address);
3955
3956                 _bt_convert_addr_string_to_type(dev_address.addr,
3957                                 address);
3958                 /* Copy Data */
3959                 memcpy(read_info.device_address.addr,
3960                                 dev_address.addr,
3961                                 BLUETOOTH_ADDRESS_LENGTH);
3962
3963                 _bt_gatt_server_event_cb(BLUETOOTH_EVENT_GATT_SERVER_READ_REQUESTED,
3964                                 result, &read_info,
3965                                 event_info->cb, event_info->user_data);
3966         } else if (strcasecmp(signal_name, BT_GATT_SERVER_ACQUIRE_WRITE) == 0) {
3967
3968                 bluetooth_gatt_server_send_acquire_write_response(parameters);
3969
3970         } else if (strcasecmp(signal_name, BT_GATT_SERVER_ACQUIRE_NOTIFICATION) == 0) {
3971
3972                 bluetooth_gatt_server_send_acquire_notify_response(parameters, event_info);
3973
3974         }  else if (strcasecmp(signal_name, BT_GATT_SERVER_NOTIFICATION_COMPLETED) == 0) {
3975                 const char *address = NULL;
3976                 bluetooth_device_address_t dev_address = { {0} };
3977                 bluetooth_gatt_server_indicate_confirmed_info_t info;
3978                 memset(&info, 0x00, sizeof(bluetooth_gatt_server_indicate_confirmed_info_t));
3979
3980                 BT_INFO("GATT Server event[BT_GATT_SERVER_NOTIFICATION_COMPLETED]");
3981                 /* Extract data from DBUS params */
3982                 g_variant_get(parameters, "(i&sib)", &result, &address, &info.handle, &info.completed);
3983
3984                 _bt_convert_addr_string_to_type(dev_address.addr,
3985                                 address);
3986                 /* Copy Data */
3987                 memcpy(info.device_address.addr,
3988                                 dev_address.addr,
3989                                 BLUETOOTH_ADDRESS_LENGTH);
3990
3991                 BT_INFO("GATT Server: Indicate confirmed Handle: [%d] address [%s] completed [%d] result [%d]",
3992                                 info.handle, address, info.completed, result);
3993
3994
3995                 _bt_gatt_server_event_cb(BLUETOOTH_EVENT_GATT_SERVER_NOTIFICATION_COMPLETED,
3996                                 result, &info,
3997                                 event_info->cb, event_info->user_data);
3998         } else if (strcasecmp(signal_name, BT_GATT_SERVER_NOTIFICATION_CHANGED) == 0) {
3999                 const char *address = NULL;
4000                 bluetooth_device_address_t dev_address = { {0} };
4001                 bluetooth_gatt_server_notification_changed_t info;
4002                 memset(&info, 0x00, sizeof(bluetooth_gatt_server_notification_changed_t));
4003
4004                 BT_INFO("GATT Server event[BT_GATT_SERVER_NOTIFICATION_CHANGED]");
4005                 /* Extract data from DBUS params */
4006                 g_variant_get(parameters, "(i&sib)", &result, &address, &info.handle, &info.notification);
4007
4008                 _bt_convert_addr_string_to_type(dev_address.addr,
4009                                 address);
4010                 /* Copy Data */
4011                 memcpy(info.device_address.addr,
4012                                 dev_address.addr,
4013                                 BLUETOOTH_ADDRESS_LENGTH);
4014
4015                 BT_INFO("GATT Server: Notification Enabled?? Handle: [%d] address [%s] Is Enabled [%d] result [%d]",
4016                                 info.handle, address, info.notification, result);
4017
4018                 if (info.notification == FALSE)
4019                         cleanup_gatt_acquire_fd(info.handle);
4020
4021                 _bt_gatt_server_event_cb(BLUETOOTH_EVENT_GATT_SERVER_NOTIFICATION_STATE_CHANGED,
4022                                 result, &info,
4023                                 event_info->cb, event_info->user_data);
4024         } else if (strcasecmp(signal_name, BT_GATT_SERVER_ATT_MTU_CHANGED) == 0) {
4025                 const char *address = NULL;
4026                 bluetooth_device_address_t dev_address = { {0} };
4027                 bluetooth_le_att_mtu_info_t att_mtu_info;
4028                 guint16 mtu;
4029                 guint8 status;
4030                 BT_DBG("BT_GATT_SERVER_ATT_MTU_CHANGED");
4031                 g_variant_get(parameters, "(i&sqy)", &result, &address, &mtu, &status);
4032
4033                 _bt_convert_addr_string_to_type(dev_address.addr, address);
4034
4035                 memset(&att_mtu_info, 0x00, sizeof(bluetooth_le_att_mtu_info_t));
4036                 memcpy(att_mtu_info.device_address.addr,
4037                                         dev_address.addr,
4038                                         BLUETOOTH_ADDRESS_LENGTH);
4039
4040                 att_mtu_info.mtu = mtu;
4041                 att_mtu_info.status = status;
4042
4043                 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_SERVER_ATT_MTU_CHANGED,
4044                                 result, &att_mtu_info,
4045                                 event_info->cb, event_info->user_data);
4046         }
4047
4048
4049         BT_INFO("GATT Server event handler Exit <<");
4050 }
4051 #endif
4052
4053 int _bt_register_event(int event_type, void *event_cb, void *user_data)
4054 {
4055         GDBusConnection *connection_type;
4056         GDBusSignalCallback event_func;
4057         bt_event_info_t *cb_data;
4058         const char *path;
4059         const char *interface = BT_EVENT_SERVICE;
4060
4061         if (is_initialized == FALSE)
4062                 _bt_init_event_handler();
4063
4064         if (__bt_event_is_registered(event_type) == TRUE) {
4065                 BT_ERR("The event is already registed");
4066                 return BLUETOOTH_ERROR_ALREADY_INITIALIZED;
4067         }
4068
4069         switch (event_type) {
4070         case BT_ADAPTER_EVENT:
4071                 event_func = __bt_adapter_event_filter;
4072                 path = BT_ADAPTER_PATH;
4073                 break;
4074         case BT_LE_ADAPTER_EVENT:
4075                 event_func = __bt_adapter_le_event_filter;
4076                 path = BT_LE_ADAPTER_PATH;
4077                 break;
4078         case BT_DEVICE_EVENT:
4079                 event_func = __bt_device_event_filter;
4080                 path = BT_DEVICE_PATH;
4081                 break;
4082         case BT_HID_EVENT:
4083                 event_func = __bt_hid_event_filter;
4084                 path = BT_HID_PATH;
4085                 break;
4086         case BT_HEADSET_EVENT:
4087                 event_func = __bt_headset_event_filter;
4088                 path = BT_HEADSET_PATH;
4089                 break;
4090         case BT_NETWORK_EVENT:
4091                 event_func = __bt_network_event_filter;
4092                 path = BT_NETWORK_PATH;
4093                 break;
4094         case BT_AVRCP_EVENT:
4095                 event_func = __bt_avrcp_event_filter;
4096                 path = BT_AVRCP_PATH;
4097                 break;
4098         case BT_AVRCP_CONTROL_EVENT:
4099                 event_func = __bt_avrcp_control_event_filter;
4100                 path = BT_AVRCP_CONTROL_PATH;
4101                 break;
4102         case BT_OPP_CLIENT_EVENT:
4103                 event_func = __bt_opp_client_event_filter;
4104                 path = BT_OPP_CLIENT_PATH;
4105                 break;
4106         case BT_OPP_SERVER_EVENT:
4107                 event_func = __bt_opp_server_event_filter;
4108                 path = BT_OPP_SERVER_PATH;
4109                 break;
4110         case BT_MAP_CLIENT_EVENT:
4111                 event_func = __bt_map_client_event_filter;
4112                 path = BT_MAP_CLIENT_PATH;
4113                 break;
4114         case BT_PBAP_CLIENT_EVENT:
4115                 event_func = __bt_pbap_client_event_filter;
4116                 path = BT_PBAP_CLIENT_PATH;
4117                 break;
4118         case BT_RFCOMM_CLIENT_EVENT:
4119                 event_func = __bt_rfcomm_client_event_filter;
4120                 path = BT_RFCOMM_CLIENT_PATH;
4121                 break;
4122         case BT_RFCOMM_SERVER_EVENT:
4123                 event_func = __bt_rfcomm_server_event_filter;
4124                 path = BT_RFCOMM_SERVER_PATH;
4125                 break;
4126         case BT_HF_AGENT_EVENT:
4127                 BT_DBG("BT_HF_AGENT_EVENT\n");
4128                 event_func = __bt_hf_agent_event_filter;
4129                 path = BT_HF_AGENT_PATH;
4130                 interface = BT_HF_SERVICE_INTERFACE;
4131                 break;
4132         case BT_A2DP_SOURCE_EVENT:
4133                 BT_DBG("BT_A2DP_SOURCE_EVENT");
4134                 event_func = __bt_a2dp_source_event_filter;
4135                 path = BT_A2DP_SOURCE_PATH;
4136                 break;
4137         case BT_HID_DEVICE_EVENT:
4138                 BT_DBG("BT_HID_DEVICE_EVENT");
4139                 event_func = __bt_hid_device_event_filter;
4140                 path = BT_HID_DEVICE_PATH;
4141                 break;
4142 #ifdef GATT_NO_RELAY
4143         case BT_GATT_BLUEZ_EVENT:
4144                 BT_DBG("BT_GATT_BLUEZ_EVENT");
4145                 event_func = __bt_device_event_filter;
4146                 interface = BT_GATT_CHARACTERISTIC_INTERFACE;
4147                 path = NULL;
4148                 break;
4149 #endif
4150         case BT_TDS_EVENT:
4151                 BT_DBG("BT_TDS_EVENT");
4152                 event_func = __bt_tds_event_filter;
4153                 path = BT_TDS_PATH;
4154                 break;
4155         case BT_OTP_EVENT:
4156                 BT_DBG("BT_OTP_EVENT");
4157                 event_func = __bt_otp_event_filter;
4158                 path = BT_OTP_PATH;
4159                 break;
4160         case BT_HDP_EVENT:
4161                 BT_DBG("BT_HDP_EVENT");
4162                 event_func = __bt_hdp_event_filter;
4163                 path = BT_HDP_DEVICE_PATH;
4164                 break;
4165 #ifndef GATT_DIRECT
4166         case BT_GATT_SERVER_EVENT:
4167                 event_func = __bt_gatt_server_event_filter;
4168                 path = BT_GATT_SERVER_PATH;
4169                 break;
4170 #endif
4171
4172 #ifdef TIZEN_GATT_CLIENT
4173         case BT_GATT_CLIENT_EVENT:
4174                 event_func = __bt_gatt_client_event_filter;
4175                 path = BT_GATT_CLIENT_PATH;
4176                 break;
4177 #endif
4178         default:
4179                 BT_ERR("Unknown event");
4180                 return BLUETOOTH_ERROR_INTERNAL;
4181         }
4182
4183         connection_type = _bt_get_system_private_conn();
4184         if (connection_type == NULL)
4185                 return BLUETOOTH_ERROR_INTERNAL;
4186
4187         cb_data = g_new0(bt_event_info_t, 1);
4188
4189         cb_data->event_type = event_type;
4190         cb_data->cb = event_cb;
4191         cb_data->user_data = user_data;
4192
4193         cb_data->id = g_dbus_connection_signal_subscribe(connection_type,
4194                                 NULL, interface, NULL, path, NULL, 0,
4195                                 event_func, cb_data, NULL);
4196
4197         event_list = g_slist_append(event_list, cb_data);
4198
4199         return BLUETOOTH_ERROR_NONE;
4200 }
4201
4202 int _bt_unregister_event(int event_type)
4203 {
4204         GDBusConnection *connection_type;
4205         bt_event_info_t *cb_data;
4206
4207         if (is_initialized == FALSE) {
4208                 BT_ERR("Event is not registered");
4209                 return BLUETOOTH_ERROR_NOT_INITIALIZED;
4210         }
4211
4212         if (__bt_event_is_registered(event_type) == FALSE) {
4213                 BT_ERR("Not registered event");
4214                 return BLUETOOTH_ERROR_INTERNAL;
4215         }
4216
4217         cb_data = _bt_event_get_cb_data(event_type);
4218
4219         if (cb_data == NULL) {
4220                 BT_ERR("No matched event data");
4221                 return BLUETOOTH_ERROR_INTERNAL;
4222         }
4223
4224         connection_type = _bt_get_system_private_conn();
4225
4226         event_list = g_slist_remove(event_list, (void *)cb_data);
4227
4228         retv_if(connection_type == NULL, BLUETOOTH_ERROR_INTERNAL);
4229
4230         g_dbus_connection_signal_unsubscribe(connection_type, cb_data->id);
4231
4232         __bt_event_data_free((void *)cb_data);
4233
4234         return BLUETOOTH_ERROR_NONE;
4235 }
4236
4237 static void __bt_name_owner_changed(GDBusConnection *connection,
4238                                                  const gchar *sender_name,
4239                                                  const gchar *object_path,
4240                                                  const gchar *interface_name,
4241                                                  const gchar *signal_name,
4242                                                  GVariant *parameters,
4243                                                  gpointer user_data)
4244 {
4245         const char *name = NULL;
4246         const char *old_owner = NULL;
4247         const char *new_owner = NULL;
4248         bt_event_info_t *event_info;
4249
4250         g_variant_get(parameters, "(&s&s&s)", &name, &old_owner, &new_owner);
4251
4252         if (g_strcmp0(name, BT_DBUS_NAME) == 0 &&
4253                         (new_owner != NULL && *new_owner == '\0')) {
4254                 BT_DBG("bt-service is terminated");
4255                 event_info = _bt_event_get_cb_data(BT_ADAPTER_EVENT);
4256                 if (event_info == NULL)
4257                         return;
4258
4259                 if (disable_timer_id > 0)
4260                         g_source_remove(disable_timer_id);
4261
4262                 disable_timer_id = g_timeout_add(BT_RELIABLE_DISABLE_TIME,
4263                                 (GSourceFunc)__bt_reliable_disable_cb,
4264                                 event_info);
4265         }
4266 }
4267
4268 void _bt_register_name_owner_changed(void)
4269 {
4270         GDBusConnection *connection_type;
4271
4272         connection_type = _bt_get_system_private_conn();
4273         if (connection_type == NULL) {
4274                 BT_ERR("Unable to get the bus");
4275                 return;
4276         }
4277         owner_sig_id = g_dbus_connection_signal_subscribe(connection_type,
4278                                 NULL, BT_EVENT_FREEDESKTOP,
4279                                 BT_NAME_OWNER_CHANGED, NULL, NULL, 0,
4280                                 __bt_name_owner_changed, NULL, NULL);
4281 }
4282
4283 void _bt_unregister_name_owner_changed(void)
4284 {
4285         GDBusConnection *connection_type;
4286
4287         connection_type = _bt_get_system_private_conn();
4288         if (connection_type != NULL && owner_sig_id > 0) {
4289                 g_dbus_connection_signal_unsubscribe(connection_type,
4290                                                         owner_sig_id);
4291                 owner_sig_id = 0;
4292         }
4293 }
4294
4295 static void __bt_gatt_get_uuid_from_path(char *path, char **service_uuid)
4296 {
4297         GDBusProxy *proxy = NULL;
4298         GError *err = NULL;
4299         GDBusConnection *g_conn;
4300         GVariant *ret = NULL;
4301         GVariant *value = NULL;
4302
4303         g_conn = _bt_get_system_private_conn();
4304         ret_if(g_conn == NULL);
4305
4306         proxy = g_dbus_proxy_new_sync(g_conn,
4307                                 G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, NULL,
4308                                 BT_BLUEZ_NAME,
4309                                 path,
4310                                 BT_PROPERTIES_INTERFACE,
4311                                 NULL, &err);
4312
4313         ret_if(proxy == NULL);
4314
4315         ret = g_dbus_proxy_call_sync(proxy, "Get",
4316                         g_variant_new("(ss)", GATT_SERV_INTERFACE, "UUID"),
4317                         G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
4318         if (err) {
4319                 BT_ERR("DBus Error : %s", err->message);
4320                 g_clear_error(&err);
4321         } else {
4322                 g_variant_get(ret, "(v)", &value);
4323                 *service_uuid = g_variant_dup_string(value, NULL);
4324                 g_variant_unref(value);
4325                 g_variant_unref(ret);
4326         }
4327
4328         if (proxy)
4329                 g_object_unref(proxy);
4330
4331         return;
4332 }
4333
4334
4335 static void __bt_manager_event_filter(GDBusConnection *connection,
4336                                         const gchar *sender_name,
4337                                         const gchar *object_path,
4338                                         const gchar *interface_name,
4339                                         const gchar *signal_name,
4340                                         GVariant *parameters,
4341                                         gpointer user_data)
4342 {
4343         char *path = NULL;
4344         GVariantIter *interface_iter = NULL;
4345         char *interface_str = NULL;
4346         bt_gatt_service_change_t change;
4347         char secure_address[BT_ADDRESS_STRING_SIZE] = { 0 };
4348         bt_user_info_t *user_info = NULL;
4349
4350         user_info = _bt_get_user_data(BT_COMMON);
4351         if (user_info == NULL) {
4352                 BT_ERR("There is no registered common event callback");
4353                 return;
4354         }
4355
4356         if (strcasecmp(signal_name, "GattServiceAdded") == 0) {
4357                 g_variant_get(parameters, "(&s)", &path);
4358
4359                 _bt_convert_device_path_to_addr_type(path, change.device_addr.addr);
4360                 _bt_convert_addr_type_to_secure_string(secure_address,
4361                                                        change.device_addr.addr);
4362
4363                 if (_bluetooth_gatt_check_service_change_watcher_address(&change.device_addr)
4364                         == FALSE) {
4365                         BT_INFO("GATT Service [%s] added, but no watcher for %s",
4366                                                         path, secure_address);
4367                         return;
4368                 } else {
4369                         char *uuid = NULL;
4370                         char *name = NULL;
4371                         __bt_gatt_get_uuid_from_path(path, &uuid);
4372                         bluetooth_get_uuid_name(uuid, &name);
4373
4374                         BT_INFO(" ### GATT Service added [%s] [%s]",
4375                                                         path, name);
4376                         g_free(name);
4377                         g_free(uuid);
4378                 }
4379
4380                 change.svc_path = g_strdup(path);
4381                 change.change_type = BLUETOOTH_GATT_SERVICE_CHANGE_TYPE_ADD;
4382                 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED,
4383                                     BLUETOOTH_ERROR_NONE, &change,
4384                                     user_info->cb, user_info->user_data);
4385                 g_free(change.svc_path);
4386         } else if (strcasecmp(signal_name, "InterfacesRemoved") == 0) {
4387                 g_variant_get(parameters, "(&oas)", &path, &interface_iter);
4388                 if (!path) {
4389                         BT_ERR("Invalid adapter path");
4390                         g_variant_iter_free(interface_iter);
4391                         return;
4392                 }
4393
4394                 _bt_convert_device_path_to_addr_type(path, change.device_addr.addr);
4395                 if (!_bluetooth_gatt_check_service_change_watcher_address(&change.device_addr)) {
4396                         g_variant_iter_free(interface_iter);
4397                         return;
4398                 }
4399
4400                 while (g_variant_iter_loop(interface_iter, "&s", &interface_str)) {
4401                         if (g_strcmp0(interface_str, GATT_SERV_INTERFACE) != 0)
4402                                 continue;
4403
4404                         BT_INFO(" ### GATT Service removed [%s]", path);
4405
4406                         change.svc_path = g_strdup(path);
4407                         change.change_type = BLUETOOTH_GATT_SERVICE_CHANGE_TYPE_REMOVE;
4408                         _bt_common_event_cb(
4409                                         BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED,
4410                                         BLUETOOTH_ERROR_NONE, &change,
4411                                         user_info->cb, user_info->user_data);
4412                         g_free(change.svc_path);
4413                         break;
4414                 }
4415                 g_variant_iter_free(interface_iter);
4416         }
4417 }
4418
4419 int _bt_register_manager_subscribe_signal(gboolean subscribe)
4420 {
4421         GDBusConnection *g_conn;
4422         static guint service_added_id = 0;
4423         static guint interface_removed_id = 0;
4424
4425         g_conn = _bt_get_system_private_conn();
4426         if (g_conn == NULL)
4427                 return BLUETOOTH_ERROR_INTERNAL;
4428
4429         if (subscribe == TRUE) {
4430                 if (service_added_id == 0) {
4431                         service_added_id = g_dbus_connection_signal_subscribe(g_conn,
4432                                         NULL, GATT_SERV_INTERFACE,
4433                                         "GattServiceAdded", NULL, NULL, 0,
4434                                         __bt_manager_event_filter,
4435                                         NULL, NULL);
4436                 }
4437                 if (interface_removed_id == 0) {
4438                         interface_removed_id = g_dbus_connection_signal_subscribe(g_conn,
4439                                         NULL, BT_MANAGER_INTERFACE,
4440                                         "InterfacesRemoved", NULL, NULL, 0,
4441                                         __bt_manager_event_filter,
4442                                         NULL, NULL);
4443                 }
4444         } else {
4445                 if (service_added_id > 0) {
4446                         g_dbus_connection_signal_unsubscribe(g_conn,
4447                                         service_added_id);
4448                         service_added_id = 0;
4449                 }
4450                 if (interface_removed_id > 0) {
4451                         g_dbus_connection_signal_unsubscribe(g_conn,
4452                                         interface_removed_id);
4453                         interface_removed_id = 0;
4454                 }
4455         }
4456
4457         return BLUETOOTH_ERROR_NONE;
4458 }
4459