diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2006-02-23 21:13:11 +0000 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2006-02-23 21:13:11 +0000 |
commit | 7021f61d998ae38c623fb81204b6d6737eec080d (patch) | |
tree | de178019079ba321032c031cbc31c2534a5835bc /hcid/dbus-device.c | |
parent | 0d7408aa899f84210d0e6418ee528636292276bc (diff) |
Add support for reading the service classes
Diffstat (limited to 'hcid/dbus-device.c')
-rw-r--r-- | hcid/dbus-device.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/hcid/dbus-device.c b/hcid/dbus-device.c index 8fb96eff..3935df12 100644 --- a/hcid/dbus-device.c +++ b/hcid/dbus-device.c @@ -41,6 +41,17 @@ #include "textfile.h" +static const char *service_cls[] = { + "positioning", + "networking", + "rendering", + "capturing", + "object transfer", + "audio", + "telephony", + "information" +}; + static const char *computer_minor_cls[] = { "uncategorized", "desktop", @@ -110,6 +121,51 @@ static DBusMessage *handle_dev_get_revision_req(DBusMessage *msg, void *data) return reply; } +static DBusMessage *handle_dev_get_service_classes_req(DBusMessage *msg, void *data) +{ + struct hci_dbus_data *dbus_data = data; + DBusMessage *reply; + DBusMessageIter iter; + DBusMessageIter array_iter; + const char *str_ptr; + uint8_t cls[3]; + int dd, i; + + dd = hci_open_dev(dbus_data->dev_id); + if (dd < 0) { + syslog(LOG_ERR, "HCI device open failed: hci%d", dbus_data->dev_id); + return bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_ENODEV); + } + + if (hci_read_class_of_dev(dd, cls, 1000) < 0) { + syslog(LOG_ERR, "Can't read class of device on hci%d: %s(%d)", + dbus_data->dev_id, strerror(errno), errno); + hci_close_dev(dd); + return bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_OFFSET | errno); + } + + reply = dbus_message_new_method_return(msg); + + dbus_message_iter_init_append(reply, &iter); + + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, + DBUS_TYPE_STRING_AS_STRING, &array_iter); + + for (i = 0; i < (sizeof(service_cls) / sizeof(*service_cls)); i++) { + if (cls[2] & (1 << i)) { + str_ptr = service_cls[i]; + dbus_message_iter_append_basic(&array_iter, + DBUS_TYPE_STRING, &str_ptr); + } + } + + dbus_message_iter_close_container(&iter, &array_iter); + + hci_close_dev(dd); + + return reply; +} + static DBusMessage *handle_dev_get_major_class_req(DBusMessage *msg, void *data) { DBusMessage *reply; @@ -986,6 +1042,7 @@ static const struct service_data dev_services[] = { { DEV_GET_MODE, handle_dev_get_mode_req, DEV_GET_MODE_SIGNATURE }, { DEV_GET_NAME, handle_dev_get_name_req, DEV_GET_NAME_SIGNATURE }, { DEV_GET_REVISION, handle_dev_get_revision_req, DEV_GET_REVISION_SIGNATURE }, + { DEV_GET_SERVICE_CLASSES, handle_dev_get_service_classes_req, DEV_GET_SERVICE_CLASSES_SIGNATURE }, { DEV_GET_VERSION, handle_dev_get_version_req, DEV_GET_VERSION_SIGNATURE }, { DEV_IS_CONNECTABLE, handle_dev_is_connectable_req, DEV_IS_CONNECTABLE_SIGNATURE }, |