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