4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Hocheol Seo <hocheol.seo@samsung.com>
7 * Girishashok Joshi <girish.joshi@samsung.com>
8 * Chanyeol Park <chanyeol.park@samsung.com>
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
14 * http://www.apache.org/licenses/LICENSE-2.0
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
25 #include <dbus/dbus.h>
30 #include "bluetooth-api.h"
31 #include "bluetooth-audio-api.h"
32 #include "bt-internal-types.h"
33 #include "bluetooth-media-control.h"
35 #include "bt-common.h"
36 #include "bt-event-handler.h"
37 #include "bt-request-sender.h"
39 #define BT_RELIABLE_DISABLE_TIME 300 /* 300 ms */
49 static int obex_server_id;
50 static guint disable_timer_id;
51 static gboolean is_initialized;
52 static GSList *sending_list = NULL;
53 static GSList *server_list = NULL;
54 static GSList *event_list = NULL;
55 static int owner_sig_id = -1;
56 static gboolean is_adapter_enabled = TRUE;
58 void _bt_add_push_request_id(int request_id)
60 bt_sending_info_t *info;
62 info = g_new0(bt_sending_info_t, 1);
63 info->request_id = request_id;
65 sending_list = g_slist_append(sending_list, info);
68 static gboolean __bt_is_request_id_exist(int request_id)
71 bt_sending_info_t *info;
73 for (l = sending_list; l != NULL; l = g_slist_next(l)) {
78 if (info->request_id == request_id)
85 static void __bt_remove_push_request_id(int request_id)
88 bt_sending_info_t *info;
90 for (l = sending_list; l != NULL; l = g_slist_next(l)) {
95 BT_DBG("info->request_id = %d\n", info->request_id);
96 BT_DBG("request_id = %d\n", request_id);
97 if (info->request_id == request_id) {
98 sending_list = g_slist_remove(sending_list, (void *)info);
105 static void __bt_remove_all_push_request_id(void)
108 bt_sending_info_t *info;
110 for (l = sending_list; l != NULL; l = g_slist_next(l)) {
115 g_slist_free(sending_list);
119 static void __bt_remove_all_server(void)
122 bt_server_info_t *info;
124 for (l = server_list; l != NULL; l = g_slist_next(l)) {
129 g_slist_free(server_list);
133 static gboolean __bt_is_server_exist(int server_fd)
136 bt_server_info_t *info;
138 for (l = server_list; l != NULL; l = g_slist_next(l)) {
143 retv_if(info->server_fd == server_fd, TRUE);
149 static void __bt_get_uuid_info(bluetooth_device_info_t *dev_info,
156 ret_if(dev_info == NULL);
157 ret_if(uuids == NULL);
158 ret_if(uuid_count <= 0);
160 dev_info->service_index = uuid_count;
162 for (i = 0; i < uuid_count && uuids[i] != NULL; i++) {
163 g_strlcpy(dev_info->uuids[i], uuids[i], BLUETOOTH_UUID_STRING_MAX);
165 parts = g_strsplit(uuids[i], "-", -1);
167 if (parts == NULL || parts[0] == NULL) {
172 dev_info->service_list_array[i] = g_ascii_strtoull(parts[0], NULL, 16);
176 static int __bt_call_list_create(bt_hf_call_list_s **list)
178 bt_hf_call_list_s *handle;
181 BT_DBG("Already Initialized");
182 return BLUETOOTH_ERROR_NONE;
184 handle = g_malloc0(sizeof(bt_hf_call_list_s));
186 return BLUETOOTH_ERROR_NONE;
189 static int __bt_call_list_reset(bt_hf_call_list_s *list)
191 bt_hf_call_list_s *handle;
192 bt_hf_call_status_info_t *call_status;
195 BT_ERR("invalid parameter");
196 return BLUETOOTH_ERROR_INVALID_PARAM;
198 handle = (bt_hf_call_list_s *)list;
200 call_status = (bt_hf_call_status_info_t *)g_list_nth_data(handle->list, 0);
201 if (call_status == NULL)
203 handle->list = g_list_remove(handle->list, call_status);
204 g_free(call_status->number);
207 return BLUETOOTH_ERROR_NONE;
210 static int __bt_call_list_destroy(bt_hf_call_list_s *list)
213 bt_hf_call_list_s *handle;
216 BT_ERR("invalid parameter");
217 return BLUETOOTH_ERROR_INVALID_PARAM;
219 handle = (bt_hf_call_list_s *)list;
220 result = __bt_call_list_reset(list);
224 static int __bt_call_list_add(bt_hf_call_list_s *list, char * number,
225 int dir, int status, int mpart, int idx)
227 bt_hf_call_list_s *handle;
228 bt_hf_call_status_info_t *call_status;
231 BT_ERR("invalid parameter");
232 return BLUETOOTH_ERROR_INVALID_PARAM;
234 handle = (bt_hf_call_list_s *)list;
235 call_status = g_malloc0(sizeof(bt_hf_call_status_info_t));
236 /* Fix : NULL_RETURNS */
237 retv_if(call_status == NULL, BLUETOOTH_ERROR_MEMORY_ALLOCATION);
239 call_status->number = g_strdup(number);
240 call_status->direction= dir;
241 call_status->status = status;
242 call_status->mpart = mpart;
243 call_status->idx = idx;
244 handle->list = g_list_append(handle->list, (gpointer)call_status);
245 return BLUETOOTH_ERROR_NONE;
248 static bluetooth_device_info_t *__bt_get_device_info_in_message(GVariant *parameters, int *ret)
250 bluetooth_device_info_t *dev_info;
251 const char *address = NULL;
252 const char *name = NULL;
253 gchar **uuids = NULL;
254 unsigned int dev_class = 0;
256 gboolean paired = FALSE;
258 gboolean trust = FALSE;
260 int result = BLUETOOTH_ERROR_NONE;
261 GVariant *string_var;
263 int manufacturer_data_len = 0;
264 GVariant *manufacturer_var = NULL;
265 const char *manufacturer_data = NULL;
267 g_variant_get(parameters, "(isunsbub@asn@ay)", &result, &address,
268 &dev_class, &rssi, &name, &paired,
269 &connected, &trust, &string_var, &manufacturer_data_len, &manufacturer_var);
271 if (string_var == NULL) {
272 BT_ERR("invalid parameters in signal");
276 uuids = (gchar **)g_variant_get_strv(string_var, &uuid_count);
278 len = g_variant_get_size(manufacturer_var);
280 manufacturer_data = (char *)g_variant_get_data(manufacturer_var);
282 dev_info = g_malloc0(sizeof(bluetooth_device_info_t));
283 /* Fix : NULL_RETURNS */
284 if (dev_info == NULL) {
285 result = BLUETOOTH_ERROR_MEMORY_ALLOCATION;
289 dev_info->rssi = rssi;
290 dev_info->paired = paired;
291 dev_info->connected = connected;
292 dev_info->trust = trust;
294 g_strlcpy(dev_info->device_name.name, name,
295 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
297 _bt_divide_device_class(&dev_info->device_class, dev_class);
299 _bt_convert_addr_string_to_type(dev_info->device_address.addr,
303 __bt_get_uuid_info(dev_info, uuids, uuid_count);
305 if (manufacturer_data_len > BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX) {
306 BT_ERR("manufacturer_data_len is too long(len = %d)", manufacturer_data_len);
307 manufacturer_data_len = BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX;
309 dev_info->manufacturer_data.data_len = manufacturer_data_len;
310 if (manufacturer_data)
311 for (i = 0; i < manufacturer_data_len; i++)
312 dev_info->manufacturer_data.data[i] = manufacturer_data[i];
316 g_variant_unref(string_var);
317 g_variant_unref(manufacturer_var);
321 static bluetooth_le_device_info_t *__bt_get_le_device_info_in_message(GVariant *parameters, int *ret)
323 bluetooth_le_device_info_t *le_dev_info;
324 const char *address = NULL;
329 int adv_data_len = 0;
330 GVariant *adv_var = NULL;
331 const char *adv_data = NULL;
332 int scan_data_len = 0;
333 GVariant *scan_var = NULL;
334 const char *scan_data = NULL;
335 int result = BLUETOOTH_ERROR_NONE;
337 g_variant_get(parameters, "(i&snnn@ayn@ay)", &result, &address,
338 &addr_type, &rssi, &adv_data_len, &adv_var, &scan_data_len, &scan_var);
340 len = g_variant_get_size(adv_var);
342 adv_data = (char *)g_variant_get_data(adv_var);
344 len = g_variant_get_size(scan_var);
346 scan_data = (char *)g_variant_get_data(scan_var);
348 le_dev_info = g_malloc0(sizeof(bluetooth_le_device_info_t));
349 /* Fix : NULL_RETURNS */
350 if (le_dev_info == NULL) {
351 result = BLUETOOTH_ERROR_MEMORY_ALLOCATION;
354 _bt_convert_addr_string_to_type(le_dev_info->device_address.addr, address);
355 le_dev_info->addr_type = addr_type;
356 le_dev_info->rssi = rssi;
357 le_dev_info->adv_ind_data.data_len = adv_data_len;
359 for (i = 0; i < adv_data_len; i++)
361 le_dev_info->adv_ind_data.data.data[i] = adv_data[i];
363 le_dev_info->scan_resp_data.data_len = scan_data_len;
365 for (i = 0; i < scan_data_len; i++)
367 le_dev_info->scan_resp_data.data.data[i] = scan_data[i];
372 g_variant_unref(adv_var);
373 g_variant_unref(scan_var);
377 gboolean __bt_reliable_disable_cb(gpointer user_data)
380 bt_event_info_t *event_info = user_data;
382 _bt_set_le_scan_status(FALSE);
384 if (is_initialized != FALSE) {
385 if (is_adapter_enabled == TRUE) {
386 is_adapter_enabled = FALSE;
387 _bt_common_event_cb(BLUETOOTH_EVENT_DISABLED,
388 BLUETOOTH_ERROR_NONE, NULL,
389 event_info->cb, event_info->user_data);
390 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISABLED,
391 BLUETOOTH_ERROR_NONE, NULL,
392 event_info->cb, event_info->user_data);
396 obex_server_id = BT_NO_SERVER;
397 __bt_remove_all_server();
398 __bt_remove_all_push_request_id();
400 _bt_rfcomm_server_free_all();
406 void __bt_adapter_event_filter(GDBusConnection *connection,
407 const gchar *sender_name,
408 const gchar *object_path,
409 const gchar *interface_name,
410 const gchar *signal_name,
411 GVariant *parameters,
414 bt_event_info_t *event_info;
415 int result = BLUETOOTH_ERROR_NONE;
417 event_info = (bt_event_info_t *)user_data;
418 ret_if(event_info == NULL);
420 if (strcasecmp(object_path, BT_ADAPTER_PATH) != 0)
422 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
425 if (strcasecmp(signal_name, BT_ENABLED) == 0) {
426 BT_INFO("BT_ENABLED");
427 g_variant_get(parameters, "(i)", &result);
428 if (result == BLUETOOTH_ERROR_NONE) {
429 if (vconf_set_int(BT_OFF_DUE_TO_FLIGHT_MODE, 0) != 0)
430 BT_ERR("Set vconf failed");
432 if (vconf_set_int(BT_OFF_DUE_TO_POWER_SAVING_MODE, 0) != 0)
433 BT_ERR("Set vconf failed");
435 if (vconf_set_int(BT_OFF_DUE_TO_TIMEOUT, 0) != 0)
436 BT_ERR("Set vconf failed");
439 is_adapter_enabled = TRUE;
441 _bt_common_event_cb(BLUETOOTH_EVENT_ENABLED,
443 event_info->cb, event_info->user_data);
444 } else if (strcasecmp(signal_name, BT_DISABLED) == 0) {
445 BT_INFO("BT_DISABLED");
446 int flight_mode_value = 0;
447 int ps_mode_value = 0;
449 if (vconf_get_int(BT_OFF_DUE_TO_FLIGHT_MODE,
450 &flight_mode_value) != 0)
451 BT_ERR("Fail to get the flight_mode_deactivated value");
453 if (vconf_get_int(BT_OFF_DUE_TO_POWER_SAVING_MODE,
454 &ps_mode_value) != 0)
455 BT_ERR("Fail to get the ps_mode_deactivated value");
457 if (flight_mode_value == 1 || ps_mode_value > 0) {
458 BT_INFO("Flight mode deactivation");
459 if (disable_timer_id > 0)
460 g_source_remove(disable_timer_id);
462 disable_timer_id = g_timeout_add(BT_RELIABLE_DISABLE_TIME,
463 (GSourceFunc)__bt_reliable_disable_cb,
466 is_adapter_enabled = FALSE;
468 _bt_common_event_cb(BLUETOOTH_EVENT_DISABLED,
470 event_info->cb, event_info->user_data);
473 _bt_common_event_cb(BLUETOOTH_EVENT_DISABLED,
475 event_info->cb, event_info->user_data);
476 } else if (strcasecmp(signal_name, BT_DISCOVERABLE_MODE_CHANGED) == 0) {
479 g_variant_get(parameters, "(in)", &result, &mode);
480 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
482 event_info->cb, event_info->user_data);
483 } else if (strcasecmp(signal_name, BT_DISCOVERABLE_TIMEOUT_CHANGED) == 0) {
486 g_variant_get(parameters, "(in)", &result, &timeout);
487 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED,
489 event_info->cb, event_info->user_data);
490 } else if (strcasecmp(signal_name, BT_CONNECTABLE_CHANGED) == 0) {
491 gboolean connectable = FALSE;
493 g_variant_get(parameters, "(b)", &connectable);
494 BT_DBG("Connectable is changed : %d", connectable);
496 _bt_common_event_cb(BLUETOOTH_EVENT_CONNECTABLE_CHANGED,
497 result, &connectable,
498 event_info->cb, event_info->user_data);
499 } else if (strcasecmp(signal_name, BT_ADAPTER_NAME_CHANGED) == 0) {
500 char *adapter_name = NULL;
502 g_variant_get(parameters, "(i&s)", &result, &adapter_name);
503 _bt_common_event_cb(BLUETOOTH_EVENT_LOCAL_NAME_CHANGED,
504 result, adapter_name,
505 event_info->cb, event_info->user_data);
506 } else if (strcasecmp(signal_name, BT_DISCOVERY_STARTED) == 0) {
507 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERY_STARTED,
508 BLUETOOTH_ERROR_NONE, NULL,
509 event_info->cb, event_info->user_data);
510 } else if (strcasecmp(signal_name, BT_DISCOVERY_FINISHED) == 0) {
511 g_variant_get(parameters, "(i)", &result);
512 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERY_FINISHED,
514 event_info->cb, event_info->user_data);
515 } else if (strcasecmp(signal_name, BT_ADVERTISING_STARTED) == 0) {
518 g_variant_get(parameters, "(ii)", &result, &adv_handle);
519 _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_STARTED,
521 event_info->cb, event_info->user_data);
522 } else if (strcasecmp(signal_name, BT_ADVERTISING_STOPPED) == 0) {
525 g_variant_get(parameters, "(ii)", &result, &adv_handle);
526 _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_STOPPED,
528 event_info->cb, event_info->user_data);
529 } else if (strcasecmp(signal_name, BT_ADVERTISING_MANUFACTURER_DATA_CHANGED) == 0) {
530 GVariant *var = NULL;
534 g_variant_get(parameters, "(@ay)", &var);
535 len = g_variant_get_size(var);
536 data = (char *)g_variant_get_data(var);
538 _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_MANUFACTURER_DATA_CHANGED,
540 event_info->cb, event_info->user_data);
542 g_variant_unref(var);
543 } else if (strcasecmp(signal_name, BT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED) == 0) {
544 GVariant *var = NULL;
548 g_variant_get(parameters, "(@ay)", &var);
549 len = g_variant_get_size(var);
550 data = (char *)g_variant_get_data(var);
552 _bt_common_event_cb(BLUETOOTH_EVENT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED,
554 event_info->cb, event_info->user_data);
556 g_variant_unref(var);
557 } else if (strcasecmp(signal_name, BT_MANUFACTURER_DATA_CHANGED) == 0) {
558 GVariant *var = NULL;
562 g_variant_get(parameters, "(@ay)", &var);
563 len = g_variant_get_size(var);
564 data = (char *)g_variant_get_data(var);
566 _bt_common_event_cb(BLUETOOTH_EVENT_MANUFACTURER_DATA_CHANGED,
568 event_info->cb, event_info->user_data);
570 g_variant_unref(var);
571 } else if (strcasecmp(signal_name, BT_DEVICE_FOUND) == 0) {
573 bluetooth_device_info_t *device_info;
575 device_info = __bt_get_device_info_in_message(parameters,
577 ret_if(device_info == NULL);
579 if (strlen(device_info->device_name.name) > 0)
580 event = BLUETOOTH_EVENT_REMOTE_DEVICE_NAME_UPDATED;
582 event = BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND;
584 _bt_common_event_cb(event,
586 event_info->cb, event_info->user_data);
589 } else if (strcasecmp(signal_name, BT_BOND_CREATED) == 0) {
590 bluetooth_device_info_t *device_info;
592 device_info = __bt_get_device_info_in_message(parameters,
594 ret_if(device_info == NULL);
596 _bt_common_event_cb(BLUETOOTH_EVENT_BONDING_FINISHED,
598 event_info->cb, event_info->user_data);
601 } else if (strcasecmp(signal_name, BT_BOND_DESTROYED) == 0) {
602 const char *address = NULL;
603 bluetooth_device_address_t dev_address = { {0} };
605 g_variant_get(parameters, "(i&s)", &result, &address);
607 _bt_convert_addr_string_to_type(dev_address.addr,
610 _bt_common_event_cb(BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED,
611 result, &dev_address,
612 event_info->cb, event_info->user_data);
613 } else if (strcasecmp(signal_name, BT_SERVICE_SEARCHED) == 0) {
614 bluetooth_device_info_t *device_info;
615 bt_sdp_info_t sdp_info;
617 device_info = __bt_get_device_info_in_message(parameters,
619 ret_if(device_info == NULL);
621 memset(&sdp_info, 0x00, sizeof(bt_sdp_info_t));
623 sdp_info.service_index = device_info->service_index;
625 memcpy(&sdp_info.device_addr,
626 &device_info->device_address,
627 BLUETOOTH_ADDRESS_LENGTH);
629 memcpy(sdp_info.service_list_array,
630 device_info->service_list_array,
631 BLUETOOTH_MAX_SERVICES_FOR_DEVICE);
633 memcpy(sdp_info.uuids,
635 BLUETOOTH_MAX_SERVICES_FOR_DEVICE * BLUETOOTH_UUID_STRING_MAX);
637 _bt_common_event_cb(BLUETOOTH_EVENT_SERVICE_SEARCHED,
639 event_info->cb, event_info->user_data);
642 } else if (strcasecmp(signal_name, BT_IPSP_INITIALIZED) == 0) {
643 gboolean ipsp_intialized = FALSE;
644 g_variant_get(parameters, "(b)", &ipsp_intialized);
646 BT_DBG("IPSP init state changed to : %d", ipsp_intialized);
648 _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_INIT_STATE_CHANGED,
649 BLUETOOTH_ERROR_NONE, &ipsp_intialized,
650 event_info->cb, event_info->user_data);
651 } else if (strcasecmp(signal_name, BT_KBD_PASSKEY_DISPLAY_REQ_RECEIVED) == 0) {
652 const char *address = NULL;
653 const char *name = NULL;
654 const char *str_passkey = NULL;
656 bluetooth_authentication_request_info_t auth_info;
657 memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
659 g_variant_get(parameters, "(i&s&s&s)", &result, &address, &name, &str_passkey);
661 g_strlcpy(auth_info.device_name.name, name,
662 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
663 _bt_convert_addr_string_to_type(auth_info.device_address.addr,
665 g_strlcpy(auth_info.str_passkey, str_passkey, strlen(str_passkey)+1);
667 _bt_common_event_cb(BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY,
669 event_info->cb, event_info->user_data);
670 } else if (strcasecmp(signal_name, BT_PIN_REQ_RECEIVED) == 0) {
671 const char *address = NULL;
672 const char *name = NULL;
674 bluetooth_authentication_request_info_t auth_info;
675 memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
677 g_variant_get(parameters, "(i&s&s)", &result, &address, &name);
679 g_strlcpy(auth_info.device_name.name, name,
680 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
681 _bt_convert_addr_string_to_type(auth_info.device_address.addr,
684 _bt_common_event_cb(BLUETOOTH_EVENT_PIN_REQUEST,
686 event_info->cb, event_info->user_data);
687 } else if (strcasecmp(signal_name, BT_PASSKEY_REQ_RECEIVED) == 0) {
688 const char *address = NULL;
689 const char *name = NULL;
691 bluetooth_authentication_request_info_t auth_info;
692 memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
694 g_variant_get(parameters, "(i&s&s)", &result, &address, &name);
696 g_strlcpy(auth_info.device_name.name, name,
697 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
698 _bt_convert_addr_string_to_type(auth_info.device_address.addr,
701 _bt_common_event_cb(BLUETOOTH_EVENT_PASSKEY_REQUEST,
703 event_info->cb, event_info->user_data);
704 } else if (strcasecmp(signal_name, BT_PASSKEY_CFM_REQ_RECEIVED) == 0) {
705 const char *address = NULL;
706 const char *name = NULL;
707 const char *str_passkey = NULL;
709 bluetooth_authentication_request_info_t auth_info;
710 memset(&auth_info, 0x00, sizeof(bluetooth_authentication_request_info_t));
712 g_variant_get(parameters, "(i&s&s&s)", &result, &address, &name, &str_passkey);
714 g_strlcpy(auth_info.device_name.name, name,
715 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
716 _bt_convert_addr_string_to_type(auth_info.device_address.addr,
718 g_strlcpy(auth_info.str_passkey, str_passkey, strlen(str_passkey)+1);
720 _bt_common_event_cb(BLUETOOTH_EVENT_PASSKEY_CONFIRM_REQUEST,
722 event_info->cb, event_info->user_data);
726 void __bt_adapter_le_event_filter(GDBusConnection *connection,
727 const gchar *sender_name,
728 const gchar *object_path,
729 const gchar *interface_name,
730 const gchar *signal_name,
731 GVariant *parameters,
734 bt_event_info_t *event_info;
735 int result = BLUETOOTH_ERROR_NONE;
737 event_info = (bt_event_info_t *)user_data;
738 ret_if(event_info == NULL);
740 if (strcasecmp(object_path, BT_LE_ADAPTER_PATH) != 0)
742 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
745 if (strcasecmp(signal_name, BT_LE_ENABLED) == 0) {
746 BT_INFO("BT_LE_ENABLED");
747 g_variant_get(parameters, "(i)", &result);
748 _bt_common_event_cb(BLUETOOTH_EVENT_LE_ENABLED,
750 event_info->cb, event_info->user_data);
751 } else if (strcasecmp(signal_name, BT_LE_DISABLED) == 0) {
752 BT_INFO("BT_LE_DISABLED");
753 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISABLED,
755 event_info->cb, event_info->user_data);
756 } else if (strcasecmp(signal_name, BT_LE_DISCOVERY_STARTED) == 0) {
757 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISCOVERY_STARTED,
758 BLUETOOTH_ERROR_NONE, NULL,
759 event_info->cb, event_info->user_data);
760 } else if (strcasecmp(signal_name, BT_LE_DISCOVERY_FINISHED) == 0) {
761 g_variant_get(parameters, "(i)", &result);
762 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISCOVERY_FINISHED,
764 event_info->cb, event_info->user_data);
765 } else if (strcasecmp(signal_name, BT_LE_DEVICE_FOUND) == 0) {
766 bluetooth_le_device_info_t *le_device_info;
768 le_device_info = __bt_get_le_device_info_in_message(parameters,
770 ret_if(le_device_info == NULL);
772 _bt_common_event_cb(BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND,
773 result, le_device_info,
774 event_info->cb, event_info->user_data);
776 g_free(le_device_info);
780 void __bt_device_event_filter(GDBusConnection *connection,
781 const gchar *sender_name,
782 const gchar *object_path,
783 const gchar *interface_name,
784 const gchar *signal_name,
785 GVariant *parameters,
788 bt_event_info_t *event_info;
789 int result = BLUETOOTH_ERROR_NONE;
791 event_info = (bt_event_info_t *)user_data;
792 ret_if(event_info == NULL);
795 gboolean gatt_interface = FALSE;
797 if (strcasecmp(interface_name, BT_GATT_CHARACTERISTIC_INTERFACE) == 0)
798 gatt_interface = TRUE;
800 if (strcasecmp(object_path, BT_DEVICE_PATH) != 0 &&
801 gatt_interface == FALSE)
803 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0 &&
804 gatt_interface == FALSE)
807 if (strcasecmp(object_path, BT_DEVICE_PATH) != 0)
809 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
813 ret_if(signal_name == NULL);
815 if (strcasecmp(signal_name, BT_GATT_CONNECTED) == 0) {
816 const char *address = NULL;
817 bluetooth_device_address_t dev_address = { {0} };
818 BT_DBG("BT_GATT_CONNECTED");
819 g_variant_get(parameters, "(i&s)", &result, &address);
821 _bt_convert_addr_string_to_type(dev_address.addr, address);
822 BT_DBG("Sending Event to Framework");
823 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_CONNECTED,
824 result, &dev_address,
825 event_info->cb, event_info->user_data);
826 } else if (strcasecmp(signal_name, BT_GATT_DISCONNECTED) == 0) {
827 const char *address = NULL;
828 bluetooth_device_address_t dev_address = { {0} };
829 BT_DBG("BT_GATT_DISCONNECTED");
830 g_variant_get(parameters, "(i&s)", &result, &address);
832 _bt_convert_addr_string_to_type(dev_address.addr, address);
833 BT_DBG("Sending Event to Framework");
834 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_DISCONNECTED,
835 result, &dev_address,
836 event_info->cb, event_info->user_data);
838 } else if (strcasecmp(signal_name, BT_GATT_BLUEZ_CHAR_VAL_CHANGED) == 0) {
840 } else if (strcasecmp(signal_name, BT_GATT_CHAR_VAL_CHANGED) == 0) {
842 const char *char_handle = NULL;
844 const char * value = NULL;
845 GVariant *char_value_var = NULL;
846 bt_gatt_char_value_t char_val = { 0, };
847 BT_DBG("BT_GATT_CHAR_VAL_CHANGED");
849 g_variant_get(parameters, "(i&s@ay)", &result, &char_handle, &char_value_var);
851 len = g_variant_get_size(char_value_var);
853 value = (char *)g_variant_get_data(char_value_var);
855 char_val.char_handle = g_strdup(char_handle);
856 char_val.val_len = len;
857 /* Fix : FORWARD_NULL : g_variant_get_data can return NULL */
858 if (char_val.val_len > 0 && value != NULL) {
859 char_val.char_value = (unsigned char*) g_malloc0(char_val.val_len);
860 /* Fix : NULL_RETURNS */
861 if (char_val.char_value == NULL) {
862 BT_ERR("BLUETOOTH_ERROR_OUT_OF_MEMORY");
863 g_free(char_val.char_handle);
865 g_variant_unref(char_value_var);
868 memcpy(char_val.char_value, value, len);
869 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED,
871 event_info->cb, event_info->user_data);
872 g_free(char_val.char_value);
874 g_variant_unref(char_value_var);
876 g_free(char_val.char_handle);
877 } else if (strcasecmp(signal_name, BT_DEVICE_CONNECTED) == 0) {
878 const char *address = NULL;
879 unsigned char addr_type;
880 bt_connection_info_t conn_info;
881 bluetooth_device_address_t dev_address = { {0} };
882 BT_DBG("BT_DEVICE_CONNECTED");
883 g_variant_get(parameters, "(i&sy)", &result, &address, &addr_type);
885 _bt_convert_addr_string_to_type(dev_address.addr,
888 memset(&conn_info, 0x00, sizeof(bt_connection_info_t));
890 memcpy(conn_info.device_addr.addr,
892 BLUETOOTH_ADDRESS_LENGTH);
894 conn_info.addr_type = addr_type;
895 conn_info.disc_reason = 0;
896 BT_DBG("Sending Event to Framework");
897 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_CONNECTED,
899 event_info->cb, event_info->user_data);
901 } else if (strcasecmp(signal_name, BT_DEVICE_DISCONNECTED) == 0) {
902 const char *address = NULL;
903 unsigned char addr_type;
904 bt_connection_info_t conn_info;
905 bluetooth_device_address_t dev_address = { {0} };
906 BT_DBG("BT_DEVICE_DISCONNECTED");
907 g_variant_get(parameters, "(i&sy)", &result, &address, &addr_type);
909 _bt_convert_addr_string_to_type(dev_address.addr,
912 memset(&conn_info, 0x00, sizeof(bt_connection_info_t));
914 memcpy(conn_info.device_addr.addr,
916 BLUETOOTH_ADDRESS_LENGTH);
918 conn_info.addr_type = addr_type;
919 conn_info.disc_reason = result;
920 BT_DBG("Sending Event to Framework");
921 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_DISCONNECTED,
923 event_info->cb, event_info->user_data);
925 } else if (strcasecmp(signal_name, BT_RSSI_MONITORING_ENABLED) == 0) {
926 bt_rssi_enabled_t enabled = { 0, };
929 gboolean rssi_enabled = FALSE;
931 g_variant_get(parameters, "(isib)", &result, &address,
932 &link_type, &rssi_enabled);
934 BT_DBG("RSSI Enabled[Address:%s LinkType:%d RSSI_dbm:%d]",
935 address, link_type, rssi_enabled);
936 enabled.address = address;
937 enabled.link_type = link_type;
938 enabled.rssi_enabled = rssi_enabled;
940 _bt_common_event_cb(BLUETOOTH_EVENT_RSSI_ENABLED,
942 event_info->cb, event_info->user_data);
943 } else if (strcasecmp(signal_name, BT_RSSI_ALERT) == 0) {
948 bt_rssi_alert_t alert = { 0, };
950 g_variant_get(parameters, "(isiii)", &result, &address,
951 &link_type, &alert_type, &rssi_dbm);
953 alert.alert_type = alert_type;
954 alert.rssi_dbm = rssi_dbm;
955 alert.address = address;
956 alert.link_type = link_type;
957 BT_DBG("Address [%s] LinkType[%d] AlertType[%d] RSSI dBm[%d]",
958 address, link_type, alert_type, rssi_dbm);
959 _bt_common_event_cb(BLUETOOTH_EVENT_RSSI_ALERT,
961 event_info->cb, event_info->user_data);
962 } else if (strcasecmp(signal_name, BT_RAW_RSSI_EVENT) == 0) {
966 bt_raw_rssi_t raw_rssi = { 0, };
968 g_variant_get(parameters, "(isii)", &result,
969 &address, &link_type, &rssi_dbm);
971 BT_DBG("Address [%s] Link Type[%d] dBm[%d]",
972 address, link_type, rssi_dbm);
974 raw_rssi.rssi_dbm = rssi_dbm;
975 raw_rssi.address = address;
976 raw_rssi.link_type = link_type;
978 _bt_common_event_cb(BLUETOOTH_EVENT_RAW_RSSI,
980 event_info->cb, event_info->user_data);
981 } else if (strcasecmp(signal_name, BT_DEVICE_AUTHORIZED) == 0) {
982 const char *address = NULL;
983 bluetooth_device_address_t dev_address = { {0} };
985 g_variant_get(parameters, "(i&s)", &result, &address);
987 _bt_convert_addr_string_to_type(dev_address.addr,
990 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_AUTHORIZED,
991 result, &dev_address,
992 event_info->cb, event_info->user_data);
993 } else if (strcasecmp(signal_name, BT_DEVICE_UNAUTHORIZED) == 0) {
994 const char *address = NULL;
995 bluetooth_device_address_t dev_address = { {0} };
997 g_variant_get(parameters, "(i&s)", &result, &address);
999 _bt_convert_addr_string_to_type(dev_address.addr,
1002 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_UNAUTHORIZED,
1003 result, &dev_address,
1004 event_info->cb, event_info->user_data);
1005 } else if (strcasecmp(signal_name, BT_IPSP_CONNECTED) == 0) {
1006 const char *address = NULL;
1007 bluetooth_device_address_t dev_address = { {0} };
1009 BT_DBG("BT_IPSP_CONNECTED");
1010 g_variant_get(parameters, "(i&s)", &result, &address);
1012 _bt_convert_addr_string_to_type(dev_address.addr, address);
1014 _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_CONNECTED,
1015 result, &dev_address,
1016 event_info->cb, event_info->user_data);
1017 } else if (strcasecmp(signal_name, BT_IPSP_DISCONNECTED) == 0) {
1018 const char *address = NULL;
1019 bluetooth_device_address_t dev_address = { {0} };
1020 BT_DBG("BT_IPSP_DISCONNECTED");
1022 g_variant_get(parameters, "(i&s)", &result, &address);
1024 _bt_convert_addr_string_to_type(dev_address.addr, address);
1026 _bt_common_event_cb(BLUETOOTH_EVENT_IPSP_DISCONNECTED,
1027 result, &dev_address,
1028 event_info->cb, event_info->user_data);
1029 } else if (strcasecmp(signal_name, BT_LE_DATA_LENGTH_CHANGED) == 0) {
1030 const char *address = NULL;
1031 bluetooth_device_address_t dev_address = { {0} };
1036 bt_le_data_length_params_t params;
1038 BT_DBG("BT_LE_DATA_LENGTH_CHANGED");
1040 g_variant_get(parameters, "(i&sqqqq)", &result, &address,
1041 tx_octets, tx_time, rx_octets, rx_time);
1043 params.max_tx_octets = tx_octets;
1044 params.max_tx_time = tx_time;
1045 params.max_rx_octets = rx_octets;
1046 params.max_rx_time = rx_time;
1048 _bt_convert_addr_string_to_type(dev_address.addr, address);
1050 memcpy(¶ms.device_address,
1051 &dev_address, BLUETOOTH_ADDRESS_LENGTH);
1053 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DATA_LENGTH_CHANGED,
1054 result, ¶ms, event_info->cb, event_info->user_data);
1058 void __bt_hid_event_filter(GDBusConnection *connection,
1059 const gchar *sender_name,
1060 const gchar *object_path,
1061 const gchar *interface_name,
1062 const gchar *signal_name,
1063 GVariant *parameters,
1066 bt_event_info_t *event_info;
1067 int result = BLUETOOTH_ERROR_NONE;
1069 event_info = (bt_event_info_t *)user_data;
1070 ret_if(event_info == NULL);
1072 if (strcasecmp(object_path, BT_HID_PATH) != 0)
1074 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1077 ret_if(signal_name == NULL);
1079 if (strcasecmp(signal_name, BT_INPUT_CONNECTED) == 0) {
1080 const char *address = NULL;
1081 bluetooth_device_address_t dev_address = { {0} };
1083 g_variant_get(parameters, "(i&s)", &result, &address);
1085 _bt_convert_addr_string_to_type(dev_address.addr,
1088 _bt_input_event_cb(BLUETOOTH_HID_CONNECTED,
1089 result, &dev_address,
1090 event_info->cb, event_info->user_data);
1091 } else if (strcasecmp(signal_name, BT_INPUT_DISCONNECTED) == 0) {
1092 const char *address = NULL;
1093 bluetooth_device_address_t dev_address = { {0} };
1095 g_variant_get(parameters, "(i&s)", &result, &address);
1097 BT_DBG("address: %s", address);
1099 _bt_convert_addr_string_to_type(dev_address.addr,
1102 _bt_input_event_cb(BLUETOOTH_HID_DISCONNECTED,
1103 result, &dev_address,
1104 event_info->cb, event_info->user_data);
1108 void __bt_headset_event_filter(GDBusConnection *connection,
1109 const gchar *sender_name,
1110 const gchar *object_path,
1111 const gchar *interface_name,
1112 const gchar *signal_name,
1113 GVariant *parameters,
1116 bt_event_info_t *event_info;
1117 int result = BLUETOOTH_ERROR_NONE;
1118 event_info = (bt_event_info_t *)user_data;
1119 ret_if(event_info == NULL);
1121 if (strcasecmp(object_path, BT_HEADSET_PATH) != 0)
1123 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1126 ret_if(signal_name == NULL);
1128 if (strcasecmp(signal_name, BT_HEADSET_CONNECTED) == 0) {
1129 char *address = NULL;
1131 g_variant_get(parameters, "(i&s)", &result, &address);
1133 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_CONNECTED,
1135 event_info->cb, event_info->user_data);
1136 } else if (strcasecmp(signal_name, BT_HEADSET_DISCONNECTED) == 0) {
1137 char *address = NULL;
1139 g_variant_get(parameters, "(i&s)", &result, &address);
1141 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_DISCONNECTED,
1143 event_info->cb, event_info->user_data);
1144 } else if (strcasecmp(signal_name, BT_STEREO_HEADSET_CONNECTED) == 0) {
1145 char *address = NULL;
1147 g_variant_get(parameters, "(i&s)", &result, &address);
1149 _bt_headset_event_cb(BLUETOOTH_EVENT_AV_CONNECTED,
1151 event_info->cb, event_info->user_data);
1152 } else if (strcasecmp(signal_name, BT_STEREO_HEADSET_DISCONNECTED) == 0) {
1153 char *address = NULL;
1155 g_variant_get(parameters, "(i&s)", &result, &address);
1157 _bt_headset_event_cb(BLUETOOTH_EVENT_AV_DISCONNECTED,
1159 event_info->cb, event_info->user_data);
1160 } else if (strcasecmp(signal_name, BT_A2DP_SOURCE_CONNECTED) == 0) {
1161 char *address = NULL;
1163 g_variant_get(parameters, "(i&s)", &result, &address);
1164 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_CONNECTED,
1166 event_info->cb, event_info->user_data);
1167 } else if (strcasecmp(signal_name, BT_A2DP_SOURCE_DISCONNECTED) == 0) {
1168 char *address = NULL;
1170 g_variant_get(parameters, "(i&s)", &result, &address);
1172 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED,
1174 event_info->cb, event_info->user_data);
1175 } else if (strcasecmp(signal_name, BT_SPEAKER_GAIN) == 0) {
1178 char *address = NULL;
1180 g_variant_get(parameters, "(i&sq)", &result, &address,
1182 gain = (unsigned int)spkr_gain;
1184 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_SPEAKER_GAIN,
1186 event_info->cb, event_info->user_data);
1187 } else if (strcasecmp(signal_name, BT_MICROPHONE_GAIN) == 0) {
1190 char *address = NULL;
1192 g_variant_get(parameters, "(i&sq)", &result,
1193 &address, &mic_gain);
1194 gain = (unsigned int)mic_gain;
1196 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_MIC_GAIN,
1198 event_info->cb, event_info->user_data);
1202 void __bt_hid_device_event_filter(GDBusConnection *connection,
1203 const gchar *sender_name,
1204 const gchar *object_path,
1205 const gchar *interface_name,
1206 const gchar *signal_name,
1207 GVariant *parameters,
1210 bt_event_info_t *event_info;
1211 int result = BLUETOOTH_ERROR_NONE;
1213 event_info = (bt_event_info_t *)user_data;
1214 ret_if(event_info == NULL);
1216 if (strcasecmp(object_path, BT_HID_DEVICE_PATH) != 0)
1218 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1221 ret_if(signal_name == NULL);
1223 if (strcasecmp(signal_name, BT_HID_DEVICE_CONNECTED) == 0) {
1224 const char *address = NULL;
1225 bluetooth_device_address_t dev_address = { {0} };
1227 g_variant_get(parameters, "(i&s)", &result, &address);
1229 _bt_convert_addr_string_to_type(dev_address.addr,
1232 _bt_input_event_cb(BLUETOOTH_HID_DEVICE_CONNECTED,
1233 result, &dev_address,
1234 event_info->cb, event_info->user_data);
1235 } else if (strcasecmp(signal_name, BT_HID_DEVICE_DISCONNECTED) == 0) {
1236 const char *address = NULL;
1237 bluetooth_device_address_t dev_address = { {0} };
1239 g_variant_get(parameters, "(i&s)", &result, &address);
1241 BT_DBG("address: %s", address);
1243 _bt_convert_addr_string_to_type(dev_address.addr,
1246 _bt_input_event_cb(BLUETOOTH_HID_DEVICE_DISCONNECTED,
1247 result, &dev_address,
1248 event_info->cb, event_info->user_data);
1251 void __bt_a2dp_source_event_filter(GDBusConnection *connection,
1252 const gchar *sender_name,
1253 const gchar *object_path,
1254 const gchar *interface_name,
1255 const gchar *signal_name,
1256 GVariant *parameters,
1259 bt_event_info_t *event_info;
1260 int result = BLUETOOTH_ERROR_NONE;
1261 event_info = (bt_event_info_t *)user_data;
1262 ret_if(event_info == NULL);
1264 if (strcasecmp(object_path, BT_A2DP_SOURCE_PATH) != 0)
1266 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1269 ret_if(signal_name == NULL);
1271 if (strcasecmp(signal_name, BT_A2DP_SOURCE_CONNECTED) == 0) {
1272 char *address = NULL;
1274 g_variant_get(parameters, "(i&s)", &result, &address);
1275 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_CONNECTED,
1277 event_info->cb, event_info->user_data);
1278 } else if (strcasecmp(signal_name, BT_A2DP_SOURCE_DISCONNECTED) == 0) {
1279 char *address = NULL;
1281 g_variant_get(parameters, "(i&s)", &result, &address);
1283 _bt_a2dp_source_event_cb(BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED,
1285 event_info->cb, event_info->user_data);
1289 void __bt_network_event_filter(GDBusConnection *connection,
1290 const gchar *sender_name,
1291 const gchar *object_path,
1292 const gchar *interface_name,
1293 const gchar *signal_name,
1294 GVariant *parameters,
1297 bt_event_info_t *event_info;
1298 int result = BLUETOOTH_ERROR_NONE;
1299 event_info = (bt_event_info_t *)user_data;
1300 ret_if(event_info == NULL);
1302 if (strcasecmp(object_path, BT_NETWORK_PATH) != 0)
1304 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1307 ret_if(signal_name == NULL);
1309 if (strcasecmp(signal_name, BT_NETWORK_CONNECTED) == 0) {
1310 const char *address = NULL;
1311 bluetooth_device_address_t dev_address = { {0} };
1313 g_variant_get(parameters, "(i&s)", &result, &address);
1315 _bt_convert_addr_string_to_type(dev_address.addr,
1318 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_CONNECTED,
1319 result, &dev_address,
1320 event_info->cb, event_info->user_data);
1321 } else if (strcasecmp(signal_name, BT_NETWORK_DISCONNECTED) == 0) {
1322 const char *address = NULL;
1323 bluetooth_device_address_t dev_address = { {0} };
1325 g_variant_get(parameters, "(i&s)", &result, &address);
1327 _bt_convert_addr_string_to_type(dev_address.addr,
1330 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_DISCONNECTED,
1331 result, &dev_address,
1332 event_info->cb, event_info->user_data);
1333 } else if (strcasecmp(signal_name, BT_NETWORK_SERVER_CONNECTED) == 0) {
1334 const char *device = NULL;
1335 const char *address = NULL;
1336 bluetooth_network_device_info_t network_info;
1338 g_variant_get(parameters, "(i&s&s)", &result,
1341 memset(&network_info, 0x00, sizeof(bluetooth_network_device_info_t));
1343 _bt_convert_addr_string_to_type(network_info.device_address.addr,
1346 _bt_print_device_address_t(&network_info.device_address);
1347 g_strlcpy(network_info.interface_name, device,
1348 sizeof(network_info.interface_name));
1350 DBG_SECURE("Interface: %s", network_info.interface_name);
1352 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED,
1353 result, &network_info,
1354 event_info->cb, event_info->user_data);
1355 } else if (strcasecmp(signal_name, BT_NETWORK_SERVER_DISCONNECTED) == 0) {
1356 const char *device = NULL;
1357 const char *address = NULL;
1358 bluetooth_network_device_info_t network_info;
1360 g_variant_get(parameters, "(i&s&s)", &result, &device, &address);
1362 memset(&network_info, 0x00, sizeof(bluetooth_network_device_info_t));
1364 _bt_convert_addr_string_to_type(network_info.device_address.addr,
1367 _bt_print_device_address_t(&network_info.device_address);
1369 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED,
1370 result, &network_info,
1371 event_info->cb, event_info->user_data);
1375 void __bt_avrcp_event_filter(GDBusConnection *connection,
1376 const gchar *sender_name,
1377 const gchar *object_path,
1378 const gchar *interface_name,
1379 const gchar *signal_name,
1380 GVariant *parameters,
1383 bt_event_info_t *event_info;
1384 int result = BLUETOOTH_ERROR_NONE;
1385 event_info = (bt_event_info_t *)user_data;
1386 ret_if(event_info == NULL);
1388 if (strcasecmp(object_path, BT_AVRCP_PATH) != 0)
1390 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1393 ret_if(signal_name == NULL);
1395 if (strcasecmp(signal_name, BT_AVRCP_CONNECTED) == 0) {
1396 char *address = NULL;
1398 g_variant_get(parameters, "(i&s)", &result, &address);
1400 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONNECTED,
1402 event_info->cb, event_info->user_data);
1403 } else if (strcasecmp(signal_name, BT_AVRCP_DISCONNECTED) == 0) {
1404 char *address = NULL;
1406 g_variant_get(parameters, "(i&s)", &result, &address);
1408 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_DISCONNECTED,
1410 event_info->cb, event_info->user_data);
1411 } else if (strcasecmp(signal_name, BT_MEDIA_SHUFFLE_STATUS) == 0) {
1412 unsigned int status;
1414 g_variant_get(parameters, "(u)", &status);
1415 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_SHUFFLE_STATUS,
1417 event_info->cb, event_info->user_data);
1418 } else if (strcasecmp(signal_name, BT_MEDIA_EQUALIZER_STATUS) == 0) {
1419 unsigned int status;
1421 g_variant_get(parameters, "(u)", &status);
1422 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_EQUALIZER_STATUS,
1424 event_info->cb, event_info->user_data);
1425 } else if (strcasecmp(signal_name, BT_MEDIA_REPEAT_STATUS) == 0) {
1426 unsigned int status;
1428 g_variant_get(parameters, "(u)", &status);
1429 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_REPEAT_STATUS,
1431 event_info->cb, event_info->user_data);
1432 } else if (strcasecmp(signal_name, BT_MEDIA_SCAN_STATUS) == 0) {
1433 unsigned int status;
1435 g_variant_get(parameters, "(u)", &status);
1436 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_SCAN_STATUS,
1438 event_info->cb, event_info->user_data);
1442 void __bt_avrcp_control_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_CONTROL_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_CONTROL_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_CONTROL_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_CONTROL_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_CONTROL_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_CONTROL_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_CONTROL_SCAN_STATUS,
1505 event_info->cb, event_info->user_data);
1506 } else if (strcasecmp(signal_name, BT_MEDIA_PLAY_STATUS) == 0) {
1507 unsigned int status;
1509 g_variant_get(parameters, "(u)", &status);
1510 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_PLAY_STATUS_CHANGED,
1512 event_info->cb, event_info->user_data);
1513 } else if (strcasecmp(signal_name, BT_MEDIA_POSITION_STATUS) == 0) {
1514 unsigned int status;
1516 g_variant_get(parameters, "(u)", &status);
1517 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SONG_POSITION_STATUS,
1519 event_info->cb, event_info->user_data);
1520 } else if (strcasecmp(signal_name, BT_MEDIA_TRACK_CHANGE) == 0) {
1521 media_metadata_attributes_t metadata;
1526 unsigned int total_tracks;
1527 unsigned int number;
1528 unsigned int duration;
1530 g_variant_get(parameters, "(&s&s&s&suuu)", &title,
1531 &artist, &album, &genre,
1532 &total_tracks, &number,
1534 memset(&metadata, 0x00, sizeof(media_metadata_attributes_t));
1536 metadata.title = title;
1537 metadata.artist = artist;
1538 metadata.album = album;
1539 metadata.genre = genre;
1540 metadata.total_tracks = total_tracks;
1541 metadata.number = number;
1542 metadata.duration = (int64_t)duration;
1544 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_TRACK_CHANGED,
1546 event_info->cb, event_info->user_data);
1550 void __bt_opp_client_event_filter(GDBusConnection *connection,
1551 const gchar *sender_name,
1552 const gchar *object_path,
1553 const gchar *interface_name,
1554 const gchar *signal_name,
1555 GVariant *parameters,
1558 bt_event_info_t *event_info;
1559 int result = BLUETOOTH_ERROR_NONE;
1560 event_info = (bt_event_info_t *)user_data;
1561 ret_if(event_info == NULL);
1563 if (strcasecmp(object_path, BT_OPP_CLIENT_PATH) != 0)
1565 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1568 ret_if(signal_name == NULL);
1570 if (strcasecmp(signal_name, BT_OPP_CONNECTED) == 0) {
1571 const char *address = NULL;
1573 bluetooth_device_address_t dev_address = { {0} };
1575 g_variant_get(parameters, "(i&si)", &result,
1576 &address, &request_id);
1578 if (__bt_is_request_id_exist(request_id) == FALSE) {
1579 BT_ERR("Different request id!");
1583 _bt_convert_addr_string_to_type(dev_address.addr,
1586 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_CONNECTED,
1587 result, &dev_address,
1588 event_info->cb, event_info->user_data);
1590 if (result != BLUETOOTH_ERROR_NONE) {
1591 __bt_remove_push_request_id(request_id);
1593 } else if (strcasecmp(signal_name, BT_OPP_DISCONNECTED) == 0) {
1594 const char *address = NULL;
1596 bluetooth_device_address_t dev_address = { {0} };
1598 g_variant_get(parameters, "(i&si)", &result, &address,
1601 if (__bt_is_request_id_exist(request_id) == FALSE) {
1602 BT_ERR("Different request id!");
1606 _bt_convert_addr_string_to_type(dev_address.addr,
1609 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_DISCONNECTED,
1610 result, &dev_address,
1611 event_info->cb, event_info->user_data);
1613 __bt_remove_push_request_id(request_id);
1614 } else if (strcasecmp(signal_name, BT_TRANSFER_STARTED) == 0) {
1615 const char *file_name = NULL;
1618 bt_opc_transfer_info_t transfer_info;
1620 g_variant_get(parameters, "(i&sti)", &result, &file_name,
1621 &size, &request_id);
1623 if (__bt_is_request_id_exist(request_id) == FALSE) {
1624 BT_ERR("Different request id!");
1628 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1630 transfer_info.filename = g_strdup(file_name);
1631 transfer_info.size = size;
1633 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_STARTED,
1634 result, &transfer_info,
1635 event_info->cb, event_info->user_data);
1637 g_free(transfer_info.filename);
1638 } else if (strcasecmp(signal_name, BT_TRANSFER_PROGRESS) == 0) {
1639 const char *file_name = NULL;
1643 bt_opc_transfer_info_t transfer_info;
1645 g_variant_get(parameters, "(i&stii)", &result,
1646 &file_name, &size, &progress, &request_id);
1648 if (__bt_is_request_id_exist(request_id) == FALSE) {
1649 BT_ERR("Different request id!");
1653 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1655 transfer_info.filename = g_strdup(file_name);
1656 transfer_info.size = size;
1657 transfer_info.percentage = progress;
1659 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS,
1660 result, &transfer_info,
1661 event_info->cb, event_info->user_data);
1663 g_free(transfer_info.filename);
1664 } else if (strcasecmp(signal_name, BT_TRANSFER_COMPLETED) == 0) {
1665 const char *file_name = NULL;
1668 bt_opc_transfer_info_t transfer_info;
1670 g_variant_get(parameters, "(i&sti)", &result,
1671 &file_name, &size, &request_id);
1673 if (__bt_is_request_id_exist(request_id) == FALSE) {
1674 BT_ERR("Different request id!");
1678 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1680 transfer_info.filename = g_strdup(file_name);
1681 transfer_info.size = size;
1683 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE,
1684 result, &transfer_info,
1685 event_info->cb, event_info->user_data);
1687 g_free(transfer_info.filename);
1691 void __bt_opp_server_event_filter(GDBusConnection *connection,
1692 const gchar *sender_name,
1693 const gchar *object_path,
1694 const gchar *interface_name,
1695 const gchar *signal_name,
1696 GVariant *parameters,
1699 bt_event_info_t *event_info;
1700 int result = BLUETOOTH_ERROR_NONE;
1701 event_info = (bt_event_info_t *)user_data;
1702 ret_if(event_info == NULL);
1704 if (strcasecmp(object_path, BT_OPP_SERVER_PATH) != 0)
1706 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1709 ret_if(signal_name == NULL);
1711 if (strcasecmp(signal_name, BT_TRANSFER_AUTHORIZED) == 0) {
1712 /* Native only event */
1713 const char *file_name = NULL;
1715 bt_obex_server_authorize_into_t auth_info;
1717 g_variant_get(parameters, "(i&st)", &result, &file_name, &size);
1719 /* OSP server: Don't get this event */
1720 ret_if(obex_server_id == BT_CUSTOM_SERVER);
1722 memset(&auth_info, 0x00, sizeof(bt_obex_server_authorize_into_t));
1724 auth_info.filename = g_strdup(file_name);
1725 auth_info.length = size;
1727 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE,
1729 event_info->cb, event_info->user_data);
1731 g_free(auth_info.filename);
1732 } else if (strcasecmp(signal_name, BT_CONNECTION_AUTHORIZED) == 0) {
1733 /* OSP only event */
1734 const char *address = NULL;
1735 const char *name = NULL;
1736 bluetooth_device_address_t dev_address = { {0} };
1738 g_variant_get(parameters, "(i&s&s)", &result, &address, &name);
1740 /* Native server: Don't get this event */
1741 ret_if(obex_server_id == BT_NATIVE_SERVER);
1743 _bt_convert_addr_string_to_type(dev_address.addr,
1746 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE,
1747 result, &dev_address,
1748 event_info->cb, event_info->user_data);
1749 } else if (strcasecmp(signal_name, BT_TRANSFER_CONNECTED) == 0) {
1751 g_variant_get(parameters, "(i)", &result);
1753 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_CONNECTED,
1754 result, NULL, event_info->cb,
1755 event_info->user_data);
1756 } else if (strcasecmp(signal_name, BT_TRANSFER_DISCONNECTED) == 0) {
1758 g_variant_get(parameters, "(i)", &result);
1760 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED,
1761 result, NULL, event_info->cb,
1762 event_info->user_data);
1763 } else if (strcasecmp(signal_name, BT_TRANSFER_STARTED) == 0) {
1764 const char *file_name = NULL;
1765 const char *type = NULL;
1766 int transfer_id = 0;
1767 int server_type = 0; /* bt_server_type_t */
1769 bt_obex_server_transfer_info_t transfer_info;
1771 g_variant_get(parameters, "(i&s&stii)", &result, &file_name,
1772 &type, &size, &transfer_id, &server_type);
1774 /* Other server's event */
1775 ret_if(obex_server_id != server_type &&
1776 server_type != BT_FTP_SERVER);
1778 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
1780 transfer_info.filename = g_strdup(file_name);
1781 transfer_info.type = g_strdup(type);
1782 transfer_info.file_size = size;
1783 transfer_info.transfer_id = transfer_id;
1784 transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
1785 FTP_SERVER : OPP_SERVER;
1787 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED,
1788 result, &transfer_info,
1789 event_info->cb, event_info->user_data);
1791 g_free(transfer_info.filename);
1792 g_free(transfer_info.type);
1793 } else if (strcasecmp(signal_name, BT_TRANSFER_PROGRESS) == 0) {
1794 const char *file_name = NULL;
1795 const char *type = NULL;
1796 int transfer_id = 0;
1798 int server_type = 0; /* bt_server_type_t */
1800 bt_obex_server_transfer_info_t transfer_info;
1802 g_variant_get(parameters, "(i&s&stiii)", &result, &file_name,
1803 &type, &size, &transfer_id,
1804 &progress, &server_type);
1806 /* Other server's event */
1807 ret_if(obex_server_id != server_type &&
1808 server_type != BT_FTP_SERVER);
1810 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
1812 transfer_info.filename = g_strdup(file_name);
1813 transfer_info.type = g_strdup(type);
1814 transfer_info.file_size = size;
1815 transfer_info.transfer_id = transfer_id;
1816 transfer_info.percentage = progress;
1817 transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
1818 FTP_SERVER : OPP_SERVER;
1820 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS,
1821 result, &transfer_info,
1822 event_info->cb, event_info->user_data);
1824 g_free(transfer_info.filename);
1825 g_free(transfer_info.type);
1826 } else if (strcasecmp(signal_name, BT_TRANSFER_COMPLETED) == 0) {
1827 const char *file_name = NULL;
1828 const char *device_name = NULL;
1829 const char *type = NULL;
1830 const char *file_path;
1831 int transfer_id = 0;
1832 int server_type = 0; /* bt_server_type_t */
1834 bt_obex_server_transfer_info_t transfer_info;
1836 g_variant_get(parameters, "(i&s&s&s&stii)", &result, &file_name,
1837 &type, &device_name, &file_path, &size,
1838 &transfer_id, &server_type);
1840 /* Other server's event */
1841 ret_if(obex_server_id != server_type &&
1842 server_type != BT_FTP_SERVER);
1844 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
1846 transfer_info.filename = g_strdup(file_name);
1847 transfer_info.type = g_strdup(type);
1848 transfer_info.device_name = g_strdup(device_name);
1849 transfer_info.file_path = g_strdup(file_path);
1850 transfer_info.file_size = size;
1851 transfer_info.transfer_id = transfer_id;
1852 transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
1853 FTP_SERVER : OPP_SERVER;
1855 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_COMPLETED,
1856 result, &transfer_info,
1857 event_info->cb, event_info->user_data);
1859 g_free(transfer_info.filename);
1860 g_free(transfer_info.type);
1861 g_free(transfer_info.device_name);
1862 g_free(transfer_info.file_path);
1866 void __bt_pbap_client_event_filter(GDBusConnection *connection,
1867 const gchar *sender_name,
1868 const gchar *object_path,
1869 const gchar *interface_name,
1870 const gchar *signal_name,
1871 GVariant *parameters,
1874 bt_event_info_t *event_info;
1875 int result = BLUETOOTH_ERROR_NONE;
1876 event_info = (bt_event_info_t *)user_data;
1877 ret_if(event_info == NULL);
1879 if (strcasecmp(object_path, BT_PBAP_CLIENT_PATH) != 0)
1881 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1884 ret_if(signal_name == NULL);
1885 BT_DBG("Type: %s", g_variant_get_type_string(parameters));
1886 if (strcasecmp(signal_name, BT_PBAP_CONNECTED) == 0) {
1887 bt_pbap_connected_t connected = { { { 0 }, }, };
1888 char *address = NULL;
1890 g_variant_get(parameters, "(is)", &result, &address);
1891 BT_DBG("address: %s", address);
1893 _bt_convert_addr_string_to_type(connected.btaddr.addr,
1896 connected.connected = 1;
1898 connected.connected = 0;
1900 _bt_common_event_cb(BLUETOOTH_PBAP_CONNECTED,
1902 event_info->cb, event_info->user_data);
1903 } else if (strcasecmp(signal_name, BT_PBAP_DISCONNECTED) == 0) {
1904 bt_pbap_connected_t disconnected = { { { 0 }, }, };
1905 char *address = NULL;
1907 g_variant_get(parameters, "(is)", &result, &address);
1908 BT_DBG("address: %s", address);
1910 _bt_convert_addr_string_to_type(disconnected.btaddr.addr,
1912 disconnected.connected = 0;
1914 _bt_common_event_cb(BLUETOOTH_PBAP_CONNECTED,
1915 result, &disconnected,
1916 event_info->cb, event_info->user_data);
1917 } else if (strcasecmp(signal_name, BT_PBAP_PHONEBOOK_SIZE) == 0) {
1918 bt_pbap_phonebook_size_t pb_size = { { { 0 }, }, };
1919 char *address = NULL;
1922 g_variant_get(parameters, "(isi)", &result, &address, &size);
1924 BT_DBG("address: %s", address);
1925 BT_DBG("size: %d", size);
1927 _bt_convert_addr_string_to_type(pb_size.btaddr.addr,
1929 pb_size.size = size;
1931 _bt_common_event_cb(BLUETOOTH_PBAP_PHONEBOOK_SIZE,
1933 event_info->cb, event_info->user_data);
1934 } else if (strcasecmp(signal_name, BT_PBAP_PHONEBOOK_PULL) == 0) {
1935 bt_pbap_phonebook_pull_t pb_pull = { { { 0 } }, };
1936 char *address = NULL;
1937 char *vcf_file = NULL;
1940 g_variant_get(parameters, "(issi)", &result, &address, &vcf_file, &success);
1942 BT_DBG("address: %s", address);
1943 BT_DBG("vcf_file: %s", vcf_file);
1944 BT_DBG("success: %d", success);
1946 _bt_convert_addr_string_to_type(pb_pull.btaddr.addr,
1948 pb_pull.vcf_file = vcf_file;
1949 pb_pull.success = success;
1950 _bt_common_event_cb(BLUETOOTH_PBAP_PHONEBOOK_PULL,
1952 event_info->cb, event_info->user_data);
1953 } else if (strcasecmp(signal_name, BT_PBAP_VCARD_LIST) == 0) {
1954 bt_pbap_vcard_list_t vc_list = { { { 0 } }, };
1955 char *address = NULL;
1956 unsigned int count = 0;
1957 gchar **list = NULL;
1958 GVariant *string_var;
1962 g_variant_get(parameters, "(isv)", &result, &address, &string_var);
1964 list = (gchar **)g_variant_get_strv(string_var, &count);
1967 BT_DBG("address: %s", address);
1968 BT_DBG("result: %d", result);
1969 BT_DBG("count: %d", count);
1970 for(i = 0; i < count; i++)
1971 BT_DBG("%s", list[i]);
1972 BT_DBG("success: %d", success);
1974 _bt_convert_addr_string_to_type(vc_list.btaddr.addr,
1976 vc_list.vcards = list;
1977 vc_list.length = count;
1978 vc_list.success = success;
1979 _bt_common_event_cb(BLUETOOTH_PBAP_VCARD_LIST,
1981 event_info->cb, event_info->user_data);
1983 g_variant_unref(string_var);
1985 } else if (strcasecmp(signal_name, BT_PBAP_VCARD_PULL) == 0) {
1986 bt_pbap_vcard_pull_t vc_pull = { { { 0 } }, };
1987 char *address = NULL;
1988 char *vcf_file = NULL;
1991 g_variant_get(parameters, "(issi)", &result, &address, &vcf_file, &success);
1993 BT_DBG("address: %s", address);
1994 BT_DBG("vcf_file: %s", vcf_file);
1995 BT_DBG("success: %d", success);
1997 _bt_convert_addr_string_to_type(vc_pull.btaddr.addr,
1999 vc_pull.vcf_file = vcf_file;
2000 vc_pull.success = success;
2001 _bt_common_event_cb(BLUETOOTH_PBAP_VCARD_PULL,
2003 event_info->cb, event_info->user_data);
2004 } else if (strcasecmp(signal_name, BT_PBAP_SEARCH_PHONEBOOK) == 0) {
2005 bt_pbap_phonebook_search_list_t vc_list = { { { 0 } }, };
2006 char *address = NULL;
2007 unsigned int count = 0;
2008 gchar **list = NULL;
2009 GVariant *string_var;
2013 g_variant_get(parameters, "(is@as)", &result, &address, &string_var);
2015 list = (gchar **)g_variant_get_strv(string_var, &count);
2017 BT_DBG("address: %s", address);
2018 for(i = 0; i < count; i++)
2019 BT_DBG("%s", list[i]);
2020 BT_DBG("success: %d", success);
2022 _bt_convert_addr_string_to_type(vc_list.btaddr.addr,
2024 vc_list.vcards = list;
2025 vc_list.length = count;
2026 vc_list.success = success;
2027 _bt_common_event_cb(BLUETOOTH_PBAP_PHONEBOOK_SEARCH,
2029 event_info->cb, event_info->user_data);
2031 g_variant_unref(string_var);
2036 void __bt_rfcomm_client_event_filter(GDBusConnection *connection,
2037 const gchar *sender_name,
2038 const gchar *object_path,
2039 const gchar *interface_name,
2040 const gchar *signal_name,
2041 GVariant *parameters,
2044 bt_event_info_t *event_info;
2045 int result = BLUETOOTH_ERROR_NONE;
2046 event_info = (bt_event_info_t *)user_data;
2047 ret_if(event_info == NULL);
2049 if (strcasecmp(object_path, BT_RFCOMM_CLIENT_PATH) != 0)
2051 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
2054 ret_if(signal_name == NULL);
2056 if (strcasecmp(signal_name, BT_RFCOMM_CONNECTED) == 0) {
2057 const char *address = NULL;
2058 const char *uuid = NULL;
2060 bluetooth_rfcomm_connection_t conn_info;
2062 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2065 memset(&conn_info, 0x00, sizeof(bluetooth_rfcomm_connection_t));
2066 conn_info.device_role = RFCOMM_ROLE_CLIENT;
2067 g_strlcpy(conn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2068 conn_info.socket_fd = socket_fd;
2069 _bt_convert_addr_string_to_type(conn_info.device_addr.addr,
2072 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_CONNECTED,
2074 event_info->cb, event_info->user_data);
2075 } else if (strcasecmp(signal_name, BT_RFCOMM_DISCONNECTED) == 0) {
2076 const char *address = NULL;
2077 const char *uuid = NULL;
2079 bluetooth_rfcomm_disconnection_t disconn_info;
2081 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2084 memset(&disconn_info, 0x00, sizeof(bluetooth_rfcomm_disconnection_t));
2085 disconn_info.device_role = RFCOMM_ROLE_CLIENT;
2086 g_strlcpy(disconn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2087 disconn_info.socket_fd = socket_fd;
2088 _bt_convert_addr_string_to_type(disconn_info.device_addr.addr,
2091 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DISCONNECTED,
2092 result, &disconn_info,
2093 event_info->cb, event_info->user_data);
2094 } else if (strcasecmp(signal_name, BT_RFCOMM_DATA_RECEIVED) == 0) {
2098 bluetooth_rfcomm_received_data_t data_r;
2101 g_variant_get(parameters, "(in@ay)", &result, &socket_fd,
2104 buffer_len = g_variant_get_size( byte_var);
2105 buffer = (char *) g_variant_get_data(byte_var);
2107 data_r.socket_fd = socket_fd;
2108 data_r.buffer_size = buffer_len;
2109 data_r.buffer = buffer;
2111 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED,
2113 event_info->cb, event_info->user_data);
2114 g_variant_unref(byte_var);
2118 void __bt_rfcomm_server_event_filter(GDBusConnection *connection,
2119 const gchar *sender_name,
2120 const gchar *object_path,
2121 const gchar *interface_name,
2122 const gchar *signal_name,
2123 GVariant *parameters,
2126 bt_event_info_t *event_info;
2127 int result = BLUETOOTH_ERROR_NONE;
2128 event_info = (bt_event_info_t *)user_data;
2129 ret_if(event_info == NULL);
2131 if (strcasecmp(object_path, BT_RFCOMM_SERVER_PATH) != 0)
2133 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
2136 ret_if(signal_name == NULL);
2138 if (strcasecmp(signal_name, BT_RFCOMM_CONNECTED) == 0) {
2139 const char *address = NULL;
2140 const char *uuid = NULL;
2142 bluetooth_rfcomm_connection_t conn_info;
2144 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2147 memset(&conn_info, 0x00, sizeof(bluetooth_rfcomm_connection_t));
2148 conn_info.device_role = RFCOMM_ROLE_SERVER;
2149 g_strlcpy(conn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2150 conn_info.socket_fd = socket_fd;
2151 _bt_convert_addr_string_to_type(conn_info.device_addr.addr,
2154 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_CONNECTED,
2156 event_info->cb, event_info->user_data);
2157 } else if (strcasecmp(signal_name, BT_RFCOMM_DISCONNECTED) == 0) {
2158 const char *address = NULL;
2159 const char *uuid = NULL;
2161 bluetooth_rfcomm_disconnection_t disconn_info;
2163 g_variant_get(parameters, "(i&s&sn)", &result, &address,
2166 memset(&disconn_info, 0x00, sizeof(bluetooth_rfcomm_disconnection_t));
2167 disconn_info.device_role = RFCOMM_ROLE_SERVER;
2168 g_strlcpy(disconn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
2169 disconn_info.socket_fd = socket_fd;
2170 _bt_convert_addr_string_to_type(disconn_info.device_addr.addr,
2173 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DISCONNECTED,
2174 result, &disconn_info,
2175 event_info->cb, event_info->user_data);
2176 } else if (strcasecmp(signal_name, BT_CONNECTION_AUTHORIZED) == 0) {
2177 /* OSP only event */
2178 bluetooth_rfcomm_connection_request_t req_ind;
2179 char *address = NULL;
2185 g_variant_get(parameters, "(i&s&s&s&sn)", &result, &address,
2186 &uuid, &name, &path, &socket_fd);
2188 if (_check_uuid_path(path, uuid) == FALSE)
2191 memset(&req_ind, 0x00, sizeof(bluetooth_rfcomm_connection_request_t));
2192 _bt_convert_addr_string_to_type(req_ind.device_addr.addr,
2195 req_ind.socket_fd = socket_fd;
2197 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_AUTHORIZE,
2199 event_info->cb, event_info->user_data);
2200 } else if (strcasecmp(signal_name, BT_RFCOMM_SERVER_REMOVED) == 0) {
2201 /* OSP only event */
2204 g_variant_get(parameters, "(in)", &result, &socket_fd);
2206 ret_if(__bt_is_server_exist(socket_fd) == FALSE);
2208 _bt_remove_server(socket_fd);
2209 } else if (strcasecmp(signal_name, BT_RFCOMM_DATA_RECEIVED) == 0) {
2210 char *buffer = NULL;
2213 bluetooth_rfcomm_received_data_t data_r;
2216 g_variant_get(parameters, "(in@ay)", &result,
2217 &socket_fd, &byte_var);
2219 buffer_len = g_variant_get_size( byte_var);
2220 buffer = (char *) g_variant_get_data(byte_var);
2222 data_r.socket_fd = socket_fd;
2223 data_r.buffer_size = buffer_len;
2224 data_r.buffer = buffer;
2226 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED,
2228 event_info->cb, event_info->user_data);
2229 g_variant_unref(byte_var);
2233 void __bt_hf_agent_event_filter(GDBusConnection *connection,
2234 const gchar *sender_name,
2235 const gchar *object_path,
2236 const gchar *interface_name,
2237 const gchar *signal_name,
2238 GVariant *parameters,
2243 bt_event_info_t *event_info;
2244 int result = BLUETOOTH_ERROR_NONE;
2245 event_info = (bt_event_info_t *)user_data;
2246 ret_if(event_info == NULL);
2249 if (strcasecmp(object_path, BT_HF_AGENT_PATH) != 0)
2251 if (strcasecmp(interface_name, BT_HF_SERVICE_INTERFACE) != 0)
2254 ret_if(signal_name == NULL);
2256 BT_DBG("%s",signal_name);
2257 if (strcasecmp(signal_name, "Connected") == 0) {
2258 char *address = NULL;
2260 g_variant_get(parameters, "(s)", &address);
2261 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CONNECTED,
2263 event_info->cb, event_info->user_data);
2264 } else if (strcasecmp(signal_name, "Disconnected") == 0) {
2265 char *address = NULL;
2267 g_variant_get(parameters, "(s)", &address);
2268 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_DISCONNECTED,
2270 event_info->cb, event_info->user_data);
2271 } else if (strcasecmp(signal_name, "AudioConnected") == 0) {
2272 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_AUDIO_CONNECTED,
2274 event_info->cb, event_info->user_data);
2275 } else if (strcasecmp(signal_name, "AudioDisconnected") == 0) {
2276 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_AUDIO_DISCONNECTED,
2278 event_info->cb, event_info->user_data);
2279 } else if (strcasecmp(signal_name, "Ring") == 0) {
2280 char *phoneno = NULL;
2282 g_variant_get(parameters, "(&s)", &phoneno);
2284 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_RING_INDICATOR,
2286 event_info->cb, event_info->user_data);
2287 } else if (strcasecmp(signal_name, "CallWaiting") == 0) {
2288 char *phoneno = NULL;
2290 g_variant_get(parameters, "(&s)", &phoneno);
2292 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_WAITING,
2294 event_info->cb, event_info->user_data);
2295 } else if (strcasecmp(signal_name, "CallTerminated") == 0) {
2296 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_TERMINATED,
2298 event_info->cb, event_info->user_data);
2299 } else if (strcasecmp(signal_name, "CallStarted") == 0) {
2300 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_STARTED,
2302 event_info->cb, event_info->user_data);
2303 } else if (strcasecmp(signal_name, "CallEnded") == 0) {
2304 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_ENDED,
2306 event_info->cb, event_info->user_data);
2307 } else if (strcasecmp(signal_name, "NoCallsHeld") == 0) {
2308 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_UNHOLD,
2310 event_info->cb, event_info->user_data);
2311 } else if (strcasecmp(signal_name, "CallsSwapped") == 0) {
2312 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_SWAPPED,
2314 event_info->cb, event_info->user_data);
2315 } else if (strcasecmp(signal_name, "CallOnHold") == 0) {
2316 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_ON_HOLD,
2318 event_info->cb, event_info->user_data);
2319 } else if (strcasecmp(signal_name, "CallStatusUpdate") == 0) {
2321 GVariant *var_data = NULL;
2322 char *number = NULL;
2323 int idx, dir, status, mpart;
2324 bt_hf_call_list_s *handle = NULL;
2326 g_variant_get(parameters, "(i@a(siiii))", &call_count,
2328 BT_DBG("call count : %d",call_count);
2331 GVariantIter *iter = NULL;
2332 __bt_call_list_create(&handle);
2334 g_variant_get(var_data, "a(siiii)", &iter);
2335 while (g_variant_iter_loop(iter, "(siiii)", &number,
2336 &dir, &status, &mpart, &idx)) {
2337 BT_DBG("call number:%s, dir:%d, status : %d",
2338 number, dir, status);
2339 BT_DBG("call mpart : %d, idx : %d",mpart, idx);
2340 __bt_call_list_add(handle, number, dir,
2341 status, mpart, idx);
2343 g_variant_iter_free(iter);
2344 g_variant_unref(var_data);
2347 if (handle && (call_count == g_list_length(handle->list))) {
2348 handle->count = call_count;
2349 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_STATUS,
2351 event_info->cb, event_info->user_data);
2353 BT_ERR(" Mismatch in call count : %d",call_count);
2356 __bt_call_list_destroy(handle);
2357 } else if (strcasecmp(signal_name, "VoiceRecognition") == 0) {
2359 g_variant_get(parameters, "(i)", &status);
2360 BT_DBG("status = [%d]\n", status);
2362 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VOICE_RECOGNITION_ENABLED,
2364 event_info->cb, event_info->user_data);
2366 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VOICE_RECOGNITION_DISABLED,
2368 event_info->cb, event_info->user_data);
2369 } else if (strcasecmp(signal_name, "VolumeSpeaker") == 0) {
2371 g_variant_get(parameters, "(i)", &value);
2372 BT_DBG("Value = [%d]\n", value);
2373 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VOLUME_SPEAKER,
2375 event_info->cb, event_info->user_data);
2376 } else if (strcasecmp(signal_name, "SamsungXSAT") == 0) {
2379 bluetooth_vendor_dep_at_cmd_t cmd;
2380 g_variant_get(parameters, "(i&s)", &value, &msg);
2381 BT_DBG("Value = [%d], message = %s\n", value, msg);
2384 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VENDOR_DEP_CMD,
2386 event_info->cb, event_info->user_data);
2391 static void __bt_remove_all_events(void)
2394 bt_event_info_t *info;
2396 for (l = event_list; l != NULL; l = g_slist_next(l)) {
2400 _bt_unregister_event(info->event_type);
2403 g_slist_free(event_list);
2407 static gboolean __bt_event_is_registered(int event_type)
2410 bt_event_info_t *info;
2412 for (l = event_list; l != NULL; l = g_slist_next(l)) {
2417 if (info->event_type == event_type)
2424 bt_event_info_t *_bt_event_get_cb_data(int event_type)
2427 bt_event_info_t *info;
2429 for (l = event_list; l != NULL; l = g_slist_next(l)) {
2434 if (info->event_type == event_type)
2441 void _bt_add_server(int server_fd)
2443 bt_server_info_t *info;
2445 info = g_new0(bt_server_info_t, 1);
2446 info->server_fd = server_fd;
2448 server_list = g_slist_append(server_list, info);
2451 void _bt_remove_server(int server_fd)
2454 bt_server_info_t *info;
2456 for (l = server_list; l != NULL; l = g_slist_next(l)) {
2461 if (info->server_fd == server_fd) {
2462 server_list = g_slist_remove(server_list, (void *)info);
2469 void _bt_set_obex_server_id(int server_type)
2471 obex_server_id = server_type;
2474 int _bt_get_obex_server_id(void)
2476 return obex_server_id;
2479 int _bt_init_event_handler(void)
2481 if (is_initialized == TRUE) {
2482 BT_ERR("Connection already exist");
2483 return BLUETOOTH_ERROR_ALREADY_INITIALIZED;
2486 __bt_remove_all_events();
2488 is_initialized = TRUE;
2490 return BLUETOOTH_ERROR_NONE;
2493 int _bt_deinit_event_handler(void)
2495 if (is_initialized == FALSE) {
2496 BT_ERR("Connection dose not exist");
2497 return BLUETOOTH_ERROR_INTERNAL;
2500 __bt_remove_all_events();
2502 if (disable_timer_id > 0) {
2503 g_source_remove(disable_timer_id);
2504 disable_timer_id = 0;
2507 is_initialized = FALSE;
2509 return BLUETOOTH_ERROR_NONE;
2512 static void __bt_event_data_free(void *data)
2514 bt_event_info_t *cb_data = data;
2516 ret_if(cb_data == NULL);
2521 int _bt_register_event(int event_type, void *event_cb, void *user_data)
2523 GError *error = NULL;
2524 GDBusConnection *connection_type;
2525 GDBusSignalCallback event_func;
2526 bt_event_info_t *cb_data;
2528 const char *interface = BT_EVENT_SERVICE;
2530 if (is_initialized == FALSE)
2531 _bt_init_event_handler();
2533 if (__bt_event_is_registered(event_type) == TRUE) {
2534 BT_ERR("The event is already registed");
2535 return BLUETOOTH_ERROR_ALREADY_INITIALIZED;
2538 switch (event_type) {
2539 case BT_ADAPTER_EVENT:
2540 event_func = __bt_adapter_event_filter;
2541 path = BT_ADAPTER_PATH;
2543 case BT_LE_ADAPTER_EVENT:
2544 event_func = __bt_adapter_le_event_filter;
2545 path = BT_LE_ADAPTER_PATH;
2547 case BT_DEVICE_EVENT:
2548 event_func = __bt_device_event_filter;
2549 path = BT_DEVICE_PATH;
2552 event_func = __bt_hid_event_filter;
2555 case BT_HEADSET_EVENT:
2556 event_func = __bt_headset_event_filter;
2557 path = BT_HEADSET_PATH;
2559 case BT_NETWORK_EVENT:
2560 event_func = __bt_network_event_filter;
2561 path = BT_NETWORK_PATH;
2563 case BT_AVRCP_EVENT:
2564 event_func = __bt_avrcp_event_filter;
2565 path = BT_AVRCP_PATH;
2567 case BT_AVRCP_CONTROL_EVENT:
2568 event_func = __bt_avrcp_control_event_filter;
2569 path = BT_AVRCP_CONTROL_PATH;
2571 case BT_OPP_CLIENT_EVENT:
2572 event_func = __bt_opp_client_event_filter;
2573 path = BT_OPP_CLIENT_PATH;
2575 case BT_OPP_SERVER_EVENT:
2576 event_func = __bt_opp_server_event_filter;
2577 path = BT_OPP_SERVER_PATH;
2579 case BT_PBAP_CLIENT_EVENT:
2580 event_func = __bt_pbap_client_event_filter;
2581 path = BT_PBAP_CLIENT_PATH;
2583 case BT_RFCOMM_CLIENT_EVENT:
2584 event_func = __bt_rfcomm_client_event_filter;
2585 path = BT_RFCOMM_CLIENT_PATH;
2587 case BT_RFCOMM_SERVER_EVENT:
2588 event_func = __bt_rfcomm_server_event_filter;
2589 path = BT_RFCOMM_SERVER_PATH;
2591 case BT_HF_AGENT_EVENT:
2592 BT_DBG("BT_HF_AGENT_EVENT\n");
2593 event_func = __bt_hf_agent_event_filter;
2594 path = BT_HF_AGENT_PATH;
2595 interface = BT_HF_SERVICE_INTERFACE;
2597 case BT_A2DP_SOURCE_EVENT:
2598 BT_DBG("BT_A2DP_SOURCE_EVENT");
2599 event_func = __bt_a2dp_source_event_filter;
2600 path = BT_A2DP_SOURCE_PATH;
2602 case BT_HID_DEVICE_EVENT:
2603 BT_DBG("BT_HID_DEVICE_EVENT");
2604 event_func = __bt_hid_device_event_filter;
2605 path = BT_HID_DEVICE_PATH;
2607 #ifdef GATT_NO_RELAY
2608 case BT_GATT_BLUEZ_EVENT:
2609 BT_DBG("BT_GATT_BLUEZ_EVENT");
2610 event_func = __bt_device_event_filter;
2611 interface = BT_GATT_CHARACTERISTIC_INTERFACE;
2616 BT_ERR("Unknown event");
2617 return BLUETOOTH_ERROR_INTERNAL;
2620 connection_type = _bt_gdbus_get_system_gconn();
2621 if (connection_type == NULL)
2622 return BLUETOOTH_ERROR_INTERNAL;
2624 cb_data = g_new0(bt_event_info_t, 1);
2626 cb_data->event_type = event_type;
2627 cb_data->cb = event_cb;
2628 cb_data->user_data = user_data;
2630 cb_data->id = g_dbus_connection_signal_subscribe(connection_type,
2631 NULL, interface, NULL, path, NULL, 0,
2632 event_func, cb_data, NULL);
2634 event_list = g_slist_append(event_list, cb_data);
2636 return BLUETOOTH_ERROR_NONE;
2639 int _bt_unregister_event(int event_type)
2641 GDBusConnection *connection_type;
2642 bt_event_info_t *cb_data;
2644 if (is_initialized == FALSE) {
2645 BT_ERR("Event is not registered");
2646 return BLUETOOTH_ERROR_NOT_INITIALIZED;
2649 if (__bt_event_is_registered(event_type) == FALSE) {
2650 BT_ERR("Not registered event");
2651 return BLUETOOTH_ERROR_INTERNAL;
2654 cb_data = _bt_event_get_cb_data(event_type);
2656 if (cb_data == NULL) {
2657 BT_ERR("No matched event data");
2658 return BLUETOOTH_ERROR_INTERNAL;
2661 connection_type = _bt_gdbus_get_system_gconn();
2663 event_list = g_slist_remove(event_list, (void *)cb_data);
2665 retv_if(connection_type == NULL, BLUETOOTH_ERROR_INTERNAL);
2667 g_dbus_connection_signal_unsubscribe(connection_type, cb_data->id);
2669 __bt_event_data_free((void *)cb_data);
2671 return BLUETOOTH_ERROR_NONE;
2674 static void __bt_name_owner_changed(GDBusConnection *connection,
2675 const gchar *sender_name,
2676 const gchar *object_path,
2677 const gchar *interface_name,
2678 const gchar *signal_name,
2679 GVariant *parameters,
2682 const char *name = NULL;
2683 const char *old_owner = NULL;
2684 const char *new_owner = NULL;
2685 bt_event_info_t *event_info;
2687 g_variant_get(parameters, "(&s&s&s)", &name, &old_owner, &new_owner);
2689 if (g_strcmp0(name, BT_DBUS_NAME) == 0 &&
2690 (new_owner != NULL && *new_owner == '\0')) {
2691 BT_DBG("bt-service is terminated");
2692 event_info = _bt_event_get_cb_data(BT_ADAPTER_EVENT);
2693 if (event_info == NULL)
2696 if (disable_timer_id > 0)
2697 g_source_remove(disable_timer_id);
2699 disable_timer_id = g_timeout_add(BT_RELIABLE_DISABLE_TIME,
2700 (GSourceFunc)__bt_reliable_disable_cb,
2705 void _bt_register_name_owner_changed(void)
2707 GDBusConnection *connection_type;
2709 connection_type = _bt_gdbus_get_system_gconn();
2710 if (connection_type == NULL) {
2711 BT_ERR("Unable to get the bus");
2714 owner_sig_id = g_dbus_connection_signal_subscribe(connection_type,
2715 NULL, DBUS_INTERFACE_DBUS,
2716 BT_NAME_OWNER_CHANGED, NULL, NULL, 0,
2717 __bt_name_owner_changed, NULL, NULL);
2720 void _bt_unregister_name_owner_changed(void)
2722 GDBusConnection *connection_type;
2724 connection_type = _bt_gdbus_get_system_gconn();
2725 if (connection_type != NULL && owner_sig_id != -1) {
2726 g_dbus_connection_signal_unsubscribe(connection_type,