4 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 #include <dbus/dbus-glib.h>
22 #include <dbus/dbus-glib-lowlevel.h>
23 #include <dbus/dbus.h>
28 #include "bluetooth-api.h"
29 #include "bluetooth-audio-api.h"
30 #include "bt-internal-types.h"
32 #include "bt-common.h"
33 #include "bt-event-handler.h"
34 #include "bt-request-sender.h"
44 static int obex_server_id;
45 static gboolean is_initialized;
46 static GSList *sending_list = NULL;
47 static GSList *server_list = NULL;
48 static GSList *event_list = NULL;
50 void _bt_add_push_request_id(int request_id)
52 bt_sending_info_t *info;
54 info = g_new0(bt_sending_info_t, 1);
55 info->request_id = request_id;
57 sending_list = g_slist_append(sending_list, info);
60 static gboolean __bt_is_request_id_exist(int request_id)
63 bt_sending_info_t *info;
65 for (l = sending_list; l != NULL; l = g_slist_next(l)) {
70 retv_if(info->request_id == request_id, TRUE);
76 static void __bt_remove_push_request_id(int request_id)
79 bt_sending_info_t *info;
81 for (l = sending_list; l != NULL; l = g_slist_next(l)) {
86 if (info->request_id == request_id) {
87 sending_list = g_slist_remove(sending_list, (void *)info);
94 static void __bt_remove_all_push_request_id(void)
97 bt_sending_info_t *info;
99 for (l = sending_list; l != NULL; l = g_slist_next(l)) {
104 g_slist_free(sending_list);
108 static void __bt_remove_all_server(void)
111 bt_server_info_t *info;
113 for (l = server_list; l != NULL; l = g_slist_next(l)) {
118 g_slist_free(server_list);
122 static gboolean __bt_is_server_exist(int server_fd)
125 bt_server_info_t *info;
127 for (l = server_list; l != NULL; l = g_slist_next(l)) {
132 retv_if(info->server_fd == server_fd, TRUE);
138 static void __bt_get_uuid_info(bluetooth_device_info_t *dev_info,
145 ret_if(dev_info == NULL);
146 ret_if(uuids == NULL);
147 ret_if(uuid_count <= 0);
149 dev_info->service_index = uuid_count;
151 for (i = 0; i < uuid_count && uuids[i] != NULL; i++) {
152 g_strlcpy(dev_info->uuids[i], uuids[i], BLUETOOTH_UUID_STRING_MAX);
154 parts = g_strsplit(uuids[i], "-", -1);
156 if (parts == NULL || parts[0] == NULL) {
161 dev_info->service_list_array[i] = g_ascii_strtoull(parts[0], NULL, 16);
166 static bluetooth_device_info_t *__bt_get_device_info_in_message(DBusMessage *msg, int *ret)
168 bluetooth_device_info_t *dev_info;
169 char *address = NULL;
172 unsigned int class = 0;
174 gboolean paired = FALSE;
175 gboolean connected = FALSE;
176 gboolean trust = FALSE;
178 int result = BLUETOOTH_ERROR_NONE;
180 if (!dbus_message_get_args(msg, NULL,
181 DBUS_TYPE_INT32, &result,
182 DBUS_TYPE_STRING, &address,
183 DBUS_TYPE_UINT32, &class,
184 DBUS_TYPE_INT16, &rssi,
185 DBUS_TYPE_STRING, &name,
186 DBUS_TYPE_BOOLEAN, &paired,
187 DBUS_TYPE_BOOLEAN, &connected,
188 DBUS_TYPE_BOOLEAN, &trust,
189 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
191 DBUS_TYPE_INVALID)) {
192 BT_ERR("Unexpected parameters in signal");
196 dev_info = g_malloc0(sizeof(bluetooth_device_info_t));
198 dev_info->rssi = rssi;
199 dev_info->paired = paired;
200 dev_info->connected = connected;
201 dev_info->paired = paired;
202 dev_info->trust = trust;
204 g_strlcpy(dev_info->device_name.name, name, BLUETOOTH_DEVICE_NAME_LENGTH_MAX + 1);
206 _bt_divide_device_class(&dev_info->device_class, class);
208 _bt_convert_addr_string_to_type(dev_info->device_address.addr,
212 __bt_get_uuid_info(dev_info, uuids, uuid_count);
219 static DBusHandlerResult __bt_adapter_event_filter(DBusConnection *conn,
220 DBusMessage *msg, void *data)
222 bt_event_info_t *event_info;
223 int result = BLUETOOTH_ERROR_NONE;
224 const char *member = dbus_message_get_member(msg);
226 event_info = (bt_event_info_t *)data;
227 retv_if(event_info == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
229 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
230 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
232 if (!dbus_message_has_interface(msg, BT_EVENT_SERVICE))
233 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
235 if (!dbus_message_has_path(msg, BT_ADAPTER_PATH))
236 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
239 retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
241 if (strcasecmp(member, BT_ENABLED) == 0) {
242 if (!dbus_message_get_args(msg, NULL,
243 DBUS_TYPE_INT32, &result,
244 DBUS_TYPE_INVALID)) {
245 BT_ERR("Unexpected parameters in signal");
246 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
249 if (result == BLUETOOTH_ERROR_NONE) {
250 if (vconf_set_int(BT_OFF_DUE_TO_FLIGHT_MODE, 0) != 0)
251 BT_ERR("Set vconf failed\n");
254 _bt_common_event_cb(BLUETOOTH_EVENT_ENABLED,
256 event_info->cb, event_info->user_data);
257 } else if (strcasecmp(member, BT_DISABLED) == 0) {
258 _bt_common_event_cb(BLUETOOTH_EVENT_DISABLED,
259 BLUETOOTH_ERROR_NONE, NULL,
260 event_info->cb, event_info->user_data);
262 obex_server_id = BT_NO_SERVER;
263 __bt_remove_all_server();
264 __bt_remove_all_push_request_id();
265 } else if (strcasecmp(member, BT_DISCOVERABLE_MODE_CHANGED) == 0) {
268 if (!dbus_message_get_args(msg, NULL,
269 DBUS_TYPE_INT32, &result,
270 DBUS_TYPE_INT16, &mode,
271 DBUS_TYPE_INVALID)) {
272 BT_ERR("Unexpected parameters in signal");
273 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
276 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
278 event_info->cb, event_info->user_data);
279 } else if (strcasecmp(member, BT_DISCOVERABLE_TIMEOUT_CHANGED) == 0) {
282 if (!dbus_message_get_args(msg, NULL,
283 DBUS_TYPE_INT32, &result,
284 DBUS_TYPE_INT16, &timeout,
285 DBUS_TYPE_INVALID)) {
286 BT_ERR("Unexpected parameters in signal");
287 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
290 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED,
292 event_info->cb, event_info->user_data);
293 } else if (strcasecmp(member, BT_ADAPTER_NAME_CHANGED) == 0) {
294 char *adapter_name = NULL;
296 if (!dbus_message_get_args(msg, NULL,
297 DBUS_TYPE_INT32, &result,
298 DBUS_TYPE_STRING, &adapter_name,
299 DBUS_TYPE_INVALID)) {
300 BT_ERR("Unexpected parameters in signal");
301 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
304 _bt_common_event_cb(BLUETOOTH_EVENT_LOCAL_NAME_CHANGED,
305 result, adapter_name,
306 event_info->cb, event_info->user_data);
307 } else if (strcasecmp(member, BT_DISCOVERY_STARTED) == 0) {
308 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERY_STARTED,
309 BLUETOOTH_ERROR_NONE, NULL,
310 event_info->cb, event_info->user_data);
311 } else if (strcasecmp(member, BT_DISCOVERY_FINISHED) == 0) {
312 if (!dbus_message_get_args(msg, NULL,
313 DBUS_TYPE_INT32, &result,
314 DBUS_TYPE_INVALID)) {
315 BT_ERR("Unexpected parameters in signal");
316 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
319 _bt_common_event_cb(BLUETOOTH_EVENT_DISCOVERY_FINISHED,
321 event_info->cb, event_info->user_data);
322 } else if (strcasecmp(member, BT_DEVICE_FOUND) == 0) {
324 bluetooth_device_info_t *device_info;
326 device_info = __bt_get_device_info_in_message(msg, &result);
327 retv_if(device_info == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
329 if (strlen(device_info->device_name.name) > 0) {
330 event = BLUETOOTH_EVENT_REMOTE_DEVICE_NAME_UPDATED;
332 event = BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND;
335 _bt_common_event_cb(event,
337 event_info->cb, event_info->user_data);
340 } else if (strcasecmp(member, BT_DEVICE_DISAPPEARED) == 0) {
341 bluetooth_device_info_t *device_info;
343 device_info = __bt_get_device_info_in_message(msg, &result);
344 retv_if(device_info == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
347 _bt_common_event_cb(BLUETOOTH_EVENT_REMOTE_DEVICE_DISAPPEARED,
349 event_info->cb, event_info->user_data);
351 } else if (strcasecmp(member, BT_BOND_CREATED) == 0) {
352 bluetooth_device_info_t *device_info;
354 device_info = __bt_get_device_info_in_message(msg, &result);
356 _bt_common_event_cb(BLUETOOTH_EVENT_BONDING_FINISHED,
358 event_info->cb, event_info->user_data);
361 } else if (strcasecmp(member, BT_BOND_DESTROYED) == 0) {
362 char *address = NULL;
363 bluetooth_device_address_t dev_address = { {0} };
365 if (!dbus_message_get_args(msg, NULL,
366 DBUS_TYPE_INT32, &result,
367 DBUS_TYPE_STRING, &address,
368 DBUS_TYPE_INVALID)) {
369 BT_ERR("Unexpected parameters in signal");
370 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
373 _bt_convert_addr_string_to_type(dev_address.addr,
376 _bt_common_event_cb(BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED,
377 result, &dev_address,
378 event_info->cb, event_info->user_data);
379 } else if (strcasecmp(member, BT_SERVICE_SEARCHED) == 0) {
380 bluetooth_device_info_t *device_info;
381 bt_sdp_info_t sdp_info;
383 device_info = __bt_get_device_info_in_message(msg, &result);
385 memset(&sdp_info, 0x00, sizeof(bt_sdp_info_t));
387 sdp_info.service_index = device_info->service_index;
389 memcpy(&sdp_info.device_addr,
390 &device_info->device_address,
391 BLUETOOTH_ADDRESS_LENGTH);
393 memcpy(sdp_info.service_list_array,
394 device_info->service_list_array,
395 BLUETOOTH_MAX_SERVICES_FOR_DEVICE);
397 memcpy(sdp_info.uuids,
399 BLUETOOTH_MAX_SERVICES_FOR_DEVICE * BLUETOOTH_UUID_STRING_MAX);
401 _bt_common_event_cb(BLUETOOTH_EVENT_SERVICE_SEARCHED,
403 event_info->cb, event_info->user_data);
408 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
411 static DBusHandlerResult __bt_device_event_filter(DBusConnection *conn,
412 DBusMessage *msg, void *data)
414 bt_event_info_t *event_info;
415 int result = BLUETOOTH_ERROR_NONE;
416 const char *member = dbus_message_get_member(msg);
418 event_info = (bt_event_info_t *)data;
419 retv_if(event_info == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
421 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
422 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
424 if (!dbus_message_has_interface(msg, BT_EVENT_SERVICE))
425 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
427 if (!dbus_message_has_path(msg, BT_DEVICE_PATH))
428 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
431 retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
433 if (strcasecmp(member, BT_DEVICE_CONNECTED) == 0) {
434 char *address = NULL;
435 bluetooth_device_address_t dev_address = { {0} };
437 if (!dbus_message_get_args(msg, NULL,
438 DBUS_TYPE_INT32, &result,
439 DBUS_TYPE_STRING, &address,
440 DBUS_TYPE_INVALID)) {
441 BT_DBG("Unexpected parameters in signal");
442 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
445 _bt_convert_addr_string_to_type(dev_address.addr,
448 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_CONNECTED,
449 result, &dev_address,
450 event_info->cb, event_info->user_data);
451 } else if (strcasecmp(member, BT_DEVICE_DISCONNECTED) == 0) {
452 char *address = NULL;
453 bluetooth_device_address_t dev_address = { {0} };
455 if (!dbus_message_get_args(msg, NULL,
456 DBUS_TYPE_INT32, &result,
457 DBUS_TYPE_STRING, &address,
458 DBUS_TYPE_INVALID)) {
459 BT_DBG("Unexpected parameters in signal");
460 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
463 _bt_convert_addr_string_to_type(dev_address.addr,
466 _bt_common_event_cb(BLUETOOTH_EVENT_DEVICE_DISCONNECTED,
467 result, &dev_address,
468 event_info->cb, event_info->user_data);
471 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
474 static DBusHandlerResult __bt_hid_event_filter(DBusConnection *conn,
475 DBusMessage *msg, void *data)
477 bt_event_info_t *event_info;
478 int result = BLUETOOTH_ERROR_NONE;
479 const char *member = dbus_message_get_member(msg);
481 event_info = (bt_event_info_t *)data;
482 retv_if(event_info == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
484 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
485 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
487 if (!dbus_message_has_interface(msg, BT_EVENT_SERVICE))
488 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
490 if (!dbus_message_has_path(msg, BT_HID_PATH))
491 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
493 retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
495 if (strcasecmp(member, BT_INPUT_CONNECTED) == 0) {
496 char *address = NULL;
497 bluetooth_device_address_t dev_address = { {0} };
499 if (!dbus_message_get_args(msg, NULL,
500 DBUS_TYPE_INT32, &result,
501 DBUS_TYPE_STRING, &address,
502 DBUS_TYPE_INVALID)) {
503 BT_DBG("Unexpected parameters in signal");
504 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
507 _bt_convert_addr_string_to_type(dev_address.addr,
510 _bt_input_event_cb(BLUETOOTH_HID_CONNECTED,
511 result, &dev_address,
512 event_info->cb, event_info->user_data);
513 } else if (strcasecmp(member, BT_INPUT_DISCONNECTED) == 0) {
514 char *address = NULL;
515 bluetooth_device_address_t dev_address = { {0} };
517 if (!dbus_message_get_args(msg, NULL,
518 DBUS_TYPE_INT32, &result,
519 DBUS_TYPE_STRING, &address,
520 DBUS_TYPE_INVALID)) {
521 BT_DBG("Unexpected parameters in signal");
522 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
525 BT_DBG("address: %s", address);
527 _bt_convert_addr_string_to_type(dev_address.addr,
530 _bt_input_event_cb(BLUETOOTH_HID_DISCONNECTED,
531 result, &dev_address,
532 event_info->cb, event_info->user_data);
535 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
538 static DBusHandlerResult __bt_headset_event_filter(DBusConnection *conn,
539 DBusMessage *msg, void *data)
541 bt_event_info_t *event_info;
542 int result = BLUETOOTH_ERROR_NONE;
543 const char *member = dbus_message_get_member(msg);
545 event_info = (bt_event_info_t *)data;
546 retv_if(event_info == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
548 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
549 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
551 if (!dbus_message_has_interface(msg, BT_EVENT_SERVICE))
552 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
554 if (!dbus_message_has_path(msg, BT_HEADSET_PATH))
555 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
557 retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
559 if (strcasecmp(member, BT_HEADSET_CONNECTED) == 0) {
560 char *address = NULL;
562 if (!dbus_message_get_args(msg, NULL,
563 DBUS_TYPE_INT32, &result,
564 DBUS_TYPE_STRING, &address,
565 DBUS_TYPE_INVALID)) {
566 BT_ERR("Unexpected parameters in signal");
567 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
570 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_CONNECTED,
572 event_info->cb, event_info->user_data);
573 } else if (strcasecmp(member, BT_HEADSET_DISCONNECTED) == 0) {
574 char *address = NULL;
576 if (!dbus_message_get_args(msg, NULL,
577 DBUS_TYPE_INT32, &result,
578 DBUS_TYPE_STRING, &address,
579 DBUS_TYPE_INVALID)) {
580 BT_ERR("Unexpected parameters in signal");
581 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
584 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_DISCONNECTED,
586 event_info->cb, event_info->user_data);
587 } else if (strcasecmp(member, BT_STEREO_HEADSET_CONNECTED) == 0) {
588 char *address = NULL;
590 if (!dbus_message_get_args(msg, NULL,
591 DBUS_TYPE_INT32, &result,
592 DBUS_TYPE_STRING, &address,
593 DBUS_TYPE_INVALID)) {
594 BT_ERR("Unexpected parameters in signal");
595 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
598 _bt_headset_event_cb(BLUETOOTH_EVENT_AV_CONNECTED,
600 event_info->cb, event_info->user_data);
601 } else if (strcasecmp(member, BT_STEREO_HEADSET_DISCONNECTED) == 0) {
602 char *address = NULL;
604 if (!dbus_message_get_args(msg, NULL,
605 DBUS_TYPE_INT32, &result,
606 DBUS_TYPE_STRING, &address,
607 DBUS_TYPE_INVALID)) {
608 BT_ERR("Unexpected parameters in signal");
609 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
612 _bt_headset_event_cb(BLUETOOTH_EVENT_AV_DISCONNECTED,
614 event_info->cb, event_info->user_data);
615 } else if (strcasecmp(member, BT_SCO_CONNECTED) == 0) {
616 char *address = NULL;
617 bluetooth_device_address_t dev_address = { {0} };
619 if (!dbus_message_get_args(msg, NULL,
620 DBUS_TYPE_INT32, &result,
621 DBUS_TYPE_STRING, &address,
622 DBUS_TYPE_INVALID)) {
623 BT_ERR("Unexpected parameters in signal");
624 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
627 _bt_convert_addr_string_to_type(dev_address.addr,
630 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_AUDIO_CONNECTED,
631 result, &dev_address,
632 event_info->cb, event_info->user_data);
633 } else if (strcasecmp(member, BT_SCO_DISCONNECTED) == 0) {
634 char *address = NULL;
635 bluetooth_device_address_t dev_address = { {0} };
637 if (!dbus_message_get_args(msg, NULL,
638 DBUS_TYPE_INT32, &result,
639 DBUS_TYPE_STRING, &address,
640 DBUS_TYPE_INVALID)) {
641 BT_ERR("Unexpected parameters in signal");
642 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
645 _bt_convert_addr_string_to_type(dev_address.addr,
648 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_AUDIO_DISCONNECTED,
649 result, &dev_address,
650 event_info->cb, event_info->user_data);
651 } else if (strcasecmp(member, BT_SPEAKER_GAIN) == 0) {
654 char *address = NULL;
656 if (!dbus_message_get_args(msg, NULL,
657 DBUS_TYPE_INT32, &result,
658 DBUS_TYPE_STRING, &address,
659 DBUS_TYPE_UINT16, &spkr_gain,
660 DBUS_TYPE_INVALID)) {
661 BT_ERR("Unexpected parameters in signal");
662 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
664 gain = (unsigned int)spkr_gain;
666 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_SPEAKER_GAIN,
668 event_info->cb, event_info->user_data);
669 } else if (strcasecmp(member, BT_MICROPHONE_GAIN) == 0) {
672 char *address = NULL;
674 if (!dbus_message_get_args(msg, NULL,
675 DBUS_TYPE_INT32, &result,
676 DBUS_TYPE_STRING, &address,
677 DBUS_TYPE_UINT16, &mic_gain,
678 DBUS_TYPE_INVALID)) {
679 BT_ERR("Unexpected parameters in signal");
680 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
682 gain = (unsigned int)mic_gain;
684 _bt_headset_event_cb(BLUETOOTH_EVENT_AG_MIC_GAIN,
686 event_info->cb, event_info->user_data);
689 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
692 static DBusHandlerResult __bt_network_event_filter(DBusConnection *conn,
693 DBusMessage *msg, void *data)
695 bt_event_info_t *event_info;
696 int result = BLUETOOTH_ERROR_NONE;
697 const char *member = dbus_message_get_member(msg);
699 event_info = (bt_event_info_t *)data;
700 retv_if(event_info == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
702 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
703 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
705 if (!dbus_message_has_interface(msg, BT_EVENT_SERVICE))
706 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
708 if (!dbus_message_has_path(msg, BT_NETWORK_PATH))
709 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
711 retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
713 if (strcasecmp(member, BT_NETWORK_CONNECTED) == 0) {
714 char *address = NULL;
715 bluetooth_device_address_t dev_address = { {0} };
717 if (!dbus_message_get_args(msg, NULL,
718 DBUS_TYPE_INT32, &result,
719 DBUS_TYPE_STRING, &address,
720 DBUS_TYPE_INVALID)) {
721 BT_ERR("Unexpected parameters in signal");
722 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
725 _bt_convert_addr_string_to_type(dev_address.addr,
728 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_CONNECTED,
729 result, &dev_address,
730 event_info->cb, event_info->user_data);
731 } else if (strcasecmp(member, BT_NETWORK_DISCONNECTED) == 0) {
732 char *address = NULL;
733 bluetooth_device_address_t dev_address = { {0} };
735 if (!dbus_message_get_args(msg, NULL,
736 DBUS_TYPE_INT32, &result,
737 DBUS_TYPE_STRING, &address,
738 DBUS_TYPE_INVALID)) {
739 BT_ERR("Unexpected parameters in signal");
740 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
743 _bt_convert_addr_string_to_type(dev_address.addr,
746 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_DISCONNECTED,
747 result, &dev_address,
748 event_info->cb, event_info->user_data);
749 } else if (strcasecmp(member, BT_NETWORK_SERVER_CONNECTED) == 0) {
751 char *address = NULL;
752 bluetooth_network_device_info_t network_info;
754 if (!dbus_message_get_args(msg, NULL,
755 DBUS_TYPE_INT32, &result,
756 DBUS_TYPE_STRING, &device,
757 DBUS_TYPE_STRING, &address,
758 DBUS_TYPE_INVALID)) {
759 BT_ERR("Unexpected parameters in signal");
760 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
763 memset(&network_info, 0x00, sizeof(bluetooth_network_device_info_t));
765 _bt_convert_addr_string_to_type(network_info.device_address.addr,
768 _bt_print_device_address_t(&network_info.device_address);
769 g_strlcpy(network_info.interface_name, device, BLUETOOTH_INTERFACE_NAME_LENGTH);
771 BT_DBG("name: %s", network_info.interface_name);
773 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED,
774 result, &network_info,
775 event_info->cb, event_info->user_data);
776 } else if (strcasecmp(member, BT_NETWORK_SERVER_DISCONNECTED) == 0) {
778 char *address = NULL;
779 bluetooth_network_device_info_t network_info;
781 if (!dbus_message_get_args(msg, NULL,
782 DBUS_TYPE_INT32, &result,
783 DBUS_TYPE_STRING, &device,
784 DBUS_TYPE_STRING, &address,
785 DBUS_TYPE_INVALID)) {
786 BT_ERR("Unexpected parameters in signal");
787 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
790 memset(&network_info, 0x00, sizeof(bluetooth_network_device_info_t));
792 _bt_convert_addr_string_to_type(network_info.device_address.addr,
795 _bt_print_device_address_t(&network_info.device_address);
797 _bt_common_event_cb(BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED,
798 result, &network_info,
799 event_info->cb, event_info->user_data);
803 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
806 static DBusHandlerResult __bt_avrcp_event_filter(DBusConnection *conn,
807 DBusMessage *msg, void *data)
809 bt_event_info_t *event_info;
810 int result = BLUETOOTH_ERROR_NONE;
811 const char *member = dbus_message_get_member(msg);
813 event_info = (bt_event_info_t *)data;
814 retv_if(event_info == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
816 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
817 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
819 if (!dbus_message_has_interface(msg, BT_EVENT_SERVICE))
820 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
822 if (!dbus_message_has_path(msg, BT_AVRCP_PATH))
823 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
825 retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
827 if (strcasecmp(member, BT_STEREO_HEADSET_CONNECTED) == 0) {
828 char *address = NULL;
830 if (!dbus_message_get_args(msg, NULL,
831 DBUS_TYPE_INT32, &result,
832 DBUS_TYPE_STRING, &address,
833 DBUS_TYPE_INVALID)) {
834 BT_ERR("Unexpected parameters in signal");
835 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
838 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_CONNECTED,
840 event_info->cb, event_info->user_data);
841 } else if (strcasecmp(member, BT_STEREO_HEADSET_DISCONNECTED) == 0) {
842 char *address = NULL;
844 if (!dbus_message_get_args(msg, NULL,
845 DBUS_TYPE_INT32, &result,
846 DBUS_TYPE_STRING, &address,
847 DBUS_TYPE_INVALID)) {
848 BT_ERR("Unexpected parameters in signal");
849 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
852 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_DISCONNECTED,
854 event_info->cb, event_info->user_data);
855 } else if (strcasecmp(member, BT_MEDIA_SHUFFLE_STATUS) == 0) {
857 if (!dbus_message_get_args(msg, NULL,
858 DBUS_TYPE_UINT32, &status,
859 DBUS_TYPE_INVALID)) {
860 BT_ERR("Unexpected parameters in signal");
861 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
863 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_SHUFFLE_STATUS,
865 event_info->cb, event_info->user_data);
866 } else if (strcasecmp(member, BT_MEDIA_EQUALIZER_STATUS) == 0) {
868 if (!dbus_message_get_args(msg, NULL,
869 DBUS_TYPE_UINT32, &status,
870 DBUS_TYPE_INVALID)) {
871 BT_ERR("Unexpected parameters in signal");
872 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
874 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_EQUALIZER_STATUS,
876 event_info->cb, event_info->user_data);
877 } else if (strcasecmp(member, BT_MEDIA_REPEAT_STATUS) == 0) {
879 if (!dbus_message_get_args(msg, NULL,
880 DBUS_TYPE_UINT32, &status,
881 DBUS_TYPE_INVALID)) {
882 BT_ERR("Unexpected parameters in signal");
883 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
885 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_REPEAT_STATUS,
887 event_info->cb, event_info->user_data);
888 } else if (strcasecmp(member, BT_MEDIA_SCAN_STATUS) == 0) {
890 if (!dbus_message_get_args(msg, NULL,
891 DBUS_TYPE_UINT32, &status,
892 DBUS_TYPE_INVALID)) {
893 BT_ERR("Unexpected parameters in signal");
894 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
896 _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_SETTING_SCAN_STATUS,
898 event_info->cb, event_info->user_data);
901 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
904 static DBusHandlerResult __bt_opp_client_event_filter(DBusConnection *conn,
905 DBusMessage *msg, void *data)
907 bt_event_info_t *event_info;
908 int result = BLUETOOTH_ERROR_NONE;
909 const char *member = dbus_message_get_member(msg);
911 event_info = (bt_event_info_t *)data;
912 retv_if(event_info == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
914 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
915 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
917 if (!dbus_message_has_interface(msg, BT_EVENT_SERVICE))
918 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
920 if (!dbus_message_has_path(msg, BT_OPP_CLIENT_PATH))
921 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
923 retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
925 if (strcasecmp(member, BT_OPP_CONNECTED) == 0) {
926 char *address = NULL;
928 bluetooth_device_address_t dev_address = { {0} };
930 if (!dbus_message_get_args(msg, NULL,
931 DBUS_TYPE_INT32, &result,
932 DBUS_TYPE_STRING, &address,
933 DBUS_TYPE_INT32, &request_id,
934 DBUS_TYPE_INVALID)) {
935 BT_ERR("Unexpected parameters in signal");
936 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
939 if (__bt_is_request_id_exist(request_id) == FALSE) {
940 BT_ERR("Different request id!");
941 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
944 _bt_convert_addr_string_to_type(dev_address.addr,
947 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_CONNECTED,
948 result, &dev_address,
949 event_info->cb, event_info->user_data);
951 if (result != BLUETOOTH_ERROR_NONE) {
952 __bt_remove_push_request_id(request_id);
954 } else if (strcasecmp(member, BT_OPP_DISCONNECTED) == 0) {
955 char *address = NULL;
957 bluetooth_device_address_t dev_address = { {0} };
959 if (!dbus_message_get_args(msg, NULL,
960 DBUS_TYPE_INT32, &result,
961 DBUS_TYPE_STRING, &address,
962 DBUS_TYPE_INT32, &request_id,
963 DBUS_TYPE_INVALID)) {
964 BT_ERR("Unexpected parameters in signal");
965 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
968 if (__bt_is_request_id_exist(request_id) == FALSE) {
969 BT_ERR("Different request id!");
970 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
973 _bt_convert_addr_string_to_type(dev_address.addr,
976 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_DISCONNECTED,
977 result, &dev_address,
978 event_info->cb, event_info->user_data);
980 __bt_remove_push_request_id(request_id);
981 } else if (strcasecmp(member, BT_TRANSFER_STARTED) == 0) {
982 char *file_name = NULL;
985 bt_opc_transfer_info_t transfer_info;
987 if (!dbus_message_get_args(msg, NULL,
988 DBUS_TYPE_INT32, &result,
989 DBUS_TYPE_STRING, &file_name,
990 DBUS_TYPE_UINT64, &size,
991 DBUS_TYPE_INT32, &request_id,
992 DBUS_TYPE_INVALID)) {
993 BT_ERR("Unexpected parameters in signal");
994 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
997 if (__bt_is_request_id_exist(request_id) == FALSE) {
998 BT_ERR("Different request id!");
999 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1002 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1004 transfer_info.filename = g_strdup(file_name);
1005 transfer_info.size = size;
1007 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_STARTED,
1008 result, &transfer_info,
1009 event_info->cb, event_info->user_data);
1011 g_free(transfer_info.filename);
1012 } else if (strcasecmp(member, BT_TRANSFER_PROGRESS) == 0) {
1013 char *file_name = NULL;
1017 bt_opc_transfer_info_t transfer_info;
1019 if (!dbus_message_get_args(msg, NULL,
1020 DBUS_TYPE_INT32, &result,
1021 DBUS_TYPE_STRING, &file_name,
1022 DBUS_TYPE_UINT64, &size,
1023 DBUS_TYPE_INT32, &progress,
1024 DBUS_TYPE_INT32, &request_id,
1025 DBUS_TYPE_INVALID)) {
1026 BT_ERR("Unexpected parameters in signal");
1027 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1030 if (__bt_is_request_id_exist(request_id) == FALSE) {
1031 BT_ERR("Different request id!");
1032 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1035 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1037 transfer_info.filename = g_strdup(file_name);
1038 transfer_info.size = size;
1039 transfer_info.percentage = progress;
1041 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS,
1042 result, &transfer_info,
1043 event_info->cb, event_info->user_data);
1045 g_free(transfer_info.filename);
1046 } else if (strcasecmp(member, BT_TRANSFER_COMPLETED) == 0) {
1047 char *file_name = NULL;
1050 bt_opc_transfer_info_t transfer_info;
1052 if (!dbus_message_get_args(msg, NULL,
1053 DBUS_TYPE_INT32, &result,
1054 DBUS_TYPE_STRING, &file_name,
1055 DBUS_TYPE_UINT64, &size,
1056 DBUS_TYPE_INT32, &request_id,
1057 DBUS_TYPE_INVALID)) {
1058 BT_ERR("Unexpected parameters in signal");
1059 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1062 if (__bt_is_request_id_exist(request_id) == FALSE) {
1063 BT_ERR("Different request id!");
1064 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1067 memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t));
1069 transfer_info.filename = g_strdup(file_name);
1070 transfer_info.size = size;
1072 _bt_common_event_cb(BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE,
1073 result, &transfer_info,
1074 event_info->cb, event_info->user_data);
1076 g_free(transfer_info.filename);
1079 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1082 static DBusHandlerResult __bt_opp_server_event_filter(DBusConnection *conn,
1083 DBusMessage *msg, void *data)
1085 bt_event_info_t *event_info;
1086 int result = BLUETOOTH_ERROR_NONE;
1087 const char *member = dbus_message_get_member(msg);
1089 event_info = (bt_event_info_t *)data;
1090 retv_if(event_info == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1092 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
1093 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1095 if (!dbus_message_has_interface(msg, BT_EVENT_SERVICE))
1096 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1098 if (!dbus_message_has_path(msg, BT_OPP_SERVER_PATH))
1099 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1101 retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1103 if (strcasecmp(member, BT_TRANSFER_AUTHORIZED) == 0) {
1104 /* Native only event */
1105 char *file_name = NULL;
1107 bt_obex_server_authorize_into_t auth_info;
1109 if (!dbus_message_get_args(msg, NULL,
1110 DBUS_TYPE_INT32, &result,
1111 DBUS_TYPE_STRING, &file_name,
1112 DBUS_TYPE_UINT64, &size,
1113 DBUS_TYPE_INVALID)) {
1114 BT_ERR("Unexpected parameters in signal");
1115 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1118 /* OSP server: Don't get this event */
1119 retv_if(obex_server_id == BT_CUSTOM_SERVER,
1120 DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1122 memset(&auth_info, 0x00, sizeof(bt_obex_server_authorize_into_t));
1124 auth_info.filename = g_strdup(file_name);
1125 auth_info.length = size;
1127 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE,
1129 event_info->cb, event_info->user_data);
1131 g_free(auth_info.filename);
1132 } else if (strcasecmp(member, BT_CONNECTION_AUTHORIZED) == 0) {
1133 /* OSP only event */
1134 char *address = NULL;
1136 bluetooth_device_address_t dev_address = { {0} };
1138 if (!dbus_message_get_args(msg, NULL,
1139 DBUS_TYPE_INT32, &result,
1140 DBUS_TYPE_STRING, &address,
1141 DBUS_TYPE_STRING, &name,
1142 DBUS_TYPE_INVALID)) {
1143 BT_ERR("Unexpected parameters in signal");
1144 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1147 /* Native server: Don't get this event */
1148 retv_if(obex_server_id == BT_NATIVE_SERVER,
1149 DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1151 _bt_convert_addr_string_to_type(dev_address.addr,
1154 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE,
1155 result, &dev_address,
1156 event_info->cb, event_info->user_data);
1157 } else if (strcasecmp(member, BT_TRANSFER_STARTED) == 0) {
1158 char *file_name = NULL;
1160 int transfer_id = 0;
1161 int server_type = 0; /* bt_server_type_t */
1163 bt_obex_server_transfer_info_t transfer_info;
1165 if (!dbus_message_get_args(msg, NULL,
1166 DBUS_TYPE_INT32, &result,
1167 DBUS_TYPE_STRING, &file_name,
1168 DBUS_TYPE_STRING, &type,
1169 DBUS_TYPE_UINT64, &size,
1170 DBUS_TYPE_INT32, &transfer_id,
1171 DBUS_TYPE_INT32, &server_type,
1172 DBUS_TYPE_INVALID)) {
1173 BT_ERR("Unexpected parameters in signal");
1174 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1177 /* Other server's event */
1178 retv_if(obex_server_id != server_type &&
1179 server_type != BT_FTP_SERVER,
1180 DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1182 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
1184 transfer_info.filename = g_strdup(file_name);
1185 transfer_info.type = g_strdup(type);
1186 transfer_info.file_size = size;
1187 transfer_info.transfer_id = transfer_id;
1189 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED,
1190 result, &transfer_info,
1191 event_info->cb, event_info->user_data);
1193 g_free(transfer_info.filename);
1194 g_free(transfer_info.type);
1195 } else if (strcasecmp(member, BT_TRANSFER_PROGRESS) == 0) {
1196 char *file_name = NULL;
1198 int transfer_id = 0;
1200 int server_type = 0; /* bt_server_type_t */
1202 bt_obex_server_transfer_info_t transfer_info;
1204 if (!dbus_message_get_args(msg, NULL,
1205 DBUS_TYPE_INT32, &result,
1206 DBUS_TYPE_STRING, &file_name,
1207 DBUS_TYPE_STRING, &type,
1208 DBUS_TYPE_UINT64, &size,
1209 DBUS_TYPE_INT32, &transfer_id,
1210 DBUS_TYPE_INT32, &progress,
1211 DBUS_TYPE_INT32, &server_type,
1212 DBUS_TYPE_INVALID)) {
1213 BT_ERR("Unexpected parameters in signal");
1214 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1217 /* Other server's event */
1218 retv_if(obex_server_id != server_type &&
1219 server_type != BT_FTP_SERVER,
1220 DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1222 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
1224 transfer_info.filename = g_strdup(file_name);
1225 transfer_info.type = g_strdup(type);
1226 transfer_info.file_size = size;
1227 transfer_info.transfer_id = transfer_id;
1228 transfer_info.percentage = progress;
1230 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS,
1231 result, &transfer_info,
1232 event_info->cb, event_info->user_data);
1234 g_free(transfer_info.filename);
1235 g_free(transfer_info.type);
1236 } else if (strcasecmp(member, BT_TRANSFER_COMPLETED) == 0) {
1237 char *file_name = NULL;
1238 char *device_name = NULL;
1240 int transfer_id = 0;
1241 int server_type = 0; /* bt_server_type_t */
1243 bt_obex_server_transfer_info_t transfer_info;
1245 if (!dbus_message_get_args(msg, NULL,
1246 DBUS_TYPE_INT32, &result,
1247 DBUS_TYPE_STRING, &file_name,
1248 DBUS_TYPE_STRING, &type,
1249 DBUS_TYPE_STRING, &device_name,
1250 DBUS_TYPE_UINT64, &size,
1251 DBUS_TYPE_INT32, &transfer_id,
1252 DBUS_TYPE_INT32, &server_type,
1253 DBUS_TYPE_INVALID)) {
1254 BT_ERR("Unexpected parameters in signal");
1255 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1258 /* Other server's event */
1259 retv_if(obex_server_id != server_type &&
1260 server_type != BT_FTP_SERVER,
1261 DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1263 memset(&transfer_info, 0x00, sizeof(bt_obex_server_transfer_info_t));
1265 transfer_info.filename = g_strdup(file_name);
1266 transfer_info.type = g_strdup(type);
1267 transfer_info.device_name = g_strdup(device_name);
1268 transfer_info.file_size = size;
1269 transfer_info.transfer_id = transfer_id;
1271 _bt_common_event_cb(BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_COMPLETED,
1272 result, &transfer_info,
1273 event_info->cb, event_info->user_data);
1275 g_free(transfer_info.filename);
1276 g_free(transfer_info.type);
1277 g_free(transfer_info.device_name);
1280 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1283 static DBusHandlerResult __bt_rfcomm_client_event_filter(DBusConnection *conn,
1284 DBusMessage *msg, void *data)
1286 bt_event_info_t *event_info;
1287 int result = BLUETOOTH_ERROR_NONE;
1288 const char *member = dbus_message_get_member(msg);
1290 event_info = (bt_event_info_t *)data;
1291 retv_if(event_info == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1293 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
1294 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1296 if (!dbus_message_has_interface(msg, BT_EVENT_SERVICE))
1297 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1299 if (!dbus_message_has_path(msg, BT_RFCOMM_CLIENT_PATH))
1300 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1302 retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1304 if (strcasecmp(member, BT_RFCOMM_CONNECTED) == 0) {
1305 char *address = NULL;
1308 bluetooth_rfcomm_connection_t conn_info;
1310 if (!dbus_message_get_args(msg, NULL,
1311 DBUS_TYPE_INT32, &result,
1312 DBUS_TYPE_STRING, &address,
1313 DBUS_TYPE_STRING, &uuid,
1314 DBUS_TYPE_INT16, &socket_fd,
1315 DBUS_TYPE_INVALID)) {
1316 BT_ERR("Unexpected parameters in signal");
1317 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1320 memset(&conn_info, 0x00, sizeof(bluetooth_rfcomm_connection_t));
1321 conn_info.device_role = RFCOMM_ROLE_CLIENT;
1322 g_strlcpy(conn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
1323 conn_info.socket_fd = socket_fd;
1324 _bt_convert_addr_string_to_type(conn_info.device_addr.addr,
1327 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_CONNECTED,
1329 event_info->cb, event_info->user_data);
1330 } else if (strcasecmp(member, BT_RFCOMM_DISCONNECTED) == 0) {
1331 char *address = NULL;
1334 bluetooth_rfcomm_disconnection_t disconn_info;
1336 if (!dbus_message_get_args(msg, NULL,
1337 DBUS_TYPE_INT32, &result,
1338 DBUS_TYPE_STRING, &address,
1339 DBUS_TYPE_STRING, &uuid,
1340 DBUS_TYPE_INT16, &socket_fd,
1341 DBUS_TYPE_INVALID)) {
1342 BT_ERR("Unexpected parameters in signal");
1343 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1346 memset(&disconn_info, 0x00, sizeof(bluetooth_rfcomm_disconnection_t));
1347 disconn_info.device_role = RFCOMM_ROLE_CLIENT;
1348 g_strlcpy(disconn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
1349 disconn_info.socket_fd = socket_fd;
1350 _bt_convert_addr_string_to_type(disconn_info.device_addr.addr,
1353 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DISCONNECTED,
1354 result, &disconn_info,
1355 event_info->cb, event_info->user_data);
1356 } else if (strcasecmp(member, BT_RFCOMM_DATA_RECEIVED) == 0) {
1357 char *buffer = NULL;
1360 bluetooth_rfcomm_received_data_t data_r;
1362 if (!dbus_message_get_args(msg, NULL,
1363 DBUS_TYPE_INT32, &result,
1364 DBUS_TYPE_INT16, &socket_fd,
1365 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
1366 &buffer, &buffer_len,
1367 DBUS_TYPE_INVALID)) {
1368 BT_ERR("Unexpected parameters in signal");
1369 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1372 data_r.socket_fd = socket_fd;
1373 data_r.buffer_size = buffer_len;
1374 data_r.buffer = g_memdup(buffer, buffer_len);
1376 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED,
1378 event_info->cb, event_info->user_data);
1380 g_free(data_r.buffer);
1383 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1386 static DBusHandlerResult __bt_rfcomm_server_event_filter(DBusConnection *conn,
1387 DBusMessage *msg, void *data)
1389 bt_event_info_t *event_info;
1390 int result = BLUETOOTH_ERROR_NONE;
1391 const char *member = dbus_message_get_member(msg);
1393 event_info = (bt_event_info_t *)data;
1394 retv_if(event_info == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1396 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
1397 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1399 if (!dbus_message_has_interface(msg, BT_EVENT_SERVICE))
1400 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1402 if (!dbus_message_has_path(msg, BT_RFCOMM_SERVER_PATH))
1403 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1405 retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1407 if (strcasecmp(member, BT_RFCOMM_CONNECTED) == 0) {
1408 char *address = NULL;
1411 bluetooth_rfcomm_connection_t conn_info;
1413 if (!dbus_message_get_args(msg, NULL,
1414 DBUS_TYPE_INT32, &result,
1415 DBUS_TYPE_STRING, &address,
1416 DBUS_TYPE_STRING, &uuid,
1417 DBUS_TYPE_INT16, &socket_fd,
1418 DBUS_TYPE_INVALID)) {
1419 BT_ERR("Unexpected parameters in signal");
1420 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1423 memset(&conn_info, 0x00, sizeof(bluetooth_rfcomm_connection_t));
1424 conn_info.device_role = RFCOMM_ROLE_SERVER;
1425 g_strlcpy(conn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
1426 conn_info.socket_fd = socket_fd;
1427 _bt_convert_addr_string_to_type(conn_info.device_addr.addr,
1430 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_CONNECTED,
1432 event_info->cb, event_info->user_data);
1433 } else if (strcasecmp(member, BT_RFCOMM_DISCONNECTED) == 0) {
1434 char *address = NULL;
1437 bluetooth_rfcomm_disconnection_t disconn_info;
1439 if (!dbus_message_get_args(msg, NULL,
1440 DBUS_TYPE_INT32, &result,
1441 DBUS_TYPE_STRING, &address,
1442 DBUS_TYPE_STRING, &uuid,
1443 DBUS_TYPE_INT16, &socket_fd,
1444 DBUS_TYPE_INVALID)) {
1445 BT_ERR("Unexpected parameters in signal");
1446 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1449 memset(&disconn_info, 0x00, sizeof(bluetooth_rfcomm_disconnection_t));
1450 disconn_info.device_role = RFCOMM_ROLE_SERVER;
1451 g_strlcpy(disconn_info.uuid, uuid, BLUETOOTH_UUID_STRING_MAX);
1452 disconn_info.socket_fd = socket_fd;
1453 _bt_convert_addr_string_to_type(disconn_info.device_addr.addr,
1456 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DISCONNECTED,
1457 result, &disconn_info,
1458 event_info->cb, event_info->user_data);
1459 } else if (strcasecmp(member, BT_CONNECTION_AUTHORIZED) == 0) {
1460 /* OSP only event */
1461 bluetooth_rfcomm_connection_request_t req_ind;
1462 char *address = NULL;
1467 if (!dbus_message_get_args(msg, NULL,
1468 DBUS_TYPE_INT32, &result,
1469 DBUS_TYPE_STRING, &address,
1470 DBUS_TYPE_STRING, &uuid,
1471 DBUS_TYPE_STRING, &name,
1472 DBUS_TYPE_INT16, &socket_fd,
1473 DBUS_TYPE_INVALID)) {
1474 BT_ERR("Unexpected parameters in signal");
1475 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1478 /* Don't send the authorized event to other server */
1479 retv_if(__bt_is_server_exist(socket_fd) == FALSE,
1480 DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1482 memset(&req_ind, 0x00, sizeof(bluetooth_rfcomm_connection_request_t));
1483 _bt_convert_addr_string_to_type(req_ind.device_addr.addr,
1486 req_ind.socket_fd = socket_fd;
1488 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_AUTHORIZE,
1490 event_info->cb, event_info->user_data);
1491 } else if (strcasecmp(member, BT_RFCOMM_SERVER_REMOVED) == 0) {
1492 /* OSP only event */
1495 if (!dbus_message_get_args(msg, NULL,
1496 DBUS_TYPE_INT32, &result,
1497 DBUS_TYPE_INT16, &socket_fd,
1498 DBUS_TYPE_INVALID)) {
1499 BT_ERR("Unexpected parameters in signal");
1500 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1503 retv_if(__bt_is_server_exist(socket_fd) == FALSE,
1504 DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1506 _bt_remove_server(socket_fd);
1507 } else if (strcasecmp(member, BT_RFCOMM_DATA_RECEIVED) == 0) {
1508 char *buffer = NULL;
1511 bluetooth_rfcomm_received_data_t data_r;
1513 if (!dbus_message_get_args(msg, NULL,
1514 DBUS_TYPE_INT32, &result,
1515 DBUS_TYPE_INT16, &socket_fd,
1516 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
1517 &buffer, &buffer_len,
1518 DBUS_TYPE_INVALID)) {
1519 BT_ERR("Unexpected parameters in signal");
1520 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1523 data_r.socket_fd = socket_fd;
1524 data_r.buffer_size = buffer_len;
1525 data_r.buffer = g_memdup(buffer, buffer_len);
1527 _bt_common_event_cb(BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED,
1529 event_info->cb, event_info->user_data);
1531 g_free(data_r.buffer);
1534 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1537 static void __bt_remove_all_events(void)
1540 bt_event_info_t *info;
1542 for (l = event_list; l != NULL; l = g_slist_next(l)) {
1546 _bt_unregister_event(info->event_type);
1549 g_slist_free(event_list);
1553 static gboolean __bt_event_is_registered(int event_type)
1556 bt_event_info_t *info;
1558 for (l = event_list; l != NULL; l = g_slist_next(l)) {
1563 retv_if(info->event_type == event_type, TRUE);
1569 bt_event_info_t* __bt_event_get_cb_data(int event_type)
1572 bt_event_info_t *info;
1574 for (l = event_list; l != NULL; l = g_slist_next(l)) {
1579 if (info->event_type == event_type)
1586 void _bt_add_server(int server_fd)
1588 bt_server_info_t *info;
1590 info = g_new0(bt_server_info_t, 1);
1591 info->server_fd = server_fd;
1593 server_list = g_slist_append(server_list, info);
1596 void _bt_remove_server(int server_fd)
1599 bt_server_info_t *info;
1601 for (l = server_list; l != NULL; l = g_slist_next(l)) {
1606 if (info->server_fd == server_fd) {
1607 server_list = g_slist_remove(server_list, (void *)info);
1614 void _bt_set_obex_server_id(int server_type)
1616 obex_server_id = server_type;
1619 int _bt_get_obex_server_id(void)
1621 return obex_server_id;
1624 int _bt_init_event_handler(void)
1626 if (is_initialized == TRUE) {
1627 BT_ERR("Connection already exist");
1628 return BLUETOOTH_ERROR_ALREADY_INITIALIZED;
1631 __bt_remove_all_events();
1633 is_initialized = TRUE;
1635 return BLUETOOTH_ERROR_NONE;
1638 int _bt_deinit_event_handler(void)
1640 if (is_initialized == FALSE) {
1641 BT_ERR("Connection dose not exist");
1642 return BLUETOOTH_ERROR_INTERNAL;
1645 __bt_remove_all_events();
1647 is_initialized = FALSE;
1649 return BLUETOOTH_ERROR_NONE;
1652 static void __bt_event_data_free(void *data)
1654 bt_event_info_t *cb_data = data;
1656 ret_if(cb_data == NULL);
1659 dbus_connection_unref(cb_data->conn);
1664 int _bt_register_event(int event_type, void *event_cb, void *user_data)
1666 DBusError dbus_error;
1668 DBusConnection *connection_type;
1669 DBusHandleMessageFunction event_func;
1670 bt_event_info_t *cb_data;
1672 if (is_initialized == FALSE)
1673 _bt_init_event_handler();
1675 if (__bt_event_is_registered(event_type) == TRUE) {
1676 BT_ERR("The event is already registed");
1677 return BLUETOOTH_ERROR_ALREADY_INITIALIZED;
1680 switch (event_type) {
1681 case BT_ADAPTER_EVENT:
1682 connection_type = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
1683 retv_if(connection_type == NULL, BLUETOOTH_ERROR_INTERNAL);
1685 event_func = __bt_adapter_event_filter;
1686 match = g_strdup_printf(EVENT_MATCH_RULE, BT_EVENT_SERVICE,
1689 case BT_DEVICE_EVENT:
1690 connection_type = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
1691 retv_if(connection_type == NULL, BLUETOOTH_ERROR_INTERNAL);
1693 event_func = __bt_device_event_filter;
1694 match = g_strdup_printf(EVENT_MATCH_RULE, BT_EVENT_SERVICE,
1698 connection_type = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
1699 retv_if(connection_type == NULL, BLUETOOTH_ERROR_INTERNAL);
1701 event_func = __bt_hid_event_filter;
1702 match = g_strdup_printf(EVENT_MATCH_RULE, BT_EVENT_SERVICE,
1705 case BT_HEADSET_EVENT:
1706 connection_type = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
1707 retv_if(connection_type == NULL, BLUETOOTH_ERROR_INTERNAL);
1709 event_func = __bt_headset_event_filter;
1710 match = g_strdup_printf(EVENT_MATCH_RULE, BT_EVENT_SERVICE,
1713 case BT_NETWORK_EVENT:
1714 connection_type = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
1715 retv_if(connection_type == NULL, BLUETOOTH_ERROR_INTERNAL);
1717 event_func = __bt_network_event_filter;
1718 match = g_strdup_printf(EVENT_MATCH_RULE, BT_EVENT_SERVICE,
1721 case BT_AVRCP_EVENT:
1722 connection_type = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
1723 retv_if(connection_type == NULL, BLUETOOTH_ERROR_INTERNAL);
1725 event_func = __bt_avrcp_event_filter;
1726 match = g_strdup_printf(EVENT_MATCH_RULE, BT_EVENT_SERVICE,
1729 case BT_OPP_CLIENT_EVENT:
1730 connection_type = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
1731 retv_if(connection_type == NULL, BLUETOOTH_ERROR_INTERNAL);
1733 event_func = __bt_opp_client_event_filter;
1734 match = g_strdup_printf(EVENT_MATCH_RULE, BT_EVENT_SERVICE,
1735 BT_OPP_CLIENT_PATH);
1737 case BT_OPP_SERVER_EVENT:
1738 connection_type = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
1739 retv_if(connection_type == NULL, BLUETOOTH_ERROR_INTERNAL);
1741 event_func = __bt_opp_server_event_filter;
1742 match = g_strdup_printf(EVENT_MATCH_RULE, BT_EVENT_SERVICE,
1743 BT_OPP_SERVER_PATH);
1745 case BT_RFCOMM_CLIENT_EVENT:
1746 connection_type = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
1747 retv_if(connection_type == NULL, BLUETOOTH_ERROR_INTERNAL);
1749 event_func = __bt_rfcomm_client_event_filter;
1750 match = g_strdup_printf(EVENT_MATCH_RULE, BT_EVENT_SERVICE,
1751 BT_RFCOMM_CLIENT_PATH);
1753 case BT_RFCOMM_SERVER_EVENT:
1754 connection_type = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
1755 retv_if(connection_type == NULL, BLUETOOTH_ERROR_INTERNAL);
1757 event_func = __bt_rfcomm_server_event_filter;
1758 match = g_strdup_printf(EVENT_MATCH_RULE, BT_EVENT_SERVICE,
1759 BT_RFCOMM_SERVER_PATH);
1762 BT_ERR("Unknown event");
1763 return BLUETOOTH_ERROR_INTERNAL;
1766 cb_data = g_new0(bt_event_info_t, 1);
1768 cb_data->event_type = event_type;
1769 cb_data->conn = connection_type;
1770 cb_data->func = event_func;
1771 cb_data->match_rule = match;
1772 cb_data->cb = event_cb;
1773 cb_data->user_data = user_data;
1775 if (!dbus_connection_add_filter(connection_type, event_func,
1776 (void *)cb_data, __bt_event_data_free)) {
1777 BT_ERR("Fail to add filter");
1781 dbus_error_init(&dbus_error);
1784 dbus_bus_add_match(connection_type, match, &dbus_error);
1786 if (dbus_error_is_set(&dbus_error)) {
1787 BT_ERR("Fail to add match: %s\n", dbus_error.message);
1788 dbus_error_free(&dbus_error);
1792 event_list = g_slist_append(event_list, cb_data);
1794 return BLUETOOTH_ERROR_NONE;
1796 if (connection_type)
1797 dbus_connection_unref(connection_type);
1801 return BLUETOOTH_ERROR_INTERNAL;
1804 int _bt_unregister_event(int event_type)
1806 DBusConnection *connection_type;
1807 DBusHandleMessageFunction event_func;
1808 bt_event_info_t *cb_data;
1810 DBusError dbus_error;
1812 if (is_initialized == FALSE) {
1813 BT_ERR("Event is not registered");
1814 return BLUETOOTH_ERROR_INTERNAL;
1817 if (__bt_event_is_registered(event_type) == FALSE) {
1818 BT_ERR("Not registered event");
1819 return BLUETOOTH_ERROR_INTERNAL;
1822 cb_data = __bt_event_get_cb_data(event_type);
1824 if (cb_data == NULL) {
1825 BT_ERR("No matched event data");
1826 return BLUETOOTH_ERROR_INTERNAL;
1829 connection_type = cb_data->conn;
1830 event_func = cb_data->func;
1831 match = cb_data->match_rule;
1833 event_list = g_slist_remove(event_list, (void *)cb_data);
1835 retv_if(connection_type == NULL, BLUETOOTH_ERROR_INTERNAL);
1836 retv_if(event_func == NULL, BLUETOOTH_ERROR_INTERNAL);
1838 dbus_error_init(&dbus_error);
1840 dbus_bus_remove_match (connection_type, match, &dbus_error);
1842 if (dbus_error_is_set(&dbus_error)) {
1843 BT_ERR("Fail to remove match: %s\n", dbus_error.message);
1844 dbus_error_free(&dbus_error);
1847 dbus_connection_remove_filter(connection_type, event_func,
1851 return BLUETOOTH_ERROR_NONE;