2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
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"
29 #include "bt-common.h"
30 #include "bt-event-handler.h"
31 #include "bt-gatt-client.h"
32 #include "bt-request-sender.h"
34 #define PROFILE_SUPPORTED 0x3 /* This corresponds to binary 0b11*/
35 #define BT_RELIABLE_DISABLE_TIME 300 /* 300 ms */
45 static int obex_server_id;
46 static guint disable_timer_id;
47 static gboolean is_initialized;
48 static GSList *sending_list = NULL;
49 static GSList *server_list = NULL;
50 static GSList *event_list = NULL;
51 static int owner_sig_id = -1;
53 void _bt_add_push_request_id(int request_id)
55 bt_sending_info_t *info;
57 info = g_new0(bt_sending_info_t, 1);
58 info->request_id = request_id;
60 sending_list = g_slist_append(sending_list, info);
63 static gboolean __bt_is_request_id_exist(int request_id)
66 bt_sending_info_t *info;
68 for (l = sending_list; l != NULL; l = g_slist_next(l)) {
73 if (info->request_id == request_id)
80 static void __bt_remove_push_request_id(int request_id)
83 bt_sending_info_t *info;
85 for (l = sending_list; l != NULL; l = g_slist_next(l)) {
90 BT_DBG("info->request_id = %d\n", info->request_id);
91 BT_DBG("request_id = %d\n", request_id);
92 if (info->request_id == request_id) {
93 sending_list = g_slist_remove(sending_list, (void *)info);
100 static void __bt_remove_all_push_request_id(void)
103 bt_sending_info_t *info;
105 for (l = sending_list; l != NULL; l = g_slist_next(l)) {
110 g_slist_free(sending_list);
114 static void __bt_remove_all_server(void)
117 bt_server_info_t *info;
119 for (l = server_list; l != NULL; l = g_slist_next(l)) {
124 g_slist_free(server_list);
128 static gboolean __bt_is_server_exist(int server_fd)
131 bt_server_info_t *info;
133 for (l = server_list; l != NULL; l = g_slist_next(l)) {
138 retv_if(info->server_fd == server_fd, TRUE);
144 static void __bt_get_uuid_info(bluetooth_device_info_t *dev_info,
151 ret_if(dev_info == NULL);
152 ret_if(uuids == NULL);
153 ret_if(uuid_count <= 0);
155 dev_info->service_index = uuid_count;
157 for (i = 0; i < uuid_count && uuids[i] != NULL; i++) {
158 g_strlcpy(dev_info->uuids[i], uuids[i], BLUETOOTH_UUID_STRING_MAX);
160 parts = g_strsplit(uuids[i], "-", -1);
162 if (parts == NULL || parts[0] == NULL) {
167 dev_info->service_list_array[i] = g_ascii_strtoull(parts[0], NULL, 16);
171 static int __bt_call_list_create(bt_hf_call_list_s **list)
173 bt_hf_call_list_s *handle;
176 BT_DBG("Already Initialized");
177 return BLUETOOTH_ERROR_NONE;
179 handle = g_malloc0(sizeof(bt_hf_call_list_s));
181 return BLUETOOTH_ERROR_NONE;
184 static int __bt_call_list_reset(bt_hf_call_list_s *list)
186 bt_hf_call_list_s *handle;
187 bt_hf_call_status_info_t *call_status;
190 BT_ERR("invalid parameter");
191 return BLUETOOTH_ERROR_INVALID_PARAM;
193 handle = (bt_hf_call_list_s *)list;
195 call_status = (bt_hf_call_status_info_t *)g_list_nth_data(handle->list, 0);
196 if (call_status == NULL)
198 handle->list = g_list_remove(handle->list, call_status);
199 g_free(call_status->number);
202 return BLUETOOTH_ERROR_NONE;
205 static int __bt_call_list_destroy(bt_hf_call_list_s *list)
208 bt_hf_call_list_s *handle;
211 BT_ERR("invalid parameter");
212 return BLUETOOTH_ERROR_INVALID_PARAM;
214 handle = (bt_hf_call_list_s *)list;
215 result = __bt_call_list_reset(list);
219 static int __bt_call_list_add(bt_hf_call_list_s *list, char * number,
220 int dir, int status, int mpart, int idx)
222 bt_hf_call_list_s *handle;
223 bt_hf_call_status_info_t *call_status;
226 BT_ERR("invalid parameter");
227 return BLUETOOTH_ERROR_INVALID_PARAM;
229 handle = (bt_hf_call_list_s *)list;
230 call_status = g_malloc0(sizeof(bt_hf_call_status_info_t));
231 call_status->number = g_strdup(number);
232 call_status->direction = dir;
233 call_status->status = status;
234 call_status->mpart = mpart;
235 call_status->idx = idx;
236 handle->list = g_list_append(handle->list, (gpointer)call_status);
237 return BLUETOOTH_ERROR_NONE;
240 static bluetooth_device_info_t *__bt_get_device_info_in_message(GVariant *parameters, int *ret)
242 bluetooth_device_info_t *dev_info;
243 const char *address = NULL;
244 const char *name = NULL;
245 gchar **uuids = NULL;
246 unsigned int dev_class = 0;
248 gboolean paired = FALSE;
250 gboolean trust = FALSE;
252 int result = BLUETOOTH_ERROR_NONE;
253 GVariant *string_var;
255 int manufacturer_data_len = 0;
256 GVariant *manufacturer_var = NULL;
257 const char *manufacturer_data = NULL;
259 g_variant_get(parameters, "(isunsbub@asn@ay)", &result, &address,
260 &dev_class, &rssi, &name, &paired,
261 &connected, &trust, &string_var, &manufacturer_data_len, &manufacturer_var);
263 if (string_var == NULL) {
264 BT_ERR("invalid parameters in signal");
268 uuids = (gchar **)g_variant_get_strv(string_var, &uuid_count);
270 len = g_variant_get_size(manufacturer_var);
272 manufacturer_data = (char *)g_variant_get_data(manufacturer_var);
274 dev_info = g_malloc0(sizeof(bluetooth_device_info_t));
275 dev_info->rssi = rssi;
276 dev_info->paired = paired;
277 dev_info->connected = connected;
278 dev_info->trust = trust;
280 g_strlcpy(dev_info->device_name.name, name,
281 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
283 _bt_divide_device_class(&dev_info->device_class, dev_class);
285 _bt_convert_addr_string_to_type(dev_info->device_address.addr,
289 __bt_get_uuid_info(dev_info, uuids, uuid_count);
291 if (manufacturer_data_len > BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX) {
292 BT_ERR("manufacturer_data_len is too long(len = %d)", manufacturer_data_len);
293 manufacturer_data_len = BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX;
295 dev_info->manufacturer_data.data_len = manufacturer_data_len;
296 if (manufacturer_data)
297 for (i = 0; i < manufacturer_data_len; i++)
298 dev_info->manufacturer_data.data[i] = manufacturer_data[i];
301 g_variant_unref(string_var);
302 g_variant_unref(manufacturer_var);
306 static bluetooth_le_device_info_t *__bt_get_le_device_info_in_message(GVariant *parameters, int *ret)
308 bluetooth_le_device_info_t *le_dev_info;
309 const char *address = NULL;
314 int adv_data_len = 0;
315 GVariant *adv_var = NULL;
316 const char *adv_data = NULL;
317 int scan_data_len = 0;
318 GVariant *scan_var = NULL;
319 const char *scan_data = NULL;
320 int result = BLUETOOTH_ERROR_NONE;
322 g_variant_get(parameters, "(i&snnn@ayn@ay)", &result, &address,
323 &addr_type, &rssi, &adv_data_len, &adv_var, &scan_data_len, &scan_var);
325 len = g_variant_get_size(adv_var);
327 adv_data = (char *)g_variant_get_data(adv_var);
329 len = g_variant_get_size(scan_var);
331 scan_data = (char *)g_variant_get_data(scan_var);
333 le_dev_info = g_malloc0(sizeof(bluetooth_le_device_info_t));
334 _bt_convert_addr_string_to_type(le_dev_info->device_address.addr, address);
335 le_dev_info->addr_type = addr_type;
336 le_dev_info->rssi = rssi;
337 le_dev_info->adv_ind_data.data_len = adv_data_len;
339 for (i = 0; i < adv_data_len; i++)
341 le_dev_info->adv_ind_data.data.data[i] = adv_data[i];
343 le_dev_info->scan_resp_data.data_len = scan_data_len;
345 for (i = 0; i < scan_data_len; i++)
347 le_dev_info->scan_resp_data.data.data[i] = scan_data[i];
350 g_variant_unref(adv_var);
351 g_variant_unref(scan_var);
355 gboolean __bt_reliable_disable_cb(gpointer user_data)
358 bt_event_info_t *event_info = user_data;
360 _bt_set_le_scan_status(FALSE);
362 _bt_set_adapter_internal_status(FALSE);
364 if (is_initialized != FALSE) {
365 _bt_common_event_cb(BLUETOOTH_EVENT_DISABLED,
366 BLUETOOTH_ERROR_NONE, NULL,
367 event_info->cb, event_info->user_data);
370 obex_server_id = BT_NO_SERVER;
371 __bt_remove_all_server();
372 __bt_remove_all_push_request_id();
373 #ifdef TIZEN_FEATURE_BT_RFCOMM_DIRECT
374 _bt_rfcomm_server_free_all();
377 _bluetooth_hid_free_hid_info();
383 void __bt_adapter_event_filter(GDBusConnection *connection,
384 const gchar *sender_name,
385 const gchar *object_path,
386 const gchar *interface_name,
387 const gchar *signal_name,
388 GVariant *parameters,
391 bt_event_info_t *event_info;
392 int result = BLUETOOTH_ERROR_NONE;
394 event_info = (bt_event_info_t *)user_data;
395 ret_if(event_info == NULL);
397 if (strcasecmp(object_path, BT_ADAPTER_PATH) != 0)
399 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
402 if (strcasecmp(signal_name, BT_ENABLED) == 0) {
403 BT_INFO("BT_ENABLED");
404 g_variant_get(parameters, "(i)", &result);
406 _bt_common_event_cb(BLUETOOTH_EVENT_ENABLED,
408 event_info->cb, event_info->user_data);
409 } else if (strcasecmp(signal_name, BT_DISABLED) == 0) {
410 BT_INFO("BT_DISABLED");
412 /* Wait for the termining time of bt-service */
413 if (disable_timer_id > 0)
414 g_source_remove(disable_timer_id);
416 disable_timer_id = g_timeout_add(BT_RELIABLE_DISABLE_TIME,
417 (GSourceFunc)__bt_reliable_disable_cb,
419 } else if (strcasecmp(signal_name, BT_DISCOVERABLE_MODE_CHANGED) == 0) {
422 g_variant_get(parameters, "(in)", &result, &mode);
423 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
425 event_info->cb, event_info->user_data);
426 } else if (strcasecmp(signal_name, BT_DISCOVERABLE_TIMEOUT_CHANGED) == 0) {
429 g_variant_get(parameters, "(in)", &result, &timeout);
430 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED,
432 event_info->cb, event_info->user_data);
433 } else if (strcasecmp(signal_name, BT_CONNECTABLE_CHANGED) == 0) {
434 gboolean connectable = FALSE;
436 g_variant_get(parameters, "(b)", &connectable);
437 BT_DBG("Connectable is changed : %d", connectable);
439 _bt_common_event_cb(BLUETOOTH_EVENT_CONNECTABLE_CHANGED,
440 result, &connectable,
441 event_info->cb, event_info->user_data);
442 } else if (strcasecmp(signal_name, BT_ADAPTER_NAME_CHANGED) == 0) {
443 char *adapter_name = NULL;
445 g_variant_get(parameters, "(i&s)", &result, &adapter_name);
446 _bt_common_event_cb(BLUETOOTH_EVENT_LOCAL_NAME_CHANGED,
447 result, adapter_name,
448 event_info->cb, event_info->user_data);
449 } else if (strcasecmp(signal_name, BT_DISCOVERY_STARTED) == 0) {
450 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERY_STARTED,
451 BLUETOOTH_ERROR_NONE, NULL,
452 event_info->cb, event_info->user_data);
453 } else if (strcasecmp(signal_name, BT_DISCOVERY_FINISHED) == 0) {
454 g_variant_get(parameters, "(i)", &result);
455 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERY_FINISHED,
457 event_info->cb, event_info->user_data);
458 } else if (strcasecmp(signal_name, BT_ADVERTISING_STARTED) == 0) {
461 g_variant_get(parameters, "(ii)", &result, &adv_handle);
462 _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_STARTED,
464 event_info->cb, event_info->user_data);
465 } else if (strcasecmp(signal_name, BT_ADVERTISING_STOPPED) == 0) {
468 g_variant_get(parameters, "(ii)", &result, &adv_handle);
469 _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_STOPPED,
471 event_info->cb, event_info->user_data);
472 } else if (strcasecmp(signal_name, BT_ADVERTISING_MANUFACTURER_DATA_CHANGED) == 0) {
473 GVariant *var = NULL;
477 g_variant_get(parameters, "(@ay)", &var);
478 len = g_variant_get_size(var);
479 data = (char *)g_variant_get_data(var);
481 _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_MANUFACTURER_DATA_CHANGED,
483 event_info->cb, event_info->user_data);
485 g_variant_unref(var);
486 } else if (strcasecmp(signal_name, BT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED) == 0) {
487 GVariant *var = NULL;
491 g_variant_get(parameters, "(@ay)", &var);
492 len = g_variant_get_size(var);
493 data = (char *)g_variant_get_data(var);
495 _bt_common_event_cb(BLUETOOTH_EVENT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED,
497 event_info->cb, event_info->user_data);
499 g_variant_unref(var);
500 } else if (strcasecmp(signal_name, BT_MANUFACTURER_DATA_CHANGED) == 0) {
501 GVariant *var = NULL;
505 g_variant_get(parameters, "(@ay)", &var);
506 len = g_variant_get_size(var);
507 data = (char *)g_variant_get_data(var);
509 _bt_common_event_cb(BLUETOOTH_EVENT_MANUFACTURER_DATA_CHANGED,
511 event_info->cb, event_info->user_data);
513 g_variant_unref(var);
514 } else if (strcasecmp(signal_name, BT_PASSKEY_NOTIFICATION) == 0) {
515 const char *address = NULL;
516 const char *passkey = NULL;
517 const char *passkey_info[2];
519 g_variant_get(parameters, "(&s&s)", &address, &passkey);
520 passkey_info[0] = address;
521 passkey_info[1] = passkey;
523 _bt_common_event_cb(BLUETOOTH_EVENT_PASSKEY_NOTIFICATION,
524 BLUETOOTH_ERROR_NONE, (void*)passkey_info,
525 event_info->cb, event_info->user_data);
526 } else if (strcasecmp(signal_name, BT_DEVICE_FOUND) == 0) {
528 bluetooth_device_info_t *device_info;
530 device_info = __bt_get_device_info_in_message(parameters,
532 ret_if(device_info == NULL);
534 if (strlen(device_info->device_name.name) > 0)
535 event = BLUETOOTH_EVENT_REMOTE_DEVICE_NAME_UPDATED;
537 event = BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND;
539 _bt_common_event_cb(event,
541 event_info->cb, event_info->user_data);
544 } else if (strcasecmp(signal_name, BT_BOND_CREATED) == 0) {
545 bluetooth_device_info_t *device_info;
547 device_info = __bt_get_device_info_in_message(parameters,
549 ret_if(device_info == NULL);
551 _bt_common_event_cb(BLUETOOTH_EVENT_BONDING_FINISHED,
553 event_info->cb, event_info->user_data);
556 } else if (strcasecmp(signal_name, BT_BOND_DESTROYED) == 0) {
557 const char *address = NULL;
558 bluetooth_device_address_t dev_address = { {0} };
560 g_variant_get(parameters, "(i&s)", &result, &address);
562 _bt_convert_addr_string_to_type(dev_address.addr,
565 _bt_common_event_cb(BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED,
566 result, &dev_address,
567 event_info->cb, event_info->user_data);
568 } else if (strcasecmp(signal_name, BT_SERVICE_SEARCHED) == 0) {
569 bluetooth_device_info_t *device_info;
570 bt_sdp_info_t sdp_info;
572 device_info = __bt_get_device_info_in_message(parameters,
574 ret_if(device_info == NULL);
576 memset(&sdp_info, 0x00, sizeof(bt_sdp_info_t));
578 sdp_info.service_index = device_info->service_index;
580 memcpy(&sdp_info.device_addr,
581 &device_info->device_address,
582 BLUETOOTH_ADDRESS_LENGTH);
584 memcpy(sdp_info.service_list_array,
585 device_info->service_list_array,
586 BLUETOOTH_MAX_SERVICES_FOR_DEVICE);
588 memcpy(sdp_info.uuids,
590 BLUETOOTH_MAX_SERVICES_FOR_DEVICE * BLUETOOTH_UUID_STRING_MAX);
592 _bt_common_event_cb(BLUETOOTH_EVENT_SERVICE_SEARCHED,
594 event_info->cb, event_info->user_data);
597 } else if (strcasecmp(signal_name, BT_IPSP_INITIALIZED) == 0) {
598 gboolean ipsp_intialized = FALSE;
599 g_variant_get(parameters, "(b)", &ipsp_intialized);
601 BT_DBG("IPSP init state changed to : %d", ipsp_intialized);
603 _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_INIT_STATE_CHANGED,
604 BLUETOOTH_ERROR_NONE, &ipsp_intialized,
605 event_info->cb, event_info->user_data);
606 } else if (strcasecmp(signal_name, BT_KBD_PASSKEY_DISPLAY_REQ_RECEIVED) == 0) {
607 const char *address = NULL;
608 const char *name = NULL;
609 const char *str_passkey = NULL;
611 bluetooth_authentication_request_info_t auth_info;
612 memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
614 g_variant_get(parameters, "(i&s&s&s)", &result, &address, &name, &str_passkey);
616 g_strlcpy(auth_info.device_name.name, name,
617 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
618 _bt_convert_addr_string_to_type(auth_info.device_address.addr,
620 g_strlcpy(auth_info.str_passkey, str_passkey, strlen(str_passkey)+1);
622 _bt_common_event_cb(BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY,
624 event_info->cb, event_info->user_data);
625 } else if (strcasecmp(signal_name, BT_PIN_REQ_RECEIVED) == 0) {
626 const char *address = NULL;
627 const char *name = NULL;
629 bluetooth_authentication_request_info_t auth_info;
630 memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
632 g_variant_get(parameters, "(i&s&s)", &result, &address, &name);
634 g_strlcpy(auth_info.device_name.name, name,
635 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
636 _bt_convert_addr_string_to_type(auth_info.device_address.addr,
639 _bt_common_event_cb(BLUETOOTH_EVENT_PIN_REQUEST,
641 event_info->cb, event_info->user_data);
642 } else if (strcasecmp(signal_name, BT_PASSKEY_REQ_RECEIVED) == 0) {
643 const char *address = NULL;
644 const char *name = NULL;
646 bluetooth_authentication_request_info_t auth_info;
647 memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
649 g_variant_get(parameters, "(i&s&s)", &result, &address, &name);
651 g_strlcpy(auth_info.device_name.name, name,
652 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
653 _bt_convert_addr_string_to_type(auth_info.device_address.addr,
656 _bt_common_event_cb(BLUETOOTH_EVENT_PASSKEY_REQUEST,
658 event_info->cb, event_info->user_data);
659 } else if (strcasecmp(signal_name, BT_PASSKEY_CFM_REQ_RECEIVED) == 0) {
660 const char *address = NULL;
661 const char *name = NULL;
662 const char *str_passkey = NULL;
664 bluetooth_authentication_request_info_t auth_info;
665 memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
667 g_variant_get(parameters, "(i&s&s&s)", &result, &address, &name, &str_passkey);
669 g_strlcpy(auth_info.device_name.name, name,
670 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
671 _bt_convert_addr_string_to_type(auth_info.device_address.addr,
673 g_strlcpy(auth_info.str_passkey, str_passkey, strlen(str_passkey)+1);
675 _bt_common_event_cb(BLUETOOTH_EVENT_PASSKEY_CONFIRM_REQUEST,
677 event_info->cb, event_info->user_data);
681 void __bt_adapter_le_event_filter(GDBusConnection *connection,
682 const gchar *sender_name,
683 const gchar *object_path,
684 const gchar *interface_name,
685 const gchar *signal_name,
686 GVariant *parameters,
689 bt_event_info_t *event_info;
690 int result = BLUETOOTH_ERROR_NONE;
692 event_info = (bt_event_info_t *)user_data;
693 ret_if(event_info == NULL);
695 if (strcasecmp(object_path, BT_LE_ADAPTER_PATH) != 0)
697 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
700 if (strcasecmp(signal_name, BT_LE_ENABLED) == 0) {
701 BT_INFO("BT_LE_ENABLED");
702 g_variant_get(parameters, "(i)", &result);
703 _bt_common_event_cb(BLUETOOTH_EVENT_LE_ENABLED,
705 event_info->cb, event_info->user_data);
706 } else if (strcasecmp(signal_name, BT_LE_DISABLED) == 0) {
707 BT_INFO("BT_LE_DISABLED");
708 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISABLED,
710 event_info->cb, event_info->user_data);
711 } else if (strcasecmp(signal_name, BT_LE_DISCOVERY_STARTED) == 0) {
712 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISCOVERY_STARTED,
713 BLUETOOTH_ERROR_NONE, NULL,
714 event_info->cb, event_info->user_data);
715 } else if (strcasecmp(signal_name, BT_LE_DISCOVERY_FINISHED) == 0) {
716 g_variant_get(parameters, "(i)", &result);
717 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISCOVERY_FINISHED,
719 event_info->cb, event_info->user_data);
720 } else if (strcasecmp(signal_name, BT_LE_DEVICE_FOUND) == 0) {
721 bluetooth_le_device_info_t *le_device_info;
723 le_device_info = __bt_get_le_device_info_in_message(parameters,
725 ret_if(le_device_info == NULL);
727 if (bluetooth_is_le_scanning() == TRUE) {
728 _bt_common_event_cb(BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND,
729 result, le_device_info,
730 event_info->cb, event_info->user_data);
733 g_free(le_device_info);
737 void __bt_device_event_filter(GDBusConnection *connection,
738 const gchar *sender_name,
739 const gchar *object_path,
740 const gchar *interface_name,
741 const gchar *signal_name,
742 GVariant *parameters,
745 bt_event_info_t *event_info;
746 int result = BLUETOOTH_ERROR_NONE;
748 event_info = (bt_event_info_t *)user_data;
749 ret_if(event_info == NULL);
752 gboolean gatt_interface = FALSE;
754 if (strcasecmp(interface_name, BT_GATT_CHARACTERISTIC_INTERFACE) == 0)
755 gatt_interface = TRUE;
757 if (strcasecmp(object_path, BT_DEVICE_PATH) != 0 &&
758 gatt_interface == FALSE)
760 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0 &&
761 gatt_interface == FALSE)
764 if (strcasecmp(object_path, BT_DEVICE_PATH) != 0)
766 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
770 ret_if(signal_name == NULL);
772 if (strcasecmp(signal_name, BT_GATT_CONNECTED) == 0) {
773 const char *address = NULL;
774 bluetooth_device_address_t dev_address = { {0} };
775 BT_DBG("BT_GATT_CONNECTED");
776 g_variant_get(parameters, "(i&s)", &result, &address);
778 _bt_convert_addr_string_to_type(dev_address.addr, address);
779 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_CONNECTED,
780 result, &dev_address,
781 event_info->cb, event_info->user_data);
782 } else if (strcasecmp(signal_name, BT_GATT_DISCONNECTED) == 0) {
783 const char *address = NULL;
784 bluetooth_device_address_t dev_address = { {0} };
785 BT_DBG("BT_GATT_DISCONNECTED");
786 g_variant_get(parameters, "(i&s)", &result, &address);
788 _bt_convert_addr_string_to_type(dev_address.addr, address);
789 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_DISCONNECTED,
790 result, &dev_address,
791 event_info->cb, event_info->user_data);
792 } else if (strcasecmp(signal_name, BT_GATT_REQ_ATT_MTU_CHANGED) == 0) {
793 const char *address = NULL;
794 bluetooth_device_address_t dev_address = { {0} };
795 bluetooth_le_att_mtu_info_t att_mtu_info;
798 BT_DBG("BT_GATT_REQ_ATT_MTU_CHANGED");
799 g_variant_get(parameters, "(i&sqy)", &result, &address, &mtu, &status);
801 _bt_convert_addr_string_to_type(dev_address.addr, address);
803 memset(&att_mtu_info, 0x00, sizeof(bluetooth_le_att_mtu_info_t));
804 memcpy(att_mtu_info.device_address.addr,
806 BLUETOOTH_ADDRESS_LENGTH);
808 att_mtu_info.mtu = mtu;
809 att_mtu_info.status = status;
811 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_ATT_MTU_CHANGED,
812 result, &att_mtu_info,
813 event_info->cb, event_info->user_data);
815 } else if (strcasecmp(signal_name, BT_GATT_BLUEZ_CHAR_VAL_CHANGED) == 0) {
817 } else if (strcasecmp(signal_name, BT_GATT_CHAR_VAL_CHANGED) == 0) {
819 const char *char_handle = NULL;
821 const char * value = NULL;
822 GVariant *char_value_var = NULL;
823 bt_gatt_char_value_t char_val = { 0, };
825 g_variant_get(parameters, "(i&s@ay)", &result, &char_handle, &char_value_var);
827 len = g_variant_get_size(char_value_var);
828 ret_if(char_value_var == NULL);
831 value = (char *)g_variant_get_data(char_value_var);
833 char_val.char_handle = g_strdup(char_handle);
834 char_val.val_len = len;
835 /* Fix : FORWARD_NULL : g_variant_get_data can return NULL */
836 if (char_val.val_len > 0 && value != NULL) {
837 char_val.char_value = (unsigned char*) g_malloc0(char_val.val_len);
838 memcpy(char_val.char_value, value, len);
839 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED,
841 event_info->cb, event_info->user_data);
842 g_free(char_val.char_value);
843 g_variant_unref(char_value_var);
845 g_free(char_val.char_handle);
846 } else if (strcasecmp(signal_name, BT_DEVICE_CONNECTED) == 0) {
847 const char *address = NULL;
848 unsigned char addr_type;
849 bt_connection_info_t conn_info;
850 bluetooth_device_address_t dev_address = { {0} };
851 BT_DBG("BT_DEVICE_CONNECTED");
852 g_variant_get(parameters, "(i&sy)", &result, &address, &addr_type);
854 _bt_convert_addr_string_to_type(dev_address.addr,
857 memset(&conn_info, 0x00, sizeof(bt_connection_info_t));
859 memcpy(conn_info.device_addr.addr,
861 BLUETOOTH_ADDRESS_LENGTH);
863 conn_info.addr_type = addr_type;
864 conn_info.disc_reason = 0;
865 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_CONNECTED,
867 event_info->cb, event_info->user_data);
869 } else if (strcasecmp(signal_name, BT_DEVICE_DISCONNECTED) == 0) {
870 const char *address = NULL;
871 unsigned char addr_type;
872 bt_connection_info_t conn_info;
873 bluetooth_device_address_t dev_address = { {0} };
874 BT_DBG("BT_DEVICE_DISCONNECTED");
875 g_variant_get(parameters, "(i&sy)", &result, &address, &addr_type);
877 _bt_convert_addr_string_to_type(dev_address.addr,
880 memset(&conn_info, 0x00, sizeof(bt_connection_info_t));
882 memcpy(conn_info.device_addr.addr,
884 BLUETOOTH_ADDRESS_LENGTH);
886 conn_info.addr_type = addr_type;
887 conn_info.disc_reason = result;
888 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_DISCONNECTED,
890 event_info->cb, event_info->user_data);
892 } else if (strcasecmp(signal_name, BT_RSSI_MONITORING_ENABLED) == 0) {
893 bt_rssi_enabled_t enabled = { 0, };
896 gboolean rssi_enabled = FALSE;
898 g_variant_get(parameters, "(isib)", &result, &address,
899 &link_type, &rssi_enabled);
901 BT_DBG("RSSI Enabled[Address:%s LinkType:%d RSSI_dbm:%d]",
902 address, link_type, rssi_enabled);
903 enabled.address = address;
904 enabled.link_type = link_type;
905 enabled.rssi_enabled = rssi_enabled;
907 _bt_common_event_cb(BLUETOOTH_EVENT_RSSI_ENABLED,
909 event_info->cb, event_info->user_data);
910 } else if (strcasecmp(signal_name, BT_RSSI_ALERT) == 0) {
915 bt_rssi_alert_t alert = { 0, };
917 g_variant_get(parameters, "(isiii)", &result, &address,
918 &link_type, &alert_type, &rssi_dbm);
920 alert.alert_type = alert_type;
921 alert.rssi_dbm = rssi_dbm;
922 alert.address = address;
923 alert.link_type = link_type;
924 BT_DBG("Address [%s] LinkType[%d] AlertType[%d] RSSI dBm[%d]",
925 address, link_type, alert_type, rssi_dbm);
926 _bt_common_event_cb(BLUETOOTH_EVENT_RSSI_ALERT,
928 event_info->cb, event_info->user_data);
929 } else if (strcasecmp(signal_name, BT_RAW_RSSI_EVENT) == 0) {
933 bt_raw_rssi_t raw_rssi = { 0, };
935 g_variant_get(parameters, "(isii)", &result,
936 &address, &link_type, &rssi_dbm);
938 BT_DBG("Address [%s] Link Type[%d] dBm[%d]",
939 address, link_type, rssi_dbm);
941 raw_rssi.rssi_dbm = rssi_dbm;
942 raw_rssi.address = address;
943 raw_rssi.link_type = link_type;
945 _bt_common_event_cb(BLUETOOTH_EVENT_RAW_RSSI,
947 event_info->cb, event_info->user_data);
948 } else if (strcasecmp(signal_name, BT_DEVICE_AUTHORIZED) == 0) {
949 const char *address = NULL;
950 bluetooth_device_address_t dev_address = { {0} };
952 g_variant_get(parameters, "(i&s)", &result, &address);
954 _bt_convert_addr_string_to_type(dev_address.addr,
957 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_AUTHORIZED,
958 result, &dev_address,
959 event_info->cb, event_info->user_data);
960 } else if (strcasecmp(signal_name, BT_DEVICE_UNAUTHORIZED) == 0) {
961 const char *address = NULL;
962 bluetooth_device_address_t dev_address = { {0} };
964 g_variant_get(parameters, "(i&s)", &result, &address);
966 _bt_convert_addr_string_to_type(dev_address.addr,
969 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_UNAUTHORIZED,
970 result, &dev_address,
971 event_info->cb, event_info->user_data);
972 } else if (strcasecmp(signal_name, BT_SUPPORTED_PROFILE_TRUSTED) == 0) {
974 bt_supported_profile_trusted_t profile_info = { 0, };
977 g_variant_get(parameters, "(i&si)", &result,
980 BT_DBG("Address [%s] trust[%d]", address, trust);
981 profile_info.address = address;
982 if (trust & (PROFILE_SUPPORTED << 0)) { /* Bit 0 & 1 - for PBAP Supported */
983 profile_info.profile = TRUSTED_PROFILE_PBAP;
984 profile_info.supported = TRUE;
985 if (trust & (1 << 1)) /* Bit 1 - for PBAP Trusted */
986 profile_info.trusted = TRUE;
988 profile_info.trusted = FALSE;
990 _bt_common_event_cb(BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED,
991 result, &profile_info,
992 event_info->cb, event_info->user_data);
994 if (trust & (PROFILE_SUPPORTED << 2)) { /* Bit 2 & 3 - for MAP Supported */
995 profile_info.profile = TRUSTED_PROFILE_MAP;
996 profile_info.supported = TRUE;
997 if (trust & (1 << 3)) /* Bit 3 - for PBAP Trusted */
998 profile_info.trusted = TRUE;
1000 profile_info.trusted = FALSE;
1002 _bt_common_event_cb(BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED,
1003 result, &profile_info,
1004 event_info->cb, event_info->user_data);
1006 if (trust & (PROFILE_SUPPORTED << 4)) { /* Bit 4 & 5- for SAP Supported */
1007 profile_info.profile = TRUSTED_PROFILE_SAP;
1008 profile_info.supported = TRUE;
1009 if (trust & (1 << 5)) /* Bit 5 - for SAP Trusted */
1010 profile_info.trusted = TRUE;
1012 profile_info.trusted = FALSE;
1014 _bt_common_event_cb(BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED,
1015 result, &profile_info,
1016 event_info->cb, event_info->user_data);
1018 } else if (strcasecmp(signal_name, BT_IPSP_CONNECTED) == 0) {
1019 const char *address = NULL;
1020 const char *if_name = NULL;
1021 bt_ipsp_connection_info_t bt_ipsp_iface_info;
1022 memset(&bt_ipsp_iface_info, 0, sizeof(bt_ipsp_iface_info));
1024 BT_DBG("BT_IPSP_CONNECTED");
1025 g_variant_get(parameters, "(i&s&s)", &result, &address, &if_name);
1027 _bt_convert_addr_string_to_type(bt_ipsp_iface_info.btaddr.addr, address);
1028 memcpy(bt_ipsp_iface_info.if_name, if_name, 16);
1030 _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_CONNECTED,
1031 result, &bt_ipsp_iface_info,
1032 event_info->cb, event_info->user_data);
1033 } else if (strcasecmp(signal_name, BT_IPSP_DISCONNECTED) == 0) {
1034 const char *address = NULL;
1035 const char *if_name = NULL;
1036 bt_ipsp_connection_info_t bt_ipsp_iface_info;
1037 memset(&bt_ipsp_iface_info, 0, sizeof(bt_ipsp_iface_info));
1039 BT_DBG("BT_IPSP_DISCONNECTED");
1040 g_variant_get(parameters, "(i&s&s)", &result, &address, &if_name);
1042 _bt_convert_addr_string_to_type(bt_ipsp_iface_info.btaddr.addr, address);
1043 memcpy(bt_ipsp_iface_info.if_name, if_name, 16);
1045 _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_DISCONNECTED,
1046 result, &bt_ipsp_iface_info,
1047 event_info->cb, event_info->user_data);
1048 } else if (strcasecmp(signal_name, BT_LE_DATA_LENGTH_CHANGED) == 0) {
1049 const char *address = NULL;
1050 bluetooth_device_address_t dev_address = { {0} };
1055 bt_le_data_length_params_t params;
1057 BT_DBG("BT_LE_DATA_LENGTH_CHANGED");
1059 g_variant_get(parameters, "(i&sqqqq)", &result, &address,
1060 &tx_octets, &tx_time, &rx_octets, &rx_time);
1062 params.max_tx_octets = tx_octets;
1063 params.max_tx_time = tx_time;
1064 params.max_rx_octets = rx_octets;
1065 params.max_rx_time = rx_time;
1067 _bt_convert_addr_string_to_type(dev_address.addr, address);
1069 memcpy(¶ms.device_address,
1070 &dev_address, BLUETOOTH_ADDRESS_LENGTH);
1072 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DATA_LENGTH_CHANGED,
1073 result, ¶ms, event_info->cb, event_info->user_data);
1074 } else if (strcasecmp(signal_name, BT_PXP_PROPERTY_CHANGED) == 0) {
1075 const char *address = NULL;
1076 bluetooth_device_address_t dev_address = { {0} };
1077 int role, type, level;
1078 bt_pxp_property_changed_params_t params;
1080 BT_DBG("BT_PXP_PROPERTY_CHANGED");
1082 g_variant_get(parameters, "(isiii)", &result, &address, &role, &type, &level);
1084 _bt_convert_addr_string_to_type(dev_address.addr, address);
1085 memcpy(¶ms.device_address, &dev_address, BLUETOOTH_ADDRESS_LENGTH);
1087 params.service_type = type;
1088 params.alert_lvl = level;
1090 _bt_common_event_cb(BLUETOOTH_EVENT_PXP_PROPERTY_CHANGED,
1091 result, ¶ms, event_info->cb, event_info->user_data);
1095 void __bt_hid_event_filter(GDBusConnection *connection,
1096 const gchar *sender_name,
1097 const gchar *object_path,
1098 const gchar *interface_name,
1099 const gchar *signal_name,
1100 GVariant *parameters,
1103 bt_event_info_t *event_info;
1104 int result = BLUETOOTH_ERROR_NONE;
1106 event_info = (bt_event_info_t *)user_data;
1107 ret_if(event_info == NULL);
1109 if (strcasecmp(object_path, BT_HID_PATH) != 0)
1111 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1114 ret_if(signal_name == NULL);
1116 if (strcasecmp(signal_name, BT_INPUT_CONNECTED) == 0) {
1117 const char *address = NULL;
1118 bluetooth_device_address_t dev_address = { {0} };
1120 g_variant_get(parameters, "(i&s)", &result, &address);
1122 _bt_convert_addr_string_to_type(dev_address.addr,
1125 _bt_input_event_cb(BLUETOOTH_HID_CONNECTED,
1126 result, &dev_address,
1127 event_info->cb, event_info->user_data);
1128 } else if (strcasecmp(signal_name, BT_INPUT_DISCONNECTED) == 0) {
1129 const char *address = NULL;
1130 bluetooth_device_address_t dev_address = { {0} };
1132 g_variant_get(parameters, "(i&s)", &result, &address);
1134 BT_DBG("address: %s", address);
1136 _bt_convert_addr_string_to_type(dev_address.addr,
1139 _bt_input_event_cb(BLUETOOTH_HID_DISCONNECTED,
1140 result, &dev_address,
1141 event_info->cb, event_info->user_data);
1145 void __bt_headset_event_filter(GDBusConnection *connection,
1146 const gchar *sender_name,
1147 const gchar *object_path,
1148 const gchar *interface_name,
1149 const gchar *signal_name,
1150 GVariant *parameters,
1153 bt_event_info_t *event_info;
1154 int result = BLUETOOTH_ERROR_NONE;
1155 event_info = (bt_event_info_t *)user_data;
1156 ret_if(event_info == NULL);
1158 if (strcasecmp(object_path, BT_HEADSET_PATH) != 0)
1160 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1163 ret_if(signal_name == NULL);
1165 if (strcasecmp(signal_name, BT_HEADSET_CONNECTED) == 0) {
1166 char *address = NULL;
1168 g_variant_get(parameters, "(i&s)", &result, &address);
1170 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_CONNECTED,
1172 event_info->cb, event_info->user_data);
1173 } else if (strcasecmp(signal_name, BT_HEADSET_DISCONNECTED) == 0) {
1174 char *address = NULL;
1176 g_variant_get(parameters, "(i&s)", &result, &address);
1178 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_DISCONNECTED,
1180 event_info->cb, event_info->user_data);
1181 } else if (strcasecmp(signal_name, BT_STEREO_HEADSET_CONNECTED) == 0) {
1182 char *address = NULL;
1184 g_variant_get(parameters, "(i&s)", &result, &address);
1186 _bt_headset_event_cb(BLUETOOTH_EVENT_AV_CONNECTED,
1188 event_info->cb, event_info->user_data);
1189 } else if (strcasecmp(signal_name, BT_STEREO_HEADSET_DISCONNECTED) == 0) {
1190 char *address = NULL;
1192 g_variant_get(parameters, "(i&s)", &result, &address);
1194 _bt_headset_event_cb(BLUETOOTH_EVENT_AV_DISCONNECTED,
1196 event_info->cb, event_info->user_data);
1197 } else if (strcasecmp(signal_name, BT_A2DP_SOURCE_CONNECTED) == 0) {
1198 char *address = NULL;
1200 g_variant_get(parameters, "(i&s)", &result, &address);
1201 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_CONNECTED,
1203 event_info->cb, event_info->user_data);
1204 } else if (strcasecmp(signal_name, BT_A2DP_SOURCE_DISCONNECTED) == 0) {
1205 char *address = NULL;
1207 g_variant_get(parameters, "(i&s)", &result, &address);
1209 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED,
1211 event_info->cb, event_info->user_data);
1212 } else if (strcasecmp(signal_name, BT_SPEAKER_GAIN) == 0) {
1215 char *address = NULL;
1217 g_variant_get(parameters, "(i&sq)", &result, &address,
1219 gain = (unsigned int)spkr_gain;
1221 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_SPEAKER_GAIN,
1223 event_info->cb, event_info->user_data);
1224 } else if (strcasecmp(signal_name, BT_MICROPHONE_GAIN) == 0) {
1227 char *address = NULL;
1229 g_variant_get(parameters, "(i&sq)", &result,
1230 &address, &mic_gain);
1231 gain = (unsigned int)mic_gain;
1233 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_MIC_GAIN,
1235 event_info->cb, event_info->user_data);
1239 void __bt_hid_device_event_filter(GDBusConnection *connection,
1240 const gchar *sender_name,
1241 const gchar *object_path,
1242 const gchar *interface_name,
1243 const gchar *signal_name,
1244 GVariant *parameters,
1247 bt_event_info_t *event_info;
1248 int result = BLUETOOTH_ERROR_NONE;
1250 event_info = (bt_event_info_t *)user_data;
1251 ret_if(event_info == NULL);
1252 if (strcasecmp(object_path, BT_HID_DEVICE_PATH) != 0)
1254 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1257 ret_if(signal_name == NULL);
1259 if (strcasecmp(signal_name, BT_HID_DEVICE_CONNECTED) == 0) {
1260 const char *address = NULL;
1261 bluetooth_device_address_t dev_address = { {0} };
1263 g_variant_get(parameters, "(i&s)", &result, &address);
1265 _bt_convert_addr_string_to_type(dev_address.addr,
1268 _bt_input_event_cb(BLUETOOTH_HID_DEVICE_CONNECTED,
1269 result, &dev_address,
1270 event_info->cb, event_info->user_data);
1271 } else if (strcasecmp(signal_name, BT_HID_DEVICE_DISCONNECTED) == 0) {
1272 const char *address = NULL;
1273 bluetooth_device_address_t dev_address = { {0} };
1275 g_variant_get(parameters, "(i&s)", &result, &address);
1277 BT_DBG("address: %s", address);
1279 _bt_convert_addr_string_to_type(dev_address.addr,
1282 _bt_input_event_cb(BLUETOOTH_HID_DEVICE_DISCONNECTED,
1283 result, &dev_address,
1284 event_info->cb, event_info->user_data);
1285 } else if (strcasecmp(signal_name, BT_INPUT_HID_DEVICE_CONNECTED) == 0) {
1286 BT_INFO_C("Type %s", g_variant_get_type_string(parameters));
1287 const char *address = NULL;
1288 bluetooth_device_address_t dev_address = { {0} };
1290 g_variant_get(parameters, "(i&s)", &result, &address);
1292 BT_DBG("address: %s", address);
1293 _bt_convert_addr_string_to_type(dev_address.addr,
1295 int ctrl = -1, intr = -1;
1296 _bt_hid_device_get_fd(address, &ctrl, &intr);
1297 if (ctrl != -1 && intr != -1) {
1298 new_hid_connection(NULL, ctrl, &dev_address);
1299 new_hid_connection(NULL, intr, &dev_address);
1301 } else if (strcasecmp(signal_name, BT_INPUT_HID_DEVICE_DISCONNECTED) == 0) {
1302 const char *address = NULL;
1303 g_variant_get(parameters, "(i&s)", &result, &address);
1305 BT_DBG("address: %s", address);
1308 void __bt_a2dp_source_event_filter(GDBusConnection *connection,
1309 const gchar *sender_name,
1310 const gchar *object_path,
1311 const gchar *interface_name,
1312 const gchar *signal_name,
1313 GVariant *parameters,
1316 bt_event_info_t *event_info;
1317 int result = BLUETOOTH_ERROR_NONE;
1318 event_info = (bt_event_info_t *)user_data;
1319 ret_if(event_info == NULL);
1321 if (strcasecmp(object_path, BT_A2DP_SOURCE_PATH) != 0)
1323 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1326 ret_if(signal_name == NULL);
1328 if (strcasecmp(signal_name, BT_A2DP_SOURCE_CONNECTED) == 0) {
1329 char *address = NULL;
1331 g_variant_get(parameters, "(i&s)", &result, &address);
1332 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_CONNECTED,
1334 event_info->cb, event_info->user_data);
1335 } else if (strcasecmp(signal_name, BT_A2DP_SOURCE_DISCONNECTED) == 0) {
1336 char *address = NULL;
1338 g_variant_get(parameters, "(i&s)", &result, &address);
1340 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED,
1342 event_info->cb, event_info->user_data);
1346 void __bt_network_event_filter(GDBusConnection *connection,
1347 const gchar *sender_name,
1348 const gchar *object_path,
1349 const gchar *interface_name,
1350 const gchar *signal_name,
1351 GVariant *parameters,
1354 bt_event_info_t *event_info;
1355 int result = BLUETOOTH_ERROR_NONE;
1356 event_info = (bt_event_info_t *)user_data;
1357 ret_if(event_info == NULL);
1359 if (strcasecmp(object_path, BT_NETWORK_PATH) != 0)
1361 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1364 ret_if(signal_name == NULL);
1366 if (strcasecmp(signal_name, BT_NETWORK_CONNECTED) == 0) {
1367 const char *address = NULL;
1368 bluetooth_device_address_t dev_address = { {0} };
1370 g_variant_get(parameters, "(i&s)", &result, &address);
1372 _bt_convert_addr_string_to_type(dev_address.addr,
1375 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_CONNECTED,
1376 result, &dev_address,
1377 event_info->cb, event_info->user_data);
1378 } else if (strcasecmp(signal_name, BT_NETWORK_DISCONNECTED) == 0) {
1379 const char *address = NULL;
1380 bluetooth_device_address_t dev_address = { {0} };
1382 g_variant_get(parameters, "(i&s)", &result, &address);
1384 _bt_convert_addr_string_to_type(dev_address.addr,
1387 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_DISCONNECTED,
1388 result, &dev_address,
1389 event_info->cb, event_info->user_data);
1390 } else if (strcasecmp(signal_name, BT_NETWORK_SERVER_CONNECTED) == 0) {
1391 const char *device = NULL;
1392 const char *address = NULL;
1393 bluetooth_network_device_info_t network_info;
1395 g_variant_get(parameters, "(i&s&s)", &result,
1398 memset(&network_info, 0x00, sizeof(bluetooth_network_device_info_t));
1400 _bt_convert_addr_string_to_type(network_info.device_address.addr,
1403 _bt_print_device_address_t(&network_info.device_address);
1404 g_strlcpy(network_info.interface_name, device,
1405 sizeof(network_info.interface_name));
1407 DBG_SECURE("Interface: %s", network_info.interface_name);
1409 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED,
1410 result, &network_info,
1411 event_info->cb, event_info->user_data);
1412 } else if (strcasecmp(signal_name, BT_NETWORK_SERVER_DISCONNECTED) == 0) {
1413 const char *device = NULL;
1414 const char *address = NULL;
1415 bluetooth_network_device_info_t network_info;
1417 g_variant_get(parameters, "(i&s&s)", &result, &device, &address);
1419 memset(&network_info, 0x00, sizeof(bluetooth_network_device_info_t));
1421 _bt_convert_addr_string_to_type(network_info.device_address.addr,
1424 _bt_print_device_address_t(&network_info.device_address);
1426 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED,
1427 result, &network_info,
1428 event_info->cb, event_info->user_data);
1432 void __bt_avrcp_event_filter(GDBusConnection *connection,
1433 const gchar *sender_name,
1434 const gchar *object_path,
1435 const gchar *interface_name,
1436 const gchar *signal_name,
1437 GVariant *parameters,
1440 bt_event_info_t *event_info;
1441 int result = BLUETOOTH_ERROR_NONE;
1442 event_info = (bt_event_info_t *)user_data;
1443 ret_if(event_info == NULL);
1445 if (strcasecmp(object_path, BT_AVRCP_PATH) != 0)
1447 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1450 ret_if(signal_name == NULL);
1452 if (strcasecmp(signal_name, BT_AVRCP_CONNECTED) == 0) {
1453 char *address = NULL;
1455 g_variant_get(parameters, "(i&s)", &result, &address);
1457 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONNECTED,
1459 event_info->cb, event_info->user_data);
1460 } else if (strcasecmp(signal_name, BT_AVRCP_DISCONNECTED) == 0) {
1461 char *address = NULL;
1463 g_variant_get(parameters, "(i&s)", &result, &address);
1465 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_DISCONNECTED,
1467 event_info->cb, event_info->user_data);
1468 } else if (strcasecmp(signal_name, BT_MEDIA_SHUFFLE_STATUS) == 0) {
1469 unsigned int status;
1471 g_variant_get(parameters, "(u)", &status);
1472 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_SHUFFLE_STATUS,
1474 event_info->cb, event_info->user_data);
1475 } else if (strcasecmp(signal_name, BT_MEDIA_EQUALIZER_STATUS) == 0) {
1476 unsigned int status;
1478 g_variant_get(parameters, "(u)", &status);
1479 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_EQUALIZER_STATUS,
1481 event_info->cb, event_info->user_data);
1482 } else if (strcasecmp(signal_name, BT_MEDIA_REPEAT_STATUS) == 0) {
1483 unsigned int status;
1485 g_variant_get(parameters, "(u)", &status);
1486 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_REPEAT_STATUS,
1488 event_info->cb, event_info->user_data);
1489 } else if (strcasecmp(signal_name, BT_MEDIA_SCAN_STATUS) == 0) {
1490 unsigned int status;
1492 g_variant_get(parameters, "(u)", &status);
1493 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_SCAN_STATUS,
1495 event_info->cb, event_info->user_data);
1499 void __bt_avrcp_control_event_filter(GDBusConnection *connection,
1500 const gchar *sender_name,
1501 const gchar *object_path,
1502 const gchar *interface_name,
1503 const gchar *signal_name,
1504 GVariant *parameters,
1507 bt_event_info_t *event_info;
1508 int result = BLUETOOTH_ERROR_NONE;
1509 event_info = (bt_event_info_t *)user_data;
1510 ret_if(event_info == NULL);
1512 if (strcasecmp(object_path, BT_AVRCP_CONTROL_PATH) != 0)
1514 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1517 ret_if(signal_name == NULL);
1519 if (strcasecmp(signal_name, BT_AVRCP_CONNECTED) == 0) {
1520 char *address = NULL;
1522 g_variant_get(parameters, "(i&s)", &result, &address);
1524 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_CONNECTED,
1526 event_info->cb, event_info->user_data);
1527 } else if (strcasecmp(signal_name, BT_AVRCP_DISCONNECTED) == 0) {
1528 char *address = NULL;
1530 g_variant_get(parameters, "(i&s)", &result, &address);
1532 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_DISCONNECTED,
1534 event_info->cb, event_info->user_data);
1535 } else if (strcasecmp(signal_name, BT_MEDIA_SHUFFLE_STATUS) == 0) {
1536 unsigned int status;
1538 g_variant_get(parameters, "(u)", &status);
1539 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_SHUFFLE_STATUS,
1541 event_info->cb, event_info->user_data);
1542 } else if (strcasecmp(signal_name, BT_MEDIA_EQUALIZER_STATUS) == 0) {
1543 unsigned int status;
1545 g_variant_get(parameters, "(u)", &status);
1546 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_EQUALIZER_STATUS,
1548 event_info->cb, event_info->user_data);
1549 } else if (strcasecmp(signal_name, BT_MEDIA_REPEAT_STATUS) == 0) {
1550 unsigned int status;
1552 g_variant_get(parameters, "(u)", &status);
1553 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_REPEAT_STATUS,
1555 event_info->cb, event_info->user_data);
1556 } else if (strcasecmp(signal_name, BT_MEDIA_SCAN_STATUS) == 0) {
1557 unsigned int status;
1559 g_variant_get(parameters, "(u)", &status);
1560 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_SCAN_STATUS,
1562 event_info->cb, event_info->user_data);
1563 } else if (strcasecmp(signal_name, BT_MEDIA_PLAY_STATUS) == 0) {
1564 unsigned int status;
1566 g_variant_get(parameters, "(u)", &status);
1567 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_PLAY_STATUS_CHANGED,
1569 event_info->cb, event_info->user_data);
1570 } else if (strcasecmp(signal_name, BT_MEDIA_POSITION_STATUS) == 0) {
1571 unsigned int status;
1573 g_variant_get(parameters, "(u)", &status);
1574 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SONG_POSITION_STATUS,
1576 event_info->cb, event_info->user_data);
1577 } else if (strcasecmp(signal_name, BT_MEDIA_TRACK_CHANGE) == 0) {
1578 media_metadata_attributes_t metadata;
1583 unsigned int total_tracks;
1584 unsigned int number;
1585 unsigned int duration;
1587 g_variant_get(parameters, "(&s&s&s&suuu)", &title,
1588 &artist, &album, &genre,
1589 &total_tracks, &number,
1591 memset(&metadata, 0x00, sizeof(media_metadata_attributes_t));
1593 metadata.title = title;
1594 metadata.artist = artist;
1595 metadata.album = album;
1596 metadata.genre = genre;
1597 metadata.total_tracks = total_tracks;
1598 metadata.number = number;
1599 metadata.duration = (int64_t)duration;
1601 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_TRACK_CHANGED,
1603 event_info->cb, event_info->user_data);
1607 void __bt_opp_client_event_filter(GDBusConnection *connection,
1608 const gchar *sender_name,
1609 const gchar *object_path,
1610 const gchar *interface_name,
1611 const gchar *signal_name,
1612 GVariant *parameters,
1615 bt_event_info_t *event_info;
1616 int result = BLUETOOTH_ERROR_NONE;
1617 event_info = (bt_event_info_t *)user_data;
1618 ret_if(event_info == NULL);
1620 if (strcasecmp(object_path, BT_OPP_CLIENT_PATH) != 0)
1622 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1625 ret_if(signal_name == NULL);
1627 if (strcasecmp(signal_name, BT_OPP_CONNECTED) == 0) {
1628 const char *address = NULL;
1630 bluetooth_device_address_t dev_address = { {0} };
1632 g_variant_get(parameters, "(i&si)", &result,
1633 &address, &request_id);
1635 if (__bt_is_request_id_exist(request_id) == FALSE) {
1636 BT_ERR("Different request id!");
1640 _bt_convert_addr_string_to_type(dev_address.addr,
1643 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_CONNECTED,
1644 result, &dev_address,
1645 event_info->cb, event_info->user_data);
1647 if (result != BLUETOOTH_ERROR_NONE)
1648 __bt_remove_push_request_id(request_id);
1650 } else if (strcasecmp(signal_name, BT_OPP_DISCONNECTED) == 0) {
1651 const char *address = NULL;
1653 bluetooth_device_address_t dev_address = { {0} };
1655 g_variant_get(parameters, "(i&si)", &result, &address,
1658 if (__bt_is_request_id_exist(request_id) == FALSE) {
1659 BT_ERR("Different request id!");
1663 _bt_convert_addr_string_to_type(dev_address.addr,
1666 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_DISCONNECTED,
1667 result, &dev_address,
1668 event_info->cb, event_info->user_data);
1670 __bt_remove_push_request_id(request_id);
1671 } else if (strcasecmp(signal_name, BT_TRANSFER_STARTED) == 0) {
1672 const char *file_name = NULL;
1673 const char *device_addr = NULL;
1676 bt_opc_transfer_info_t transfer_info;
1678 g_variant_get(parameters, "(i&s&sti)", &result, &device_addr, &file_name,
1679 &size, &request_id);
1681 if (__bt_is_request_id_exist(request_id) == FALSE) {
1682 BT_ERR("Different request id!");
1686 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1688 transfer_info.filename = g_strdup(file_name);
1689 transfer_info.device_addr = g_strdup(device_addr);
1690 transfer_info.size = size;
1692 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_STARTED,
1693 result, &transfer_info,
1694 event_info->cb, event_info->user_data);
1696 g_free(transfer_info.device_addr);
1697 g_free(transfer_info.filename);
1698 } else if (strcasecmp(signal_name, BT_TRANSFER_PROGRESS) == 0) {
1699 const char *file_name = NULL;
1703 bt_opc_transfer_info_t transfer_info;
1705 g_variant_get(parameters, "(i&stii)", &result,
1706 &file_name, &size, &progress, &request_id);
1708 if (__bt_is_request_id_exist(request_id) == FALSE) {
1709 BT_ERR("Different request id!");
1713 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1715 transfer_info.filename = g_strdup(file_name);
1716 transfer_info.size = size;
1717 transfer_info.percentage = progress;
1719 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS,
1720 result, &transfer_info,
1721 event_info->cb, event_info->user_data);
1723 g_free(transfer_info.filename);
1724 } else if (strcasecmp(signal_name, BT_TRANSFER_COMPLETED) == 0) {
1725 const char *file_name = NULL;
1726 const char *device_addr = NULL;
1729 bt_opc_transfer_info_t transfer_info;
1731 g_variant_get(parameters, "(i&s&sti)", &result, &device_addr,
1732 &file_name, &size, &request_id);
1734 if (__bt_is_request_id_exist(request_id) == FALSE) {
1735 BT_ERR("Different request id!");
1739 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1741 transfer_info.device_addr = g_strdup(device_addr);
1742 transfer_info.filename = g_strdup(file_name);
1743 transfer_info.size = size;
1745 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE,
1746 result, &transfer_info,
1747 event_info->cb, event_info->user_data);
1749 g_free(transfer_info.device_addr);
1750 g_free(transfer_info.filename);
1754 void __bt_opp_server_event_filter(GDBusConnection *connection,
1755 const gchar *sender_name,
1756 const gchar *object_path,
1757 const gchar *interface_name,
1758 const gchar *signal_name,
1759 GVariant *parameters,
1762 bt_event_info_t *event_info;
1763 int result = BLUETOOTH_ERROR_NONE;
1764 event_info = (bt_event_info_t *)user_data;
1765 ret_if(event_info == NULL);
1767 if (strcasecmp(object_path, BT_OPP_SERVER_PATH) != 0)
1769 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1772 ret_if(signal_name == NULL);
1774 if (strcasecmp(signal_name, BT_TRANSFER_AUTHORIZED) == 0) {
1775 /* Native only event */
1776 const char *file_name = NULL;
1777 const char *address = NULL;
1778 const char *device_name = NULL;
1780 bt_obex_server_authorize_into_t auth_info;
1782 g_variant_get(parameters, "(i&st&s&s)", &result, &file_name, &size,
1783 &address, &device_name);
1785 /* OSP server: Don't get this event */
1786 ret_if(obex_server_id == BT_CUSTOM_SERVER);
1788 memset(&auth_info, 0x00, sizeof(bt_obex_server_authorize_into_t));
1790 auth_info.filename = g_strdup(file_name);
1791 auth_info.length = size;
1792 auth_info.address = g_strdup(address);
1793 auth_info.name = g_strdup(device_name);
1794 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE,
1796 event_info->cb, event_info->user_data);
1798 g_free(auth_info.filename);
1799 g_free(auth_info.address);
1800 g_free(auth_info.name);
1801 } else if (strcasecmp(signal_name, BT_CONNECTION_AUTHORIZED) == 0) {
1802 /* OSP only event */
1803 const char *address = NULL;
1804 const char *name = NULL;
1805 bluetooth_device_address_t dev_address = { {0} };
1807 g_variant_get(parameters, "(i&s&s)", &result, &address, &name);
1809 /* Native server: Don't get this event */
1810 ret_if(obex_server_id == BT_NATIVE_SERVER);
1812 _bt_convert_addr_string_to_type(dev_address.addr,
1815 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE,
1816 result, &dev_address,
1817 event_info->cb, event_info->user_data);
1818 } else if (strcasecmp(signal_name, BT_TRANSFER_CONNECTED) == 0) {
1819 bt_obex_server_connection_info_t conn_info = {0, };
1820 char *address = NULL;
1822 int transfer_id = -1;
1823 g_variant_get(parameters, "(i&s&si)", &result,
1824 &address, &name, &transfer_id);
1826 conn_info.address = g_strdup(address);
1827 conn_info.device_name = g_strdup(name);
1828 conn_info.transfer_id = transfer_id;
1830 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_CONNECTED,
1831 result, &conn_info, event_info->cb,
1832 event_info->user_data);
1834 g_free(conn_info.address);
1835 g_free(conn_info.device_name);
1836 } else if (strcasecmp(signal_name, BT_TRANSFER_DISCONNECTED) == 0) {
1837 bt_obex_server_transfer_info_t transfer_info = {0, };
1838 char *address = NULL;
1839 int transfer_id = -1;
1840 g_variant_get(parameters, "(i&si)", &result, &address, &transfer_id);
1841 DBG_SECURE("address: %s, transfer_id: %d", address, transfer_id);
1843 transfer_info.address = g_strdup(address);
1844 transfer_info.transfer_id = transfer_id;
1846 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED,
1847 result, &transfer_info, event_info->cb,
1848 event_info->user_data);
1849 g_free(transfer_info.address);
1850 } else if (strcasecmp(signal_name, BT_TRANSFER_STARTED) == 0) {
1851 const char *device_name = NULL;
1852 const char *file_name = NULL;
1853 const char *type = NULL;
1854 const char *address = NULL;
1855 GVariantIter *iter = NULL;
1858 int transfer_id = 0;
1859 int server_type = 0; /* bt_server_type_t */
1861 bt_obex_server_transfer_info_t transfer_info;
1863 g_variant_get(parameters, "(i&s&s&s&stii(ay))", &result, &device_name,
1864 &file_name, &type, &address, &size, &transfer_id, &server_type, &iter);
1866 /* Other server's event */
1867 ret_if(obex_server_id != server_type &&
1868 server_type != BT_FTP_SERVER);
1870 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
1872 transfer_info.contact_auth_info = g_malloc0(sizeof(unsigned char) * 5);
1874 for (i = 0; i < 5 && g_variant_iter_loop(iter, "y", &byte); ++i)
1875 transfer_info.contact_auth_info[i] = byte;
1877 transfer_info.device_name = g_strdup(device_name);
1878 transfer_info.filename = g_strdup(file_name);
1879 transfer_info.type = g_strdup(type);
1880 transfer_info.address = g_strdup(address);
1881 transfer_info.file_size = size;
1882 transfer_info.transfer_id = transfer_id;
1883 transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
1884 FTP_SERVER : OPP_SERVER;
1886 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED,
1887 result, &transfer_info,
1888 event_info->cb, event_info->user_data);
1890 g_free(transfer_info.filename);
1891 g_free(transfer_info.type);
1892 g_free(transfer_info.device_name);
1893 g_free(transfer_info.address);
1894 g_free(transfer_info.contact_auth_info);
1895 g_variant_iter_free(iter);
1896 } else if (strcasecmp(signal_name, BT_TRANSFER_PROGRESS) == 0) {
1897 const char *file_name = NULL;
1898 const char *type = NULL;
1899 const char *device_name = NULL;
1900 const char *address = NULL;
1901 int transfer_id = 0;
1903 int server_type = 0; /* bt_server_type_t */
1905 bt_obex_server_transfer_info_t transfer_info;
1907 g_variant_get(parameters, "(i&s&s&s&stiii)", &result, &file_name,
1908 &type, &device_name, &address, &size, &transfer_id,
1909 &progress, &server_type);
1911 /* Other server's event */
1912 ret_if(obex_server_id != server_type &&
1913 server_type != BT_FTP_SERVER);
1915 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
1917 transfer_info.filename = g_strdup(file_name);
1918 transfer_info.type = g_strdup(type);
1919 transfer_info.device_name = g_strdup(device_name);
1920 transfer_info.address = g_strdup(address);
1921 transfer_info.file_size = size;
1922 transfer_info.transfer_id = transfer_id;
1923 transfer_info.percentage = progress;
1924 transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
1925 FTP_SERVER : OPP_SERVER;
1927 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS,
1928 result, &transfer_info,
1929 event_info->cb, event_info->user_data);
1931 g_free(transfer_info.filename);
1932 g_free(transfer_info.device_name);
1933 g_free(transfer_info.address);
1934 g_free(transfer_info.type);
1935 } else if (strcasecmp(signal_name, BT_TRANSFER_COMPLETED) == 0) {
1936 const char *file_name = NULL;
1937 const char *device_name = NULL;
1938 const char *address = NULL;
1939 const char *type = NULL;
1940 const char *file_path;
1941 int transfer_id = 0;
1942 int server_type = 0; /* bt_server_type_t */
1944 bt_obex_server_transfer_info_t transfer_info;
1946 g_variant_get(parameters, "(i&s&s&s&s&stii)", &result, &file_name,
1947 &type, &device_name, &file_path, &address, &size,
1948 &transfer_id, &server_type);
1950 /* Other server's event */
1951 ret_if(obex_server_id != server_type &&
1952 server_type != BT_FTP_SERVER);
1954 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
1956 transfer_info.filename = g_strdup(file_name);
1957 transfer_info.type = g_strdup(type);
1958 transfer_info.device_name = g_strdup(device_name);
1959 transfer_info.file_path = g_strdup(file_path);
1960 transfer_info.address = g_strdup(address);
1961 transfer_info.file_size = size;
1962 transfer_info.transfer_id = transfer_id;
1963 transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
1964 FTP_SERVER : OPP_SERVER;
1966 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_COMPLETED,
1967 result, &transfer_info,
1968 event_info->cb, event_info->user_data);
1970 g_free(transfer_info.filename);
1971 g_free(transfer_info.type);
1972 g_free(transfer_info.device_name);
1973 g_free(transfer_info.address);
1974 g_free(transfer_info.file_path);
1978 void __bt_pbap_client_event_filter(GDBusConnection *connection,
1979 const gchar *sender_name,
1980 const gchar *object_path,
1981 const gchar *interface_name,
1982 const gchar *signal_name,
1983 GVariant *parameters,
1986 bt_event_info_t *event_info;
1987 int result = BLUETOOTH_ERROR_NONE;
1988 event_info = (bt_event_info_t *)user_data;
1990 ret_if(event_info == NULL);
1992 if (strcasecmp(object_path, BT_PBAP_CLIENT_PATH) != 0)
1995 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1998 ret_if(signal_name == NULL);
2000 BT_DBG("Type: %s", g_variant_get_type_string(parameters));
2002 if (strcasecmp(signal_name, BT_PBAP_CONNECTED) == 0) {
2003 bt_pbap_connected_t connected = { { { 0 }, }, };
2004 char *address = NULL;
2006 g_variant_get(parameters, "(i&s)", &result, &address);
2007 BT_DBG("address: %s", address);
2009 _bt_convert_addr_string_to_type(connected.btaddr.addr,
2012 connected.connected = 1;
2014 connected.connected = 0;
2016 _bt_common_event_cb(BLUETOOTH_PBAP_CONNECTED,
2018 event_info->cb, event_info->user_data);
2019 } else if (strcasecmp(signal_name, BT_PBAP_DISCONNECTED) == 0) {
2020 bt_pbap_connected_t disconnected = { { { 0 }, }, };
2021 char *address = NULL;
2023 g_variant_get(parameters, "(i&s)", &result, &address);
2024 BT_DBG("address: %s", address);
2026 _bt_convert_addr_string_to_type(disconnected.btaddr.addr,
2028 disconnected.connected = 0;
2030 _bt_common_event_cb(BLUETOOTH_PBAP_DISCONNECTED,
2031 result, &disconnected,
2032 event_info->cb, event_info->user_data);
2033 } else if (strcasecmp(signal_name, BT_PBAP_PHONEBOOK_SIZE) == 0) {
2034 bt_pbap_phonebook_size_t pb_size = { { { 0 }, }, };
2035 char *address = NULL;
2038 g_variant_get(parameters, "(i&si)", &result, &address, &size);
2040 BT_DBG("address: %s, size: %d", address, size);
2042 _bt_convert_addr_string_to_type(pb_size.btaddr.addr,
2044 pb_size.size = size;
2046 _bt_common_event_cb(BLUETOOTH_PBAP_PHONEBOOK_SIZE,
2048 event_info->cb, event_info->user_data);
2049 } else if (strcasecmp(signal_name, BT_PBAP_PHONEBOOK_PULL) == 0) {
2050 bt_pbap_phonebook_pull_t pb_pull = { { { 0 } }, };
2051 char *address = NULL;
2052 char *vcf_file = NULL;
2055 g_variant_get(parameters, "(i&s&si)", &result, &address, &vcf_file, &success);
2057 BT_DBG("address: %s, vcf_file: %s, success: %d",
2058 address, vcf_file, success);
2060 _bt_convert_addr_string_to_type(pb_pull.btaddr.addr,
2062 pb_pull.vcf_file = vcf_file;
2063 pb_pull.success = success;
2064 _bt_common_event_cb(BLUETOOTH_PBAP_PHONEBOOK_PULL,
2066 event_info->cb, event_info->user_data);
2067 } else if (strcasecmp(signal_name, BT_PBAP_VCARD_LIST) == 0) {
2068 bt_pbap_vcard_list_t vc_list = { { { 0 } }, };
2069 char *address = NULL;
2071 gchar **list = NULL;
2072 GVariant *string_var;
2076 g_variant_get(parameters, "(i&sv)", &result, &address, &string_var);
2078 list = (gchar **)g_variant_get_strv(string_var, &count);
2082 for (i = 0; i < count; i++)
2083 BT_DBG("%s", list[i]);
2085 BT_DBG("address: %s, result: %d, count: %d, success: %d",
2086 address, result, count, success);
2088 _bt_convert_addr_string_to_type(vc_list.btaddr.addr,
2090 vc_list.vcards = list;
2091 vc_list.length = count;
2092 vc_list.success = success;
2093 _bt_common_event_cb(BLUETOOTH_PBAP_VCARD_LIST,
2095 event_info->cb, event_info->user_data);
2097 g_variant_unref(string_var);
2099 } else if (strcasecmp(signal_name, BT_PBAP_VCARD_PULL) == 0) {
2100 bt_pbap_vcard_pull_t vc_pull = { { { 0 } }, };
2101 char *address = NULL;
2102 char *vcf_file = NULL;
2105 g_variant_get(parameters, "(i&s&si)",
2106 &result, &address, &vcf_file, &success);
2108 BT_DBG("address: %s, vcf_file: %s, success: %d",
2109 address, vcf_file, success);
2111 _bt_convert_addr_string_to_type(vc_pull.btaddr.addr, address);
2112 vc_pull.vcf_file = vcf_file;
2113 vc_pull.success = success;
2114 _bt_common_event_cb(BLUETOOTH_PBAP_VCARD_PULL,
2116 event_info->cb, event_info->user_data);
2117 } else if (strcasecmp(signal_name, BT_PBAP_SEARCH_PHONEBOOK) == 0) {
2118 bt_pbap_phonebook_search_list_t vc_list = { { { 0 } }, };
2119 char *address = NULL;
2121 gchar **list = NULL;
2122 GVariant *string_var;
2126 g_variant_get(parameters, "(i&s@as)", &result, &address, &string_var);
2128 list = (gchar **)g_variant_get_strv(string_var, &count);
2130 for (i = 0; i < count; i++)
2131 BT_DBG("%s", list[i]);
2133 BT_DBG("address: %s success: %d", address, success);
2135 _bt_convert_addr_string_to_type(vc_list.btaddr.addr, address);
2136 vc_list.vcards = list;
2137 vc_list.length = count;
2138 vc_list.success = success;
2139 _bt_common_event_cb(BLUETOOTH_PBAP_PHONEBOOK_SEARCH,
2141 event_info->cb, event_info->user_data);
2143 g_variant_unref(string_var);
2148 void __bt_rfcomm_client_event_filter(GDBusConnection *connection,
2149 const gchar *sender_name,
2150 const gchar *object_path,
2151 const gchar *interface_name,
2152 const gchar *signal_name,
2153 GVariant *parameters,
2156 bt_event_info_t *event_info;
2157 int result = BLUETOOTH_ERROR_NONE;
2158 event_info = (bt_event_info_t *)user_data;
2159 ret_if(event_info == NULL);
2161 if (strcasecmp(object_path, BT_RFCOMM_CLIENT_PATH) != 0)
2163 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
2166 ret_if(signal_name == NULL);
2168 if (strcasecmp(signal_name, BT_RFCOMM_CONNECTED) == 0) {
2169 const char *address = NULL;
2170 const char *uuid = NULL;
2172 bluetooth_rfcomm_connection_t conn_info;
2174 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2177 memset(&conn_info, 0x00, sizeof(bluetooth_rfcomm_connection_t));
2178 conn_info.device_role = RFCOMM_ROLE_CLIENT;
2179 g_strlcpy(conn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2180 conn_info.socket_fd = socket_fd;
2181 _bt_convert_addr_string_to_type(conn_info.device_addr.addr,
2184 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_CONNECTED,
2186 event_info->cb, event_info->user_data);
2187 } else if (strcasecmp(signal_name, BT_RFCOMM_DISCONNECTED) == 0) {
2188 const char *address = NULL;
2189 const char *uuid = NULL;
2191 bluetooth_rfcomm_disconnection_t disconn_info;
2193 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2196 memset(&disconn_info, 0x00, sizeof(bluetooth_rfcomm_disconnection_t));
2197 disconn_info.device_role = RFCOMM_ROLE_CLIENT;
2198 g_strlcpy(disconn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2199 disconn_info.socket_fd = socket_fd;
2200 _bt_convert_addr_string_to_type(disconn_info.device_addr.addr,
2203 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DISCONNECTED,
2204 result, &disconn_info,
2205 event_info->cb, event_info->user_data);
2206 } else if (strcasecmp(signal_name, BT_RFCOMM_DATA_RECEIVED) == 0) {
2210 bluetooth_rfcomm_received_data_t data_r;
2213 g_variant_get(parameters, "(in@ay)", &result, &socket_fd,
2216 buffer_len = g_variant_get_size(byte_var);
2217 buffer = (char *) g_variant_get_data(byte_var);
2219 data_r.socket_fd = socket_fd;
2220 data_r.buffer_size = buffer_len;
2221 data_r.buffer = buffer;
2223 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED,
2225 event_info->cb, event_info->user_data);
2226 g_variant_unref(byte_var);
2230 void __bt_rfcomm_server_event_filter(GDBusConnection *connection,
2231 const gchar *sender_name,
2232 const gchar *object_path,
2233 const gchar *interface_name,
2234 const gchar *signal_name,
2235 GVariant *parameters,
2238 bt_event_info_t *event_info;
2239 int result = BLUETOOTH_ERROR_NONE;
2240 event_info = (bt_event_info_t *)user_data;
2241 ret_if(event_info == NULL);
2243 if (strcasecmp(object_path, BT_RFCOMM_SERVER_PATH) != 0)
2245 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
2248 ret_if(signal_name == NULL);
2250 if (strcasecmp(signal_name, BT_RFCOMM_CONNECTED) == 0) {
2251 const char *address = NULL;
2252 const char *uuid = NULL;
2254 bluetooth_rfcomm_connection_t conn_info;
2256 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2259 memset(&conn_info, 0x00, sizeof(bluetooth_rfcomm_connection_t));
2260 conn_info.device_role = RFCOMM_ROLE_SERVER;
2261 g_strlcpy(conn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2262 conn_info.socket_fd = socket_fd;
2263 _bt_convert_addr_string_to_type(conn_info.device_addr.addr,
2266 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_CONNECTED,
2268 event_info->cb, event_info->user_data);
2269 } else if (strcasecmp(signal_name, BT_RFCOMM_DISCONNECTED) == 0) {
2270 const char *address = NULL;
2271 const char *uuid = NULL;
2273 bluetooth_rfcomm_disconnection_t disconn_info;
2275 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2278 memset(&disconn_info, 0x00, sizeof(bluetooth_rfcomm_disconnection_t));
2279 disconn_info.device_role = RFCOMM_ROLE_SERVER;
2280 g_strlcpy(disconn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2281 disconn_info.socket_fd = socket_fd;
2282 _bt_convert_addr_string_to_type(disconn_info.device_addr.addr,
2285 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DISCONNECTED,
2286 result, &disconn_info,
2287 event_info->cb, event_info->user_data);
2288 } else if (strcasecmp(signal_name, BT_CONNECTION_AUTHORIZED) == 0) {
2289 /* OSP only event */
2290 bluetooth_rfcomm_connection_request_t req_ind;
2291 char *address = NULL;
2297 g_variant_get(parameters, "(i&s&s&s&sn)", &result, &address,
2298 &uuid, &name, &path, &socket_fd);
2300 if (_check_uuid_path(path, uuid) == FALSE)
2303 memset(&req_ind, 0x00, sizeof(bluetooth_rfcomm_connection_request_t));
2304 _bt_convert_addr_string_to_type(req_ind.device_addr.addr,
2307 req_ind.socket_fd = socket_fd;
2309 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_AUTHORIZE,
2311 event_info->cb, event_info->user_data);
2312 } else if (strcasecmp(signal_name, BT_RFCOMM_SERVER_REMOVED) == 0) {
2313 /* OSP only event */
2316 g_variant_get(parameters, "(in)", &result, &socket_fd);
2318 ret_if(__bt_is_server_exist(socket_fd) == FALSE);
2320 _bt_remove_server(socket_fd);
2321 } else if (strcasecmp(signal_name, BT_RFCOMM_DATA_RECEIVED) == 0) {
2322 char *buffer = NULL;
2325 bluetooth_rfcomm_received_data_t data_r;
2328 g_variant_get(parameters, "(in@ay)", &result,
2329 &socket_fd, &byte_var);
2331 buffer_len = g_variant_get_size(byte_var);
2332 buffer = (char *) g_variant_get_data(byte_var);
2334 data_r.socket_fd = socket_fd;
2335 data_r.buffer_size = buffer_len;
2336 data_r.buffer = buffer;
2338 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED,
2340 event_info->cb, event_info->user_data);
2341 g_variant_unref(byte_var);
2345 void __bt_hf_agent_event_filter(GDBusConnection *connection,
2346 const gchar *sender_name,
2347 const gchar *object_path,
2348 const gchar *interface_name,
2349 const gchar *signal_name,
2350 GVariant *parameters,
2355 bt_event_info_t *event_info;
2356 int result = BLUETOOTH_ERROR_NONE;
2357 event_info = (bt_event_info_t *)user_data;
2358 ret_if(event_info == NULL);
2361 if (strcasecmp(object_path, BT_HF_AGENT_PATH) != 0)
2363 if (strcasecmp(interface_name, BT_HF_SERVICE_INTERFACE) != 0)
2366 ret_if(signal_name == NULL);
2368 BT_DBG("%s", signal_name);
2369 if (strcasecmp(signal_name, "Connected") == 0) {
2370 char *address = NULL;
2372 g_variant_get(parameters, "(s)", &address);
2373 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CONNECTED,
2375 event_info->cb, event_info->user_data);
2376 } else if (strcasecmp(signal_name, "Disconnected") == 0) {
2377 char *address = NULL;
2379 g_variant_get(parameters, "(s)", &address);
2380 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_DISCONNECTED,
2382 event_info->cb, event_info->user_data);
2383 } else if (strcasecmp(signal_name, "AudioConnected") == 0) {
2384 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_AUDIO_CONNECTED,
2386 event_info->cb, event_info->user_data);
2387 } else if (strcasecmp(signal_name, "AudioDisconnected") == 0) {
2388 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_AUDIO_DISCONNECTED,
2390 event_info->cb, event_info->user_data);
2391 } else if (strcasecmp(signal_name, "Ring") == 0) {
2392 char *phoneno = NULL;
2394 g_variant_get(parameters, "(&s)", &phoneno);
2396 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_RING_INDICATOR,
2398 event_info->cb, event_info->user_data);
2399 } else if (strcasecmp(signal_name, "CallWaiting") == 0) {
2400 char *phoneno = NULL;
2402 g_variant_get(parameters, "(&s)", &phoneno);
2404 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_WAITING,
2406 event_info->cb, event_info->user_data);
2407 } else if (strcasecmp(signal_name, "CallTerminated") == 0) {
2408 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_TERMINATED,
2410 event_info->cb, event_info->user_data);
2411 } else if (strcasecmp(signal_name, "FailedToDial") == 0) {
2412 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_FAILED_TO_DIAL,
2414 event_info->cb, event_info->user_data);
2415 } else if (strcasecmp(signal_name, "CallIdle") == 0) {
2416 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_IDLE,
2418 event_info->cb, event_info->user_data);
2419 } else if (strcasecmp(signal_name, "CallSetupIncoming") == 0) {
2420 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALLSETUP_INCOMING,
2422 event_info->cb, event_info->user_data);
2423 } else if (strcasecmp(signal_name, "CallSetupDialing") == 0) {
2424 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALLSETUP_DIALING,
2426 event_info->cb, event_info->user_data);
2427 } else if (strcasecmp(signal_name, "CallSetupAlerting") == 0) {
2428 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALLSETUP_ALERTING,
2430 event_info->cb, event_info->user_data);
2431 } else if (strcasecmp(signal_name, "CallStarted") == 0) {
2432 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_STARTED,
2434 event_info->cb, event_info->user_data);
2435 } else if (strcasecmp(signal_name, "CallEnded") == 0) {
2436 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_ENDED,
2438 event_info->cb, event_info->user_data);
2439 } else if (strcasecmp(signal_name, "NoCallsHeld") == 0) {
2440 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_UNHOLD,
2442 event_info->cb, event_info->user_data);
2443 } else if (strcasecmp(signal_name, "CallsSwapped") == 0) {
2444 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_SWAPPED,
2446 event_info->cb, event_info->user_data);
2447 } else if (strcasecmp(signal_name, "CallOnHold") == 0) {
2448 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_ON_HOLD,
2450 event_info->cb, event_info->user_data);
2451 } else if (strcasecmp(signal_name, "CallStatusUpdate") == 0) {
2453 GVariant *var_data = NULL;
2454 char *number = NULL;
2455 int idx, dir, status, mpart;
2456 bt_hf_call_list_s *handle = NULL;
2458 g_variant_get(parameters, "(i@a(siiii))", &call_count,
2460 BT_DBG("call count : %d", call_count);
2463 GVariantIter *iter = NULL;
2464 __bt_call_list_create(&handle);
2466 g_variant_get(var_data, "a(siiii)", &iter);
2467 while (g_variant_iter_loop(iter, "(siiii)", &number,
2468 &dir, &status, &mpart, &idx)) {
2469 BT_DBG("call number:%s, dir:%d, status : %d",
2470 number, dir, status);
2471 BT_DBG("call mpart : %d, idx : %d", mpart, idx);
2472 __bt_call_list_add(handle, number, dir,
2473 status, mpart, idx);
2475 g_variant_iter_free(iter);
2476 g_variant_unref(var_data);
2479 if (handle && (call_count == g_list_length(handle->list))) {
2480 handle->count = call_count;
2481 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_STATUS,
2483 event_info->cb, event_info->user_data);
2485 BT_ERR(" Mismatch in call count : %d", call_count);
2488 __bt_call_list_destroy(handle);
2489 } else if (strcasecmp(signal_name, "VoiceRecognition") == 0) {
2491 g_variant_get(parameters, "(i)", &status);
2492 BT_DBG("status = [%d]\n", status);
2494 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VOICE_RECOGNITION_ENABLED,
2496 event_info->cb, event_info->user_data);
2498 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VOICE_RECOGNITION_DISABLED,
2500 event_info->cb, event_info->user_data);
2501 } else if (strcasecmp(signal_name, "VolumeSpeaker") == 0) {
2503 g_variant_get(parameters, "(i)", &value);
2504 BT_DBG("Value = [%d]\n", value);
2505 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VOLUME_SPEAKER,
2507 event_info->cb, event_info->user_data);
2508 } else if (strcasecmp(signal_name, "SamsungXSAT") == 0) {
2511 bluetooth_vendor_dep_at_cmd_t cmd;
2512 g_variant_get(parameters, "(i&s)", &value, &msg);
2513 BT_DBG("Value = [%d], message = %s\n", value, msg);
2516 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VENDOR_DEP_CMD,
2518 event_info->cb, event_info->user_data);
2519 } else if (strcasecmp(signal_name, "PropertyChanged") == 0) {
2522 bluetooth_hf_ciev_device_event_t dev_event;
2524 g_variant_get(parameters, "(&sv)", &property, &value);
2525 dev_event.value = g_variant_get_uint16(value);
2527 BT_DBG("Property: %s , value: %d", property, dev_event.value);
2528 g_variant_unref(value);
2530 if (strcasecmp(property, "BatteryCharge") == 0) {
2531 dev_event.event = BLUETOOTH_HF_CIEV_BATTCHG;
2532 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED,
2534 event_info->cb, event_info->user_data);
2535 } else if (strcasecmp(property, "SignalStrength") == 0) {
2536 dev_event.event = BLUETOOTH_HF_CIEV_SIGNAL;
2537 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED,
2539 event_info->cb, event_info->user_data);
2540 } else if (strcasecmp(property, "RegistrationStatus") == 0) {
2541 dev_event.event = BLUETOOTH_HF_CIEV_SERVICE;
2542 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED,
2544 event_info->cb, event_info->user_data);
2550 static void __bt_remove_all_events(void)
2552 bt_event_info_t *info;
2554 while ((info = g_slist_nth_data(event_list, 0)) != NULL)
2555 _bt_unregister_event(info->event_type);
2558 g_slist_free(event_list);
2563 static gboolean __bt_event_is_registered(int event_type)
2566 bt_event_info_t *info;
2568 for (l = event_list; l != NULL; l = g_slist_next(l)) {
2573 if (info->event_type == event_type)
2580 bt_event_info_t *_bt_event_get_cb_data(int event_type)
2583 bt_event_info_t *info;
2585 for (l = event_list; l != NULL; l = g_slist_next(l)) {
2590 if (info->event_type == event_type)
2597 void _bt_add_server(int server_fd)
2599 bt_server_info_t *info;
2601 info = g_new0(bt_server_info_t, 1);
2602 info->server_fd = server_fd;
2604 server_list = g_slist_append(server_list, info);
2607 void _bt_remove_server(int server_fd)
2610 bt_server_info_t *info;
2612 for (l = server_list; l != NULL; l = g_slist_next(l)) {
2617 if (info->server_fd == server_fd)
2618 server_list = g_slist_remove(server_list, (void *)info);
2624 void _bt_set_obex_server_id(int server_type)
2626 obex_server_id = server_type;
2629 int _bt_get_obex_server_id(void)
2631 return obex_server_id;
2634 int _bt_init_event_handler(void)
2636 if (is_initialized == TRUE) {
2637 BT_ERR("Connection already exist");
2638 return BLUETOOTH_ERROR_ALREADY_INITIALIZED;
2641 __bt_remove_all_events();
2643 is_initialized = TRUE;
2645 return BLUETOOTH_ERROR_NONE;
2648 int _bt_deinit_event_handler(void)
2650 if (is_initialized == FALSE) {
2651 BT_ERR("Connection dose not exist");
2652 return BLUETOOTH_ERROR_INTERNAL;
2655 __bt_remove_all_events();
2657 if (disable_timer_id > 0) {
2658 g_source_remove(disable_timer_id);
2659 disable_timer_id = 0;
2662 is_initialized = FALSE;
2664 return BLUETOOTH_ERROR_NONE;
2667 static void __bt_event_data_free(void *data)
2669 bt_event_info_t *cb_data = data;
2671 ret_if(cb_data == NULL);
2676 int _bt_register_event(int event_type, void *event_cb, void *user_data)
2678 GDBusConnection *connection_type;
2679 GDBusSignalCallback event_func;
2680 bt_event_info_t *cb_data;
2682 const char *interface = BT_EVENT_SERVICE;
2684 if (is_initialized == FALSE)
2685 _bt_init_event_handler();
2687 if (__bt_event_is_registered(event_type) == TRUE) {
2688 BT_ERR("The event is already registed");
2689 return BLUETOOTH_ERROR_ALREADY_INITIALIZED;
2692 switch (event_type) {
2693 case BT_ADAPTER_EVENT:
2694 event_func = __bt_adapter_event_filter;
2695 path = BT_ADAPTER_PATH;
2697 case BT_LE_ADAPTER_EVENT:
2698 event_func = __bt_adapter_le_event_filter;
2699 path = BT_LE_ADAPTER_PATH;
2701 case BT_DEVICE_EVENT:
2702 event_func = __bt_device_event_filter;
2703 path = BT_DEVICE_PATH;
2706 event_func = __bt_hid_event_filter;
2709 case BT_HEADSET_EVENT:
2710 event_func = __bt_headset_event_filter;
2711 path = BT_HEADSET_PATH;
2713 case BT_NETWORK_EVENT:
2714 event_func = __bt_network_event_filter;
2715 path = BT_NETWORK_PATH;
2717 case BT_AVRCP_EVENT:
2718 event_func = __bt_avrcp_event_filter;
2719 path = BT_AVRCP_PATH;
2721 case BT_AVRCP_CONTROL_EVENT:
2722 event_func = __bt_avrcp_control_event_filter;
2723 path = BT_AVRCP_CONTROL_PATH;
2725 case BT_OPP_CLIENT_EVENT:
2726 event_func = __bt_opp_client_event_filter;
2727 path = BT_OPP_CLIENT_PATH;
2729 case BT_OPP_SERVER_EVENT:
2730 event_func = __bt_opp_server_event_filter;
2731 path = BT_OPP_SERVER_PATH;
2733 case BT_PBAP_CLIENT_EVENT:
2734 event_func = __bt_pbap_client_event_filter;
2735 path = BT_PBAP_CLIENT_PATH;
2737 case BT_RFCOMM_CLIENT_EVENT:
2738 event_func = __bt_rfcomm_client_event_filter;
2739 path = BT_RFCOMM_CLIENT_PATH;
2741 case BT_RFCOMM_SERVER_EVENT:
2742 event_func = __bt_rfcomm_server_event_filter;
2743 path = BT_RFCOMM_SERVER_PATH;
2745 case BT_HF_AGENT_EVENT:
2746 BT_DBG("BT_HF_AGENT_EVENT\n");
2747 event_func = __bt_hf_agent_event_filter;
2748 path = BT_HF_AGENT_PATH;
2749 interface = BT_HF_SERVICE_INTERFACE;
2751 case BT_A2DP_SOURCE_EVENT:
2752 BT_DBG("BT_A2DP_SOURCE_EVENT");
2753 event_func = __bt_a2dp_source_event_filter;
2754 path = BT_A2DP_SOURCE_PATH;
2756 case BT_HID_DEVICE_EVENT:
2757 BT_DBG("BT_HID_DEVICE_EVENT");
2758 event_func = __bt_hid_device_event_filter;
2759 path = BT_HID_DEVICE_PATH;
2761 #ifdef GATT_NO_RELAY
2762 case BT_GATT_BLUEZ_EVENT:
2763 BT_DBG("BT_GATT_BLUEZ_EVENT");
2764 event_func = __bt_device_event_filter;
2765 interface = BT_GATT_CHARACTERISTIC_INTERFACE;
2770 BT_ERR("Unknown event");
2771 return BLUETOOTH_ERROR_INTERNAL;
2774 connection_type = _bt_gdbus_get_system_gconn();
2775 if (connection_type == NULL)
2776 return BLUETOOTH_ERROR_INTERNAL;
2778 cb_data = g_new0(bt_event_info_t, 1);
2780 cb_data->event_type = event_type;
2781 cb_data->cb = event_cb;
2782 cb_data->user_data = user_data;
2784 cb_data->id = g_dbus_connection_signal_subscribe(connection_type,
2785 NULL, interface, NULL, path, NULL, 0,
2786 event_func, cb_data, NULL);
2788 event_list = g_slist_append(event_list, cb_data);
2790 return BLUETOOTH_ERROR_NONE;
2793 int _bt_unregister_event(int event_type)
2795 GDBusConnection *connection_type;
2796 bt_event_info_t *cb_data;
2798 if (is_initialized == FALSE) {
2799 BT_ERR("Event is not registered");
2800 return BLUETOOTH_ERROR_NOT_INITIALIZED;
2803 if (__bt_event_is_registered(event_type) == FALSE) {
2804 BT_ERR("Not registered event");
2805 return BLUETOOTH_ERROR_INTERNAL;
2808 cb_data = _bt_event_get_cb_data(event_type);
2810 if (cb_data == NULL) {
2811 BT_ERR("No matched event data");
2812 return BLUETOOTH_ERROR_INTERNAL;
2815 connection_type = _bt_gdbus_get_system_gconn();
2817 event_list = g_slist_remove(event_list, (void *)cb_data);
2819 retv_if(connection_type == NULL, BLUETOOTH_ERROR_INTERNAL);
2821 g_dbus_connection_signal_unsubscribe(connection_type, cb_data->id);
2823 __bt_event_data_free((void *)cb_data);
2825 return BLUETOOTH_ERROR_NONE;
2828 static void __bt_name_owner_changed(GDBusConnection *connection,
2829 const gchar *sender_name,
2830 const gchar *object_path,
2831 const gchar *interface_name,
2832 const gchar *signal_name,
2833 GVariant *parameters,
2836 const char *name = NULL;
2837 const char *old_owner = NULL;
2838 const char *new_owner = NULL;
2839 bt_event_info_t *event_info;
2841 g_variant_get(parameters, "(&s&s&s)", &name, &old_owner, &new_owner);
2843 if (g_strcmp0(name, BT_DBUS_NAME) == 0 &&
2844 (new_owner != NULL && *new_owner == '\0')) {
2845 BT_DBG("bt-service is terminated");
2846 event_info = _bt_event_get_cb_data(BT_ADAPTER_EVENT);
2847 if (event_info == NULL)
2850 if (disable_timer_id > 0)
2851 g_source_remove(disable_timer_id);
2853 disable_timer_id = g_timeout_add(BT_RELIABLE_DISABLE_TIME,
2854 (GSourceFunc)__bt_reliable_disable_cb,
2859 void _bt_register_name_owner_changed(void)
2861 GDBusConnection *connection_type;
2863 connection_type = _bt_gdbus_get_system_gconn();
2864 if (connection_type == NULL) {
2865 BT_ERR("Unable to get the bus");
2868 owner_sig_id = g_dbus_connection_signal_subscribe(connection_type,
2869 NULL, BT_EVENT_FREEDESKTOP,
2870 BT_NAME_OWNER_CHANGED, NULL, NULL, 0,
2871 __bt_name_owner_changed, NULL, NULL);
2874 void _bt_unregister_name_owner_changed(void)
2876 GDBusConnection *connection_type;
2878 connection_type = _bt_gdbus_get_system_gconn();
2879 if (connection_type != NULL && owner_sig_id != -1) {
2880 g_dbus_connection_signal_unsubscribe(connection_type,
2886 static void __bt_manager_event_filter(GDBusConnection *connection,
2887 const gchar *sender_name,
2888 const gchar *object_path,
2889 const gchar *interface_name,
2890 const gchar *signal_name,
2891 GVariant *parameters,
2895 GVariantIter *interface_iter = NULL;
2896 char *interface_str = NULL;
2897 bt_gatt_service_change_t change;
2898 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
2899 char secure_address[BT_ADDRESS_STRING_SIZE] = { 0 };
2900 bt_user_info_t *user_info = NULL;
2902 if (strcasecmp(signal_name, "GattServiceAdded") == 0) {
2903 g_variant_get(parameters, "(&s)", &path);
2905 _bt_convert_device_path_to_address(path, address);
2906 _bt_convert_addr_string_to_type(change.device_addr.addr, address);
2907 _bt_convert_addr_string_to_secure_string(secure_address, address);
2909 if (_bluetooth_gatt_check_service_change_watcher_address(&change.device_addr)
2911 BT_INFO("GATT Service [%s] added, but no watcher for %s",
2912 path, secure_address);
2915 BT_INFO(" ### GATT Service added [%s] [%s]",
2916 path, secure_address);
2918 change.svc_path = g_strdup(path);
2919 change.change_type = BLUETOOTH_GATT_SERVICE_CHANGE_TYPE_ADD;
2921 user_info = _bt_get_user_data(BT_COMMON);
2922 if (user_info != NULL) {
2923 _bt_common_event_cb(
2924 BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED,
2925 BLUETOOTH_ERROR_NONE, &change,
2926 user_info->cb, user_info->user_data);
2929 g_free(change.svc_path);
2930 } else if (strcasecmp(signal_name, "InterfacesRemoved") == 0) {
2931 g_variant_get(parameters, "(&oas)",
2932 &path, &interface_iter);
2935 BT_ERR("Invalid adapter path");
2939 _bt_convert_device_path_to_address(path, address);
2940 _bt_convert_addr_string_to_type(change.device_addr.addr, address);
2941 _bt_convert_addr_string_to_secure_string(secure_address, address);
2943 if (_bluetooth_gatt_check_service_change_watcher_address(&change.device_addr)
2945 BT_INFO("GATT Service [%s] removed, but no watcher for %s",
2946 path, secure_address);
2950 while (g_variant_iter_loop(interface_iter, "s", &interface_str)) {
2951 if (g_strcmp0(interface_str, GATT_SERV_INTERFACE) == 0) {
2952 change.svc_path = g_strdup(path);
2953 change.change_type = BLUETOOTH_GATT_SERVICE_CHANGE_TYPE_REMOVE;
2955 BT_INFO(" ### GATT Service removed [%s] [%s]",
2956 path, secure_address);
2958 user_info = _bt_get_user_data(BT_COMMON);
2959 if (user_info != NULL) {
2960 _bt_common_event_cb(
2961 BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED,
2962 BLUETOOTH_ERROR_NONE, &change,
2963 user_info->cb, user_info->user_data);
2966 g_free(change.svc_path);
2970 g_variant_iter_free(interface_iter);
2974 int _bt_register_manager_subscribe_signal(gboolean subscribe)
2976 GDBusConnection *g_conn;
2977 static int service_added_id = -1;
2978 static int interface_removed_id = -1;
2980 g_conn = _bt_gdbus_get_system_gconn();
2982 return BLUETOOTH_ERROR_INTERNAL;
2984 if (subscribe == TRUE) {
2985 if (service_added_id == -1) {
2986 service_added_id = g_dbus_connection_signal_subscribe(g_conn,
2987 NULL, GATT_SERV_INTERFACE,
2988 "GattServiceAdded", NULL, NULL, 0,
2989 __bt_manager_event_filter,
2992 if (interface_removed_id == -1) {
2993 interface_removed_id = g_dbus_connection_signal_subscribe(g_conn,
2994 NULL, BT_MANAGER_INTERFACE,
2995 "InterfacesRemoved", NULL, NULL, 0,
2996 __bt_manager_event_filter,
3000 if (service_added_id != -1) {
3001 g_dbus_connection_signal_unsubscribe(g_conn,
3003 service_added_id = -1;
3005 if (interface_removed_id != -1) {
3006 g_dbus_connection_signal_unsubscribe(g_conn,
3007 interface_removed_id);
3008 interface_removed_id = -1;
3012 return BLUETOOTH_ERROR_NONE;