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();
392 _bt_rfcomm_server_free_all();
394 bluetooth_hid_device_deactivate();
399 void __bt_adapter_event_filter(GDBusConnection *connection,
400 const gchar *sender_name,
401 const gchar *object_path,
402 const gchar *interface_name,
403 const gchar *signal_name,
404 GVariant *parameters,
407 bt_event_info_t *event_info;
408 int result = BLUETOOTH_ERROR_NONE;
410 event_info = (bt_event_info_t *)user_data;
411 ret_if(event_info == NULL);
413 if (strcasecmp(object_path, BT_ADAPTER_PATH) != 0)
415 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
418 if (strcasecmp(signal_name, BT_ENABLED) == 0) {
419 BT_INFO("BT_ENABLED");
420 g_variant_get(parameters, "(i)", &result);
422 _bt_common_event_cb(BLUETOOTH_EVENT_ENABLED,
424 event_info->cb, event_info->user_data);
425 } else if (strcasecmp(signal_name, BT_DISABLED) == 0) {
426 BT_INFO("BT_DISABLED");
428 /* Wait for the termining time of bt-service */
429 if (disable_timer_id > 0)
430 g_source_remove(disable_timer_id);
432 disable_timer_id = g_timeout_add(BT_RELIABLE_DISABLE_TIME,
433 (GSourceFunc)__bt_reliable_disable_cb,
435 } else if (strcasecmp(signal_name, BT_DISCOVERABLE_MODE_CHANGED) == 0) {
438 g_variant_get(parameters, "(in)", &result, &mode);
439 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
441 event_info->cb, event_info->user_data);
442 } else if (strcasecmp(signal_name, BT_DISCOVERABLE_TIMEOUT_CHANGED) == 0) {
445 g_variant_get(parameters, "(in)", &result, &timeout);
446 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED,
448 event_info->cb, event_info->user_data);
449 } else if (strcasecmp(signal_name, BT_CONNECTABLE_CHANGED) == 0) {
450 gboolean connectable = FALSE;
452 g_variant_get(parameters, "(b)", &connectable);
453 BT_DBG("Connectable is changed : %d", connectable);
455 _bt_common_event_cb(BLUETOOTH_EVENT_CONNECTABLE_CHANGED,
456 result, &connectable,
457 event_info->cb, event_info->user_data);
458 } else if (strcasecmp(signal_name, BT_ADAPTER_NAME_CHANGED) == 0) {
459 char *adapter_name = NULL;
461 g_variant_get(parameters, "(i&s)", &result, &adapter_name);
462 _bt_common_event_cb(BLUETOOTH_EVENT_LOCAL_NAME_CHANGED,
463 result, adapter_name,
464 event_info->cb, event_info->user_data);
465 } else if (strcasecmp(signal_name, BT_DISCOVERY_STARTED) == 0) {
466 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERY_STARTED,
467 BLUETOOTH_ERROR_NONE, NULL,
468 event_info->cb, event_info->user_data);
469 } else if (strcasecmp(signal_name, BT_DISCOVERY_FINISHED) == 0) {
470 g_variant_get(parameters, "(i)", &result);
471 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERY_FINISHED,
473 event_info->cb, event_info->user_data);
474 } else if (strcasecmp(signal_name, BT_ADVERTISING_STARTED) == 0) {
477 g_variant_get(parameters, "(ii)", &result, &adv_handle);
478 _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_STARTED,
480 event_info->cb, event_info->user_data);
481 } else if (strcasecmp(signal_name, BT_ADVERTISING_STOPPED) == 0) {
484 g_variant_get(parameters, "(ii)", &result, &adv_handle);
485 _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_STOPPED,
487 event_info->cb, event_info->user_data);
488 } else if (strcasecmp(signal_name, BT_ADVERTISING_MANUFACTURER_DATA_CHANGED) == 0) {
489 GVariant *var = NULL;
493 g_variant_get(parameters, "(@ay)", &var);
494 len = g_variant_get_size(var);
495 data = (char *)g_variant_get_data(var);
497 _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_MANUFACTURER_DATA_CHANGED,
499 event_info->cb, event_info->user_data);
501 g_variant_unref(var);
502 } else if (strcasecmp(signal_name, BT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED) == 0) {
503 GVariant *var = NULL;
507 g_variant_get(parameters, "(@ay)", &var);
508 len = g_variant_get_size(var);
509 data = (char *)g_variant_get_data(var);
511 _bt_common_event_cb(BLUETOOTH_EVENT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED,
513 event_info->cb, event_info->user_data);
515 g_variant_unref(var);
516 } else if (strcasecmp(signal_name, BT_MANUFACTURER_DATA_CHANGED) == 0) {
517 GVariant *var = NULL;
521 g_variant_get(parameters, "(@ay)", &var);
522 len = g_variant_get_size(var);
523 data = (char *)g_variant_get_data(var);
525 _bt_common_event_cb(BLUETOOTH_EVENT_MANUFACTURER_DATA_CHANGED,
527 event_info->cb, event_info->user_data);
529 g_variant_unref(var);
530 } else if (strcasecmp(signal_name, BT_PASSKEY_NOTIFICATION) == 0) {
531 const char *address = NULL;
532 const char *passkey = NULL;
533 const char *passkey_info[2];
535 g_variant_get(parameters, "(&s&s)", &address, &passkey);
536 passkey_info[0] = address;
537 passkey_info[1] = passkey;
539 _bt_common_event_cb(BLUETOOTH_EVENT_PASSKEY_NOTIFICATION,
540 BLUETOOTH_ERROR_NONE, (void*)passkey_info,
541 event_info->cb, event_info->user_data);
542 } else if (strcasecmp(signal_name, BT_DEVICE_FOUND) == 0) {
544 bluetooth_device_info_t *device_info;
546 device_info = __bt_get_device_info_in_message(parameters,
548 ret_if(device_info == NULL);
550 if (strlen(device_info->device_name.name) > 0)
551 event = BLUETOOTH_EVENT_REMOTE_DEVICE_NAME_UPDATED;
553 event = BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND;
555 _bt_common_event_cb(event,
557 event_info->cb, event_info->user_data);
560 } else if (strcasecmp(signal_name, BT_BOND_CREATED) == 0) {
561 bluetooth_device_info_t *device_info;
563 device_info = __bt_get_device_info_in_message(parameters,
565 ret_if(device_info == NULL);
567 _bt_common_event_cb(BLUETOOTH_EVENT_BONDING_FINISHED,
569 event_info->cb, event_info->user_data);
572 } else if (strcasecmp(signal_name, BT_BOND_DESTROYED) == 0) {
573 const char *address = NULL;
574 bluetooth_device_address_t dev_address = { {0} };
576 g_variant_get(parameters, "(i&s)", &result, &address);
578 _bt_convert_addr_string_to_type(dev_address.addr,
581 _bt_common_event_cb(BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED,
582 result, &dev_address,
583 event_info->cb, event_info->user_data);
584 } else if (strcasecmp(signal_name, BT_SERVICE_SEARCHED) == 0) {
585 bluetooth_device_info_t *device_info;
586 bt_sdp_info_t sdp_info;
588 device_info = __bt_get_device_info_in_message(parameters,
590 ret_if(device_info == NULL);
592 memset(&sdp_info, 0x00, sizeof(bt_sdp_info_t));
594 sdp_info.service_index = device_info->service_index;
596 memcpy(&sdp_info.device_addr,
597 &device_info->device_address,
598 BLUETOOTH_ADDRESS_LENGTH);
600 memcpy(sdp_info.service_list_array,
601 device_info->service_list_array,
602 BLUETOOTH_MAX_SERVICES_FOR_DEVICE);
604 memcpy(sdp_info.uuids,
606 BLUETOOTH_MAX_SERVICES_FOR_DEVICE * BLUETOOTH_UUID_STRING_MAX);
608 _bt_common_event_cb(BLUETOOTH_EVENT_SERVICE_SEARCHED,
610 event_info->cb, event_info->user_data);
613 } else if (strcasecmp(signal_name, BT_IPSP_INITIALIZED) == 0) {
614 gboolean ipsp_intialized = FALSE;
615 g_variant_get(parameters, "(b)", &ipsp_intialized);
617 BT_DBG("IPSP init state changed to : %d", ipsp_intialized);
619 _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_INIT_STATE_CHANGED,
620 BLUETOOTH_ERROR_NONE, &ipsp_intialized,
621 event_info->cb, event_info->user_data);
622 } else if (strcasecmp(signal_name, BT_KBD_PASSKEY_DISPLAY_REQ_RECEIVED) == 0) {
623 const char *address = NULL;
624 const char *name = NULL;
625 const char *str_passkey = NULL;
627 bluetooth_authentication_request_info_t auth_info;
628 memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
630 g_variant_get(parameters, "(i&s&s&s)", &result, &address, &name, &str_passkey);
632 g_strlcpy(auth_info.device_name.name, name,
633 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
634 _bt_convert_addr_string_to_type(auth_info.device_address.addr,
636 g_strlcpy(auth_info.str_passkey, str_passkey, strlen(str_passkey)+1);
638 _bt_common_event_cb(BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY,
640 event_info->cb, event_info->user_data);
641 } else if (strcasecmp(signal_name, BT_PIN_REQ_RECEIVED) == 0) {
642 const char *address = NULL;
643 const char *name = NULL;
645 bluetooth_authentication_request_info_t auth_info;
646 memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
648 g_variant_get(parameters, "(i&s&s)", &result, &address, &name);
650 g_strlcpy(auth_info.device_name.name, name,
651 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
652 _bt_convert_addr_string_to_type(auth_info.device_address.addr,
655 _bt_common_event_cb(BLUETOOTH_EVENT_PIN_REQUEST,
657 event_info->cb, event_info->user_data);
658 } else if (strcasecmp(signal_name, BT_PASSKEY_REQ_RECEIVED) == 0) {
659 const char *address = NULL;
660 const char *name = NULL;
662 bluetooth_authentication_request_info_t auth_info;
663 memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
665 g_variant_get(parameters, "(i&s&s)", &result, &address, &name);
667 g_strlcpy(auth_info.device_name.name, name,
668 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
669 _bt_convert_addr_string_to_type(auth_info.device_address.addr,
672 _bt_common_event_cb(BLUETOOTH_EVENT_PASSKEY_REQUEST,
674 event_info->cb, event_info->user_data);
675 } else if (strcasecmp(signal_name, BT_PASSKEY_CFM_REQ_RECEIVED) == 0) {
676 const char *address = NULL;
677 const char *name = NULL;
678 const char *str_passkey = NULL;
680 bluetooth_authentication_request_info_t auth_info;
681 memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
683 g_variant_get(parameters, "(i&s&s&s)", &result, &address, &name, &str_passkey);
685 g_strlcpy(auth_info.device_name.name, name,
686 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
687 _bt_convert_addr_string_to_type(auth_info.device_address.addr,
689 g_strlcpy(auth_info.str_passkey, str_passkey, strlen(str_passkey)+1);
691 _bt_common_event_cb(BLUETOOTH_EVENT_PASSKEY_CONFIRM_REQUEST,
693 event_info->cb, event_info->user_data);
697 void __bt_adapter_le_event_filter(GDBusConnection *connection,
698 const gchar *sender_name,
699 const gchar *object_path,
700 const gchar *interface_name,
701 const gchar *signal_name,
702 GVariant *parameters,
705 bt_event_info_t *event_info;
706 int result = BLUETOOTH_ERROR_NONE;
708 event_info = (bt_event_info_t *)user_data;
709 ret_if(event_info == NULL);
711 if (strcasecmp(object_path, BT_LE_ADAPTER_PATH) != 0)
713 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
716 if (strcasecmp(signal_name, BT_LE_ENABLED) == 0) {
717 BT_INFO("BT_LE_ENABLED");
718 g_variant_get(parameters, "(i)", &result);
719 _bt_common_event_cb(BLUETOOTH_EVENT_LE_ENABLED,
721 event_info->cb, event_info->user_data);
722 } else if (strcasecmp(signal_name, BT_LE_DISABLED) == 0) {
723 BT_INFO("BT_LE_DISABLED");
724 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISABLED,
726 event_info->cb, event_info->user_data);
727 } else if (strcasecmp(signal_name, BT_LE_DISCOVERY_STARTED) == 0) {
728 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISCOVERY_STARTED,
729 BLUETOOTH_ERROR_NONE, NULL,
730 event_info->cb, event_info->user_data);
731 } else if (strcasecmp(signal_name, BT_LE_DISCOVERY_FINISHED) == 0) {
732 g_variant_get(parameters, "(i)", &result);
733 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISCOVERY_FINISHED,
735 event_info->cb, event_info->user_data);
736 } else if (strcasecmp(signal_name, BT_LE_DEVICE_FOUND) == 0) {
737 bluetooth_le_device_info_t *le_device_info;
739 le_device_info = __bt_get_le_device_info_in_message(parameters,
741 ret_if(le_device_info == NULL);
743 if (bluetooth_is_le_scanning() == TRUE) {
744 _bt_common_event_cb(BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND,
745 result, le_device_info,
746 event_info->cb, event_info->user_data);
749 g_free(le_device_info);
753 void __bt_device_event_filter(GDBusConnection *connection,
754 const gchar *sender_name,
755 const gchar *object_path,
756 const gchar *interface_name,
757 const gchar *signal_name,
758 GVariant *parameters,
761 bt_event_info_t *event_info;
762 int result = BLUETOOTH_ERROR_NONE;
764 event_info = (bt_event_info_t *)user_data;
765 ret_if(event_info == NULL);
768 gboolean gatt_interface = FALSE;
770 if (strcasecmp(interface_name, BT_GATT_CHARACTERISTIC_INTERFACE) == 0)
771 gatt_interface = TRUE;
773 if (strcasecmp(object_path, BT_DEVICE_PATH) != 0 &&
774 gatt_interface == FALSE)
776 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0 &&
777 gatt_interface == FALSE)
780 if (strcasecmp(object_path, BT_DEVICE_PATH) != 0)
782 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
786 ret_if(signal_name == NULL);
788 if (strcasecmp(signal_name, BT_GATT_CONNECTED) == 0) {
789 const char *address = NULL;
790 bluetooth_device_address_t dev_address = { {0} };
791 BT_DBG("BT_GATT_CONNECTED");
792 g_variant_get(parameters, "(i&s)", &result, &address);
794 _bt_convert_addr_string_to_type(dev_address.addr, address);
795 BT_DBG("Sending Event to Framework");
796 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_CONNECTED,
797 result, &dev_address,
798 event_info->cb, event_info->user_data);
799 } else if (strcasecmp(signal_name, BT_GATT_DISCONNECTED) == 0) {
800 const char *address = NULL;
801 bluetooth_device_address_t dev_address = { {0} };
802 BT_DBG("BT_GATT_DISCONNECTED");
803 g_variant_get(parameters, "(i&s)", &result, &address);
805 _bt_convert_addr_string_to_type(dev_address.addr, address);
806 BT_DBG("Sending Event to Framework");
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, };
842 BT_DBG("BT_GATT_CHAR_VAL_CHANGED");
844 g_variant_get(parameters, "(i&s@ay)", &result, &char_handle, &char_value_var);
846 len = g_variant_get_size(char_value_var);
848 value = (char *)g_variant_get_data(char_value_var);
850 char_val.char_handle = g_strdup(char_handle);
851 char_val.val_len = len;
852 /* Fix : FORWARD_NULL : g_variant_get_data can return NULL */
853 if (char_val.val_len > 0 && value != NULL) {
854 char_val.char_value = (unsigned char*) g_malloc0(char_val.val_len);
855 /* Fix : NULL_RETURNS */
856 if (char_val.char_value == NULL) {
857 BT_ERR("BLUETOOTH_ERROR_OUT_OF_MEMORY");
858 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);
869 g_variant_unref(char_value_var);
871 g_free(char_val.char_handle);
872 } else if (strcasecmp(signal_name, BT_DEVICE_CONNECTED) == 0) {
873 const char *address = NULL;
874 unsigned char addr_type;
875 bt_connection_info_t conn_info;
876 bluetooth_device_address_t dev_address = { {0} };
877 BT_DBG("BT_DEVICE_CONNECTED");
878 g_variant_get(parameters, "(i&sy)", &result, &address, &addr_type);
880 _bt_convert_addr_string_to_type(dev_address.addr,
883 memset(&conn_info, 0x00, sizeof(bt_connection_info_t));
885 memcpy(conn_info.device_addr.addr,
887 BLUETOOTH_ADDRESS_LENGTH);
889 conn_info.addr_type = addr_type;
890 conn_info.disc_reason = 0;
891 BT_DBG("Sending Event to Framework");
892 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_CONNECTED,
894 event_info->cb, event_info->user_data);
896 } else if (strcasecmp(signal_name, BT_DEVICE_DISCONNECTED) == 0) {
897 const char *address = NULL;
898 unsigned char addr_type;
899 bt_connection_info_t conn_info;
900 bluetooth_device_address_t dev_address = { {0} };
901 BT_DBG("BT_DEVICE_DISCONNECTED");
902 g_variant_get(parameters, "(i&sy)", &result, &address, &addr_type);
904 _bt_convert_addr_string_to_type(dev_address.addr,
907 memset(&conn_info, 0x00, sizeof(bt_connection_info_t));
909 memcpy(conn_info.device_addr.addr,
911 BLUETOOTH_ADDRESS_LENGTH);
913 conn_info.addr_type = addr_type;
914 conn_info.disc_reason = result;
915 BT_DBG("Sending Event to Framework");
916 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_DISCONNECTED,
918 event_info->cb, event_info->user_data);
920 } else if (strcasecmp(signal_name, BT_RSSI_MONITORING_ENABLED) == 0) {
921 bt_rssi_enabled_t enabled = { 0, };
924 gboolean rssi_enabled = FALSE;
926 g_variant_get(parameters, "(isib)", &result, &address,
927 &link_type, &rssi_enabled);
929 BT_DBG("RSSI Enabled[Address:%s LinkType:%d RSSI_dbm:%d]",
930 address, link_type, rssi_enabled);
931 enabled.address = address;
932 enabled.link_type = link_type;
933 enabled.rssi_enabled = rssi_enabled;
935 _bt_common_event_cb(BLUETOOTH_EVENT_RSSI_ENABLED,
937 event_info->cb, event_info->user_data);
938 } else if (strcasecmp(signal_name, BT_RSSI_ALERT) == 0) {
943 bt_rssi_alert_t alert = { 0, };
945 g_variant_get(parameters, "(isiii)", &result, &address,
946 &link_type, &alert_type, &rssi_dbm);
948 alert.alert_type = alert_type;
949 alert.rssi_dbm = rssi_dbm;
950 alert.address = address;
951 alert.link_type = link_type;
952 BT_DBG("Address [%s] LinkType[%d] AlertType[%d] RSSI dBm[%d]",
953 address, link_type, alert_type, rssi_dbm);
954 _bt_common_event_cb(BLUETOOTH_EVENT_RSSI_ALERT,
956 event_info->cb, event_info->user_data);
957 } else if (strcasecmp(signal_name, BT_RAW_RSSI_EVENT) == 0) {
961 bt_raw_rssi_t raw_rssi = { 0, };
963 g_variant_get(parameters, "(isii)", &result,
964 &address, &link_type, &rssi_dbm);
966 BT_DBG("Address [%s] Link Type[%d] dBm[%d]",
967 address, link_type, rssi_dbm);
969 raw_rssi.rssi_dbm = rssi_dbm;
970 raw_rssi.address = address;
971 raw_rssi.link_type = link_type;
973 _bt_common_event_cb(BLUETOOTH_EVENT_RAW_RSSI,
975 event_info->cb, event_info->user_data);
976 } else if (strcasecmp(signal_name, BT_DEVICE_AUTHORIZED) == 0) {
977 const char *address = NULL;
978 bluetooth_device_address_t dev_address = { {0} };
980 g_variant_get(parameters, "(i&s)", &result, &address);
982 _bt_convert_addr_string_to_type(dev_address.addr,
985 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_AUTHORIZED,
986 result, &dev_address,
987 event_info->cb, event_info->user_data);
988 } else if (strcasecmp(signal_name, BT_DEVICE_UNAUTHORIZED) == 0) {
989 const char *address = NULL;
990 bluetooth_device_address_t dev_address = { {0} };
992 g_variant_get(parameters, "(i&s)", &result, &address);
994 _bt_convert_addr_string_to_type(dev_address.addr,
997 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_UNAUTHORIZED,
998 result, &dev_address,
999 event_info->cb, event_info->user_data);
1000 } else if (strcasecmp(signal_name, BT_SUPPORTED_PROFILE_TRUSTED) == 0) {
1002 bt_supported_profile_trusted_t profile_info = { 0, };
1005 g_variant_get(parameters, "(i&si)", &result,
1008 BT_DBG("Address [%s] trust[%d]", address, trust);
1009 profile_info.address = address;
1010 if (trust & (PROFILE_SUPPORTED << 0)) { /* Bit 0 & 1 - for PBAP Supported */
1011 profile_info.profile = TRUSTED_PROFILE_PBAP;
1012 profile_info.supported = TRUE;
1013 if (trust & (1 << 1)) /* Bit 1 - for PBAP Trusted */
1014 profile_info.trusted = TRUE;
1016 profile_info.trusted = FALSE;
1018 _bt_common_event_cb(BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED,
1019 result, &profile_info,
1020 event_info->cb, event_info->user_data);
1022 if (trust & (PROFILE_SUPPORTED <<2 )) { /* Bit 2 & 3 - for MAP Supported */
1023 profile_info.profile = TRUSTED_PROFILE_MAP;
1024 profile_info.supported = TRUE;
1025 if (trust & (1 <<3 )) /* Bit 3 - for PBAP Trusted */
1026 profile_info.trusted = TRUE;
1028 profile_info.trusted = FALSE;
1030 _bt_common_event_cb(BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED,
1031 result, &profile_info,
1032 event_info->cb, event_info->user_data);
1034 if (trust & (PROFILE_SUPPORTED <<4 )) { /* Bit 4 & 5- for SAP Supported */
1035 profile_info.profile = TRUSTED_PROFILE_SAP;
1036 profile_info.supported = TRUE;
1037 if (trust & (1 <<5 )) /* Bit 5 - for SAP Trusted */
1038 profile_info.trusted = TRUE;
1040 profile_info.trusted = FALSE;
1042 _bt_common_event_cb(BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED,
1043 result, &profile_info,
1044 event_info->cb, event_info->user_data);
1046 } else if (strcasecmp(signal_name, BT_IPSP_CONNECTED) == 0) {
1047 const char *address = NULL;
1048 const char *if_name = NULL;
1049 bt_ipsp_connection_info_t bt_ipsp_iface_info;
1050 memset(&bt_ipsp_iface_info, 0, sizeof(bt_ipsp_iface_info));
1052 BT_DBG("BT_IPSP_CONNECTED");
1053 g_variant_get(parameters, "(i&s&s)", &result, &address, &if_name);
1055 _bt_convert_addr_string_to_type(bt_ipsp_iface_info.btaddr.addr, address);
1056 memcpy(bt_ipsp_iface_info.if_name, if_name, 16);
1058 _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_CONNECTED,
1059 result, &bt_ipsp_iface_info,
1060 event_info->cb, event_info->user_data);
1061 } else if (strcasecmp(signal_name, BT_IPSP_DISCONNECTED) == 0) {
1062 const char *address = NULL;
1063 const char *if_name = NULL;
1064 bt_ipsp_connection_info_t bt_ipsp_iface_info;
1065 memset(&bt_ipsp_iface_info, 0, sizeof(bt_ipsp_iface_info));
1067 BT_DBG("BT_IPSP_DISCONNECTED");
1068 g_variant_get(parameters, "(i&s&s)", &result, &address, &if_name);
1070 _bt_convert_addr_string_to_type(bt_ipsp_iface_info.btaddr.addr, address);
1071 memcpy(bt_ipsp_iface_info.if_name, if_name, 16);
1073 _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_DISCONNECTED,
1074 result, &bt_ipsp_iface_info,
1075 event_info->cb, event_info->user_data);
1076 } else if (strcasecmp(signal_name, BT_LE_DATA_LENGTH_CHANGED) == 0) {
1077 const char *address = NULL;
1078 bluetooth_device_address_t dev_address = { {0} };
1083 bt_le_data_length_params_t params;
1085 BT_DBG("BT_LE_DATA_LENGTH_CHANGED");
1087 g_variant_get(parameters, "(i&sqqqq)", &result, &address,
1088 tx_octets, tx_time, rx_octets, rx_time);
1090 params.max_tx_octets = tx_octets;
1091 params.max_tx_time = tx_time;
1092 params.max_rx_octets = rx_octets;
1093 params.max_rx_time = rx_time;
1095 _bt_convert_addr_string_to_type(dev_address.addr, address);
1097 memcpy(¶ms.device_address,
1098 &dev_address, BLUETOOTH_ADDRESS_LENGTH);
1100 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DATA_LENGTH_CHANGED,
1101 result, ¶ms, event_info->cb, event_info->user_data);
1105 void __bt_hid_event_filter(GDBusConnection *connection,
1106 const gchar *sender_name,
1107 const gchar *object_path,
1108 const gchar *interface_name,
1109 const gchar *signal_name,
1110 GVariant *parameters,
1113 bt_event_info_t *event_info;
1114 int result = BLUETOOTH_ERROR_NONE;
1116 event_info = (bt_event_info_t *)user_data;
1117 ret_if(event_info == NULL);
1119 if (strcasecmp(object_path, BT_HID_PATH) != 0)
1121 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1124 ret_if(signal_name == NULL);
1126 if (strcasecmp(signal_name, BT_INPUT_CONNECTED) == 0) {
1127 const char *address = NULL;
1128 bluetooth_device_address_t dev_address = { {0} };
1130 g_variant_get(parameters, "(i&s)", &result, &address);
1132 _bt_convert_addr_string_to_type(dev_address.addr,
1135 _bt_input_event_cb(BLUETOOTH_HID_CONNECTED,
1136 result, &dev_address,
1137 event_info->cb, event_info->user_data);
1138 } else if (strcasecmp(signal_name, BT_INPUT_DISCONNECTED) == 0) {
1139 const char *address = NULL;
1140 bluetooth_device_address_t dev_address = { {0} };
1142 g_variant_get(parameters, "(i&s)", &result, &address);
1144 BT_DBG("address: %s", address);
1146 _bt_convert_addr_string_to_type(dev_address.addr,
1149 _bt_input_event_cb(BLUETOOTH_HID_DISCONNECTED,
1150 result, &dev_address,
1151 event_info->cb, event_info->user_data);
1155 void __bt_headset_event_filter(GDBusConnection *connection,
1156 const gchar *sender_name,
1157 const gchar *object_path,
1158 const gchar *interface_name,
1159 const gchar *signal_name,
1160 GVariant *parameters,
1163 bt_event_info_t *event_info;
1164 int result = BLUETOOTH_ERROR_NONE;
1165 event_info = (bt_event_info_t *)user_data;
1166 ret_if(event_info == NULL);
1168 if (strcasecmp(object_path, BT_HEADSET_PATH) != 0)
1170 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1173 ret_if(signal_name == NULL);
1175 if (strcasecmp(signal_name, BT_HEADSET_CONNECTED) == 0) {
1176 char *address = NULL;
1178 g_variant_get(parameters, "(i&s)", &result, &address);
1180 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_CONNECTED,
1182 event_info->cb, event_info->user_data);
1183 } else if (strcasecmp(signal_name, BT_HEADSET_DISCONNECTED) == 0) {
1184 char *address = NULL;
1186 g_variant_get(parameters, "(i&s)", &result, &address);
1188 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_DISCONNECTED,
1190 event_info->cb, event_info->user_data);
1191 } else if (strcasecmp(signal_name, BT_STEREO_HEADSET_CONNECTED) == 0) {
1192 char *address = NULL;
1194 g_variant_get(parameters, "(i&s)", &result, &address);
1196 _bt_headset_event_cb(BLUETOOTH_EVENT_AV_CONNECTED,
1198 event_info->cb, event_info->user_data);
1199 } else if (strcasecmp(signal_name, BT_STEREO_HEADSET_DISCONNECTED) == 0) {
1200 char *address = NULL;
1202 g_variant_get(parameters, "(i&s)", &result, &address);
1204 _bt_headset_event_cb(BLUETOOTH_EVENT_AV_DISCONNECTED,
1206 event_info->cb, event_info->user_data);
1207 } else if (strcasecmp(signal_name, BT_A2DP_SOURCE_CONNECTED) == 0) {
1208 char *address = NULL;
1210 g_variant_get(parameters, "(i&s)", &result, &address);
1211 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_CONNECTED,
1213 event_info->cb, event_info->user_data);
1214 } else if (strcasecmp(signal_name, BT_A2DP_SOURCE_DISCONNECTED) == 0) {
1215 char *address = NULL;
1217 g_variant_get(parameters, "(i&s)", &result, &address);
1219 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED,
1221 event_info->cb, event_info->user_data);
1222 } else if (strcasecmp(signal_name, BT_SPEAKER_GAIN) == 0) {
1225 char *address = NULL;
1227 g_variant_get(parameters, "(i&sq)", &result, &address,
1229 gain = (unsigned int)spkr_gain;
1231 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_SPEAKER_GAIN,
1233 event_info->cb, event_info->user_data);
1234 } else if (strcasecmp(signal_name, BT_MICROPHONE_GAIN) == 0) {
1237 char *address = NULL;
1239 g_variant_get(parameters, "(i&sq)", &result,
1240 &address, &mic_gain);
1241 gain = (unsigned int)mic_gain;
1243 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_MIC_GAIN,
1245 event_info->cb, event_info->user_data);
1249 void __bt_hid_device_event_filter(GDBusConnection *connection,
1250 const gchar *sender_name,
1251 const gchar *object_path,
1252 const gchar *interface_name,
1253 const gchar *signal_name,
1254 GVariant *parameters,
1257 bt_event_info_t *event_info;
1258 int result = BLUETOOTH_ERROR_NONE;
1260 event_info = (bt_event_info_t *)user_data;
1261 ret_if(event_info == NULL);
1262 if (strcasecmp(object_path, BT_HID_DEVICE_PATH) != 0)
1264 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1267 ret_if(signal_name == NULL);
1269 if (strcasecmp(signal_name, BT_HID_DEVICE_CONNECTED) == 0) {
1270 const char *address = NULL;
1271 bluetooth_device_address_t dev_address = { {0} };
1273 g_variant_get(parameters, "(i&s)", &result, &address);
1275 _bt_convert_addr_string_to_type(dev_address.addr,
1278 _bt_input_event_cb(BLUETOOTH_HID_DEVICE_CONNECTED,
1279 result, &dev_address,
1280 event_info->cb, event_info->user_data);
1281 } else if (strcasecmp(signal_name, BT_HID_DEVICE_DISCONNECTED) == 0) {
1282 const char *address = NULL;
1283 bluetooth_device_address_t dev_address = { {0} };
1285 g_variant_get(parameters, "(i&s)", &result, &address);
1287 BT_DBG("address: %s", address);
1289 _bt_convert_addr_string_to_type(dev_address.addr,
1292 _bt_input_event_cb(BLUETOOTH_HID_DEVICE_DISCONNECTED,
1293 result, &dev_address,
1294 event_info->cb, event_info->user_data);
1295 } else if (strcasecmp(signal_name, BT_INPUT_HID_DEVICE_CONNECTED) == 0) {
1296 BT_INFO_C("Type %s", g_variant_get_type_string(parameters));
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);
1303 _bt_convert_addr_string_to_type(dev_address.addr,
1305 int ctrl = -1, intr = -1;
1306 _bt_hid_device_get_fd(address, &ctrl, &intr);
1307 if (ctrl != -1 && intr != -1) {
1308 new_hid_connection(NULL, ctrl, &dev_address);
1309 new_hid_connection(NULL, intr, &dev_address);
1311 } else if (strcasecmp(signal_name, BT_INPUT_HID_DEVICE_DISCONNECTED) == 0) {
1312 const char *address = NULL;
1313 g_variant_get(parameters, "(i&s)", &result, &address);
1315 BT_DBG("address: %s", address);
1318 void __bt_a2dp_source_event_filter(GDBusConnection *connection,
1319 const gchar *sender_name,
1320 const gchar *object_path,
1321 const gchar *interface_name,
1322 const gchar *signal_name,
1323 GVariant *parameters,
1326 bt_event_info_t *event_info;
1327 int result = BLUETOOTH_ERROR_NONE;
1328 event_info = (bt_event_info_t *)user_data;
1329 ret_if(event_info == NULL);
1331 if (strcasecmp(object_path, BT_A2DP_SOURCE_PATH) != 0)
1333 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1336 ret_if(signal_name == NULL);
1338 if (strcasecmp(signal_name, BT_A2DP_SOURCE_CONNECTED) == 0) {
1339 char *address = NULL;
1341 g_variant_get(parameters, "(i&s)", &result, &address);
1342 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_CONNECTED,
1344 event_info->cb, event_info->user_data);
1345 } else if (strcasecmp(signal_name, BT_A2DP_SOURCE_DISCONNECTED) == 0) {
1346 char *address = NULL;
1348 g_variant_get(parameters, "(i&s)", &result, &address);
1350 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED,
1352 event_info->cb, event_info->user_data);
1356 void __bt_network_event_filter(GDBusConnection *connection,
1357 const gchar *sender_name,
1358 const gchar *object_path,
1359 const gchar *interface_name,
1360 const gchar *signal_name,
1361 GVariant *parameters,
1364 bt_event_info_t *event_info;
1365 int result = BLUETOOTH_ERROR_NONE;
1366 event_info = (bt_event_info_t *)user_data;
1367 ret_if(event_info == NULL);
1369 if (strcasecmp(object_path, BT_NETWORK_PATH) != 0)
1371 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1374 ret_if(signal_name == NULL);
1376 if (strcasecmp(signal_name, BT_NETWORK_CONNECTED) == 0) {
1377 const char *address = NULL;
1378 bluetooth_device_address_t dev_address = { {0} };
1380 g_variant_get(parameters, "(i&s)", &result, &address);
1382 _bt_convert_addr_string_to_type(dev_address.addr,
1385 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_CONNECTED,
1386 result, &dev_address,
1387 event_info->cb, event_info->user_data);
1388 } else if (strcasecmp(signal_name, BT_NETWORK_DISCONNECTED) == 0) {
1389 const char *address = NULL;
1390 bluetooth_device_address_t dev_address = { {0} };
1392 g_variant_get(parameters, "(i&s)", &result, &address);
1394 _bt_convert_addr_string_to_type(dev_address.addr,
1397 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_DISCONNECTED,
1398 result, &dev_address,
1399 event_info->cb, event_info->user_data);
1400 } else if (strcasecmp(signal_name, BT_NETWORK_SERVER_CONNECTED) == 0) {
1401 const char *device = NULL;
1402 const char *address = NULL;
1403 bluetooth_network_device_info_t network_info;
1405 g_variant_get(parameters, "(i&s&s)", &result,
1408 memset(&network_info, 0x00, sizeof(bluetooth_network_device_info_t));
1410 _bt_convert_addr_string_to_type(network_info.device_address.addr,
1413 _bt_print_device_address_t(&network_info.device_address);
1414 g_strlcpy(network_info.interface_name, device,
1415 sizeof(network_info.interface_name));
1417 DBG_SECURE("Interface: %s", network_info.interface_name);
1419 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED,
1420 result, &network_info,
1421 event_info->cb, event_info->user_data);
1422 } else if (strcasecmp(signal_name, BT_NETWORK_SERVER_DISCONNECTED) == 0) {
1423 const char *device = NULL;
1424 const char *address = NULL;
1425 bluetooth_network_device_info_t network_info;
1427 g_variant_get(parameters, "(i&s&s)", &result, &device, &address);
1429 memset(&network_info, 0x00, sizeof(bluetooth_network_device_info_t));
1431 _bt_convert_addr_string_to_type(network_info.device_address.addr,
1434 _bt_print_device_address_t(&network_info.device_address);
1436 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED,
1437 result, &network_info,
1438 event_info->cb, event_info->user_data);
1442 void __bt_avrcp_event_filter(GDBusConnection *connection,
1443 const gchar *sender_name,
1444 const gchar *object_path,
1445 const gchar *interface_name,
1446 const gchar *signal_name,
1447 GVariant *parameters,
1450 bt_event_info_t *event_info;
1451 int result = BLUETOOTH_ERROR_NONE;
1452 event_info = (bt_event_info_t *)user_data;
1453 ret_if(event_info == NULL);
1455 if (strcasecmp(object_path, BT_AVRCP_PATH) != 0)
1457 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1460 ret_if(signal_name == NULL);
1462 if (strcasecmp(signal_name, BT_AVRCP_CONNECTED) == 0) {
1463 char *address = NULL;
1465 g_variant_get(parameters, "(i&s)", &result, &address);
1467 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONNECTED,
1469 event_info->cb, event_info->user_data);
1470 } else if (strcasecmp(signal_name, BT_AVRCP_DISCONNECTED) == 0) {
1471 char *address = NULL;
1473 g_variant_get(parameters, "(i&s)", &result, &address);
1475 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_DISCONNECTED,
1477 event_info->cb, event_info->user_data);
1478 } else if (strcasecmp(signal_name, BT_MEDIA_SHUFFLE_STATUS) == 0) {
1479 unsigned int status;
1481 g_variant_get(parameters, "(u)", &status);
1482 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_SHUFFLE_STATUS,
1484 event_info->cb, event_info->user_data);
1485 } else if (strcasecmp(signal_name, BT_MEDIA_EQUALIZER_STATUS) == 0) {
1486 unsigned int status;
1488 g_variant_get(parameters, "(u)", &status);
1489 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_EQUALIZER_STATUS,
1491 event_info->cb, event_info->user_data);
1492 } else if (strcasecmp(signal_name, BT_MEDIA_REPEAT_STATUS) == 0) {
1493 unsigned int status;
1495 g_variant_get(parameters, "(u)", &status);
1496 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_REPEAT_STATUS,
1498 event_info->cb, event_info->user_data);
1499 } else if (strcasecmp(signal_name, BT_MEDIA_SCAN_STATUS) == 0) {
1500 unsigned int status;
1502 g_variant_get(parameters, "(u)", &status);
1503 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_SCAN_STATUS,
1505 event_info->cb, event_info->user_data);
1509 void __bt_avrcp_control_event_filter(GDBusConnection *connection,
1510 const gchar *sender_name,
1511 const gchar *object_path,
1512 const gchar *interface_name,
1513 const gchar *signal_name,
1514 GVariant *parameters,
1517 bt_event_info_t *event_info;
1518 int result = BLUETOOTH_ERROR_NONE;
1519 event_info = (bt_event_info_t *)user_data;
1520 ret_if(event_info == NULL);
1522 if (strcasecmp(object_path, BT_AVRCP_CONTROL_PATH) != 0)
1524 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1527 ret_if(signal_name == NULL);
1529 if (strcasecmp(signal_name, BT_AVRCP_CONNECTED) == 0) {
1530 char *address = NULL;
1532 g_variant_get(parameters, "(i&s)", &result, &address);
1534 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_CONNECTED,
1536 event_info->cb, event_info->user_data);
1537 } else if (strcasecmp(signal_name, BT_AVRCP_DISCONNECTED) == 0) {
1538 char *address = NULL;
1540 g_variant_get(parameters, "(i&s)", &result, &address);
1542 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_DISCONNECTED,
1544 event_info->cb, event_info->user_data);
1545 } else if (strcasecmp(signal_name, BT_MEDIA_SHUFFLE_STATUS) == 0) {
1546 unsigned int status;
1548 g_variant_get(parameters, "(u)", &status);
1549 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_SHUFFLE_STATUS,
1551 event_info->cb, event_info->user_data);
1552 } else if (strcasecmp(signal_name, BT_MEDIA_EQUALIZER_STATUS) == 0) {
1553 unsigned int status;
1555 g_variant_get(parameters, "(u)", &status);
1556 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_EQUALIZER_STATUS,
1558 event_info->cb, event_info->user_data);
1559 } else if (strcasecmp(signal_name, BT_MEDIA_REPEAT_STATUS) == 0) {
1560 unsigned int status;
1562 g_variant_get(parameters, "(u)", &status);
1563 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_REPEAT_STATUS,
1565 event_info->cb, event_info->user_data);
1566 } else if (strcasecmp(signal_name, BT_MEDIA_SCAN_STATUS) == 0) {
1567 unsigned int status;
1569 g_variant_get(parameters, "(u)", &status);
1570 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_SCAN_STATUS,
1572 event_info->cb, event_info->user_data);
1573 } else if (strcasecmp(signal_name, BT_MEDIA_PLAY_STATUS) == 0) {
1574 unsigned int status;
1576 g_variant_get(parameters, "(u)", &status);
1577 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_PLAY_STATUS_CHANGED,
1579 event_info->cb, event_info->user_data);
1580 } else if (strcasecmp(signal_name, BT_MEDIA_POSITION_STATUS) == 0) {
1581 unsigned int status;
1583 g_variant_get(parameters, "(u)", &status);
1584 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SONG_POSITION_STATUS,
1586 event_info->cb, event_info->user_data);
1587 } else if (strcasecmp(signal_name, BT_MEDIA_TRACK_CHANGE) == 0) {
1588 media_metadata_attributes_t metadata;
1593 unsigned int total_tracks;
1594 unsigned int number;
1595 unsigned int duration;
1597 g_variant_get(parameters, "(&s&s&s&suuu)", &title,
1598 &artist, &album, &genre,
1599 &total_tracks, &number,
1601 memset(&metadata, 0x00, sizeof(media_metadata_attributes_t));
1603 metadata.title = title;
1604 metadata.artist = artist;
1605 metadata.album = album;
1606 metadata.genre = genre;
1607 metadata.total_tracks = total_tracks;
1608 metadata.number = number;
1609 metadata.duration = (int64_t)duration;
1611 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_TRACK_CHANGED,
1613 event_info->cb, event_info->user_data);
1617 void __bt_opp_client_event_filter(GDBusConnection *connection,
1618 const gchar *sender_name,
1619 const gchar *object_path,
1620 const gchar *interface_name,
1621 const gchar *signal_name,
1622 GVariant *parameters,
1625 bt_event_info_t *event_info;
1626 int result = BLUETOOTH_ERROR_NONE;
1627 event_info = (bt_event_info_t *)user_data;
1628 ret_if(event_info == NULL);
1630 if (strcasecmp(object_path, BT_OPP_CLIENT_PATH) != 0)
1632 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1635 ret_if(signal_name == NULL);
1637 if (strcasecmp(signal_name, BT_OPP_CONNECTED) == 0) {
1638 const char *address = NULL;
1640 bluetooth_device_address_t dev_address = { {0} };
1642 g_variant_get(parameters, "(i&si)", &result,
1643 &address, &request_id);
1645 if (__bt_is_request_id_exist(request_id) == FALSE) {
1646 BT_ERR("Different request id!");
1650 _bt_convert_addr_string_to_type(dev_address.addr,
1653 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_CONNECTED,
1654 result, &dev_address,
1655 event_info->cb, event_info->user_data);
1657 if (result != BLUETOOTH_ERROR_NONE) {
1658 __bt_remove_push_request_id(request_id);
1660 } else if (strcasecmp(signal_name, BT_OPP_DISCONNECTED) == 0) {
1661 const char *address = NULL;
1663 bluetooth_device_address_t dev_address = { {0} };
1665 g_variant_get(parameters, "(i&si)", &result, &address,
1668 if (__bt_is_request_id_exist(request_id) == FALSE) {
1669 BT_ERR("Different request id!");
1673 _bt_convert_addr_string_to_type(dev_address.addr,
1676 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_DISCONNECTED,
1677 result, &dev_address,
1678 event_info->cb, event_info->user_data);
1680 __bt_remove_push_request_id(request_id);
1681 } else if (strcasecmp(signal_name, BT_TRANSFER_STARTED) == 0) {
1682 const char *file_name = NULL;
1683 const char *device_addr = NULL;
1686 bt_opc_transfer_info_t transfer_info;
1688 g_variant_get(parameters, "(i&s&sti)", &result, &device_addr, &file_name,
1689 &size, &request_id);
1691 if (__bt_is_request_id_exist(request_id) == FALSE) {
1692 BT_ERR("Different request id!");
1696 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1698 transfer_info.filename = g_strdup(file_name);
1699 transfer_info.device_addr = g_strdup(device_addr);
1700 transfer_info.size = size;
1702 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_STARTED,
1703 result, &transfer_info,
1704 event_info->cb, event_info->user_data);
1706 g_free(transfer_info.device_addr);
1707 g_free(transfer_info.filename);
1708 } else if (strcasecmp(signal_name, BT_TRANSFER_PROGRESS) == 0) {
1709 const char *file_name = NULL;
1713 bt_opc_transfer_info_t transfer_info;
1715 g_variant_get(parameters, "(i&stii)", &result,
1716 &file_name, &size, &progress, &request_id);
1718 if (__bt_is_request_id_exist(request_id) == FALSE) {
1719 BT_ERR("Different request id!");
1723 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1725 transfer_info.filename = g_strdup(file_name);
1726 transfer_info.size = size;
1727 transfer_info.percentage = progress;
1729 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS,
1730 result, &transfer_info,
1731 event_info->cb, event_info->user_data);
1733 g_free(transfer_info.filename);
1734 } else if (strcasecmp(signal_name, BT_TRANSFER_COMPLETED) == 0) {
1735 const char *file_name = NULL;
1736 const char *device_addr = NULL;
1739 bt_opc_transfer_info_t transfer_info;
1741 g_variant_get(parameters, "(i&s&sti)", &result, &device_addr,
1742 &file_name, &size, &request_id);
1744 if (__bt_is_request_id_exist(request_id) == FALSE) {
1745 BT_ERR("Different request id!");
1749 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1751 transfer_info.device_addr = g_strdup(device_addr);
1752 transfer_info.filename = g_strdup(file_name);
1753 transfer_info.size = size;
1755 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE,
1756 result, &transfer_info,
1757 event_info->cb, event_info->user_data);
1759 g_free(transfer_info.device_addr);
1760 g_free(transfer_info.filename);
1764 void __bt_opp_server_event_filter(GDBusConnection *connection,
1765 const gchar *sender_name,
1766 const gchar *object_path,
1767 const gchar *interface_name,
1768 const gchar *signal_name,
1769 GVariant *parameters,
1772 bt_event_info_t *event_info;
1773 int result = BLUETOOTH_ERROR_NONE;
1774 event_info = (bt_event_info_t *)user_data;
1775 ret_if(event_info == NULL);
1777 if (strcasecmp(object_path, BT_OPP_SERVER_PATH) != 0)
1779 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1782 ret_if(signal_name == NULL);
1784 if (strcasecmp(signal_name, BT_TRANSFER_AUTHORIZED) == 0) {
1785 /* Native only event */
1786 const char *file_name = NULL;
1787 const char *address = NULL;
1788 const char *device_name = NULL;
1790 bt_obex_server_authorize_into_t auth_info;
1792 g_variant_get(parameters, "(i&st&s&s)", &result, &file_name, &size,
1793 &address, &device_name);
1795 /* OSP server: Don't get this event */
1796 ret_if(obex_server_id == BT_CUSTOM_SERVER);
1798 memset(&auth_info, 0x00, sizeof(bt_obex_server_authorize_into_t));
1800 auth_info.filename = g_strdup(file_name);
1801 auth_info.length = size;
1802 auth_info.address = g_strdup(address);
1803 auth_info.name = g_strdup(device_name);
1804 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE,
1806 event_info->cb, event_info->user_data);
1808 g_free(auth_info.filename);
1809 g_free(auth_info.address);
1810 g_free(auth_info.name);
1811 } else if (strcasecmp(signal_name, BT_CONNECTION_AUTHORIZED) == 0) {
1812 /* OSP only event */
1813 const char *address = NULL;
1814 const char *name = NULL;
1815 bluetooth_device_address_t dev_address = { {0} };
1817 g_variant_get(parameters, "(i&s&s)", &result, &address, &name);
1819 /* Native server: Don't get this event */
1820 ret_if(obex_server_id == BT_NATIVE_SERVER);
1822 _bt_convert_addr_string_to_type(dev_address.addr,
1825 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE,
1826 result, &dev_address,
1827 event_info->cb, event_info->user_data);
1828 } else if (strcasecmp(signal_name, BT_TRANSFER_CONNECTED) == 0) {
1829 bt_obex_server_connection_info_t conn_info = {0, };
1830 char *address = NULL;
1832 int transfer_id = -1;
1833 g_variant_get(parameters, "(i&s&si)", &result,
1834 &address, &name, &transfer_id);
1836 conn_info.address = g_strdup(address);
1837 conn_info.device_name = g_strdup(name);
1838 conn_info.transfer_id = transfer_id;
1840 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_CONNECTED,
1841 result, &conn_info, event_info->cb,
1842 event_info->user_data);
1844 g_free(conn_info.address);
1845 g_free(conn_info.device_name);
1846 } else if (strcasecmp(signal_name, BT_TRANSFER_DISCONNECTED) == 0) {
1847 bt_obex_server_transfer_info_t transfer_info = {0, };
1848 char *address = NULL;
1849 int transfer_id = -1;
1850 g_variant_get(parameters, "(i&si)", &result, &address, &transfer_id);
1851 DBG_SECURE("address: %s, transfer_id: %d", address, transfer_id);
1853 transfer_info.address = g_strdup(address);
1854 transfer_info.transfer_id = transfer_id;
1856 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED,
1857 result, &transfer_info, event_info->cb,
1858 event_info->user_data);
1859 g_free(transfer_info.address);
1860 } else if (strcasecmp(signal_name, BT_TRANSFER_STARTED) == 0) {
1861 const char *device_name = NULL;
1862 const char *file_name = NULL;
1863 const char *type = NULL;
1864 const char *address = NULL;
1865 GVariantIter *iter = NULL;
1868 int transfer_id = 0;
1869 int server_type = 0; /* bt_server_type_t */
1871 bt_obex_server_transfer_info_t transfer_info;
1873 g_variant_get(parameters, "(i&s&s&s&stii(ay))", &result, &device_name,
1874 &file_name, &type, &address, &size, &transfer_id, &server_type, &iter);
1876 /* Other server's event */
1877 ret_if(obex_server_id != server_type &&
1878 server_type != BT_FTP_SERVER);
1880 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
1882 transfer_info.contact_auth_info = g_malloc0(sizeof(unsigned char) * 5);
1884 for (i = 0; i < 5 && g_variant_iter_loop(iter, "y", &byte); ++i)
1885 transfer_info.contact_auth_info[i] = byte;
1887 transfer_info.device_name = g_strdup(device_name);
1888 transfer_info.filename = g_strdup(file_name);
1889 transfer_info.type = g_strdup(type);
1890 transfer_info.address = g_strdup(address);
1891 transfer_info.file_size = size;
1892 transfer_info.transfer_id = transfer_id;
1893 transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
1894 FTP_SERVER : OPP_SERVER;
1896 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED,
1897 result, &transfer_info,
1898 event_info->cb, event_info->user_data);
1900 g_free(transfer_info.filename);
1901 g_free(transfer_info.type);
1902 g_free(transfer_info.device_name);
1903 g_free(transfer_info.address);
1904 g_free(transfer_info.contact_auth_info);
1905 g_variant_iter_free(iter);
1906 } else if (strcasecmp(signal_name, BT_TRANSFER_PROGRESS) == 0) {
1907 const char *file_name = NULL;
1908 const char *type = NULL;
1909 const char *device_name = NULL;
1910 const char *address = NULL;
1911 int transfer_id = 0;
1913 int server_type = 0; /* bt_server_type_t */
1915 bt_obex_server_transfer_info_t transfer_info;
1917 g_variant_get(parameters, "(i&s&s&s&stiii)", &result, &file_name,
1918 &type, &device_name, &address, &size, &transfer_id,
1919 &progress, &server_type);
1921 /* Other server's event */
1922 ret_if(obex_server_id != server_type &&
1923 server_type != BT_FTP_SERVER);
1925 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
1927 transfer_info.filename = g_strdup(file_name);
1928 transfer_info.type = g_strdup(type);
1929 transfer_info.device_name = g_strdup(device_name);
1930 transfer_info.address = g_strdup(address);
1931 transfer_info.file_size = size;
1932 transfer_info.transfer_id = transfer_id;
1933 transfer_info.percentage = progress;
1934 transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
1935 FTP_SERVER : OPP_SERVER;
1937 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS,
1938 result, &transfer_info,
1939 event_info->cb, event_info->user_data);
1941 g_free(transfer_info.filename);
1942 g_free(transfer_info.device_name);
1943 g_free(transfer_info.address);
1944 g_free(transfer_info.type);
1945 } else if (strcasecmp(signal_name, BT_TRANSFER_COMPLETED) == 0) {
1946 const char *file_name = NULL;
1947 const char *device_name = NULL;
1948 const char *address = NULL;
1949 const char *type = NULL;
1950 const char *file_path;
1951 int transfer_id = 0;
1952 int server_type = 0; /* bt_server_type_t */
1954 bt_obex_server_transfer_info_t transfer_info;
1956 g_variant_get(parameters, "(i&s&s&s&s&stii)", &result, &file_name,
1957 &type, &device_name, &file_path, &address, &size,
1958 &transfer_id, &server_type);
1960 /* Other server's event */
1961 ret_if(obex_server_id != server_type &&
1962 server_type != BT_FTP_SERVER);
1964 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
1966 transfer_info.filename = g_strdup(file_name);
1967 transfer_info.type = g_strdup(type);
1968 transfer_info.device_name = g_strdup(device_name);
1969 transfer_info.file_path = g_strdup(file_path);
1970 transfer_info.address = g_strdup(address);
1971 transfer_info.file_size = size;
1972 transfer_info.transfer_id = transfer_id;
1973 transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
1974 FTP_SERVER : OPP_SERVER;
1976 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_COMPLETED,
1977 result, &transfer_info,
1978 event_info->cb, event_info->user_data);
1980 g_free(transfer_info.filename);
1981 g_free(transfer_info.type);
1982 g_free(transfer_info.device_name);
1983 g_free(transfer_info.address);
1984 g_free(transfer_info.file_path);
1988 void __bt_pbap_client_event_filter(GDBusConnection *connection,
1989 const gchar *sender_name,
1990 const gchar *object_path,
1991 const gchar *interface_name,
1992 const gchar *signal_name,
1993 GVariant *parameters,
1996 bt_event_info_t *event_info;
1997 int result = BLUETOOTH_ERROR_NONE;
1998 event_info = (bt_event_info_t *)user_data;
2000 ret_if(event_info == NULL);
2002 if (strcasecmp(object_path, BT_PBAP_CLIENT_PATH) != 0)
2005 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
2008 ret_if(signal_name == NULL);
2010 BT_DBG("Type: %s", g_variant_get_type_string(parameters));
2012 if (strcasecmp(signal_name, BT_PBAP_CONNECTED) == 0) {
2013 bt_pbap_connected_t connected = { { { 0 }, }, };
2014 char *address = NULL;
2016 g_variant_get(parameters, "(i&s)", &result, &address);
2017 BT_DBG("address: %s", address);
2019 _bt_convert_addr_string_to_type(connected.btaddr.addr,
2022 connected.connected = 1;
2024 connected.connected = 0;
2026 _bt_common_event_cb(BLUETOOTH_PBAP_CONNECTED,
2028 event_info->cb, event_info->user_data);
2029 } else if (strcasecmp(signal_name, BT_PBAP_DISCONNECTED) == 0) {
2030 bt_pbap_connected_t disconnected = { { { 0 }, }, };
2031 char *address = NULL;
2033 g_variant_get(parameters, "(i&s)", &result, &address);
2034 BT_DBG("address: %s", address);
2036 _bt_convert_addr_string_to_type(disconnected.btaddr.addr,
2038 disconnected.connected = 0;
2040 _bt_common_event_cb(BLUETOOTH_PBAP_CONNECTED,
2041 result, &disconnected,
2042 event_info->cb, event_info->user_data);
2043 } else if (strcasecmp(signal_name, BT_PBAP_PHONEBOOK_SIZE) == 0) {
2044 bt_pbap_phonebook_size_t pb_size = { { { 0 }, }, };
2045 char *address = NULL;
2048 g_variant_get(parameters, "(i&si)", &result, &address, &size);
2050 BT_DBG("address: %s, size: %d", address, size);
2052 _bt_convert_addr_string_to_type(pb_size.btaddr.addr,
2054 pb_size.size = size;
2056 _bt_common_event_cb(BLUETOOTH_PBAP_PHONEBOOK_SIZE,
2058 event_info->cb, event_info->user_data);
2059 } else if (strcasecmp(signal_name, BT_PBAP_PHONEBOOK_PULL) == 0) {
2060 bt_pbap_phonebook_pull_t pb_pull = { { { 0 } }, };
2061 char *address = NULL;
2062 char *vcf_file = NULL;
2065 g_variant_get(parameters, "(i&s&si)", &result, &address, &vcf_file, &success);
2067 BT_DBG("address: %s, vcf_file: %s, success: %d",
2068 address, vcf_file, success);
2070 _bt_convert_addr_string_to_type(pb_pull.btaddr.addr,
2072 pb_pull.vcf_file = vcf_file;
2073 pb_pull.success = success;
2074 _bt_common_event_cb(BLUETOOTH_PBAP_PHONEBOOK_PULL,
2076 event_info->cb, event_info->user_data);
2077 } else if (strcasecmp(signal_name, BT_PBAP_VCARD_LIST) == 0) {
2078 bt_pbap_vcard_list_t vc_list = { { { 0 } }, };
2079 char *address = NULL;
2081 gchar **list = NULL;
2082 GVariant *string_var;
2086 g_variant_get(parameters, "(i&sv)", &result, &address, &string_var);
2088 list = (gchar **)g_variant_get_strv(string_var, &count);
2092 for(i = 0; i < count; i++)
2093 BT_DBG("%s", list[i]);
2095 BT_DBG("address: %s, result: %d, count: %d, success: %d",
2096 address, result, count, success);
2098 _bt_convert_addr_string_to_type(vc_list.btaddr.addr,
2100 vc_list.vcards = list;
2101 vc_list.length = count;
2102 vc_list.success = success;
2103 _bt_common_event_cb(BLUETOOTH_PBAP_VCARD_LIST,
2105 event_info->cb, event_info->user_data);
2107 g_variant_unref(string_var);
2109 } else if (strcasecmp(signal_name, BT_PBAP_VCARD_PULL) == 0) {
2110 bt_pbap_vcard_pull_t vc_pull = { { { 0 } }, };
2111 char *address = NULL;
2112 char *vcf_file = NULL;
2115 g_variant_get(parameters, "(i&s&si)",
2116 &result, &address, &vcf_file, &success);
2118 BT_DBG("address: %s, vcf_file: %s, success: %d",
2119 address, vcf_file, success);
2121 _bt_convert_addr_string_to_type(vc_pull.btaddr.addr, address);
2122 vc_pull.vcf_file = vcf_file;
2123 vc_pull.success = success;
2124 _bt_common_event_cb(BLUETOOTH_PBAP_VCARD_PULL,
2126 event_info->cb, event_info->user_data);
2127 } else if (strcasecmp(signal_name, BT_PBAP_SEARCH_PHONEBOOK) == 0) {
2128 bt_pbap_phonebook_search_list_t vc_list = { { { 0 } }, };
2129 char *address = NULL;
2131 gchar **list = NULL;
2132 GVariant *string_var;
2136 g_variant_get(parameters, "(i&s@as)", &result, &address, &string_var);
2138 list = (gchar **)g_variant_get_strv(string_var, &count);
2140 for(i = 0; i < count; i++)
2141 BT_DBG("%s", list[i]);
2143 BT_DBG("address: %s success: %d", address, success);
2145 _bt_convert_addr_string_to_type(vc_list.btaddr.addr, address);
2146 vc_list.vcards = list;
2147 vc_list.length = count;
2148 vc_list.success = success;
2149 _bt_common_event_cb(BLUETOOTH_PBAP_PHONEBOOK_SEARCH,
2151 event_info->cb, event_info->user_data);
2153 g_variant_unref(string_var);
2158 void __bt_rfcomm_client_event_filter(GDBusConnection *connection,
2159 const gchar *sender_name,
2160 const gchar *object_path,
2161 const gchar *interface_name,
2162 const gchar *signal_name,
2163 GVariant *parameters,
2166 bt_event_info_t *event_info;
2167 int result = BLUETOOTH_ERROR_NONE;
2168 event_info = (bt_event_info_t *)user_data;
2169 ret_if(event_info == NULL);
2171 if (strcasecmp(object_path, BT_RFCOMM_CLIENT_PATH) != 0)
2173 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
2176 ret_if(signal_name == NULL);
2178 if (strcasecmp(signal_name, BT_RFCOMM_CONNECTED) == 0) {
2179 const char *address = NULL;
2180 const char *uuid = NULL;
2182 bluetooth_rfcomm_connection_t conn_info;
2184 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2187 memset(&conn_info, 0x00, sizeof(bluetooth_rfcomm_connection_t));
2188 conn_info.device_role = RFCOMM_ROLE_CLIENT;
2189 g_strlcpy(conn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2190 conn_info.socket_fd = socket_fd;
2191 _bt_convert_addr_string_to_type(conn_info.device_addr.addr,
2194 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_CONNECTED,
2196 event_info->cb, event_info->user_data);
2197 } else if (strcasecmp(signal_name, BT_RFCOMM_DISCONNECTED) == 0) {
2198 const char *address = NULL;
2199 const char *uuid = NULL;
2201 bluetooth_rfcomm_disconnection_t disconn_info;
2203 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2206 memset(&disconn_info, 0x00, sizeof(bluetooth_rfcomm_disconnection_t));
2207 disconn_info.device_role = RFCOMM_ROLE_CLIENT;
2208 g_strlcpy(disconn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2209 disconn_info.socket_fd = socket_fd;
2210 _bt_convert_addr_string_to_type(disconn_info.device_addr.addr,
2213 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DISCONNECTED,
2214 result, &disconn_info,
2215 event_info->cb, event_info->user_data);
2216 } else if (strcasecmp(signal_name, BT_RFCOMM_DATA_RECEIVED) == 0) {
2220 bluetooth_rfcomm_received_data_t data_r;
2223 g_variant_get(parameters, "(in@ay)", &result, &socket_fd,
2226 buffer_len = g_variant_get_size(byte_var);
2227 buffer = (char *) g_variant_get_data(byte_var);
2229 data_r.socket_fd = socket_fd;
2230 data_r.buffer_size = buffer_len;
2231 data_r.buffer = buffer;
2233 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED,
2235 event_info->cb, event_info->user_data);
2236 g_variant_unref(byte_var);
2240 void __bt_rfcomm_server_event_filter(GDBusConnection *connection,
2241 const gchar *sender_name,
2242 const gchar *object_path,
2243 const gchar *interface_name,
2244 const gchar *signal_name,
2245 GVariant *parameters,
2248 bt_event_info_t *event_info;
2249 int result = BLUETOOTH_ERROR_NONE;
2250 event_info = (bt_event_info_t *)user_data;
2251 ret_if(event_info == NULL);
2253 if (strcasecmp(object_path, BT_RFCOMM_SERVER_PATH) != 0)
2255 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
2258 ret_if(signal_name == NULL);
2260 if (strcasecmp(signal_name, BT_RFCOMM_CONNECTED) == 0) {
2261 const char *address = NULL;
2262 const char *uuid = NULL;
2264 bluetooth_rfcomm_connection_t conn_info;
2266 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2269 memset(&conn_info, 0x00, sizeof(bluetooth_rfcomm_connection_t));
2270 conn_info.device_role = RFCOMM_ROLE_SERVER;
2271 g_strlcpy(conn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2272 conn_info.socket_fd = socket_fd;
2273 _bt_convert_addr_string_to_type(conn_info.device_addr.addr,
2276 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_CONNECTED,
2278 event_info->cb, event_info->user_data);
2279 } else if (strcasecmp(signal_name, BT_RFCOMM_DISCONNECTED) == 0) {
2280 const char *address = NULL;
2281 const char *uuid = NULL;
2283 bluetooth_rfcomm_disconnection_t disconn_info;
2285 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2288 memset(&disconn_info, 0x00, sizeof(bluetooth_rfcomm_disconnection_t));
2289 disconn_info.device_role = RFCOMM_ROLE_SERVER;
2290 g_strlcpy(disconn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2291 disconn_info.socket_fd = socket_fd;
2292 _bt_convert_addr_string_to_type(disconn_info.device_addr.addr,
2295 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DISCONNECTED,
2296 result, &disconn_info,
2297 event_info->cb, event_info->user_data);
2298 } else if (strcasecmp(signal_name, BT_CONNECTION_AUTHORIZED) == 0) {
2299 /* OSP only event */
2300 bluetooth_rfcomm_connection_request_t req_ind;
2301 char *address = NULL;
2307 g_variant_get(parameters, "(i&s&s&s&sn)", &result, &address,
2308 &uuid, &name, &path, &socket_fd);
2310 if (_check_uuid_path(path, uuid) == FALSE)
2313 memset(&req_ind, 0x00, sizeof(bluetooth_rfcomm_connection_request_t));
2314 _bt_convert_addr_string_to_type(req_ind.device_addr.addr,
2317 req_ind.socket_fd = socket_fd;
2319 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_AUTHORIZE,
2321 event_info->cb, event_info->user_data);
2322 } else if (strcasecmp(signal_name, BT_RFCOMM_SERVER_REMOVED) == 0) {
2323 /* OSP only event */
2326 g_variant_get(parameters, "(in)", &result, &socket_fd);
2328 ret_if(__bt_is_server_exist(socket_fd) == FALSE);
2330 _bt_remove_server(socket_fd);
2331 } else if (strcasecmp(signal_name, BT_RFCOMM_DATA_RECEIVED) == 0) {
2332 char *buffer = NULL;
2335 bluetooth_rfcomm_received_data_t data_r;
2338 g_variant_get(parameters, "(in@ay)", &result,
2339 &socket_fd, &byte_var);
2341 buffer_len = g_variant_get_size(byte_var);
2342 buffer = (char *) g_variant_get_data(byte_var);
2344 data_r.socket_fd = socket_fd;
2345 data_r.buffer_size = buffer_len;
2346 data_r.buffer = buffer;
2348 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED,
2350 event_info->cb, event_info->user_data);
2351 g_variant_unref(byte_var);
2355 void __bt_hf_agent_event_filter(GDBusConnection *connection,
2356 const gchar *sender_name,
2357 const gchar *object_path,
2358 const gchar *interface_name,
2359 const gchar *signal_name,
2360 GVariant *parameters,
2365 bt_event_info_t *event_info;
2366 int result = BLUETOOTH_ERROR_NONE;
2367 event_info = (bt_event_info_t *)user_data;
2368 ret_if(event_info == NULL);
2371 if (strcasecmp(object_path, BT_HF_AGENT_PATH) != 0)
2373 if (strcasecmp(interface_name, BT_HF_SERVICE_INTERFACE) != 0)
2376 ret_if(signal_name == NULL);
2378 BT_DBG("%s", signal_name);
2379 if (strcasecmp(signal_name, "Connected") == 0) {
2380 char *address = NULL;
2382 g_variant_get(parameters, "(s)", &address);
2383 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CONNECTED,
2385 event_info->cb, event_info->user_data);
2386 } else if (strcasecmp(signal_name, "Disconnected") == 0) {
2387 char *address = NULL;
2389 g_variant_get(parameters, "(s)", &address);
2390 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_DISCONNECTED,
2392 event_info->cb, event_info->user_data);
2393 } else if (strcasecmp(signal_name, "AudioConnected") == 0) {
2394 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_AUDIO_CONNECTED,
2396 event_info->cb, event_info->user_data);
2397 } else if (strcasecmp(signal_name, "AudioDisconnected") == 0) {
2398 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_AUDIO_DISCONNECTED,
2400 event_info->cb, event_info->user_data);
2401 } else if (strcasecmp(signal_name, "Ring") == 0) {
2402 char *phoneno = NULL;
2404 g_variant_get(parameters, "(&s)", &phoneno);
2406 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_RING_INDICATOR,
2408 event_info->cb, event_info->user_data);
2409 } else if (strcasecmp(signal_name, "CallWaiting") == 0) {
2410 char *phoneno = NULL;
2412 g_variant_get(parameters, "(&s)", &phoneno);
2414 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_WAITING,
2416 event_info->cb, event_info->user_data);
2417 } else if (strcasecmp(signal_name, "CallTerminated") == 0) {
2418 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_TERMINATED,
2420 event_info->cb, event_info->user_data);
2421 } else if (strcasecmp(signal_name, "FailedToDial") == 0) {
2422 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_FAILED_TO_DIAL,
2424 event_info->cb, event_info->user_data);
2425 } else if (strcasecmp(signal_name, "CallIdle") == 0) {
2426 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_IDLE,
2428 event_info->cb, event_info->user_data);
2429 } else if (strcasecmp(signal_name, "CallSetupIncoming") == 0) {
2430 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALLSETUP_INCOMING,
2432 event_info->cb, event_info->user_data);
2433 } else if (strcasecmp(signal_name, "CallSetupDialing") == 0) {
2434 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALLSETUP_DIALING,
2436 event_info->cb, event_info->user_data);
2437 } else if (strcasecmp(signal_name, "CallSetupAlerting") == 0) {
2438 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALLSETUP_ALERTING,
2440 event_info->cb, event_info->user_data);
2441 } else if (strcasecmp(signal_name, "CallStarted") == 0) {
2442 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_STARTED,
2444 event_info->cb, event_info->user_data);
2445 } else if (strcasecmp(signal_name, "CallEnded") == 0) {
2446 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_ENDED,
2448 event_info->cb, event_info->user_data);
2449 } else if (strcasecmp(signal_name, "NoCallsHeld") == 0) {
2450 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_UNHOLD,
2452 event_info->cb, event_info->user_data);
2453 } else if (strcasecmp(signal_name, "CallsSwapped") == 0) {
2454 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_SWAPPED,
2456 event_info->cb, event_info->user_data);
2457 } else if (strcasecmp(signal_name, "CallOnHold") == 0) {
2458 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_ON_HOLD,
2460 event_info->cb, event_info->user_data);
2461 } else if (strcasecmp(signal_name, "CallStatusUpdate") == 0) {
2463 GVariant *var_data = NULL;
2464 char *number = NULL;
2465 int idx, dir, status, mpart;
2466 bt_hf_call_list_s *handle = NULL;
2468 g_variant_get(parameters, "(i@a(siiii))", &call_count,
2470 BT_DBG("call count : %d", call_count);
2473 GVariantIter *iter = NULL;
2474 __bt_call_list_create(&handle);
2476 g_variant_get(var_data, "a(siiii)", &iter);
2477 while (g_variant_iter_loop(iter, "(siiii)", &number,
2478 &dir, &status, &mpart, &idx)) {
2479 BT_DBG("call number:%s, dir:%d, status : %d",
2480 number, dir, status);
2481 BT_DBG("call mpart : %d, idx : %d", mpart, idx);
2482 __bt_call_list_add(handle, number, dir,
2483 status, mpart, idx);
2485 g_variant_iter_free(iter);
2486 g_variant_unref(var_data);
2489 if (handle && (call_count == g_list_length(handle->list))) {
2490 handle->count = call_count;
2491 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_STATUS,
2493 event_info->cb, event_info->user_data);
2495 BT_ERR(" Mismatch in call count : %d", call_count);
2498 __bt_call_list_destroy(handle);
2499 } else if (strcasecmp(signal_name, "VoiceRecognition") == 0) {
2501 g_variant_get(parameters, "(i)", &status);
2502 BT_DBG("status = [%d]\n", status);
2504 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VOICE_RECOGNITION_ENABLED,
2506 event_info->cb, event_info->user_data);
2508 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VOICE_RECOGNITION_DISABLED,
2510 event_info->cb, event_info->user_data);
2511 } else if (strcasecmp(signal_name, "VolumeSpeaker") == 0) {
2513 g_variant_get(parameters, "(i)", &value);
2514 BT_DBG("Value = [%d]\n", value);
2515 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VOLUME_SPEAKER,
2517 event_info->cb, event_info->user_data);
2518 } else if (strcasecmp(signal_name, "SamsungXSAT") == 0) {
2521 bluetooth_vendor_dep_at_cmd_t cmd;
2522 g_variant_get(parameters, "(i&s)", &value, &msg);
2523 BT_DBG("Value = [%d], message = %s\n", value, msg);
2526 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VENDOR_DEP_CMD,
2528 event_info->cb, event_info->user_data);
2529 } else if (strcasecmp(signal_name, "PropertyChanged") == 0) {
2532 bluetooth_hf_ciev_device_event_t dev_event;
2534 g_variant_get(parameters, "(&sv)", &property, &value);
2535 dev_event.value = g_variant_get_uint16(value);
2537 BT_DBG("Property: %s , value: %d", property, dev_event.value);
2538 g_variant_unref(value);
2540 if (strcasecmp(property, "BatteryCharge") == 0) {
2541 dev_event.event = BLUETOOTH_HF_CIEV_BATTCHG;
2542 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED,
2544 event_info->cb, event_info->user_data);
2545 } else if (strcasecmp(property, "SignalStrength") == 0) {
2546 dev_event.event = BLUETOOTH_HF_CIEV_SIGNAL;
2547 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED,
2549 event_info->cb, event_info->user_data);
2550 } else if (strcasecmp(property, "RegistrationStatus") == 0) {
2551 dev_event.event = BLUETOOTH_HF_CIEV_SERVICE;
2552 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CIEV_DEVICE_STATUS_CHANGED,
2554 event_info->cb, event_info->user_data);
2560 static void __bt_remove_all_events(void)
2562 bt_event_info_t *info;
2564 while ((info = g_slist_nth_data(event_list, 0)) != NULL) {
2565 _bt_unregister_event(info->event_type);
2569 g_slist_free(event_list);
2574 static gboolean __bt_event_is_registered(int event_type)
2577 bt_event_info_t *info;
2579 for (l = event_list; l != NULL; l = g_slist_next(l)) {
2584 if (info->event_type == event_type)
2591 bt_event_info_t *_bt_event_get_cb_data(int event_type)
2594 bt_event_info_t *info;
2596 for (l = event_list; l != NULL; l = g_slist_next(l)) {
2601 if (info->event_type == event_type)
2608 void _bt_add_server(int server_fd)
2610 bt_server_info_t *info;
2612 info = g_new0(bt_server_info_t, 1);
2613 info->server_fd = server_fd;
2615 server_list = g_slist_append(server_list, info);
2618 void _bt_remove_server(int server_fd)
2621 bt_server_info_t *info;
2623 for (l = server_list; l != NULL; l = g_slist_next(l)) {
2628 if (info->server_fd == server_fd) {
2629 server_list = g_slist_remove(server_list, (void *)info);
2636 void _bt_set_obex_server_id(int server_type)
2638 obex_server_id = server_type;
2641 int _bt_get_obex_server_id(void)
2643 return obex_server_id;
2646 int _bt_init_event_handler(void)
2648 if (is_initialized == TRUE) {
2649 BT_ERR("Connection already exist");
2650 return BLUETOOTH_ERROR_ALREADY_INITIALIZED;
2653 __bt_remove_all_events();
2655 is_initialized = TRUE;
2657 return BLUETOOTH_ERROR_NONE;
2660 int _bt_deinit_event_handler(void)
2662 if (is_initialized == FALSE) {
2663 BT_ERR("Connection dose not exist");
2664 return BLUETOOTH_ERROR_INTERNAL;
2667 __bt_remove_all_events();
2669 if (disable_timer_id > 0) {
2670 g_source_remove(disable_timer_id);
2671 disable_timer_id = 0;
2674 is_initialized = FALSE;
2676 return BLUETOOTH_ERROR_NONE;
2679 static void __bt_event_data_free(void *data)
2681 bt_event_info_t *cb_data = data;
2683 ret_if(cb_data == NULL);
2688 int _bt_register_event(int event_type, void *event_cb, void *user_data)
2690 GDBusConnection *connection_type;
2691 GDBusSignalCallback event_func;
2692 bt_event_info_t *cb_data;
2694 const char *interface = BT_EVENT_SERVICE;
2696 if (is_initialized == FALSE)
2697 _bt_init_event_handler();
2699 if (__bt_event_is_registered(event_type) == TRUE) {
2700 BT_ERR("The event is already registed");
2701 return BLUETOOTH_ERROR_ALREADY_INITIALIZED;
2704 switch (event_type) {
2705 case BT_ADAPTER_EVENT:
2706 event_func = __bt_adapter_event_filter;
2707 path = BT_ADAPTER_PATH;
2709 case BT_LE_ADAPTER_EVENT:
2710 event_func = __bt_adapter_le_event_filter;
2711 path = BT_LE_ADAPTER_PATH;
2713 case BT_DEVICE_EVENT:
2714 event_func = __bt_device_event_filter;
2715 path = BT_DEVICE_PATH;
2718 event_func = __bt_hid_event_filter;
2721 case BT_HEADSET_EVENT:
2722 event_func = __bt_headset_event_filter;
2723 path = BT_HEADSET_PATH;
2725 case BT_NETWORK_EVENT:
2726 event_func = __bt_network_event_filter;
2727 path = BT_NETWORK_PATH;
2729 case BT_AVRCP_EVENT:
2730 event_func = __bt_avrcp_event_filter;
2731 path = BT_AVRCP_PATH;
2733 case BT_AVRCP_CONTROL_EVENT:
2734 event_func = __bt_avrcp_control_event_filter;
2735 path = BT_AVRCP_CONTROL_PATH;
2737 case BT_OPP_CLIENT_EVENT:
2738 event_func = __bt_opp_client_event_filter;
2739 path = BT_OPP_CLIENT_PATH;
2741 case BT_OPP_SERVER_EVENT:
2742 event_func = __bt_opp_server_event_filter;
2743 path = BT_OPP_SERVER_PATH;
2745 case BT_PBAP_CLIENT_EVENT:
2746 event_func = __bt_pbap_client_event_filter;
2747 path = BT_PBAP_CLIENT_PATH;
2749 case BT_RFCOMM_CLIENT_EVENT:
2750 event_func = __bt_rfcomm_client_event_filter;
2751 path = BT_RFCOMM_CLIENT_PATH;
2753 case BT_RFCOMM_SERVER_EVENT:
2754 event_func = __bt_rfcomm_server_event_filter;
2755 path = BT_RFCOMM_SERVER_PATH;
2757 case BT_HF_AGENT_EVENT:
2758 BT_DBG("BT_HF_AGENT_EVENT\n");
2759 event_func = __bt_hf_agent_event_filter;
2760 path = BT_HF_AGENT_PATH;
2761 interface = BT_HF_SERVICE_INTERFACE;
2763 case BT_A2DP_SOURCE_EVENT:
2764 BT_DBG("BT_A2DP_SOURCE_EVENT");
2765 event_func = __bt_a2dp_source_event_filter;
2766 path = BT_A2DP_SOURCE_PATH;
2768 case BT_HID_DEVICE_EVENT:
2769 BT_DBG("BT_HID_DEVICE_EVENT");
2770 event_func = __bt_hid_device_event_filter;
2771 path = BT_HID_DEVICE_PATH;
2773 #ifdef GATT_NO_RELAY
2774 case BT_GATT_BLUEZ_EVENT:
2775 BT_DBG("BT_GATT_BLUEZ_EVENT");
2776 event_func = __bt_device_event_filter;
2777 interface = BT_GATT_CHARACTERISTIC_INTERFACE;
2782 BT_ERR("Unknown event");
2783 return BLUETOOTH_ERROR_INTERNAL;
2786 connection_type = _bt_gdbus_get_system_gconn();
2787 if (connection_type == NULL)
2788 return BLUETOOTH_ERROR_INTERNAL;
2790 cb_data = g_new0(bt_event_info_t, 1);
2792 cb_data->event_type = event_type;
2793 cb_data->cb = event_cb;
2794 cb_data->user_data = user_data;
2796 cb_data->id = g_dbus_connection_signal_subscribe(connection_type,
2797 NULL, interface, NULL, path, NULL, 0,
2798 event_func, cb_data, NULL);
2800 event_list = g_slist_append(event_list, cb_data);
2802 return BLUETOOTH_ERROR_NONE;
2805 int _bt_unregister_event(int event_type)
2807 GDBusConnection *connection_type;
2808 bt_event_info_t *cb_data;
2810 if (is_initialized == FALSE) {
2811 BT_ERR("Event is not registered");
2812 return BLUETOOTH_ERROR_NOT_INITIALIZED;
2815 if (__bt_event_is_registered(event_type) == FALSE) {
2816 BT_ERR("Not registered event");
2817 return BLUETOOTH_ERROR_INTERNAL;
2820 cb_data = _bt_event_get_cb_data(event_type);
2822 if (cb_data == NULL) {
2823 BT_ERR("No matched event data");
2824 return BLUETOOTH_ERROR_INTERNAL;
2827 connection_type = _bt_gdbus_get_system_gconn();
2829 event_list = g_slist_remove(event_list, (void *)cb_data);
2831 retv_if(connection_type == NULL, BLUETOOTH_ERROR_INTERNAL);
2833 g_dbus_connection_signal_unsubscribe(connection_type, cb_data->id);
2835 __bt_event_data_free((void *)cb_data);
2837 return BLUETOOTH_ERROR_NONE;
2840 static void __bt_name_owner_changed(GDBusConnection *connection,
2841 const gchar *sender_name,
2842 const gchar *object_path,
2843 const gchar *interface_name,
2844 const gchar *signal_name,
2845 GVariant *parameters,
2848 const char *name = NULL;
2849 const char *old_owner = NULL;
2850 const char *new_owner = NULL;
2851 bt_event_info_t *event_info;
2853 g_variant_get(parameters, "(&s&s&s)", &name, &old_owner, &new_owner);
2855 if (g_strcmp0(name, BT_DBUS_NAME) == 0 &&
2856 (new_owner != NULL && *new_owner == '\0')) {
2857 BT_DBG("bt-service is terminated");
2858 event_info = _bt_event_get_cb_data(BT_ADAPTER_EVENT);
2859 if (event_info == NULL)
2862 if (disable_timer_id > 0)
2863 g_source_remove(disable_timer_id);
2865 disable_timer_id = g_timeout_add(BT_RELIABLE_DISABLE_TIME,
2866 (GSourceFunc)__bt_reliable_disable_cb,
2871 void _bt_register_name_owner_changed(void)
2873 GDBusConnection *connection_type;
2875 connection_type = _bt_gdbus_get_system_gconn();
2876 if (connection_type == NULL) {
2877 BT_ERR("Unable to get the bus");
2880 owner_sig_id = g_dbus_connection_signal_subscribe(connection_type,
2881 NULL, DBUS_INTERFACE_DBUS,
2882 BT_NAME_OWNER_CHANGED, NULL, NULL, 0,
2883 __bt_name_owner_changed, NULL, NULL);
2886 void _bt_unregister_name_owner_changed(void)
2888 GDBusConnection *connection_type;
2890 connection_type = _bt_gdbus_get_system_gconn();
2891 if (connection_type != NULL && owner_sig_id != -1) {
2892 g_dbus_connection_signal_unsubscribe(connection_type,
2898 static void __bt_manager_event_filter(GDBusConnection *connection,
2899 const gchar *sender_name,
2900 const gchar *object_path,
2901 const gchar *interface_name,
2902 const gchar *signal_name,
2903 GVariant *parameters,
2907 GVariantIter *interface_iter = NULL;
2908 char *interface_str = NULL;
2909 bt_gatt_service_change_t change;
2910 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
2911 char secure_address[BT_ADDRESS_STRING_SIZE] = { 0 };
2912 bt_user_info_t *user_info = NULL;
2914 if (strcasecmp(signal_name, "GattServiceAdded") == 0) {
2915 g_variant_get(parameters, "(&s)", &path);
2917 _bt_convert_device_path_to_address(path, address);
2918 _bt_convert_addr_string_to_type(change.device_addr.addr, address);
2919 _bt_convert_addr_string_to_secure_string(secure_address, address);
2921 if (_bluetooth_gatt_check_service_change_watcher_address(&change.device_addr)
2923 BT_INFO("GATT Service [%s] added, but no watcher for %s",
2924 path, secure_address);
2927 BT_INFO("GATT Service [%s] added : %s",
2928 path, secure_address);
2930 change.svc_path = g_strdup(path);
2931 change.change_type = BLUETOOTH_GATT_SERVICE_CHANGE_TYPE_ADD;
2933 user_info = _bt_get_user_data(BT_COMMON);
2934 if (user_info != NULL) {
2935 _bt_common_event_cb(
2936 BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED,
2937 BLUETOOTH_ERROR_NONE, &change,
2938 user_info->cb, user_info->user_data);
2941 g_free(change.svc_path);
2942 } else if (strcasecmp(signal_name, "InterfacesRemoved") == 0) {
2943 g_variant_get(parameters, "(&oas)",
2944 &path, &interface_iter);
2947 BT_ERR("Invalid adapter path");
2951 _bt_convert_device_path_to_address(path, address);
2952 _bt_convert_addr_string_to_type(change.device_addr.addr, address);
2953 _bt_convert_addr_string_to_secure_string(secure_address, address);
2955 if (_bluetooth_gatt_check_service_change_watcher_address(&change.device_addr)
2957 BT_INFO("GATT Service [%s] removed, but no watcher for %s",
2958 path, secure_address);
2962 while (g_variant_iter_loop(interface_iter, "s", &interface_str)) {
2963 if (g_strcmp0(interface_str, GATT_SERV_INTERFACE) == 0) {
2964 change.svc_path = g_strdup(path);
2965 change.change_type = BLUETOOTH_GATT_SERVICE_CHANGE_TYPE_REMOVE;
2967 BT_INFO("GATT Service [%s] is removed : %s",
2968 path, secure_address);
2970 user_info = _bt_get_user_data(BT_COMMON);
2971 if (user_info != NULL) {
2972 _bt_common_event_cb(
2973 BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED,
2974 BLUETOOTH_ERROR_NONE, &change,
2975 user_info->cb, user_info->user_data);
2978 g_free(change.svc_path);
2982 g_variant_iter_free(interface_iter);
2986 int _bt_register_manager_subscribe_signal(gboolean subscribe)
2988 GDBusConnection *g_conn;
2989 static int service_added_id = -1;
2990 static int interface_removed_id = -1;
2992 g_conn = _bt_gdbus_get_system_gconn();
2994 return BLUETOOTH_ERROR_INTERNAL;
2996 if (subscribe == TRUE) {
2997 if (service_added_id == -1) {
2998 service_added_id = g_dbus_connection_signal_subscribe(g_conn,
2999 NULL, GATT_SERV_INTERFACE,
3000 "GattServiceAdded", NULL, NULL, 0,
3001 __bt_manager_event_filter,
3004 if (interface_removed_id == -1) {
3005 interface_removed_id = g_dbus_connection_signal_subscribe(g_conn,
3006 NULL, BT_MANAGER_INTERFACE,
3007 "InterfacesRemoved", NULL, NULL, 0,
3008 __bt_manager_event_filter,
3012 if (service_added_id != -1) {
3013 g_dbus_connection_signal_unsubscribe(g_conn,
3015 service_added_id = -1;
3017 if (interface_removed_id != -1) {
3018 g_dbus_connection_signal_unsubscribe(g_conn,
3019 interface_removed_id);
3020 interface_removed_id = -1;
3024 return BLUETOOTH_ERROR_NONE;