diff options
Diffstat (limited to 'hcid')
-rw-r--r-- | hcid/dbus-adapter.c | 68 | ||||
-rw-r--r-- | hcid/dbus-error.c | 6 |
2 files changed, 73 insertions, 1 deletions
diff --git a/hcid/dbus-adapter.c b/hcid/dbus-adapter.c index 984b7778..06eb40f6 100644 --- a/hcid/dbus-adapter.c +++ b/hcid/dbus-adapter.c @@ -63,6 +63,15 @@ static const char *computer_minor_cls[] = { "wearable" }; +static const char *phone_minor_cls[] = { + "uncategorized", + "cellular", + "cordless", + "smart phone", + "modem", + "isdn" +}; + static DBusMessage *handle_dev_get_address_req(DBusMessage *msg, void *data) { struct hci_dbus_data *dbus_data = data; @@ -222,6 +231,62 @@ static DBusMessage *handle_dev_get_mode_req(DBusMessage *msg, void *data) return reply; } +static DBusMessage *handle_dev_list_minor_classes_req(DBusMessage *msg, void *data) +{ + const struct hci_dbus_data *dbus_data = data; + DBusMessage *reply = NULL; + DBusMessageIter iter; + DBusMessageIter array_iter; + const char **minor_ptr; + uint8_t cls[3]; + uint8_t major_class; + int dd, size, i; + + dd = hci_open_dev(dbus_data->dev_id); + if (dd < 0) + return error_no_such_adapter(msg); + + if (hci_read_class_of_dev(dd, cls, 1000) < 0) { + error("Can't read class of device on hci%d: %s(%d)", + dbus_data->dev_id, strerror(errno), errno); + reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_OFFSET | errno); + goto failed; + } + + major_class = cls[1] & 0x1F; + + switch (major_class) { + case 1: /* computer */ + minor_ptr = computer_minor_cls; + size = sizeof(computer_minor_cls) / sizeof(*computer_minor_cls); + break; + case 2: /* phone */ + minor_ptr = phone_minor_cls; + size = sizeof(phone_minor_cls) / sizeof(*phone_minor_cls); + break; + default: + reply = error_unsupported_major_class(msg); + goto failed; + } + + reply = dbus_message_new_method_return(msg); + if (!reply) + return error_out_of_memory(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 < size; i++) + dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &minor_ptr[i]); + + dbus_message_iter_close_container(&iter, &array_iter); + +failed: + hci_close_dev(dd); + + return reply; +} + static DBusMessage *handle_dev_set_mode_req(DBusMessage *msg, void *data) { const struct hci_dbus_data *dbus_data = data; @@ -1252,6 +1317,7 @@ static const struct service_data dev_services[] = { { DEV_GET_COMPANY, handle_dev_get_company_req, DEV_GET_COMPANY_SIGNATURE }, { DEV_GET_FEATURES, handle_dev_get_features_req, DEV_GET_FEATURES_SIGNATURE }, { DEV_GET_MODE, handle_dev_get_mode_req, DEV_GET_MODE_SIGNATURE }, + { DEV_LIST_MINOR_CLASSES, handle_dev_list_minor_classes_req, DEV_LIST_MINOR_CLASSES_SIGNATURE }, { DEV_SET_MODE, handle_dev_set_mode_req, DEV_SET_MODE_SIGNATURE }, { DEV_GET_DISCOVERABLE_TO, handle_dev_get_discoverable_to_req, DEV_GET_DISCOVERABLE_TO_SIGNATURE }, { DEV_SET_DISCOVERABLE_TO, handle_dev_set_discoverable_to_req, DEV_SET_DISCOVERABLE_TO_SIGNATURE }, @@ -1263,7 +1329,7 @@ static const struct service_data dev_services[] = { { DEV_GET_SERVICE_CLASSES, handle_dev_get_service_classes_req, DEV_GET_SERVICE_CLASSES_SIGNATURE }, { DEV_GET_NAME, handle_dev_get_name_req, DEV_GET_NAME_SIGNATURE }, { DEV_SET_NAME, handle_dev_set_name_req, DEV_SET_NAME_SIGNATURE }, - + { DEV_GET_REMOTE_VERSION, handle_dev_get_remote_version_req, DEV_GET_REMOTE_VERSION_SIGNATURE }, { DEV_GET_REMOTE_REVISION, handle_dev_get_remote_revision_req, DEV_GET_REMOTE_REVISION_SIGNATURE }, { DEV_GET_REMOTE_MANUFACTURER, handle_dev_get_remote_manufacturer_req, DEV_GET_REMOTE_MANUFACTURER_SIGNATURE }, diff --git a/hcid/dbus-error.c b/hcid/dbus-error.c index c6a92124..988d3b34 100644 --- a/hcid/dbus-error.c +++ b/hcid/dbus-error.c @@ -206,6 +206,12 @@ DBusMessage *error_not_connected(DBusMessage *msg) "Not connected"); } +DBusMessage *error_unsupported_major_class(DBusMessage *msg) +{ + return dbus_message_new_error(msg, ERROR_INTERFACE ".UnsupportedMajorClass", + "Unsupported Major Class"); +} + static DBusMessage *error_already_exists(DBusMessage *msg, const char *str) { return dbus_message_new_error(msg, ERROR_INTERFACE ".AlreadyExists", str); |