}
#endif /* __TIZEN_INTERNAL_BT_SCO__ */
-static void handle_get_connected_device_list(DBusConnection *conn, DBusMessage *msg, void *userdata) {
- pa_device_manager *dm = (pa_device_manager *)userdata;
- DBusMessage *reply = NULL;
- DBusMessageIter msg_iter, array_iter, device_iter;
- pa_tz_device *device;
- dm_device_state_t state;
+static void array_iter_append(DBusMessageIter *array_iter, pa_idxset *device_list, int mask) {
uint32_t device_idx;
+ dm_device_state_t state;
dbus_int32_t device_id, direction;
- int mask;
char *type, *name;
dbus_int32_t vendor_id, product_id;
dbus_bool_t is_running;
+ pa_tz_device *device;
+ DBusMessageIter device_iter;
- pa_assert(conn);
- pa_assert(msg);
- pa_assert(dm);
-
- pa_assert_se((reply = dbus_message_new_method_return(msg)));
-
- pa_assert_se(dbus_message_get_args(msg, NULL,
- DBUS_TYPE_INT32, &mask,
- DBUS_TYPE_INVALID));
-
- pa_log_info("Get connected device list (mask : %d)", mask);
+ pa_assert(array_iter);
- dbus_message_iter_init_append(reply, &msg_iter);
- pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "(isiisiib)", &array_iter));
+ if (!device_list)
+ return;
- PA_IDXSET_FOREACH(device, dm->device_list, device_idx) {
+ PA_IDXSET_FOREACH(device, device_list, device_idx) {
device_id = (dbus_int32_t)pa_tz_device_get_id(device);
state = pa_tz_device_get_state(device);
direction = pa_tz_device_get_direction(device);
product_id = (dbus_int32_t) pa_tz_device_get_product_id(device);
product_id = (dbus_int32_t) pa_tz_device_get_product_id(device);
is_running = (dbus_bool_t) pa_tz_device_is_running(device);
- if (device_is_match_with_mask(device, mask)) {
+ if (device_is_match_with_mask(device, mask)) {
simple_device_dump(PA_LOG_INFO, "[MATCH]", device_id, type, name, direction, state);
- pa_assert_se(dbus_message_iter_open_container(&array_iter, DBUS_TYPE_STRUCT, NULL, &device_iter));
+ pa_assert_se(dbus_message_iter_open_container(array_iter, DBUS_TYPE_STRUCT, NULL, &device_iter));
dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_INT32, &device_id);
dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_STRING, &type);
dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_INT32, &direction);
dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_INT32, &vendor_id);
dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_INT32, &product_id);
dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_BOOLEAN, &is_running);
- pa_assert_se(dbus_message_iter_close_container(&array_iter, &device_iter));
+ pa_assert_se(dbus_message_iter_close_container(array_iter, &device_iter));
} else {
simple_device_dump(PA_LOG_INFO, "[UNMATCH]", device_id, type, name, direction, state);
}
}
+}
+
+#ifndef __TIZEN_INTERNAL_BT_SCO__
+static int include_device_filter_func(const void *d, const void *include_device_type) {
+ pa_tz_device *device = (pa_tz_device *)d;
+
+ pa_assert(device);
+ pa_assert(include_device_type);
+
+ return (int)pa_safe_streq(pa_tz_device_get_type(device), (const char *)include_device_type);
+}
+
+static int exclude_device_filter_func(const void *d, const void *exclude_device_type) {
+ pa_tz_device *device = (pa_tz_device *)d;
+
+ pa_assert(device);
+ pa_assert(exclude_device_type);
+
+ return (int)!pa_safe_streq(pa_tz_device_get_type(device), (const char *)exclude_device_type);
+}
+#endif /* __TIZEN_INTERNAL_BT_SCO__ */
+
+static void handle_get_connected_device_list(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+ pa_device_manager *dm = (pa_device_manager *)userdata;
+ DBusMessage *reply = NULL;
+ DBusMessageIter msg_iter, array_iter;
+ int mask;
+#ifndef __TIZEN_INTERNAL_BT_SCO__
+ pa_idxset *idxset1, *idxset2;
+#endif
+
+ pa_assert(conn);
+ pa_assert(msg);
+ pa_assert(dm);
+
+ pa_assert_se((reply = dbus_message_new_method_return(msg)));
+
+ pa_assert_se(dbus_message_get_args(msg, NULL,
+ DBUS_TYPE_INT32, &mask,
+ DBUS_TYPE_INVALID));
+
+ pa_log_info("Get connected device list (mask : %d)", mask);
+
+ dbus_message_iter_init_append(reply, &msg_iter);
+ pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "(isiisiib)", &array_iter));
+
+#ifdef __TIZEN_INTERNAL_BT_SCO__
+ array_iter_append(&array_iter, dm->device_list, mask);
+#else
+ /* divide into two groups and merge them because dbus message doesn't support sorting or prepend */
+ idxset1 = pa_idxset_filtered_copy(dm->device_list, NULL, include_device_filter_func, DEVICE_TYPE_BT_SCO);
+ idxset2 = pa_idxset_filtered_copy(dm->device_list, NULL, exclude_device_filter_func, DEVICE_TYPE_BT_SCO);
+
+ array_iter_append(&array_iter, idxset1, mask);
+ array_iter_append(&array_iter, idxset2, mask);
+
+ pa_idxset_free(idxset1, NULL);
+ pa_idxset_free(idxset2, NULL);
+#endif /* __TIZEN_INTERNAL_BT_SCO__ */
pa_assert_se(dbus_message_iter_close_container(&msg_iter, &array_iter));