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.
19 #include <dbus/dbus.h>
24 #include "bluetooth-api.h"
25 #include "bluetooth-audio-api.h"
26 #include "bluetooth-hid-api.h"
27 #include "bt-internal-types.h"
28 #include "bluetooth-media-control.h"
30 #include "bt-common.h"
31 #include "bt-event-handler.h"
32 #include "bt-gatt-client.h"
33 #include "bt-request-sender.h"
35 #define PROFILE_SUPPORTED 0x3 /* This corresponds to binary 0b11*/
36 #define BT_RELIABLE_DISABLE_TIME 300 /* 300 ms */
46 static int obex_server_id;
47 static guint disable_timer_id;
48 static gboolean is_initialized;
49 static GSList *sending_list = NULL;
50 static GSList *server_list = NULL;
51 static GSList *event_list = NULL;
52 static int owner_sig_id = -1;
54 void _bt_add_push_request_id(int request_id)
56 bt_sending_info_t *info;
58 info = g_new0(bt_sending_info_t, 1);
59 info->request_id = request_id;
61 sending_list = g_slist_append(sending_list, info);
64 static gboolean __bt_is_request_id_exist(int request_id)
67 bt_sending_info_t *info;
69 for (l = sending_list; l != NULL; l = g_slist_next(l)) {
74 if (info->request_id == request_id)
81 static void __bt_remove_push_request_id(int request_id)
84 bt_sending_info_t *info;
86 for (l = sending_list; l != NULL; l = g_slist_next(l)) {
91 BT_DBG("info->request_id = %d\n", info->request_id);
92 BT_DBG("request_id = %d\n", request_id);
93 if (info->request_id == request_id) {
94 sending_list = g_slist_remove(sending_list, (void *)info);
101 static void __bt_remove_all_push_request_id(void)
104 bt_sending_info_t *info;
106 for (l = sending_list; l != NULL; l = g_slist_next(l)) {
111 g_slist_free(sending_list);
115 static void __bt_remove_all_server(void)
118 bt_server_info_t *info;
120 for (l = server_list; l != NULL; l = g_slist_next(l)) {
125 g_slist_free(server_list);
129 static gboolean __bt_is_server_exist(int server_fd)
132 bt_server_info_t *info;
134 for (l = server_list; l != NULL; l = g_slist_next(l)) {
139 retv_if(info->server_fd == server_fd, TRUE);
145 static void __bt_get_uuid_info(bluetooth_device_info_t *dev_info,
152 ret_if(dev_info == NULL);
153 ret_if(uuids == NULL);
154 ret_if(uuid_count <= 0);
156 dev_info->service_index = uuid_count;
158 for (i = 0; i < uuid_count && uuids[i] != NULL; i++) {
159 g_strlcpy(dev_info->uuids[i], uuids[i], BLUETOOTH_UUID_STRING_MAX);
161 parts = g_strsplit(uuids[i], "-", -1);
163 if (parts == NULL || parts[0] == NULL) {
168 dev_info->service_list_array[i] = g_ascii_strtoull(parts[0], NULL, 16);
172 static int __bt_call_list_create(bt_hf_call_list_s **list)
174 bt_hf_call_list_s *handle;
177 BT_DBG("Already Initialized");
178 return BLUETOOTH_ERROR_NONE;
180 handle = g_malloc0(sizeof(bt_hf_call_list_s));
182 return BLUETOOTH_ERROR_NONE;
185 static int __bt_call_list_reset(bt_hf_call_list_s *list)
187 bt_hf_call_list_s *handle;
188 bt_hf_call_status_info_t *call_status;
191 BT_ERR("invalid parameter");
192 return BLUETOOTH_ERROR_INVALID_PARAM;
194 handle = (bt_hf_call_list_s *)list;
196 call_status = (bt_hf_call_status_info_t *)g_list_nth_data(handle->list, 0);
197 if (call_status == NULL)
199 handle->list = g_list_remove(handle->list, call_status);
200 g_free(call_status->number);
203 return BLUETOOTH_ERROR_NONE;
206 static int __bt_call_list_destroy(bt_hf_call_list_s *list)
209 bt_hf_call_list_s *handle;
212 BT_ERR("invalid parameter");
213 return BLUETOOTH_ERROR_INVALID_PARAM;
215 handle = (bt_hf_call_list_s *)list;
216 result = __bt_call_list_reset(list);
220 static int __bt_call_list_add(bt_hf_call_list_s *list, char * number,
221 int dir, int status, int mpart, int idx)
223 bt_hf_call_list_s *handle;
224 bt_hf_call_status_info_t *call_status;
227 BT_ERR("invalid parameter");
228 return BLUETOOTH_ERROR_INVALID_PARAM;
230 handle = (bt_hf_call_list_s *)list;
231 call_status = g_malloc0(sizeof(bt_hf_call_status_info_t));
232 /* Fix : NULL_RETURNS */
233 retv_if(call_status == NULL, BLUETOOTH_ERROR_MEMORY_ALLOCATION);
235 call_status->number = g_strdup(number);
236 call_status->direction = dir;
237 call_status->status = status;
238 call_status->mpart = mpart;
239 call_status->idx = idx;
240 handle->list = g_list_append(handle->list, (gpointer)call_status);
241 return BLUETOOTH_ERROR_NONE;
244 static bluetooth_device_info_t *__bt_get_device_info_in_message(GVariant *parameters, int *ret)
246 bluetooth_device_info_t *dev_info;
247 const char *address = NULL;
248 const char *name = NULL;
249 gchar **uuids = NULL;
250 unsigned int dev_class = 0;
252 gboolean paired = FALSE;
254 gboolean trust = FALSE;
256 int result = BLUETOOTH_ERROR_NONE;
257 GVariant *string_var;
259 int manufacturer_data_len = 0;
260 GVariant *manufacturer_var = NULL;
261 const char *manufacturer_data = NULL;
263 g_variant_get(parameters, "(isunsbub@asn@ay)", &result, &address,
264 &dev_class, &rssi, &name, &paired,
265 &connected, &trust, &string_var, &manufacturer_data_len, &manufacturer_var);
267 if (string_var == NULL) {
268 BT_ERR("invalid parameters in signal");
272 uuids = (gchar **)g_variant_get_strv(string_var, &uuid_count);
274 len = g_variant_get_size(manufacturer_var);
276 manufacturer_data = (char *)g_variant_get_data(manufacturer_var);
278 dev_info = g_malloc0(sizeof(bluetooth_device_info_t));
279 /* Fix : NULL_RETURNS */
280 if (dev_info == NULL) {
281 result = BLUETOOTH_ERROR_MEMORY_ALLOCATION;
285 dev_info->rssi = rssi;
286 dev_info->paired = paired;
287 dev_info->connected = connected;
288 dev_info->trust = trust;
290 g_strlcpy(dev_info->device_name.name, name,
291 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
293 _bt_divide_device_class(&dev_info->device_class, dev_class);
295 _bt_convert_addr_string_to_type(dev_info->device_address.addr,
299 __bt_get_uuid_info(dev_info, uuids, uuid_count);
301 if (manufacturer_data_len > BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX) {
302 BT_ERR("manufacturer_data_len is too long(len = %d)", manufacturer_data_len);
303 manufacturer_data_len = BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX;
305 dev_info->manufacturer_data.data_len = manufacturer_data_len;
306 if (manufacturer_data)
307 for (i = 0; i < manufacturer_data_len; i++)
308 dev_info->manufacturer_data.data[i] = manufacturer_data[i];
312 g_variant_unref(string_var);
313 g_variant_unref(manufacturer_var);
317 static bluetooth_le_device_info_t *__bt_get_le_device_info_in_message(GVariant *parameters, int *ret)
319 bluetooth_le_device_info_t *le_dev_info;
320 const char *address = NULL;
325 int adv_data_len = 0;
326 GVariant *adv_var = NULL;
327 const char *adv_data = NULL;
328 int scan_data_len = 0;
329 GVariant *scan_var = NULL;
330 const char *scan_data = NULL;
331 int result = BLUETOOTH_ERROR_NONE;
333 g_variant_get(parameters, "(i&snnn@ayn@ay)", &result, &address,
334 &addr_type, &rssi, &adv_data_len, &adv_var, &scan_data_len, &scan_var);
336 len = g_variant_get_size(adv_var);
338 adv_data = (char *)g_variant_get_data(adv_var);
340 len = g_variant_get_size(scan_var);
342 scan_data = (char *)g_variant_get_data(scan_var);
344 le_dev_info = g_malloc0(sizeof(bluetooth_le_device_info_t));
345 /* Fix : NULL_RETURNS */
346 if (le_dev_info == NULL) {
347 result = BLUETOOTH_ERROR_MEMORY_ALLOCATION;
350 _bt_convert_addr_string_to_type(le_dev_info->device_address.addr, address);
351 le_dev_info->addr_type = addr_type;
352 le_dev_info->rssi = rssi;
353 le_dev_info->adv_ind_data.data_len = adv_data_len;
355 for (i = 0; i < adv_data_len; i++)
357 le_dev_info->adv_ind_data.data.data[i] = adv_data[i];
359 le_dev_info->scan_resp_data.data_len = scan_data_len;
361 for (i = 0; i < scan_data_len; i++)
363 le_dev_info->scan_resp_data.data.data[i] = scan_data[i];
368 g_variant_unref(adv_var);
369 g_variant_unref(scan_var);
373 gboolean __bt_reliable_disable_cb(gpointer user_data)
376 bt_event_info_t *event_info = user_data;
378 _bt_set_le_scan_status(FALSE);
380 _bt_set_adapter_internal_status(FALSE);
382 if (is_initialized != FALSE) {
383 _bt_common_event_cb(BLUETOOTH_EVENT_DISABLED,
384 BLUETOOTH_ERROR_NONE, NULL,
385 event_info->cb, event_info->user_data);
388 obex_server_id = BT_NO_SERVER;
389 __bt_remove_all_server();
390 __bt_remove_all_push_request_id();
391 #ifdef TIZEN_FEATURE_BT_RFCOMM_DIRECT
392 _bt_rfcomm_server_free_all();
395 _bluetooth_hid_free_hid_info();
401 void __bt_adapter_event_filter(GDBusConnection *connection,
402 const gchar *sender_name,
403 const gchar *object_path,
404 const gchar *interface_name,
405 const gchar *signal_name,
406 GVariant *parameters,
409 bt_event_info_t *event_info;
410 int result = BLUETOOTH_ERROR_NONE;
412 event_info = (bt_event_info_t *)user_data;
413 ret_if(event_info == NULL);
415 if (strcasecmp(object_path, BT_ADAPTER_PATH) != 0)
417 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
420 if (strcasecmp(signal_name, BT_ENABLED) == 0) {
421 BT_INFO("BT_ENABLED");
422 g_variant_get(parameters, "(i)", &result);
424 _bt_common_event_cb(BLUETOOTH_EVENT_ENABLED,
426 event_info->cb, event_info->user_data);
427 } else if (strcasecmp(signal_name, BT_DISABLED) == 0) {
428 BT_INFO("BT_DISABLED");
430 /* Wait for the termining time of bt-service */
431 if (disable_timer_id > 0)
432 g_source_remove(disable_timer_id);
434 disable_timer_id = g_timeout_add(BT_RELIABLE_DISABLE_TIME,
435 (GSourceFunc)__bt_reliable_disable_cb,
437 } else if (strcasecmp(signal_name, BT_DISCOVERABLE_MODE_CHANGED) == 0) {
440 g_variant_get(parameters, "(in)", &result, &mode);
441 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
443 event_info->cb, event_info->user_data);
444 } else if (strcasecmp(signal_name, BT_DISCOVERABLE_TIMEOUT_CHANGED) == 0) {
447 g_variant_get(parameters, "(in)", &result, &timeout);
448 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED,
450 event_info->cb, event_info->user_data);
451 } else if (strcasecmp(signal_name, BT_CONNECTABLE_CHANGED) == 0) {
452 gboolean connectable = FALSE;
454 g_variant_get(parameters, "(b)", &connectable);
455 BT_DBG("Connectable is changed : %d", connectable);
457 _bt_common_event_cb(BLUETOOTH_EVENT_CONNECTABLE_CHANGED,
458 result, &connectable,
459 event_info->cb, event_info->user_data);
460 } else if (strcasecmp(signal_name, BT_ADAPTER_NAME_CHANGED) == 0) {
461 char *adapter_name = NULL;
463 g_variant_get(parameters, "(i&s)", &result, &adapter_name);
464 _bt_common_event_cb(BLUETOOTH_EVENT_LOCAL_NAME_CHANGED,
465 result, adapter_name,
466 event_info->cb, event_info->user_data);
467 } else if (strcasecmp(signal_name, BT_DISCOVERY_STARTED) == 0) {
468 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERY_STARTED,
469 BLUETOOTH_ERROR_NONE, NULL,
470 event_info->cb, event_info->user_data);
471 } else if (strcasecmp(signal_name, BT_DISCOVERY_FINISHED) == 0) {
472 g_variant_get(parameters, "(i)", &result);
473 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERY_FINISHED,
475 event_info->cb, event_info->user_data);
476 } else if (strcasecmp(signal_name, BT_ADVERTISING_STARTED) == 0) {
479 g_variant_get(parameters, "(ii)", &result, &adv_handle);
480 _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_STARTED,
482 event_info->cb, event_info->user_data);
483 } else if (strcasecmp(signal_name, BT_ADVERTISING_STOPPED) == 0) {
486 g_variant_get(parameters, "(ii)", &result, &adv_handle);
487 _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_STOPPED,
489 event_info->cb, event_info->user_data);
490 } else if (strcasecmp(signal_name, BT_ADVERTISING_MANUFACTURER_DATA_CHANGED) == 0) {
491 GVariant *var = NULL;
495 g_variant_get(parameters, "(@ay)", &var);
496 len = g_variant_get_size(var);
497 data = (char *)g_variant_get_data(var);
499 _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_MANUFACTURER_DATA_CHANGED,
501 event_info->cb, event_info->user_data);
503 g_variant_unref(var);
504 } else if (strcasecmp(signal_name, BT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED) == 0) {
505 GVariant *var = NULL;
509 g_variant_get(parameters, "(@ay)", &var);
510 len = g_variant_get_size(var);
511 data = (char *)g_variant_get_data(var);
513 _bt_common_event_cb(BLUETOOTH_EVENT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED,
515 event_info->cb, event_info->user_data);
517 g_variant_unref(var);
518 } else if (strcasecmp(signal_name, BT_MANUFACTURER_DATA_CHANGED) == 0) {
519 GVariant *var = NULL;
523 g_variant_get(parameters, "(@ay)", &var);
524 len = g_variant_get_size(var);
525 data = (char *)g_variant_get_data(var);
527 _bt_common_event_cb(BLUETOOTH_EVENT_MANUFACTURER_DATA_CHANGED,
529 event_info->cb, event_info->user_data);
531 g_variant_unref(var);
532 } else if (strcasecmp(signal_name, BT_PASSKEY_NOTIFICATION) == 0) {
533 const char *address = NULL;
534 const char *passkey = NULL;
535 const char *passkey_info[2];
537 g_variant_get(parameters, "(&s&s)", &address, &passkey);
538 passkey_info[0] = address;
539 passkey_info[1] = passkey;
541 _bt_common_event_cb(BLUETOOTH_EVENT_PASSKEY_NOTIFICATION,
542 BLUETOOTH_ERROR_NONE, (void*)passkey_info,
543 event_info->cb, event_info->user_data);
544 } else if (strcasecmp(signal_name, BT_DEVICE_FOUND) == 0) {
546 bluetooth_device_info_t *device_info;
548 device_info = __bt_get_device_info_in_message(parameters,
550 ret_if(device_info == NULL);
552 if (strlen(device_info->device_name.name) > 0)
553 event = BLUETOOTH_EVENT_REMOTE_DEVICE_NAME_UPDATED;
555 event = BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND;
557 _bt_common_event_cb(event,
559 event_info->cb, event_info->user_data);
562 } else if (strcasecmp(signal_name, BT_BOND_CREATED) == 0) {
563 bluetooth_device_info_t *device_info;
565 device_info = __bt_get_device_info_in_message(parameters,
567 ret_if(device_info == NULL);
569 _bt_common_event_cb(BLUETOOTH_EVENT_BONDING_FINISHED,
571 event_info->cb, event_info->user_data);
574 } else if (strcasecmp(signal_name, BT_BOND_DESTROYED) == 0) {
575 const char *address = NULL;
576 bluetooth_device_address_t dev_address = { {0} };
578 g_variant_get(parameters, "(i&s)", &result, &address);
580 _bt_convert_addr_string_to_type(dev_address.addr,
583 _bt_common_event_cb(BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED,
584 result, &dev_address,
585 event_info->cb, event_info->user_data);
586 } else if (strcasecmp(signal_name, BT_SERVICE_SEARCHED) == 0) {
587 bluetooth_device_info_t *device_info;
588 bt_sdp_info_t sdp_info;
590 device_info = __bt_get_device_info_in_message(parameters,
592 ret_if(device_info == NULL);
594 memset(&sdp_info, 0x00, sizeof(bt_sdp_info_t));
596 sdp_info.service_index = device_info->service_index;
598 memcpy(&sdp_info.device_addr,
599 &device_info->device_address,
600 BLUETOOTH_ADDRESS_LENGTH);
602 memcpy(sdp_info.service_list_array,
603 device_info->service_list_array,
604 BLUETOOTH_MAX_SERVICES_FOR_DEVICE);
606 memcpy(sdp_info.uuids,
608 BLUETOOTH_MAX_SERVICES_FOR_DEVICE * BLUETOOTH_UUID_STRING_MAX);
610 _bt_common_event_cb(BLUETOOTH_EVENT_SERVICE_SEARCHED,
612 event_info->cb, event_info->user_data);
615 } else if (strcasecmp(signal_name, BT_IPSP_INITIALIZED) == 0) {
616 gboolean ipsp_intialized = FALSE;
617 g_variant_get(parameters, "(b)", &ipsp_intialized);
619 BT_DBG("IPSP init state changed to : %d", ipsp_intialized);
621 _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_INIT_STATE_CHANGED,
622 BLUETOOTH_ERROR_NONE, &ipsp_intialized,
623 event_info->cb, event_info->user_data);
624 } else if (strcasecmp(signal_name, BT_KBD_PASSKEY_DISPLAY_REQ_RECEIVED) == 0) {
625 const char *address = NULL;
626 const char *name = NULL;
627 const char *str_passkey = 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&s)", &result, &address, &name, &str_passkey);
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,
638 g_strlcpy(auth_info.str_passkey, str_passkey, strlen(str_passkey)+1);
640 _bt_common_event_cb(BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY,
642 event_info->cb, event_info->user_data);
643 } else if (strcasecmp(signal_name, BT_PIN_REQ_RECEIVED) == 0) {
644 const char *address = NULL;
645 const char *name = NULL;
647 bluetooth_authentication_request_info_t auth_info;
648 memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
650 g_variant_get(parameters, "(i&s&s)", &result, &address, &name);
652 g_strlcpy(auth_info.device_name.name, name,
653 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
654 _bt_convert_addr_string_to_type(auth_info.device_address.addr,
657 _bt_common_event_cb(BLUETOOTH_EVENT_PIN_REQUEST,
659 event_info->cb, event_info->user_data);
660 } else if (strcasecmp(signal_name, BT_PASSKEY_REQ_RECEIVED) == 0) {
661 const char *address = NULL;
662 const char *name = 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)", &result, &address, &name);
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,
674 _bt_common_event_cb(BLUETOOTH_EVENT_PASSKEY_REQUEST,
676 event_info->cb, event_info->user_data);
677 } else if (strcasecmp(signal_name, BT_PASSKEY_CFM_REQ_RECEIVED) == 0) {
678 const char *address = NULL;
679 const char *name = NULL;
680 const char *str_passkey = NULL;
682 bluetooth_authentication_request_info_t auth_info;
683 memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
685 g_variant_get(parameters, "(i&s&s&s)", &result, &address, &name, &str_passkey);
687 g_strlcpy(auth_info.device_name.name, name,
688 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
689 _bt_convert_addr_string_to_type(auth_info.device_address.addr,
691 g_strlcpy(auth_info.str_passkey, str_passkey, strlen(str_passkey)+1);
693 _bt_common_event_cb(BLUETOOTH_EVENT_PASSKEY_CONFIRM_REQUEST,
695 event_info->cb, event_info->user_data);
699 void __bt_adapter_le_event_filter(GDBusConnection *connection,
700 const gchar *sender_name,
701 const gchar *object_path,
702 const gchar *interface_name,
703 const gchar *signal_name,
704 GVariant *parameters,
707 bt_event_info_t *event_info;
708 int result = BLUETOOTH_ERROR_NONE;
710 event_info = (bt_event_info_t *)user_data;
711 ret_if(event_info == NULL);
713 if (strcasecmp(object_path, BT_LE_ADAPTER_PATH) != 0)
715 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
718 if (strcasecmp(signal_name, BT_LE_ENABLED) == 0) {
719 BT_INFO("BT_LE_ENABLED");
720 g_variant_get(parameters, "(i)", &result);
721 _bt_common_event_cb(BLUETOOTH_EVENT_LE_ENABLED,
723 event_info->cb, event_info->user_data);
724 } else if (strcasecmp(signal_name, BT_LE_DISABLED) == 0) {
725 BT_INFO("BT_LE_DISABLED");
726 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISABLED,
728 event_info->cb, event_info->user_data);
729 } else if (strcasecmp(signal_name, BT_LE_DISCOVERY_STARTED) == 0) {
730 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISCOVERY_STARTED,
731 BLUETOOTH_ERROR_NONE, NULL,
732 event_info->cb, event_info->user_data);
733 } else if (strcasecmp(signal_name, BT_LE_DISCOVERY_FINISHED) == 0) {
734 g_variant_get(parameters, "(i)", &result);
735 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISCOVERY_FINISHED,
737 event_info->cb, event_info->user_data);
738 } else if (strcasecmp(signal_name, BT_LE_DEVICE_FOUND) == 0) {
739 bluetooth_le_device_info_t *le_device_info;
741 le_device_info = __bt_get_le_device_info_in_message(parameters,
743 ret_if(le_device_info == NULL);
745 if (bluetooth_is_le_scanning() == TRUE) {
746 _bt_common_event_cb(BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND,
747 result, le_device_info,
748 event_info->cb, event_info->user_data);
751 g_free(le_device_info);
755 void __bt_device_event_filter(GDBusConnection *connection,
756 const gchar *sender_name,
757 const gchar *object_path,
758 const gchar *interface_name,
759 const gchar *signal_name,
760 GVariant *parameters,
763 bt_event_info_t *event_info;
764 int result = BLUETOOTH_ERROR_NONE;
766 event_info = (bt_event_info_t *)user_data;
767 ret_if(event_info == NULL);
770 gboolean gatt_interface = FALSE;
772 if (strcasecmp(interface_name, BT_GATT_CHARACTERISTIC_INTERFACE) == 0)
773 gatt_interface = TRUE;
775 if (strcasecmp(object_path, BT_DEVICE_PATH) != 0 &&
776 gatt_interface == FALSE)
778 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0 &&
779 gatt_interface == FALSE)
782 if (strcasecmp(object_path, BT_DEVICE_PATH) != 0)
784 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
788 ret_if(signal_name == NULL);
790 if (strcasecmp(signal_name, BT_GATT_CONNECTED) == 0) {
791 const char *address = NULL;
792 bluetooth_device_address_t dev_address = { {0} };
793 BT_DBG("BT_GATT_CONNECTED");
794 g_variant_get(parameters, "(i&s)", &result, &address);
796 _bt_convert_addr_string_to_type(dev_address.addr, address);
797 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_CONNECTED,
798 result, &dev_address,
799 event_info->cb, event_info->user_data);
800 } else if (strcasecmp(signal_name, BT_GATT_DISCONNECTED) == 0) {
801 const char *address = NULL;
802 bluetooth_device_address_t dev_address = { {0} };
803 BT_DBG("BT_GATT_DISCONNECTED");
804 g_variant_get(parameters, "(i&s)", &result, &address);
806 _bt_convert_addr_string_to_type(dev_address.addr, address);
807 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_DISCONNECTED,
808 result, &dev_address,
809 event_info->cb, event_info->user_data);
810 } else if (strcasecmp(signal_name, BT_GATT_REQ_ATT_MTU_CHANGED) == 0) {
811 const char *address = NULL;
812 bluetooth_device_address_t dev_address = { {0} };
813 bluetooth_le_att_mtu_info_t att_mtu_info;
816 BT_DBG("BT_GATT_REQ_ATT_MTU_CHANGED");
817 g_variant_get(parameters, "(i&sqy)", &result, &address, &mtu, &status);
819 _bt_convert_addr_string_to_type(dev_address.addr, address);
821 memset(&att_mtu_info, 0x00, sizeof(bluetooth_le_att_mtu_info_t));
822 memcpy(att_mtu_info.device_address.addr,
824 BLUETOOTH_ADDRESS_LENGTH);
826 att_mtu_info.mtu = mtu;
827 att_mtu_info.status = status;
829 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_ATT_MTU_CHANGED,
830 result, &att_mtu_info,
831 event_info->cb, event_info->user_data);
833 } else if (strcasecmp(signal_name, BT_GATT_BLUEZ_CHAR_VAL_CHANGED) == 0) {
835 } else if (strcasecmp(signal_name, BT_GATT_CHAR_VAL_CHANGED) == 0) {
837 const char *char_handle = NULL;
839 const char * value = NULL;
840 GVariant *char_value_var = NULL;
841 bt_gatt_char_value_t char_val = { 0, };
843 g_variant_get(parameters, "(i&s@ay)", &result, &char_handle, &char_value_var);
845 len = g_variant_get_size(char_value_var);
846 ret_if(char_value_var == NULL);
849 value = (char *)g_variant_get_data(char_value_var);
851 char_val.char_handle = g_strdup(char_handle);
852 char_val.val_len = len;
853 /* Fix : FORWARD_NULL : g_variant_get_data can return NULL */
854 if (char_val.val_len > 0 && value != NULL) {
855 char_val.char_value = (unsigned char*) g_malloc0(char_val.val_len);
856 /* Fix : NULL_RETURNS */
857 if (char_val.char_value == NULL) {
858 BT_ERR("BLUETOOTH_ERROR_OUT_OF_MEMORY");
859 g_free(char_val.char_handle);
860 g_variant_unref(char_value_var);
863 memcpy(char_val.char_value, value, len);
864 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED,
866 event_info->cb, event_info->user_data);
867 g_free(char_val.char_value);
868 g_variant_unref(char_value_var);
870 g_free(char_val.char_handle);
871 } else if (strcasecmp(signal_name, BT_DEVICE_CONNECTED) == 0) {
872 const char *address = NULL;
873 unsigned char addr_type;
874 bt_connection_info_t conn_info;
875 bluetooth_device_address_t dev_address = { {0} };
876 BT_DBG("BT_DEVICE_CONNECTED");
877 g_variant_get(parameters, "(i&sy)", &result, &address, &addr_type);
879 _bt_convert_addr_string_to_type(dev_address.addr,
882 memset(&conn_info, 0x00, sizeof(bt_connection_info_t));
884 memcpy(conn_info.device_addr.addr,
886 BLUETOOTH_ADDRESS_LENGTH);
888 conn_info.addr_type = addr_type;
889 conn_info.disc_reason = 0;
890 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_CONNECTED,
892 event_info->cb, event_info->user_data);
894 } else if (strcasecmp(signal_name, BT_DEVICE_DISCONNECTED) == 0) {
895 const char *address = NULL;
896 unsigned char addr_type;
897 bt_connection_info_t conn_info;
898 bluetooth_device_address_t dev_address = { {0} };
899 BT_DBG("BT_DEVICE_DISCONNECTED");
900 g_variant_get(parameters, "(i&sy)", &result, &address, &addr_type);
902 _bt_convert_addr_string_to_type(dev_address.addr,
905 memset(&conn_info, 0x00, sizeof(bt_connection_info_t));
907 memcpy(conn_info.device_addr.addr,
909 BLUETOOTH_ADDRESS_LENGTH);
911 conn_info.addr_type = addr_type;
912 conn_info.disc_reason = result;
913 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_DISCONNECTED,
915 event_info->cb, event_info->user_data);
917 } else if (strcasecmp(signal_name, BT_RSSI_MONITORING_ENABLED) == 0) {
918 bt_rssi_enabled_t enabled = { 0, };
921 gboolean rssi_enabled = FALSE;
923 g_variant_get(parameters, "(isib)", &result, &address,
924 &link_type, &rssi_enabled);
926 BT_DBG("RSSI Enabled[Address:%s LinkType:%d RSSI_dbm:%d]",
927 address, link_type, rssi_enabled);
928 enabled.address = address;
929 enabled.link_type = link_type;
930 enabled.rssi_enabled = rssi_enabled;
932 _bt_common_event_cb(BLUETOOTH_EVENT_RSSI_ENABLED,
934 event_info->cb, event_info->user_data);
935 } else if (strcasecmp(signal_name, BT_RSSI_ALERT) == 0) {
940 bt_rssi_alert_t alert = { 0, };
942 g_variant_get(parameters, "(isiii)", &result, &address,
943 &link_type, &alert_type, &rssi_dbm);
945 alert.alert_type = alert_type;
946 alert.rssi_dbm = rssi_dbm;
947 alert.address = address;
948 alert.link_type = link_type;
949 BT_DBG("Address [%s] LinkType[%d] AlertType[%d] RSSI dBm[%d]",
950 address, link_type, alert_type, rssi_dbm);
951 _bt_common_event_cb(BLUETOOTH_EVENT_RSSI_ALERT,
953 event_info->cb, event_info->user_data);
954 } else if (strcasecmp(signal_name, BT_RAW_RSSI_EVENT) == 0) {
958 bt_raw_rssi_t raw_rssi = { 0, };
960 g_variant_get(parameters, "(isii)", &result,
961 &address, &link_type, &rssi_dbm);
963 BT_DBG("Address [%s] Link Type[%d] dBm[%d]",
964 address, link_type, rssi_dbm);
966 raw_rssi.rssi_dbm = rssi_dbm;
967 raw_rssi.address = address;
968 raw_rssi.link_type = link_type;
970 _bt_common_event_cb(BLUETOOTH_EVENT_RAW_RSSI,
972 event_info->cb, event_info->user_data);
973 } else if (strcasecmp(signal_name, BT_DEVICE_AUTHORIZED) == 0) {
974 const char *address = NULL;
975 bluetooth_device_address_t dev_address = { {0} };
977 g_variant_get(parameters, "(i&s)", &result, &address);
979 _bt_convert_addr_string_to_type(dev_address.addr,
982 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_AUTHORIZED,
983 result, &dev_address,
984 event_info->cb, event_info->user_data);
985 } else if (strcasecmp(signal_name, BT_DEVICE_UNAUTHORIZED) == 0) {
986 const char *address = NULL;
987 bluetooth_device_address_t dev_address = { {0} };
989 g_variant_get(parameters, "(i&s)", &result, &address);
991 _bt_convert_addr_string_to_type(dev_address.addr,
994 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_UNAUTHORIZED,
995 result, &dev_address,
996 event_info->cb, event_info->user_data);
997 } else if (strcasecmp(signal_name, BT_SUPPORTED_PROFILE_TRUSTED) == 0) {
999 bt_supported_profile_trusted_t profile_info = { 0, };
1002 g_variant_get(parameters, "(i&si)", &result,
1005 BT_DBG("Address [%s] trust[%d]", address, trust);
1006 profile_info.address = address;
1007 if (trust & (PROFILE_SUPPORTED << 0)) { /* Bit 0 & 1 - for PBAP Supported */
1008 profile_info.profile = TRUSTED_PROFILE_PBAP;
1009 profile_info.supported = TRUE;
1010 if (trust & (1 << 1)) /* Bit 1 - for PBAP Trusted */
1011 profile_info.trusted = TRUE;
1013 profile_info.trusted = FALSE;
1015 _bt_common_event_cb(BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED,
1016 result, &profile_info,
1017 event_info->cb, event_info->user_data);
1019 if (trust & (PROFILE_SUPPORTED << 2)) { /* Bit 2 & 3 - for MAP Supported */
1020 profile_info.profile = TRUSTED_PROFILE_MAP;
1021 profile_info.supported = TRUE;
1022 if (trust & (1 << 3)) /* Bit 3 - for PBAP Trusted */
1023 profile_info.trusted = TRUE;
1025 profile_info.trusted = FALSE;
1027 _bt_common_event_cb(BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED,
1028 result, &profile_info,
1029 event_info->cb, event_info->user_data);
1031 if (trust & (PROFILE_SUPPORTED << 4)) { /* Bit 4 & 5- for SAP Supported */
1032 profile_info.profile = TRUSTED_PROFILE_SAP;
1033 profile_info.supported = TRUE;
1034 if (trust & (1 << 5)) /* Bit 5 - for SAP Trusted */
1035 profile_info.trusted = TRUE;
1037 profile_info.trusted = FALSE;
1039 _bt_common_event_cb(BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED,
1040 result, &profile_info,
1041 event_info->cb, event_info->user_data);
1043 } else if (strcasecmp(signal_name, BT_IPSP_CONNECTED) == 0) {
1044 const char *address = NULL;
1045 const char *if_name = NULL;
1046 bt_ipsp_connection_info_t bt_ipsp_iface_info;
1047 memset(&bt_ipsp_iface_info, 0, sizeof(bt_ipsp_iface_info));
1049 BT_DBG("BT_IPSP_CONNECTED");
1050 g_variant_get(parameters, "(i&s&s)", &result, &address, &if_name);
1052 _bt_convert_addr_string_to_type(bt_ipsp_iface_info.btaddr.addr, address);
1053 memcpy(bt_ipsp_iface_info.if_name, if_name, 16);
1055 _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_CONNECTED,
1056 result, &bt_ipsp_iface_info,
1057 event_info->cb, event_info->user_data);
1058 } else if (strcasecmp(signal_name, BT_IPSP_DISCONNECTED) == 0) {
1059 const char *address = NULL;
1060 const char *if_name = NULL;
1061 bt_ipsp_connection_info_t bt_ipsp_iface_info;
1062 memset(&bt_ipsp_iface_info, 0, sizeof(bt_ipsp_iface_info));
1064 BT_DBG("BT_IPSP_DISCONNECTED");
1065 g_variant_get(parameters, "(i&s&s)", &result, &address, &if_name);
1067 _bt_convert_addr_string_to_type(bt_ipsp_iface_info.btaddr.addr, address);
1068 memcpy(bt_ipsp_iface_info.if_name, if_name, 16);
1070 _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_DISCONNECTED,
1071 result, &bt_ipsp_iface_info,
1072 event_info->cb, event_info->user_data);
1073 } else if (strcasecmp(signal_name, BT_LE_DATA_LENGTH_CHANGED) == 0) {
1074 const char *address = NULL;
1075 bluetooth_device_address_t dev_address = { {0} };
1080 bt_le_data_length_params_t params;
1082 BT_DBG("BT_LE_DATA_LENGTH_CHANGED");
1084 g_variant_get(parameters, "(i&sqqqq)", &result, &address,
1085 tx_octets, tx_time, rx_octets, rx_time);
1087 params.max_tx_octets = tx_octets;
1088 params.max_tx_time = tx_time;
1089 params.max_rx_octets = rx_octets;
1090 params.max_rx_time = rx_time;
1092 _bt_convert_addr_string_to_type(dev_address.addr, address);
1094 memcpy(¶ms.device_address,
1095 &dev_address, BLUETOOTH_ADDRESS_LENGTH);
1097 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DATA_LENGTH_CHANGED,
1098 result, ¶ms, event_info->cb, event_info->user_data);
1099 } else if (strcasecmp(signal_name, BT_PXP_PROPERTY_CHANGED) == 0) {
1100 const char *address = NULL;
1101 bluetooth_device_address_t dev_address = { {0} };
1102 int role, type, level;
1103 bt_pxp_property_changed_params_t params;
1105 BT_DBG("BT_PXP_PROPERTY_CHANGED");
1107 g_variant_get(parameters, "(isiii)", &result, &address, &role, &type, &level);
1109 _bt_convert_addr_string_to_type(dev_address.addr, address);
1110 memcpy(¶ms.device_address, &dev_address, BLUETOOTH_ADDRESS_LENGTH);
1112 params.service_type = type;
1113 params.alert_lvl = level;
1115 _bt_common_event_cb(BLUETOOTH_EVENT_PXP_PROPERTY_CHANGED,
1116 result, ¶ms, event_info->cb, event_info->user_data);
1120 void __bt_hid_event_filter(GDBusConnection *connection,
1121 const gchar *sender_name,
1122 const gchar *object_path,
1123 const gchar *interface_name,
1124 const gchar *signal_name,
1125 GVariant *parameters,
1128 bt_event_info_t *event_info;
1129 int result = BLUETOOTH_ERROR_NONE;
1131 event_info = (bt_event_info_t *)user_data;
1132 ret_if(event_info == NULL);
1134 if (strcasecmp(object_path, BT_HID_PATH) != 0)
1136 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1139 ret_if(signal_name == NULL);
1141 if (strcasecmp(signal_name, BT_INPUT_CONNECTED) == 0) {
1142 const char *address = NULL;
1143 bluetooth_device_address_t dev_address = { {0} };
1145 g_variant_get(parameters, "(i&s)", &result, &address);
1147 _bt_convert_addr_string_to_type(dev_address.addr,
1150 _bt_input_event_cb(BLUETOOTH_HID_CONNECTED,
1151 result, &dev_address,
1152 event_info->cb, event_info->user_data);
1153 } else if (strcasecmp(signal_name, BT_INPUT_DISCONNECTED) == 0) {
1154 const char *address = NULL;
1155 bluetooth_device_address_t dev_address = { {0} };
1157 g_variant_get(parameters, "(i&s)", &result, &address);
1159 BT_DBG("address: %s", address);
1161 _bt_convert_addr_string_to_type(dev_address.addr,
1164 _bt_input_event_cb(BLUETOOTH_HID_DISCONNECTED,
1165 result, &dev_address,
1166 event_info->cb, event_info->user_data);
1170 void __bt_headset_event_filter(GDBusConnection *connection,
1171 const gchar *sender_name,
1172 const gchar *object_path,
1173 const gchar *interface_name,
1174 const gchar *signal_name,
1175 GVariant *parameters,
1178 bt_event_info_t *event_info;
1179 int result = BLUETOOTH_ERROR_NONE;
1180 event_info = (bt_event_info_t *)user_data;
1181 ret_if(event_info == NULL);
1183 if (strcasecmp(object_path, BT_HEADSET_PATH) != 0)
1185 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1188 ret_if(signal_name == NULL);
1190 if (strcasecmp(signal_name, BT_HEADSET_CONNECTED) == 0) {
1191 char *address = NULL;
1193 g_variant_get(parameters, "(i&s)", &result, &address);
1195 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_CONNECTED,
1197 event_info->cb, event_info->user_data);
1198 } else if (strcasecmp(signal_name, BT_HEADSET_DISCONNECTED) == 0) {
1199 char *address = NULL;
1201 g_variant_get(parameters, "(i&s)", &result, &address);
1203 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_DISCONNECTED,
1205 event_info->cb, event_info->user_data);
1206 } else if (strcasecmp(signal_name, BT_STEREO_HEADSET_CONNECTED) == 0) {
1207 char *address = NULL;
1209 g_variant_get(parameters, "(i&s)", &result, &address);
1211 _bt_headset_event_cb(BLUETOOTH_EVENT_AV_CONNECTED,
1213 event_info->cb, event_info->user_data);
1214 } else if (strcasecmp(signal_name, BT_STEREO_HEADSET_DISCONNECTED) == 0) {
1215 char *address = NULL;
1217 g_variant_get(parameters, "(i&s)", &result, &address);
1219 _bt_headset_event_cb(BLUETOOTH_EVENT_AV_DISCONNECTED,
1221 event_info->cb, event_info->user_data);
1222 } else if (strcasecmp(signal_name, BT_A2DP_SOURCE_CONNECTED) == 0) {
1223 char *address = NULL;
1225 g_variant_get(parameters, "(i&s)", &result, &address);
1226 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_CONNECTED,
1228 event_info->cb, event_info->user_data);
1229 } else if (strcasecmp(signal_name, BT_A2DP_SOURCE_DISCONNECTED) == 0) {
1230 char *address = NULL;
1232 g_variant_get(parameters, "(i&s)", &result, &address);
1234 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED,
1236 event_info->cb, event_info->user_data);
1237 } else if (strcasecmp(signal_name, BT_SPEAKER_GAIN) == 0) {
1240 char *address = NULL;
1242 g_variant_get(parameters, "(i&sq)", &result, &address,
1244 gain = (unsigned int)spkr_gain;
1246 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_SPEAKER_GAIN,
1248 event_info->cb, event_info->user_data);
1249 } else if (strcasecmp(signal_name, BT_MICROPHONE_GAIN) == 0) {
1252 char *address = NULL;
1254 g_variant_get(parameters, "(i&sq)", &result,
1255 &address, &mic_gain);
1256 gain = (unsigned int)mic_gain;
1258 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_MIC_GAIN,
1260 event_info->cb, event_info->user_data);
1264 void __bt_hid_device_event_filter(GDBusConnection *connection,
1265 const gchar *sender_name,
1266 const gchar *object_path,
1267 const gchar *interface_name,
1268 const gchar *signal_name,
1269 GVariant *parameters,
1272 bt_event_info_t *event_info;
1273 int result = BLUETOOTH_ERROR_NONE;
1275 event_info = (bt_event_info_t *)user_data;
1276 ret_if(event_info == NULL);
1277 if (strcasecmp(object_path, BT_HID_DEVICE_PATH) != 0)
1279 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1282 ret_if(signal_name == NULL);
1284 if (strcasecmp(signal_name, BT_HID_DEVICE_CONNECTED) == 0) {
1285 const char *address = NULL;
1286 bluetooth_device_address_t dev_address = { {0} };
1288 g_variant_get(parameters, "(i&s)", &result, &address);
1290 _bt_convert_addr_string_to_type(dev_address.addr,
1293 _bt_input_event_cb(BLUETOOTH_HID_DEVICE_CONNECTED,
1294 result, &dev_address,
1295 event_info->cb, event_info->user_data);
1296 } else if (strcasecmp(signal_name, BT_HID_DEVICE_DISCONNECTED) == 0) {
1297 const char *address = NULL;
1298 bluetooth_device_address_t dev_address = { {0} };
1300 g_variant_get(parameters, "(i&s)", &result, &address);
1302 BT_DBG("address: %s", address);
1304 _bt_convert_addr_string_to_type(dev_address.addr,
1307 _bt_input_event_cb(BLUETOOTH_HID_DEVICE_DISCONNECTED,
1308 result, &dev_address,
1309 event_info->cb, event_info->user_data);
1310 } else if (strcasecmp(signal_name, BT_INPUT_HID_DEVICE_CONNECTED) == 0) {
1311 BT_INFO_C("Type %s", g_variant_get_type_string(parameters));
1312 const char *address = NULL;
1313 bluetooth_device_address_t dev_address = { {0} };
1315 g_variant_get(parameters, "(i&s)", &result, &address);
1317 BT_DBG("address: %s", address);
1318 _bt_convert_addr_string_to_type(dev_address.addr,
1320 int ctrl = -1, intr = -1;
1321 _bt_hid_device_get_fd(address, &ctrl, &intr);
1322 if (ctrl != -1 && intr != -1) {
1323 new_hid_connection(NULL, ctrl, &dev_address);
1324 new_hid_connection(NULL, intr, &dev_address);
1326 } else if (strcasecmp(signal_name, BT_INPUT_HID_DEVICE_DISCONNECTED) == 0) {
1327 const char *address = NULL;
1328 g_variant_get(parameters, "(i&s)", &result, &address);
1330 BT_DBG("address: %s", address);
1333 void __bt_a2dp_source_event_filter(GDBusConnection *connection,
1334 const gchar *sender_name,
1335 const gchar *object_path,
1336 const gchar *interface_name,
1337 const gchar *signal_name,
1338 GVariant *parameters,
1341 bt_event_info_t *event_info;
1342 int result = BLUETOOTH_ERROR_NONE;
1343 event_info = (bt_event_info_t *)user_data;
1344 ret_if(event_info == NULL);
1346 if (strcasecmp(object_path, BT_A2DP_SOURCE_PATH) != 0)
1348 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1351 ret_if(signal_name == NULL);
1353 if (strcasecmp(signal_name, BT_A2DP_SOURCE_CONNECTED) == 0) {
1354 char *address = NULL;
1356 g_variant_get(parameters, "(i&s)", &result, &address);
1357 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_CONNECTED,
1359 event_info->cb, event_info->user_data);
1360 } else if (strcasecmp(signal_name, BT_A2DP_SOURCE_DISCONNECTED) == 0) {
1361 char *address = NULL;
1363 g_variant_get(parameters, "(i&s)", &result, &address);
1365 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED,
1367 event_info->cb, event_info->user_data);
1371 void __bt_network_event_filter(GDBusConnection *connection,
1372 const gchar *sender_name,
1373 const gchar *object_path,
1374 const gchar *interface_name,
1375 const gchar *signal_name,
1376 GVariant *parameters,
1379 bt_event_info_t *event_info;
1380 int result = BLUETOOTH_ERROR_NONE;
1381 event_info = (bt_event_info_t *)user_data;
1382 ret_if(event_info == NULL);
1384 if (strcasecmp(object_path, BT_NETWORK_PATH) != 0)
1386 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1389 ret_if(signal_name == NULL);
1391 if (strcasecmp(signal_name, BT_NETWORK_CONNECTED) == 0) {
1392 const char *address = NULL;
1393 bluetooth_device_address_t dev_address = { {0} };
1395 g_variant_get(parameters, "(i&s)", &result, &address);
1397 _bt_convert_addr_string_to_type(dev_address.addr,
1400 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_CONNECTED,
1401 result, &dev_address,
1402 event_info->cb, event_info->user_data);
1403 } else if (strcasecmp(signal_name, BT_NETWORK_DISCONNECTED) == 0) {
1404 const char *address = NULL;
1405 bluetooth_device_address_t dev_address = { {0} };
1407 g_variant_get(parameters, "(i&s)", &result, &address);
1409 _bt_convert_addr_string_to_type(dev_address.addr,
1412 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_DISCONNECTED,
1413 result, &dev_address,
1414 event_info->cb, event_info->user_data);
1415 } else if (strcasecmp(signal_name, BT_NETWORK_SERVER_CONNECTED) == 0) {
1416 const char *device = NULL;
1417 const char *address = NULL;
1418 bluetooth_network_device_info_t network_info;
1420 g_variant_get(parameters, "(i&s&s)", &result,
1423 memset(&network_info, 0x00, sizeof(bluetooth_network_device_info_t));
1425 _bt_convert_addr_string_to_type(network_info.device_address.addr,
1428 _bt_print_device_address_t(&network_info.device_address);
1429 g_strlcpy(network_info.interface_name, device,
1430 sizeof(network_info.interface_name));
1432 DBG_SECURE("Interface: %s", network_info.interface_name);
1434 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED,
1435 result, &network_info,
1436 event_info->cb, event_info->user_data);
1437 } else if (strcasecmp(signal_name, BT_NETWORK_SERVER_DISCONNECTED) == 0) {
1438 const char *device = NULL;
1439 const char *address = NULL;
1440 bluetooth_network_device_info_t network_info;
1442 g_variant_get(parameters, "(i&s&s)", &result, &device, &address);
1444 memset(&network_info, 0x00, sizeof(bluetooth_network_device_info_t));
1446 _bt_convert_addr_string_to_type(network_info.device_address.addr,
1449 _bt_print_device_address_t(&network_info.device_address);
1451 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED,
1452 result, &network_info,
1453 event_info->cb, event_info->user_data);
1457 void __bt_avrcp_event_filter(GDBusConnection *connection,
1458 const gchar *sender_name,
1459 const gchar *object_path,
1460 const gchar *interface_name,
1461 const gchar *signal_name,
1462 GVariant *parameters,
1465 bt_event_info_t *event_info;
1466 int result = BLUETOOTH_ERROR_NONE;
1467 event_info = (bt_event_info_t *)user_data;
1468 ret_if(event_info == NULL);
1470 if (strcasecmp(object_path, BT_AVRCP_PATH) != 0)
1472 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1475 ret_if(signal_name == NULL);
1477 if (strcasecmp(signal_name, BT_AVRCP_CONNECTED) == 0) {
1478 char *address = NULL;
1480 g_variant_get(parameters, "(i&s)", &result, &address);
1482 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONNECTED,
1484 event_info->cb, event_info->user_data);
1485 } else if (strcasecmp(signal_name, BT_AVRCP_DISCONNECTED) == 0) {
1486 char *address = NULL;
1488 g_variant_get(parameters, "(i&s)", &result, &address);
1490 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_DISCONNECTED,
1492 event_info->cb, event_info->user_data);
1493 } else if (strcasecmp(signal_name, BT_MEDIA_SHUFFLE_STATUS) == 0) {
1494 unsigned int status;
1496 g_variant_get(parameters, "(u)", &status);
1497 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_SHUFFLE_STATUS,
1499 event_info->cb, event_info->user_data);
1500 } else if (strcasecmp(signal_name, BT_MEDIA_EQUALIZER_STATUS) == 0) {
1501 unsigned int status;
1503 g_variant_get(parameters, "(u)", &status);
1504 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_EQUALIZER_STATUS,
1506 event_info->cb, event_info->user_data);
1507 } else if (strcasecmp(signal_name, BT_MEDIA_REPEAT_STATUS) == 0) {
1508 unsigned int status;
1510 g_variant_get(parameters, "(u)", &status);
1511 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_REPEAT_STATUS,
1513 event_info->cb, event_info->user_data);
1514 } else if (strcasecmp(signal_name, BT_MEDIA_SCAN_STATUS) == 0) {
1515 unsigned int status;
1517 g_variant_get(parameters, "(u)", &status);
1518 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_SCAN_STATUS,
1520 event_info->cb, event_info->user_data);
1524 void __bt_avrcp_control_event_filter(GDBusConnection *connection,
1525 const gchar *sender_name,
1526 const gchar *object_path,
1527 const gchar *interface_name,
1528 const gchar *signal_name,
1529 GVariant *parameters,
1532 bt_event_info_t *event_info;
1533 int result = BLUETOOTH_ERROR_NONE;
1534 event_info = (bt_event_info_t *)user_data;
1535 ret_if(event_info == NULL);
1537 if (strcasecmp(object_path, BT_AVRCP_CONTROL_PATH) != 0)
1539 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1542 ret_if(signal_name == NULL);
1544 if (strcasecmp(signal_name, BT_AVRCP_CONNECTED) == 0) {
1545 char *address = NULL;
1547 g_variant_get(parameters, "(i&s)", &result, &address);
1549 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_CONNECTED,
1551 event_info->cb, event_info->user_data);
1552 } else if (strcasecmp(signal_name, BT_AVRCP_DISCONNECTED) == 0) {
1553 char *address = NULL;
1555 g_variant_get(parameters, "(i&s)", &result, &address);
1557 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_DISCONNECTED,
1559 event_info->cb, event_info->user_data);
1560 } else if (strcasecmp(signal_name, BT_MEDIA_SHUFFLE_STATUS) == 0) {
1561 unsigned int status;
1563 g_variant_get(parameters, "(u)", &status);
1564 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_SHUFFLE_STATUS,
1566 event_info->cb, event_info->user_data);
1567 } else if (strcasecmp(signal_name, BT_MEDIA_EQUALIZER_STATUS) == 0) {
1568 unsigned int status;
1570 g_variant_get(parameters, "(u)", &status);
1571 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_EQUALIZER_STATUS,
1573 event_info->cb, event_info->user_data);
1574 } else if (strcasecmp(signal_name, BT_MEDIA_REPEAT_STATUS) == 0) {
1575 unsigned int status;
1577 g_variant_get(parameters, "(u)", &status);
1578 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_REPEAT_STATUS,
1580 event_info->cb, event_info->user_data);
1581 } else if (strcasecmp(signal_name, BT_MEDIA_SCAN_STATUS) == 0) {
1582 unsigned int status;
1584 g_variant_get(parameters, "(u)", &status);
1585 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_SCAN_STATUS,
1587 event_info->cb, event_info->user_data);
1588 } else if (strcasecmp(signal_name, BT_MEDIA_PLAY_STATUS) == 0) {
1589 unsigned int status;
1591 g_variant_get(parameters, "(u)", &status);
1592 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_PLAY_STATUS_CHANGED,
1594 event_info->cb, event_info->user_data);
1595 } else if (strcasecmp(signal_name, BT_MEDIA_POSITION_STATUS) == 0) {
1596 unsigned int status;
1598 g_variant_get(parameters, "(u)", &status);
1599 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SONG_POSITION_STATUS,
1601 event_info->cb, event_info->user_data);
1602 } else if (strcasecmp(signal_name, BT_MEDIA_TRACK_CHANGE) == 0) {
1603 media_metadata_attributes_t metadata;
1608 unsigned int total_tracks;
1609 unsigned int number;
1610 unsigned int duration;
1612 g_variant_get(parameters, "(&s&s&s&suuu)", &title,
1613 &artist, &album, &genre,
1614 &total_tracks, &number,
1616 memset(&metadata, 0x00, sizeof(media_metadata_attributes_t));
1618 metadata.title = title;
1619 metadata.artist = artist;
1620 metadata.album = album;
1621 metadata.genre = genre;
1622 metadata.total_tracks = total_tracks;
1623 metadata.number = number;
1624 metadata.duration = (int64_t)duration;
1626 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_TRACK_CHANGED,
1628 event_info->cb, event_info->user_data);
1632 void __bt_opp_client_event_filter(GDBusConnection *connection,
1633 const gchar *sender_name,
1634 const gchar *object_path,
1635 const gchar *interface_name,
1636 const gchar *signal_name,
1637 GVariant *parameters,
1640 bt_event_info_t *event_info;
1641 int result = BLUETOOTH_ERROR_NONE;
1642 event_info = (bt_event_info_t *)user_data;
1643 ret_if(event_info == NULL);
1645 if (strcasecmp(object_path, BT_OPP_CLIENT_PATH) != 0)
1647 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1650 ret_if(signal_name == NULL);
1652 if (strcasecmp(signal_name, BT_OPP_CONNECTED) == 0) {
1653 const char *address = NULL;
1655 bluetooth_device_address_t dev_address = { {0} };
1657 g_variant_get(parameters, "(i&si)", &result,
1658 &address, &request_id);
1660 if (__bt_is_request_id_exist(request_id) == FALSE) {
1661 BT_ERR("Different request id!");
1665 _bt_convert_addr_string_to_type(dev_address.addr,
1668 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_CONNECTED,
1669 result, &dev_address,
1670 event_info->cb, event_info->user_data);
1672 if (result != BLUETOOTH_ERROR_NONE)
1673 __bt_remove_push_request_id(request_id);
1675 } else if (strcasecmp(signal_name, BT_OPP_DISCONNECTED) == 0) {
1676 const char *address = NULL;
1678 bluetooth_device_address_t dev_address = { {0} };
1680 g_variant_get(parameters, "(i&si)", &result, &address,
1683 if (__bt_is_request_id_exist(request_id) == FALSE) {
1684 BT_ERR("Different request id!");
1688 _bt_convert_addr_string_to_type(dev_address.addr,
1691 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_DISCONNECTED,
1692 result, &dev_address,
1693 event_info->cb, event_info->user_data);
1695 __bt_remove_push_request_id(request_id);
1696 } else if (strcasecmp(signal_name, BT_TRANSFER_STARTED) == 0) {
1697 const char *file_name = NULL;
1698 const char *device_addr = NULL;
1701 bt_opc_transfer_info_t transfer_info;
1703 g_variant_get(parameters, "(i&s&sti)", &result, &device_addr, &file_name,
1704 &size, &request_id);
1706 if (__bt_is_request_id_exist(request_id) == FALSE) {
1707 BT_ERR("Different request id!");
1711 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1713 transfer_info.filename = g_strdup(file_name);
1714 transfer_info.device_addr = g_strdup(device_addr);
1715 transfer_info.size = size;
1717 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_STARTED,
1718 result, &transfer_info,
1719 event_info->cb, event_info->user_data);
1721 g_free(transfer_info.device_addr);
1722 g_free(transfer_info.filename);
1723 } else if (strcasecmp(signal_name, BT_TRANSFER_PROGRESS) == 0) {
1724 const char *file_name = NULL;
1728 bt_opc_transfer_info_t transfer_info;
1730 g_variant_get(parameters, "(i&stii)", &result,
1731 &file_name, &size, &progress, &request_id);
1733 if (__bt_is_request_id_exist(request_id) == FALSE) {
1734 BT_ERR("Different request id!");
1738 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1740 transfer_info.filename = g_strdup(file_name);
1741 transfer_info.size = size;
1742 transfer_info.percentage = progress;
1744 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS,
1745 result, &transfer_info,
1746 event_info->cb, event_info->user_data);
1748 g_free(transfer_info.filename);
1749 } else if (strcasecmp(signal_name, BT_TRANSFER_COMPLETED) == 0) {
1750 const char *file_name = NULL;
1751 const char *device_addr = NULL;
1754 bt_opc_transfer_info_t transfer_info;
1756 g_variant_get(parameters, "(i&s&sti)", &result, &device_addr,
1757 &file_name, &size, &request_id);
1759 if (__bt_is_request_id_exist(request_id) == FALSE) {
1760 BT_ERR("Different request id!");
1764 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1766 transfer_info.device_addr = g_strdup(device_addr);
1767 transfer_info.filename = g_strdup(file_name);
1768 transfer_info.size = size;
1770 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE,
1771 result, &transfer_info,
1772 event_info->cb, event_info->user_data);
1774 g_free(transfer_info.device_addr);
1775 g_free(transfer_info.filename);
1779 void __bt_opp_server_event_filter(GDBusConnection *connection,
1780 const gchar *sender_name,
1781 const gchar *object_path,
1782 const gchar *interface_name,
1783 const gchar *signal_name,
1784 GVariant *parameters,
1787 bt_event_info_t *event_info;
1788 int result = BLUETOOTH_ERROR_NONE;
1789 event_info = (bt_event_info_t *)user_data;
1790 ret_if(event_info == NULL);
1792 if (strcasecmp(object_path, BT_OPP_SERVER_PATH) != 0)
1794 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1797 ret_if(signal_name == NULL);
1799 if (strcasecmp(signal_name, BT_TRANSFER_AUTHORIZED) == 0) {
1800 /* Native only event */
1801 const char *file_name = NULL;
1802 const char *address = NULL;
1803 const char *device_name = NULL;
1805 bt_obex_server_authorize_into_t auth_info;
1807 g_variant_get(parameters, "(i&st&s&s)", &result, &file_name, &size,
1808 &address, &device_name);
1810 /* OSP server: Don't get this event */
1811 ret_if(obex_server_id == BT_CUSTOM_SERVER);
1813 memset(&auth_info, 0x00, sizeof(bt_obex_server_authorize_into_t));
1815 auth_info.filename = g_strdup(file_name);
1816 auth_info.length = size;
1817 auth_info.address = g_strdup(address);
1818 auth_info.name = g_strdup(device_name);
1819 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE,
1821 event_info->cb, event_info->user_data);
1823 g_free(auth_info.filename);
1824 g_free(auth_info.address);
1825 g_free(auth_info.name);
1826 } else if (strcasecmp(signal_name, BT_CONNECTION_AUTHORIZED) == 0) {
1827 /* OSP only event */
1828 const char *address = NULL;
1829 const char *name = NULL;
1830 bluetooth_device_address_t dev_address = { {0} };
1832 g_variant_get(parameters, "(i&s&s)", &result, &address, &name);
1834 /* Native server: Don't get this event */
1835 ret_if(obex_server_id == BT_NATIVE_SERVER);
1837 _bt_convert_addr_string_to_type(dev_address.addr,
1840 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE,
1841 result, &dev_address,
1842 event_info->cb, event_info->user_data);
1843 } else if (strcasecmp(signal_name, BT_TRANSFER_CONNECTED) == 0) {
1844 bt_obex_server_connection_info_t conn_info = {0, };
1845 char *address = NULL;
1847 int transfer_id = -1;
1848 g_variant_get(parameters, "(i&s&si)", &result,
1849 &address, &name, &transfer_id);
1851 conn_info.address = g_strdup(address);
1852 conn_info.device_name = g_strdup(name);
1853 conn_info.transfer_id = transfer_id;
1855 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_CONNECTED,
1856 result, &conn_info, event_info->cb,
1857 event_info->user_data);
1859 g_free(conn_info.address);
1860 g_free(conn_info.device_name);
1861 } else if (strcasecmp(signal_name, BT_TRANSFER_DISCONNECTED) == 0) {
1862 bt_obex_server_transfer_info_t transfer_info = {0, };
1863 char *address = NULL;
1864 int transfer_id = -1;
1865 g_variant_get(parameters, "(i&si)", &result, &address, &transfer_id);
1866 DBG_SECURE("address: %s, transfer_id: %d", address, transfer_id);
1868 transfer_info.address = g_strdup(address);
1869 transfer_info.transfer_id = transfer_id;
1871 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED,
1872 result, &transfer_info, event_info->cb,
1873 event_info->user_data);
1874 g_free(transfer_info.address);
1875 } else if (strcasecmp(signal_name, BT_TRANSFER_STARTED) == 0) {
1876 const char *device_name = NULL;
1877 const char *file_name = NULL;
1878 const char *type = NULL;
1879 const char *address = NULL;
1880 GVariantIter *iter = NULL;
1883 int transfer_id = 0;
1884 int server_type = 0; /* bt_server_type_t */
1886 bt_obex_server_transfer_info_t transfer_info;
1888 g_variant_get(parameters, "(i&s&s&s&stii(ay))", &result, &device_name,
1889 &file_name, &type, &address, &size, &transfer_id, &server_type, &iter);
1891 /* Other server's event */
1892 ret_if(obex_server_id != server_type &&
1893 server_type != BT_FTP_SERVER);
1895 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
1897 transfer_info.contact_auth_info = g_malloc0(sizeof(unsigned char) * 5);
1899 for (i = 0; i < 5 && g_variant_iter_loop(iter, "y", &byte); ++i)
1900 transfer_info.contact_auth_info[i] = byte;
1902 transfer_info.device_name = g_strdup(device_name);
1903 transfer_info.filename = g_strdup(file_name);
1904 transfer_info.type = g_strdup(type);
1905 transfer_info.address = g_strdup(address);
1906 transfer_info.file_size = size;
1907 transfer_info.transfer_id = transfer_id;
1908 transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
1909 FTP_SERVER : OPP_SERVER;
1911 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED,
1912 result, &transfer_info,
1913 event_info->cb, event_info->user_data);
1915 g_free(transfer_info.filename);
1916 g_free(transfer_info.type);
1917 g_free(transfer_info.device_name);
1918 g_free(transfer_info.address);
1919 g_free(transfer_info.contact_auth_info);
1920 g_variant_iter_free(iter);
1921 } else if (strcasecmp(signal_name, BT_TRANSFER_PROGRESS) == 0) {
1922 const char *file_name = NULL;
1923 const char *type = NULL;
1924 const char *device_name = NULL;
1925 const char *address = NULL;
1926 int transfer_id = 0;
1928 int server_type = 0; /* bt_server_type_t */
1930 bt_obex_server_transfer_info_t transfer_info;
1932 g_variant_get(parameters, "(i&s&s&s&stiii)", &result, &file_name,
1933 &type, &device_name, &address, &size, &transfer_id,
1934 &progress, &server_type);
1936 /* Other server's event */
1937 ret_if(obex_server_id != server_type &&
1938 server_type != BT_FTP_SERVER);
1940 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
1942 transfer_info.filename = g_strdup(file_name);
1943 transfer_info.type = g_strdup(type);
1944 transfer_info.device_name = g_strdup(device_name);
1945 transfer_info.address = g_strdup(address);
1946 transfer_info.file_size = size;
1947 transfer_info.transfer_id = transfer_id;
1948 transfer_info.percentage = progress;
1949 transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
1950 FTP_SERVER : OPP_SERVER;
1952 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS,
1953 result, &transfer_info,
1954 event_info->cb, event_info->user_data);
1956 g_free(transfer_info.filename);
1957 g_free(transfer_info.device_name);
1958 g_free(transfer_info.address);
1959 g_free(transfer_info.type);
1960 } else if (strcasecmp(signal_name, BT_TRANSFER_COMPLETED) == 0) {
1961 const char *file_name = NULL;
1962 const char *device_name = NULL;
1963 const char *address = NULL;
1964 const char *type = NULL;
1965 const char *file_path;
1966 int transfer_id = 0;
1967 int server_type = 0; /* bt_server_type_t */
1969 bt_obex_server_transfer_info_t transfer_info;
1971 g_variant_get(parameters, "(i&s&s&s&s&stii)", &result, &file_name,
1972 &type, &device_name, &file_path, &address, &size,
1973 &transfer_id, &server_type);
1975 /* Other server's event */
1976 ret_if(obex_server_id != server_type &&
1977 server_type != BT_FTP_SERVER);
1979 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
1981 transfer_info.filename = g_strdup(file_name);
1982 transfer_info.type = g_strdup(type);
1983 transfer_info.device_name = g_strdup(device_name);
1984 transfer_info.file_path = g_strdup(file_path);
1985 transfer_info.address = g_strdup(address);
1986 transfer_info.file_size = size;
1987 transfer_info.transfer_id = transfer_id;
1988 transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
1989 FTP_SERVER : OPP_SERVER;
1991 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_COMPLETED,
1992 result, &transfer_info,
1993 event_info->cb, event_info->user_data);
1995 g_free(transfer_info.filename);
1996 g_free(transfer_info.type);
1997 g_free(transfer_info.device_name);
1998 g_free(transfer_info.address);
1999 g_free(transfer_info.file_path);
2003 void __bt_pbap_client_event_filter(GDBusConnection *connection,
2004 const gchar *sender_name,
2005 const gchar *object_path,
2006 const gchar *interface_name,
2007 const gchar *signal_name,
2008 GVariant *parameters,
2011 bt_event_info_t *event_info;
2012 int result = BLUETOOTH_ERROR_NONE;
2013 event_info = (bt_event_info_t *)user_data;
2015 ret_if(event_info == NULL);
2017 if (strcasecmp(object_path, BT_PBAP_CLIENT_PATH) != 0)
2020 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
2023 ret_if(signal_name == NULL);
2025 BT_DBG("Type: %s", g_variant_get_type_string(parameters));
2027 if (strcasecmp(signal_name, BT_PBAP_CONNECTED) == 0) {
2028 bt_pbap_connected_t connected = { { { 0 }, }, };
2029 char *address = NULL;
2031 g_variant_get(parameters, "(i&s)", &result, &address);
2032 BT_DBG("address: %s", address);
2034 _bt_convert_addr_string_to_type(connected.btaddr.addr,
2037 connected.connected = 1;
2039 connected.connected = 0;
2041 _bt_common_event_cb(BLUETOOTH_PBAP_CONNECTED,
2043 event_info->cb, event_info->user_data);
2044 } else if (strcasecmp(signal_name, BT_PBAP_DISCONNECTED) == 0) {
2045 bt_pbap_connected_t disconnected = { { { 0 }, }, };
2046 char *address = NULL;
2048 g_variant_get(parameters, "(i&s)", &result, &address);
2049 BT_DBG("address: %s", address);
2051 _bt_convert_addr_string_to_type(disconnected.btaddr.addr,
2053 disconnected.connected = 0;
2055 _bt_common_event_cb(BLUETOOTH_PBAP_DISCONNECTED,
2056 result, &disconnected,
2057 event_info->cb, event_info->user_data);
2058 } else if (strcasecmp(signal_name, BT_PBAP_PHONEBOOK_SIZE) == 0) {
2059 bt_pbap_phonebook_size_t pb_size = { { { 0 }, }, };
2060 char *address = NULL;
2063 g_variant_get(parameters, "(i&si)", &result, &address, &size);
2065 BT_DBG("address: %s, size: %d", address, size);
2067 _bt_convert_addr_string_to_type(pb_size.btaddr.addr,
2069 pb_size.size = size;
2071 _bt_common_event_cb(BLUETOOTH_PBAP_PHONEBOOK_SIZE,
2073 event_info->cb, event_info->user_data);
2074 } else if (strcasecmp(signal_name, BT_PBAP_PHONEBOOK_PULL) == 0) {
2075 bt_pbap_phonebook_pull_t pb_pull = { { { 0 } }, };
2076 char *address = NULL;
2077 char *vcf_file = NULL;
2080 g_variant_get(parameters, "(i&s&si)", &result, &address, &vcf_file, &success);
2082 BT_DBG("address: %s, vcf_file: %s, success: %d",
2083 address, vcf_file, success);
2085 _bt_convert_addr_string_to_type(pb_pull.btaddr.addr,
2087 pb_pull.vcf_file = vcf_file;
2088 pb_pull.success = success;
2089 _bt_common_event_cb(BLUETOOTH_PBAP_PHONEBOOK_PULL,
2091 event_info->cb, event_info->user_data);
2092 } else if (strcasecmp(signal_name, BT_PBAP_VCARD_LIST) == 0) {
2093 bt_pbap_vcard_list_t vc_list = { { { 0 } }, };
2094 char *address = NULL;
2096 gchar **list = NULL;
2097 GVariant *string_var;
2101 g_variant_get(parameters, "(i&sv)", &result, &address, &string_var);
2103 list = (gchar **)g_variant_get_strv(string_var, &count);
2107 for (i = 0; i < count; i++)
2108 BT_DBG("%s", list[i]);
2110 BT_DBG("address: %s, result: %d, count: %d, success: %d",
2111 address, result, count, success);
2113 _bt_convert_addr_string_to_type(vc_list.btaddr.addr,
2115 vc_list.vcards = list;
2116 vc_list.length = count;
2117 vc_list.success = success;
2118 _bt_common_event_cb(BLUETOOTH_PBAP_VCARD_LIST,
2120 event_info->cb, event_info->user_data);
2122 g_variant_unref(string_var);
2124 } else if (strcasecmp(signal_name, BT_PBAP_VCARD_PULL) == 0) {
2125 bt_pbap_vcard_pull_t vc_pull = { { { 0 } }, };
2126 char *address = NULL;
2127 char *vcf_file = NULL;
2130 g_variant_get(parameters, "(i&s&si)",
2131 &result, &address, &vcf_file, &success);
2133 BT_DBG("address: %s, vcf_file: %s, success: %d",
2134 address, vcf_file, success);
2136 _bt_convert_addr_string_to_type(vc_pull.btaddr.addr, address);
2137 vc_pull.vcf_file = vcf_file;
2138 vc_pull.success = success;
2139 _bt_common_event_cb(BLUETOOTH_PBAP_VCARD_PULL,
2141 event_info->cb, event_info->user_data);
2142 } else if (strcasecmp(signal_name, BT_PBAP_SEARCH_PHONEBOOK) == 0) {
2143 bt_pbap_phonebook_search_list_t vc_list = { { { 0 } }, };
2144 char *address = NULL;
2146 gchar **list = NULL;
2147 GVariant *string_var;
2151 g_variant_get(parameters, "(i&s@as)", &result, &address, &string_var);
2153 list = (gchar **)g_variant_get_strv(string_var, &count);
2155 for (i = 0; i < count; i++)
2156 BT_DBG("%s", list[i]);
2158 BT_DBG("address: %s success: %d", address, success);
2160 _bt_convert_addr_string_to_type(vc_list.btaddr.addr, address);
2161 vc_list.vcards = list;
2162 vc_list.length = count;
2163 vc_list.success = success;
2164 _bt_common_event_cb(BLUETOOTH_PBAP_PHONEBOOK_SEARCH,
2166 event_info->cb, event_info->user_data);
2168 g_variant_unref(string_var);
2173 void __bt_rfcomm_client_event_filter(GDBusConnection *connection,
2174 const gchar *sender_name,
2175 const gchar *object_path,
2176 const gchar *interface_name,
2177 const gchar *signal_name,
2178 GVariant *parameters,
2181 bt_event_info_t *event_info;
2182 int result = BLUETOOTH_ERROR_NONE;
2183 event_info = (bt_event_info_t *)user_data;
2184 ret_if(event_info == NULL);
2186 if (strcasecmp(object_path, BT_RFCOMM_CLIENT_PATH) != 0)
2188 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
2191 ret_if(signal_name == NULL);
2193 if (strcasecmp(signal_name, BT_RFCOMM_CONNECTED) == 0) {
2194 const char *address = NULL;
2195 const char *uuid = NULL;
2197 bluetooth_rfcomm_connection_t conn_info;
2199 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2202 memset(&conn_info, 0x00, sizeof(bluetooth_rfcomm_connection_t));
2203 conn_info.device_role = RFCOMM_ROLE_CLIENT;
2204 g_strlcpy(conn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2205 conn_info.socket_fd = socket_fd;
2206 _bt_convert_addr_string_to_type(conn_info.device_addr.addr,
2209 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_CONNECTED,
2211 event_info->cb, event_info->user_data);
2212 } else if (strcasecmp(signal_name, BT_RFCOMM_DISCONNECTED) == 0) {
2213 const char *address = NULL;
2214 const char *uuid = NULL;
2216 bluetooth_rfcomm_disconnection_t disconn_info;
2218 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2221 memset(&disconn_info, 0x00, sizeof(bluetooth_rfcomm_disconnection_t));
2222 disconn_info.device_role = RFCOMM_ROLE_CLIENT;
2223 g_strlcpy(disconn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2224 disconn_info.socket_fd = socket_fd;
2225 _bt_convert_addr_string_to_type(disconn_info.device_addr.addr,
2228 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DISCONNECTED,
2229 result, &disconn_info,
2230 event_info->cb, event_info->user_data);
2231 } else if (strcasecmp(signal_name, BT_RFCOMM_DATA_RECEIVED) == 0) {
2235 bluetooth_rfcomm_received_data_t data_r;
2238 g_variant_get(parameters, "(in@ay)", &result, &socket_fd,
2241 buffer_len = g_variant_get_size(byte_var);
2242 buffer = (char *) g_variant_get_data(byte_var);
2244 data_r.socket_fd = socket_fd;
2245 data_r.buffer_size = buffer_len;
2246 data_r.buffer = buffer;
2248 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED,
2250 event_info->cb, event_info->user_data);
2251 g_variant_unref(byte_var);
2255 void __bt_rfcomm_server_event_filter(GDBusConnection *connection,
2256 const gchar *sender_name,
2257 const gchar *object_path,
2258 const gchar *interface_name,
2259 const gchar *signal_name,
2260 GVariant *parameters,
2263 bt_event_info_t *event_info;
2264 int result = BLUETOOTH_ERROR_NONE;
2265 event_info = (bt_event_info_t *)user_data;
2266 ret_if(event_info == NULL);
2268 if (strcasecmp(object_path, BT_RFCOMM_SERVER_PATH) != 0)
2270 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
2273 ret_if(signal_name == NULL);
2275 if (strcasecmp(signal_name, BT_RFCOMM_CONNECTED) == 0) {
2276 const char *address = NULL;
2277 const char *uuid = NULL;
2279 bluetooth_rfcomm_connection_t conn_info;
2281 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2284 memset(&conn_info, 0x00, sizeof(bluetooth_rfcomm_connection_t));
2285 conn_info.device_role = RFCOMM_ROLE_SERVER;
2286 g_strlcpy(conn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2287 conn_info.socket_fd = socket_fd;
2288 _bt_convert_addr_string_to_type(conn_info.device_addr.addr,
2291 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_CONNECTED,
2293 event_info->cb, event_info->user_data);
2294 } else if (strcasecmp(signal_name, BT_RFCOMM_DISCONNECTED) == 0) {
2295 const char *address = NULL;
2296 const char *uuid = NULL;
2298 bluetooth_rfcomm_disconnection_t disconn_info;
2300 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2303 memset(&disconn_info, 0x00, sizeof(bluetooth_rfcomm_disconnection_t));
2304 disconn_info.device_role = RFCOMM_ROLE_SERVER;
2305 g_strlcpy(disconn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2306 disconn_info.socket_fd = socket_fd;
2307 _bt_convert_addr_string_to_type(disconn_info.device_addr.addr,
2310 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DISCONNECTED,
2311 result, &disconn_info,
2312 event_info->cb, event_info->user_data);
2313 } else if (strcasecmp(signal_name, BT_CONNECTION_AUTHORIZED) == 0) {
2314 /* OSP only event */
2315 bluetooth_rfcomm_connection_request_t req_ind;
2316 char *address = NULL;
2322 g_variant_get(parameters, "(i&s&s&s&sn)", &result, &address,
2323 &uuid, &name, &path, &socket_fd);
2325 if (_check_uuid_path(path, uuid) == FALSE)
2328 memset(&req_ind, 0x00, sizeof(bluetooth_rfcomm_connection_request_t));
2329 _bt_convert_addr_string_to_type(req_ind.device_addr.addr,
2332 req_ind.socket_fd = socket_fd;
2334 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_AUTHORIZE,
2336 event_info->cb, event_info->user_data);
2337 } else if (strcasecmp(signal_name, BT_RFCOMM_SERVER_REMOVED) == 0) {
2338 /* OSP only event */
2341 g_variant_get(parameters, "(in)", &result, &socket_fd);
2343 ret_if(__bt_is_server_exist(socket_fd) == FALSE);
2345 _bt_remove_server(socket_fd);
2346 } else if (strcasecmp(signal_name, BT_RFCOMM_DATA_RECEIVED) == 0) {
2347 char *buffer = NULL;
2350 bluetooth_rfcomm_received_data_t data_r;
2353 g_variant_get(parameters, "(in@ay)", &result,
2354 &socket_fd, &byte_var);
2356 buffer_len = g_variant_get_size(byte_var);
2357 buffer = (char *) g_variant_get_data(byte_var);
2359 data_r.socket_fd = socket_fd;
2360 data_r.buffer_size = buffer_len;
2361 data_r.buffer = buffer;
2363 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED,
2365 event_info->cb, event_info->user_data);
2366 g_variant_unref(byte_var);
2370 void __bt_hf_agent_event_filter(GDBusConnection *connection,
2371 const gchar *sender_name,
2372 const gchar *object_path,
2373 const gchar *interface_name,
2374 const gchar *signal_name,
2375 GVariant *parameters,
2380 bt_event_info_t *event_info;
2381 int result = BLUETOOTH_ERROR_NONE;
2382 event_info = (bt_event_info_t *)user_data;
2383 ret_if(event_info == NULL);
2386 if (strcasecmp(object_path, BT_HF_AGENT_PATH) != 0)
2388 if (strcasecmp(interface_name, BT_HF_SERVICE_INTERFACE) != 0)
2391 ret_if(signal_name == NULL);
2393 BT_DBG("%s", signal_name);
2394 if (strcasecmp(signal_name, "Connected") == 0) {
2395 char *address = NULL;
2397 g_variant_get(parameters, "(s)", &address);
2398 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CONNECTED,
2400 event_info->cb, event_info->user_data);
2401 } else if (strcasecmp(signal_name, "Disconnected") == 0) {
2402 char *address = NULL;
2404 g_variant_get(parameters, "(s)", &address);
2405 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_DISCONNECTED,
2407 event_info->cb, event_info->user_data);
2408 } else if (strcasecmp(signal_name, "AudioConnected") == 0) {
2409 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_AUDIO_CONNECTED,
2411 event_info->cb, event_info->user_data);
2412 } else if (strcasecmp(signal_name, "AudioDisconnected") == 0) {
2413 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_AUDIO_DISCONNECTED,
2415 event_info->cb, event_info->user_data);
2416 } else if (strcasecmp(signal_name, "Ring") == 0) {
2417 char *phoneno = NULL;
2419 g_variant_get(parameters, "(&s)", &phoneno);
2421 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_RING_INDICATOR,
2423 event_info->cb, event_info->user_data);
2424 } else if (strcasecmp(signal_name, "CallWaiting") == 0) {
2425 char *phoneno = NULL;
2427 g_variant_get(parameters, "(&s)", &phoneno);
2429 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_WAITING,
2431 event_info->cb, event_info->user_data);
2432 } else if (strcasecmp(signal_name, "CallTerminated") == 0) {
2433 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_TERMINATED,
2435 event_info->cb, event_info->user_data);
2436 } else if (strcasecmp(signal_name, "FailedToDial") == 0) {
2437 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_FAILED_TO_DIAL,
2439 event_info->cb, event_info->user_data);
2440 } else if (strcasecmp(signal_name, "CallIdle") == 0) {
2441 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_IDLE,
2443 event_info->cb, event_info->user_data);
2444 } else if (strcasecmp(signal_name, "CallSetupIncoming") == 0) {
2445 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALLSETUP_INCOMING,
2447 event_info->cb, event_info->user_data);
2448 } else if (strcasecmp(signal_name, "CallSetupDialing") == 0) {
2449 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALLSETUP_DIALING,
2451 event_info->cb, event_info->user_data);
2452 } else if (strcasecmp(signal_name, "CallSetupAlerting") == 0) {
2453 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALLSETUP_ALERTING,
2455 event_info->cb, event_info->user_data);
2456 } else if (strcasecmp(signal_name, "CallStarted") == 0) {
2457 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_STARTED,
2459 event_info->cb, event_info->user_data);
2460 } else if (strcasecmp(signal_name, "CallEnded") == 0) {
2461 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_ENDED,
2463 event_info->cb, event_info->user_data);
2464 } else if (strcasecmp(signal_name, "NoCallsHeld") == 0) {
2465 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_UNHOLD,
2467 event_info->cb, event_info->user_data);
2468 } else if (strcasecmp(signal_name, "CallsSwapped") == 0) {
2469 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_SWAPPED,
2471 event_info->cb, event_info->user_data);
2472 } else if (strcasecmp(signal_name, "CallOnHold") == 0) {
2473 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_ON_HOLD,
2475 event_info->cb, event_info->user_data);
2476 } else if (strcasecmp(signal_name, "CallStatusUpdate") == 0) {
2478 GVariant *var_data = NULL;
2479 char *number = NULL;
2480 int idx, dir, status, mpart;
2481 bt_hf_call_list_s *handle = NULL;
2483 g_variant_get(parameters, "(i@a(siiii))", &call_count,
2485 BT_DBG("call count : %d", call_count);
2488 GVariantIter *iter = NULL;
2489 __bt_call_list_create(&handle);
2491 g_variant_get(var_data, "a(siiii)", &iter);
2492 while (g_variant_iter_loop(iter, "(siiii)", &number,
2493 &dir, &status, &mpart, &idx)) {
2494 BT_DBG("call number:%s, dir:%d, status : %d",
2495 number, dir, status);
2496 BT_DBG("call mpart : %d, idx : %d", mpart, idx);
2497 __bt_call_list_add(handle, number, dir,
2498 status, mpart, idx);
2500 g_variant_iter_free(iter);
2501 g_variant_unref(var_data);
2504 if (handle && (call_count == g_list_length(handle->list))) {
2505 handle->count = call_count;
2506 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_STATUS,
2508 event_info->cb, event_info->user_data);
2510 BT_ERR(" Mismatch in call count : %d", call_count);
2513 __bt_call_list_destroy(handle);
2514 } else if (strcasecmp(signal_name, "VoiceRecognition") == 0) {
2516 g_variant_get(parameters, "(i)", &status);
2517 BT_DBG("status = [%d]\n", status);
2519 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VOICE_RECOGNITION_ENABLED,
2521 event_info->cb, event_info->user_data);
2523 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VOICE_RECOGNITION_DISABLED,
2525 event_info->cb, event_info->user_data);
2526 } else if (strcasecmp(signal_name, "VolumeSpeaker") == 0) {
2528 g_variant_get(parameters, "(i)", &value);
2529 BT_DBG("Value = [%d]\n", value);
2530 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VOLUME_SPEAKER,
2532 event_info->cb, event_info->user_data);
2533 } else if (strcasecmp(signal_name, "SamsungXSAT") == 0) {
2536 bluetooth_vendor_dep_at_cmd_t cmd;
2537 g_variant_get(parameters, "(i&s)", &value, &msg);
2538 BT_DBG("Value = [%d], message = %s\n", value, msg);
2541 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VENDOR_DEP_CMD,
2543 event_info->cb, event_info->user_data);
2544 } else if (strcasecmp(signal_name, "PropertyChanged") == 0) {
2547 bluetooth_hf_ciev_device_event_t dev_event;
2549 g_variant_get(parameters, "(&sv)", &property, &value);
2550 dev_event.value = g_variant_get_uint16(value);
2552 BT_DBG("Property: %s , value: %d", property, dev_event.value);
2553 g_variant_unref(value);
2555 if (strcasecmp(property, "BatteryCharge") == 0) {
2556 dev_event.event = BLUETOOTH_HF_CIEV_BATTCHG;
2557 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED,
2559 event_info->cb, event_info->user_data);
2560 } else if (strcasecmp(property, "SignalStrength") == 0) {
2561 dev_event.event = BLUETOOTH_HF_CIEV_SIGNAL;
2562 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED,
2564 event_info->cb, event_info->user_data);
2565 } else if (strcasecmp(property, "RegistrationStatus") == 0) {
2566 dev_event.event = BLUETOOTH_HF_CIEV_SERVICE;
2567 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED,
2569 event_info->cb, event_info->user_data);
2575 static void __bt_remove_all_events(void)
2577 bt_event_info_t *info;
2579 while ((info = g_slist_nth_data(event_list, 0)) != NULL)
2580 _bt_unregister_event(info->event_type);
2583 g_slist_free(event_list);
2588 static gboolean __bt_event_is_registered(int event_type)
2591 bt_event_info_t *info;
2593 for (l = event_list; l != NULL; l = g_slist_next(l)) {
2598 if (info->event_type == event_type)
2605 bt_event_info_t *_bt_event_get_cb_data(int event_type)
2608 bt_event_info_t *info;
2610 for (l = event_list; l != NULL; l = g_slist_next(l)) {
2615 if (info->event_type == event_type)
2622 void _bt_add_server(int server_fd)
2624 bt_server_info_t *info;
2626 info = g_new0(bt_server_info_t, 1);
2627 info->server_fd = server_fd;
2629 server_list = g_slist_append(server_list, info);
2632 void _bt_remove_server(int server_fd)
2635 bt_server_info_t *info;
2637 for (l = server_list; l != NULL; l = g_slist_next(l)) {
2642 if (info->server_fd == server_fd)
2643 server_list = g_slist_remove(server_list, (void *)info);
2649 void _bt_set_obex_server_id(int server_type)
2651 obex_server_id = server_type;
2654 int _bt_get_obex_server_id(void)
2656 return obex_server_id;
2659 int _bt_init_event_handler(void)
2661 if (is_initialized == TRUE) {
2662 BT_ERR("Connection already exist");
2663 return BLUETOOTH_ERROR_ALREADY_INITIALIZED;
2666 __bt_remove_all_events();
2668 is_initialized = TRUE;
2670 return BLUETOOTH_ERROR_NONE;
2673 int _bt_deinit_event_handler(void)
2675 if (is_initialized == FALSE) {
2676 BT_ERR("Connection dose not exist");
2677 return BLUETOOTH_ERROR_INTERNAL;
2680 __bt_remove_all_events();
2682 if (disable_timer_id > 0) {
2683 g_source_remove(disable_timer_id);
2684 disable_timer_id = 0;
2687 is_initialized = FALSE;
2689 return BLUETOOTH_ERROR_NONE;
2692 static void __bt_event_data_free(void *data)
2694 bt_event_info_t *cb_data = data;
2696 ret_if(cb_data == NULL);
2701 int _bt_register_event(int event_type, void *event_cb, void *user_data)
2703 GDBusConnection *connection_type;
2704 GDBusSignalCallback event_func;
2705 bt_event_info_t *cb_data;
2707 const char *interface = BT_EVENT_SERVICE;
2709 if (is_initialized == FALSE)
2710 _bt_init_event_handler();
2712 if (__bt_event_is_registered(event_type) == TRUE) {
2713 BT_ERR("The event is already registed");
2714 return BLUETOOTH_ERROR_ALREADY_INITIALIZED;
2717 switch (event_type) {
2718 case BT_ADAPTER_EVENT:
2719 event_func = __bt_adapter_event_filter;
2720 path = BT_ADAPTER_PATH;
2722 case BT_LE_ADAPTER_EVENT:
2723 event_func = __bt_adapter_le_event_filter;
2724 path = BT_LE_ADAPTER_PATH;
2726 case BT_DEVICE_EVENT:
2727 event_func = __bt_device_event_filter;
2728 path = BT_DEVICE_PATH;
2731 event_func = __bt_hid_event_filter;
2734 case BT_HEADSET_EVENT:
2735 event_func = __bt_headset_event_filter;
2736 path = BT_HEADSET_PATH;
2738 case BT_NETWORK_EVENT:
2739 event_func = __bt_network_event_filter;
2740 path = BT_NETWORK_PATH;
2742 case BT_AVRCP_EVENT:
2743 event_func = __bt_avrcp_event_filter;
2744 path = BT_AVRCP_PATH;
2746 case BT_AVRCP_CONTROL_EVENT:
2747 event_func = __bt_avrcp_control_event_filter;
2748 path = BT_AVRCP_CONTROL_PATH;
2750 case BT_OPP_CLIENT_EVENT:
2751 event_func = __bt_opp_client_event_filter;
2752 path = BT_OPP_CLIENT_PATH;
2754 case BT_OPP_SERVER_EVENT:
2755 event_func = __bt_opp_server_event_filter;
2756 path = BT_OPP_SERVER_PATH;
2758 case BT_PBAP_CLIENT_EVENT:
2759 event_func = __bt_pbap_client_event_filter;
2760 path = BT_PBAP_CLIENT_PATH;
2762 case BT_RFCOMM_CLIENT_EVENT:
2763 event_func = __bt_rfcomm_client_event_filter;
2764 path = BT_RFCOMM_CLIENT_PATH;
2766 case BT_RFCOMM_SERVER_EVENT:
2767 event_func = __bt_rfcomm_server_event_filter;
2768 path = BT_RFCOMM_SERVER_PATH;
2770 case BT_HF_AGENT_EVENT:
2771 BT_DBG("BT_HF_AGENT_EVENT\n");
2772 event_func = __bt_hf_agent_event_filter;
2773 path = BT_HF_AGENT_PATH;
2774 interface = BT_HF_SERVICE_INTERFACE;
2776 case BT_A2DP_SOURCE_EVENT:
2777 BT_DBG("BT_A2DP_SOURCE_EVENT");
2778 event_func = __bt_a2dp_source_event_filter;
2779 path = BT_A2DP_SOURCE_PATH;
2781 case BT_HID_DEVICE_EVENT:
2782 BT_DBG("BT_HID_DEVICE_EVENT");
2783 event_func = __bt_hid_device_event_filter;
2784 path = BT_HID_DEVICE_PATH;
2786 #ifdef GATT_NO_RELAY
2787 case BT_GATT_BLUEZ_EVENT:
2788 BT_DBG("BT_GATT_BLUEZ_EVENT");
2789 event_func = __bt_device_event_filter;
2790 interface = BT_GATT_CHARACTERISTIC_INTERFACE;
2795 BT_ERR("Unknown event");
2796 return BLUETOOTH_ERROR_INTERNAL;
2799 connection_type = _bt_gdbus_get_system_gconn();
2800 if (connection_type == NULL)
2801 return BLUETOOTH_ERROR_INTERNAL;
2803 cb_data = g_new0(bt_event_info_t, 1);
2805 cb_data->event_type = event_type;
2806 cb_data->cb = event_cb;
2807 cb_data->user_data = user_data;
2809 cb_data->id = g_dbus_connection_signal_subscribe(connection_type,
2810 NULL, interface, NULL, path, NULL, 0,
2811 event_func, cb_data, NULL);
2813 event_list = g_slist_append(event_list, cb_data);
2815 return BLUETOOTH_ERROR_NONE;
2818 int _bt_unregister_event(int event_type)
2820 GDBusConnection *connection_type;
2821 bt_event_info_t *cb_data;
2823 if (is_initialized == FALSE) {
2824 BT_ERR("Event is not registered");
2825 return BLUETOOTH_ERROR_NOT_INITIALIZED;
2828 if (__bt_event_is_registered(event_type) == FALSE) {
2829 BT_ERR("Not registered event");
2830 return BLUETOOTH_ERROR_INTERNAL;
2833 cb_data = _bt_event_get_cb_data(event_type);
2835 if (cb_data == NULL) {
2836 BT_ERR("No matched event data");
2837 return BLUETOOTH_ERROR_INTERNAL;
2840 connection_type = _bt_gdbus_get_system_gconn();
2842 event_list = g_slist_remove(event_list, (void *)cb_data);
2844 retv_if(connection_type == NULL, BLUETOOTH_ERROR_INTERNAL);
2846 g_dbus_connection_signal_unsubscribe(connection_type, cb_data->id);
2848 __bt_event_data_free((void *)cb_data);
2850 return BLUETOOTH_ERROR_NONE;
2853 static void __bt_name_owner_changed(GDBusConnection *connection,
2854 const gchar *sender_name,
2855 const gchar *object_path,
2856 const gchar *interface_name,
2857 const gchar *signal_name,
2858 GVariant *parameters,
2861 const char *name = NULL;
2862 const char *old_owner = NULL;
2863 const char *new_owner = NULL;
2864 bt_event_info_t *event_info;
2866 g_variant_get(parameters, "(&s&s&s)", &name, &old_owner, &new_owner);
2868 if (g_strcmp0(name, BT_DBUS_NAME) == 0 &&
2869 (new_owner != NULL && *new_owner == '\0')) {
2870 BT_DBG("bt-service is terminated");
2871 event_info = _bt_event_get_cb_data(BT_ADAPTER_EVENT);
2872 if (event_info == NULL)
2875 if (disable_timer_id > 0)
2876 g_source_remove(disable_timer_id);
2878 disable_timer_id = g_timeout_add(BT_RELIABLE_DISABLE_TIME,
2879 (GSourceFunc)__bt_reliable_disable_cb,
2884 void _bt_register_name_owner_changed(void)
2886 GDBusConnection *connection_type;
2888 connection_type = _bt_gdbus_get_system_gconn();
2889 if (connection_type == NULL) {
2890 BT_ERR("Unable to get the bus");
2893 owner_sig_id = g_dbus_connection_signal_subscribe(connection_type,
2894 NULL, DBUS_INTERFACE_DBUS,
2895 BT_NAME_OWNER_CHANGED, NULL, NULL, 0,
2896 __bt_name_owner_changed, NULL, NULL);
2899 void _bt_unregister_name_owner_changed(void)
2901 GDBusConnection *connection_type;
2903 connection_type = _bt_gdbus_get_system_gconn();
2904 if (connection_type != NULL && owner_sig_id != -1) {
2905 g_dbus_connection_signal_unsubscribe(connection_type,
2911 static void __bt_manager_event_filter(GDBusConnection *connection,
2912 const gchar *sender_name,
2913 const gchar *object_path,
2914 const gchar *interface_name,
2915 const gchar *signal_name,
2916 GVariant *parameters,
2920 GVariantIter *interface_iter = NULL;
2921 char *interface_str = NULL;
2922 bt_gatt_service_change_t change;
2923 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
2924 char secure_address[BT_ADDRESS_STRING_SIZE] = { 0 };
2925 bt_user_info_t *user_info = NULL;
2927 if (strcasecmp(signal_name, "GattServiceAdded") == 0) {
2928 g_variant_get(parameters, "(&s)", &path);
2930 _bt_convert_device_path_to_address(path, address);
2931 _bt_convert_addr_string_to_type(change.device_addr.addr, address);
2932 _bt_convert_addr_string_to_secure_string(secure_address, address);
2934 if (_bluetooth_gatt_check_service_change_watcher_address(&change.device_addr)
2936 BT_INFO("GATT Service [%s] added, but no watcher for %s",
2937 path, secure_address);
2940 BT_INFO(" ### GATT Service added [%s] [%s]",
2941 path, secure_address);
2943 change.svc_path = g_strdup(path);
2944 change.change_type = BLUETOOTH_GATT_SERVICE_CHANGE_TYPE_ADD;
2946 user_info = _bt_get_user_data(BT_COMMON);
2947 if (user_info != NULL) {
2948 _bt_common_event_cb(
2949 BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED,
2950 BLUETOOTH_ERROR_NONE, &change,
2951 user_info->cb, user_info->user_data);
2954 g_free(change.svc_path);
2955 } else if (strcasecmp(signal_name, "InterfacesRemoved") == 0) {
2956 g_variant_get(parameters, "(&oas)",
2957 &path, &interface_iter);
2960 BT_ERR("Invalid adapter path");
2964 _bt_convert_device_path_to_address(path, address);
2965 _bt_convert_addr_string_to_type(change.device_addr.addr, address);
2966 _bt_convert_addr_string_to_secure_string(secure_address, address);
2968 if (_bluetooth_gatt_check_service_change_watcher_address(&change.device_addr)
2970 BT_INFO("GATT Service [%s] removed, but no watcher for %s",
2971 path, secure_address);
2975 while (g_variant_iter_loop(interface_iter, "s", &interface_str)) {
2976 if (g_strcmp0(interface_str, GATT_SERV_INTERFACE) == 0) {
2977 change.svc_path = g_strdup(path);
2978 change.change_type = BLUETOOTH_GATT_SERVICE_CHANGE_TYPE_REMOVE;
2980 BT_INFO(" ### GATT Service removed [%s] [%s]",
2981 path, secure_address);
2983 user_info = _bt_get_user_data(BT_COMMON);
2984 if (user_info != NULL) {
2985 _bt_common_event_cb(
2986 BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED,
2987 BLUETOOTH_ERROR_NONE, &change,
2988 user_info->cb, user_info->user_data);
2991 g_free(change.svc_path);
2995 g_variant_iter_free(interface_iter);
2999 int _bt_register_manager_subscribe_signal(gboolean subscribe)
3001 GDBusConnection *g_conn;
3002 static int service_added_id = -1;
3003 static int interface_removed_id = -1;
3005 g_conn = _bt_gdbus_get_system_gconn();
3007 return BLUETOOTH_ERROR_INTERNAL;
3009 if (subscribe == TRUE) {
3010 if (service_added_id == -1) {
3011 service_added_id = g_dbus_connection_signal_subscribe(g_conn,
3012 NULL, GATT_SERV_INTERFACE,
3013 "GattServiceAdded", NULL, NULL, 0,
3014 __bt_manager_event_filter,
3017 if (interface_removed_id == -1) {
3018 interface_removed_id = g_dbus_connection_signal_subscribe(g_conn,
3019 NULL, BT_MANAGER_INTERFACE,
3020 "InterfacesRemoved", NULL, NULL, 0,
3021 __bt_manager_event_filter,
3025 if (service_added_id != -1) {
3026 g_dbus_connection_signal_unsubscribe(g_conn,
3028 service_added_id = -1;
3030 if (interface_removed_id != -1) {
3031 g_dbus_connection_signal_unsubscribe(g_conn,
3032 interface_removed_id);
3033 interface_removed_id = -1;
3037 return BLUETOOTH_ERROR_NONE;