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