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-glib.h>
26 #include <dbus/dbus-glib-lowlevel.h>
27 #include <dbus/dbus.h>
32 #include "bluetooth-api.h"
33 #include "bluetooth-audio-api.h"
34 #include "bt-internal-types.h"
35 #include "bluetooth-media-control.h"
37 #include "bt-common.h"
38 #include "bt-event-handler.h"
39 #include "bt-request-sender.h"
41 #define BT_RELIABLE_DISABLE_TIME 300 /* 300 ms */
51 static int obex_server_id;
52 static guint disable_timer_id;
53 static gboolean is_initialized;
54 static GSList *sending_list = NULL;
55 static GSList *server_list = NULL;
56 static GSList *event_list = NULL;
57 static int owner_sig_id = -1;
59 void _bt_add_push_request_id(int request_id)
61 bt_sending_info_t *info;
63 info = g_new0(bt_sending_info_t, 1);
64 info->request_id = request_id;
66 sending_list = g_slist_append(sending_list, info);
69 static gboolean __bt_is_request_id_exist(int request_id)
72 bt_sending_info_t *info;
74 for (l = sending_list; l != NULL; l = g_slist_next(l)) {
79 if (info->request_id == request_id)
86 static void __bt_remove_push_request_id(int request_id)
89 bt_sending_info_t *info;
91 for (l = sending_list; l != NULL; l = g_slist_next(l)) {
96 BT_DBG("info->request_id = %d\n", info->request_id);
97 BT_DBG("request_id = %d\n", request_id);
98 if (info->request_id == request_id) {
99 sending_list = g_slist_remove(sending_list, (void *)info);
106 static void __bt_remove_all_push_request_id(void)
109 bt_sending_info_t *info;
111 for (l = sending_list; l != NULL; l = g_slist_next(l)) {
116 g_slist_free(sending_list);
120 static void __bt_remove_all_server(void)
123 bt_server_info_t *info;
125 for (l = server_list; l != NULL; l = g_slist_next(l)) {
130 g_slist_free(server_list);
134 static gboolean __bt_is_server_exist(int server_fd)
137 bt_server_info_t *info;
139 for (l = server_list; l != NULL; l = g_slist_next(l)) {
144 retv_if(info->server_fd == server_fd, TRUE);
150 static void __bt_get_uuid_info(bluetooth_device_info_t *dev_info,
157 ret_if(dev_info == NULL);
158 ret_if(uuids == NULL);
159 ret_if(uuid_count <= 0);
161 dev_info->service_index = uuid_count;
163 for (i = 0; i < uuid_count && uuids[i] != NULL; i++) {
164 g_strlcpy(dev_info->uuids[i], uuids[i], BLUETOOTH_UUID_STRING_MAX);
166 parts = g_strsplit(uuids[i], "-", -1);
168 if (parts == NULL || parts[0] == NULL) {
173 dev_info->service_list_array[i] = g_ascii_strtoull(parts[0], NULL, 16);
177 static int __bt_call_list_create(bt_hf_call_list_s **list)
179 bt_hf_call_list_s *handle;
182 BT_DBG("Already Initialized");
183 return BLUETOOTH_ERROR_NONE;
185 handle = g_malloc0(sizeof(bt_hf_call_list_s));
187 return BLUETOOTH_ERROR_NONE;
190 static int __bt_call_list_reset(bt_hf_call_list_s *list)
192 bt_hf_call_list_s *handle;
193 bt_hf_call_status_info_t *call_status;
196 BT_ERR("invalid parameter");
197 return BLUETOOTH_ERROR_INVALID_PARAM;
199 handle = (bt_hf_call_list_s *)list;
201 call_status = (bt_hf_call_status_info_t *)g_list_nth_data(handle->list, 0);
202 if (call_status == NULL)
204 handle->list = g_list_remove(handle->list, call_status);
205 g_free(call_status->number);
208 return BLUETOOTH_ERROR_NONE;
211 static int __bt_call_list_destroy(bt_hf_call_list_s *list)
214 bt_hf_call_list_s *handle;
217 BT_ERR("invalid parameter");
218 return BLUETOOTH_ERROR_INVALID_PARAM;
220 handle = (bt_hf_call_list_s *)list;
221 result = __bt_call_list_reset(list);
225 static int __bt_call_list_add(bt_hf_call_list_s *list, char * number,
226 int dir, int status, int mpart, int idx)
228 bt_hf_call_list_s *handle;
229 bt_hf_call_status_info_t *call_status;
232 BT_ERR("invalid parameter");
233 return BLUETOOTH_ERROR_INVALID_PARAM;
235 handle = (bt_hf_call_list_s *)list;
236 call_status = g_malloc0(sizeof(bt_hf_call_status_info_t));
237 call_status->number = g_strdup(number);
238 call_status->direction= dir;
239 call_status->status = status;
240 call_status->mpart = mpart;
241 call_status->idx = idx;
242 handle->list = g_list_append(handle->list, (gpointer)call_status);
243 return BLUETOOTH_ERROR_NONE;
246 static bluetooth_device_info_t *__bt_get_device_info_in_message(GVariant *parameters, int *ret)
248 bluetooth_device_info_t *dev_info;
249 const char *address = NULL;
250 const char *name = NULL;
251 gchar **uuids = NULL;
252 unsigned int dev_class = 0;
254 gboolean paired = FALSE;
255 gboolean connected = FALSE;
256 gboolean trust = FALSE;
258 int result = BLUETOOTH_ERROR_NONE;
259 GVariant *string_var;
261 int manufacturer_data_len = 0;
262 GVariant *manufacturer_var = NULL;
263 const char *manufacturer_data = NULL;
265 g_variant_get(parameters, "(i&sun&sbbb@asn@ay)", &result, &address,
266 &dev_class, &rssi, &name, &paired,
267 &connected, &trust, &string_var, &manufacturer_data_len, &manufacturer_var);
269 if (string_var == NULL) {
270 BT_ERR("invalid parameters in signal");
274 uuids = (gchar **)g_variant_get_strv(string_var, &uuid_count);
276 len = g_variant_get_size(manufacturer_var);
278 manufacturer_data = (char *)g_variant_get_data(manufacturer_var);
280 dev_info = g_malloc0(sizeof(bluetooth_device_info_t));
282 dev_info->rssi = rssi;
283 dev_info->paired = paired;
284 dev_info->connected = connected;
285 dev_info->trust = trust;
287 g_strlcpy(dev_info->device_name.name, name,
288 BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
290 _bt_divide_device_class(&dev_info->device_class, dev_class);
292 _bt_convert_addr_string_to_type(dev_info->device_address.addr,
296 __bt_get_uuid_info(dev_info, uuids, uuid_count);
298 if (manufacturer_data_len > BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX) {
299 BT_ERR("manufacturer_data_len is too long(len = %d)", manufacturer_data_len);
300 manufacturer_data_len = BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX;
302 dev_info->manufacturer_data.data_len = manufacturer_data_len;
303 if (manufacturer_data)
304 for (i = 0; i < manufacturer_data_len; i++)
305 dev_info->manufacturer_data.data[i] = manufacturer_data[i];
309 g_variant_unref(string_var);
310 g_variant_unref(manufacturer_var);
314 static bluetooth_le_device_info_t *__bt_get_le_device_info_in_message(GVariant *parameters, int *ret)
316 bluetooth_le_device_info_t *le_dev_info;
317 const char *address = NULL;
322 int adv_data_len = 0;
323 GVariant *adv_var = NULL;
324 const char *adv_data = NULL;
325 int scan_data_len = 0;
326 GVariant *scan_var = NULL;
327 const char *scan_data = NULL;
328 int result = BLUETOOTH_ERROR_NONE;
330 g_variant_get(parameters, "(i&snnn@ayn@ay)", &result, &address,
331 &addr_type, &rssi, &adv_data_len, &adv_var, &scan_data_len, &scan_var);
333 len = g_variant_get_size(adv_var);
335 adv_data = (char *)g_variant_get_data(adv_var);
337 len = g_variant_get_size(scan_var);
339 scan_data = (char *)g_variant_get_data(scan_var);
341 le_dev_info = g_malloc0(sizeof(bluetooth_le_device_info_t));
343 _bt_convert_addr_string_to_type(le_dev_info->device_address.addr, address);
344 le_dev_info->addr_type = addr_type;
345 le_dev_info->rssi = rssi;
346 le_dev_info->adv_ind_data.data_len = adv_data_len;
348 for (i = 0; i < adv_data_len; i++)
350 le_dev_info->adv_ind_data.data.data[i] = adv_data[i];
352 le_dev_info->scan_resp_data.data_len = scan_data_len;
354 for (i = 0; i < scan_data_len; i++)
356 le_dev_info->scan_resp_data.data.data[i] = scan_data[i];
360 g_variant_unref(adv_var);
361 g_variant_unref(scan_var);
365 gboolean __bt_reliable_disable_cb(gpointer user_data)
368 bt_event_info_t *event_info = user_data;
370 if (is_initialized != FALSE) {
371 _bt_common_event_cb(BLUETOOTH_EVENT_DISABLED,
372 BLUETOOTH_ERROR_NONE, NULL,
373 event_info->cb, event_info->user_data);
374 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISABLED,
375 BLUETOOTH_ERROR_NONE, NULL,
376 event_info->cb, event_info->user_data);
379 obex_server_id = BT_NO_SERVER;
380 __bt_remove_all_server();
381 __bt_remove_all_push_request_id();
383 _bt_rfcomm_server_free_all();
389 void __bt_adapter_event_filter(GDBusConnection *connection,
390 const gchar *sender_name,
391 const gchar *object_path,
392 const gchar *interface_name,
393 const gchar *signal_name,
394 GVariant *parameters,
397 bt_event_info_t *event_info;
398 int result = BLUETOOTH_ERROR_NONE;
400 event_info = (bt_event_info_t *)user_data;
401 ret_if(event_info == NULL);
403 if (strcasecmp(object_path, BT_ADAPTER_PATH) != 0)
405 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
408 if (strcasecmp(signal_name, BT_ENABLED) == 0) {
409 BT_INFO("BT_ENABLED");
410 g_variant_get(parameters, "(i)", &result);
411 if (result == BLUETOOTH_ERROR_NONE) {
412 if (vconf_set_int(BT_OFF_DUE_TO_FLIGHT_MODE, 0) != 0)
413 BT_ERR("Set vconf failed");
415 if (vconf_set_int(BT_OFF_DUE_TO_POWER_SAVING_MODE, 0) != 0)
416 BT_ERR("Set vconf failed");
418 if (vconf_set_int(BT_OFF_DUE_TO_TIMEOUT, 0) != 0)
419 BT_ERR("Set vconf failed");
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");
427 int flight_mode_value = 0;
428 int ps_mode_value = 0;
430 if (vconf_get_int(BT_OFF_DUE_TO_FLIGHT_MODE,
431 &flight_mode_value) != 0)
432 BT_ERR("Fail to get the flight_mode_deactivated value");
434 if (vconf_get_int(BT_OFF_DUE_TO_POWER_SAVING_MODE,
435 &ps_mode_value) != 0)
436 BT_ERR("Fail to get the ps_mode_deactivated value");
438 if (flight_mode_value == 1 || ps_mode_value > 0) {
439 BT_INFO("Flight mode deactivation");
440 if (disable_timer_id > 0)
441 g_source_remove(disable_timer_id);
443 disable_timer_id = g_timeout_add(BT_RELIABLE_DISABLE_TIME,
444 (GSourceFunc)__bt_reliable_disable_cb,
447 _bt_common_event_cb(BLUETOOTH_EVENT_DISABLED,
449 event_info->cb, event_info->user_data);
450 } else if (strcasecmp(signal_name, BT_DISCOVERABLE_MODE_CHANGED) == 0) {
453 g_variant_get(parameters, "(in)", &result, &mode);
454 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
456 event_info->cb, event_info->user_data);
457 } else if (strcasecmp(signal_name, BT_DISCOVERABLE_TIMEOUT_CHANGED) == 0) {
460 g_variant_get(parameters, "(in)", &result, &timeout);
461 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED,
463 event_info->cb, event_info->user_data);
464 } else if (strcasecmp(signal_name, BT_CONNECTABLE_CHANGED) == 0) {
465 gboolean connectable = FALSE;
467 g_variant_get(parameters, "(b)", &connectable);
468 BT_DBG("Connectable is changed : %d", connectable);
470 _bt_common_event_cb(BLUETOOTH_EVENT_CONNECTABLE_CHANGED,
471 result, &connectable,
472 event_info->cb, event_info->user_data);
473 } else if (strcasecmp(signal_name, BT_ADAPTER_NAME_CHANGED) == 0) {
474 char *adapter_name = NULL;
476 g_variant_get(parameters, "(i&s)", &result, &adapter_name);
477 _bt_common_event_cb(BLUETOOTH_EVENT_LOCAL_NAME_CHANGED,
478 result, adapter_name,
479 event_info->cb, event_info->user_data);
480 } else if (strcasecmp(signal_name, BT_DISCOVERY_STARTED) == 0) {
481 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERY_STARTED,
482 BLUETOOTH_ERROR_NONE, NULL,
483 event_info->cb, event_info->user_data);
484 } else if (strcasecmp(signal_name, BT_DISCOVERY_FINISHED) == 0) {
485 g_variant_get(parameters, "(i)", &result);
486 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERY_FINISHED,
488 event_info->cb, event_info->user_data);
489 } else if (strcasecmp(signal_name, BT_ADVERTISING_STARTED) == 0) {
490 bluetooth_advertising_params_t adv_params = {0, };
492 g_variant_get(parameters, "(idd)", &result,
493 &adv_params.interval_min,
494 &adv_params.interval_max);
496 _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_STARTED,
498 event_info->cb, event_info->user_data);
499 } else if (strcasecmp(signal_name, BT_ADVERTISING_STOPPED) == 0) {
500 g_variant_get(parameters, "(i)", &result);
501 _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_STOPPED,
503 event_info->cb, event_info->user_data);
504 } else if (strcasecmp(signal_name, BT_ADVERTISING_MANUFACTURER_DATA_CHANGED) == 0) {
505 GVariant *var = NULL;
509 g_variant_get(parameters, "(@ay)", &var);
510 len = g_variant_get_size(var);
511 data = (char *)g_variant_get_data(var);
513 _bt_common_event_cb(BLUETOOTH_EVENT_ADVERTISING_MANUFACTURER_DATA_CHANGED,
515 event_info->cb, event_info->user_data);
517 g_variant_unref(var);
518 } else if (strcasecmp(signal_name, BT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED) == 0) {
519 GVariant *var = NULL;
523 g_variant_get(parameters, "(@ay)", &var);
524 len = g_variant_get_size(var);
525 data = (char *)g_variant_get_data(var);
527 _bt_common_event_cb(BLUETOOTH_EVENT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED,
529 event_info->cb, event_info->user_data);
531 g_variant_unref(var);
532 } else if (strcasecmp(signal_name, BT_MANUFACTURER_DATA_CHANGED) == 0) {
533 GVariant *var = NULL;
537 g_variant_get(parameters, "(@ay)", &var);
538 len = g_variant_get_size(var);
539 data = (char *)g_variant_get_data(var);
541 _bt_common_event_cb(BLUETOOTH_EVENT_MANUFACTURER_DATA_CHANGED,
543 event_info->cb, event_info->user_data);
545 g_variant_unref(var);
546 } else if (strcasecmp(signal_name, BT_DEVICE_FOUND) == 0) {
548 bluetooth_device_info_t *device_info;
550 device_info = __bt_get_device_info_in_message(parameters,
552 ret_if(device_info == NULL);
554 if (strlen(device_info->device_name.name) > 0)
555 event = BLUETOOTH_EVENT_REMOTE_DEVICE_NAME_UPDATED;
557 event = BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND;
559 _bt_common_event_cb(event,
561 event_info->cb, event_info->user_data);
564 } else if (strcasecmp(signal_name, BT_BOND_CREATED) == 0) {
565 bluetooth_device_info_t *device_info;
567 device_info = __bt_get_device_info_in_message(parameters,
569 ret_if(device_info == NULL);
571 _bt_common_event_cb(BLUETOOTH_EVENT_BONDING_FINISHED,
573 event_info->cb, event_info->user_data);
576 } else if (strcasecmp(signal_name, BT_BOND_DESTROYED) == 0) {
577 const char *address = NULL;
578 bluetooth_device_address_t dev_address = { {0} };
580 g_variant_get(parameters, "(i&s)", &result, &address);
582 _bt_convert_addr_string_to_type(dev_address.addr,
585 _bt_common_event_cb(BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED,
586 result, &dev_address,
587 event_info->cb, event_info->user_data);
588 } else if (strcasecmp(signal_name, BT_SERVICE_SEARCHED) == 0) {
589 bluetooth_device_info_t *device_info;
590 bt_sdp_info_t sdp_info;
592 device_info = __bt_get_device_info_in_message(parameters,
594 ret_if(device_info == NULL);
596 memset(&sdp_info, 0x00, sizeof(bt_sdp_info_t));
598 sdp_info.service_index = device_info->service_index;
600 memcpy(&sdp_info.device_addr,
601 &device_info->device_address,
602 BLUETOOTH_ADDRESS_LENGTH);
604 memcpy(sdp_info.service_list_array,
605 device_info->service_list_array,
606 BLUETOOTH_MAX_SERVICES_FOR_DEVICE);
608 memcpy(sdp_info.uuids,
610 BLUETOOTH_MAX_SERVICES_FOR_DEVICE * BLUETOOTH_UUID_STRING_MAX);
612 _bt_common_event_cb(BLUETOOTH_EVENT_SERVICE_SEARCHED,
614 event_info->cb, event_info->user_data);
620 void __bt_adapter_le_event_filter(GDBusConnection *connection,
621 const gchar *sender_name,
622 const gchar *object_path,
623 const gchar *interface_name,
624 const gchar *signal_name,
625 GVariant *parameters,
628 bt_event_info_t *event_info;
629 int result = BLUETOOTH_ERROR_NONE;
631 event_info = (bt_event_info_t *)user_data;
632 ret_if(event_info == NULL);
634 if (strcasecmp(object_path, BT_LE_ADAPTER_PATH) != 0)
636 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
639 if (strcasecmp(signal_name, BT_LE_ENABLED) == 0) {
640 BT_INFO("BT_LE_ENABLED");
641 g_variant_get(parameters, "(i)", &result);
642 _bt_common_event_cb(BLUETOOTH_EVENT_LE_ENABLED,
644 event_info->cb, event_info->user_data);
645 } else if (strcasecmp(signal_name, BT_LE_DISABLED) == 0) {
646 BT_INFO("BT_LE_DISABLED");
647 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISABLED,
649 event_info->cb, event_info->user_data);
650 } else if (strcasecmp(signal_name, BT_LE_DISCOVERY_STARTED) == 0) {
651 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISCOVERY_STARTED,
652 BLUETOOTH_ERROR_NONE, NULL,
653 event_info->cb, event_info->user_data);
654 } else if (strcasecmp(signal_name, BT_LE_DISCOVERY_FINISHED) == 0) {
655 g_variant_get(parameters, "(i)", &result);
656 _bt_common_event_cb(BLUETOOTH_EVENT_LE_DISCOVERY_FINISHED,
658 event_info->cb, event_info->user_data);
659 } else if (strcasecmp(signal_name, BT_LE_DEVICE_FOUND) == 0) {
660 bluetooth_le_device_info_t *le_device_info;
662 le_device_info = __bt_get_le_device_info_in_message(parameters,
664 ret_if(le_device_info == NULL);
666 _bt_common_event_cb(BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND,
667 result, le_device_info,
668 event_info->cb, event_info->user_data);
670 g_free(le_device_info);
674 void __bt_device_event_filter(GDBusConnection *connection,
675 const gchar *sender_name,
676 const gchar *object_path,
677 const gchar *interface_name,
678 const gchar *signal_name,
679 GVariant *parameters,
682 bt_event_info_t *event_info;
683 int result = BLUETOOTH_ERROR_NONE;
685 event_info = (bt_event_info_t *)user_data;
686 ret_if(event_info == NULL);
688 if (strcasecmp(object_path, BT_DEVICE_PATH) != 0)
690 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
693 ret_if(signal_name == NULL);
695 if (strcasecmp(signal_name, BT_GATT_CONNECTED) == 0) {
696 const char *address = NULL;
697 bluetooth_device_address_t dev_address = { {0} };
698 BT_DBG("BT_GATT_CONNECTED");
699 g_variant_get(parameters, "(i&s)", &result, &address);
701 _bt_convert_addr_string_to_type(dev_address.addr, address);
702 BT_DBG("Sending Event to Framework");
703 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_CONNECTED,
704 result, &dev_address,
705 event_info->cb, event_info->user_data);
706 } else if (strcasecmp(signal_name, BT_GATT_DISCONNECTED) == 0) {
707 const char *address = NULL;
708 bluetooth_device_address_t dev_address = { {0} };
709 BT_DBG("BT_GATT_DISCONNECTED");
710 g_variant_get(parameters, "(i&s)", &result, &address);
712 _bt_convert_addr_string_to_type(dev_address.addr, address);
713 BT_DBG("Sending Event to Framework");
714 _bt_common_event_cb(BLUETOOTH_EVENT_GATT_DISCONNECTED,
715 result, &dev_address,
716 event_info->cb, event_info->user_data);
717 } else if (strcasecmp(signal_name, BT_DEVICE_CONNECTED) == 0) {
718 const char *address = NULL;
719 unsigned char addr_type;
720 bt_connection_info_t conn_info;
721 bluetooth_device_address_t dev_address = { {0} };
722 BT_DBG("BT_DEVICE_CONNECTED");
723 g_variant_get(parameters, "(i&sy)", &result, &address, &addr_type);
725 _bt_convert_addr_string_to_type(dev_address.addr,
728 memset(&conn_info, 0x00, sizeof(bt_connection_info_t));
730 memcpy(conn_info.device_addr.addr,
732 BLUETOOTH_ADDRESS_LENGTH);
734 conn_info.addr_type = addr_type;
735 conn_info.disc_reason = 0;
736 BT_DBG("Sending Event to Framework");
737 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_CONNECTED,
739 event_info->cb, event_info->user_data);
741 } else if (strcasecmp(signal_name, BT_DEVICE_DISCONNECTED) == 0) {
742 const char *address = NULL;
743 unsigned char addr_type;
744 bt_connection_info_t conn_info;
745 bluetooth_device_address_t dev_address = { {0} };
746 BT_DBG("BT_DEVICE_DISCONNECTED");
747 g_variant_get(parameters, "(i&sy)", &result, &address, &addr_type);
749 _bt_convert_addr_string_to_type(dev_address.addr,
752 memset(&conn_info, 0x00, sizeof(bt_connection_info_t));
754 memcpy(conn_info.device_addr.addr,
756 BLUETOOTH_ADDRESS_LENGTH);
758 conn_info.addr_type = addr_type;
759 conn_info.disc_reason = result;
760 BT_DBG("Sending Event to Framework");
761 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_DISCONNECTED,
763 event_info->cb, event_info->user_data);
765 } else if (strcasecmp(signal_name, BT_RSSI_MONITORING_ENABLED) == 0) {
766 bt_rssi_enabled_t enabled = { 0, };
769 gboolean rssi_enabled = FALSE;
771 g_variant_get(parameters, "(isib)", &result, &address,
772 &link_type, &rssi_enabled);
774 BT_DBG("RSSI Enabled[Address:%s LinkType:%d RSSI_dbm:%d]",
775 address, link_type, rssi_enabled);
776 enabled.address = address;
777 enabled.link_type = link_type;
778 enabled.rssi_enabled = rssi_enabled;
780 _bt_common_event_cb(BLUETOOTH_EVENT_RSSI_ENABLED,
782 event_info->cb, event_info->user_data);
783 } else if (strcasecmp(signal_name, BT_RSSI_ALERT) == 0) {
788 bt_rssi_alert_t alert = { 0, };
790 g_variant_get(parameters, "(isiii)", &result, &address,
791 &link_type, &alert_type, &rssi_dbm);
793 alert.alert_type = alert_type;
794 alert.rssi_dbm = rssi_dbm;
795 alert.address = address;
796 alert.link_type = link_type;
797 BT_DBG("Address [%s] LinkType[%d] AlertType[%d] RSSI dBm[%d]",
798 address, link_type, alert_type, rssi_dbm);
799 _bt_common_event_cb(BLUETOOTH_EVENT_RSSI_ALERT,
801 event_info->cb, event_info->user_data);
802 } else if (strcasecmp(signal_name, BT_RAW_RSSI_EVENT) == 0) {
806 bt_raw_rssi_t raw_rssi = { 0, };
808 g_variant_get(parameters, "(isii)", &result,
809 &address, &link_type, &rssi_dbm);
811 BT_DBG("Address [%s] Link Type[%d] dBm[%d]",
812 address, link_type, rssi_dbm);
814 raw_rssi.rssi_dbm = rssi_dbm;
815 raw_rssi.address = address;
816 raw_rssi.link_type = link_type;
818 _bt_common_event_cb(BLUETOOTH_EVENT_RAW_RSSI,
820 event_info->cb, event_info->user_data);
821 } else if (strcasecmp(signal_name, BT_DEVICE_AUTHORIZED) == 0) {
822 const char *address = NULL;
823 bluetooth_device_address_t dev_address = { {0} };
825 g_variant_get(parameters, "(i&s)", &result, &address);
827 _bt_convert_addr_string_to_type(dev_address.addr,
830 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_AUTHORIZED,
831 result, &dev_address,
832 event_info->cb, event_info->user_data);
833 } else if (strcasecmp(signal_name, BT_DEVICE_UNAUTHORIZED) == 0) {
834 const char *address = NULL;
835 bluetooth_device_address_t dev_address = { {0} };
837 g_variant_get(parameters, "(i&s)", &result, &address);
839 _bt_convert_addr_string_to_type(dev_address.addr,
842 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_UNAUTHORIZED,
843 result, &dev_address,
844 event_info->cb, event_info->user_data);
848 void __bt_hid_event_filter(GDBusConnection *connection,
849 const gchar *sender_name,
850 const gchar *object_path,
851 const gchar *interface_name,
852 const gchar *signal_name,
853 GVariant *parameters,
856 bt_event_info_t *event_info;
857 int result = BLUETOOTH_ERROR_NONE;
859 event_info = (bt_event_info_t *)user_data;
860 ret_if(event_info == NULL);
862 if (strcasecmp(object_path, BT_HID_PATH) != 0)
864 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
867 ret_if(signal_name == NULL);
869 if (strcasecmp(signal_name, BT_INPUT_CONNECTED) == 0) {
870 const char *address = NULL;
871 bluetooth_device_address_t dev_address = { {0} };
873 g_variant_get(parameters, "(i&s)", &result, &address);
875 _bt_convert_addr_string_to_type(dev_address.addr,
878 _bt_input_event_cb(BLUETOOTH_HID_CONNECTED,
879 result, &dev_address,
880 event_info->cb, event_info->user_data);
881 } else if (strcasecmp(signal_name, BT_INPUT_DISCONNECTED) == 0) {
882 const char *address = NULL;
883 bluetooth_device_address_t dev_address = { {0} };
885 g_variant_get(parameters, "(i&s)", &result, &address);
887 BT_DBG("address: %s", address);
889 _bt_convert_addr_string_to_type(dev_address.addr,
892 _bt_input_event_cb(BLUETOOTH_HID_DISCONNECTED,
893 result, &dev_address,
894 event_info->cb, event_info->user_data);
898 void __bt_headset_event_filter(GDBusConnection *connection,
899 const gchar *sender_name,
900 const gchar *object_path,
901 const gchar *interface_name,
902 const gchar *signal_name,
903 GVariant *parameters,
906 bt_event_info_t *event_info;
907 int result = BLUETOOTH_ERROR_NONE;
908 event_info = (bt_event_info_t *)user_data;
909 ret_if(event_info == NULL);
911 if (strcasecmp(object_path, BT_HEADSET_PATH) != 0)
913 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
916 ret_if(signal_name == NULL);
918 if (strcasecmp(signal_name, BT_HEADSET_CONNECTED) == 0) {
919 char *address = NULL;
921 g_variant_get(parameters, "(i&s)", &result, &address);
923 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_CONNECTED,
925 event_info->cb, event_info->user_data);
926 } else if (strcasecmp(signal_name, BT_HEADSET_DISCONNECTED) == 0) {
927 char *address = NULL;
929 g_variant_get(parameters, "(i&s)", &result, &address);
931 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_DISCONNECTED,
933 event_info->cb, event_info->user_data);
934 } else if (strcasecmp(signal_name, BT_STEREO_HEADSET_CONNECTED) == 0) {
935 char *address = NULL;
937 g_variant_get(parameters, "(i&s)", &result, &address);
939 _bt_headset_event_cb(BLUETOOTH_EVENT_AV_CONNECTED,
941 event_info->cb, event_info->user_data);
942 } else if (strcasecmp(signal_name, BT_STEREO_HEADSET_DISCONNECTED) == 0) {
943 char *address = NULL;
945 g_variant_get(parameters, "(i&s)", &result, &address);
947 _bt_headset_event_cb(BLUETOOTH_EVENT_AV_DISCONNECTED,
949 event_info->cb, event_info->user_data);
950 } else if (strcasecmp(signal_name, BT_SPEAKER_GAIN) == 0) {
953 char *address = NULL;
955 g_variant_get(parameters, "(i&sq)", &result, &address,
957 gain = (unsigned int)spkr_gain;
959 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_SPEAKER_GAIN,
961 event_info->cb, event_info->user_data);
962 } else if (strcasecmp(signal_name, BT_MICROPHONE_GAIN) == 0) {
965 char *address = NULL;
967 g_variant_get(parameters, "(i&sq)", &result,
968 &address, &mic_gain);
969 gain = (unsigned int)mic_gain;
971 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_MIC_GAIN,
973 event_info->cb, event_info->user_data);
977 void __bt_network_event_filter(GDBusConnection *connection,
978 const gchar *sender_name,
979 const gchar *object_path,
980 const gchar *interface_name,
981 const gchar *signal_name,
982 GVariant *parameters,
985 bt_event_info_t *event_info;
986 int result = BLUETOOTH_ERROR_NONE;
987 event_info = (bt_event_info_t *)user_data;
988 ret_if(event_info == NULL);
990 if (strcasecmp(object_path, BT_NETWORK_PATH) != 0)
992 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
995 ret_if(signal_name == NULL);
997 if (strcasecmp(signal_name, BT_NETWORK_CONNECTED) == 0) {
998 const char *address = NULL;
999 bluetooth_device_address_t dev_address = { {0} };
1001 g_variant_get(parameters, "(i&s)", &result, &address);
1003 _bt_convert_addr_string_to_type(dev_address.addr,
1006 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_CONNECTED,
1007 result, &dev_address,
1008 event_info->cb, event_info->user_data);
1009 } else if (strcasecmp(signal_name, BT_NETWORK_DISCONNECTED) == 0) {
1010 const char *address = NULL;
1011 bluetooth_device_address_t dev_address = { {0} };
1013 g_variant_get(parameters, "(i&s)", &result, &address);
1015 _bt_convert_addr_string_to_type(dev_address.addr,
1018 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_DISCONNECTED,
1019 result, &dev_address,
1020 event_info->cb, event_info->user_data);
1021 } else if (strcasecmp(signal_name, BT_NETWORK_SERVER_CONNECTED) == 0) {
1022 const char *device = NULL;
1023 const char *address = NULL;
1024 bluetooth_network_device_info_t network_info;
1026 g_variant_get(parameters, "(i&s&s)", &result,
1029 memset(&network_info, 0x00, sizeof(bluetooth_network_device_info_t));
1031 _bt_convert_addr_string_to_type(network_info.device_address.addr,
1034 _bt_print_device_address_t(&network_info.device_address);
1035 g_strlcpy(network_info.interface_name, device,
1036 sizeof(network_info.interface_name));
1038 DBG_SECURE("Interface: %s", network_info.interface_name);
1040 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED,
1041 result, &network_info,
1042 event_info->cb, event_info->user_data);
1043 } else if (strcasecmp(signal_name, BT_NETWORK_SERVER_DISCONNECTED) == 0) {
1044 const char *device = NULL;
1045 const char *address = NULL;
1046 bluetooth_network_device_info_t network_info;
1048 g_variant_get(parameters, "(i&s&s)", &result, &device, &address);
1050 memset(&network_info, 0x00, sizeof(bluetooth_network_device_info_t));
1052 _bt_convert_addr_string_to_type(network_info.device_address.addr,
1055 _bt_print_device_address_t(&network_info.device_address);
1057 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED,
1058 result, &network_info,
1059 event_info->cb, event_info->user_data);
1063 void __bt_avrcp_event_filter(GDBusConnection *connection,
1064 const gchar *sender_name,
1065 const gchar *object_path,
1066 const gchar *interface_name,
1067 const gchar *signal_name,
1068 GVariant *parameters,
1071 bt_event_info_t *event_info;
1072 int result = BLUETOOTH_ERROR_NONE;
1073 event_info = (bt_event_info_t *)user_data;
1074 ret_if(event_info == NULL);
1076 if (strcasecmp(object_path, BT_AVRCP_PATH) != 0)
1078 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1081 ret_if(signal_name == NULL);
1083 if (strcasecmp(signal_name, BT_AVRCP_CONNECTED) == 0) {
1084 char *address = NULL;
1086 g_variant_get(parameters, "(i&s)", &result, &address);
1088 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONNECTED,
1090 event_info->cb, event_info->user_data);
1091 } else if (strcasecmp(signal_name, BT_AVRCP_DISCONNECTED) == 0) {
1092 char *address = NULL;
1094 g_variant_get(parameters, "(i&s)", &result, &address);
1096 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_DISCONNECTED,
1098 event_info->cb, event_info->user_data);
1099 } else if (strcasecmp(signal_name, BT_MEDIA_SHUFFLE_STATUS) == 0) {
1100 unsigned int status;
1102 g_variant_get(parameters, "(u)", &status);
1103 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_SHUFFLE_STATUS,
1105 event_info->cb, event_info->user_data);
1106 } else if (strcasecmp(signal_name, BT_MEDIA_EQUALIZER_STATUS) == 0) {
1107 unsigned int status;
1109 g_variant_get(parameters, "(u)", &status);
1110 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_EQUALIZER_STATUS,
1112 event_info->cb, event_info->user_data);
1113 } else if (strcasecmp(signal_name, BT_MEDIA_REPEAT_STATUS) == 0) {
1114 unsigned int status;
1116 g_variant_get(parameters, "(u)", &status);
1117 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_REPEAT_STATUS,
1119 event_info->cb, event_info->user_data);
1120 } else if (strcasecmp(signal_name, BT_MEDIA_SCAN_STATUS) == 0) {
1121 unsigned int status;
1123 g_variant_get(parameters, "(u)", &status);
1124 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_SCAN_STATUS,
1126 event_info->cb, event_info->user_data);
1130 void __bt_avrcp_control_event_filter(GDBusConnection *connection,
1131 const gchar *sender_name,
1132 const gchar *object_path,
1133 const gchar *interface_name,
1134 const gchar *signal_name,
1135 GVariant *parameters,
1138 bt_event_info_t *event_info;
1139 int result = BLUETOOTH_ERROR_NONE;
1140 event_info = (bt_event_info_t *)user_data;
1141 ret_if(event_info == NULL);
1143 if (strcasecmp(object_path, BT_AVRCP_CONTROL_PATH) != 0)
1145 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1148 ret_if(signal_name == NULL);
1150 if (strcasecmp(signal_name, BT_AVRCP_CONNECTED) == 0) {
1151 char *address = NULL;
1153 g_variant_get(parameters, "(i&s)", &result, &address);
1155 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_CONNECTED,
1157 event_info->cb, event_info->user_data);
1158 } else if (strcasecmp(signal_name, BT_AVRCP_DISCONNECTED) == 0) {
1159 char *address = NULL;
1161 g_variant_get(parameters, "(i&s)", &result, &address);
1163 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_DISCONNECTED,
1165 event_info->cb, event_info->user_data);
1166 } else if (strcasecmp(signal_name, BT_MEDIA_SHUFFLE_STATUS) == 0) {
1167 unsigned int status;
1169 g_variant_get(parameters, "(u)", &status);
1170 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_SHUFFLE_STATUS,
1172 event_info->cb, event_info->user_data);
1173 } else if (strcasecmp(signal_name, BT_MEDIA_EQUALIZER_STATUS) == 0) {
1174 unsigned int status;
1176 g_variant_get(parameters, "(u)", &status);
1177 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_EQUALIZER_STATUS,
1179 event_info->cb, event_info->user_data);
1180 } else if (strcasecmp(signal_name, BT_MEDIA_REPEAT_STATUS) == 0) {
1181 unsigned int status;
1183 g_variant_get(parameters, "(u)", &status);
1184 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_REPEAT_STATUS,
1186 event_info->cb, event_info->user_data);
1187 } else if (strcasecmp(signal_name, BT_MEDIA_SCAN_STATUS) == 0) {
1188 unsigned int status;
1190 g_variant_get(parameters, "(u)", &status);
1191 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONTROL_SCAN_STATUS,
1193 event_info->cb, event_info->user_data);
1194 } else if (strcasecmp(signal_name, BT_MEDIA_PLAY_STATUS) == 0) {
1195 unsigned int status;
1197 g_variant_get(parameters, "(u)", &status);
1198 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_PLAY_STATUS_CHANGED,
1200 event_info->cb, event_info->user_data);
1201 } else if (strcasecmp(signal_name, BT_MEDIA_POSITION_STATUS) == 0) {
1202 unsigned int status;
1204 g_variant_get(parameters, "(u)", &status);
1205 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SONG_POSITION_STATUS,
1207 event_info->cb, event_info->user_data);
1208 } else if (strcasecmp(signal_name, BT_MEDIA_TRACK_CHANGE) == 0) {
1209 GVariant *var = NULL;
1210 media_metadata_attributes_t metadata;
1215 unsigned int total_tracks;
1216 unsigned int number;
1217 unsigned int duration;
1219 g_variant_get(parameters, "(&s&s&s&suuu)", &title,
1220 &artist, &album, &genre,
1221 &total_tracks, &number,
1223 memset(&metadata, 0x00, sizeof(media_metadata_attributes_t));
1225 metadata.title = title;
1226 metadata.artist = artist;
1227 metadata.album = album;
1228 metadata.genre = genre;
1229 metadata.total_tracks = total_tracks;
1230 metadata.number = number;
1231 metadata.duration = (int64_t)duration;
1233 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_TRACK_CHANGED,
1235 event_info->cb, event_info->user_data);
1239 void __bt_opp_client_event_filter(GDBusConnection *connection,
1240 const gchar *sender_name,
1241 const gchar *object_path,
1242 const gchar *interface_name,
1243 const gchar *signal_name,
1244 GVariant *parameters,
1247 bt_event_info_t *event_info;
1248 int result = BLUETOOTH_ERROR_NONE;
1249 event_info = (bt_event_info_t *)user_data;
1250 ret_if(event_info == NULL);
1252 if (strcasecmp(object_path, BT_OPP_CLIENT_PATH) != 0)
1254 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1257 ret_if(signal_name == NULL);
1259 if (strcasecmp(signal_name, BT_OPP_CONNECTED) == 0) {
1260 const char *address = NULL;
1262 bluetooth_device_address_t dev_address = { {0} };
1264 g_variant_get(parameters, "(i&si)", &result,
1265 &address, &request_id);
1267 if (__bt_is_request_id_exist(request_id) == FALSE) {
1268 BT_ERR("Different request id!");
1272 _bt_convert_addr_string_to_type(dev_address.addr,
1275 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_CONNECTED,
1276 result, &dev_address,
1277 event_info->cb, event_info->user_data);
1279 if (result != BLUETOOTH_ERROR_NONE) {
1280 __bt_remove_push_request_id(request_id);
1282 } else if (strcasecmp(signal_name, BT_OPP_DISCONNECTED) == 0) {
1283 const char *address = NULL;
1285 bluetooth_device_address_t dev_address = { {0} };
1287 g_variant_get(parameters, "(i&si)", &result, &address,
1290 if (__bt_is_request_id_exist(request_id) == FALSE) {
1291 BT_ERR("Different request id!");
1295 _bt_convert_addr_string_to_type(dev_address.addr,
1298 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_DISCONNECTED,
1299 result, &dev_address,
1300 event_info->cb, event_info->user_data);
1302 __bt_remove_push_request_id(request_id);
1303 } else if (strcasecmp(signal_name, BT_TRANSFER_STARTED) == 0) {
1304 const char *file_name = NULL;
1307 bt_opc_transfer_info_t transfer_info;
1309 g_variant_get(parameters, "(i&sti)", &result, &file_name,
1310 &size, &request_id);
1312 if (__bt_is_request_id_exist(request_id) == FALSE) {
1313 BT_ERR("Different request id!");
1317 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1319 transfer_info.filename = g_strdup(file_name);
1320 transfer_info.size = size;
1322 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_STARTED,
1323 result, &transfer_info,
1324 event_info->cb, event_info->user_data);
1326 g_free(transfer_info.filename);
1327 } else if (strcasecmp(signal_name, BT_TRANSFER_PROGRESS) == 0) {
1328 const char *file_name = NULL;
1332 bt_opc_transfer_info_t transfer_info;
1334 g_variant_get(parameters, "(i&stii)", &result,
1335 &file_name, &size, &progress, &request_id);
1337 if (__bt_is_request_id_exist(request_id) == FALSE) {
1338 BT_ERR("Different request id!");
1342 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1344 transfer_info.filename = g_strdup(file_name);
1345 transfer_info.size = size;
1346 transfer_info.percentage = progress;
1348 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS,
1349 result, &transfer_info,
1350 event_info->cb, event_info->user_data);
1352 g_free(transfer_info.filename);
1353 } else if (strcasecmp(signal_name, BT_TRANSFER_COMPLETED) == 0) {
1354 const char *file_name = NULL;
1357 bt_opc_transfer_info_t transfer_info;
1359 g_variant_get(parameters, "(i&sti)", &result,
1360 &file_name, &size, &request_id);
1362 if (__bt_is_request_id_exist(request_id) == FALSE) {
1363 BT_ERR("Different request id!");
1367 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1369 transfer_info.filename = g_strdup(file_name);
1370 transfer_info.size = size;
1372 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE,
1373 result, &transfer_info,
1374 event_info->cb, event_info->user_data);
1376 g_free(transfer_info.filename);
1380 void __bt_opp_server_event_filter(GDBusConnection *connection,
1381 const gchar *sender_name,
1382 const gchar *object_path,
1383 const gchar *interface_name,
1384 const gchar *signal_name,
1385 GVariant *parameters,
1388 bt_event_info_t *event_info;
1389 int result = BLUETOOTH_ERROR_NONE;
1390 event_info = (bt_event_info_t *)user_data;
1391 ret_if(event_info == NULL);
1393 if (strcasecmp(object_path, BT_OPP_SERVER_PATH) != 0)
1395 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1398 ret_if(signal_name == NULL);
1400 if (strcasecmp(signal_name, BT_TRANSFER_AUTHORIZED) == 0) {
1401 /* Native only event */
1402 const char *file_name = NULL;
1404 bt_obex_server_authorize_into_t auth_info;
1406 g_variant_get(parameters, "(i&st)", &result, &file_name, &size);
1408 /* OSP server: Don't get this event */
1409 ret_if(obex_server_id == BT_CUSTOM_SERVER);
1411 memset(&auth_info, 0x00, sizeof(bt_obex_server_authorize_into_t));
1413 auth_info.filename = g_strdup(file_name);
1414 auth_info.length = size;
1416 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE,
1418 event_info->cb, event_info->user_data);
1420 g_free(auth_info.filename);
1421 } else if (strcasecmp(signal_name, BT_CONNECTION_AUTHORIZED) == 0) {
1422 /* OSP only event */
1423 const char *address = NULL;
1424 const char *name = NULL;
1425 bluetooth_device_address_t dev_address = { {0} };
1427 g_variant_get(parameters, "(i&s&s)", &result, &address, &name);
1429 /* Native server: Don't get this event */
1430 ret_if(obex_server_id == BT_NATIVE_SERVER);
1432 _bt_convert_addr_string_to_type(dev_address.addr,
1435 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE,
1436 result, &dev_address,
1437 event_info->cb, event_info->user_data);
1438 } else if (strcasecmp(signal_name, BT_TRANSFER_CONNECTED) == 0) {
1440 g_variant_get(parameters, "(i)", &result);
1442 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_CONNECTED,
1443 result, NULL, event_info->cb,
1444 event_info->user_data);
1445 } else if (strcasecmp(signal_name, BT_TRANSFER_DISCONNECTED) == 0) {
1447 g_variant_get(parameters, "(i)", &result);
1449 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED,
1450 result, NULL, event_info->cb,
1451 event_info->user_data);
1452 } else if (strcasecmp(signal_name, BT_TRANSFER_STARTED) == 0) {
1453 const char *file_name = NULL;
1454 const char *type = NULL;
1455 int transfer_id = 0;
1456 int server_type = 0; /* bt_server_type_t */
1458 bt_obex_server_transfer_info_t transfer_info;
1460 g_variant_get(parameters, "(i&s&stii)", &result, &file_name,
1461 &type, &size, &transfer_id, &server_type);
1463 /* Other server's event */
1464 ret_if(obex_server_id != server_type &&
1465 server_type != BT_FTP_SERVER);
1467 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
1469 transfer_info.filename = g_strdup(file_name);
1470 transfer_info.type = g_strdup(type);
1471 transfer_info.file_size = size;
1472 transfer_info.transfer_id = transfer_id;
1473 transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
1474 FTP_SERVER : OPP_SERVER;
1476 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED,
1477 result, &transfer_info,
1478 event_info->cb, event_info->user_data);
1480 g_free(transfer_info.filename);
1481 g_free(transfer_info.type);
1482 } else if (strcasecmp(signal_name, BT_TRANSFER_PROGRESS) == 0) {
1483 const char *file_name = NULL;
1484 const char *type = NULL;
1485 int transfer_id = 0;
1487 int server_type = 0; /* bt_server_type_t */
1489 bt_obex_server_transfer_info_t transfer_info;
1491 g_variant_get(parameters, "(i&s&stiii)", &result, &file_name,
1492 &type, &size, &transfer_id,
1493 &progress, &server_type);
1495 /* Other server's event */
1496 ret_if(obex_server_id != server_type &&
1497 server_type != BT_FTP_SERVER);
1499 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
1501 transfer_info.filename = g_strdup(file_name);
1502 transfer_info.type = g_strdup(type);
1503 transfer_info.file_size = size;
1504 transfer_info.transfer_id = transfer_id;
1505 transfer_info.percentage = progress;
1506 transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
1507 FTP_SERVER : OPP_SERVER;
1509 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS,
1510 result, &transfer_info,
1511 event_info->cb, event_info->user_data);
1513 g_free(transfer_info.filename);
1514 g_free(transfer_info.type);
1515 } else if (strcasecmp(signal_name, BT_TRANSFER_COMPLETED) == 0) {
1516 const char *file_name = NULL;
1517 const char *device_name = NULL;
1518 const char *type = NULL;
1519 const char *file_path;
1520 int transfer_id = 0;
1521 int server_type = 0; /* bt_server_type_t */
1523 bt_obex_server_transfer_info_t transfer_info;
1525 g_variant_get(parameters, "(i&s&s&s&stii)", &result, &file_name,
1526 &type, &device_name, &file_path, &size,
1527 &transfer_id, &server_type);
1529 /* Other server's event */
1530 ret_if(obex_server_id != server_type &&
1531 server_type != BT_FTP_SERVER);
1533 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
1535 transfer_info.filename = g_strdup(file_name);
1536 transfer_info.type = g_strdup(type);
1537 transfer_info.device_name = g_strdup(device_name);
1538 transfer_info.file_path = g_strdup(file_path);
1539 transfer_info.file_size = size;
1540 transfer_info.transfer_id = transfer_id;
1541 transfer_info.server_type = (server_type == BT_FTP_SERVER) ?
1542 FTP_SERVER : OPP_SERVER;
1544 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_COMPLETED,
1545 result, &transfer_info,
1546 event_info->cb, event_info->user_data);
1548 g_free(transfer_info.filename);
1549 g_free(transfer_info.type);
1550 g_free(transfer_info.device_name);
1551 g_free(transfer_info.file_path);
1555 void __bt_pbap_client_event_filter(GDBusConnection *connection,
1556 const gchar *sender_name,
1557 const gchar *object_path,
1558 const gchar *interface_name,
1559 const gchar *signal_name,
1560 GVariant *parameters,
1563 bt_event_info_t *event_info;
1564 int result = BLUETOOTH_ERROR_NONE;
1565 event_info = (bt_event_info_t *)user_data;
1566 ret_if(event_info == NULL);
1568 if (strcasecmp(object_path, BT_PBAP_CLIENT_PATH) != 0)
1570 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1573 ret_if(signal_name == NULL);
1575 if (strcasecmp(signal_name, BT_PBAP_CONNECTED) == 0) {
1576 bt_pbap_connected_t connected = { { { 0 }, }, };
1577 char *address = NULL;
1580 g_variant_get(parameters, "(i&si)", &result, &address, &enabled);
1582 BT_DBG("address: %s", address);
1583 BT_DBG("enabled: %d", enabled);
1585 _bt_convert_addr_string_to_type(connected.btaddr.addr,
1587 connected.connected = enabled;
1589 _bt_common_event_cb(BLUETOOTH_PBAP_CONNECTED,
1591 event_info->cb, event_info->user_data);
1592 } else if (strcasecmp(signal_name, BT_PBAP_PHONEBOOK_SIZE) == 0) {
1593 bt_pbap_phonebook_size_t pb_size = { { { 0 }, }, };
1594 char *address = NULL;
1597 g_variant_get(parameters, "(i&si)", &result, &address, &size);
1599 BT_DBG("address: %s", address);
1600 BT_DBG("size: %d", size);
1602 _bt_convert_addr_string_to_type(pb_size.btaddr.addr,
1604 pb_size.size = size;
1606 _bt_common_event_cb(BLUETOOTH_PBAP_PHONEBOOK_SIZE,
1608 event_info->cb, event_info->user_data);
1609 } else if (strcasecmp(signal_name, BT_PBAP_PHONEBOOK_PULL) == 0) {
1610 bt_pbap_phonebook_pull_t pb_pull = { { { 0 } }, };
1611 char *address = NULL;
1612 char *vcf_file = NULL;
1615 g_variant_get(parameters, "(i&s&si)", &result, &address, &vcf_file, &success);
1617 BT_DBG("address: %s", address);
1618 BT_DBG("vcf_file: %s", vcf_file);
1619 BT_DBG("success: %d", success);
1621 _bt_convert_addr_string_to_type(pb_pull.btaddr.addr,
1623 pb_pull.vcf_file = vcf_file;
1624 pb_pull.success = success;
1625 _bt_common_event_cb(BLUETOOTH_PBAP_PHONEBOOK_PULL,
1627 event_info->cb, event_info->user_data);
1628 } else if (strcasecmp(signal_name, BT_PBAP_VCARD_LIST) == 0) {
1629 bt_pbap_vcard_list_t vc_list = { { { 0 } }, };
1630 char *address = NULL;
1631 unsigned int count = 0;
1632 gchar **list = NULL;
1633 GVariant *string_var;
1637 g_variant_get(parameters, "(i&s@as)", &result, &address, &string_var);
1639 list = (gchar **)g_variant_get_strv(string_var, &count);
1642 BT_DBG("address: %s", address);
1643 for(i = 0; i < count; i++)
1644 BT_DBG("%s", list[i]);
1645 BT_DBG("success: %d", success);
1647 _bt_convert_addr_string_to_type(vc_list.btaddr.addr,
1649 vc_list.vcards = list;
1650 vc_list.length = count;
1651 vc_list.success = success;
1652 _bt_common_event_cb(BLUETOOTH_PBAP_VCARD_LIST,
1654 event_info->cb, event_info->user_data);
1656 g_variant_unref(string_var);
1658 } else if (strcasecmp(signal_name, BT_PBAP_VCARD_PULL) == 0) {
1659 bt_pbap_vcard_pull_t vc_pull = { { { 0 } }, };
1660 char *address = NULL;
1661 char *vcf_file = NULL;
1664 g_variant_get(parameters, "(i&s&si)", &result, &address, &vcf_file, &success);
1666 BT_DBG("address: %s", address);
1667 BT_DBG("vcf_file: %s", vcf_file);
1668 BT_DBG("success: %d", success);
1670 _bt_convert_addr_string_to_type(vc_pull.btaddr.addr,
1672 vc_pull.vcf_file = vcf_file;
1673 vc_pull.success = success;
1674 _bt_common_event_cb(BLUETOOTH_PBAP_VCARD_PULL,
1676 event_info->cb, event_info->user_data);
1677 } else if (strcasecmp(signal_name, BT_PBAP_SEARCH_PHONEBOOK) == 0) {
1678 bt_pbap_phonebook_search_list_t vc_list = { { { 0 } }, };
1679 char *address = NULL;
1680 unsigned int count = 0;
1681 gchar **list = NULL;
1682 GVariant *string_var;
1686 g_variant_get(parameters, "(i&s@as)", &result, &address, &string_var);
1688 list = (gchar **)g_variant_get_strv(string_var, &count);
1690 BT_DBG("address: %s", address);
1691 for(i = 0; i < count; i++)
1692 BT_DBG("%s", list[i]);
1693 BT_DBG("success: %d", success);
1695 _bt_convert_addr_string_to_type(vc_list.btaddr.addr,
1697 vc_list.vcards = list;
1698 vc_list.length = count;
1699 vc_list.success = success;
1700 _bt_common_event_cb(BLUETOOTH_PBAP_PHONEBOOK_SEARCH,
1702 event_info->cb, event_info->user_data);
1704 g_variant_unref(string_var);
1709 void __bt_rfcomm_client_event_filter(GDBusConnection *connection,
1710 const gchar *sender_name,
1711 const gchar *object_path,
1712 const gchar *interface_name,
1713 const gchar *signal_name,
1714 GVariant *parameters,
1717 bt_event_info_t *event_info;
1718 int result = BLUETOOTH_ERROR_NONE;
1719 event_info = (bt_event_info_t *)user_data;
1720 ret_if(event_info == NULL);
1722 if (strcasecmp(object_path, BT_RFCOMM_CLIENT_PATH) != 0)
1724 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1727 ret_if(signal_name == NULL);
1729 if (strcasecmp(signal_name, BT_RFCOMM_CONNECTED) == 0) {
1730 const char *address = NULL;
1731 const char *uuid = NULL;
1733 bluetooth_rfcomm_connection_t conn_info;
1735 g_variant_get(parameters, "(i&s&sn)", &result, &address,
1738 memset(&conn_info, 0x00, sizeof(bluetooth_rfcomm_connection_t));
1739 conn_info.device_role = RFCOMM_ROLE_CLIENT;
1740 g_strlcpy(conn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
1741 conn_info.socket_fd = socket_fd;
1742 _bt_convert_addr_string_to_type(conn_info.device_addr.addr,
1745 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_CONNECTED,
1747 event_info->cb, event_info->user_data);
1748 } else if (strcasecmp(signal_name, BT_RFCOMM_DISCONNECTED) == 0) {
1749 const char *address = NULL;
1750 const char *uuid = NULL;
1752 bluetooth_rfcomm_disconnection_t disconn_info;
1754 g_variant_get(parameters, "(i&s&sn)", &result, &address,
1757 memset(&disconn_info, 0x00, sizeof(bluetooth_rfcomm_disconnection_t));
1758 disconn_info.device_role = RFCOMM_ROLE_CLIENT;
1759 g_strlcpy(disconn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
1760 disconn_info.socket_fd = socket_fd;
1761 _bt_convert_addr_string_to_type(disconn_info.device_addr.addr,
1764 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DISCONNECTED,
1765 result, &disconn_info,
1766 event_info->cb, event_info->user_data);
1767 } else if (strcasecmp(signal_name, BT_RFCOMM_DATA_RECEIVED) == 0) {
1771 bluetooth_rfcomm_received_data_t data_r;
1774 g_variant_get(parameters, "(in@ay)", &result, &socket_fd,
1777 buffer_len = g_variant_get_size( byte_var);
1778 buffer = (char *) g_variant_get_data(byte_var);
1780 data_r.socket_fd = socket_fd;
1781 data_r.buffer_size = buffer_len;
1782 data_r.buffer = buffer;
1784 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED,
1786 event_info->cb, event_info->user_data);
1787 g_variant_unref(byte_var);
1791 void __bt_rfcomm_server_event_filter(GDBusConnection *connection,
1792 const gchar *sender_name,
1793 const gchar *object_path,
1794 const gchar *interface_name,
1795 const gchar *signal_name,
1796 GVariant *parameters,
1799 bt_event_info_t *event_info;
1800 int result = BLUETOOTH_ERROR_NONE;
1801 event_info = (bt_event_info_t *)user_data;
1802 ret_if(event_info == NULL);
1804 if (strcasecmp(object_path, BT_RFCOMM_SERVER_PATH) != 0)
1806 if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
1809 ret_if(signal_name == NULL);
1811 if (strcasecmp(signal_name, BT_RFCOMM_CONNECTED) == 0) {
1812 const char *address = NULL;
1813 const char *uuid = NULL;
1815 bluetooth_rfcomm_connection_t conn_info;
1817 g_variant_get(parameters, "(i&s&sn)", &result, &address,
1820 memset(&conn_info, 0x00, sizeof(bluetooth_rfcomm_connection_t));
1821 conn_info.device_role = RFCOMM_ROLE_SERVER;
1822 g_strlcpy(conn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
1823 conn_info.socket_fd = socket_fd;
1824 _bt_convert_addr_string_to_type(conn_info.device_addr.addr,
1827 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_CONNECTED,
1829 event_info->cb, event_info->user_data);
1830 } else if (strcasecmp(signal_name, BT_RFCOMM_DISCONNECTED) == 0) {
1831 const char *address = NULL;
1832 const char *uuid = NULL;
1834 bluetooth_rfcomm_disconnection_t disconn_info;
1836 g_variant_get(parameters, "(i&s&sn)", &result, &address,
1839 memset(&disconn_info, 0x00, sizeof(bluetooth_rfcomm_disconnection_t));
1840 disconn_info.device_role = RFCOMM_ROLE_SERVER;
1841 g_strlcpy(disconn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
1842 disconn_info.socket_fd = socket_fd;
1843 _bt_convert_addr_string_to_type(disconn_info.device_addr.addr,
1846 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DISCONNECTED,
1847 result, &disconn_info,
1848 event_info->cb, event_info->user_data);
1849 } else if (strcasecmp(signal_name, BT_CONNECTION_AUTHORIZED) == 0) {
1850 /* OSP only event */
1851 bluetooth_rfcomm_connection_request_t req_ind;
1852 char *address = NULL;
1858 g_variant_get(parameters, "(i&s&s&s&sn)", &result, &address,
1859 &uuid, &name, &path, &socket_fd);
1861 if (_check_uuid_path(path, uuid) == FALSE)
1864 memset(&req_ind, 0x00, sizeof(bluetooth_rfcomm_connection_request_t));
1865 _bt_convert_addr_string_to_type(req_ind.device_addr.addr,
1868 req_ind.socket_fd = socket_fd;
1870 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_AUTHORIZE,
1872 event_info->cb, event_info->user_data);
1873 } else if (strcasecmp(signal_name, BT_RFCOMM_SERVER_REMOVED) == 0) {
1874 /* OSP only event */
1877 g_variant_get(parameters, "(in)", &result, &socket_fd);
1879 ret_if(__bt_is_server_exist(socket_fd) == FALSE);
1881 _bt_remove_server(socket_fd);
1882 } else if (strcasecmp(signal_name, BT_RFCOMM_DATA_RECEIVED) == 0) {
1883 char *buffer = NULL;
1886 bluetooth_rfcomm_received_data_t data_r;
1889 g_variant_get(parameters, "(in@ay)", &result,
1890 &socket_fd, &byte_var);
1892 buffer_len = g_variant_get_size( byte_var);
1893 buffer = (char *) g_variant_get_data(byte_var);
1895 data_r.socket_fd = socket_fd;
1896 data_r.buffer_size = buffer_len;
1897 data_r.buffer = buffer;
1899 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED,
1901 event_info->cb, event_info->user_data);
1902 g_variant_unref(byte_var);
1906 void __bt_hf_agent_event_filter(GDBusConnection *connection,
1907 const gchar *sender_name,
1908 const gchar *object_path,
1909 const gchar *interface_name,
1910 const gchar *signal_name,
1911 GVariant *parameters,
1916 bt_event_info_t *event_info;
1917 int result = BLUETOOTH_ERROR_NONE;
1918 event_info = (bt_event_info_t *)user_data;
1919 ret_if(event_info == NULL);
1922 if (strcasecmp(object_path, BT_HF_AGENT_PATH) != 0)
1924 if (strcasecmp(interface_name, BT_HF_SERVICE_INTERFACE) != 0)
1927 ret_if(signal_name == NULL);
1929 BT_DBG("%s",signal_name);
1930 if (strcasecmp(signal_name, "Connected") == 0) {
1931 char *address = NULL;
1933 g_variant_get(parameters, "(s)", &address);
1934 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CONNECTED,
1936 event_info->cb, event_info->user_data);
1937 } else if (strcasecmp(signal_name, "Disconnected") == 0) {
1938 char *address = NULL;
1940 g_variant_get(parameters, "(s)", &address);
1941 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_DISCONNECTED,
1943 event_info->cb, event_info->user_data);
1944 } else if (strcasecmp(signal_name, "AudioConnected") == 0) {
1945 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_AUDIO_CONNECTED,
1947 event_info->cb, event_info->user_data);
1948 } else if (strcasecmp(signal_name, "AudioDisconnected") == 0) {
1949 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_AUDIO_DISCONNECTED,
1951 event_info->cb, event_info->user_data);
1952 } else if (strcasecmp(signal_name, "Ring") == 0) {
1953 char *phoneno = NULL;
1955 g_variant_get(parameters, "(&s)", &phoneno);
1957 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_RING_INDICATOR,
1959 event_info->cb, event_info->user_data);
1960 } else if (strcasecmp(signal_name, "CallWaiting") == 0) {
1961 char *phoneno = NULL;
1963 g_variant_get(parameters, "(&s)", &phoneno);
1965 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_WAITING,
1967 event_info->cb, event_info->user_data);
1968 } else if (strcasecmp(signal_name, "CallTerminated") == 0) {
1969 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_TERMINATED,
1971 event_info->cb, event_info->user_data);
1972 } else if (strcasecmp(signal_name, "CallStarted") == 0) {
1973 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_STARTED,
1975 event_info->cb, event_info->user_data);
1976 } else if (strcasecmp(signal_name, "CallEnded") == 0) {
1977 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_ENDED,
1979 event_info->cb, event_info->user_data);
1980 } else if (strcasecmp(signal_name, "NoCallsHeld") == 0) {
1981 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_UNHOLD,
1983 event_info->cb, event_info->user_data);
1984 } else if (strcasecmp(signal_name, "CallsSwapped") == 0) {
1985 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_SWAPPED,
1987 event_info->cb, event_info->user_data);
1988 } else if (strcasecmp(signal_name, "CallOnHold") == 0) {
1989 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_ON_HOLD,
1991 event_info->cb, event_info->user_data);
1992 } else if (strcasecmp(signal_name, "CallStatusUpdate") == 0) {
1994 GVariant *var_data = NULL;
1995 char *number = NULL;
1996 int idx, dir, status, mpart;
1997 bt_hf_call_list_s *handle = NULL;
1999 g_variant_get(parameters, "(i@a(siiii))", &call_count,
2001 BT_DBG("call count : %d",call_count);
2004 GVariantIter *iter = NULL;
2005 __bt_call_list_create(&handle);
2007 g_variant_get(var_data, "a(siiii)", &iter);
2008 while (g_variant_iter_loop(iter, "(siiii)", &number,
2009 &dir, &status, &mpart, &idx)) {
2010 BT_DBG("call number:%s, dir:%d, status : %d",
2011 number, dir, status);
2012 BT_DBG("call mpart : %d, idx : %d",mpart, idx);
2013 __bt_call_list_add(handle, number, dir,
2014 status, mpart, idx);
2016 g_variant_iter_free(iter);
2017 g_variant_unref(var_data);
2020 if (handle && (call_count == g_list_length(handle->list))) {
2021 handle->count = call_count;
2022 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_CALL_STATUS,
2024 event_info->cb, event_info->user_data);
2026 BT_ERR(" Mismatch in call count : %d",call_count);
2029 __bt_call_list_destroy(handle);
2030 } else if (strcasecmp(signal_name, "VoiceRecognition") == 0) {
2032 g_variant_get(parameters, "(i)", &status);
2033 BT_DBG("status = [%d]\n", status);
2035 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VOICE_RECOGNITION_ENABLED,
2037 event_info->cb, event_info->user_data);
2039 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VOICE_RECOGNITION_DISABLED,
2041 event_info->cb, event_info->user_data);
2042 } else if (strcasecmp(signal_name, "VolumeSpeaker") == 0) {
2044 g_variant_get(parameters, "(i)", &value);
2045 BT_DBG("Value = [%d]\n", value);
2046 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VOLUME_SPEAKER,
2048 event_info->cb, event_info->user_data);
2049 } else if (strcasecmp(signal_name, "SamsungXSAT") == 0) {
2052 bluetooth_vendor_dep_at_cmd_t cmd;
2053 g_variant_get(parameters, "(i&s)", &value, &msg);
2054 BT_DBG("Value = [%d], message = %s\n", value, msg);
2057 _bt_hf_event_cb(BLUETOOTH_EVENT_HF_VENDOR_DEP_CMD,
2059 event_info->cb, event_info->user_data);
2064 static void __bt_remove_all_events(void)
2067 bt_event_info_t *info;
2069 for (l = event_list; l != NULL; l = g_slist_next(l)) {
2073 _bt_unregister_event(info->event_type);
2076 g_slist_free(event_list);
2080 static gboolean __bt_event_is_registered(int event_type)
2083 bt_event_info_t *info;
2085 for (l = event_list; l != NULL; l = g_slist_next(l)) {
2090 if (info->event_type == event_type)
2097 bt_event_info_t *_bt_event_get_cb_data(int event_type)
2100 bt_event_info_t *info;
2102 for (l = event_list; l != NULL; l = g_slist_next(l)) {
2107 if (info->event_type == event_type)
2114 void _bt_add_server(int server_fd)
2116 bt_server_info_t *info;
2118 info = g_new0(bt_server_info_t, 1);
2119 info->server_fd = server_fd;
2121 server_list = g_slist_append(server_list, info);
2124 void _bt_remove_server(int server_fd)
2127 bt_server_info_t *info;
2129 for (l = server_list; l != NULL; l = g_slist_next(l)) {
2134 if (info->server_fd == server_fd) {
2135 server_list = g_slist_remove(server_list, (void *)info);
2142 void _bt_set_obex_server_id(int server_type)
2144 obex_server_id = server_type;
2147 int _bt_get_obex_server_id(void)
2149 return obex_server_id;
2152 int _bt_init_event_handler(void)
2154 if (is_initialized == TRUE) {
2155 BT_ERR("Connection already exist");
2156 return BLUETOOTH_ERROR_ALREADY_INITIALIZED;
2159 __bt_remove_all_events();
2161 is_initialized = TRUE;
2163 return BLUETOOTH_ERROR_NONE;
2166 int _bt_deinit_event_handler(void)
2168 if (is_initialized == FALSE) {
2169 BT_ERR("Connection dose not exist");
2170 return BLUETOOTH_ERROR_INTERNAL;
2173 __bt_remove_all_events();
2175 if (disable_timer_id > 0) {
2176 g_source_remove(disable_timer_id);
2177 disable_timer_id = 0;
2180 is_initialized = FALSE;
2182 return BLUETOOTH_ERROR_NONE;
2185 static void __bt_event_data_free(void *data)
2187 bt_event_info_t *cb_data = data;
2189 ret_if(cb_data == NULL);
2191 g_object_unref(cb_data->conn);
2195 int _bt_register_event(int event_type, void *event_cb, void *user_data)
2197 GError *error = NULL;
2198 GDBusConnection *connection_type;
2199 GDBusSignalCallback event_func;
2200 bt_event_info_t *cb_data;
2202 const char *interface = BT_EVENT_SERVICE;
2204 if (is_initialized == FALSE)
2205 _bt_init_event_handler();
2207 if (__bt_event_is_registered(event_type) == TRUE) {
2208 BT_ERR("The event is already registed");
2209 return BLUETOOTH_ERROR_ALREADY_INITIALIZED;
2212 switch (event_type) {
2213 case BT_ADAPTER_EVENT:
2214 event_func = __bt_adapter_event_filter;
2215 path = BT_ADAPTER_PATH;
2217 case BT_LE_ADAPTER_EVENT:
2218 event_func = __bt_adapter_le_event_filter;
2219 path = BT_LE_ADAPTER_PATH;
2221 case BT_DEVICE_EVENT:
2222 event_func = __bt_device_event_filter;
2223 path = BT_DEVICE_PATH;
2226 event_func = __bt_hid_event_filter;
2229 case BT_HEADSET_EVENT:
2230 event_func = __bt_headset_event_filter;
2231 path = BT_HEADSET_PATH;
2233 case BT_NETWORK_EVENT:
2234 event_func = __bt_network_event_filter;
2235 path = BT_NETWORK_PATH;
2237 case BT_AVRCP_EVENT:
2238 event_func = __bt_avrcp_event_filter;
2239 path = BT_AVRCP_PATH;
2241 case BT_AVRCP_CONTROL_EVENT:
2242 event_func = __bt_avrcp_control_event_filter;
2243 path = BT_AVRCP_CONTROL_PATH;
2245 case BT_OPP_CLIENT_EVENT:
2246 event_func = __bt_opp_client_event_filter;
2247 path = BT_OPP_CLIENT_PATH;
2249 case BT_OPP_SERVER_EVENT:
2250 event_func = __bt_opp_server_event_filter;
2251 path = BT_OPP_SERVER_PATH;
2253 case BT_PBAP_CLIENT_EVENT:
2254 event_func = __bt_pbap_client_event_filter;
2255 path = BT_PBAP_CLIENT_PATH;
2257 case BT_RFCOMM_CLIENT_EVENT:
2258 event_func = __bt_rfcomm_client_event_filter;
2259 path = BT_RFCOMM_CLIENT_PATH;
2261 case BT_RFCOMM_SERVER_EVENT:
2262 event_func = __bt_rfcomm_server_event_filter;
2263 path = BT_RFCOMM_SERVER_PATH;
2265 case BT_HF_AGENT_EVENT:
2266 BT_DBG("BT_HF_AGENT_EVENT\n");
2267 event_func = __bt_hf_agent_event_filter;
2268 path = BT_HF_AGENT_PATH;
2269 interface = BT_HF_SERVICE_INTERFACE;
2272 BT_ERR("Unknown event");
2273 return BLUETOOTH_ERROR_INTERNAL;
2276 connection_type = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
2277 if (connection_type == NULL) {
2279 BT_ERR("Unable to get the bus: %s", error->message);
2280 g_clear_error(&error);
2282 return BLUETOOTH_ERROR_INTERNAL;
2285 cb_data = g_new0(bt_event_info_t, 1);
2287 cb_data->event_type = event_type;
2288 cb_data->conn = connection_type;
2289 cb_data->cb = event_cb;
2290 cb_data->user_data = user_data;
2292 cb_data->id = g_dbus_connection_signal_subscribe(connection_type,
2293 NULL, interface, NULL, path, NULL, 0,
2294 event_func, cb_data, NULL);
2296 event_list = g_slist_append(event_list, cb_data);
2298 return BLUETOOTH_ERROR_NONE;
2301 int _bt_unregister_event(int event_type)
2303 GDBusConnection *connection_type;
2304 bt_event_info_t *cb_data;
2306 if (is_initialized == FALSE) {
2307 BT_ERR("Event is not registered");
2308 return BLUETOOTH_ERROR_NOT_INITIALIZED;
2311 if (__bt_event_is_registered(event_type) == FALSE) {
2312 BT_ERR("Not registered event");
2313 return BLUETOOTH_ERROR_INTERNAL;
2316 cb_data = _bt_event_get_cb_data(event_type);
2318 if (cb_data == NULL) {
2319 BT_ERR("No matched event data");
2320 return BLUETOOTH_ERROR_INTERNAL;
2323 connection_type = cb_data->conn;
2325 event_list = g_slist_remove(event_list, (void *)cb_data);
2327 retv_if(connection_type == NULL, BLUETOOTH_ERROR_INTERNAL);
2329 g_dbus_connection_signal_unsubscribe(connection_type, cb_data->id);
2331 __bt_event_data_free((void *)cb_data);
2333 return BLUETOOTH_ERROR_NONE;
2336 static void __bt_name_owner_changed(GDBusConnection *connection,
2337 const gchar *sender_name,
2338 const gchar *object_path,
2339 const gchar *interface_name,
2340 const gchar *signal_name,
2341 GVariant *parameters,
2344 const char *name = NULL;
2345 const char *old_owner = NULL;
2346 const char *new_owner = NULL;
2347 bt_event_info_t *event_info;
2349 g_variant_get(parameters, "(&s&s&s)", &name, &old_owner, &new_owner);
2351 if (g_strcmp0(name, BT_DBUS_NAME) == 0 &&
2352 (new_owner != NULL && *new_owner == '\0')) {
2353 BT_DBG("bt-service is terminated");
2354 event_info = _bt_event_get_cb_data(BT_ADAPTER_EVENT);
2355 if (event_info == NULL)
2358 if (disable_timer_id > 0)
2359 g_source_remove(disable_timer_id);
2361 disable_timer_id = g_timeout_add(BT_RELIABLE_DISABLE_TIME,
2362 (GSourceFunc)__bt_reliable_disable_cb,
2367 void _bt_register_name_owner_changed(void)
2369 GDBusConnection *connection_type;
2371 connection_type = _bt_gdbus_get_system_gconn();
2372 if (connection_type == NULL) {
2373 BT_ERR("Unable to get the bus");
2376 owner_sig_id = g_dbus_connection_signal_subscribe(connection_type,
2377 NULL, DBUS_INTERFACE_DBUS,
2378 BT_NAME_OWNER_CHANGED, NULL, NULL, 0,
2379 __bt_name_owner_changed, NULL, NULL);
2382 void _bt_unregister_name_owner_changed(void)
2384 GDBusConnection *connection_type;
2386 connection_type = _bt_gdbus_get_system_gconn();
2387 if (connection_type != NULL && owner_sig_id != -1) {
2388 g_dbus_connection_signal_unsubscribe(connection_type,